@objectstack/cli 3.0.6 → 3.0.7

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 (140) hide show
  1. package/.turbo/turbo-build.log +2 -26
  2. package/CHANGELOG.md +14 -0
  3. package/README.md +98 -54
  4. package/bin/run-dev.js +5 -0
  5. package/bin/run.js +5 -0
  6. package/dist/bin.d.ts +11 -0
  7. package/dist/bin.d.ts.map +1 -0
  8. package/dist/bin.js +12 -3767
  9. package/dist/bin.js.map +1 -0
  10. package/dist/commands/codemod/v2-to-v3.d.ts +10 -0
  11. package/dist/commands/codemod/v2-to-v3.d.ts.map +1 -0
  12. package/dist/commands/codemod/v2-to-v3.js +145 -0
  13. package/dist/commands/codemod/v2-to-v3.js.map +1 -0
  14. package/dist/commands/compile.d.ts +13 -0
  15. package/dist/commands/compile.d.ts.map +1 -0
  16. package/dist/commands/compile.js +91 -0
  17. package/dist/commands/compile.js.map +1 -0
  18. package/dist/commands/create.d.ts +91 -0
  19. package/dist/commands/create.d.ts.map +1 -0
  20. package/dist/commands/create.js +259 -0
  21. package/dist/commands/create.js.map +1 -0
  22. package/dist/commands/dev.d.ts +14 -0
  23. package/dist/commands/dev.d.ts.map +1 -0
  24. package/dist/commands/dev.js +67 -0
  25. package/dist/commands/dev.js.map +1 -0
  26. package/dist/commands/diff.d.ts +16 -0
  27. package/dist/commands/diff.d.ts.map +1 -0
  28. package/dist/commands/diff.js +239 -0
  29. package/dist/commands/diff.js.map +1 -0
  30. package/dist/commands/doctor.d.ts +10 -0
  31. package/dist/commands/doctor.d.ts.map +1 -0
  32. package/dist/commands/doctor.js +532 -0
  33. package/dist/commands/doctor.js.map +1 -0
  34. package/dist/commands/explain.d.ts +12 -0
  35. package/dist/commands/explain.d.ts.map +1 -0
  36. package/dist/commands/explain.js +368 -0
  37. package/dist/commands/explain.js.map +1 -0
  38. package/dist/commands/generate.d.ts +17 -0
  39. package/dist/commands/generate.d.ts.map +1 -0
  40. package/dist/commands/generate.js +833 -0
  41. package/dist/commands/generate.js.map +1 -0
  42. package/dist/commands/info.d.ts +12 -0
  43. package/dist/commands/info.d.ts.map +1 -0
  44. package/dist/commands/info.js +100 -0
  45. package/dist/commands/info.js.map +1 -0
  46. package/dist/commands/init.d.ts +22 -0
  47. package/dist/commands/init.d.ts.map +1 -0
  48. package/dist/commands/init.js +295 -0
  49. package/dist/commands/init.js.map +1 -0
  50. package/dist/commands/lint.d.ts +13 -0
  51. package/dist/commands/lint.d.ts.map +1 -0
  52. package/dist/commands/lint.js +255 -0
  53. package/dist/commands/lint.js.map +1 -0
  54. package/dist/commands/plugin/add.d.ts +22 -0
  55. package/dist/commands/plugin/add.d.ts.map +1 -0
  56. package/dist/commands/plugin/add.js +93 -0
  57. package/dist/commands/plugin/add.js.map +1 -0
  58. package/dist/commands/plugin/info.d.ts +10 -0
  59. package/dist/commands/plugin/info.d.ts.map +1 -0
  60. package/dist/commands/plugin/info.js +65 -0
  61. package/dist/commands/plugin/info.js.map +1 -0
  62. package/dist/commands/plugin/list.d.ts +13 -0
  63. package/dist/commands/plugin/list.d.ts.map +1 -0
  64. package/dist/commands/plugin/list.js +78 -0
  65. package/dist/commands/plugin/list.js.map +1 -0
  66. package/dist/commands/plugin/remove.d.ts +20 -0
  67. package/dist/commands/plugin/remove.d.ts.map +1 -0
  68. package/dist/commands/plugin/remove.js +79 -0
  69. package/dist/commands/plugin/remove.js.map +1 -0
  70. package/dist/commands/serve.d.ts +15 -0
  71. package/dist/commands/serve.d.ts.map +1 -0
  72. package/dist/commands/serve.js +286 -0
  73. package/dist/commands/serve.js.map +1 -0
  74. package/dist/commands/studio.d.ts +19 -0
  75. package/dist/commands/studio.d.ts.map +1 -0
  76. package/dist/commands/studio.js +43 -0
  77. package/dist/commands/studio.js.map +1 -0
  78. package/dist/commands/test.d.ts +13 -0
  79. package/dist/commands/test.d.ts.map +1 -0
  80. package/dist/commands/test.js +120 -0
  81. package/dist/commands/test.js.map +1 -0
  82. package/dist/commands/validate.d.ts +13 -0
  83. package/dist/commands/validate.d.ts.map +1 -0
  84. package/dist/commands/validate.js +115 -0
  85. package/dist/commands/validate.js.map +1 -0
  86. package/dist/index.d.ts +15 -114
  87. package/dist/index.d.ts.map +1 -0
  88. package/dist/index.js +20 -2805
  89. package/dist/index.js.map +1 -0
  90. package/dist/utils/config.d.ts +21 -0
  91. package/dist/utils/config.d.ts.map +1 -0
  92. package/dist/utils/config.js +66 -0
  93. package/dist/utils/config.js.map +1 -0
  94. package/dist/utils/format.d.ts +52 -0
  95. package/dist/utils/format.d.ts.map +1 -0
  96. package/dist/utils/format.js +202 -0
  97. package/dist/utils/format.js.map +1 -0
  98. package/dist/utils/plugin-helpers.d.ts +14 -0
  99. package/dist/utils/plugin-helpers.d.ts.map +1 -0
  100. package/dist/utils/plugin-helpers.js +40 -0
  101. package/dist/utils/plugin-helpers.js.map +1 -0
  102. package/dist/utils/studio.d.ts +58 -0
  103. package/dist/utils/studio.d.ts.map +1 -0
  104. package/dist/utils/studio.js +288 -0
  105. package/dist/utils/studio.js.map +1 -0
  106. package/package.json +33 -15
  107. package/src/bin.ts +11 -104
  108. package/src/commands/{codemod.ts → codemod/v2-to-v3.ts} +21 -28
  109. package/src/commands/compile.ts +31 -22
  110. package/src/commands/create.ts +29 -19
  111. package/src/commands/dev.ts +21 -10
  112. package/src/commands/diff.ts +28 -19
  113. package/src/commands/doctor.ts +17 -10
  114. package/src/commands/explain.ts +20 -10
  115. package/src/commands/generate.ts +81 -90
  116. package/src/commands/info.ts +20 -11
  117. package/src/commands/init.ts +32 -20
  118. package/src/commands/lint.ts +24 -14
  119. package/src/commands/plugin/add.ts +112 -0
  120. package/src/commands/plugin/info.ts +79 -0
  121. package/src/commands/plugin/list.ts +93 -0
  122. package/src/commands/plugin/remove.ts +97 -0
  123. package/src/commands/serve.ts +30 -20
  124. package/src/commands/studio.ts +21 -11
  125. package/src/commands/test.ts +21 -10
  126. package/src/commands/validate.ts +32 -22
  127. package/src/index.ts +20 -12
  128. package/src/utils/plugin-helpers.ts +37 -0
  129. package/src/utils/studio.ts +0 -1
  130. package/test/commands.test.ts +76 -37
  131. package/test/plugin-commands.test.ts +42 -160
  132. package/test/plugin.test.ts +19 -23
  133. package/tsconfig.build.json +18 -0
  134. package/bin/objectstack.js +0 -2
  135. package/dist/chunk-T2YN4AB7.js +0 -249
  136. package/dist/chunk-XNACYTC5.js +0 -251
  137. package/dist/config-FOXDQ5F7.js +0 -10
  138. package/dist/config-GBR54FKL.js +0 -11
  139. package/src/commands/plugin.ts +0 -372
  140. package/src/utils/plugin-commands.ts +0 -163
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":"AAAA,yEAAyE;AAEzE;;;;;;;;GAQG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class V2ToV3 extends Command {
3
+ static description: string;
4
+ static flags: {
5
+ dir: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
6
+ 'dry-run': import("@oclif/core/interfaces").BooleanFlag<boolean>;
7
+ };
8
+ run(): Promise<void>;
9
+ }
10
+ //# sourceMappingURL=v2-to-v3.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"v2-to-v3.d.ts","sourceRoot":"","sources":["../../../src/commands/codemod/v2-to-v3.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAC;AA8E7C,MAAM,CAAC,OAAO,OAAO,MAAO,SAAQ,OAAO;IACzC,OAAgB,WAAW,SAAgD;IAE3E,OAAgB,KAAK;;;MAGnB;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAkF3B"}
@@ -0,0 +1,145 @@
1
+ // Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.
2
+ import { Command, Flags } from '@oclif/core';
3
+ import chalk from 'chalk';
4
+ import fs from 'fs';
5
+ import path from 'path';
6
+ import { printHeader, printSuccess, printError, printInfo, printStep, createTimer } from '../../utils/format.js';
7
+ const V2_TO_V3_TRANSFORMS = [
8
+ {
9
+ pattern: /\bEnhancedObjectKernel\b/g,
10
+ replacement: 'ObjectKernel',
11
+ description: 'EnhancedObjectKernel → ObjectKernel',
12
+ },
13
+ {
14
+ pattern: /\bmax_length\b/g,
15
+ replacement: 'maxLength',
16
+ description: 'max_length → maxLength',
17
+ },
18
+ {
19
+ pattern: /\breference_filters\b/g,
20
+ replacement: 'referenceFilters',
21
+ description: 'reference_filters → referenceFilters',
22
+ },
23
+ {
24
+ pattern: /\bdefault_value\b/g,
25
+ replacement: 'defaultValue',
26
+ description: 'default_value → defaultValue',
27
+ },
28
+ {
29
+ pattern: /\bmin_length\b/g,
30
+ replacement: 'minLength',
31
+ description: 'min_length → minLength',
32
+ },
33
+ {
34
+ pattern: /\bunique_name\b/g,
35
+ replacement: 'uniqueName',
36
+ description: 'unique_name → uniqueName',
37
+ },
38
+ {
39
+ pattern: /from\s+['"]@objectstack\/core\/enhanced['"]/g,
40
+ replacement: "from '@objectstack/core'",
41
+ description: 'Update import from @objectstack/core/enhanced',
42
+ },
43
+ {
44
+ pattern: /from\s+['"]@objectstack\/spec\/dist\/[^'"]+['"]/g,
45
+ replacement: "from '@objectstack/spec'",
46
+ description: 'Update deep import from @objectstack/spec/dist/',
47
+ },
48
+ ];
49
+ // ─── Helpers ────────────────────────────────────────────────────────
50
+ function walkDir(dir, ext) {
51
+ const results = [];
52
+ if (!fs.existsSync(dir))
53
+ return results;
54
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
55
+ for (const entry of entries) {
56
+ if (entry.name === 'node_modules')
57
+ continue;
58
+ const fullPath = path.join(dir, entry.name);
59
+ if (entry.isDirectory()) {
60
+ results.push(...walkDir(fullPath, ext));
61
+ }
62
+ else if (entry.name.endsWith(ext)) {
63
+ results.push(fullPath);
64
+ }
65
+ }
66
+ return results;
67
+ }
68
+ // ─── Command ────────────────────────────────────────────────────────
69
+ export default class V2ToV3 extends Command {
70
+ static description = 'Migrate ObjectStack v2 config to v3 format';
71
+ static flags = {
72
+ dir: Flags.string({ description: 'Directory to scan', default: 'src/' }),
73
+ 'dry-run': Flags.boolean({ description: 'Show changes without writing files' }),
74
+ };
75
+ async run() {
76
+ const { flags } = await this.parse(V2ToV3);
77
+ printHeader('Codemod: v2 → v3');
78
+ const timer = createTimer();
79
+ const dir = path.resolve(process.cwd(), flags.dir);
80
+ if (!fs.existsSync(dir)) {
81
+ printError(`Directory not found: ${dir}`);
82
+ process.exit(1);
83
+ }
84
+ console.log(` ${chalk.dim('Directory:')} ${chalk.white(flags.dir)}`);
85
+ console.log(` ${chalk.dim('Dry run:')} ${chalk.white(flags['dry-run'] ? 'yes' : 'no')}`);
86
+ console.log('');
87
+ printStep('Scanning TypeScript files...');
88
+ const files = walkDir(dir, '.ts');
89
+ if (files.length === 0) {
90
+ printInfo('No .ts files found in directory');
91
+ return;
92
+ }
93
+ printInfo(`Found ${files.length} TypeScript file(s)`);
94
+ console.log('');
95
+ let totalTransforms = 0;
96
+ let filesModified = 0;
97
+ const transformCounts = {};
98
+ for (const file of files) {
99
+ const original = fs.readFileSync(file, 'utf-8');
100
+ let content = original;
101
+ let fileTransforms = 0;
102
+ for (const transform of V2_TO_V3_TRANSFORMS) {
103
+ const matches = content.match(transform.pattern);
104
+ if (matches) {
105
+ const count = matches.length;
106
+ content = content.replace(transform.pattern, transform.replacement);
107
+ fileTransforms += count;
108
+ transformCounts[transform.description] = (transformCounts[transform.description] || 0) + count;
109
+ }
110
+ }
111
+ if (fileTransforms > 0) {
112
+ const relPath = path.relative(process.cwd(), file);
113
+ filesModified++;
114
+ totalTransforms += fileTransforms;
115
+ if (flags['dry-run']) {
116
+ printInfo(`${relPath} — ${fileTransforms} change(s)`);
117
+ }
118
+ else {
119
+ fs.writeFileSync(file, content);
120
+ printSuccess(`${relPath} — ${fileTransforms} change(s)`);
121
+ }
122
+ }
123
+ }
124
+ console.log('');
125
+ if (totalTransforms === 0) {
126
+ printSuccess('No v2 patterns found — code is already v3 compatible');
127
+ }
128
+ else {
129
+ console.log(chalk.bold(' Summary:'));
130
+ for (const [desc, count] of Object.entries(transformCounts)) {
131
+ console.log(` ${chalk.dim(desc)}: ${chalk.white(count)}`);
132
+ }
133
+ console.log('');
134
+ if (flags['dry-run']) {
135
+ printInfo(`Would modify ${filesModified} file(s) with ${totalTransforms} total change(s)`);
136
+ console.log(chalk.dim(' Run without --dry-run to apply changes'));
137
+ }
138
+ else {
139
+ printSuccess(`Modified ${filesModified} file(s) with ${totalTransforms} total change(s) (${timer.display()})`);
140
+ }
141
+ }
142
+ console.log('');
143
+ }
144
+ }
145
+ //# sourceMappingURL=v2-to-v3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"v2-to-v3.js","sourceRoot":"","sources":["../../../src/commands/codemod/v2-to-v3.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class Compile extends Command {
3
+ static description: string;
4
+ static args: {
5
+ config: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
6
+ };
7
+ static flags: {
8
+ output: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
9
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
10
+ };
11
+ run(): Promise<void>;
12
+ }
13
+ //# sourceMappingURL=compile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../../src/commands/compile.ts"],"names":[],"mappings":"AAEA,OAAO,EAAQ,OAAO,EAAS,MAAM,aAAa,CAAC;AAmBnD,MAAM,CAAC,OAAO,OAAO,OAAQ,SAAQ,OAAO;IAC1C,OAAgB,WAAW,SAAwD;IAEnF,OAAgB,IAAI;;MAElB;IAEF,OAAgB,KAAK;;;MAGnB;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAgF3B"}
@@ -0,0 +1,91 @@
1
+ // Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.
2
+ import { Args, Command, Flags } from '@oclif/core';
3
+ import path from 'path';
4
+ import fs from 'fs';
5
+ import chalk from 'chalk';
6
+ import { ObjectStackDefinitionSchema, normalizeStackInput } from '@objectstack/spec';
7
+ import { loadConfig } from '../utils/config.js';
8
+ import { printHeader, printKV, printSuccess, printError, printStep, createTimer, formatZodErrors, collectMetadataStats, printMetadataStats, } from '../utils/format.js';
9
+ export default class Compile extends Command {
10
+ static description = 'Compile ObjectStack configuration to JSON artifact';
11
+ static args = {
12
+ config: Args.string({ description: 'Source configuration file', required: false }),
13
+ };
14
+ static flags = {
15
+ output: Flags.string({ char: 'o', description: 'Output JSON file', default: 'dist/objectstack.json' }),
16
+ json: Flags.boolean({ description: 'Output compile result as JSON (for CI)' }),
17
+ };
18
+ async run() {
19
+ const { args, flags } = await this.parse(Compile);
20
+ const timer = createTimer();
21
+ if (!flags.json) {
22
+ printHeader('Compile');
23
+ }
24
+ try {
25
+ // 1. Load Configuration
26
+ if (!flags.json)
27
+ printStep('Loading configuration...');
28
+ const { config, absolutePath, duration } = await loadConfig(args.config);
29
+ if (!flags.json) {
30
+ printKV('Config', path.relative(process.cwd(), absolutePath));
31
+ printKV('Load time', `${duration}ms`);
32
+ }
33
+ // 2. Normalize map-formatted stack definition and validate against Protocol
34
+ if (!flags.json)
35
+ printStep('Validating protocol compliance...');
36
+ const normalized = normalizeStackInput(config);
37
+ const result = ObjectStackDefinitionSchema.safeParse(normalized);
38
+ if (!result.success) {
39
+ if (flags.json) {
40
+ console.log(JSON.stringify({ success: false, errors: result.error.issues }));
41
+ this.exit(1);
42
+ }
43
+ console.log('');
44
+ printError('Validation failed');
45
+ formatZodErrors(result.error);
46
+ this.exit(1);
47
+ }
48
+ // 3. Generate Artifact
49
+ if (!flags.json)
50
+ printStep('Writing artifact...');
51
+ const output = flags.output;
52
+ const artifactPath = path.resolve(process.cwd(), output);
53
+ const artifactDir = path.dirname(artifactPath);
54
+ if (!fs.existsSync(artifactDir)) {
55
+ fs.mkdirSync(artifactDir, { recursive: true });
56
+ }
57
+ const jsonContent = JSON.stringify(result.data, null, 2);
58
+ fs.writeFileSync(artifactPath, jsonContent);
59
+ const sizeKB = (jsonContent.length / 1024).toFixed(1);
60
+ const stats = collectMetadataStats(config);
61
+ if (flags.json) {
62
+ console.log(JSON.stringify({
63
+ success: true,
64
+ output: artifactPath,
65
+ size: jsonContent.length,
66
+ stats,
67
+ duration: timer.elapsed(),
68
+ }));
69
+ return;
70
+ }
71
+ // 4. Summary
72
+ console.log('');
73
+ printSuccess(`Build complete ${chalk.dim(`(${timer.display()})`)}`);
74
+ console.log('');
75
+ printMetadataStats(stats);
76
+ console.log('');
77
+ printKV('Artifact', `${output} ${chalk.dim(`(${sizeKB} KB`)})`);
78
+ console.log('');
79
+ }
80
+ catch (error) {
81
+ if (flags.json) {
82
+ console.log(JSON.stringify({ success: false, error: error.message }));
83
+ this.exit(1);
84
+ }
85
+ console.log('');
86
+ printError(error.message || String(error));
87
+ this.error(error.message || String(error));
88
+ }
89
+ }
90
+ }
91
+ //# sourceMappingURL=compile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compile.js","sourceRoot":"","sources":["../../src/commands/compile.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,91 @@
1
+ import { Command } from '@oclif/core';
2
+ export declare const templates: {
3
+ plugin: {
4
+ description: string;
5
+ files: {
6
+ 'package.json': (name: string) => {
7
+ name: string;
8
+ version: string;
9
+ description: string;
10
+ main: string;
11
+ types: string;
12
+ scripts: {
13
+ build: string;
14
+ dev: string;
15
+ test: string;
16
+ };
17
+ keywords: string[];
18
+ author: string;
19
+ license: string;
20
+ dependencies: {
21
+ '@objectstack/spec': string;
22
+ zod: string;
23
+ };
24
+ devDependencies: {
25
+ '@types/node': string;
26
+ typescript: string;
27
+ vitest: string;
28
+ };
29
+ };
30
+ 'tsconfig.json': () => {
31
+ extends: string;
32
+ compilerOptions: {
33
+ outDir: string;
34
+ rootDir: string;
35
+ };
36
+ include: string[];
37
+ };
38
+ 'src/index.ts': (name: string) => string;
39
+ 'README.md': (name: string) => string;
40
+ };
41
+ };
42
+ example: {
43
+ description: string;
44
+ files: {
45
+ 'package.json': (name: string) => {
46
+ name: string;
47
+ version: string;
48
+ private: boolean;
49
+ description: string;
50
+ scripts: {
51
+ build: string;
52
+ dev: string;
53
+ test: string;
54
+ };
55
+ dependencies: {
56
+ '@objectstack/spec': string;
57
+ '@objectstack/cli': string;
58
+ zod: string;
59
+ };
60
+ devDependencies: {
61
+ '@types/node': string;
62
+ tsx: string;
63
+ typescript: string;
64
+ vitest: string;
65
+ };
66
+ };
67
+ 'objectstack.config.ts': (name: string) => string;
68
+ 'README.md': (name: string) => string;
69
+ 'tsconfig.json': () => {
70
+ extends: string;
71
+ compilerOptions: {
72
+ outDir: string;
73
+ rootDir: string;
74
+ };
75
+ include: string[];
76
+ };
77
+ };
78
+ };
79
+ };
80
+ export default class Create extends Command {
81
+ static description: string;
82
+ static args: {
83
+ type: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
84
+ name: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
85
+ };
86
+ static flags: {
87
+ dir: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
88
+ };
89
+ run(): Promise<void>;
90
+ }
91
+ //# sourceMappingURL=create.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AAEA,OAAO,EAAQ,OAAO,EAAS,MAAM,aAAa,CAAC;AAMnD,eAAO,MAAM,SAAS;;;;mCAIO,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mCAgCN,MAAM;gCAsBT,MAAM;;;;;;mCAiCH,MAAM;;;;;;;;;;;;;;;;;;;;;;4CAsBG,MAAM;gCAuBlB,MAAM;;;;;;;;;;;CAkC/B,CAAC;AAMF,MAAM,CAAC,OAAO,OAAO,MAAO,SAAQ,OAAO;IACzC,OAAgB,WAAW,SAA4D;IAEvF,OAAgB,IAAI;;;MAGlB;IAEF,OAAgB,KAAK;;MAEnB;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAoF3B"}
@@ -0,0 +1,259 @@
1
+ // Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.
2
+ import { Args, Command, Flags } from '@oclif/core';
3
+ import chalk from 'chalk';
4
+ import fs from 'fs';
5
+ import path from 'path';
6
+ export const templates = {
7
+ plugin: {
8
+ description: 'Create a new ObjectStack plugin',
9
+ files: {
10
+ 'package.json': (name) => ({
11
+ name: `@objectstack/plugin-${name}`,
12
+ version: '0.1.0',
13
+ description: `ObjectStack Plugin: ${name}`,
14
+ main: 'dist/index.js',
15
+ types: 'dist/index.d.ts',
16
+ scripts: {
17
+ build: 'tsc',
18
+ dev: 'tsc --watch',
19
+ test: 'vitest',
20
+ },
21
+ keywords: ['objectstack', 'plugin', name],
22
+ author: '',
23
+ license: 'MIT',
24
+ dependencies: {
25
+ '@objectstack/spec': 'workspace:*',
26
+ zod: '^4.3.6',
27
+ },
28
+ devDependencies: {
29
+ '@types/node': '^22.0.0',
30
+ typescript: '^5.8.0',
31
+ vitest: '^4.0.0',
32
+ },
33
+ }),
34
+ 'tsconfig.json': () => ({
35
+ extends: '../../tsconfig.json',
36
+ compilerOptions: {
37
+ outDir: 'dist',
38
+ rootDir: 'src',
39
+ },
40
+ include: ['src/**/*'],
41
+ }),
42
+ 'src/index.ts': (name) => `import type { Plugin } from '@objectstack/spec';
43
+
44
+ /**
45
+ * ${name} Plugin for ObjectStack
46
+ */
47
+ export const ${toCamelCase(name)}Plugin: Plugin = {
48
+ name: '${name}',
49
+ version: '0.1.0',
50
+
51
+ async initialize(context) {
52
+ console.log('Initializing ${name} plugin...');
53
+ // Plugin initialization logic
54
+ },
55
+
56
+ async destroy() {
57
+ console.log('Destroying ${name} plugin...');
58
+ // Plugin cleanup logic
59
+ },
60
+ };
61
+
62
+ export default ${toCamelCase(name)}Plugin;
63
+ `,
64
+ 'README.md': (name) => `# @objectstack/plugin-${name}
65
+
66
+ ObjectStack Plugin: ${name}
67
+
68
+ ## Installation
69
+
70
+ \`\`\`bash
71
+ pnpm add @objectstack/plugin-${name}
72
+ \`\`\`
73
+
74
+ ## Usage
75
+
76
+ \`\`\`typescript
77
+ import { ${toCamelCase(name)}Plugin } from '@objectstack/plugin-${name}';
78
+
79
+ // Use the plugin in your ObjectStack configuration
80
+ export default {
81
+ plugins: [
82
+ ${toCamelCase(name)}Plugin,
83
+ ],
84
+ };
85
+ \`\`\`
86
+
87
+ ## License
88
+
89
+ MIT
90
+ `,
91
+ },
92
+ },
93
+ example: {
94
+ description: 'Create a new ObjectStack example application',
95
+ files: {
96
+ 'package.json': (name) => ({
97
+ name: `@example/${name}`,
98
+ version: '0.1.0',
99
+ private: true,
100
+ description: `ObjectStack Example: ${name}`,
101
+ scripts: {
102
+ build: 'objectstack compile',
103
+ dev: 'objectstack dev',
104
+ test: 'vitest',
105
+ },
106
+ dependencies: {
107
+ '@objectstack/spec': 'workspace:*',
108
+ '@objectstack/cli': 'workspace:*',
109
+ zod: '^4.3.6',
110
+ },
111
+ devDependencies: {
112
+ '@types/node': '^22.0.0',
113
+ tsx: '^4.21.0',
114
+ typescript: '^5.8.0',
115
+ vitest: '^4.0.0',
116
+ },
117
+ }),
118
+ 'objectstack.config.ts': (name) => `import { defineStack } from '@objectstack/spec';
119
+
120
+ // Barrel imports — add more as you create new type folders
121
+ // import * as objects from './src/objects';
122
+ // import * as actions from './src/actions';
123
+ // import * as apps from './src/apps';
124
+
125
+ export default defineStack({
126
+ manifest: {
127
+ name: '${name}',
128
+ version: '0.1.0',
129
+ description: '${name} example application',
130
+ },
131
+
132
+ objects: [
133
+ // Object.values(objects), // Uncomment after creating src/objects/index.ts
134
+ ],
135
+
136
+ apps: [
137
+ // Object.values(apps), // Uncomment after creating src/apps/index.ts
138
+ ],
139
+ });
140
+ `,
141
+ 'README.md': (name) => `# ${name} Example
142
+
143
+ ObjectStack example application: ${name}
144
+
145
+ ## Quick Start
146
+
147
+ \`\`\`bash
148
+ # Build the configuration
149
+ pnpm build
150
+
151
+ # Run in development mode
152
+ pnpm dev
153
+ \`\`\`
154
+
155
+ ## Structure
156
+
157
+ - \`objectstack.config.ts\` - Main configuration file
158
+ - \`dist/objectstack.json\` - Compiled artifact
159
+
160
+ ## Learn More
161
+
162
+ - [ObjectStack Documentation](../../content/docs)
163
+ - [Examples](../)
164
+ `,
165
+ 'tsconfig.json': () => ({
166
+ extends: '../../tsconfig.json',
167
+ compilerOptions: {
168
+ outDir: 'dist',
169
+ rootDir: '.',
170
+ },
171
+ include: ['*.ts', 'src/**/*'],
172
+ }),
173
+ },
174
+ },
175
+ };
176
+ function toCamelCase(str) {
177
+ return str.replace(/-([a-z])/g, (g) => g[1].toUpperCase());
178
+ }
179
+ export default class Create extends Command {
180
+ static description = 'Create a new package, plugin, or example from template';
181
+ static args = {
182
+ type: Args.string({ description: 'Type of project to create (plugin, example)', required: true }),
183
+ name: Args.string({ description: 'Name of the project', required: false }),
184
+ };
185
+ static flags = {
186
+ dir: Flags.string({ char: 'd', description: 'Target directory' }),
187
+ };
188
+ async run() {
189
+ const { args, flags } = await this.parse(Create);
190
+ console.log(chalk.bold(`\nšŸ“¦ ObjectStack Project Creator`));
191
+ console.log(chalk.dim(`-------------------------------`));
192
+ if (!templates[args.type]) {
193
+ console.error(chalk.red(`\nāŒ Unknown type: ${args.type}`));
194
+ console.log(chalk.dim('Available types: plugin, example'));
195
+ process.exit(1);
196
+ }
197
+ if (!args.name) {
198
+ console.error(chalk.red('\nāŒ Project name is required'));
199
+ console.log(chalk.dim(`Usage: objectstack create ${args.type} <name>`));
200
+ process.exit(1);
201
+ }
202
+ const template = templates[args.type];
203
+ const cwd = process.cwd();
204
+ // Determine target directory
205
+ let targetDir;
206
+ if (flags.dir) {
207
+ targetDir = path.resolve(cwd, flags.dir);
208
+ }
209
+ else {
210
+ const baseDir = args.type === 'plugin' ? 'packages/plugins' : 'examples';
211
+ const projectName = args.type === 'plugin' ? `plugin-${args.name}` : args.name;
212
+ targetDir = path.join(cwd, baseDir, projectName);
213
+ }
214
+ // Check if directory already exists
215
+ if (fs.existsSync(targetDir)) {
216
+ console.error(chalk.red(`\nāŒ Directory already exists: ${targetDir}`));
217
+ process.exit(1);
218
+ }
219
+ console.log(`šŸ“ Creating ${args.type}: ${chalk.blue(args.name)}`);
220
+ console.log(`šŸ“‚ Location: ${chalk.dim(targetDir)}`);
221
+ console.log('');
222
+ try {
223
+ // Create directory
224
+ fs.mkdirSync(targetDir, { recursive: true });
225
+ // Create files from template
226
+ for (const [filePath, contentFn] of Object.entries(template.files)) {
227
+ const fullPath = path.join(targetDir, filePath);
228
+ const dir = path.dirname(fullPath);
229
+ if (!fs.existsSync(dir)) {
230
+ fs.mkdirSync(dir, { recursive: true });
231
+ }
232
+ const content = contentFn(args.name);
233
+ const fileContent = typeof content === 'string'
234
+ ? content
235
+ : JSON.stringify(content, null, 2);
236
+ fs.writeFileSync(fullPath, fileContent);
237
+ console.log(chalk.green(`āœ“ Created ${filePath}`));
238
+ }
239
+ console.log('');
240
+ console.log(chalk.green('āœ… Project created successfully!'));
241
+ console.log('');
242
+ console.log(chalk.bold('Next steps:'));
243
+ console.log(chalk.dim(` cd ${path.relative(cwd, targetDir)}`));
244
+ console.log(chalk.dim(' pnpm install'));
245
+ console.log(chalk.dim(' pnpm build'));
246
+ console.log('');
247
+ }
248
+ catch (error) {
249
+ console.error(chalk.red('\nāŒ Failed to create project:'));
250
+ console.error(error.message || error);
251
+ // Clean up on error
252
+ if (fs.existsSync(targetDir)) {
253
+ fs.rmSync(targetDir, { recursive: true });
254
+ }
255
+ process.exit(1);
256
+ }
257
+ }
258
+ }
259
+ //# sourceMappingURL=create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"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"}