gonzazoid.path.js
TypeScript icon, indicating that this package has built-in type declarations

0.1.1 • Public • Published

path.js

path provider object

Path(target_object, start_token?)

path.js предоставляет всего одну функцию (Path) которая на основе переданного ей объекта(массива) генерирует объект path, назначение которого - хранить в себе путь до какого либо свойства в целевом объекте. При этом требуемый путь в коде задается семантически, то есть не в виде строки "some.awesome.property" а так, как если бы мы обращались к самому свойству:

import {Path} from 'gonzazoid.path.js';

const path = Path({some: {awesome: {path: {}}}, 'another sylly.and.strange': {very: {hard: {to: {parse: {path: {}}}}}}}); console.log(path.some.awesome.path.join('.')); console.log(path['another sylly.and.strange'].very.hard.to.parse.path) path.some.awesome = {path: {}}; console.log(path.some.awesome);

То есть что происходит?

Мы создаем объект (точнее задаем его значение) в тот момент когда указываем путь в коде, при этом путь мы указываем как обычно (some.awesome.prop) а получатель принимает массив токенов ['some', 'awesome', 'prop'] При этом работает статическая проверка типов в typescript (функция написана на typescript, возвращаемый path объект имеет тот же тип что и target объект). В динамике (на js) обращение к несуществующему свойству возвращает undefined, так как целевой объект захватывается и проверяется наличие запрашиваемого свойства у него. Второе несуществующее свойство в пути вызовет Cannot read property 'nunu' of undefined

то есть object.udefined_prop - undefined object.undefined_prop.another_undefined_prop - Cannot read property 'another_undefined_prop' of undefined

Для использования кода в typescript достаточно добавить модуль в проект (npm install --save gonzazoid.path.js) - пакет строго типизирован, дефиниции в наличии.

Сама функция крайне проста - вот она:

export const Path = function(constr: T, path?: string): T{

const target: string[] = Array.isArray(path) ? path : (path ? [path] : []);

return new Proxy(target, {
  get(target: any, prop: any) {
    return (constr as any)[prop] ? Path((constr as any)[prop], target.concat([prop])) : target[prop];
  },
  set(target: any, prop: string, value: any) {
    return false;
  }
}) as T;

};

никаких зависимостей нет. Если есть необходимость модифицировать функцию - директория src является вложенным модулем для разработки: cd src npm install .. вносим изменения в код npm run build в директории основного модуля (не разработки) имеем в /lib/path.js - бинарник, в /typings/index.d.ts - тайпинг модуль для разработки имеет две dev-зависимости - tslint и typescript

то есть можно склонировать репу/вносить изменения/собирать и использовать свою версию - изменится только строка подключения модуля в package.json вашего проекта.

Readme

Keywords

none

Package Sidebar

Install

npm i gonzazoid.path.js

Weekly Downloads

0

Version

0.1.1

License

MIT

Last publish

Collaborators

  • gonzazoid