@objectstack/metadata 1.0.4 → 1.0.5

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 (56) hide show
  1. package/.turbo/turbo-build.log +22 -0
  2. package/CHANGELOG.md +14 -0
  3. package/dist/index.d.mts +306 -0
  4. package/dist/index.d.ts +305 -16
  5. package/dist/index.js +1078 -15
  6. package/dist/index.js.map +1 -0
  7. package/dist/index.mjs +1040 -0
  8. package/dist/index.mjs.map +1 -0
  9. package/package.json +7 -7
  10. package/tsconfig.json +1 -3
  11. package/dist/index.d.ts.map +0 -1
  12. package/dist/loaders/filesystem-loader.d.ts +0 -42
  13. package/dist/loaders/filesystem-loader.d.ts.map +0 -1
  14. package/dist/loaders/filesystem-loader.js +0 -342
  15. package/dist/loaders/loader-interface.d.ts +0 -60
  16. package/dist/loaders/loader-interface.d.ts.map +0 -1
  17. package/dist/loaders/loader-interface.js +0 -6
  18. package/dist/loaders/memory-loader.d.ts +0 -19
  19. package/dist/loaders/memory-loader.d.ts.map +0 -1
  20. package/dist/loaders/memory-loader.js +0 -71
  21. package/dist/loaders/remote-loader.d.ts +0 -22
  22. package/dist/loaders/remote-loader.d.ts.map +0 -1
  23. package/dist/loaders/remote-loader.js +0 -103
  24. package/dist/metadata-manager.d.ts +0 -71
  25. package/dist/metadata-manager.d.ts.map +0 -1
  26. package/dist/metadata-manager.js +0 -211
  27. package/dist/migration/executor.d.ts +0 -9
  28. package/dist/migration/executor.d.ts.map +0 -1
  29. package/dist/migration/executor.js +0 -49
  30. package/dist/migration/index.d.ts +0 -2
  31. package/dist/migration/index.d.ts.map +0 -1
  32. package/dist/migration/index.js +0 -1
  33. package/dist/node-metadata-manager.d.ts +0 -26
  34. package/dist/node-metadata-manager.d.ts.map +0 -1
  35. package/dist/node-metadata-manager.js +0 -98
  36. package/dist/node.d.ts +0 -8
  37. package/dist/node.d.ts.map +0 -1
  38. package/dist/node.js +0 -7
  39. package/dist/plugin.d.ts +0 -15
  40. package/dist/plugin.d.ts.map +0 -1
  41. package/dist/plugin.js +0 -71
  42. package/dist/serializers/json-serializer.d.ts +0 -20
  43. package/dist/serializers/json-serializer.d.ts.map +0 -1
  44. package/dist/serializers/json-serializer.js +0 -53
  45. package/dist/serializers/serializer-interface.d.ts +0 -57
  46. package/dist/serializers/serializer-interface.d.ts.map +0 -1
  47. package/dist/serializers/serializer-interface.js +0 -6
  48. package/dist/serializers/serializers.test.d.ts +0 -2
  49. package/dist/serializers/serializers.test.d.ts.map +0 -1
  50. package/dist/serializers/serializers.test.js +0 -62
  51. package/dist/serializers/typescript-serializer.d.ts +0 -18
  52. package/dist/serializers/typescript-serializer.d.ts.map +0 -1
  53. package/dist/serializers/typescript-serializer.js +0 -103
  54. package/dist/serializers/yaml-serializer.d.ts +0 -16
  55. package/dist/serializers/yaml-serializer.d.ts.map +0 -1
  56. package/dist/serializers/yaml-serializer.js +0 -35
@@ -1,6 +0,0 @@
1
- /**
2
- * Metadata Loader Interface
3
- *
4
- * Defines the contract for loading metadata from various sources
5
- */
6
- export {};
@@ -1,19 +0,0 @@
1
- /**
2
- * Memory Metadata Loader
3
- *
4
- * Stores metadata in memory only. Changes are lost when process restarts.
5
- * Useful for testing, temporary overrides, or "dirty" edits.
6
- */
7
- import type { MetadataLoadOptions, MetadataLoadResult, MetadataStats, MetadataLoaderContract, MetadataSaveOptions, MetadataSaveResult } from '@objectstack/spec/system';
8
- import type { MetadataLoader } from './loader-interface.js';
9
- export declare class MemoryLoader implements MetadataLoader {
10
- readonly contract: MetadataLoaderContract;
11
- private storage;
12
- load(type: string, name: string, _options?: MetadataLoadOptions): Promise<MetadataLoadResult>;
13
- loadMany<T = any>(type: string, _options?: MetadataLoadOptions): Promise<T[]>;
14
- exists(type: string, name: string): Promise<boolean>;
15
- stat(type: string, name: string): Promise<MetadataStats | null>;
16
- list(type: string): Promise<string[]>;
17
- save(type: string, name: string, data: any, _options?: MetadataSaveOptions): Promise<MetadataSaveResult>;
18
- }
19
- //# sourceMappingURL=memory-loader.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"memory-loader.d.ts","sourceRoot":"","sources":["../../src/loaders/memory-loader.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,mBAAmB,EACnB,kBAAkB,EAClB,aAAa,EACb,sBAAsB,EACtB,mBAAmB,EACnB,kBAAkB,EACnB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,qBAAa,YAAa,YAAW,cAAc;IACjD,QAAQ,CAAC,QAAQ,EAAE,sBAAsB,CASvC;IAGF,OAAO,CAAC,OAAO,CAAuC;IAEhD,IAAI,CACR,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,QAAQ,CAAC,EAAE,mBAAmB,GAC7B,OAAO,CAAC,kBAAkB,CAAC;IAgBxB,QAAQ,CAAC,CAAC,GAAG,GAAG,EACpB,IAAI,EAAE,MAAM,EACZ,QAAQ,CAAC,EAAE,mBAAmB,GAC7B,OAAO,CAAC,CAAC,EAAE,CAAC;IAMT,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIpD,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAW/D,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAMrC,IAAI,CACR,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,GAAG,EACT,QAAQ,CAAC,EAAE,mBAAmB,GAC7B,OAAO,CAAC,kBAAkB,CAAC;CAa/B"}
@@ -1,71 +0,0 @@
1
- /**
2
- * Memory Metadata Loader
3
- *
4
- * Stores metadata in memory only. Changes are lost when process restarts.
5
- * Useful for testing, temporary overrides, or "dirty" edits.
6
- */
7
- export class MemoryLoader {
8
- constructor() {
9
- this.contract = {
10
- name: 'memory',
11
- protocol: 'memory',
12
- capabilities: {
13
- read: true,
14
- write: true,
15
- watch: false,
16
- list: true,
17
- },
18
- };
19
- // Storage: Type -> Name -> Data
20
- this.storage = new Map();
21
- }
22
- async load(type, name, _options) {
23
- const typeStore = this.storage.get(type);
24
- const data = typeStore?.get(name);
25
- if (data) {
26
- return {
27
- data,
28
- source: 'memory',
29
- format: 'json',
30
- loadTime: 0,
31
- };
32
- }
33
- return { data: null };
34
- }
35
- async loadMany(type, _options) {
36
- const typeStore = this.storage.get(type);
37
- if (!typeStore)
38
- return [];
39
- return Array.from(typeStore.values());
40
- }
41
- async exists(type, name) {
42
- return this.storage.get(type)?.has(name) ?? false;
43
- }
44
- async stat(type, name) {
45
- if (await this.exists(type, name)) {
46
- return {
47
- size: 0, // In-memory
48
- mtime: new Date(),
49
- format: 'json',
50
- };
51
- }
52
- return null;
53
- }
54
- async list(type) {
55
- const typeStore = this.storage.get(type);
56
- if (!typeStore)
57
- return [];
58
- return Array.from(typeStore.keys());
59
- }
60
- async save(type, name, data, _options) {
61
- if (!this.storage.has(type)) {
62
- this.storage.set(type, new Map());
63
- }
64
- this.storage.get(type).set(name, data);
65
- return {
66
- success: true,
67
- path: `memory://${type}/${name}`,
68
- saveTime: 0,
69
- };
70
- }
71
- }
@@ -1,22 +0,0 @@
1
- /**
2
- * Remote Metadata Loader
3
- *
4
- * Loads metadata from an HTTP API.
5
- * This loader is stateless and delegates storage to the remote server.
6
- */
7
- import type { MetadataLoadOptions, MetadataLoadResult, MetadataStats, MetadataLoaderContract, MetadataSaveOptions, MetadataSaveResult } from '@objectstack/spec/system';
8
- import type { MetadataLoader } from './loader-interface.js';
9
- export declare class RemoteLoader implements MetadataLoader {
10
- private baseUrl;
11
- private authToken?;
12
- readonly contract: MetadataLoaderContract;
13
- constructor(baseUrl: string, authToken?: string | undefined);
14
- private get headers();
15
- load(type: string, name: string, _options?: MetadataLoadOptions): Promise<MetadataLoadResult>;
16
- loadMany<T = any>(type: string, _options?: MetadataLoadOptions): Promise<T[]>;
17
- exists(type: string, name: string): Promise<boolean>;
18
- stat(type: string, name: string): Promise<MetadataStats | null>;
19
- list(type: string): Promise<string[]>;
20
- save(type: string, name: string, data: any, _options?: MetadataSaveOptions): Promise<MetadataSaveResult>;
21
- }
22
- //# sourceMappingURL=remote-loader.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"remote-loader.d.ts","sourceRoot":"","sources":["../../src/loaders/remote-loader.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,mBAAmB,EACnB,kBAAkB,EAClB,aAAa,EACb,sBAAsB,EACtB,mBAAmB,EACnB,kBAAkB,EACnB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,qBAAa,YAAa,YAAW,cAAc;IAYrC,OAAO,CAAC,OAAO;IAAU,OAAO,CAAC,SAAS,CAAC;IAXvD,QAAQ,CAAC,QAAQ,EAAE,sBAAsB,CASvC;gBAEkB,OAAO,EAAE,MAAM,EAAU,SAAS,CAAC,EAAE,MAAM,YAAA;IAE/D,OAAO,KAAK,OAAO,GAKlB;IAEK,IAAI,CACR,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,QAAQ,CAAC,EAAE,mBAAmB,GAC7B,OAAO,CAAC,kBAAkB,CAAC;IA4BxB,QAAQ,CAAC,CAAC,GAAG,GAAG,EACpB,IAAI,EAAE,MAAM,EACZ,QAAQ,CAAC,EAAE,mBAAmB,GAC7B,OAAO,CAAC,CAAC,EAAE,CAAC;IAaT,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAQpD,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAgB/D,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAKrC,IAAI,CACR,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,GAAG,EACT,QAAQ,CAAC,EAAE,mBAAmB,GAC7B,OAAO,CAAC,kBAAkB,CAAC;CAiB/B"}
@@ -1,103 +0,0 @@
1
- /**
2
- * Remote Metadata Loader
3
- *
4
- * Loads metadata from an HTTP API.
5
- * This loader is stateless and delegates storage to the remote server.
6
- */
7
- export class RemoteLoader {
8
- constructor(baseUrl, authToken) {
9
- this.baseUrl = baseUrl;
10
- this.authToken = authToken;
11
- this.contract = {
12
- name: 'remote',
13
- protocol: 'http',
14
- capabilities: {
15
- read: true,
16
- write: true,
17
- watch: false, // Could implement SSE/WebSocket in future
18
- list: true,
19
- },
20
- };
21
- }
22
- get headers() {
23
- return {
24
- 'Content-Type': 'application/json',
25
- ...(this.authToken ? { Authorization: `Bearer ${this.authToken}` } : {}),
26
- };
27
- }
28
- async load(type, name, _options) {
29
- try {
30
- const response = await fetch(`${this.baseUrl}/${type}/${name}`, {
31
- method: 'GET',
32
- headers: this.headers,
33
- });
34
- if (response.status === 404) {
35
- return { data: null };
36
- }
37
- if (!response.ok) {
38
- throw new Error(`Remote load failed: ${response.statusText}`);
39
- }
40
- const data = await response.json();
41
- return {
42
- data,
43
- source: this.baseUrl,
44
- format: 'json',
45
- loadTime: 0,
46
- };
47
- }
48
- catch (error) {
49
- console.error(`RemoteLoader error loading ${type}/${name}`, error);
50
- throw error;
51
- }
52
- }
53
- async loadMany(type, _options) {
54
- const response = await fetch(`${this.baseUrl}/${type}`, {
55
- method: 'GET',
56
- headers: this.headers,
57
- });
58
- if (!response.ok) {
59
- return [];
60
- }
61
- return (await response.json());
62
- }
63
- async exists(type, name) {
64
- const response = await fetch(`${this.baseUrl}/${type}/${name}`, {
65
- method: 'HEAD',
66
- headers: this.headers,
67
- });
68
- return response.ok;
69
- }
70
- async stat(type, name) {
71
- // Basic implementation using HEAD
72
- const response = await fetch(`${this.baseUrl}/${type}/${name}`, {
73
- method: 'HEAD',
74
- headers: this.headers,
75
- });
76
- if (!response.ok)
77
- return null;
78
- return {
79
- size: Number(response.headers.get('content-length') || 0),
80
- mtime: new Date(response.headers.get('last-modified') || Date.now()),
81
- format: 'json',
82
- };
83
- }
84
- async list(type) {
85
- const items = await this.loadMany(type);
86
- return items.map(i => i.name);
87
- }
88
- async save(type, name, data, _options) {
89
- const response = await fetch(`${this.baseUrl}/${type}/${name}`, {
90
- method: 'PUT',
91
- headers: this.headers,
92
- body: JSON.stringify(data),
93
- });
94
- if (!response.ok) {
95
- throw new Error(`Remote save failed: ${response.statusText}`);
96
- }
97
- return {
98
- success: true,
99
- path: `${this.baseUrl}/${type}/${name}`,
100
- saveTime: 0,
101
- };
102
- }
103
- }
@@ -1,71 +0,0 @@
1
- /**
2
- * Metadata Manager
3
- *
4
- * Main orchestrator for metadata loading, saving, and persistence.
5
- * Browser-compatible (Pure).
6
- */
7
- import type { MetadataManagerConfig, MetadataLoadOptions, MetadataSaveOptions, MetadataSaveResult, MetadataWatchEvent, MetadataFormat } from '@objectstack/spec/system';
8
- import { type Logger } from '@objectstack/core';
9
- import type { MetadataSerializer } from './serializers/serializer-interface.js';
10
- import type { MetadataLoader } from './loaders/loader-interface.js';
11
- /**
12
- * Watch callback function
13
- */
14
- export type WatchCallback = (event: MetadataWatchEvent) => void | Promise<void>;
15
- export interface MetadataManagerOptions extends MetadataManagerConfig {
16
- loaders?: MetadataLoader[];
17
- }
18
- /**
19
- * Main metadata manager class
20
- */
21
- export declare class MetadataManager {
22
- private loaders;
23
- protected serializers: Map<MetadataFormat, MetadataSerializer>;
24
- protected logger: Logger;
25
- protected watchCallbacks: Map<string, Set<WatchCallback>>;
26
- protected config: MetadataManagerOptions;
27
- constructor(config: MetadataManagerOptions);
28
- /**
29
- * Register a new metadata loader (data source)
30
- */
31
- registerLoader(loader: MetadataLoader): void;
32
- /**
33
- * Load a single metadata item
34
- * Iterates through registered loaders until found
35
- */
36
- load<T = any>(type: string, name: string, options?: MetadataLoadOptions): Promise<T | null>;
37
- /**
38
- * Load multiple metadata items
39
- * Aggregates results from all loaders
40
- */
41
- loadMany<T = any>(type: string, options?: MetadataLoadOptions): Promise<T[]>;
42
- /**
43
- * Save metadata to disk
44
- */
45
- /**
46
- * Save metadata item
47
- */
48
- save<T = any>(type: string, name: string, data: T, options?: MetadataSaveOptions): Promise<MetadataSaveResult>;
49
- /**
50
- * Check if metadata item exists
51
- */
52
- exists(type: string, name: string): Promise<boolean>;
53
- /**
54
- * List all items of a type
55
- */
56
- list(type: string): Promise<string[]>;
57
- /**
58
- * Watch for metadata changes
59
- */
60
- watch(type: string, callback: WatchCallback): void;
61
- /**
62
- * Unwatch metadata changes
63
- */
64
- unwatch(type: string, callback: WatchCallback): void;
65
- /**
66
- * Stop all watching
67
- */
68
- stopWatching(): Promise<void>;
69
- protected notifyWatchers(type: string, event: MetadataWatchEvent): void;
70
- }
71
- //# sourceMappingURL=metadata-manager.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"metadata-manager.d.ts","sourceRoot":"","sources":["../src/metadata-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,qBAAqB,EACrB,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,cAAc,EACf,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAgB,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAI9D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAChF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAEpE;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAEhF,MAAM,WAAW,sBAAuB,SAAQ,qBAAqB;IACnE,OAAO,CAAC,EAAE,cAAc,EAAE,CAAC;CAC5B;AAED;;GAEG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,OAAO,CAA0C;IAEzD,SAAS,CAAC,WAAW,EAAE,GAAG,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;IAC/D,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,cAAc,kCAAyC;IACjE,SAAS,CAAC,MAAM,EAAE,sBAAsB,CAAC;gBAE7B,MAAM,EAAE,sBAAsB;IA4B1C;;OAEG;IACH,cAAc,CAAC,MAAM,EAAE,cAAc;IAKrC;;;OAGG;IACG,IAAI,CAAC,CAAC,GAAG,GAAG,EAChB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAgBpB;;;OAGG;IACG,QAAQ,CAAC,CAAC,GAAG,GAAG,EACpB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,CAAC,EAAE,CAAC;IAiBf;;OAEG;IACH;;OAEG;IACG,IAAI,CAAC,CAAC,GAAG,GAAG,EAChB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,CAAC,EACP,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,kBAAkB,CAAC;IA0D9B;;OAEG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAS1D;;OAEG;IACG,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAS3C;;OAEG;IACH,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI;IAOlD;;OAEG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI;IAUpD;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAInC,SAAS,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB;CAejE"}
@@ -1,211 +0,0 @@
1
- /**
2
- * Metadata Manager
3
- *
4
- * Main orchestrator for metadata loading, saving, and persistence.
5
- * Browser-compatible (Pure).
6
- */
7
- import { createLogger } from '@objectstack/core';
8
- import { JSONSerializer } from './serializers/json-serializer.js';
9
- import { YAMLSerializer } from './serializers/yaml-serializer.js';
10
- import { TypeScriptSerializer } from './serializers/typescript-serializer.js';
11
- /**
12
- * Main metadata manager class
13
- */
14
- export class MetadataManager {
15
- constructor(config) {
16
- this.loaders = new Map();
17
- this.watchCallbacks = new Map();
18
- this.config = config;
19
- this.logger = createLogger({ level: 'info', format: 'pretty' });
20
- // Initialize serializers
21
- this.serializers = new Map();
22
- const formats = config.formats || ['typescript', 'json', 'yaml'];
23
- if (formats.includes('json')) {
24
- this.serializers.set('json', new JSONSerializer());
25
- }
26
- if (formats.includes('yaml')) {
27
- this.serializers.set('yaml', new YAMLSerializer());
28
- }
29
- if (formats.includes('typescript')) {
30
- this.serializers.set('typescript', new TypeScriptSerializer('typescript'));
31
- }
32
- if (formats.includes('javascript')) {
33
- this.serializers.set('javascript', new TypeScriptSerializer('javascript'));
34
- }
35
- // Initialize Loaders
36
- if (config.loaders && config.loaders.length > 0) {
37
- config.loaders.forEach(loader => this.registerLoader(loader));
38
- }
39
- // Note: No default loader in base class. Subclasses (NodeMetadataManager) or caller must provide one.
40
- }
41
- /**
42
- * Register a new metadata loader (data source)
43
- */
44
- registerLoader(loader) {
45
- this.loaders.set(loader.contract.name, loader);
46
- this.logger.info(`Registered metadata loader: ${loader.contract.name} (${loader.contract.protocol})`);
47
- }
48
- /**
49
- * Load a single metadata item
50
- * Iterates through registered loaders until found
51
- */
52
- async load(type, name, options) {
53
- // Priority: Database > Filesystem (Implementation-dependent)
54
- // For now, we just iterate.
55
- for (const loader of this.loaders.values()) {
56
- try {
57
- const result = await loader.load(type, name, options);
58
- if (result.data) {
59
- return result.data;
60
- }
61
- }
62
- catch (e) {
63
- this.logger.warn(`Loader ${loader.contract.name} failed to load ${type}:${name}`, { error: e });
64
- }
65
- }
66
- return null;
67
- }
68
- /**
69
- * Load multiple metadata items
70
- * Aggregates results from all loaders
71
- */
72
- async loadMany(type, options) {
73
- const results = [];
74
- for (const loader of this.loaders.values()) {
75
- try {
76
- const items = await loader.loadMany(type, options);
77
- for (const item of items) {
78
- // TODO: Deduplicate based on 'name' if property exists
79
- results.push(item);
80
- }
81
- }
82
- catch (e) {
83
- this.logger.warn(`Loader ${loader.contract.name} failed to loadMany ${type}`, { error: e });
84
- }
85
- }
86
- return results;
87
- }
88
- /**
89
- * Save metadata to disk
90
- */
91
- /**
92
- * Save metadata item
93
- */
94
- async save(type, name, data, options) {
95
- const targetLoader = options?.loader;
96
- // Find suitable loader
97
- let loader;
98
- if (targetLoader) {
99
- loader = this.loaders.get(targetLoader);
100
- if (!loader) {
101
- throw new Error(`Loader not found: ${targetLoader}`);
102
- }
103
- }
104
- else {
105
- // 1. Try to find existing writable loader containing this item (Update existing)
106
- for (const l of this.loaders.values()) {
107
- // Skip if loader is strictly read-only
108
- if (!l.save)
109
- continue;
110
- try {
111
- if (await l.exists(type, name)) {
112
- loader = l;
113
- this.logger.info(`Updating existing metadata in loader: ${l.contract.name}`);
114
- break;
115
- }
116
- }
117
- catch (e) {
118
- // Ignore existence check errors (e.g. network down)
119
- }
120
- }
121
- // 2. Default to 'filesystem' if available (Create new)
122
- if (!loader) {
123
- const fsLoader = this.loaders.get('filesystem');
124
- if (fsLoader && fsLoader.save) {
125
- loader = fsLoader;
126
- }
127
- }
128
- // 3. Fallback to any writable loader
129
- if (!loader) {
130
- for (const l of this.loaders.values()) {
131
- if (l.save) {
132
- loader = l;
133
- break;
134
- }
135
- }
136
- }
137
- }
138
- if (!loader) {
139
- throw new Error(`No loader available for saving type: ${type}`);
140
- }
141
- if (!loader.save) {
142
- throw new Error(`Loader '${loader.contract?.name}' does not support saving`);
143
- }
144
- return loader.save(type, name, data, options);
145
- }
146
- /**
147
- * Check if metadata item exists
148
- */
149
- async exists(type, name) {
150
- for (const loader of this.loaders.values()) {
151
- if (await loader.exists(type, name)) {
152
- return true;
153
- }
154
- }
155
- return false;
156
- }
157
- /**
158
- * List all items of a type
159
- */
160
- async list(type) {
161
- const items = new Set();
162
- for (const loader of this.loaders.values()) {
163
- const result = await loader.list(type);
164
- result.forEach(item => items.add(item));
165
- }
166
- return Array.from(items);
167
- }
168
- /**
169
- * Watch for metadata changes
170
- */
171
- watch(type, callback) {
172
- if (!this.watchCallbacks.has(type)) {
173
- this.watchCallbacks.set(type, new Set());
174
- }
175
- this.watchCallbacks.get(type).add(callback);
176
- }
177
- /**
178
- * Unwatch metadata changes
179
- */
180
- unwatch(type, callback) {
181
- const callbacks = this.watchCallbacks.get(type);
182
- if (callbacks) {
183
- callbacks.delete(callback);
184
- if (callbacks.size === 0) {
185
- this.watchCallbacks.delete(type);
186
- }
187
- }
188
- }
189
- /**
190
- * Stop all watching
191
- */
192
- async stopWatching() {
193
- // Override in subclass
194
- }
195
- notifyWatchers(type, event) {
196
- const callbacks = this.watchCallbacks.get(type);
197
- if (!callbacks)
198
- return;
199
- for (const callback of callbacks) {
200
- try {
201
- void callback(event);
202
- }
203
- catch (error) {
204
- this.logger.error('Watch callback error', undefined, {
205
- type,
206
- error: error instanceof Error ? error.message : String(error),
207
- });
208
- }
209
- }
210
- }
211
- }
@@ -1,9 +0,0 @@
1
- import { System } from '@objectstack/spec';
2
- import { ISchemaDriver } from '@objectstack/spec/contracts';
3
- export declare class MigrationExecutor {
4
- private driver;
5
- constructor(driver: ISchemaDriver);
6
- executeChangeSet(changeSet: System.ChangeSet): Promise<void>;
7
- private executeOperation;
8
- }
9
- //# sourceMappingURL=executor.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../src/migration/executor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAE5D,qBAAa,iBAAiB;IAChB,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,aAAa;IAEnC,gBAAgB,CAAC,SAAS,EAAE,MAAM,CAAC,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;YAapD,gBAAgB;CAgC/B"}
@@ -1,49 +0,0 @@
1
- export class MigrationExecutor {
2
- constructor(driver) {
3
- this.driver = driver;
4
- }
5
- async executeChangeSet(changeSet) {
6
- console.log(`Executing ChangeSet: ${changeSet.name} (${changeSet.id})`);
7
- for (const op of changeSet.operations) {
8
- try {
9
- await this.executeOperation(op);
10
- }
11
- catch (e) {
12
- console.error(`Failed to execute operation ${op.type}:`, e);
13
- throw e;
14
- }
15
- }
16
- }
17
- async executeOperation(op) {
18
- switch (op.type) {
19
- case 'create_object':
20
- console.log(` > Create Object: ${op.object.name}`);
21
- await this.driver.createCollection(op.object.name, op.object);
22
- break;
23
- case 'add_field':
24
- console.log(` > Add Field: ${op.objectName}.${op.fieldName}`);
25
- await this.driver.addColumn(op.objectName, op.fieldName, op.field);
26
- break;
27
- case 'remove_field':
28
- console.log(` > Remove Field: ${op.objectName}.${op.fieldName}`);
29
- await this.driver.dropColumn(op.objectName, op.fieldName);
30
- break;
31
- case 'delete_object':
32
- console.log(` > Delete Object: ${op.objectName}`);
33
- await this.driver.dropCollection(op.objectName);
34
- break;
35
- case 'execute_sql':
36
- console.log(` > Execute SQL`);
37
- await this.driver.executeRaw(op.sql);
38
- break;
39
- case 'modify_field':
40
- console.warn(` ! Modify Field: ${op.objectName}.${op.fieldName} (Not fully implemented)`);
41
- break;
42
- case 'rename_object':
43
- console.warn(` ! Rename Object: ${op.oldName} -> ${op.newName} (Not fully implemented)`);
44
- break;
45
- default:
46
- throw new Error(`Unknown operation type`);
47
- }
48
- }
49
- }
@@ -1,2 +0,0 @@
1
- export * from './executor.js';
2
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/migration/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC"}
@@ -1 +0,0 @@
1
- export * from './executor.js';
@@ -1,26 +0,0 @@
1
- /**
2
- * Node Metadata Manager
3
- *
4
- * Extends MetadataManager with Filesystem capabilities (Watching, default loader)
5
- */
6
- import { MetadataManager, type MetadataManagerOptions } from './metadata-manager.js';
7
- /**
8
- * Node metadata manager class
9
- */
10
- export declare class NodeMetadataManager extends MetadataManager {
11
- private watcher?;
12
- constructor(config: MetadataManagerOptions);
13
- /**
14
- * Stop all watching
15
- */
16
- stopWatching(): Promise<void>;
17
- /**
18
- * Start watching for file changes
19
- */
20
- private startWatching;
21
- /**
22
- * Handle file change events
23
- */
24
- private handleFileEvent;
25
- }
26
- //# sourceMappingURL=node-metadata-manager.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"node-metadata-manager.d.ts","sourceRoot":"","sources":["../src/node-metadata-manager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,OAAO,EAAE,eAAe,EAAE,KAAK,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAErF;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,eAAe;IACtD,OAAO,CAAC,OAAO,CAAC,CAAY;gBAEhB,MAAM,EAAE,sBAAsB;IAgB1C;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAQnC;;OAEG;IACH,OAAO,CAAC,aAAa;IA0BrB;;OAEG;YACW,eAAe;CA4C9B"}