{"_id":"@ajgiz/tree-core","_rev":"4-19058cb7ff58961a3a5ddadf478154af","name":"@ajgiz/tree-core","dist-tags":{"latest":"0.1.5"},"versions":{"0.1.1":{"name":"@ajgiz/tree-core","version":"0.1.1","_id":"@ajgiz/tree-core@0.1.1","maintainers":[{"name":"ajgiz","email":"doufullin@gmail.com"}],"dist":{"shasum":"495a9f06abaa2d275acdc117d02ce8b5eccbab42","tarball":"https://registry.npmjs.org/@ajgiz/tree-core/-/tree-core-0.1.1.tgz","fileCount":54,"integrity":"sha512-so3fontNA5Vnq4V7KgvRX58gkBA+Jb5FgtexCerpPgRTCELxPVYQJVQeV22btQm1FEyspBfTUubthP64wgkDzw==","signatures":[{"sig":"MEQCIETkXkRUWvV4L119uJRbjpmpW6He9NrETlgTJ/sJUZ5KAiADwDGcDm/3vZ01nOefk/azn8Tu9674Q25yJ+dh1/G1qw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":131654},"main":"dist/index.js","types":"dist/index.d.ts","scripts":{"lint":"eslint src --ext .ts,.tsx","test":"vitest","build":"tsc -b"},"_npmUser":{"name":"ajgiz","email":"doufullin@gmail.com"},"_npmVersion":"10.8.2","description":"Ядро движка для работы с древовидными данными.","directories":{},"_nodeVersion":"20.19.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.1","vitest":"^latest","typescript":"^5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/tree-core_0.1.1_1770051114130_0.934023935417837","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@ajgiz/tree-core","version":"0.1.3","_id":"@ajgiz/tree-core@0.1.3","maintainers":[{"name":"ajgiz","email":"doufullin@gmail.com"}],"dist":{"shasum":"ef5cd2b717414d35a35bcafc44733795f9034030","tarball":"https://registry.npmjs.org/@ajgiz/tree-core/-/tree-core-0.1.3.tgz","fileCount":62,"integrity":"sha512-h0enGjya5Z6gnlp10RxQ0URE3HbixTGR9CPwrzC8NkPTQPrNMY7E1QOtrniaFRR49fcZvh9EvnK5Sed3/WSe7g==","signatures":[{"sig":"MEYCIQDFq94wi5Jgtwxbo5kMd3Wor/f2qBO3nykuuXRoWKY2CwIhAOhnM0ZwQ5CPcogwZt3hx9/d/lgFv5SNRhzCz55IZY9R","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":173551},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"59d823a15c9b8a21e77678d4bc87185f6ea6a5fa","scripts":{"lint":"eslint src --ext .ts,.tsx","test":"vitest","build":"tsc -b"},"_npmUser":{"name":"ajgiz","email":"doufullin@gmail.com"},"_npmVersion":"10.8.2","description":"Ядро движка для работы с древовидными данными.","directories":{},"_nodeVersion":"20.19.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.1","vitest":"^4.0.18","typescript":"^5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/tree-core_0.1.3_1770314906311_0.28739671332587435","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@ajgiz/tree-core","version":"0.1.4","_id":"@ajgiz/tree-core@0.1.4","maintainers":[{"name":"ajgiz","email":"doufullin@gmail.com"}],"dist":{"shasum":"ae531958a6f657560ae8837a096c1b6114ccb1d5","tarball":"https://registry.npmjs.org/@ajgiz/tree-core/-/tree-core-0.1.4.tgz","fileCount":30,"integrity":"sha512-gEVM+ST4NhQfyt3LAKto1fFkVdMOtduL/jVoKbpK8cfE6rxPo1qS2mXBOdnW30QdEbd/rrLr8hyrUDCeUl0YIQ==","signatures":[{"sig":"MEUCICDGzC6dxwNC6KonL9m60/bS59Z3EL1Hu/7uQCPIpn/VAiEApQd6dB3NVBUEHCFUKGRdbFUn2I6w9Ya9ciFnq6k6bCQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":119592},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"59d823a15c9b8a21e77678d4bc87185f6ea6a5fa","scripts":{"lint":"eslint src --ext .ts,.tsx","test":"vitest","build":"tsc -b"},"_npmUser":{"name":"ajgiz","email":"doufullin@gmail.com"},"_npmVersion":"10.8.2","description":"Ядро движка для работы с древовидными данными.","directories":{},"_nodeVersion":"20.19.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.1","vitest":"^4.0.18","typescript":"^5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/tree-core_0.1.4_1770314991435_0.9045734719415415","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@ajgiz/tree-core","version":"0.1.5","description":"Ядро движка для работы с древовидными данными.","main":"dist/index.js","types":"dist/index.d.ts","publishConfig":{"access":"public"},"scripts":{"build":"tsc -b","lint":"eslint src --ext .ts,.tsx","test":"vitest"},"devDependencies":{"typescript":"^5.9.3","eslint":"^9.39.1","vitest":"^4.0.18"},"_id":"@ajgiz/tree-core@0.1.5","gitHead":"74bb6955346feaa56827aba21be2c6dfa9defe16","_nodeVersion":"20.19.1","_npmVersion":"10.8.2","dist":{"integrity":"sha512-EhmJeTGyC5xonthAoeL6UctHA23izJ9hhzjsaBWWLSNx3+IBUM+OeVuhbjfpl95bNeJFQUvFNEboGtweT5FgYQ==","shasum":"6b01a39148b5be0cd6163adf23069bf6ce105af5","tarball":"https://registry.npmjs.org/@ajgiz/tree-core/-/tree-core-0.1.5.tgz","fileCount":30,"unpackedSize":126263,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIG0sMpJHLa6vaObkBOMG9B/A12gePI59tLQopxtZ3Hi3AiA16CGa0cLFyvgJrArGIN6MNh5HiXdytHDFgWqnuz8AKQ=="}]},"_npmUser":{"name":"ajgiz","email":"doufullin@gmail.com"},"directories":{},"maintainers":[{"name":"ajgiz","email":"doufullin@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/tree-core_0.1.5_1770658549936_0.03984961399795006"},"_hasShrinkwrap":false}},"time":{"created":"2026-02-02T16:51:54.036Z","modified":"2026-02-09T17:35:50.220Z","0.1.1":"2026-02-02T16:51:54.359Z","0.1.3":"2026-02-05T18:08:26.467Z","0.1.4":"2026-02-05T18:09:51.589Z","0.1.5":"2026-02-09T17:35:50.104Z"},"description":"Ядро движка для работы с древовидными данными.","maintainers":[{"name":"ajgiz","email":"doufullin@gmail.com"}],"readme":"# @ajgiz/tree-core\r\n\r\nЯдро движка для древовидных данных: модель узлов, раскрытие/скрытие, видимость колонок, формирование линейного представления (ViewState) и инкрементальные обновления. Без UI — только типы и логика.\r\n\r\n## Установка\r\n\r\n```bash\r\nnpm i @ajgiz/tree-core\r\n```\r\n\r\n## Создание движка\r\n\r\n```ts\r\nimport { TreeDataEngine } from '@ajgiz/tree-core'\r\n\r\nconst engine = new TreeDataEngine({\r\n  initData: () => ({\r\n    nodeMap: new Map(),\r\n    rootIds: new Set(),\r\n    columns: [],\r\n  }),\r\n  options: { paddingLeft: 20 },\r\n  metadata: { expanded: new Set(), hiddenNodes: new Set(), hiddenColumns: new Set(), disabledNodes: new Set() },\r\n  plugins: [],\r\n  createNode: undefined,\r\n  buildCells: undefined,\r\n  createViewColumns: undefined,\r\n  buildLinearNodes: undefined,\r\n})\r\n```\r\n\r\n- **initData()** — возвращает `nodeMap`, `rootIds` (Set), `columns`. Узлы: `CoreNode` (id, parent, children, value, depth).\r\n- **metadata** — начальные множества expanded, hiddenNodes, hiddenColumns, disabledNodes.\r\n- **plugins** — массив `EnginePlugin` (init, onOperation, run).\r\n- **options** — произвольный объект, доступен через `getOptions()` (например для плагинов).\r\n\r\n## Публичный API\r\n\r\n| Метод | Описание |\r\n|-------|----------|\r\n| `getAPI()` | `{ apply(op), getPluginState(id) }` — применение операций и доступ к состоянию плагинов |\r\n| `getViewState()` | Текущее представление: `nodes`, `visibleNodesIndexes`, `columns`, `metadata`, `options` |\r\n| `getCoreState()` | Ядро: `nodeMap`, `rootIds`, `columns` |\r\n| `getOptions()` | Текущие опции движка |\r\n| `subscribe(fn)` | Подписка на обновления (после apply) |\r\n| `updateOptions(opts)` | Обновить опции |\r\n| `setMetadata(metadata)` | Обновить expanded / hiddenNodes / hiddenColumns / disabledNodes |\r\n\r\n## Операции (apply)\r\n\r\n- **add-node** — добавить узел (payload: `parentId?`, `node: { id, value }`).\r\n- **remove-node** — удалить узел и поддерево (payload: `id`).\r\n- **expand-node** / **collapse-node** / **toggle-expand** — раскрытие/сворачивание (payload: `id`).\r\n- **set-node-visibility** — скрыть/показать узел (payload: `id`, `visible`).\r\n- **set-column-visibility** — видимость колонки (payload: `index`, `id`, `visible`).\r\n- **set-columns-visibility** — все колонки (payload: `visible`).\r\n- **set-column-width** / **set-columns-width** — ширина колонок.\r\n- **update-options** — обновить опции (payload: `options`).\r\n- **set-metadata** — обновить metadata (payload: `metadata`).\r\n- **custom** — произвольная операция для плагинов (payload: `type`, `data`).\r\n\r\n## ViewState и LinearNode\r\n\r\n`getViewState()` возвращает:\r\n\r\n- **nodes** — массив `LinearNode` в порядке обхода дерева (depth-first). У каждого: `id`, `depth`, `hasChildren`, `expanded`, `visible`, `index`, `subtreeSize`, `cells`, `disabled`.\r\n- **visibleNodesIndexes** — индексы в `nodes` видимых строк (учёт expanded и hiddenNodes).\r\n- **columns** — видимые колонки (с учётом hiddenColumns).\r\n- **metadata** — текущие expanded, hiddenNodes, hiddenColumns, disabledNodes, nodeMap, rootIds, columns.\r\n- **options** — опции представления.\r\n\r\nСкрытые колонки не попадают в `columns` и не дают ячеек в `cells`. Первая видимая ячейка — обычно `tree/cell`, остальные — `text` (можно переопределить через `buildCells`).\r\n\r\n## Плагины (EnginePlugin)\r\n\r\n- **id** — уникальный идентификатор.\r\n- **init(engine)** — инициализация, вызов `engine.initPluginState(id, state)`.\r\n- **onOperation(op, engine)** — реакция на любую операцию (в т.ч. `custom`).\r\n- **run(ctx, engine)** — участие в пайплайне представления: получает `metadata`, возвращает `{ data: ViewMetadata, isUpdated }`. Плагины вызываются по порядку; можно менять `nodeMap`, `rootIds` (сортировка, фильтрация).\r\n\r\nПлагины не мокают в тестах; тесты движка используют только публичный API.\r\n\r\n## Сборка и тесты\r\n\r\n```bash\r\nnpm run build\r\nnpm test\r\n```\r\n\r\nТесты: Vitest, `TreeDataEngine.test.ts` — операции, ViewState, linearNodes, инкрементальные обновления, колонки и граничные случаи.\r\n","readmeFilename":"Readme.md"}