@utilarium/overcontext 0.0.4-dev.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/LICENSE +65 -0
  2. package/README.md +286 -0
  3. package/dist/api/builder.d.ts +26 -0
  4. package/dist/api/builder.js +24 -0
  5. package/dist/api/builder.js.map +1 -0
  6. package/dist/api/context.d.ts +90 -0
  7. package/dist/api/context.js +94 -0
  8. package/dist/api/context.js.map +1 -0
  9. package/dist/api/index.d.ts +6 -0
  10. package/dist/api/query-builder.d.ts +51 -0
  11. package/dist/api/query-builder.js +95 -0
  12. package/dist/api/query-builder.js.map +1 -0
  13. package/dist/api/query.d.ts +32 -0
  14. package/dist/api/search.d.ts +20 -0
  15. package/dist/api/search.js +112 -0
  16. package/dist/api/search.js.map +1 -0
  17. package/dist/api/slug.d.ts +10 -0
  18. package/dist/api/slug.js +55 -0
  19. package/dist/api/slug.js.map +1 -0
  20. package/dist/cli/builder.d.ts +74 -0
  21. package/dist/cli/builder.js +42 -0
  22. package/dist/cli/builder.js.map +1 -0
  23. package/dist/cli/commands.d.ts +53 -0
  24. package/dist/cli/commands.js +57 -0
  25. package/dist/cli/commands.js.map +1 -0
  26. package/dist/cli/formatters.d.ts +15 -0
  27. package/dist/cli/formatters.js +50 -0
  28. package/dist/cli/formatters.js.map +1 -0
  29. package/dist/cli/index.d.ts +3 -0
  30. package/dist/discovery/context-root.d.ts +31 -0
  31. package/dist/discovery/context-root.js +48 -0
  32. package/dist/discovery/context-root.js.map +1 -0
  33. package/dist/discovery/hierarchical-provider.d.ts +13 -0
  34. package/dist/discovery/hierarchical-provider.js +102 -0
  35. package/dist/discovery/hierarchical-provider.js.map +1 -0
  36. package/dist/discovery/index.d.ts +18 -0
  37. package/dist/discovery/index.js +47 -0
  38. package/dist/discovery/index.js.map +1 -0
  39. package/dist/discovery/walker.d.ts +36 -0
  40. package/dist/discovery/walker.js +87 -0
  41. package/dist/discovery/walker.js.map +1 -0
  42. package/dist/index.cjs +1763 -0
  43. package/dist/index.cjs.map +1 -0
  44. package/dist/index.d.ts +9 -0
  45. package/dist/index.js +24 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/namespace/index.d.ts +3 -0
  48. package/dist/namespace/multi-context.d.ts +40 -0
  49. package/dist/namespace/multi-context.js +72 -0
  50. package/dist/namespace/multi-context.js.map +1 -0
  51. package/dist/namespace/resolver.d.ts +33 -0
  52. package/dist/namespace/resolver.js +85 -0
  53. package/dist/namespace/resolver.js.map +1 -0
  54. package/dist/namespace/types.d.ts +41 -0
  55. package/dist/overcontext.d.ts +7 -0
  56. package/dist/schema/base.d.ts +29 -0
  57. package/dist/schema/base.js +24 -0
  58. package/dist/schema/base.js.map +1 -0
  59. package/dist/schema/builder.d.ts +28 -0
  60. package/dist/schema/builder.js +39 -0
  61. package/dist/schema/builder.js.map +1 -0
  62. package/dist/schema/index.d.ts +5 -0
  63. package/dist/schema/inference.d.ts +49 -0
  64. package/dist/schema/inference.js +15 -0
  65. package/dist/schema/inference.js.map +1 -0
  66. package/dist/schema/registry.d.ts +74 -0
  67. package/dist/schema/registry.js +117 -0
  68. package/dist/schema/registry.js.map +1 -0
  69. package/dist/schema/validation.d.ts +26 -0
  70. package/dist/schema/validation.js +51 -0
  71. package/dist/schema/validation.js.map +1 -0
  72. package/dist/storage/errors.d.ts +35 -0
  73. package/dist/storage/errors.js +58 -0
  74. package/dist/storage/errors.js.map +1 -0
  75. package/dist/storage/events.d.ts +50 -0
  76. package/dist/storage/filesystem.d.ts +10 -0
  77. package/dist/storage/filesystem.js +284 -0
  78. package/dist/storage/filesystem.js.map +1 -0
  79. package/dist/storage/index.d.ts +6 -0
  80. package/dist/storage/interface.d.ts +109 -0
  81. package/dist/storage/memory.d.ts +7 -0
  82. package/dist/storage/memory.js +128 -0
  83. package/dist/storage/memory.js.map +1 -0
  84. package/dist/storage/observable.d.ts +6 -0
  85. package/dist/storage/observable.js +98 -0
  86. package/dist/storage/observable.js.map +1 -0
  87. package/package.json +85 -0
@@ -0,0 +1,128 @@
1
+ import { ReadonlyStorageError, ValidationError } from './errors.js';
2
+
3
+ const createMemoryProvider = (options)=>{
4
+ const { registry, readonly = false, defaultNamespace, initialData = [] } = options;
5
+ // Storage: namespace -> type -> id -> entity
6
+ const store = new Map();
7
+ const getNamespaceStore = (namespace)=>{
8
+ if (!store.has(namespace)) {
9
+ store.set(namespace, new Map());
10
+ }
11
+ return store.get(namespace);
12
+ };
13
+ const getTypeStore = (namespace, type)=>{
14
+ const nsStore = getNamespaceStore(namespace);
15
+ if (!nsStore.has(type)) {
16
+ nsStore.set(type, new Map());
17
+ }
18
+ return nsStore.get(type);
19
+ };
20
+ const resolveNamespace = (ns)=>{
21
+ var _ref;
22
+ return (_ref = ns !== null && ns !== void 0 ? ns : defaultNamespace) !== null && _ref !== void 0 ? _ref : '_default';
23
+ };
24
+ // Initialize with any provided data
25
+ for (const entity of initialData){
26
+ const ns = resolveNamespace(entity.namespace);
27
+ getTypeStore(ns, entity.type).set(entity.id, entity);
28
+ }
29
+ return {
30
+ name: 'memory',
31
+ location: 'in-memory',
32
+ registry,
33
+ async initialize () {},
34
+ async dispose () {
35
+ store.clear();
36
+ },
37
+ async isAvailable () {
38
+ return true;
39
+ },
40
+ async get (type, id, namespace) {
41
+ const ns = resolveNamespace(namespace);
42
+ return getTypeStore(ns, type).get(id);
43
+ },
44
+ async getAll (type, namespace) {
45
+ const ns = resolveNamespace(namespace);
46
+ return Array.from(getTypeStore(ns, type).values());
47
+ },
48
+ async find (filter) {
49
+ var _filter_ids;
50
+ let results = [];
51
+ const types = filter.type ? Array.isArray(filter.type) ? filter.type : [
52
+ filter.type
53
+ ] : registry.types();
54
+ const ns = resolveNamespace(filter.namespace);
55
+ for (const type of types){
56
+ results = results.concat(await this.getAll(type, ns));
57
+ }
58
+ if ((_filter_ids = filter.ids) === null || _filter_ids === void 0 ? void 0 : _filter_ids.length) {
59
+ results = results.filter((e)=>filter.ids.includes(e.id));
60
+ }
61
+ if (filter.search) {
62
+ const s = filter.search.toLowerCase();
63
+ results = results.filter((e)=>e.name.toLowerCase().includes(s));
64
+ }
65
+ if (filter.offset) results = results.slice(filter.offset);
66
+ if (filter.limit) results = results.slice(0, filter.limit);
67
+ return results;
68
+ },
69
+ async exists (type, id, namespace) {
70
+ const ns = resolveNamespace(namespace);
71
+ return getTypeStore(ns, type).has(id);
72
+ },
73
+ async count (filter) {
74
+ return (await this.find(filter)).length;
75
+ },
76
+ async save (entity, namespace) {
77
+ if (readonly) {
78
+ throw new ReadonlyStorageError();
79
+ }
80
+ const validationResult = registry.validate(entity);
81
+ if (!validationResult.success) {
82
+ throw new ValidationError('Validation failed', validationResult.errors || []);
83
+ }
84
+ const ns = resolveNamespace(namespace);
85
+ const now = new Date();
86
+ const existing = getTypeStore(ns, entity.type).get(entity.id);
87
+ const saved = {
88
+ ...entity,
89
+ namespace: ns,
90
+ createdAt: (existing === null || existing === void 0 ? void 0 : existing.createdAt) || now,
91
+ updatedAt: now
92
+ };
93
+ getTypeStore(ns, entity.type).set(entity.id, saved);
94
+ return saved;
95
+ },
96
+ async delete (type, id, namespace) {
97
+ if (readonly) {
98
+ throw new ReadonlyStorageError();
99
+ }
100
+ const ns = resolveNamespace(namespace);
101
+ return getTypeStore(ns, type).delete(id);
102
+ },
103
+ async saveBatch (entities, namespace) {
104
+ return Promise.all(entities.map((e)=>this.save(e, namespace)));
105
+ },
106
+ async deleteBatch (refs, namespace) {
107
+ let count = 0;
108
+ for (const ref of refs){
109
+ if (await this.delete(ref.type, ref.id, namespace)) count++;
110
+ }
111
+ return count;
112
+ },
113
+ async listNamespaces () {
114
+ return Array.from(store.keys()).filter((ns)=>ns !== '_default');
115
+ },
116
+ async namespaceExists (namespace) {
117
+ return store.has(namespace);
118
+ },
119
+ async listTypes (namespace) {
120
+ const ns = resolveNamespace(namespace);
121
+ const nsStore = store.get(ns);
122
+ return nsStore ? Array.from(nsStore.keys()) : [];
123
+ }
124
+ };
125
+ };
126
+
127
+ export { createMemoryProvider };
128
+ //# sourceMappingURL=memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.js","sources":["../../src/storage/memory.ts"],"sourcesContent":["import { StorageProvider, StorageProviderOptions, EntityFilter } from './interface';\nimport { BaseEntity } from '../schema/base';\nimport { ValidationError, ReadonlyStorageError } from './errors';\n\nexport interface MemoryProviderOptions extends StorageProviderOptions {\n /** Initial data to populate */\n initialData?: BaseEntity[];\n}\n\nexport const createMemoryProvider = (\n options: MemoryProviderOptions\n): StorageProvider => {\n const { registry, readonly = false, defaultNamespace, initialData = [] } = options;\n\n // Storage: namespace -> type -> id -> entity\n const store = new Map<string, Map<string, Map<string, BaseEntity>>>();\n\n const getNamespaceStore = (namespace: string): Map<string, Map<string, BaseEntity>> => {\n if (!store.has(namespace)) {\n store.set(namespace, new Map());\n }\n return store.get(namespace)!;\n };\n\n const getTypeStore = (\n namespace: string,\n type: string\n ): Map<string, BaseEntity> => {\n const nsStore = getNamespaceStore(namespace);\n if (!nsStore.has(type)) {\n nsStore.set(type, new Map());\n }\n return nsStore.get(type)!;\n };\n\n const resolveNamespace = (ns?: string): string => ns ?? defaultNamespace ?? '_default';\n\n // Initialize with any provided data\n for (const entity of initialData) {\n const ns = resolveNamespace(entity.namespace);\n getTypeStore(ns, entity.type).set(entity.id, entity);\n }\n\n return {\n name: 'memory',\n location: 'in-memory',\n registry,\n\n async initialize() { },\n\n async dispose() {\n store.clear();\n },\n\n async isAvailable() {\n return true;\n },\n\n async get<T extends BaseEntity>(\n type: string,\n id: string,\n namespace?: string\n ): Promise<T | undefined> {\n const ns = resolveNamespace(namespace);\n return getTypeStore(ns, type).get(id) as T | undefined;\n },\n\n async getAll<T extends BaseEntity>(\n type: string,\n namespace?: string\n ): Promise<T[]> {\n const ns = resolveNamespace(namespace);\n return Array.from(getTypeStore(ns, type).values()) as T[];\n },\n\n async find<T extends BaseEntity>(filter: EntityFilter): Promise<T[]> {\n let results: T[] = [];\n\n const types = filter.type\n ? (Array.isArray(filter.type) ? filter.type : [filter.type])\n : registry.types();\n\n const ns = resolveNamespace(filter.namespace);\n\n for (const type of types) {\n results = results.concat(await this.getAll<T>(type, ns));\n }\n\n if (filter.ids?.length) {\n results = results.filter(e => filter.ids!.includes(e.id));\n }\n\n if (filter.search) {\n const s = filter.search.toLowerCase();\n results = results.filter(e => e.name.toLowerCase().includes(s));\n }\n\n if (filter.offset) results = results.slice(filter.offset);\n if (filter.limit) results = results.slice(0, filter.limit);\n\n return results;\n },\n\n async exists(type: string, id: string, namespace?: string): Promise<boolean> {\n const ns = resolveNamespace(namespace);\n return getTypeStore(ns, type).has(id);\n },\n\n async count(filter: EntityFilter): Promise<number> {\n return (await this.find(filter)).length;\n },\n\n async save<T extends BaseEntity>(entity: T, namespace?: string): Promise<T> {\n if (readonly) {\n throw new ReadonlyStorageError();\n }\n\n const validationResult = registry.validate(entity);\n if (!validationResult.success) {\n throw new ValidationError(\n 'Validation failed',\n validationResult.errors || []\n );\n }\n\n const ns = resolveNamespace(namespace);\n const now = new Date();\n const existing = getTypeStore(ns, entity.type).get(entity.id);\n\n const saved = {\n ...entity,\n namespace: ns,\n createdAt: existing?.createdAt || now,\n updatedAt: now,\n } as T;\n\n getTypeStore(ns, entity.type).set(entity.id, saved);\n return saved;\n },\n\n async delete(type: string, id: string, namespace?: string): Promise<boolean> {\n if (readonly) {\n throw new ReadonlyStorageError();\n }\n\n const ns = resolveNamespace(namespace);\n return getTypeStore(ns, type).delete(id);\n },\n\n async saveBatch<T extends BaseEntity>(\n entities: T[],\n namespace?: string\n ): Promise<T[]> {\n return Promise.all(entities.map(e => this.save(e, namespace)));\n },\n\n async deleteBatch(\n refs: Array<{ type: string; id: string }>,\n namespace?: string\n ): Promise<number> {\n let count = 0;\n for (const ref of refs) {\n if (await this.delete(ref.type, ref.id, namespace)) count++;\n }\n return count;\n },\n\n async listNamespaces(): Promise<string[]> {\n return Array.from(store.keys()).filter(ns => ns !== '_default');\n },\n\n async namespaceExists(namespace: string): Promise<boolean> {\n return store.has(namespace);\n },\n\n async listTypes(namespace?: string): Promise<string[]> {\n const ns = resolveNamespace(namespace);\n const nsStore = store.get(ns);\n return nsStore ? Array.from(nsStore.keys()) : [];\n },\n };\n};\n"],"names":["createMemoryProvider","options","registry","readonly","defaultNamespace","initialData","store","Map","getNamespaceStore","namespace","has","set","get","getTypeStore","type","nsStore","resolveNamespace","ns","entity","id","name","location","initialize","dispose","clear","isAvailable","getAll","Array","from","values","find","filter","results","types","isArray","concat","ids","length","e","includes","search","s","toLowerCase","offset","slice","limit","exists","count","save","ReadonlyStorageError","validationResult","validate","success","ValidationError","errors","now","Date","existing","saved","createdAt","updatedAt","delete","saveBatch","entities","Promise","all","map","deleteBatch","refs","ref","listNamespaces","keys","namespaceExists","listTypes"],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { StorageProvider } from './interface';
2
+ import { ObservableStorageProvider } from './events';
3
+ /**
4
+ * Wrap any StorageProvider to make it observable.
5
+ */
6
+ export declare const createObservableProvider: (provider: StorageProvider) => ObservableStorageProvider;
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Wrap any StorageProvider to make it observable.
3
+ */ const createObservableProvider = (provider)=>{
4
+ const handlers = new Set();
5
+ const emit = (event)=>{
6
+ handlers.forEach((handler)=>{
7
+ try {
8
+ handler(event);
9
+ } catch (error) {
10
+ // eslint-disable-next-line no-console
11
+ console.error('Storage event handler error:', error);
12
+ }
13
+ });
14
+ };
15
+ return {
16
+ ...provider,
17
+ subscribe (handler) {
18
+ handlers.add(handler);
19
+ return ()=>handlers.delete(handler);
20
+ },
21
+ async initialize () {
22
+ await provider.initialize();
23
+ emit({
24
+ type: 'storage:initialized',
25
+ timestamp: new Date()
26
+ });
27
+ },
28
+ async dispose () {
29
+ emit({
30
+ type: 'storage:disposed',
31
+ timestamp: new Date()
32
+ });
33
+ await provider.dispose();
34
+ },
35
+ async save (entity, namespace) {
36
+ const existing = await provider.get(entity.type, entity.id, namespace);
37
+ const saved = await provider.save(entity, namespace);
38
+ if (existing) {
39
+ emit({
40
+ type: 'entity:updated',
41
+ timestamp: new Date(),
42
+ namespace,
43
+ entityType: entity.type,
44
+ entityId: entity.id,
45
+ entity: saved,
46
+ previousEntity: existing
47
+ });
48
+ } else {
49
+ emit({
50
+ type: 'entity:created',
51
+ timestamp: new Date(),
52
+ namespace,
53
+ entityType: entity.type,
54
+ entityId: entity.id,
55
+ entity: saved
56
+ });
57
+ }
58
+ return saved;
59
+ },
60
+ async delete (type, id, namespace) {
61
+ const deleted = await provider.delete(type, id, namespace);
62
+ if (deleted) {
63
+ emit({
64
+ type: 'entity:deleted',
65
+ timestamp: new Date(),
66
+ namespace,
67
+ entityType: type,
68
+ entityId: id
69
+ });
70
+ }
71
+ return deleted;
72
+ },
73
+ async saveBatch (entities, namespace) {
74
+ const saved = await provider.saveBatch(entities, namespace);
75
+ emit({
76
+ type: 'batch:saved',
77
+ timestamp: new Date(),
78
+ namespace,
79
+ entities: saved
80
+ });
81
+ return saved;
82
+ },
83
+ async deleteBatch (refs, namespace) {
84
+ const count = await provider.deleteBatch(refs, namespace);
85
+ emit({
86
+ type: 'batch:deleted',
87
+ timestamp: new Date(),
88
+ namespace,
89
+ refs,
90
+ deletedCount: count
91
+ });
92
+ return count;
93
+ }
94
+ };
95
+ };
96
+
97
+ export { createObservableProvider };
98
+ //# sourceMappingURL=observable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observable.js","sources":["../../src/storage/observable.ts"],"sourcesContent":["import { BaseEntity } from '../schema/base';\nimport { StorageProvider } from './interface';\nimport {\n StorageEventHandler,\n AnyStorageEvent,\n ObservableStorageProvider,\n} from './events';\n\n/**\n * Wrap any StorageProvider to make it observable.\n */\nexport const createObservableProvider = (\n provider: StorageProvider\n): ObservableStorageProvider => {\n const handlers = new Set<StorageEventHandler>();\n\n const emit = (event: AnyStorageEvent): void => {\n handlers.forEach(handler => {\n try {\n handler(event);\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error('Storage event handler error:', error);\n }\n });\n };\n\n return {\n ...provider,\n\n subscribe(handler: StorageEventHandler): () => void {\n handlers.add(handler);\n return () => handlers.delete(handler);\n },\n\n async initialize(): Promise<void> {\n await provider.initialize();\n emit({ type: 'storage:initialized', timestamp: new Date() });\n },\n\n async dispose(): Promise<void> {\n emit({ type: 'storage:disposed', timestamp: new Date() });\n await provider.dispose();\n },\n\n async save<T extends BaseEntity>(entity: T, namespace?: string): Promise<T> {\n const existing = await provider.get(entity.type, entity.id, namespace);\n const saved = await provider.save(entity, namespace);\n\n if (existing) {\n emit({\n type: 'entity:updated',\n timestamp: new Date(),\n namespace,\n entityType: entity.type,\n entityId: entity.id,\n entity: saved,\n previousEntity: existing,\n });\n } else {\n emit({\n type: 'entity:created',\n timestamp: new Date(),\n namespace,\n entityType: entity.type,\n entityId: entity.id,\n entity: saved,\n });\n }\n\n return saved;\n },\n\n async delete(type: string, id: string, namespace?: string): Promise<boolean> {\n const deleted = await provider.delete(type, id, namespace);\n\n if (deleted) {\n emit({\n type: 'entity:deleted',\n timestamp: new Date(),\n namespace,\n entityType: type,\n entityId: id,\n });\n }\n\n return deleted;\n },\n\n async saveBatch<T extends BaseEntity>(entities: T[], namespace?: string): Promise<T[]> {\n const saved = await provider.saveBatch(entities, namespace);\n\n emit({\n type: 'batch:saved',\n timestamp: new Date(),\n namespace,\n entities: saved,\n });\n\n return saved;\n },\n\n async deleteBatch(\n refs: Array<{ type: string; id: string }>,\n namespace?: string\n ): Promise<number> {\n const count = await provider.deleteBatch(refs, namespace);\n\n emit({\n type: 'batch:deleted',\n timestamp: new Date(),\n namespace,\n refs,\n deletedCount: count,\n });\n\n return count;\n },\n };\n};\n"],"names":["createObservableProvider","provider","handlers","Set","emit","event","forEach","handler","error","console","subscribe","add","delete","initialize","type","timestamp","Date","dispose","save","entity","namespace","existing","get","id","saved","entityType","entityId","previousEntity","deleted","saveBatch","entities","deleteBatch","refs","count","deletedCount"],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,85 @@
1
+ {
2
+ "name": "@utilarium/overcontext",
3
+ "version": "0.0.4-dev.0",
4
+ "description": "Schema-driven framework for context management - provides infrastructure for defining and managing custom entity schemas.",
5
+ "type": "module",
6
+ "main": "./dist/index.cjs",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "git+https://github.com/utilarium/overcontext.git"
12
+ },
13
+ "exports": {
14
+ ".": {
15
+ "types": "./dist/index.d.ts",
16
+ "import": "./dist/index.js",
17
+ "require": "./dist/index.cjs"
18
+ },
19
+ "./package.json": "./package.json"
20
+ },
21
+ "files": [
22
+ "dist",
23
+ "README.md",
24
+ "LICENSE"
25
+ ],
26
+ "scripts": {
27
+ "build": "npm run lint && tsc --noEmit && vite build",
28
+ "dev": "vite build --watch",
29
+ "watch": "vite build --watch",
30
+ "test": "vitest run --coverage",
31
+ "precommit": "npm run lint && npm run test",
32
+ "lint": "eslint . --ext .ts",
33
+ "lint:fix": "eslint . --ext .ts --fix",
34
+ "clean": "rm -rf dist",
35
+ "prepublishOnly": "npm run clean && npm run build",
36
+ "docs:dev": "cd docs && cp ../README.md public/ && npm install && npm run dev",
37
+ "docs:build": "cd docs && cp ../README.md public/ && npm install && npm run build",
38
+ "docs:preview": "cd docs && npm run preview",
39
+ "docs:test": "cd docs && npm install && npm run test",
40
+ "docs:coverage": "cd docs && npm install && npm run coverage"
41
+ },
42
+ "keywords": [
43
+ "context",
44
+ "schema",
45
+ "entity",
46
+ "framework",
47
+ "zod",
48
+ "storage",
49
+ "hierarchical",
50
+ "discovery"
51
+ ],
52
+ "author": "Tim O'Brien <tobrien@discursive.com>",
53
+ "license": "Apache-2.0",
54
+ "homepage": "https://utilarium.github.io/overcontext/",
55
+ "engines": {
56
+ "node": ">=24.0.0"
57
+ },
58
+ "dependencies": {
59
+ "js-yaml": "^4.1.1",
60
+ "zod": "^4.3.6"
61
+ },
62
+ "devDependencies": {
63
+ "@eslint/eslintrc": "^3.3.1",
64
+ "@eslint/js": "^9.30.1",
65
+ "@rollup/plugin-replace": "^6.0.2",
66
+ "@swc/core": "^1.12.11",
67
+ "@types/js-yaml": "^4.0.9",
68
+ "@types/node": "^25.0.3",
69
+ "@typescript-eslint/eslint-plugin": "^8.36.0",
70
+ "@typescript-eslint/parser": "^8.36.0",
71
+ "@vitest/coverage-v8": "^4.0.16",
72
+ "ajv": "^8.17.1",
73
+ "eslint": "^9.30.1",
74
+ "eslint-plugin-import": "^2.32.0",
75
+ "globals": "^17.0.0",
76
+ "typescript": "^5.8.3",
77
+ "vite": "^7.0.4",
78
+ "vite-plugin-dts": "^4.5.4",
79
+ "vite-plugin-node": "^7.0.0",
80
+ "vitest": "^4.0.16"
81
+ },
82
+ "overrides": {
83
+ "wrap-ansi": "7.0.0"
84
+ }
85
+ }