@objectstack/metadata 1.0.2 → 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.
- package/.turbo/turbo-build.log +22 -0
- package/CHANGELOG.md +31 -0
- package/dist/index.d.mts +306 -0
- package/dist/index.d.ts +305 -16
- package/dist/index.js +1078 -15
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +1040 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +7 -7
- package/tsconfig.json +1 -3
- package/dist/index.d.ts.map +0 -1
- package/dist/loaders/filesystem-loader.d.ts +0 -42
- package/dist/loaders/filesystem-loader.d.ts.map +0 -1
- package/dist/loaders/filesystem-loader.js +0 -342
- package/dist/loaders/loader-interface.d.ts +0 -60
- package/dist/loaders/loader-interface.d.ts.map +0 -1
- package/dist/loaders/loader-interface.js +0 -6
- package/dist/loaders/memory-loader.d.ts +0 -19
- package/dist/loaders/memory-loader.d.ts.map +0 -1
- package/dist/loaders/memory-loader.js +0 -71
- package/dist/loaders/remote-loader.d.ts +0 -22
- package/dist/loaders/remote-loader.d.ts.map +0 -1
- package/dist/loaders/remote-loader.js +0 -103
- package/dist/metadata-manager.d.ts +0 -71
- package/dist/metadata-manager.d.ts.map +0 -1
- package/dist/metadata-manager.js +0 -211
- package/dist/migration/executor.d.ts +0 -9
- package/dist/migration/executor.d.ts.map +0 -1
- package/dist/migration/executor.js +0 -49
- package/dist/migration/index.d.ts +0 -2
- package/dist/migration/index.d.ts.map +0 -1
- package/dist/migration/index.js +0 -1
- package/dist/node-metadata-manager.d.ts +0 -26
- package/dist/node-metadata-manager.d.ts.map +0 -1
- package/dist/node-metadata-manager.js +0 -98
- package/dist/node.d.ts +0 -8
- package/dist/node.d.ts.map +0 -1
- package/dist/node.js +0 -7
- package/dist/plugin.d.ts +0 -15
- package/dist/plugin.d.ts.map +0 -1
- package/dist/plugin.js +0 -71
- package/dist/serializers/json-serializer.d.ts +0 -20
- package/dist/serializers/json-serializer.d.ts.map +0 -1
- package/dist/serializers/json-serializer.js +0 -53
- package/dist/serializers/serializer-interface.d.ts +0 -57
- package/dist/serializers/serializer-interface.d.ts.map +0 -1
- package/dist/serializers/serializer-interface.js +0 -6
- package/dist/serializers/serializers.test.d.ts +0 -2
- package/dist/serializers/serializers.test.d.ts.map +0 -1
- package/dist/serializers/serializers.test.js +0 -62
- package/dist/serializers/typescript-serializer.d.ts +0 -18
- package/dist/serializers/typescript-serializer.d.ts.map +0 -1
- package/dist/serializers/typescript-serializer.js +0 -103
- package/dist/serializers/yaml-serializer.d.ts +0 -16
- package/dist/serializers/yaml-serializer.d.ts.map +0 -1
- package/dist/serializers/yaml-serializer.js +0 -35
|
@@ -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"}
|
package/dist/metadata-manager.js
DELETED
|
@@ -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 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/migration/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC"}
|
package/dist/migration/index.js
DELETED
|
@@ -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"}
|