@utilarium/overcontext 0.0.7 → 0.0.8-dev.20260226040805.d18adcf

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.
@@ -1 +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 handlers.clear(); // Clear all handlers to prevent memory leaks\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","clear","save","entity","namespace","existing","get","id","saved","entityType","entityId","previousEntity","deleted","saveBatch","entities","deleteBatch","refs","count","deletedCount"],"mappings":"AAQA;;IAGO,MAAMA,wBAAAA,GAA2B,CACpCC,QAAAA,GAAAA;AAEA,IAAA,MAAMC,WAAW,IAAIC,GAAAA,EAAAA;AAErB,IAAA,MAAMC,OAAO,CAACC,KAAAA,GAAAA;QACVH,QAAAA,CAASI,OAAO,CAACC,CAAAA,OAAAA,GAAAA;YACb,IAAI;gBACAA,OAAAA,CAAQF,KAAAA,CAAAA;AACZ,YAAA,CAAA,CAAE,OAAOG,KAAAA,EAAO;;gBAEZC,OAAAA,CAAQD,KAAK,CAAC,8BAAA,EAAgCA,KAAAA,CAAAA;AAClD,YAAA;AACJ,QAAA,CAAA,CAAA;AACJ,IAAA,CAAA;IAEA,OAAO;AACH,QAAA,GAAGP,QAAQ;AAEXS,QAAAA,SAAAA,CAAAA,CAAUH,OAA4B,EAAA;AAClCL,YAAAA,QAAAA,CAASS,GAAG,CAACJ,OAAAA,CAAAA;YACb,OAAO,IAAML,QAAAA,CAASU,MAAM,CAACL,OAAAA,CAAAA;AACjC,QAAA,CAAA;QAEA,MAAMM,UAAAA,CAAAA,GAAAA;AACF,YAAA,MAAMZ,SAASY,UAAU,EAAA;YACzBT,IAAAA,CAAK;gBAAEU,IAAAA,EAAM,qBAAA;AAAuBC,gBAAAA,SAAAA,EAAW,IAAIC,IAAAA;AAAO,aAAA,CAAA;AAC9D,QAAA,CAAA;QAEA,MAAMC,OAAAA,CAAAA,GAAAA;YACFb,IAAAA,CAAK;gBAAEU,IAAAA,EAAM,kBAAA;AAAoBC,gBAAAA,SAAAA,EAAW,IAAIC,IAAAA;AAAO,aAAA,CAAA;YACvDd,QAAAA,CAASgB,KAAK;AACd,YAAA,MAAMjB,SAASgB,OAAO,EAAA;AAC1B,QAAA,CAAA;QAEA,MAAME,IAAAA,CAAAA,CAA2BC,MAAS,EAAEC,SAAkB,EAAA;YAC1D,MAAMC,QAAAA,GAAW,MAAMrB,QAAAA,CAASsB,GAAG,CAACH,OAAON,IAAI,EAAEM,MAAAA,CAAOI,EAAE,EAAEH,SAAAA,CAAAA;AAC5D,YAAA,MAAMI,KAAAA,GAAQ,MAAMxB,QAAAA,CAASkB,IAAI,CAACC,MAAAA,EAAQC,SAAAA,CAAAA;AAE1C,YAAA,IAAIC,QAAAA,EAAU;gBACVlB,IAAAA,CAAK;oBACDU,IAAAA,EAAM,gBAAA;AACNC,oBAAAA,SAAAA,EAAW,IAAIC,IAAAA,EAAAA;AACfK,oBAAAA,SAAAA;AACAK,oBAAAA,UAAAA,EAAYN,OAAON,IAAI;AACvBa,oBAAAA,QAAAA,EAAUP,OAAOI,EAAE;oBACnBJ,MAAAA,EAAQK,KAAAA;oBACRG,cAAAA,EAAgBN;AACpB,iBAAA,CAAA;YACJ,CAAA,MAAO;gBACHlB,IAAAA,CAAK;oBACDU,IAAAA,EAAM,gBAAA;AACNC,oBAAAA,SAAAA,EAAW,IAAIC,IAAAA,EAAAA;AACfK,oBAAAA,SAAAA;AACAK,oBAAAA,UAAAA,EAAYN,OAAON,IAAI;AACvBa,oBAAAA,QAAAA,EAAUP,OAAOI,EAAE;oBACnBJ,MAAAA,EAAQK;AACZ,iBAAA,CAAA;AACJ,YAAA;YAEA,OAAOA,KAAAA;AACX,QAAA,CAAA;AAEA,QAAA,MAAMb,MAAAA,CAAAA,CAAOE,IAAY,EAAEU,EAAU,EAAEH,SAAkB,EAAA;AACrD,YAAA,MAAMQ,UAAU,MAAM5B,QAAAA,CAASW,MAAM,CAACE,MAAMU,EAAAA,EAAIH,SAAAA,CAAAA;AAEhD,YAAA,IAAIQ,OAAAA,EAAS;gBACTzB,IAAAA,CAAK;oBACDU,IAAAA,EAAM,gBAAA;AACNC,oBAAAA,SAAAA,EAAW,IAAIC,IAAAA,EAAAA;AACfK,oBAAAA,SAAAA;oBACAK,UAAAA,EAAYZ,IAAAA;oBACZa,QAAAA,EAAUH;AACd,iBAAA,CAAA;AACJ,YAAA;YAEA,OAAOK,OAAAA;AACX,QAAA,CAAA;QAEA,MAAMC,SAAAA,CAAAA,CAAgCC,QAAa,EAAEV,SAAkB,EAAA;AACnE,YAAA,MAAMI,KAAAA,GAAQ,MAAMxB,QAAAA,CAAS6B,SAAS,CAACC,QAAAA,EAAUV,SAAAA,CAAAA;YAEjDjB,IAAAA,CAAK;gBACDU,IAAAA,EAAM,aAAA;AACNC,gBAAAA,SAAAA,EAAW,IAAIC,IAAAA,EAAAA;AACfK,gBAAAA,SAAAA;gBACAU,QAAAA,EAAUN;AACd,aAAA,CAAA;YAEA,OAAOA,KAAAA;AACX,QAAA,CAAA;QAEA,MAAMO,WAAAA,CAAAA,CACFC,IAAyC,EACzCZ,SAAkB,EAAA;AAElB,YAAA,MAAMa,KAAAA,GAAQ,MAAMjC,QAAAA,CAAS+B,WAAW,CAACC,IAAAA,EAAMZ,SAAAA,CAAAA;YAE/CjB,IAAAA,CAAK;gBACDU,IAAAA,EAAM,eAAA;AACNC,gBAAAA,SAAAA,EAAW,IAAIC,IAAAA,EAAAA;AACfK,gBAAAA,SAAAA;AACAY,gBAAAA,IAAAA;gBACAE,YAAAA,EAAcD;AAClB,aAAA,CAAA;YAEA,OAAOA,KAAAA;AACX,QAAA;AACJ,KAAA;AACJ;;;;"}
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 get name(): string {\n return provider.name;\n },\n\n get location(): string {\n return provider.location;\n },\n\n get registry() {\n return provider.registry;\n },\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 handlers.clear(); // Clear all handlers to prevent memory leaks\n await provider.dispose();\n },\n\n async isAvailable(): Promise<boolean> {\n return provider.isAvailable();\n },\n\n async get<T extends BaseEntity>(type: string, id: string, namespace?: string): Promise<T | undefined> {\n return provider.get<T>(type, id, namespace);\n },\n\n async getAll<T extends BaseEntity>(type: string, namespace?: string): Promise<T[]> {\n return provider.getAll<T>(type, namespace);\n },\n\n async find<T extends BaseEntity>(filter: Parameters<StorageProvider['find']>[0]): Promise<T[]> {\n return provider.find<T>(filter);\n },\n\n async exists(type: string, id: string, namespace?: string): Promise<boolean> {\n return provider.exists(type, id, namespace);\n },\n\n async count(filter: Parameters<StorageProvider['count']>[0]): Promise<number> {\n return provider.count(filter);\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 async listNamespaces(): Promise<string[]> {\n return provider.listNamespaces();\n },\n\n async namespaceExists(namespace: string): Promise<boolean> {\n return provider.namespaceExists(namespace);\n },\n\n async listTypes(namespace?: string): Promise<string[]> {\n return provider.listTypes(namespace);\n },\n };\n};\n"],"names":["createObservableProvider","provider","handlers","Set","emit","event","forEach","handler","error","console","name","location","registry","subscribe","add","delete","initialize","type","timestamp","Date","dispose","clear","isAvailable","get","id","namespace","getAll","find","filter","exists","count","save","entity","existing","saved","entityType","entityId","previousEntity","deleted","saveBatch","entities","deleteBatch","refs","deletedCount","listNamespaces","namespaceExists","listTypes"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@utilarium/overcontext",
3
- "version": "0.0.7",
3
+ "version": "0.0.8-dev.20260226040805.d18adcf",
4
4
  "description": "Schema-driven framework for context management - provides infrastructure for defining and managing custom entity schemas.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -56,6 +56,11 @@
56
56
  "node": ">=24.0.0"
57
57
  },
58
58
  "dependencies": {
59
+ "@fjell/core": "^4.4.77",
60
+ "@fjell/lib": "^4.4.88",
61
+ "@fjell/lib-fs": "^4.4.24",
62
+ "@fjell/lib-gcs": "^4.4.37",
63
+ "@google-cloud/storage": "^7.19.0",
59
64
  "js-yaml": "^4.1.1",
60
65
  "zod": "^4.3.6"
61
66
  },