@objectstack/metadata 1.0.4 → 1.0.6

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 +23 -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,98 +0,0 @@
1
- /**
2
- * Node Metadata Manager
3
- *
4
- * Extends MetadataManager with Filesystem capabilities (Watching, default loader)
5
- */
6
- import * as path from 'node:path';
7
- import { watch as chokidarWatch } from 'chokidar';
8
- import { FilesystemLoader } from './loaders/filesystem-loader.js';
9
- import { MetadataManager } from './metadata-manager.js';
10
- /**
11
- * Node metadata manager class
12
- */
13
- export class NodeMetadataManager extends MetadataManager {
14
- constructor(config) {
15
- super(config);
16
- // Initialize Default Filesystem Loader if no loaders provided
17
- // This logic replaces the removed logic from base class
18
- if (!config.loaders || config.loaders.length === 0) {
19
- const rootDir = config.rootDir || process.cwd();
20
- this.registerLoader(new FilesystemLoader(rootDir, this.serializers, this.logger));
21
- }
22
- // Start watching if enabled
23
- if (config.watch) {
24
- this.startWatching();
25
- }
26
- }
27
- /**
28
- * Stop all watching
29
- */
30
- async stopWatching() {
31
- if (this.watcher) {
32
- await this.watcher.close();
33
- this.watcher = undefined;
34
- }
35
- // Call base cleanup if any
36
- }
37
- /**
38
- * Start watching for file changes
39
- */
40
- startWatching() {
41
- const rootDir = this.config.rootDir || process.cwd();
42
- const { ignored = ['**/node_modules/**', '**/*.test.*'], persistent = true } = this.config.watchOptions || {};
43
- this.watcher = chokidarWatch(rootDir, {
44
- ignored,
45
- persistent,
46
- ignoreInitial: true,
47
- });
48
- this.watcher.on('add', async (filePath) => {
49
- await this.handleFileEvent('added', filePath);
50
- });
51
- this.watcher.on('change', async (filePath) => {
52
- await this.handleFileEvent('changed', filePath);
53
- });
54
- this.watcher.on('unlink', async (filePath) => {
55
- await this.handleFileEvent('deleted', filePath);
56
- });
57
- this.logger.info('File watcher started', { rootDir });
58
- }
59
- /**
60
- * Handle file change events
61
- */
62
- async handleFileEvent(eventType, filePath) {
63
- const rootDir = this.config.rootDir || process.cwd();
64
- const relativePath = path.relative(rootDir, filePath);
65
- const parts = relativePath.split(path.sep);
66
- if (parts.length < 2) {
67
- return; // Not a metadata file
68
- }
69
- const type = parts[0];
70
- const fileName = parts[parts.length - 1];
71
- const name = path.basename(fileName, path.extname(fileName));
72
- // We can't access private watchCallbacks from parent.
73
- // We need a protected method to trigger watch event or access it.
74
- // OPTION: Add a method `triggerWatchEvent` to MetadataManager
75
- let data = undefined;
76
- if (eventType !== 'deleted') {
77
- try {
78
- data = await this.load(type, name, { useCache: false });
79
- }
80
- catch (error) {
81
- this.logger.error('Failed to load changed file', undefined, {
82
- filePath,
83
- error: error instanceof Error ? error.message : String(error),
84
- });
85
- return;
86
- }
87
- }
88
- const event = {
89
- type: eventType,
90
- metadataType: type,
91
- name,
92
- path: filePath,
93
- data,
94
- timestamp: new Date(),
95
- };
96
- this.notifyWatchers(type, event);
97
- }
98
- }
package/dist/node.d.ts DELETED
@@ -1,8 +0,0 @@
1
- /**
2
- * Node.js specific exports for @objectstack/metadata
3
- */
4
- export * from './index.js';
5
- export { NodeMetadataManager } from './node-metadata-manager.js';
6
- export { FilesystemLoader } from './loaders/filesystem-loader.js';
7
- export { MetadataPlugin } from './plugin.js';
8
- //# sourceMappingURL=node.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC"}
package/dist/node.js DELETED
@@ -1,7 +0,0 @@
1
- /**
2
- * Node.js specific exports for @objectstack/metadata
3
- */
4
- export * from './index.js';
5
- export { NodeMetadataManager } from './node-metadata-manager.js';
6
- export { FilesystemLoader } from './loaders/filesystem-loader.js';
7
- export { MetadataPlugin } from './plugin.js';
package/dist/plugin.d.ts DELETED
@@ -1,15 +0,0 @@
1
- import { Plugin, PluginContext } from '@objectstack/core';
2
- export interface MetadataPluginOptions {
3
- rootDir?: string;
4
- watch?: boolean;
5
- }
6
- export declare class MetadataPlugin implements Plugin {
7
- name: string;
8
- version: string;
9
- private manager;
10
- private options;
11
- constructor(options?: MetadataPluginOptions);
12
- init: (ctx: PluginContext) => Promise<void>;
13
- start: (ctx: PluginContext) => Promise<void>;
14
- }
15
- //# sourceMappingURL=plugin.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAI1D,MAAM,WAAW,qBAAqB;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,qBAAa,cAAe,YAAW,MAAM;IACzC,IAAI,SAA8B;IAClC,OAAO,SAAW;IAElB,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,OAAO,CAAwB;gBAE3B,OAAO,GAAE,qBAA0B;IAe/C,IAAI,GAAU,KAAK,aAAa,mBAM/B;IAED,KAAK,GAAU,KAAK,aAAa,mBAgDhC;CACJ"}
package/dist/plugin.js DELETED
@@ -1,71 +0,0 @@
1
- import { NodeMetadataManager } from './node-metadata-manager.js';
2
- import { ObjectStackDefinitionSchema } from '@objectstack/spec';
3
- export class MetadataPlugin {
4
- constructor(options = {}) {
5
- this.name = 'com.objectstack.metadata';
6
- this.version = '1.0.0';
7
- this.init = async (ctx) => {
8
- ctx.logger.info('Initializing Metadata Manager', { root: this.options.rootDir || process.cwd() });
9
- // Register Metadata Manager as a service
10
- // This allows other plugins to query raw metadata or listen to changes
11
- ctx.registerService('metadata', this.manager);
12
- };
13
- this.start = async (ctx) => {
14
- ctx.logger.info('Loading metadata...');
15
- // Define metadata types directly from the Protocol Definition
16
- // This ensures the loader is always in sync with the Spec
17
- const metadataTypes = Object.keys(ObjectStackDefinitionSchema.shape)
18
- .filter(key => key !== 'manifest'); // Manifest is handled separately
19
- for (const type of metadataTypes) {
20
- try {
21
- // Try to load metadata of this type
22
- const items = await this.manager.loadMany(type, {
23
- recursive: true
24
- });
25
- if (items.length > 0) {
26
- ctx.logger.info(`Loaded ${items.length} ${type}`);
27
- // Helper: Register with ObjectQL Registry
28
- const ql = ctx.getService('objectql');
29
- if (ql && ql.registry) {
30
- items.forEach((item) => {
31
- // Determine key field (id or name)
32
- const keyField = item.id ? 'id' : 'name';
33
- // Map plural type to singular/registry type if needed
34
- // For now, we use the singular form for standard types:
35
- // objects -> object, apps -> app, etc.
36
- // But Registry seems to accept arbitrary strings.
37
- // To match Protocol standard, we might want to normalize.
38
- // Let's use the directory name (plural) as the type for now,
39
- // OR map 'objects' -> 'object' specifically.
40
- let registryType = type;
41
- if (type === 'objects')
42
- registryType = 'object';
43
- if (type === 'apps')
44
- registryType = 'app';
45
- if (type === 'plugins')
46
- registryType = 'plugin';
47
- if (type === 'functions')
48
- registryType = 'function';
49
- ql.registry.registerItem(registryType, item, keyField);
50
- });
51
- }
52
- }
53
- }
54
- catch (e) {
55
- // Ignore missing directories or errors
56
- // ctx.logger.debug(`No metadata found for type: ${type}`);
57
- }
58
- }
59
- };
60
- this.options = {
61
- watch: true,
62
- ...options
63
- };
64
- const rootDir = this.options.rootDir || process.cwd();
65
- this.manager = new NodeMetadataManager({
66
- rootDir,
67
- watch: this.options.watch ?? true,
68
- formats: ['yaml', 'json', 'typescript', 'javascript']
69
- });
70
- }
71
- }
@@ -1,20 +0,0 @@
1
- /**
2
- * JSON Metadata Serializer
3
- *
4
- * Handles JSON format serialization and deserialization
5
- */
6
- import type { z } from 'zod';
7
- import type { MetadataFormat } from '@objectstack/spec/system';
8
- import type { MetadataSerializer, SerializeOptions } from './serializer-interface.js';
9
- export declare class JSONSerializer implements MetadataSerializer {
10
- serialize<T>(item: T, options?: SerializeOptions): string;
11
- deserialize<T>(content: string, schema?: z.ZodSchema): T;
12
- getExtension(): string;
13
- canHandle(format: MetadataFormat): boolean;
14
- getFormat(): MetadataFormat;
15
- /**
16
- * Recursively sort object keys
17
- */
18
- private sortObjectKeys;
19
- }
20
- //# sourceMappingURL=json-serializer.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"json-serializer.d.ts","sourceRoot":"","sources":["../../src/serializers/json-serializer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAEtF,qBAAa,cAAe,YAAW,kBAAkB;IACvD,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,MAAM;IAgBzD,WAAW,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,SAAS,GAAG,CAAC;IAUxD,YAAY,IAAI,MAAM;IAItB,SAAS,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO;IAI1C,SAAS,IAAI,cAAc;IAI3B;;OAEG;IACH,OAAO,CAAC,cAAc;CAkBvB"}
@@ -1,53 +0,0 @@
1
- /**
2
- * JSON Metadata Serializer
3
- *
4
- * Handles JSON format serialization and deserialization
5
- */
6
- export class JSONSerializer {
7
- serialize(item, options) {
8
- const { prettify = true, indent = 2, sortKeys = false } = options || {};
9
- if (sortKeys) {
10
- // Sort keys recursively
11
- const sorted = this.sortObjectKeys(item);
12
- return prettify
13
- ? JSON.stringify(sorted, null, indent)
14
- : JSON.stringify(sorted);
15
- }
16
- return prettify
17
- ? JSON.stringify(item, null, indent)
18
- : JSON.stringify(item);
19
- }
20
- deserialize(content, schema) {
21
- const parsed = JSON.parse(content);
22
- if (schema) {
23
- return schema.parse(parsed);
24
- }
25
- return parsed;
26
- }
27
- getExtension() {
28
- return '.json';
29
- }
30
- canHandle(format) {
31
- return format === 'json';
32
- }
33
- getFormat() {
34
- return 'json';
35
- }
36
- /**
37
- * Recursively sort object keys
38
- */
39
- sortObjectKeys(obj) {
40
- if (obj === null || typeof obj !== 'object') {
41
- return obj;
42
- }
43
- if (Array.isArray(obj)) {
44
- return obj.map(item => this.sortObjectKeys(item));
45
- }
46
- const sorted = {};
47
- const keys = Object.keys(obj).sort();
48
- for (const key of keys) {
49
- sorted[key] = this.sortObjectKeys(obj[key]);
50
- }
51
- return sorted;
52
- }
53
- }
@@ -1,57 +0,0 @@
1
- /**
2
- * Metadata Serializer Interface
3
- *
4
- * Defines the contract for serializing/deserializing metadata
5
- */
6
- import type { z } from 'zod';
7
- import type { MetadataFormat } from '@objectstack/spec/system';
8
- /**
9
- * Serialization options
10
- */
11
- export interface SerializeOptions {
12
- /** Prettify output (formatted with indentation) */
13
- prettify?: boolean;
14
- /** Indentation size (spaces) */
15
- indent?: number;
16
- /** Sort object keys alphabetically */
17
- sortKeys?: boolean;
18
- /** Include default values in output */
19
- includeDefaults?: boolean;
20
- }
21
- /**
22
- * Abstract interface for metadata serializers
23
- * Implementations handle different formats (JSON, YAML, TypeScript, etc.)
24
- */
25
- export interface MetadataSerializer {
26
- /**
27
- * Serialize object to string
28
- * @param item The item to serialize
29
- * @param options Serialization options
30
- * @returns Serialized string
31
- */
32
- serialize<T>(item: T, options?: SerializeOptions): string;
33
- /**
34
- * Deserialize string to object
35
- * @param content The content to deserialize
36
- * @param schema Optional Zod schema for validation
37
- * @returns Deserialized object
38
- */
39
- deserialize<T>(content: string, schema?: z.ZodSchema): T;
40
- /**
41
- * Get file extension for this format
42
- * @returns File extension (e.g., '.json', '.yaml')
43
- */
44
- getExtension(): string;
45
- /**
46
- * Check if this serializer can handle the format
47
- * @param format The format to check
48
- * @returns True if can handle
49
- */
50
- canHandle(format: MetadataFormat): boolean;
51
- /**
52
- * Get the format this serializer handles
53
- * @returns The metadata format
54
- */
55
- getFormat(): MetadataFormat;
56
- }
57
- //# sourceMappingURL=serializer-interface.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"serializer-interface.d.ts","sourceRoot":"","sources":["../../src/serializers/serializer-interface.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE/D;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,mDAAmD;IACnD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gCAAgC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,sCAAsC;IACtC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,uCAAuC;IACvC,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC;;;;;OAKG;IACH,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,MAAM,CAAC;IAE1D;;;;;OAKG;IACH,WAAW,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC;IAEzD;;;OAGG;IACH,YAAY,IAAI,MAAM,CAAC;IAEvB;;;;OAIG;IACH,SAAS,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC;IAE3C;;;OAGG;IACH,SAAS,IAAI,cAAc,CAAC;CAC7B"}
@@ -1,6 +0,0 @@
1
- /**
2
- * Metadata Serializer Interface
3
- *
4
- * Defines the contract for serializing/deserializing metadata
5
- */
6
- export {};
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=serializers.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"serializers.test.d.ts","sourceRoot":"","sources":["../../src/serializers/serializers.test.ts"],"names":[],"mappings":""}
@@ -1,62 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { JSONSerializer } from '../serializers/json-serializer';
3
- import { YAMLSerializer } from '../serializers/yaml-serializer';
4
- import { TypeScriptSerializer } from '../serializers/typescript-serializer';
5
- describe('Serializers', () => {
6
- describe('JSONSerializer', () => {
7
- const serializer = new JSONSerializer();
8
- it('should serialize to JSON', () => {
9
- const data = { name: 'test', value: 42 };
10
- const result = serializer.serialize(data);
11
- expect(result).toContain('"name"');
12
- expect(result).toContain('"test"');
13
- });
14
- it('should deserialize from JSON', () => {
15
- const json = '{"name":"test","value":42}';
16
- const result = serializer.deserialize(json);
17
- expect(result).toEqual({ name: 'test', value: 42 });
18
- });
19
- it('should prettify JSON', () => {
20
- const data = { name: 'test' };
21
- const result = serializer.serialize(data, { prettify: true, indent: 2 });
22
- expect(result).toContain('\n');
23
- expect(result).toContain(' ');
24
- });
25
- it('should sort keys', () => {
26
- const data = { zebra: 1, apple: 2, banana: 3 };
27
- const result = serializer.serialize(data, { sortKeys: true });
28
- const keys = Object.keys(JSON.parse(result));
29
- expect(keys).toEqual(['apple', 'banana', 'zebra']);
30
- });
31
- });
32
- describe('YAMLSerializer', () => {
33
- const serializer = new YAMLSerializer();
34
- it('should serialize to YAML', () => {
35
- const data = { name: 'test', value: 42 };
36
- const result = serializer.serialize(data);
37
- expect(result).toContain('name: test');
38
- expect(result).toContain('value: 42');
39
- });
40
- it('should deserialize from YAML', () => {
41
- const yaml = 'name: test\nvalue: 42';
42
- const result = serializer.deserialize(yaml);
43
- expect(result).toEqual({ name: 'test', value: 42 });
44
- });
45
- });
46
- describe('TypeScriptSerializer', () => {
47
- const serializer = new TypeScriptSerializer('typescript');
48
- it('should serialize to TypeScript module', () => {
49
- const data = { name: 'test', value: 42 };
50
- const result = serializer.serialize(data);
51
- expect(result).toContain('import type');
52
- expect(result).toContain('export const metadata');
53
- expect(result).toContain('export default metadata');
54
- });
55
- it('should get correct extension', () => {
56
- const ts = new TypeScriptSerializer('typescript');
57
- expect(ts.getExtension()).toBe('.ts');
58
- const js = new TypeScriptSerializer('javascript');
59
- expect(js.getExtension()).toBe('.js');
60
- });
61
- });
62
- });
@@ -1,18 +0,0 @@
1
- /**
2
- * TypeScript/JavaScript Metadata Serializer
3
- *
4
- * Handles TypeScript/JavaScript module format serialization and deserialization
5
- */
6
- import type { z } from 'zod';
7
- import type { MetadataFormat } from '@objectstack/spec/system';
8
- import type { MetadataSerializer, SerializeOptions } from './serializer-interface.js';
9
- export declare class TypeScriptSerializer implements MetadataSerializer {
10
- private format;
11
- constructor(format?: 'typescript' | 'javascript');
12
- serialize<T>(item: T, options?: SerializeOptions): string;
13
- deserialize<T>(content: string, schema?: z.ZodSchema): T;
14
- getExtension(): string;
15
- canHandle(format: MetadataFormat): boolean;
16
- getFormat(): MetadataFormat;
17
- }
18
- //# sourceMappingURL=typescript-serializer.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"typescript-serializer.d.ts","sourceRoot":"","sources":["../../src/serializers/typescript-serializer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAEtF,qBAAa,oBAAqB,YAAW,kBAAkB;IACjD,OAAO,CAAC,MAAM;gBAAN,MAAM,GAAE,YAAY,GAAG,YAA2B;IAEtE,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,MAAM;IAezD,WAAW,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,SAAS,GAAG,CAAC;IAqFxD,YAAY,IAAI,MAAM;IAItB,SAAS,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO;IAI1C,SAAS,IAAI,cAAc;CAG5B"}
@@ -1,103 +0,0 @@
1
- /**
2
- * TypeScript/JavaScript Metadata Serializer
3
- *
4
- * Handles TypeScript/JavaScript module format serialization and deserialization
5
- */
6
- export class TypeScriptSerializer {
7
- constructor(format = 'typescript') {
8
- this.format = format;
9
- }
10
- serialize(item, options) {
11
- const { prettify = true, indent = 2 } = options || {};
12
- const jsonStr = JSON.stringify(item, null, prettify ? indent : 0);
13
- if (this.format === 'typescript') {
14
- return `import type { ServiceObject } from '@objectstack/spec/data';\n\n` +
15
- `export const metadata: ServiceObject = ${jsonStr};\n\n` +
16
- `export default metadata;\n`;
17
- }
18
- else {
19
- return `export const metadata = ${jsonStr};\n\n` +
20
- `export default metadata;\n`;
21
- }
22
- }
23
- deserialize(content, schema) {
24
- // For TypeScript/JavaScript files, we need to extract the exported object
25
- // Note: This is a simplified parser that works with JSON-like object literals
26
- // For complex TypeScript with nested objects, consider using a proper TypeScript parser
27
- // Try to find the object literal in various export patterns
28
- // Pattern 1: export const metadata = {...};
29
- let objectStart = content.indexOf('export const');
30
- if (objectStart === -1) {
31
- // Pattern 2: export default {...};
32
- objectStart = content.indexOf('export default');
33
- }
34
- if (objectStart === -1) {
35
- throw new Error('Could not parse TypeScript/JavaScript module. ' +
36
- 'Expected export pattern: "export const metadata = {...};" or "export default {...};"');
37
- }
38
- // Find the first opening brace after the export statement
39
- const braceStart = content.indexOf('{', objectStart);
40
- if (braceStart === -1) {
41
- throw new Error('Could not find object literal in export statement');
42
- }
43
- // Find the matching closing brace by counting braces
44
- // Handle string literals to avoid counting braces inside strings
45
- let braceCount = 0;
46
- let braceEnd = -1;
47
- let inString = false;
48
- let stringChar = '';
49
- for (let i = braceStart; i < content.length; i++) {
50
- const char = content[i];
51
- const prevChar = i > 0 ? content[i - 1] : '';
52
- // Track string literals (simple handling of " and ')
53
- if ((char === '"' || char === "'") && prevChar !== '\\') {
54
- if (!inString) {
55
- inString = true;
56
- stringChar = char;
57
- }
58
- else if (char === stringChar) {
59
- inString = false;
60
- stringChar = '';
61
- }
62
- }
63
- // Count braces only when not inside strings
64
- if (!inString) {
65
- if (char === '{')
66
- braceCount++;
67
- if (char === '}') {
68
- braceCount--;
69
- if (braceCount === 0) {
70
- braceEnd = i;
71
- break;
72
- }
73
- }
74
- }
75
- }
76
- if (braceEnd === -1) {
77
- throw new Error('Could not find matching closing brace for object literal');
78
- }
79
- // Extract the object literal
80
- const objectLiteral = content.substring(braceStart, braceEnd + 1);
81
- try {
82
- // Parse as JSON
83
- const parsed = JSON.parse(objectLiteral);
84
- if (schema) {
85
- return schema.parse(parsed);
86
- }
87
- return parsed;
88
- }
89
- catch (error) {
90
- throw new Error(`Failed to parse object literal as JSON: ${error instanceof Error ? error.message : String(error)}. ` +
91
- 'Make sure the TypeScript/JavaScript object uses JSON-compatible syntax (no functions, comments, or trailing commas).');
92
- }
93
- }
94
- getExtension() {
95
- return this.format === 'typescript' ? '.ts' : '.js';
96
- }
97
- canHandle(format) {
98
- return format === 'typescript' || format === 'javascript';
99
- }
100
- getFormat() {
101
- return this.format;
102
- }
103
- }
@@ -1,16 +0,0 @@
1
- /**
2
- * YAML Metadata Serializer
3
- *
4
- * Handles YAML format serialization and deserialization
5
- */
6
- import type { z } from 'zod';
7
- import type { MetadataFormat } from '@objectstack/spec/system';
8
- import type { MetadataSerializer, SerializeOptions } from './serializer-interface.js';
9
- export declare class YAMLSerializer implements MetadataSerializer {
10
- serialize<T>(item: T, options?: SerializeOptions): string;
11
- deserialize<T>(content: string, schema?: z.ZodSchema): T;
12
- getExtension(): string;
13
- canHandle(format: MetadataFormat): boolean;
14
- getFormat(): MetadataFormat;
15
- }
16
- //# sourceMappingURL=yaml-serializer.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"yaml-serializer.d.ts","sourceRoot":"","sources":["../../src/serializers/yaml-serializer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAEtF,qBAAa,cAAe,YAAW,kBAAkB;IACvD,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,MAAM;IAWzD,WAAW,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,SAAS,GAAG,CAAC;IAYxD,YAAY,IAAI,MAAM;IAItB,SAAS,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO;IAI1C,SAAS,IAAI,cAAc;CAG5B"}
@@ -1,35 +0,0 @@
1
- /**
2
- * YAML Metadata Serializer
3
- *
4
- * Handles YAML format serialization and deserialization
5
- */
6
- import * as yaml from 'js-yaml';
7
- export class YAMLSerializer {
8
- serialize(item, options) {
9
- const { indent = 2, sortKeys = false } = options || {};
10
- return yaml.dump(item, {
11
- indent,
12
- sortKeys,
13
- lineWidth: -1, // Disable line wrapping
14
- noRefs: true, // Disable YAML references
15
- });
16
- }
17
- deserialize(content, schema) {
18
- // Use JSON_SCHEMA to prevent arbitrary code execution
19
- // This restricts YAML to JSON-compatible types only
20
- const parsed = yaml.load(content, { schema: yaml.JSON_SCHEMA });
21
- if (schema) {
22
- return schema.parse(parsed);
23
- }
24
- return parsed;
25
- }
26
- getExtension() {
27
- return '.yaml';
28
- }
29
- canHandle(format) {
30
- return format === 'yaml';
31
- }
32
- getFormat() {
33
- return 'yaml';
34
- }
35
- }