@objectstack/cli 4.1.0 → 4.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/i18n/extract.d.ts +28 -0
- package/dist/commands/i18n/extract.d.ts.map +1 -0
- package/dist/commands/i18n/extract.js +148 -0
- package/dist/commands/i18n/extract.js.map +1 -0
- package/dist/utils/i18n-extract.d.ts +102 -0
- package/dist/utils/i18n-extract.d.ts.map +1 -0
- package/dist/utils/i18n-extract.js +332 -0
- package/dist/utils/i18n-extract.js.map +1 -0
- package/package.json +32 -32
|
@@ -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":"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"}
|
|
@@ -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.
|
|
3
|
+
"version": "4.1.1",
|
|
4
4
|
"description": "Command Line Interface for ObjectStack Protocol",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -42,39 +42,39 @@
|
|
|
42
42
|
"tsx": "^4.22.3",
|
|
43
43
|
"yaml": "^2.9.0",
|
|
44
44
|
"zod": "^4.4.3",
|
|
45
|
-
"@objectstack/client": "4.1.
|
|
46
|
-
"@objectstack/core": "4.1.
|
|
47
|
-
"@objectstack/driver-memory": "^4.1.
|
|
48
|
-
"@objectstack/driver-mongodb": "^4.1.
|
|
49
|
-
"@objectstack/driver-sql": "^4.1.
|
|
50
|
-
"@objectstack/driver-turso": "^4.1.
|
|
51
|
-
"@objectstack/objectql": "^4.1.
|
|
52
|
-
"@objectstack/plugin-approvals": "4.
|
|
53
|
-
"@objectstack/plugin-audit": "4.1.
|
|
54
|
-
"@objectstack/plugin-auth": "4.1.
|
|
55
|
-
"@objectstack/plugin-email": "4.
|
|
56
|
-
"@objectstack/plugin-hono-server": "4.1.
|
|
57
|
-
"@objectstack/plugin-mcp-server": "4.1.
|
|
58
|
-
"@objectstack/plugin-reports": "4.
|
|
59
|
-
"@objectstack/plugin-security": "4.1.
|
|
60
|
-
"@objectstack/plugin-sharing": "4.
|
|
61
|
-
"@objectstack/rest": "4.1.
|
|
62
|
-
"@objectstack/runtime": "^4.1.
|
|
63
|
-
"@objectstack/service-ai": "4.1.
|
|
64
|
-
"@objectstack/service-analytics": "4.1.
|
|
65
|
-
"@objectstack/service-automation": "4.1.
|
|
66
|
-
"@objectstack/service-cache": "4.1.
|
|
67
|
-
"@objectstack/service-feed": "4.1.
|
|
68
|
-
"@objectstack/service-job": "4.1.
|
|
69
|
-
"@objectstack/service-package": "4.1.
|
|
70
|
-
"@objectstack/service-queue": "4.1.
|
|
71
|
-
"@objectstack/service-realtime": "4.1.
|
|
72
|
-
"@objectstack/service-settings": "
|
|
73
|
-
"@objectstack/service-storage": "4.1.
|
|
74
|
-
"@objectstack/spec": "4.1.
|
|
45
|
+
"@objectstack/client": "4.1.1",
|
|
46
|
+
"@objectstack/core": "4.1.1",
|
|
47
|
+
"@objectstack/driver-memory": "^4.1.1",
|
|
48
|
+
"@objectstack/driver-mongodb": "^4.1.1",
|
|
49
|
+
"@objectstack/driver-sql": "^4.1.1",
|
|
50
|
+
"@objectstack/driver-turso": "^4.1.1",
|
|
51
|
+
"@objectstack/objectql": "^4.1.1",
|
|
52
|
+
"@objectstack/plugin-approvals": "4.1.1",
|
|
53
|
+
"@objectstack/plugin-audit": "4.1.1",
|
|
54
|
+
"@objectstack/plugin-auth": "4.1.1",
|
|
55
|
+
"@objectstack/plugin-email": "4.1.1",
|
|
56
|
+
"@objectstack/plugin-hono-server": "4.1.1",
|
|
57
|
+
"@objectstack/plugin-mcp-server": "4.1.1",
|
|
58
|
+
"@objectstack/plugin-reports": "4.1.1",
|
|
59
|
+
"@objectstack/plugin-security": "4.1.1",
|
|
60
|
+
"@objectstack/plugin-sharing": "4.1.1",
|
|
61
|
+
"@objectstack/rest": "4.1.1",
|
|
62
|
+
"@objectstack/runtime": "^4.1.1",
|
|
63
|
+
"@objectstack/service-ai": "4.1.1",
|
|
64
|
+
"@objectstack/service-analytics": "4.1.1",
|
|
65
|
+
"@objectstack/service-automation": "4.1.1",
|
|
66
|
+
"@objectstack/service-cache": "4.1.1",
|
|
67
|
+
"@objectstack/service-feed": "4.1.1",
|
|
68
|
+
"@objectstack/service-job": "4.1.1",
|
|
69
|
+
"@objectstack/service-package": "4.1.1",
|
|
70
|
+
"@objectstack/service-queue": "4.1.1",
|
|
71
|
+
"@objectstack/service-realtime": "4.1.1",
|
|
72
|
+
"@objectstack/service-settings": "4.1.1",
|
|
73
|
+
"@objectstack/service-storage": "4.1.1",
|
|
74
|
+
"@objectstack/spec": "4.1.1"
|
|
75
75
|
},
|
|
76
76
|
"peerDependencies": {
|
|
77
|
-
"@objectstack/core": "^4.1.
|
|
77
|
+
"@objectstack/core": "^4.1.1"
|
|
78
78
|
},
|
|
79
79
|
"devDependencies": {
|
|
80
80
|
"@oclif/plugin-help": "^6.2.49",
|