@objectstack/cli 4.1.0 → 4.2.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.
@@ -19,5 +19,15 @@ export default class Dev extends Command {
19
19
  'auth-secret': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
20
20
  };
21
21
  run(): Promise<void>;
22
+ /**
23
+ * Watch objectstack source files (config + src/**) and on change:
24
+ * 1. Debounce 250ms
25
+ * 2. Run `os compile` to rebuild `dist/objectstack.json`
26
+ * 3. POST /api/v1/dev/metadata-events on the running server so
27
+ * MetadataPlugin reloads the artifact and Studio previews refresh.
28
+ *
29
+ * The watcher runs in this parent process; the serve child stays untouched.
30
+ */
31
+ private startWatchRecompile;
22
32
  }
23
33
  //# sourceMappingURL=dev.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"AAEA,OAAO,EAAQ,OAAO,EAAS,MAAM,aAAa,CAAC;AAOnD,MAAM,CAAC,OAAO,OAAO,GAAI,SAAQ,OAAO;IACtC,OAAgB,WAAW,SAA4C;IAEvE,OAAgB,IAAI;;MAElB;IAEF,OAAgB,KAAK;;;;;;;;;;;;;MAwCnB;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAqH3B"}
1
+ {"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"AAEA,OAAO,EAAQ,OAAO,EAAS,MAAM,aAAa,CAAC;AAOnD,MAAM,CAAC,OAAO,OAAO,GAAI,SAAQ,OAAO;IACtC,OAAgB,WAAW,SAA4C;IAEvE,OAAgB,IAAI;;MAElB;IAEF,OAAgB,KAAK;;;;;;;;;;;;;MAwCnB;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;IA8I1B;;;;;;;;OAQG;IACH,OAAO,CAAC,mBAAmB;CA0F5B"}
@@ -114,7 +114,7 @@ export default class Dev extends Command {
114
114
  printKV('Database', redactDbUrl(flags.database), '🗄️');
115
115
  const port = flags.port ?? process.env.PORT;
116
116
  const binPath = process.argv[1];
117
- spawn(process.execPath, [
117
+ const serveChild = spawn(process.execPath, [
118
118
  binPath,
119
119
  'serve',
120
120
  '--dev',
@@ -123,6 +123,28 @@ export default class Dev extends Command {
123
123
  ...(flags.verbose ? ['--verbose'] : []),
124
124
  ...(flags.preset ? ['--preset', flags.preset] : []),
125
125
  ], { stdio: 'inherit', env: localEnv });
126
+ // ── Watch-recompile loop ────────────────────────────────────────
127
+ // When the agent edits an objectstack source file (config or
128
+ // src/**), debounce-rebuild dist/objectstack.json then POST the
129
+ // dev HMR endpoint so Studio previews refresh without F5.
130
+ //
131
+ // Skipped when:
132
+ // - --watch=false (user opted out)
133
+ // - --artifact was passed (no source to watch)
134
+ // - the project has no objectstack.config.ts
135
+ if (flags.watch !== false && !flags.artifact && configExists) {
136
+ this.startWatchRecompile({
137
+ cwd: process.cwd(),
138
+ configPath,
139
+ artifactPath,
140
+ binPath,
141
+ port: port ?? '3000',
142
+ verbose: flags.verbose,
143
+ });
144
+ }
145
+ serveChild.on('exit', (code) => {
146
+ process.exit(code ?? 0);
147
+ });
126
148
  return;
127
149
  }
128
150
  // ── Monorepo Orchestration Mode ──────────────────────────────────────────
@@ -149,6 +171,102 @@ export default class Dev extends Command {
149
171
  process.exit(1);
150
172
  }
151
173
  }
174
+ /**
175
+ * Watch objectstack source files (config + src/**) and on change:
176
+ * 1. Debounce 250ms
177
+ * 2. Run `os compile` to rebuild `dist/objectstack.json`
178
+ * 3. POST /api/v1/dev/metadata-events on the running server so
179
+ * MetadataPlugin reloads the artifact and Studio previews refresh.
180
+ *
181
+ * The watcher runs in this parent process; the serve child stays untouched.
182
+ */
183
+ startWatchRecompile(opts) {
184
+ void (async () => {
185
+ const chokidar = (await import('chokidar')).default;
186
+ const srcDir = path.resolve(opts.cwd, 'src');
187
+ const watchPaths = [opts.configPath];
188
+ if (fs.existsSync(srcDir))
189
+ watchPaths.push(srcDir);
190
+ const watcher = chokidar.watch(watchPaths, {
191
+ ignored: [
192
+ /node_modules/,
193
+ /\.git/,
194
+ /\.objectstack\//,
195
+ /\bdist\b/,
196
+ /\.test\.[jt]sx?$/,
197
+ ],
198
+ ignoreInitial: true,
199
+ persistent: true,
200
+ });
201
+ let timer = null;
202
+ let pending = new Set();
203
+ let inFlight = false;
204
+ let queued = false;
205
+ const compileAndPing = async () => {
206
+ if (inFlight) {
207
+ queued = true;
208
+ return;
209
+ }
210
+ inFlight = true;
211
+ const changed = Array.from(pending);
212
+ pending = new Set();
213
+ const label = changed.length === 1
214
+ ? path.relative(opts.cwd, changed[0])
215
+ : `${changed.length} files`;
216
+ console.log(chalk.dim(`\n ↻ recompiling (${label})...`));
217
+ const t0 = Date.now();
218
+ const r = spawnSync(process.execPath, [opts.binPath, 'compile', '--output', opts.artifactPath], { stdio: opts.verbose ? 'inherit' : ['ignore', 'ignore', 'pipe'], env: process.env });
219
+ const dt = Date.now() - t0;
220
+ if (r.status !== 0) {
221
+ const stderr = r.stderr?.toString().trim();
222
+ console.log(chalk.red(` ✗ compile failed (${dt}ms)${stderr ? '\n' + stderr : ''}`));
223
+ }
224
+ else {
225
+ console.log(chalk.green(` ✓ recompiled in ${dt}ms — notifying server`));
226
+ try {
227
+ const res = await fetch(`http://localhost:${opts.port}/api/v1/dev/metadata-events`, {
228
+ method: 'POST',
229
+ headers: { 'content-type': 'application/json' },
230
+ body: JSON.stringify({ reason: 'source-change', changed: changed.map((p) => path.relative(opts.cwd, p)) }),
231
+ });
232
+ if (!res.ok)
233
+ console.log(chalk.yellow(` ⚠ HMR ping returned ${res.status}`));
234
+ }
235
+ catch (e) {
236
+ console.log(chalk.yellow(` ⚠ HMR ping failed: ${e?.message ?? e}`));
237
+ }
238
+ }
239
+ inFlight = false;
240
+ if (queued) {
241
+ queued = false;
242
+ setTimeout(compileAndPing, 50);
243
+ }
244
+ };
245
+ const schedule = (filePath) => {
246
+ pending.add(filePath);
247
+ if (timer)
248
+ clearTimeout(timer);
249
+ timer = setTimeout(compileAndPing, 250);
250
+ };
251
+ watcher.on('change', schedule);
252
+ watcher.on('add', schedule);
253
+ watcher.on('unlink', schedule);
254
+ watcher.on('ready', () => {
255
+ console.log(chalk.dim(` 👁 watching ${watchPaths.map(p => path.relative(opts.cwd, p) || '.').join(', ')} for changes`));
256
+ });
257
+ // Clean up on process exit
258
+ const stop = async () => {
259
+ try {
260
+ await watcher.close();
261
+ }
262
+ catch { /* noop */ }
263
+ };
264
+ process.on('SIGINT', () => { void stop(); });
265
+ process.on('SIGTERM', () => { void stop(); });
266
+ })().catch((e) => {
267
+ console.error(chalk.yellow(` ⚠ watch-recompile failed to start: ${e?.message ?? e}`));
268
+ });
269
+ }
152
270
  }
153
271
  function redactDbUrl(url) {
154
272
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import { Command } from '@oclif/core';
2
+ /**
3
+ * `os i18n extract` — scaffold translation skeletons.
4
+ *
5
+ * Walks the normalized stack config and emits ready-to-edit `TranslationData`
6
+ * fragments for every requested locale. Designed as the companion to
7
+ * `os i18n check`: extract bootstraps the bundle, check validates it.
8
+ */
9
+ export default class I18nExtract extends Command {
10
+ static description: string;
11
+ static examples: string[];
12
+ static args: {
13
+ config: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
14
+ };
15
+ static flags: {
16
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
17
+ 'default-locale': import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
18
+ locales: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
19
+ fill: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
20
+ filter: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
21
+ out: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
22
+ 'no-merge': import("@oclif/core/interfaces").BooleanFlag<boolean>;
23
+ 'objects-only': import("@oclif/core/interfaces").BooleanFlag<boolean>;
24
+ 'dry-run': import("@oclif/core/interfaces").BooleanFlag<boolean>;
25
+ };
26
+ run(): Promise<void>;
27
+ }
28
+ //# sourceMappingURL=extract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract.d.ts","sourceRoot":"","sources":["../../../src/commands/i18n/extract.ts"],"names":[],"mappings":"AAIA,OAAO,EAAQ,OAAO,EAAS,MAAM,aAAa,CAAC;AAgBnD;;;;;;GAMG;AACH,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,OAAO;IAC9C,OAAgB,WAAW,SACkH;IAE7I,OAAgB,QAAQ,WAMtB;IAEF,OAAgB,IAAI;;MAElB;IAEF,OAAgB,KAAK;;;;;;;;;;MAiCnB;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CA8F3B"}
@@ -0,0 +1,148 @@
1
+ // Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.
2
+ import fs from 'fs';
3
+ import path from 'path';
4
+ import { Args, Command, Flags } from '@oclif/core';
5
+ import chalk from 'chalk';
6
+ import { normalizeStackInput } from '@objectstack/spec';
7
+ import { loadConfig } from '../../utils/config.js';
8
+ import { printHeader, printSuccess, printError, printInfo, printStep, createTimer, } from '../../utils/format.js';
9
+ import { extractTranslations, renderTranslationModule } from '../../utils/i18n-extract.js';
10
+ const FILL_STRATEGIES = ['empty', 'default', 'todo'];
11
+ /**
12
+ * `os i18n extract` — scaffold translation skeletons.
13
+ *
14
+ * Walks the normalized stack config and emits ready-to-edit `TranslationData`
15
+ * fragments for every requested locale. Designed as the companion to
16
+ * `os i18n check`: extract bootstraps the bundle, check validates it.
17
+ */
18
+ export default class I18nExtract extends Command {
19
+ static description = 'Scaffold per-locale translation skeletons from a stack config. Default locale is filled from schema labels; other locales follow --fill.';
20
+ static examples = [
21
+ '$ os i18n extract',
22
+ '$ os i18n extract --locales=zh-CN,ja-JP,es-ES',
23
+ '$ os i18n extract --filter="^sys_" --out=./src/translations',
24
+ '$ os i18n extract --fill=default --out=./src/translations',
25
+ '$ os i18n extract --json',
26
+ ];
27
+ static args = {
28
+ config: Args.string({ description: 'Configuration file path', required: false }),
29
+ };
30
+ static flags = {
31
+ json: Flags.boolean({ description: 'Output JSON instead of writing files' }),
32
+ 'default-locale': Flags.string({
33
+ description: 'Locale filled from schema labels',
34
+ default: 'en',
35
+ }),
36
+ locales: Flags.string({
37
+ description: 'Comma-separated list of locales to emit (always includes default-locale)',
38
+ }),
39
+ fill: Flags.string({
40
+ description: 'How non-default locales are filled: empty | default | todo',
41
+ default: 'empty',
42
+ options: FILL_STRATEGIES,
43
+ }),
44
+ filter: Flags.string({
45
+ description: 'Regex; only entries matching objectName, appName or path are emitted',
46
+ }),
47
+ out: Flags.string({
48
+ description: 'Directory to write <locale>.objects.generated.ts files into',
49
+ }),
50
+ 'no-merge': Flags.boolean({
51
+ description: 'Do not merge against existing translations — emit every expected key',
52
+ default: false,
53
+ }),
54
+ 'objects-only': Flags.boolean({
55
+ description: 'Emit only the objects/globalActions subtree (default). Disable to include apps/dashboards.',
56
+ default: true,
57
+ allowNo: true,
58
+ }),
59
+ 'dry-run': Flags.boolean({
60
+ description: 'Print to stdout instead of writing to --out',
61
+ default: false,
62
+ }),
63
+ };
64
+ async run() {
65
+ const { args, flags } = await this.parse(I18nExtract);
66
+ const timer = createTimer();
67
+ if (!flags.json) {
68
+ printHeader('I18n Extract');
69
+ printStep('Loading configuration...');
70
+ }
71
+ try {
72
+ const { config, absolutePath } = await loadConfig(args.config);
73
+ if (!flags.json)
74
+ printInfo(`Config: ${chalk.white(absolutePath)}`);
75
+ const normalized = normalizeStackInput(config);
76
+ const filter = flags.filter ? new RegExp(flags.filter) : undefined;
77
+ const locales = flags.locales
78
+ ? flags.locales.split(',').map((s) => s.trim()).filter(Boolean)
79
+ : undefined;
80
+ const result = extractTranslations(normalized, {
81
+ defaultLocale: flags['default-locale'],
82
+ locales,
83
+ fill: flags.fill,
84
+ filter,
85
+ mergeExisting: !flags['no-merge'],
86
+ });
87
+ const localesEmitted = Object.keys(result.bundles);
88
+ const objectsOnly = flags['objects-only'];
89
+ if (flags.json) {
90
+ console.log(JSON.stringify({
91
+ totalExpected: result.totalExpected,
92
+ counts: result.counts,
93
+ bundles: objectsOnly
94
+ ? Object.fromEntries(localesEmitted.map((l) => [l, result.bundles[l].objects ?? {}]))
95
+ : result.bundles,
96
+ duration: timer.elapsed(),
97
+ }, null, 2));
98
+ return;
99
+ }
100
+ console.log('');
101
+ console.log(chalk.bold(' Skeleton summary'));
102
+ const nameWidth = Math.max(8, ...localesEmitted.map((l) => l.length));
103
+ for (const locale of localesEmitted) {
104
+ const n = result.counts[locale];
105
+ const tone = n === 0 ? chalk.green : chalk.yellow;
106
+ console.log(` ${locale.padEnd(nameWidth)} ${tone(String(n).padStart(5))} key(s)` +
107
+ chalk.dim(` (of ${result.totalExpected} expected)`));
108
+ }
109
+ console.log('');
110
+ if (flags['dry-run'] || !flags.out) {
111
+ for (const locale of localesEmitted) {
112
+ if (result.counts[locale] === 0)
113
+ continue;
114
+ console.log(chalk.dim(`── ${locale} ──`));
115
+ console.log(renderTranslationModule(result.bundles[locale], {
116
+ locale,
117
+ objectsOnly,
118
+ }));
119
+ }
120
+ printInfo('Dry run — no files written (pass --out=<dir> to write).');
121
+ return;
122
+ }
123
+ const outDir = path.resolve(process.cwd(), flags.out);
124
+ fs.mkdirSync(outDir, { recursive: true });
125
+ let written = 0;
126
+ for (const locale of localesEmitted) {
127
+ if (result.counts[locale] === 0)
128
+ continue;
129
+ const file = path.join(outDir, `${locale}.objects.generated.ts`);
130
+ fs.writeFileSync(file, renderTranslationModule(result.bundles[locale], { locale, objectsOnly }), 'utf8');
131
+ written += 1;
132
+ printInfo(`Wrote ${chalk.white(path.relative(process.cwd(), file))} (${result.counts[locale]} keys)`);
133
+ }
134
+ console.log('');
135
+ printSuccess(`Generated ${written} file(s) ${chalk.dim(`(${timer.display()})`)}`);
136
+ }
137
+ catch (error) {
138
+ if (flags.json) {
139
+ console.log(JSON.stringify({ error: error.message }));
140
+ process.exit(1);
141
+ }
142
+ console.log('');
143
+ printError(error.message || String(error));
144
+ process.exit(1);
145
+ }
146
+ }
147
+ }
148
+ //# sourceMappingURL=extract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract.js","sourceRoot":"","sources":["../../../src/commands/i18n/extract.ts"],"names":[],"mappings":"AAAA,yEAAyE;AAEzE,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EACL,WAAW,EACX,YAAY,EACZ,UAAU,EACV,SAAS,EACT,SAAS,EACT,WAAW,GACZ,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,mBAAmB,EAAE,uBAAuB,EAAqB,MAAM,6BAA6B,CAAC;AAE9G,MAAM,eAAe,GAAmB,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;AAErE;;;;;;GAMG;AACH,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,OAAO;IAC9C,MAAM,CAAU,WAAW,GACzB,0IAA0I,CAAC;IAE7I,MAAM,CAAU,QAAQ,GAAG;QACzB,mBAAmB;QACnB,+CAA+C;QAC/C,6DAA6D;QAC7D,2DAA2D;QAC3D,0BAA0B;KAC3B,CAAC;IAEF,MAAM,CAAU,IAAI,GAAG;QACrB,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,yBAAyB,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;KACjF,CAAC;IAEF,MAAM,CAAU,KAAK,GAAG;QACtB,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,sCAAsC,EAAE,CAAC;QAC5E,gBAAgB,EAAE,KAAK,CAAC,MAAM,CAAC;YAC7B,WAAW,EAAE,kCAAkC;YAC/C,OAAO,EAAE,IAAI;SACd,CAAC;QACF,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC;YACpB,WAAW,EAAE,0EAA0E;SACxF,CAAC;QACF,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC;YACjB,WAAW,EAAE,4DAA4D;YACzE,OAAO,EAAE,OAAO;YAChB,OAAO,EAAE,eAAsC;SAChD,CAAC;QACF,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC;YACnB,WAAW,EAAE,sEAAsE;SACpF,CAAC;QACF,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC;YAChB,WAAW,EAAE,6DAA6D;SAC3E,CAAC;QACF,UAAU,EAAE,KAAK,CAAC,OAAO,CAAC;YACxB,WAAW,EAAE,sEAAsE;YACnF,OAAO,EAAE,KAAK;SACf,CAAC;QACF,cAAc,EAAE,KAAK,CAAC,OAAO,CAAC;YAC5B,WAAW,EAAE,4FAA4F;YACzG,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,IAAI;SACd,CAAC;QACF,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC;YACvB,WAAW,EAAE,6CAA6C;YAC1D,OAAO,EAAE,KAAK;SACf,CAAC;KACH,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACtD,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;QAE5B,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YAChB,WAAW,CAAC,cAAc,CAAC,CAAC;YAC5B,SAAS,CAAC,0BAA0B,CAAC,CAAC;QACxC,CAAC;QAED,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC/D,IAAI,CAAC,KAAK,CAAC,IAAI;gBAAE,SAAS,CAAC,WAAW,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;YAEnE,MAAM,UAAU,GAAG,mBAAmB,CAAC,MAAiC,CAAC,CAAC;YAC1E,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YACnE,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO;gBAC3B,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;gBAC/D,CAAC,CAAC,SAAS,CAAC;YAEd,MAAM,MAAM,GAAG,mBAAmB,CAAC,UAAU,EAAE;gBAC7C,aAAa,EAAE,KAAK,CAAC,gBAAgB,CAAC;gBACtC,OAAO;gBACP,IAAI,EAAE,KAAK,CAAC,IAAoB;gBAChC,MAAM;gBACN,aAAa,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC;aAClC,CAAC,CAAC;YAEH,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACnD,MAAM,WAAW,GAAG,KAAK,CAAC,cAAc,CAAC,CAAC;YAE1C,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;gBACf,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;oBACzB,aAAa,EAAE,MAAM,CAAC,aAAa;oBACnC,MAAM,EAAE,MAAM,CAAC,MAAM;oBACrB,OAAO,EAAE,WAAW;wBAClB,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;wBACrF,CAAC,CAAC,MAAM,CAAC,OAAO;oBAClB,QAAQ,EAAE,KAAK,CAAC,OAAO,EAAE;iBAC1B,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;gBACb,OAAO;YACT,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC;YAC9C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;YACtE,KAAK,MAAM,MAAM,IAAI,cAAc,EAAE,CAAC;gBACpC,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBAChC,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;gBAClD,OAAO,CAAC,GAAG,CACT,OAAO,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS;oBACvE,KAAK,CAAC,GAAG,CAAC,SAAS,MAAM,CAAC,aAAa,YAAY,CAAC,CACrD,CAAC;YACJ,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAEhB,IAAI,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;gBACnC,KAAK,MAAM,MAAM,IAAI,cAAc,EAAE,CAAC;oBACpC,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;wBAAE,SAAS;oBAC1C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,MAAM,KAAK,CAAC,CAAC,CAAC;oBAC1C,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;wBAC1D,MAAM;wBACN,WAAW;qBACZ,CAAC,CAAC,CAAC;gBACN,CAAC;gBACD,SAAS,CAAC,yDAAyD,CAAC,CAAC;gBACrE,OAAO;YACT,CAAC;YAED,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;YACtD,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1C,IAAI,OAAO,GAAG,CAAC,CAAC;YAChB,KAAK,MAAM,MAAM,IAAI,cAAc,EAAE,CAAC;gBACpC,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;oBAAE,SAAS;gBAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,MAAM,uBAAuB,CAAC,CAAC;gBACjE,EAAE,CAAC,aAAa,CACd,IAAI,EACJ,uBAAuB,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,EACxE,MAAM,CACP,CAAC;gBACF,OAAO,IAAI,CAAC,CAAC;gBACb,SAAS,CAAC,SAAS,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YACxG,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,YAAY,CAAC,aAAa,OAAO,YAAY,KAAK,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QACpF,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;gBACf,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;gBACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,UAAU,CAAC,KAAK,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC"}
@@ -0,0 +1,102 @@
1
+ /**
2
+ * I18n Extractor
3
+ *
4
+ * Companion to `i18n-coverage.ts`. Where coverage *detects* missing keys,
5
+ * extract *scaffolds* the bundle: it walks a normalized stack config and
6
+ * produces ready-to-edit `TranslationData` skeletons for every requested
7
+ * locale, pre-populated with the source labels from the schema for the
8
+ * default locale.
9
+ *
10
+ * Walk surface (kept superset-aligned with the coverage detector plus the
11
+ * known coverage gap of object-nested `listViews` / inline `actions`):
12
+ *
13
+ * objects.<name>.label
14
+ * objects.<name>.pluralLabel
15
+ * objects.<name>.description
16
+ * objects.<name>.fields.<field>.label
17
+ * objects.<name>.fields.<field>.help
18
+ * objects.<name>.fields.<field>.placeholder
19
+ * objects.<name>.fields.<field>.options.<value>
20
+ * objects.<name>._views.<view>.label
21
+ * objects.<name>._views.<view>.description
22
+ * objects.<name>._actions.<action>.label
23
+ * objects.<name>._actions.<action>.confirmText
24
+ * objects.<name>._actions.<action>.successMessage
25
+ * globalActions.<action>.label / .confirmText / .successMessage
26
+ * apps.<app>.label / .description
27
+ * apps.<app>.navigation.<id>.label
28
+ * dashboards.<dash>.label / .description
29
+ * dashboards.<dash>.widgets.<w>.title / .description
30
+ *
31
+ * Pure: no filesystem or network. Safe to call from the CLI, IDE tooling
32
+ * and unit tests.
33
+ */
34
+ import type { TranslationData } from '@objectstack/spec/system';
35
+ /** A single translation entry — path + source value carried from the schema. */
36
+ export interface ExpectedEntry {
37
+ /** Lookup path expressed as an array of segments. */
38
+ path: string[];
39
+ /** Source-of-truth string (typically the English literal on the schema). */
40
+ sourceValue: string;
41
+ /** What kind of metadata this entry was harvested from. */
42
+ source: 'object' | 'field' | 'option' | 'view' | 'action' | 'globalAction' | 'app' | 'navigation' | 'dashboard' | 'widget';
43
+ /** Object name when applicable (for `--filter` matching). */
44
+ objectName?: string;
45
+ /** App name when applicable (for `--filter` matching). */
46
+ appName?: string;
47
+ }
48
+ export type FillStrategy = 'empty' | 'default' | 'todo';
49
+ export interface ExtractOptions {
50
+ /** Default locale (filled with source values). Defaults to `'en'`. */
51
+ defaultLocale?: string;
52
+ /** Locales to emit. Defaults to `[defaultLocale]`. */
53
+ locales?: string[];
54
+ /**
55
+ * How to populate values for non-default locales:
56
+ * - `'empty'` → empty string (default)
57
+ * - `'default'` → copy source value verbatim
58
+ * - `'todo'` → source value with a `[TODO] ` prefix
59
+ */
60
+ fill?: FillStrategy;
61
+ /**
62
+ * Regex filter applied against `objectName` / `appName` / `dashboard` / view
63
+ * / action identifiers. When provided, only matching entries are emitted.
64
+ */
65
+ filter?: RegExp;
66
+ /**
67
+ * When true, entries that already exist in any of the stack's
68
+ * `translations` bundles for a given locale are *omitted* for that locale.
69
+ * This makes extract idempotent — re-running only fills the gaps.
70
+ */
71
+ mergeExisting?: boolean;
72
+ }
73
+ export interface ExtractResult {
74
+ /** Locale → TranslationData skeleton (only the entries we emitted). */
75
+ bundles: Record<string, TranslationData>;
76
+ /** Locale → number of keys emitted. */
77
+ counts: Record<string, number>;
78
+ /** Total expected entries before per-locale merge filtering. */
79
+ totalExpected: number;
80
+ }
81
+ /** Collect every translatable entry from a normalized stack config. */
82
+ export declare function collectExpectedEntries(config: any): ExpectedEntry[];
83
+ /**
84
+ * Build per-locale skeleton bundles from a normalized stack config.
85
+ */
86
+ export declare function extractTranslations(config: any, opts?: ExtractOptions): ExtractResult;
87
+ /**
88
+ * Render a TranslationData skeleton as a TypeScript module body.
89
+ *
90
+ * The module exports a single named const (`<exportName>`) typed as
91
+ * `TranslationData['objects']` (or the full `TranslationData` shape when
92
+ * the skeleton contains non-objects sections).
93
+ */
94
+ export declare function renderTranslationModule(data: TranslationData, options: {
95
+ locale: string;
96
+ exportName?: string;
97
+ /** When true, emit only the `objects` sub-tree (typed accordingly). */
98
+ objectsOnly?: boolean;
99
+ /** Header comment lines. */
100
+ header?: string[];
101
+ }): string;
102
+ //# sourceMappingURL=i18n-extract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n-extract.d.ts","sourceRoot":"","sources":["../../src/utils/i18n-extract.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,KAAK,EAAqB,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAInF,gFAAgF;AAChF,MAAM,WAAW,aAAa;IAC5B,qDAAqD;IACrD,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,4EAA4E;IAC5E,WAAW,EAAE,MAAM,CAAC;IACpB,2DAA2D;IAC3D,MAAM,EACF,QAAQ,GACR,OAAO,GACP,QAAQ,GACR,MAAM,GACN,QAAQ,GACR,cAAc,GACd,KAAK,GACL,YAAY,GACZ,WAAW,GACX,QAAQ,CAAC;IACb,6DAA6D;IAC7D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0DAA0D;IAC1D,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;AAExD,MAAM,WAAW,cAAc;IAC7B,sEAAsE;IACtE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,sDAAsD;IACtD,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB;;;;;OAKG;IACH,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,uEAAuE;IACvE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IACzC,uCAAuC;IACvC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,gEAAgE;IAChE,aAAa,EAAE,MAAM,CAAC;CACvB;AAmBD,uEAAuE;AACvE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,GAAG,GAAG,aAAa,EAAE,CAwJnE;AAkED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,GAAE,cAAmB,GAAG,aAAa,CA2CzF;AAID;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,eAAe,EACrB,OAAO,EAAE;IACP,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uEAAuE;IACvE,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,4BAA4B;IAC5B,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB,GACA,MAAM,CAyBR"}
@@ -0,0 +1,332 @@
1
+ // Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.
2
+ // ─── Walk helpers ──────────────────────────────────────────────────────
3
+ function viewObjectName(view) {
4
+ return view?.objectName ?? view?.object ?? view?.data?.object;
5
+ }
6
+ function pushEntry(out, path, sourceValue, source, extra) {
7
+ if (typeof sourceValue !== 'string')
8
+ return;
9
+ out.push({ path, sourceValue, source, ...extra });
10
+ }
11
+ /** Collect every translatable entry from a normalized stack config. */
12
+ export function collectExpectedEntries(config) {
13
+ const out = [];
14
+ // ── Objects ───────────────────────────────────────────────────────
15
+ const objects = Array.isArray(config?.objects) ? config.objects : [];
16
+ for (const obj of objects) {
17
+ if (!obj?.name)
18
+ continue;
19
+ const objectName = obj.name;
20
+ pushEntry(out, ['objects', objectName, 'label'], obj.label ?? objectName, 'object', { objectName });
21
+ if (obj.pluralLabel) {
22
+ pushEntry(out, ['objects', objectName, 'pluralLabel'], obj.pluralLabel, 'object', { objectName });
23
+ }
24
+ if (obj.description) {
25
+ pushEntry(out, ['objects', objectName, 'description'], obj.description, 'object', { objectName });
26
+ }
27
+ // Fields (always a record on normalized schemas)
28
+ if (obj.fields && typeof obj.fields === 'object') {
29
+ for (const [fieldName, raw] of Object.entries(obj.fields)) {
30
+ const field = raw ?? {};
31
+ pushEntry(out, ['objects', objectName, 'fields', fieldName, 'label'], field.label ?? fieldName, 'field', { objectName });
32
+ const help = field.help ?? field.description;
33
+ if (help) {
34
+ pushEntry(out, ['objects', objectName, 'fields', fieldName, 'help'], help, 'field', { objectName });
35
+ }
36
+ if (field.placeholder) {
37
+ pushEntry(out, ['objects', objectName, 'fields', fieldName, 'placeholder'], field.placeholder, 'field', { objectName });
38
+ }
39
+ // Options — accept either `{value, label}[]` arrays or a record map.
40
+ const opts = field.options;
41
+ if (Array.isArray(opts)) {
42
+ for (const opt of opts) {
43
+ if (opt && typeof opt === 'object' && 'value' in opt) {
44
+ pushEntry(out, ['objects', objectName, 'fields', fieldName, 'options', String(opt.value)], String(opt.label ?? opt.value), 'option', { objectName });
45
+ }
46
+ else if (typeof opt === 'string') {
47
+ pushEntry(out, ['objects', objectName, 'fields', fieldName, 'options', opt], opt, 'option', { objectName });
48
+ }
49
+ }
50
+ }
51
+ else if (opts && typeof opts === 'object') {
52
+ for (const [value, label] of Object.entries(opts)) {
53
+ pushEntry(out, ['objects', objectName, 'fields', fieldName, 'options', value], typeof label === 'string' ? label : String(value), 'option', { objectName });
54
+ }
55
+ }
56
+ }
57
+ }
58
+ // Object-nested listViews (object-protocol view bundle).
59
+ if (obj.listViews && typeof obj.listViews === 'object') {
60
+ for (const [viewName, raw] of Object.entries(obj.listViews)) {
61
+ const view = raw ?? {};
62
+ pushEntry(out, ['objects', objectName, '_views', viewName, 'label'], view.label ?? viewName, 'view', { objectName });
63
+ if (view.description) {
64
+ pushEntry(out, ['objects', objectName, '_views', viewName, 'description'], view.description, 'view', { objectName });
65
+ }
66
+ }
67
+ }
68
+ // Inline object-level actions (some schemas declare them on the object).
69
+ if (Array.isArray(obj.actions)) {
70
+ for (const action of obj.actions) {
71
+ if (!action?.name)
72
+ continue;
73
+ const aname = action.name;
74
+ pushEntry(out, ['objects', objectName, '_actions', aname, 'label'], action.label ?? aname, 'action', { objectName });
75
+ if (action.confirmText) {
76
+ pushEntry(out, ['objects', objectName, '_actions', aname, 'confirmText'], action.confirmText, 'action', { objectName });
77
+ }
78
+ if (action.successMessage) {
79
+ pushEntry(out, ['objects', objectName, '_actions', aname, 'successMessage'], action.successMessage, 'action', { objectName });
80
+ }
81
+ }
82
+ }
83
+ }
84
+ // ── Top-level views (legacy / cross-object) ──────────────────────
85
+ const views = Array.isArray(config?.views) ? config.views : [];
86
+ for (const view of views) {
87
+ if (!view?.name)
88
+ continue;
89
+ const objectName = viewObjectName(view);
90
+ if (!objectName)
91
+ continue;
92
+ pushEntry(out, ['objects', objectName, '_views', view.name, 'label'], view.label ?? view.name, 'view', { objectName });
93
+ if (view.description) {
94
+ pushEntry(out, ['objects', objectName, '_views', view.name, 'description'], view.description, 'view', { objectName });
95
+ }
96
+ }
97
+ // ── Top-level actions ────────────────────────────────────────────
98
+ const actions = Array.isArray(config?.actions) ? config.actions : [];
99
+ for (const action of actions) {
100
+ if (!action?.name)
101
+ continue;
102
+ const objectName = action.objectName ?? action.object;
103
+ const root = objectName
104
+ ? ['objects', objectName, '_actions', action.name]
105
+ : ['globalActions', action.name];
106
+ const kind = objectName ? 'action' : 'globalAction';
107
+ pushEntry(out, [...root, 'label'], action.label ?? action.name, kind, { objectName });
108
+ if (action.confirmText) {
109
+ pushEntry(out, [...root, 'confirmText'], action.confirmText, kind, { objectName });
110
+ }
111
+ if (action.successMessage) {
112
+ pushEntry(out, [...root, 'successMessage'], action.successMessage, kind, { objectName });
113
+ }
114
+ }
115
+ // ── Apps + navigation ────────────────────────────────────────────
116
+ const apps = Array.isArray(config?.apps) ? config.apps : [];
117
+ for (const app of apps) {
118
+ if (!app?.name)
119
+ continue;
120
+ const appName = app.name;
121
+ if (app.label)
122
+ pushEntry(out, ['apps', appName, 'label'], app.label, 'app', { appName });
123
+ if (app.description) {
124
+ pushEntry(out, ['apps', appName, 'description'], app.description, 'app', { appName });
125
+ }
126
+ const nav = Array.isArray(app.navigation) ? app.navigation : [];
127
+ walkNavigation(nav, appName, out);
128
+ }
129
+ // ── Dashboards + widgets ─────────────────────────────────────────
130
+ const dashboards = Array.isArray(config?.dashboards) ? config.dashboards : [];
131
+ for (const dash of dashboards) {
132
+ if (!dash?.name)
133
+ continue;
134
+ const name = dash.name;
135
+ if (dash.label)
136
+ pushEntry(out, ['dashboards', name, 'label'], dash.label, 'dashboard');
137
+ if (dash.description) {
138
+ pushEntry(out, ['dashboards', name, 'description'], dash.description, 'dashboard');
139
+ }
140
+ const widgets = Array.isArray(dash.widgets) ? dash.widgets : [];
141
+ for (const w of widgets) {
142
+ if (!w?.id && !w?.name)
143
+ continue;
144
+ const wid = (w.id ?? w.name);
145
+ if (w.title)
146
+ pushEntry(out, ['dashboards', name, 'widgets', wid, 'title'], w.title, 'widget');
147
+ if (w.description) {
148
+ pushEntry(out, ['dashboards', name, 'widgets', wid, 'description'], w.description, 'widget');
149
+ }
150
+ }
151
+ }
152
+ return out;
153
+ }
154
+ function walkNavigation(nav, appName, out) {
155
+ for (const item of nav) {
156
+ if (!item)
157
+ continue;
158
+ const id = item.id ?? item.name;
159
+ if (id && item.label) {
160
+ pushEntry(out, ['apps', appName, 'navigation', id, 'label'], item.label, 'navigation', { appName });
161
+ }
162
+ if (Array.isArray(item.items))
163
+ walkNavigation(item.items, appName, out);
164
+ if (Array.isArray(item.children))
165
+ walkNavigation(item.children, appName, out);
166
+ }
167
+ }
168
+ // ─── Filter + bundle assembly ──────────────────────────────────────────
169
+ function passesFilter(entry, filter) {
170
+ if (!filter)
171
+ return true;
172
+ if (entry.objectName && filter.test(entry.objectName))
173
+ return true;
174
+ if (entry.appName && filter.test(entry.appName))
175
+ return true;
176
+ // Allow matching against the joined path so users can target e.g. ^dashboards\.system_
177
+ return filter.test(entry.path.join('.'));
178
+ }
179
+ function setDeep(data, path, value) {
180
+ let cur = data;
181
+ for (let i = 0; i < path.length - 1; i++) {
182
+ const seg = path[i];
183
+ if (typeof cur[seg] !== 'object' || cur[seg] === null)
184
+ cur[seg] = {};
185
+ cur = cur[seg];
186
+ }
187
+ cur[path[path.length - 1]] = value;
188
+ }
189
+ function lookupDeep(data, path) {
190
+ let cur = data;
191
+ for (const seg of path) {
192
+ if (!cur || typeof cur !== 'object')
193
+ return undefined;
194
+ cur = cur[seg];
195
+ }
196
+ return typeof cur === 'string' && cur.length > 0 ? cur : undefined;
197
+ }
198
+ function mergeBundles(bundles) {
199
+ const out = {};
200
+ for (const bundle of bundles) {
201
+ if (!bundle || typeof bundle !== 'object')
202
+ continue;
203
+ for (const [locale, data] of Object.entries(bundle)) {
204
+ if (!data || typeof data !== 'object')
205
+ continue;
206
+ out[locale] = deepMerge(out[locale] ?? {}, data);
207
+ }
208
+ }
209
+ return out;
210
+ }
211
+ function deepMerge(target, source) {
212
+ for (const [k, v] of Object.entries(source)) {
213
+ if (v && typeof v === 'object' && !Array.isArray(v)) {
214
+ target[k] = deepMerge((target[k] ?? {}), v);
215
+ }
216
+ else {
217
+ target[k] = v;
218
+ }
219
+ }
220
+ return target;
221
+ }
222
+ /**
223
+ * Build per-locale skeleton bundles from a normalized stack config.
224
+ */
225
+ export function extractTranslations(config, opts = {}) {
226
+ const defaultLocale = opts.defaultLocale ?? 'en';
227
+ const locales = opts.locales && opts.locales.length > 0
228
+ ? Array.from(new Set([defaultLocale, ...opts.locales]))
229
+ : [defaultLocale];
230
+ const fill = opts.fill ?? 'empty';
231
+ const allEntries = collectExpectedEntries(config);
232
+ const entries = allEntries.filter((e) => passesFilter(e, opts.filter));
233
+ const existingBundles = Array.isArray(config?.translations) ? config.translations : [];
234
+ const existing = mergeBundles(existingBundles);
235
+ const bundles = {};
236
+ const counts = {};
237
+ for (const locale of locales) {
238
+ const data = {};
239
+ let count = 0;
240
+ for (const entry of entries) {
241
+ // Skip keys that already have a non-empty translation for this locale.
242
+ if (opts.mergeExisting !== false) {
243
+ const existingValue = lookupDeep(existing[locale], entry.path);
244
+ if (existingValue !== undefined)
245
+ continue;
246
+ }
247
+ let value;
248
+ if (locale === defaultLocale) {
249
+ value = entry.sourceValue;
250
+ }
251
+ else if (fill === 'default') {
252
+ value = entry.sourceValue;
253
+ }
254
+ else if (fill === 'todo') {
255
+ value = `[TODO] ${entry.sourceValue}`;
256
+ }
257
+ else {
258
+ value = '';
259
+ }
260
+ setDeep(data, entry.path, value);
261
+ count += 1;
262
+ }
263
+ bundles[locale] = data;
264
+ counts[locale] = count;
265
+ }
266
+ return { bundles, counts, totalExpected: entries.length };
267
+ }
268
+ // ─── Serialization ─────────────────────────────────────────────────────
269
+ /**
270
+ * Render a TranslationData skeleton as a TypeScript module body.
271
+ *
272
+ * The module exports a single named const (`<exportName>`) typed as
273
+ * `TranslationData['objects']` (or the full `TranslationData` shape when
274
+ * the skeleton contains non-objects sections).
275
+ */
276
+ export function renderTranslationModule(data, options) {
277
+ const exportName = options.exportName ?? `${camelize(options.locale)}Objects`;
278
+ const objectsOnly = options.objectsOnly ?? true;
279
+ const payload = objectsOnly ? (data.objects ?? {}) : data;
280
+ const typeSig = objectsOnly
281
+ ? "NonNullable<TranslationData['objects']>"
282
+ : 'TranslationData';
283
+ const header = options.header ?? [
284
+ `Auto-generated by 'os i18n extract' for locale '${options.locale}'.`,
285
+ 'Edit translations in place; re-run extract (with --merge) to fill new gaps.',
286
+ 'Do not hand-edit the structure — only the leaf string values.',
287
+ ];
288
+ const lines = [];
289
+ lines.push('// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.');
290
+ lines.push('');
291
+ lines.push('/**');
292
+ for (const h of header)
293
+ lines.push(` * ${h}`);
294
+ lines.push(' */');
295
+ lines.push('');
296
+ lines.push("import type { TranslationData } from '@objectstack/spec/system';");
297
+ lines.push('');
298
+ lines.push(`export const ${exportName}: ${typeSig} = ${stringifyTs(payload, 0)};`);
299
+ lines.push('');
300
+ return lines.join('\n');
301
+ }
302
+ function camelize(locale) {
303
+ // 'zh-CN' → 'zhCN', 'ja-JP' → 'jaJP', 'es-ES' → 'esES'
304
+ return locale.replace(/-(.)/g, (_m, c) => c.toUpperCase());
305
+ }
306
+ function stringifyTs(value, indent) {
307
+ const pad = ' '.repeat(indent);
308
+ const pad2 = ' '.repeat(indent + 1);
309
+ if (value === null)
310
+ return 'null';
311
+ if (typeof value === 'string')
312
+ return JSON.stringify(value);
313
+ if (typeof value === 'number' || typeof value === 'boolean')
314
+ return String(value);
315
+ if (Array.isArray(value)) {
316
+ if (value.length === 0)
317
+ return '[]';
318
+ return '[\n' + value.map((v) => pad2 + stringifyTs(v, indent + 1)).join(',\n') + `\n${pad}]`;
319
+ }
320
+ if (typeof value === 'object') {
321
+ const entries = Object.entries(value);
322
+ if (entries.length === 0)
323
+ return '{}';
324
+ return '{\n' + entries.map(([k, v]) => `${pad2}${formatKey(k)}: ${stringifyTs(v, indent + 1)}`).join(',\n') + `\n${pad}}`;
325
+ }
326
+ return JSON.stringify(value);
327
+ }
328
+ const IDENT_RE = /^[A-Za-z_$][A-Za-z0-9_$]*$/;
329
+ function formatKey(key) {
330
+ return IDENT_RE.test(key) ? key : JSON.stringify(key);
331
+ }
332
+ //# sourceMappingURL=i18n-extract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n-extract.js","sourceRoot":"","sources":["../../src/utils/i18n-extract.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@objectstack/cli",
3
- "version": "4.1.0",
3
+ "version": "4.2.0",
4
4
  "description": "Command Line Interface for ObjectStack Protocol",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -33,48 +33,49 @@
33
33
  "topicSeparator": " "
34
34
  },
35
35
  "dependencies": {
36
- "@ai-sdk/gateway": "^3.0.116",
36
+ "@ai-sdk/gateway": "^3.0.119",
37
37
  "@oclif/core": "^4.11.3",
38
38
  "bundle-require": "^5.1.0",
39
39
  "chalk": "^5.6.2",
40
+ "chokidar": "^5.0.0",
40
41
  "dotenv-flow": "^4.1.0",
41
42
  "esbuild": "^0.28.0",
42
43
  "tsx": "^4.22.3",
43
44
  "yaml": "^2.9.0",
44
45
  "zod": "^4.4.3",
45
- "@objectstack/client": "4.1.0",
46
- "@objectstack/core": "4.1.0",
47
- "@objectstack/driver-memory": "^4.1.0",
48
- "@objectstack/driver-mongodb": "^4.1.0",
49
- "@objectstack/driver-sql": "^4.1.0",
50
- "@objectstack/driver-turso": "^4.1.0",
51
- "@objectstack/objectql": "^4.1.0",
52
- "@objectstack/plugin-approvals": "4.0.1",
53
- "@objectstack/plugin-audit": "4.1.0",
54
- "@objectstack/plugin-auth": "4.1.0",
55
- "@objectstack/plugin-email": "4.0.1",
56
- "@objectstack/plugin-hono-server": "4.1.0",
57
- "@objectstack/plugin-mcp-server": "4.1.0",
58
- "@objectstack/plugin-reports": "4.0.1",
59
- "@objectstack/plugin-security": "4.1.0",
60
- "@objectstack/plugin-sharing": "4.0.1",
61
- "@objectstack/rest": "4.1.0",
62
- "@objectstack/runtime": "^4.1.0",
63
- "@objectstack/service-ai": "4.1.0",
64
- "@objectstack/service-analytics": "4.1.0",
65
- "@objectstack/service-automation": "4.1.0",
66
- "@objectstack/service-cache": "4.1.0",
67
- "@objectstack/service-feed": "4.1.0",
68
- "@objectstack/service-job": "4.1.0",
69
- "@objectstack/service-package": "4.1.0",
70
- "@objectstack/service-queue": "4.1.0",
71
- "@objectstack/service-realtime": "4.1.0",
72
- "@objectstack/service-settings": "0.1.1",
73
- "@objectstack/service-storage": "4.1.0",
74
- "@objectstack/spec": "4.1.0"
46
+ "@objectstack/client": "4.2.0",
47
+ "@objectstack/core": "4.2.0",
48
+ "@objectstack/driver-memory": "^4.2.0",
49
+ "@objectstack/driver-mongodb": "^4.2.0",
50
+ "@objectstack/driver-sql": "^4.2.0",
51
+ "@objectstack/driver-turso": "^4.2.0",
52
+ "@objectstack/objectql": "^4.2.0",
53
+ "@objectstack/plugin-approvals": "4.2.0",
54
+ "@objectstack/plugin-audit": "4.2.0",
55
+ "@objectstack/plugin-auth": "4.2.0",
56
+ "@objectstack/plugin-email": "4.2.0",
57
+ "@objectstack/plugin-hono-server": "4.2.0",
58
+ "@objectstack/plugin-mcp-server": "4.2.0",
59
+ "@objectstack/plugin-reports": "4.2.0",
60
+ "@objectstack/plugin-security": "4.2.0",
61
+ "@objectstack/plugin-sharing": "4.2.0",
62
+ "@objectstack/rest": "4.2.0",
63
+ "@objectstack/runtime": "^4.2.0",
64
+ "@objectstack/service-ai": "4.2.0",
65
+ "@objectstack/service-analytics": "4.2.0",
66
+ "@objectstack/service-automation": "4.2.0",
67
+ "@objectstack/service-cache": "4.2.0",
68
+ "@objectstack/service-feed": "4.2.0",
69
+ "@objectstack/service-job": "4.2.0",
70
+ "@objectstack/service-package": "4.2.0",
71
+ "@objectstack/service-queue": "4.2.0",
72
+ "@objectstack/service-realtime": "4.2.0",
73
+ "@objectstack/service-settings": "4.2.0",
74
+ "@objectstack/service-storage": "4.2.0",
75
+ "@objectstack/spec": "4.2.0"
75
76
  },
76
77
  "peerDependencies": {
77
- "@objectstack/core": "^4.1.0"
78
+ "@objectstack/core": "^4.2.0"
78
79
  },
79
80
  "devDependencies": {
80
81
  "@oclif/plugin-help": "^6.2.49",