@objectstack/metadata 2.0.6 → 3.0.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.
@@ -1,5 +1,5 @@
1
1
 
2
- > @objectstack/metadata@2.0.6 build /home/runner/work/spec/spec/packages/metadata
2
+ > @objectstack/metadata@3.0.0 build /home/runner/work/spec/spec/packages/metadata
3
3
  > tsup --config ../../tsup.config.ts
4
4
 
5
5
  CLI Building entry: src/index.ts
@@ -10,13 +10,13 @@
10
10
  CLI Cleaning output folder
11
11
  ESM Build start
12
12
  CJS Build start
13
- CJS dist/index.js 30.61 KB
14
- CJS dist/index.js.map 62.34 KB
15
- CJS ⚡️ Build success in 115ms
16
- ESM dist/index.mjs 28.81 KB
17
- ESM dist/index.mjs.map 60.95 KB
18
- ESM ⚡️ Build success in 115ms
13
+ ESM dist/index.mjs 43.87 KB
14
+ ESM dist/index.mjs.map 88.95 KB
15
+ ESM ⚡️ Build success in 135ms
16
+ CJS dist/index.js 45.68 KB
17
+ CJS dist/index.js.map 90.92 KB
18
+ CJS ⚡️ Build success in 133ms
19
19
  DTS Build start
20
- DTS ⚡️ Build success in 10940ms
21
- DTS dist/index.d.mts 9.83 KB
22
- DTS dist/index.d.ts 9.83 KB
20
+ DTS ⚡️ Build success in 12517ms
21
+ DTS dist/index.d.mts 14.80 KB
22
+ DTS dist/index.d.ts 14.80 KB
package/CHANGELOG.md CHANGED
@@ -1,5 +1,27 @@
1
1
  # @objectstack/metadata
2
2
 
3
+ ## 3.0.0
4
+
5
+ ### Major Changes
6
+
7
+ - Release v3.0.0 — unified version bump for all ObjectStack packages.
8
+
9
+ ### Patch Changes
10
+
11
+ - Updated dependencies
12
+ - @objectstack/spec@3.0.0
13
+ - @objectstack/core@3.0.0
14
+ - @objectstack/types@3.0.0
15
+
16
+ ## 2.0.7
17
+
18
+ ### Patch Changes
19
+
20
+ - Updated dependencies
21
+ - @objectstack/spec@2.0.7
22
+ - @objectstack/core@2.0.7
23
+ - @objectstack/types@2.0.7
24
+
3
25
  ## 2.0.6
4
26
 
5
27
  ### Patch Changes
package/dist/index.d.mts CHANGED
@@ -1,9 +1,12 @@
1
1
  import { MetadataFormat, MetadataLoaderContract, MetadataLoadOptions, MetadataLoadResult, MetadataStats, MetadataSaveOptions, MetadataSaveResult, MetadataWatchEvent, MetadataManagerConfig } from '@objectstack/spec/system';
2
2
  export { MetadataCollectionInfo, MetadataExportOptions, MetadataFormat, MetadataImportOptions, MetadataLoadOptions, MetadataLoadResult, MetadataLoaderContract, MetadataManagerConfig, MetadataSaveOptions, MetadataSaveResult, MetadataStats, MetadataWatchEvent } from '@objectstack/spec/system';
3
+ import { IMetadataService, MetadataWatchCallback, MetadataWatchHandle, MetadataExportOptions, MetadataImportOptions, MetadataImportResult, MetadataTypeInfo, ISchemaDriver } from '@objectstack/spec/contracts';
4
+ export { IMetadataService, MetadataImportResult, MetadataTypeInfo, MetadataWatchCallback, MetadataWatchHandle } from '@objectstack/spec/contracts';
5
+ import { MetadataTypeRegistryEntry, MetadataQuery, MetadataQueryResult, MetadataBulkResult, MetadataOverlay, MetadataValidationResult, MetadataDependency, MetadataPluginConfig } from '@objectstack/spec/kernel';
6
+ export { MetadataBulkResult, MetadataDependency, MetadataPluginConfig, MetadataPluginManifest, MetadataQuery, MetadataQueryResult, MetadataType, MetadataTypeRegistryEntry, MetadataValidationResult } from '@objectstack/spec/kernel';
3
7
  import { Logger, Plugin, PluginContext } from '@objectstack/core';
4
8
  import { z } from 'zod';
5
9
  import { System } from '@objectstack/spec';
6
- import { ISchemaDriver } from '@objectstack/spec/contracts';
7
10
 
8
11
  /**
9
12
  * Metadata Serializer Interface
@@ -125,63 +128,179 @@ interface MetadataLoader {
125
128
  * Metadata Manager
126
129
  *
127
130
  * Main orchestrator for metadata loading, saving, and persistence.
131
+ * Implements the IMetadataService contract from @objectstack/spec.
128
132
  * Browser-compatible (Pure).
129
133
  */
130
134
 
131
135
  /**
132
- * Watch callback function
136
+ * Watch callback function (legacy)
133
137
  */
134
138
  type WatchCallback = (event: MetadataWatchEvent) => void | Promise<void>;
135
139
  interface MetadataManagerOptions extends MetadataManagerConfig {
136
140
  loaders?: MetadataLoader[];
137
141
  }
138
142
  /**
139
- * Main metadata manager class
143
+ * Main metadata manager class.
144
+ * Implements IMetadataService contract for unified metadata management.
140
145
  */
141
- declare class MetadataManager {
146
+ declare class MetadataManager implements IMetadataService {
142
147
  private loaders;
143
148
  protected serializers: Map<MetadataFormat, MetadataSerializer>;
144
149
  protected logger: Logger;
145
150
  protected watchCallbacks: Map<string, Set<WatchCallback>>;
146
151
  protected config: MetadataManagerOptions;
152
+ private registry;
153
+ private overlays;
154
+ private typeRegistry;
155
+ private dependencies;
147
156
  constructor(config: MetadataManagerOptions);
157
+ /**
158
+ * Set the type registry for metadata type discovery.
159
+ */
160
+ setTypeRegistry(entries: MetadataTypeRegistryEntry[]): void;
148
161
  /**
149
162
  * Register a new metadata loader (data source)
150
163
  */
151
164
  registerLoader(loader: MetadataLoader): void;
152
165
  /**
153
- * Load a single metadata item
154
- * Iterates through registered loaders until found
166
+ * Register/save a metadata item by type
155
167
  */
156
- load<T = any>(type: string, name: string, options?: MetadataLoadOptions): Promise<T | null>;
168
+ register(type: string, name: string, data: unknown): Promise<void>;
157
169
  /**
158
- * Load multiple metadata items
159
- * Aggregates results from all loaders
170
+ * Get a metadata item by type and name.
171
+ * Checks in-memory registry first, then falls back to loaders.
160
172
  */
161
- loadMany<T = any>(type: string, options?: MetadataLoadOptions): Promise<T[]>;
173
+ get(type: string, name: string): Promise<unknown | undefined>;
162
174
  /**
163
- * Save metadata to disk
175
+ * List all metadata items of a given type
164
176
  */
177
+ list(type: string): Promise<unknown[]>;
165
178
  /**
166
- * Save metadata item
179
+ * Unregister/remove a metadata item by type and name
167
180
  */
168
- save<T = any>(type: string, name: string, data: T, options?: MetadataSaveOptions): Promise<MetadataSaveResult>;
181
+ unregister(type: string, name: string): Promise<void>;
169
182
  /**
170
- * Check if metadata item exists
183
+ * Check if a metadata item exists
171
184
  */
172
185
  exists(type: string, name: string): Promise<boolean>;
173
186
  /**
174
- * List all items of a type
187
+ * List all names of metadata items of a given type
175
188
  */
176
- list(type: string): Promise<string[]>;
189
+ listNames(type: string): Promise<string[]>;
190
+ /**
191
+ * Convenience: get an object definition by name
192
+ */
193
+ getObject(name: string): Promise<unknown | undefined>;
194
+ /**
195
+ * Convenience: list all object definitions
196
+ */
197
+ listObjects(): Promise<unknown[]>;
198
+ /**
199
+ * Unregister all metadata items from a specific package
200
+ */
201
+ unregisterPackage(packageName: string): Promise<void>;
202
+ /**
203
+ * Query metadata items with filtering, sorting, and pagination
204
+ */
205
+ query(query: MetadataQuery): Promise<MetadataQueryResult>;
206
+ /**
207
+ * Register multiple metadata items in a single batch
208
+ */
209
+ bulkRegister(items: Array<{
210
+ type: string;
211
+ name: string;
212
+ data: unknown;
213
+ }>, options?: {
214
+ continueOnError?: boolean;
215
+ validate?: boolean;
216
+ }): Promise<MetadataBulkResult>;
217
+ /**
218
+ * Unregister multiple metadata items in a single batch
219
+ */
220
+ bulkUnregister(items: Array<{
221
+ type: string;
222
+ name: string;
223
+ }>): Promise<MetadataBulkResult>;
224
+ private overlayKey;
225
+ /**
226
+ * Get the active overlay for a metadata item
227
+ */
228
+ getOverlay(type: string, name: string, scope?: 'platform' | 'user'): Promise<MetadataOverlay | undefined>;
229
+ /**
230
+ * Save/update an overlay for a metadata item
231
+ */
232
+ saveOverlay(overlay: MetadataOverlay): Promise<void>;
233
+ /**
234
+ * Remove an overlay, reverting to the base definition
235
+ */
236
+ removeOverlay(type: string, name: string, scope?: 'platform' | 'user'): Promise<void>;
237
+ /**
238
+ * Get the effective (merged) metadata after applying all overlays.
239
+ * Resolution order: system ← merge(platform) ← merge(user)
240
+ */
241
+ getEffective(type: string, name: string): Promise<unknown | undefined>;
242
+ /**
243
+ * Watch for metadata changes (IMetadataService contract).
244
+ * Returns a handle for unsubscribing.
245
+ */
246
+ watchService(type: string, callback: MetadataWatchCallback): MetadataWatchHandle;
247
+ /**
248
+ * Export metadata as a portable bundle
249
+ */
250
+ exportMetadata(options?: MetadataExportOptions): Promise<unknown>;
251
+ /**
252
+ * Import metadata from a portable bundle
253
+ */
254
+ importMetadata(data: unknown, options?: MetadataImportOptions): Promise<MetadataImportResult>;
255
+ /**
256
+ * Validate a metadata item against its type schema.
257
+ * Returns validation result with errors and warnings.
258
+ */
259
+ validate(_type: string, data: unknown): Promise<MetadataValidationResult>;
260
+ /**
261
+ * Get all registered metadata types
262
+ */
263
+ getRegisteredTypes(): Promise<string[]>;
264
+ /**
265
+ * Get detailed information about a metadata type
266
+ */
267
+ getTypeInfo(type: string): Promise<MetadataTypeInfo | undefined>;
268
+ /**
269
+ * Get metadata items that this item depends on
270
+ */
271
+ getDependencies(type: string, name: string): Promise<MetadataDependency[]>;
272
+ /**
273
+ * Get metadata items that depend on this item
274
+ */
275
+ getDependents(type: string, name: string): Promise<MetadataDependency[]>;
276
+ /**
277
+ * Register a dependency between two metadata items.
278
+ * Used internally to track cross-references.
279
+ * Duplicate dependencies (same source, target, and kind) are ignored.
280
+ */
281
+ addDependency(dep: MetadataDependency): void;
282
+ /**
283
+ * Load a single metadata item from loaders.
284
+ * Iterates through registered loaders until found.
285
+ */
286
+ load<T = any>(type: string, name: string, options?: MetadataLoadOptions): Promise<T | null>;
287
+ /**
288
+ * Load multiple metadata items from loaders.
289
+ * Aggregates results from all loaders.
290
+ */
291
+ loadMany<T = any>(type: string, options?: MetadataLoadOptions): Promise<T[]>;
292
+ /**
293
+ * Save metadata item to a loader
294
+ */
295
+ save<T = any>(type: string, name: string, data: T, options?: MetadataSaveOptions): Promise<MetadataSaveResult>;
177
296
  /**
178
- * Watch for metadata changes
297
+ * Register a watch callback for metadata changes
179
298
  */
180
- watch(type: string, callback: WatchCallback): void;
299
+ protected addWatchCallback(type: string, callback: WatchCallback): void;
181
300
  /**
182
- * Unwatch metadata changes
301
+ * Remove a watch callback for metadata changes
183
302
  */
184
- unwatch(type: string, callback: WatchCallback): void;
303
+ protected removeWatchCallback(type: string, callback: WatchCallback): void;
185
304
  /**
186
305
  * Stop all watching
187
306
  */
@@ -192,6 +311,7 @@ declare class MetadataManager {
192
311
  interface MetadataPluginOptions {
193
312
  rootDir?: string;
194
313
  watch?: boolean;
314
+ config?: Partial<MetadataPluginConfig>;
195
315
  }
196
316
  declare class MetadataPlugin implements Plugin {
197
317
  name: string;
package/dist/index.d.ts CHANGED
@@ -1,9 +1,12 @@
1
1
  import { MetadataFormat, MetadataLoaderContract, MetadataLoadOptions, MetadataLoadResult, MetadataStats, MetadataSaveOptions, MetadataSaveResult, MetadataWatchEvent, MetadataManagerConfig } from '@objectstack/spec/system';
2
2
  export { MetadataCollectionInfo, MetadataExportOptions, MetadataFormat, MetadataImportOptions, MetadataLoadOptions, MetadataLoadResult, MetadataLoaderContract, MetadataManagerConfig, MetadataSaveOptions, MetadataSaveResult, MetadataStats, MetadataWatchEvent } from '@objectstack/spec/system';
3
+ import { IMetadataService, MetadataWatchCallback, MetadataWatchHandle, MetadataExportOptions, MetadataImportOptions, MetadataImportResult, MetadataTypeInfo, ISchemaDriver } from '@objectstack/spec/contracts';
4
+ export { IMetadataService, MetadataImportResult, MetadataTypeInfo, MetadataWatchCallback, MetadataWatchHandle } from '@objectstack/spec/contracts';
5
+ import { MetadataTypeRegistryEntry, MetadataQuery, MetadataQueryResult, MetadataBulkResult, MetadataOverlay, MetadataValidationResult, MetadataDependency, MetadataPluginConfig } from '@objectstack/spec/kernel';
6
+ export { MetadataBulkResult, MetadataDependency, MetadataPluginConfig, MetadataPluginManifest, MetadataQuery, MetadataQueryResult, MetadataType, MetadataTypeRegistryEntry, MetadataValidationResult } from '@objectstack/spec/kernel';
3
7
  import { Logger, Plugin, PluginContext } from '@objectstack/core';
4
8
  import { z } from 'zod';
5
9
  import { System } from '@objectstack/spec';
6
- import { ISchemaDriver } from '@objectstack/spec/contracts';
7
10
 
8
11
  /**
9
12
  * Metadata Serializer Interface
@@ -125,63 +128,179 @@ interface MetadataLoader {
125
128
  * Metadata Manager
126
129
  *
127
130
  * Main orchestrator for metadata loading, saving, and persistence.
131
+ * Implements the IMetadataService contract from @objectstack/spec.
128
132
  * Browser-compatible (Pure).
129
133
  */
130
134
 
131
135
  /**
132
- * Watch callback function
136
+ * Watch callback function (legacy)
133
137
  */
134
138
  type WatchCallback = (event: MetadataWatchEvent) => void | Promise<void>;
135
139
  interface MetadataManagerOptions extends MetadataManagerConfig {
136
140
  loaders?: MetadataLoader[];
137
141
  }
138
142
  /**
139
- * Main metadata manager class
143
+ * Main metadata manager class.
144
+ * Implements IMetadataService contract for unified metadata management.
140
145
  */
141
- declare class MetadataManager {
146
+ declare class MetadataManager implements IMetadataService {
142
147
  private loaders;
143
148
  protected serializers: Map<MetadataFormat, MetadataSerializer>;
144
149
  protected logger: Logger;
145
150
  protected watchCallbacks: Map<string, Set<WatchCallback>>;
146
151
  protected config: MetadataManagerOptions;
152
+ private registry;
153
+ private overlays;
154
+ private typeRegistry;
155
+ private dependencies;
147
156
  constructor(config: MetadataManagerOptions);
157
+ /**
158
+ * Set the type registry for metadata type discovery.
159
+ */
160
+ setTypeRegistry(entries: MetadataTypeRegistryEntry[]): void;
148
161
  /**
149
162
  * Register a new metadata loader (data source)
150
163
  */
151
164
  registerLoader(loader: MetadataLoader): void;
152
165
  /**
153
- * Load a single metadata item
154
- * Iterates through registered loaders until found
166
+ * Register/save a metadata item by type
155
167
  */
156
- load<T = any>(type: string, name: string, options?: MetadataLoadOptions): Promise<T | null>;
168
+ register(type: string, name: string, data: unknown): Promise<void>;
157
169
  /**
158
- * Load multiple metadata items
159
- * Aggregates results from all loaders
170
+ * Get a metadata item by type and name.
171
+ * Checks in-memory registry first, then falls back to loaders.
160
172
  */
161
- loadMany<T = any>(type: string, options?: MetadataLoadOptions): Promise<T[]>;
173
+ get(type: string, name: string): Promise<unknown | undefined>;
162
174
  /**
163
- * Save metadata to disk
175
+ * List all metadata items of a given type
164
176
  */
177
+ list(type: string): Promise<unknown[]>;
165
178
  /**
166
- * Save metadata item
179
+ * Unregister/remove a metadata item by type and name
167
180
  */
168
- save<T = any>(type: string, name: string, data: T, options?: MetadataSaveOptions): Promise<MetadataSaveResult>;
181
+ unregister(type: string, name: string): Promise<void>;
169
182
  /**
170
- * Check if metadata item exists
183
+ * Check if a metadata item exists
171
184
  */
172
185
  exists(type: string, name: string): Promise<boolean>;
173
186
  /**
174
- * List all items of a type
187
+ * List all names of metadata items of a given type
175
188
  */
176
- list(type: string): Promise<string[]>;
189
+ listNames(type: string): Promise<string[]>;
190
+ /**
191
+ * Convenience: get an object definition by name
192
+ */
193
+ getObject(name: string): Promise<unknown | undefined>;
194
+ /**
195
+ * Convenience: list all object definitions
196
+ */
197
+ listObjects(): Promise<unknown[]>;
198
+ /**
199
+ * Unregister all metadata items from a specific package
200
+ */
201
+ unregisterPackage(packageName: string): Promise<void>;
202
+ /**
203
+ * Query metadata items with filtering, sorting, and pagination
204
+ */
205
+ query(query: MetadataQuery): Promise<MetadataQueryResult>;
206
+ /**
207
+ * Register multiple metadata items in a single batch
208
+ */
209
+ bulkRegister(items: Array<{
210
+ type: string;
211
+ name: string;
212
+ data: unknown;
213
+ }>, options?: {
214
+ continueOnError?: boolean;
215
+ validate?: boolean;
216
+ }): Promise<MetadataBulkResult>;
217
+ /**
218
+ * Unregister multiple metadata items in a single batch
219
+ */
220
+ bulkUnregister(items: Array<{
221
+ type: string;
222
+ name: string;
223
+ }>): Promise<MetadataBulkResult>;
224
+ private overlayKey;
225
+ /**
226
+ * Get the active overlay for a metadata item
227
+ */
228
+ getOverlay(type: string, name: string, scope?: 'platform' | 'user'): Promise<MetadataOverlay | undefined>;
229
+ /**
230
+ * Save/update an overlay for a metadata item
231
+ */
232
+ saveOverlay(overlay: MetadataOverlay): Promise<void>;
233
+ /**
234
+ * Remove an overlay, reverting to the base definition
235
+ */
236
+ removeOverlay(type: string, name: string, scope?: 'platform' | 'user'): Promise<void>;
237
+ /**
238
+ * Get the effective (merged) metadata after applying all overlays.
239
+ * Resolution order: system ← merge(platform) ← merge(user)
240
+ */
241
+ getEffective(type: string, name: string): Promise<unknown | undefined>;
242
+ /**
243
+ * Watch for metadata changes (IMetadataService contract).
244
+ * Returns a handle for unsubscribing.
245
+ */
246
+ watchService(type: string, callback: MetadataWatchCallback): MetadataWatchHandle;
247
+ /**
248
+ * Export metadata as a portable bundle
249
+ */
250
+ exportMetadata(options?: MetadataExportOptions): Promise<unknown>;
251
+ /**
252
+ * Import metadata from a portable bundle
253
+ */
254
+ importMetadata(data: unknown, options?: MetadataImportOptions): Promise<MetadataImportResult>;
255
+ /**
256
+ * Validate a metadata item against its type schema.
257
+ * Returns validation result with errors and warnings.
258
+ */
259
+ validate(_type: string, data: unknown): Promise<MetadataValidationResult>;
260
+ /**
261
+ * Get all registered metadata types
262
+ */
263
+ getRegisteredTypes(): Promise<string[]>;
264
+ /**
265
+ * Get detailed information about a metadata type
266
+ */
267
+ getTypeInfo(type: string): Promise<MetadataTypeInfo | undefined>;
268
+ /**
269
+ * Get metadata items that this item depends on
270
+ */
271
+ getDependencies(type: string, name: string): Promise<MetadataDependency[]>;
272
+ /**
273
+ * Get metadata items that depend on this item
274
+ */
275
+ getDependents(type: string, name: string): Promise<MetadataDependency[]>;
276
+ /**
277
+ * Register a dependency between two metadata items.
278
+ * Used internally to track cross-references.
279
+ * Duplicate dependencies (same source, target, and kind) are ignored.
280
+ */
281
+ addDependency(dep: MetadataDependency): void;
282
+ /**
283
+ * Load a single metadata item from loaders.
284
+ * Iterates through registered loaders until found.
285
+ */
286
+ load<T = any>(type: string, name: string, options?: MetadataLoadOptions): Promise<T | null>;
287
+ /**
288
+ * Load multiple metadata items from loaders.
289
+ * Aggregates results from all loaders.
290
+ */
291
+ loadMany<T = any>(type: string, options?: MetadataLoadOptions): Promise<T[]>;
292
+ /**
293
+ * Save metadata item to a loader
294
+ */
295
+ save<T = any>(type: string, name: string, data: T, options?: MetadataSaveOptions): Promise<MetadataSaveResult>;
177
296
  /**
178
- * Watch for metadata changes
297
+ * Register a watch callback for metadata changes
179
298
  */
180
- watch(type: string, callback: WatchCallback): void;
299
+ protected addWatchCallback(type: string, callback: WatchCallback): void;
181
300
  /**
182
- * Unwatch metadata changes
301
+ * Remove a watch callback for metadata changes
183
302
  */
184
- unwatch(type: string, callback: WatchCallback): void;
303
+ protected removeWatchCallback(type: string, callback: WatchCallback): void;
185
304
  /**
186
305
  * Stop all watching
187
306
  */
@@ -192,6 +311,7 @@ declare class MetadataManager {
192
311
  interface MetadataPluginOptions {
193
312
  rootDir?: string;
194
313
  watch?: boolean;
314
+ config?: Partial<MetadataPluginConfig>;
195
315
  }
196
316
  declare class MetadataPlugin implements Plugin {
197
317
  name: string;