@objectstack/cli 4.0.5 → 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/README.md +32 -0
- package/dist/commands/cloud/login.d.ts +16 -0
- package/dist/commands/cloud/login.d.ts.map +1 -0
- package/dist/commands/cloud/login.js +166 -0
- package/dist/commands/cloud/login.js.map +1 -0
- package/dist/commands/cloud/logout.d.ts +15 -0
- package/dist/commands/cloud/logout.d.ts.map +1 -0
- package/dist/commands/cloud/logout.js +51 -0
- package/dist/commands/cloud/logout.js.map +1 -0
- package/dist/commands/cloud/whoami.d.ts +15 -0
- package/dist/commands/cloud/whoami.d.ts.map +1 -0
- package/dist/commands/cloud/whoami.js +81 -0
- package/dist/commands/cloud/whoami.js.map +1 -0
- package/dist/commands/dev.d.ts +6 -0
- package/dist/commands/dev.d.ts.map +1 -1
- package/dist/commands/dev.js +79 -14
- package/dist/commands/dev.js.map +1 -1
- 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/commands/login.js +2 -2
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/package/publish.d.ts +32 -0
- package/dist/commands/package/publish.d.ts.map +1 -0
- package/dist/commands/package/publish.js +324 -0
- package/dist/commands/package/publish.js.map +1 -0
- package/dist/commands/publish.d.ts +3 -0
- package/dist/commands/publish.d.ts.map +1 -1
- package/dist/commands/publish.js +55 -11
- package/dist/commands/publish.js.map +1 -1
- package/dist/commands/rollback.d.ts +13 -0
- package/dist/commands/rollback.d.ts.map +1 -0
- package/dist/commands/rollback.js +77 -0
- package/dist/commands/rollback.js.map +1 -0
- package/dist/commands/serve.d.ts +14 -0
- package/dist/commands/serve.d.ts.map +1 -1
- package/dist/commands/serve.js +583 -30
- package/dist/commands/serve.js.map +1 -1
- package/dist/commands/start.d.ts +8 -1
- package/dist/commands/start.d.ts.map +1 -1
- package/dist/commands/start.js +80 -11
- package/dist/commands/start.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/utils/auth-flows.d.ts +31 -0
- package/dist/utils/auth-flows.d.ts.map +1 -0
- package/dist/utils/auth-flows.js +151 -0
- package/dist/utils/auth-flows.js.map +1 -0
- package/dist/utils/cloud-config.d.ts +24 -0
- package/dist/utils/cloud-config.d.ts.map +1 -0
- package/dist/utils/cloud-config.js +75 -0
- package/dist/utils/cloud-config.js.map +1 -0
- package/dist/utils/console.d.ts +1 -0
- package/dist/utils/console.d.ts.map +1 -1
- package/dist/utils/console.js +7 -4
- package/dist/utils/console.js.map +1 -1
- 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/dist/utils/studio.d.ts.map +1 -1
- package/dist/utils/studio.js +5 -6
- package/dist/utils/studio.js.map +1 -1
- package/package.json +40 -36
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloud-config.d.ts","sourceRoot":"","sources":["../../src/utils/cloud-config.ts"],"names":[],"mappings":"AA4BA,sCAAsC;AACtC,eAAO,MAAM,iBAAiB,+BAA+B,CAAC;AAE9D,MAAM,WAAW,WAAW;IAC1B,sFAAsF;IACtF,GAAG,EAAE,MAAM,CAAC;IACZ,4DAA4D;IAC5D,KAAK,EAAE,MAAM,CAAC;IACd,+CAA+C;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+BAA+B;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oDAAoD;IACpD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qDAAqD;IACrD,SAAS,EAAE,MAAM,CAAC;IAClB,+CAA+C;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,uBAAuB,IAAI,MAAM,CAEhD;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,WAAW,CAAC,CAW5D;AAED,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAM3E;AAED,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAWzE;AAED,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CASvD"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.
|
|
2
|
+
/**
|
|
3
|
+
* Cloud credential store — separate from the runtime credential store at
|
|
4
|
+
* `~/.objectstack/credentials.json`.
|
|
5
|
+
*
|
|
6
|
+
* Why a second file?
|
|
7
|
+
* ------------------
|
|
8
|
+
* ObjectStack now has two distinct identities on a developer's machine:
|
|
9
|
+
*
|
|
10
|
+
* 1. **Runtime identity** — who you are inside your *own* ObjectOS
|
|
11
|
+
* instance (the CRM / Todo / app you're building). Stored in
|
|
12
|
+
* `credentials.json`, written by `os login`.
|
|
13
|
+
*
|
|
14
|
+
* 2. **Cloud identity** — who you are on the official ObjectStack Cloud
|
|
15
|
+
* package registry (`https://cloud.objectos.app`). Stored in
|
|
16
|
+
* `cloud.json`, written by `os cloud login`. Used to publish &
|
|
17
|
+
* install packages, browse the marketplace, etc.
|
|
18
|
+
*
|
|
19
|
+
* Keeping them in separate files makes it unambiguous which token a
|
|
20
|
+
* command is going to use, and makes it impossible to accidentally
|
|
21
|
+
* publish a package with a runtime-scoped token.
|
|
22
|
+
*/
|
|
23
|
+
import { chmod, mkdir, readFile, unlink, writeFile } from 'node:fs/promises';
|
|
24
|
+
import { homedir } from 'node:os';
|
|
25
|
+
import { join } from 'node:path';
|
|
26
|
+
/** Canonical hosted control plane. */
|
|
27
|
+
export const DEFAULT_CLOUD_URL = 'https://cloud.objectos.app';
|
|
28
|
+
export function getCloudCredentialsPath() {
|
|
29
|
+
return join(homedir(), '.objectstack', 'cloud.json');
|
|
30
|
+
}
|
|
31
|
+
export async function readCloudConfig() {
|
|
32
|
+
const path = getCloudCredentialsPath();
|
|
33
|
+
try {
|
|
34
|
+
const content = await readFile(path, 'utf-8');
|
|
35
|
+
return JSON.parse(content);
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
if (error.code === 'ENOENT') {
|
|
39
|
+
throw new Error('Not logged in to ObjectStack Cloud. Run `os cloud login` first.');
|
|
40
|
+
}
|
|
41
|
+
throw new Error(`Failed to read cloud credentials: ${error.message}`);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
export async function tryReadCloudConfig() {
|
|
45
|
+
try {
|
|
46
|
+
return await readCloudConfig();
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
return undefined;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
export async function writeCloudConfig(config) {
|
|
53
|
+
const path = getCloudCredentialsPath();
|
|
54
|
+
const dir = join(homedir(), '.objectstack');
|
|
55
|
+
await mkdir(dir, { recursive: true });
|
|
56
|
+
await writeFile(path, JSON.stringify(config, null, 2), { mode: 0o600 });
|
|
57
|
+
try {
|
|
58
|
+
await chmod(path, 0o600);
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
// Platforms without chmod support — silently continue.
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
export async function deleteCloudConfig() {
|
|
65
|
+
const path = getCloudCredentialsPath();
|
|
66
|
+
try {
|
|
67
|
+
await unlink(path);
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
if (error.code !== 'ENOENT') {
|
|
71
|
+
throw new Error(`Failed to delete cloud credentials: ${error.message}`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=cloud-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloud-config.js","sourceRoot":"","sources":["../../src/utils/cloud-config.ts"],"names":[],"mappings":"AAAA,yEAAyE;AAEzE;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,sCAAsC;AACtC,MAAM,CAAC,MAAM,iBAAiB,GAAG,4BAA4B,CAAC;AAmB9D,MAAM,UAAU,uBAAuB;IACrC,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,cAAc,EAAE,YAAY,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,MAAM,IAAI,GAAG,uBAAuB,EAAE,CAAC;IACvC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC9C,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAgB,CAAC;IAC5C,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;QACrF,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,qCAAqC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACxE,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,IAAI,CAAC;QACH,OAAO,MAAM,eAAe,EAAE,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,MAAmB;IACxD,MAAM,IAAI,GAAG,uBAAuB,EAAE,CAAC;IACvC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,cAAc,CAAC,CAAC;IAE5C,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,MAAM,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACxE,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,uDAAuD;IACzD,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,MAAM,IAAI,GAAG,uBAAuB,EAAE,CAAC;IACvC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,uCAAuC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC;AACH,CAAC"}
|
package/dist/utils/console.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"console.d.ts","sourceRoot":"","sources":["../../src/utils/console.ts"],"names":[],"mappings":"AAwBA,0EAA0E;AAC1E,eAAO,MAAM,YAAY,cAAc,CAAC;AAIxC;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,GAAG,IAAI,CA6ClD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAE3D;AAID;;;;;;;;;;;;GAYG;AACH,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE;;;
|
|
1
|
+
{"version":3,"file":"console.d.ts","sourceRoot":"","sources":["../../src/utils/console.ts"],"names":[],"mappings":"AAwBA,0EAA0E;AAC1E,eAAO,MAAM,YAAY,cAAc,CAAC;AAIxC;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,GAAG,IAAI,CA6ClD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAE3D;AAID;;;;;;;;;;;;GAYG;AACH,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,YAAY,CAAC,EAAE,OAAO,CAAA;CAAE;;;iBAM1F,GAAG;EAgEzB"}
|
package/dist/utils/console.js
CHANGED
|
@@ -107,10 +107,13 @@ export function createConsoleStaticPlugin(distPath, options) {
|
|
|
107
107
|
return;
|
|
108
108
|
}
|
|
109
109
|
const readIndexHtml = () => fs.readFileSync(indexPath, 'utf-8');
|
|
110
|
-
//
|
|
111
|
-
//
|
|
112
|
-
//
|
|
113
|
-
|
|
110
|
+
// The Console is the default end-user surface — root `/` redirects
|
|
111
|
+
// here whenever the Console is mounted (`rootRedirect !== false`).
|
|
112
|
+
// Mirrors the studio plugin's `rootRedirect` option. The CLI's
|
|
113
|
+
// serve.ts gates whether the Console mounts at all via `--no-console`
|
|
114
|
+
// / `OS_DISABLE_CONSOLE=1`; once mounted, claiming `/` is the
|
|
115
|
+
// intended behaviour in both dev and production deployments.
|
|
116
|
+
if (options?.rootRedirect !== false) {
|
|
114
117
|
app.get('/', (c) => c.redirect(`${CONSOLE_PATH}/`));
|
|
115
118
|
}
|
|
116
119
|
// Redirect bare path to trailing-slash (SPA convention)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"console.js","sourceRoot":"","sources":["../../src/utils/console.ts"],"names":[],"mappings":"AAAA,yEAAyE;AAEzE;;;;;;;;;;;;;;GAcG;AACH,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,uEAAuE;AAEvE,0EAA0E;AAC1E,MAAM,CAAC,MAAM,YAAY,GAAG,WAAW,CAAC;AAExC,uEAAuE;AAEvE;;;GAGG;AACH,MAAM,UAAU,kBAAkB;IAChC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAE1B,0CAA0C;IAC1C,MAAM,UAAU,GAAG;QACjB,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,cAAc,CAAC;QACjC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,oBAAoB,CAAC;QACvC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,iBAAiB,CAAC;KACrC,CAAC;IAEF,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;QACrD,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;gBAC1D,IAAI,GAAG,CAAC,IAAI,KAAK,sBAAsB;oBAAE,OAAO,SAAS,CAAC;YAC5D,CAAC;YAAC,MAAM,CAAC;gBACP,4BAA4B;YAC9B,CAAC;QACH,CAAC;IACH,CAAC;IAED,yDAAyD;IACzD,MAAM,eAAe,GAAG;QACtB,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC,IAAI,EAAG,qBAAqB;QAC1E,MAAM,CAAC,IAAI,CAAC,GAAG,EAAwC,qBAAqB;KAC7E,CAAC;IAEF,KAAK,MAAM,IAAI,IAAI,eAAe,EAAE,CAAC;QACnC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;YAChC,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,mCAAmC,CAAC,CAAC;YAClE,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAChC,CAAC;QAAC,MAAM,CAAC;YACP,2CAA2C;QAC7C,CAAC;IACH,CAAC;IAED,2DAA2D;IAC3D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,EAAE,cAAc,EAAE,SAAS,CAAC,CAAC;IAC7E,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC;QACzD,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,WAAmB;IAChD,OAAO,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC;AACrE,CAAC;AAED,uEAAuE;AAEvE;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,yBAAyB,CAAC,QAAgB,EAAE,
|
|
1
|
+
{"version":3,"file":"console.js","sourceRoot":"","sources":["../../src/utils/console.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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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"studio.d.ts","sourceRoot":"","sources":["../../src/utils/studio.ts"],"names":[],"mappings":"AAaA,OAAO,EAAS,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAKzD,sEAAsE;AACtE,eAAO,MAAM,WAAW,aAAa,CAAC;AAOtC;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,GAAG,IAAI,CA+CjD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAEzD;AAID;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,GAAE,MAAwB,GAAG,OAAO,CAAC,MAAM,CAAC,CAYlF;AAID,MAAM,WAAW,aAAa;IAC5B,+CAA+C;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,2BAA2B;IAC3B,OAAO,EAAE,YAAY,CAAC;CACvB;AAED;;;;;;;;GAQG;AACH,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAO,GACpC,OAAO,CAAC,aAAa,CAAC,CAwExB;AAID;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM;;;iBAMjC,GAAG;EAwCzB;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,YAAY,CAAC,EAAE,OAAO,CAAA;CAAE;;;iBAMzF,GAAG;
|
|
1
|
+
{"version":3,"file":"studio.d.ts","sourceRoot":"","sources":["../../src/utils/studio.ts"],"names":[],"mappings":"AAaA,OAAO,EAAS,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAKzD,sEAAsE;AACtE,eAAO,MAAM,WAAW,aAAa,CAAC;AAOtC;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,GAAG,IAAI,CA+CjD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAEzD;AAID;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,GAAE,MAAwB,GAAG,OAAO,CAAC,MAAM,CAAC,CAYlF;AAID,MAAM,WAAW,aAAa;IAC5B,+CAA+C;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,2BAA2B;IAC3B,OAAO,EAAE,YAAY,CAAC;CACvB;AAED;;;;;;;;GAQG;AACH,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAO,GACpC,OAAO,CAAC,aAAa,CAAC,CAwExB;AAID;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM;;;iBAMjC,GAAG;EAwCzB;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,YAAY,CAAC,EAAE,OAAO,CAAA;CAAE;;;iBAMzF,GAAG;EAsEzB"}
|
package/dist/utils/studio.js
CHANGED
|
@@ -239,12 +239,11 @@ export function createStudioStaticPlugin(distPath, options) {
|
|
|
239
239
|
// and the SPA fallback then re-serves the stale HTML with text/html MIME
|
|
240
240
|
// — producing the "Failed to load module script" browser error.
|
|
241
241
|
const readIndexHtml = () => fs.readFileSync(indexPath, 'utf-8');
|
|
242
|
-
//
|
|
243
|
-
//
|
|
244
|
-
//
|
|
245
|
-
//
|
|
246
|
-
|
|
247
|
-
if (options?.isDev && options?.rootRedirect !== false) {
|
|
242
|
+
// Redirect root to Studio when the orchestrator says so. This is the
|
|
243
|
+
// case in dev mode (convenience), and also in production deployments
|
|
244
|
+
// that disable the runtime Console (e.g. control-plane hosts like
|
|
245
|
+
// `apps/cloud` set OS_DISABLE_CONSOLE=1 so Studio owns `/`).
|
|
246
|
+
if (options?.rootRedirect !== false) {
|
|
248
247
|
app.get('/', (c) => c.redirect(`${STUDIO_PATH}/`));
|
|
249
248
|
}
|
|
250
249
|
// Redirect bare path
|