@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.
Files changed (67) hide show
  1. package/README.md +32 -0
  2. package/dist/commands/cloud/login.d.ts +16 -0
  3. package/dist/commands/cloud/login.d.ts.map +1 -0
  4. package/dist/commands/cloud/login.js +166 -0
  5. package/dist/commands/cloud/login.js.map +1 -0
  6. package/dist/commands/cloud/logout.d.ts +15 -0
  7. package/dist/commands/cloud/logout.d.ts.map +1 -0
  8. package/dist/commands/cloud/logout.js +51 -0
  9. package/dist/commands/cloud/logout.js.map +1 -0
  10. package/dist/commands/cloud/whoami.d.ts +15 -0
  11. package/dist/commands/cloud/whoami.d.ts.map +1 -0
  12. package/dist/commands/cloud/whoami.js +81 -0
  13. package/dist/commands/cloud/whoami.js.map +1 -0
  14. package/dist/commands/dev.d.ts +6 -0
  15. package/dist/commands/dev.d.ts.map +1 -1
  16. package/dist/commands/dev.js +79 -14
  17. package/dist/commands/dev.js.map +1 -1
  18. package/dist/commands/i18n/extract.d.ts +28 -0
  19. package/dist/commands/i18n/extract.d.ts.map +1 -0
  20. package/dist/commands/i18n/extract.js +148 -0
  21. package/dist/commands/i18n/extract.js.map +1 -0
  22. package/dist/commands/login.js +2 -2
  23. package/dist/commands/login.js.map +1 -1
  24. package/dist/commands/package/publish.d.ts +32 -0
  25. package/dist/commands/package/publish.d.ts.map +1 -0
  26. package/dist/commands/package/publish.js +324 -0
  27. package/dist/commands/package/publish.js.map +1 -0
  28. package/dist/commands/publish.d.ts +3 -0
  29. package/dist/commands/publish.d.ts.map +1 -1
  30. package/dist/commands/publish.js +55 -11
  31. package/dist/commands/publish.js.map +1 -1
  32. package/dist/commands/rollback.d.ts +13 -0
  33. package/dist/commands/rollback.d.ts.map +1 -0
  34. package/dist/commands/rollback.js +77 -0
  35. package/dist/commands/rollback.js.map +1 -0
  36. package/dist/commands/serve.d.ts +14 -0
  37. package/dist/commands/serve.d.ts.map +1 -1
  38. package/dist/commands/serve.js +583 -30
  39. package/dist/commands/serve.js.map +1 -1
  40. package/dist/commands/start.d.ts +8 -1
  41. package/dist/commands/start.d.ts.map +1 -1
  42. package/dist/commands/start.js +80 -11
  43. package/dist/commands/start.js.map +1 -1
  44. package/dist/index.d.ts +4 -0
  45. package/dist/index.d.ts.map +1 -1
  46. package/dist/index.js +6 -0
  47. package/dist/index.js.map +1 -1
  48. package/dist/utils/auth-flows.d.ts +31 -0
  49. package/dist/utils/auth-flows.d.ts.map +1 -0
  50. package/dist/utils/auth-flows.js +151 -0
  51. package/dist/utils/auth-flows.js.map +1 -0
  52. package/dist/utils/cloud-config.d.ts +24 -0
  53. package/dist/utils/cloud-config.d.ts.map +1 -0
  54. package/dist/utils/cloud-config.js +75 -0
  55. package/dist/utils/cloud-config.js.map +1 -0
  56. package/dist/utils/console.d.ts +1 -0
  57. package/dist/utils/console.d.ts.map +1 -1
  58. package/dist/utils/console.js +7 -4
  59. package/dist/utils/console.js.map +1 -1
  60. package/dist/utils/i18n-extract.d.ts +102 -0
  61. package/dist/utils/i18n-extract.d.ts.map +1 -0
  62. package/dist/utils/i18n-extract.js +332 -0
  63. package/dist/utils/i18n-extract.js.map +1 -0
  64. package/dist/utils/studio.d.ts.map +1 -1
  65. package/dist/utils/studio.js +5 -6
  66. package/dist/utils/studio.js.map +1 -1
  67. 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"}
@@ -24,6 +24,7 @@ export declare function hasConsoleDist(consolePath: string): boolean;
24
24
  */
25
25
  export declare function createConsoleStaticPlugin(distPath: string, options?: {
26
26
  isDev?: boolean;
27
+ rootRedirect?: boolean;
27
28
  }): {
28
29
  name: string;
29
30
  init: () => Promise<void>;
@@ -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;;;iBAMlE,GAAG;EA6DzB"}
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"}
@@ -107,10 +107,13 @@ export function createConsoleStaticPlugin(distPath, options) {
107
107
  return;
108
108
  }
109
109
  const readIndexHtml = () => fs.readFileSync(indexPath, 'utf-8');
110
- // In dev mode, the Console is the default UI surface — root `/`
111
- // redirects here. Mirrors the convention Studio used to own; we now
112
- // prefer the Console because it is the opinionated end-user surface.
113
- if (options?.isDev) {
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":"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"}
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;EAuEzB"}
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"}
@@ -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
- // In dev mode, redirect root to Studio for convenience but only
243
- // when no other UI (e.g. the runtime Console) has claimed `/`. The
244
- // Console is the preferred default in modern deployments, so the
245
- // orchestrator (CLI `serve`) passes `rootRedirect: false` whenever
246
- // the Console is also mounted.
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