@objectstack/cli 4.0.4 → 4.0.5

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 (241) hide show
  1. package/README.md +12 -25
  2. package/dist/commands/build.d.ts +5 -0
  3. package/dist/commands/build.d.ts.map +1 -0
  4. package/dist/commands/build.js +6 -0
  5. package/dist/commands/build.js.map +1 -0
  6. package/dist/commands/compile.d.ts +3 -0
  7. package/dist/commands/compile.d.ts.map +1 -1
  8. package/dist/commands/compile.js +128 -6
  9. package/dist/commands/compile.js.map +1 -1
  10. package/dist/commands/create.js +1 -1
  11. package/dist/commands/data/create.js +2 -2
  12. package/dist/commands/data/create.js.map +1 -1
  13. package/dist/commands/data/delete.js +2 -2
  14. package/dist/commands/data/delete.js.map +1 -1
  15. package/dist/commands/data/get.js +2 -2
  16. package/dist/commands/data/get.js.map +1 -1
  17. package/dist/commands/data/query.js +2 -2
  18. package/dist/commands/data/query.js.map +1 -1
  19. package/dist/commands/data/update.js +2 -2
  20. package/dist/commands/data/update.js.map +1 -1
  21. package/dist/commands/dev.d.ts +3 -0
  22. package/dist/commands/dev.d.ts.map +1 -1
  23. package/dist/commands/dev.js +48 -19
  24. package/dist/commands/dev.js.map +1 -1
  25. package/dist/commands/generate.js +9 -9
  26. package/dist/commands/generate.js.map +1 -1
  27. package/dist/commands/i18n/check.d.ts +18 -0
  28. package/dist/commands/i18n/check.d.ts.map +1 -0
  29. package/dist/commands/i18n/check.js +153 -0
  30. package/dist/commands/i18n/check.js.map +1 -0
  31. package/dist/commands/init.js +2 -2
  32. package/dist/commands/lint.d.ts +3 -0
  33. package/dist/commands/lint.d.ts.map +1 -1
  34. package/dist/commands/lint.js +24 -0
  35. package/dist/commands/lint.js.map +1 -1
  36. package/dist/commands/login.d.ts +17 -0
  37. package/dist/commands/login.d.ts.map +1 -0
  38. package/dist/commands/login.js +313 -0
  39. package/dist/commands/login.js.map +1 -0
  40. package/dist/commands/logout.d.ts.map +1 -0
  41. package/dist/commands/{auth/logout.js → logout.js} +14 -2
  42. package/dist/commands/logout.js.map +1 -0
  43. package/dist/commands/meta/delete.js +2 -2
  44. package/dist/commands/meta/delete.js.map +1 -1
  45. package/dist/commands/meta/get.js +2 -2
  46. package/dist/commands/meta/get.js.map +1 -1
  47. package/dist/commands/meta/list.js +2 -2
  48. package/dist/commands/meta/list.js.map +1 -1
  49. package/dist/commands/meta/register.js +2 -2
  50. package/dist/commands/meta/register.js.map +1 -1
  51. package/dist/commands/projects/bind.d.ts +30 -0
  52. package/dist/commands/projects/bind.d.ts.map +1 -0
  53. package/dist/commands/projects/bind.js +132 -0
  54. package/dist/commands/projects/bind.js.map +1 -0
  55. package/dist/commands/projects/create.d.ts +28 -0
  56. package/dist/commands/projects/create.d.ts.map +1 -0
  57. package/dist/commands/projects/create.js +120 -0
  58. package/dist/commands/projects/create.js.map +1 -0
  59. package/dist/commands/projects/list.d.ts +21 -0
  60. package/dist/commands/projects/list.d.ts.map +1 -0
  61. package/dist/commands/projects/list.js +79 -0
  62. package/dist/commands/projects/list.js.map +1 -0
  63. package/dist/commands/projects/projects.test.d.ts +2 -0
  64. package/dist/commands/projects/projects.test.d.ts.map +1 -0
  65. package/dist/commands/projects/projects.test.js +56 -0
  66. package/dist/commands/projects/projects.test.js.map +1 -0
  67. package/dist/commands/projects/show.d.ts +21 -0
  68. package/dist/commands/projects/show.d.ts.map +1 -0
  69. package/dist/commands/projects/show.js +72 -0
  70. package/dist/commands/projects/show.js.map +1 -0
  71. package/dist/commands/projects/switch.d.ts +24 -0
  72. package/dist/commands/projects/switch.d.ts.map +1 -0
  73. package/dist/commands/projects/switch.js +64 -0
  74. package/dist/commands/projects/switch.js.map +1 -0
  75. package/dist/commands/publish.d.ts +14 -0
  76. package/dist/commands/publish.d.ts.map +1 -0
  77. package/dist/commands/publish.js +91 -0
  78. package/dist/commands/publish.js.map +1 -0
  79. package/dist/commands/{auth/login.d.ts → register.d.ts} +3 -2
  80. package/dist/commands/register.d.ts.map +1 -0
  81. package/dist/commands/{auth/login.js → register.js} +44 -61
  82. package/dist/commands/register.js.map +1 -0
  83. package/dist/commands/serve.d.ts +8 -0
  84. package/dist/commands/serve.d.ts.map +1 -1
  85. package/dist/commands/serve.js +606 -44
  86. package/dist/commands/serve.js.map +1 -1
  87. package/dist/commands/start.d.ts +11 -0
  88. package/dist/commands/start.d.ts.map +1 -0
  89. package/dist/commands/start.js +43 -0
  90. package/dist/commands/start.js.map +1 -0
  91. package/dist/commands/whoami.d.ts.map +1 -0
  92. package/dist/commands/{auth/whoami.js → whoami.js} +5 -5
  93. package/dist/commands/whoami.js.map +1 -0
  94. package/dist/index.d.ts +7 -4
  95. package/dist/index.d.ts.map +1 -1
  96. package/dist/index.js +8 -5
  97. package/dist/index.js.map +1 -1
  98. package/dist/utils/account.d.ts +31 -0
  99. package/dist/utils/account.d.ts.map +1 -0
  100. package/dist/utils/account.js +154 -0
  101. package/dist/utils/account.js.map +1 -0
  102. package/dist/utils/api-client.d.ts +10 -4
  103. package/dist/utils/api-client.d.ts.map +1 -1
  104. package/dist/utils/api-client.js +13 -7
  105. package/dist/utils/api-client.js.map +1 -1
  106. package/dist/utils/auth-config.d.ts +6 -0
  107. package/dist/utils/auth-config.d.ts.map +1 -1
  108. package/dist/utils/auth-config.js.map +1 -1
  109. package/dist/utils/build-runtime.d.ts +45 -0
  110. package/dist/utils/build-runtime.d.ts.map +1 -0
  111. package/dist/utils/build-runtime.js +154 -0
  112. package/dist/utils/build-runtime.js.map +1 -0
  113. package/dist/utils/config.d.ts.map +1 -1
  114. package/dist/utils/config.js +17 -2
  115. package/dist/utils/config.js.map +1 -1
  116. package/dist/utils/console.d.ts +32 -0
  117. package/dist/utils/console.d.ts.map +1 -0
  118. package/dist/utils/console.js +169 -0
  119. package/dist/utils/console.js.map +1 -0
  120. package/dist/utils/extract-hook-body.d.ts +13 -0
  121. package/dist/utils/extract-hook-body.d.ts.map +1 -0
  122. package/dist/utils/extract-hook-body.js +175 -0
  123. package/dist/utils/extract-hook-body.js.map +1 -0
  124. package/dist/utils/format.d.ts +8 -0
  125. package/dist/utils/format.d.ts.map +1 -1
  126. package/dist/utils/format.js +15 -2
  127. package/dist/utils/format.js.map +1 -1
  128. package/dist/utils/i18n-coverage.d.ts +61 -0
  129. package/dist/utils/i18n-coverage.d.ts.map +1 -0
  130. package/dist/utils/i18n-coverage.js +176 -0
  131. package/dist/utils/i18n-coverage.js.map +1 -0
  132. package/dist/utils/lower-callables.d.ts +17 -0
  133. package/dist/utils/lower-callables.d.ts.map +1 -0
  134. package/dist/utils/lower-callables.js +181 -0
  135. package/dist/utils/lower-callables.js.map +1 -0
  136. package/dist/utils/plugin-detection.d.ts +1 -0
  137. package/dist/utils/plugin-detection.d.ts.map +1 -1
  138. package/dist/utils/plugin-detection.js +41 -0
  139. package/dist/utils/plugin-detection.js.map +1 -1
  140. package/dist/utils/studio.d.ts +1 -0
  141. package/dist/utils/studio.d.ts.map +1 -1
  142. package/dist/utils/studio.js +25 -9
  143. package/dist/utils/studio.js.map +1 -1
  144. package/package.json +55 -21
  145. package/.turbo/turbo-build.log +0 -4
  146. package/CHANGELOG.md +0 -821
  147. package/bin/run-dev.js +0 -5
  148. package/dist/commands/auth/login.d.ts.map +0 -1
  149. package/dist/commands/auth/login.js.map +0 -1
  150. package/dist/commands/auth/logout.d.ts.map +0 -1
  151. package/dist/commands/auth/logout.js.map +0 -1
  152. package/dist/commands/auth/whoami.d.ts.map +0 -1
  153. package/dist/commands/auth/whoami.js.map +0 -1
  154. package/dist/commands/codemod/v2-to-v3.d.ts +0 -10
  155. package/dist/commands/codemod/v2-to-v3.d.ts.map +0 -1
  156. package/dist/commands/codemod/v2-to-v3.js +0 -145
  157. package/dist/commands/codemod/v2-to-v3.js.map +0 -1
  158. package/dist/commands/plugin/add.d.ts +0 -22
  159. package/dist/commands/plugin/add.d.ts.map +0 -1
  160. package/dist/commands/plugin/add.js +0 -93
  161. package/dist/commands/plugin/add.js.map +0 -1
  162. package/dist/commands/plugin/build.d.ts +0 -29
  163. package/dist/commands/plugin/build.d.ts.map +0 -1
  164. package/dist/commands/plugin/build.js +0 -170
  165. package/dist/commands/plugin/build.js.map +0 -1
  166. package/dist/commands/plugin/info.d.ts +0 -10
  167. package/dist/commands/plugin/info.d.ts.map +0 -1
  168. package/dist/commands/plugin/info.js +0 -65
  169. package/dist/commands/plugin/info.js.map +0 -1
  170. package/dist/commands/plugin/list.d.ts +0 -13
  171. package/dist/commands/plugin/list.d.ts.map +0 -1
  172. package/dist/commands/plugin/list.js +0 -78
  173. package/dist/commands/plugin/list.js.map +0 -1
  174. package/dist/commands/plugin/publish.d.ts +0 -27
  175. package/dist/commands/plugin/publish.d.ts.map +0 -1
  176. package/dist/commands/plugin/publish.js +0 -152
  177. package/dist/commands/plugin/publish.js.map +0 -1
  178. package/dist/commands/plugin/remove.d.ts +0 -20
  179. package/dist/commands/plugin/remove.d.ts.map +0 -1
  180. package/dist/commands/plugin/remove.js +0 -79
  181. package/dist/commands/plugin/remove.js.map +0 -1
  182. package/dist/commands/plugin/validate.d.ts +0 -23
  183. package/dist/commands/plugin/validate.d.ts.map +0 -1
  184. package/dist/commands/plugin/validate.js +0 -251
  185. package/dist/commands/plugin/validate.js.map +0 -1
  186. package/src/bin.ts +0 -13
  187. package/src/commands/auth/login.ts +0 -188
  188. package/src/commands/auth/logout.ts +0 -51
  189. package/src/commands/auth/whoami.ts +0 -85
  190. package/src/commands/codemod/v2-to-v3.ts +0 -171
  191. package/src/commands/compile.ts +0 -114
  192. package/src/commands/create.ts +0 -281
  193. package/src/commands/data/create.ts +0 -110
  194. package/src/commands/data/delete.ts +0 -84
  195. package/src/commands/data/get.ts +0 -84
  196. package/src/commands/data/query.ts +0 -127
  197. package/src/commands/data/update.ts +0 -114
  198. package/src/commands/dev.ts +0 -83
  199. package/src/commands/diff.ts +0 -294
  200. package/src/commands/doctor.ts +0 -572
  201. package/src/commands/explain.ts +0 -412
  202. package/src/commands/generate.ts +0 -924
  203. package/src/commands/info.ts +0 -124
  204. package/src/commands/init.ts +0 -327
  205. package/src/commands/lint.ts +0 -315
  206. package/src/commands/meta/delete.ts +0 -79
  207. package/src/commands/meta/get.ts +0 -73
  208. package/src/commands/meta/list.ts +0 -105
  209. package/src/commands/meta/register.ts +0 -97
  210. package/src/commands/plugin/add.ts +0 -112
  211. package/src/commands/plugin/build.ts +0 -193
  212. package/src/commands/plugin/info.ts +0 -79
  213. package/src/commands/plugin/list.ts +0 -93
  214. package/src/commands/plugin/publish.ts +0 -176
  215. package/src/commands/plugin/remove.ts +0 -97
  216. package/src/commands/plugin/validate.ts +0 -268
  217. package/src/commands/serve.ts +0 -411
  218. package/src/commands/studio.ts +0 -52
  219. package/src/commands/test.ts +0 -135
  220. package/src/commands/validate.ts +0 -143
  221. package/src/index.ts +0 -22
  222. package/src/utils/api-client.ts +0 -88
  223. package/src/utils/auth-config.ts +0 -107
  224. package/src/utils/config.ts +0 -80
  225. package/src/utils/format.ts +0 -267
  226. package/src/utils/output-formatter.ts +0 -91
  227. package/src/utils/plugin-detection.ts +0 -16
  228. package/src/utils/plugin-helpers.ts +0 -37
  229. package/src/utils/studio.ts +0 -350
  230. package/test/commands.test.ts +0 -128
  231. package/test/create.test.ts +0 -25
  232. package/test/plugin-commands.test.ts +0 -44
  233. package/test/plugin.test.ts +0 -169
  234. package/test/remote-api-commands.test.ts +0 -188
  235. package/test/remote-api-utils.test.ts +0 -196
  236. package/test/serve-host-config.test.ts +0 -77
  237. package/tsconfig.build.json +0 -20
  238. package/tsconfig.json +0 -25
  239. package/tsup.config.ts +0 -23
  240. /package/dist/commands/{auth/logout.d.ts → logout.d.ts} +0 -0
  241. /package/dist/commands/{auth/whoami.d.ts → whoami.d.ts} +0 -0
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Build a single ESM bundle that re-exports every inline handler function
3
+ * collected by `lowerCallables`. The bundle is the second half of the
4
+ * "two-product" build (alongside `objectstack.json`):
5
+ *
6
+ * dist/
7
+ * ├── objectstack.json
8
+ * └── objectstack-runtime.{contenthash}.mjs ← THIS
9
+ *
10
+ * At runtime, `StandaloneStack` (and `MultiProjectPlugin`) dynamic-import
11
+ * the mjs and merge `module.functions` into the bundle before
12
+ * `bindHooks(...)` runs — so string-named handlers resolve to real code
13
+ * even though the JSON artifact is pure metadata.
14
+ */
15
+ export interface BuildRuntimeOptions {
16
+ /** Absolute path to the user's `objectstack.config.{ts,js,mjs}`. */
17
+ sourceConfigPath: string;
18
+ /** Lowered handler refs (`name → handlerName`) — mirrors `LoweringResult.functions`. */
19
+ refs: string[];
20
+ /** Output directory (e.g. `<cwd>/dist`). Created if missing. */
21
+ outputDir: string;
22
+ /** Base file name without hash, e.g. `objectstack-runtime`. */
23
+ baseName?: string;
24
+ /** External package names to mark as external (`@objectstack/*` etc.). */
25
+ externalPackages?: string[];
26
+ }
27
+ export interface BuildRuntimeResult {
28
+ /** Absolute path to the emitted mjs. */
29
+ outputPath: string;
30
+ /** File name (relative to outputDir) — embedded in objectstack.json. */
31
+ outputFileName: string;
32
+ /** Content hash (sha256, first 16 hex chars). */
33
+ hash: string;
34
+ /** Bundle size in bytes. */
35
+ size: number;
36
+ }
37
+ export declare function buildRuntimeBundle(opts: BuildRuntimeOptions): Promise<BuildRuntimeResult>;
38
+ /** Best-effort cleanup of stale `objectstack-runtime.*.mjs` files. */
39
+ export declare function cleanupOldRuntimeBundles(outputDir: string, keepFileName: string, baseName?: string): number;
40
+ /** Reuse: read an existing bundle and recompute its size for stats. */
41
+ export declare function statBundle(outputPath: string): {
42
+ size: number;
43
+ } | null;
44
+ export declare const runtimeBundlePathRelative: (outputDir: string, file: string) => string;
45
+ //# sourceMappingURL=build-runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-runtime.d.ts","sourceRoot":"","sources":["../../src/utils/build-runtime.ts"],"names":[],"mappings":"AAMA;;;;;;;;;;;;;GAaG;AAEH,MAAM,WAAW,mBAAmB;IAClC,oEAAoE;IACpE,gBAAgB,EAAE,MAAM,CAAC;IACzB,wFAAwF;IACxF,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,gEAAgE;IAChE,SAAS,EAAE,MAAM,CAAC;IAClB,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0EAA0E;IAC1E,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,kBAAkB;IACjC,wCAAwC;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,wEAAwE;IACxE,cAAc,EAAE,MAAM,CAAC;IACvB,iDAAiD;IACjD,IAAI,EAAE,MAAM,CAAC;IACb,4BAA4B;IAC5B,IAAI,EAAE,MAAM,CAAC;CACd;AA6DD,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA4D/F;AAED,sEAAsE;AACtE,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,SAAe,GAAG,MAAM,CAejH;AAED,uEAAuE;AACvE,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAOtE;AAED,eAAO,MAAM,yBAAyB,GAAI,WAAW,MAAM,EAAE,MAAM,MAAM,KAAG,MACf,CAAC"}
@@ -0,0 +1,154 @@
1
+ // Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.
2
+ import { createHash } from 'node:crypto';
3
+ import { mkdirSync, writeFileSync, readFileSync, existsSync, unlinkSync, readdirSync } from 'node:fs';
4
+ import { dirname, basename, resolve as resolvePath, relative, sep as PATH_SEP } from 'node:path';
5
+ const DEFAULT_BASE = 'objectstack-runtime';
6
+ /**
7
+ * Generate the entry source that re-extracts callable handlers from the
8
+ * compiled config. We bundle the user's config transitively (so every
9
+ * `*.hook.ts` import is captured), then walk the same shape the lowering
10
+ * pass walked and re-export the matching handlers under the same string
11
+ * keys. The runtime side merges this map into `bundle.functions`.
12
+ */
13
+ function generateEntrySource(sourceConfigPath, refs, entryDir) {
14
+ // Use a POSIX-style relative path so esbuild's resolver bundles the
15
+ // user's config + every transitively-imported `*.hook.ts` into the
16
+ // emitted ESM. A `file://` URL would be treated as external.
17
+ let importPath = relative(entryDir, sourceConfigPath).split(PATH_SEP).join('/');
18
+ if (!importPath.startsWith('.'))
19
+ importPath = './' + importPath;
20
+ const refLiteral = JSON.stringify(refs);
21
+ return `// AUTO-GENERATED by @objectstack/cli — do not edit.
22
+ import config from ${JSON.stringify(importPath)};
23
+
24
+ const REFS = new Set(${refLiteral});
25
+
26
+ function collect(cfg) {
27
+ const out = Object.create(null);
28
+ if (!cfg || typeof cfg !== 'object') return out;
29
+ // Hooks: { name, handler }
30
+ if (Array.isArray(cfg.hooks)) {
31
+ for (const h of cfg.hooks) {
32
+ if (h && typeof h === 'object' && typeof h.handler === 'function' && typeof h.name === 'string') {
33
+ if (REFS.has(h.name)) out[h.name] = h.handler;
34
+ }
35
+ }
36
+ }
37
+ // Top-level functions map
38
+ if (cfg.functions && !Array.isArray(cfg.functions) && typeof cfg.functions === 'object') {
39
+ for (const [k, v] of Object.entries(cfg.functions)) {
40
+ if (typeof v === 'function' && REFS.has(k)) out[k] = v;
41
+ }
42
+ }
43
+ // Top-level functions array
44
+ if (Array.isArray(cfg.functions)) {
45
+ for (const entry of cfg.functions) {
46
+ if (entry && typeof entry === 'object' && typeof entry.handler === 'function' && typeof entry.name === 'string') {
47
+ if (REFS.has(entry.name)) out[entry.name] = entry.handler;
48
+ }
49
+ }
50
+ }
51
+ return out;
52
+ }
53
+
54
+ const cfg = config && typeof config === 'object' && 'default' in config ? config.default : config;
55
+ export const functions = collect(cfg);
56
+ export const meta = {
57
+ builtAt: new Date().toISOString(),
58
+ refCount: ${refs.length},
59
+ };
60
+ `;
61
+ }
62
+ export async function buildRuntimeBundle(opts) {
63
+ const { sourceConfigPath, refs, outputDir } = opts;
64
+ const baseName = opts.baseName ?? DEFAULT_BASE;
65
+ if (!existsSync(outputDir))
66
+ mkdirSync(outputDir, { recursive: true });
67
+ const entryDir = dirname(sourceConfigPath);
68
+ const entryPath = resolvePath(entryDir, `.${baseName}.entry.${process.pid}.${Date.now()}.mjs`);
69
+ writeFileSync(entryPath, generateEntrySource(sourceConfigPath, refs, entryDir));
70
+ let esbuild;
71
+ try {
72
+ esbuild = await import('esbuild');
73
+ }
74
+ catch (err) {
75
+ try {
76
+ unlinkSync(entryPath);
77
+ }
78
+ catch { /* noop */ }
79
+ throw new Error(`[build-runtime] esbuild is required to bundle declarative handlers but is not installed: ${err.message}`);
80
+ }
81
+ // Bundle to an in-memory buffer first so we can hash, then rename.
82
+ let result;
83
+ try {
84
+ result = await esbuild.build({
85
+ entryPoints: [entryPath],
86
+ bundle: true,
87
+ format: 'esm',
88
+ platform: 'node',
89
+ target: 'node18',
90
+ write: false,
91
+ sourcemap: 'inline',
92
+ packages: 'external',
93
+ logLevel: 'silent',
94
+ legalComments: 'none',
95
+ resolveExtensions: ['.ts', '.tsx', '.mjs', '.js', '.cjs', '.json'],
96
+ loader: { '.ts': 'ts', '.tsx': 'tsx' },
97
+ banner: { js: '// @generated by @objectstack/cli — do not edit.' },
98
+ });
99
+ }
100
+ finally {
101
+ try {
102
+ unlinkSync(entryPath);
103
+ }
104
+ catch { /* noop */ }
105
+ }
106
+ const out = result.outputFiles?.[0];
107
+ if (!out)
108
+ throw new Error('[build-runtime] esbuild produced no output');
109
+ const code = out.text;
110
+ const hash = createHash('sha256').update(code).digest('hex').slice(0, 16);
111
+ const fileName = `${baseName}.${hash}.mjs`;
112
+ const outputPath = resolvePath(outputDir, fileName);
113
+ writeFileSync(outputPath, code);
114
+ return {
115
+ outputPath,
116
+ outputFileName: fileName,
117
+ hash,
118
+ size: Buffer.byteLength(code, 'utf8'),
119
+ };
120
+ }
121
+ /** Best-effort cleanup of stale `objectstack-runtime.*.mjs` files. */
122
+ export function cleanupOldRuntimeBundles(outputDir, keepFileName, baseName = DEFAULT_BASE) {
123
+ if (!existsSync(outputDir))
124
+ return 0;
125
+ let removed = 0;
126
+ try {
127
+ const re = new RegExp(`^${baseName}\\.[a-f0-9]+\\.mjs(\\.map)?$`);
128
+ for (const f of readdirSync(outputDir)) {
129
+ if (!re.test(f))
130
+ continue;
131
+ if (f === keepFileName)
132
+ continue;
133
+ try {
134
+ unlinkSync(resolvePath(outputDir, f));
135
+ removed += 1;
136
+ }
137
+ catch { /* noop */ }
138
+ }
139
+ }
140
+ catch { /* noop */ }
141
+ return removed;
142
+ }
143
+ /** Reuse: read an existing bundle and recompute its size for stats. */
144
+ export function statBundle(outputPath) {
145
+ try {
146
+ const buf = readFileSync(outputPath);
147
+ return { size: buf.byteLength };
148
+ }
149
+ catch {
150
+ return null;
151
+ }
152
+ }
153
+ export const runtimeBundlePathRelative = (outputDir, file) => relative(outputDir, resolvePath(outputDir, basename(file)));
154
+ //# sourceMappingURL=build-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-runtime.js","sourceRoot":"","sources":["../../src/utils/build-runtime.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,GAAG,CAAC;IACZ,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CA6BzD;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAkBvE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,GAAE,MAAgC,GAAG,OAAO,CAE5E"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,GAAG,CAAC;IACZ,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CA6BzD;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAiCvE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,GAAE,MAAgC,GAAG,OAAO,CAE5E"}
@@ -47,10 +47,25 @@ export async function loadConfig(source) {
47
47
  const { mod } = await bundleRequire({
48
48
  filepath: absolutePath,
49
49
  });
50
- const config = mod.default || mod;
51
- if (!config) {
50
+ const baseConfig = mod.default || mod;
51
+ if (!baseConfig) {
52
52
  throw new Error(`No default export found in ${path.basename(absolutePath)}`);
53
53
  }
54
+ // Preserve named exports (e.g. `onEnable`, `onDisable` lifecycle hooks)
55
+ // alongside the default-exported stack. Module-namespace named exports are
56
+ // otherwise dropped when we unwrap `mod.default`, which prevents AppPlugin
57
+ // from invoking runtime hooks.
58
+ const config = (baseConfig === mod || mod.default == null)
59
+ ? baseConfig
60
+ : (() => {
61
+ const merged = { ...baseConfig };
62
+ for (const key of Object.keys(mod)) {
63
+ if (key === 'default' || key in merged)
64
+ continue;
65
+ merged[key] = mod[key];
66
+ }
67
+ return merged;
68
+ })();
54
69
  return {
55
70
  config,
56
71
  absolutePath,
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAAA,yEAAyE;AAEzE,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAQzC;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAe;IAC/C,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,CAAC;QAChD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,UAAU,CAAC,0BAA0B,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACzD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,sEAAsE,CAAC,CAAC,CAAC;YAC/F,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC,CAAC;YACzF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,cAAc;IACd,MAAM,UAAU,GAAG;QACjB,uBAAuB;QACvB,uBAAuB;QACvB,wBAAwB;KACzB,CAAC;IAEF,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,CAAC,CAAC;QACnD,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO,GAAG,CAAC;IACrC,CAAC;IAED,UAAU,CAAC,8DAA8D,CAAC,CAAC;IAC3E,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC,CAAC;IACjF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,MAAe;IAC9C,MAAM,YAAY,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAEzB,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,aAAa,CAAC;QAClC,QAAQ,EAAE,YAAY;KACvB,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC;IAClC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,8BAA8B,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IAC/E,CAAC;IAED,OAAO;QACL,MAAM;QACN,YAAY;QACZ,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;KAC7B,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,OAAe,uBAAuB;IACjE,OAAO,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;AAC1D,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /** URL mount path for the Console portal inside the ObjectStack server */
2
+ export declare const CONSOLE_PATH = "/_console";
3
+ /**
4
+ * Resolve the filesystem path to the @objectstack/console package.
5
+ * Searches workspace locations first, then falls back to node_modules.
6
+ */
7
+ export declare function resolveConsolePath(): string | null;
8
+ /**
9
+ * Check whether the Console portal has a pre-built `dist/` directory.
10
+ */
11
+ export declare function hasConsoleDist(consolePath: string): boolean;
12
+ /**
13
+ * Create a lightweight kernel plugin that serves the pre-built Console
14
+ * portal static files at `/_console/*`.
15
+ *
16
+ * Identical SPA-fallback semantics to `createStudioStaticPlugin` and
17
+ * `createAccountStaticPlugin`:
18
+ * - `index.html` is read fresh on every fallback hit (so a rebuild
19
+ * producing new hashed asset names doesn't leave the browser
20
+ * pointing at stale URLs).
21
+ * - Hashed asset paths under `/_console/assets/*` never SPA-fallback —
22
+ * a real 404 surfaces a rebuild/deploy mismatch instead of the
23
+ * dreaded "asset returns text/html" silent failure.
24
+ */
25
+ export declare function createConsoleStaticPlugin(distPath: string, options?: {
26
+ isDev?: boolean;
27
+ }): {
28
+ name: string;
29
+ init: () => Promise<void>;
30
+ start: (ctx: any) => Promise<void>;
31
+ };
32
+ //# sourceMappingURL=console.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,169 @@
1
+ // Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.
2
+ /**
3
+ * Console UI Integration Utilities
4
+ *
5
+ * Mirrors `studio.ts` / `account.ts` but for the opinionated, fork-ready
6
+ * runtime console (`@objectstack/console`). The Console SPA is mounted at
7
+ * `/_console/` by every deployment that opts in (CLI dev server,
8
+ * self-host, Vercel) — exactly the same convention as `_studio` and
9
+ * `_account`. The Console is built with `base: '/_console/'`, so its
10
+ * pre-built `dist/` is served verbatim.
11
+ *
12
+ * Note: this module was previously named `dashboard.ts` (and the SPA was
13
+ * `apps/dashboard`). It was renamed to disambiguate from the spec-level
14
+ * `Dashboard` metadata type — the Console *renders* dashboards, it is not
15
+ * itself a dashboard.
16
+ */
17
+ import path from 'path';
18
+ import fs from 'fs';
19
+ import { createRequire } from 'module';
20
+ import { pathToFileURL } from 'url';
21
+ // ─── Constants ──────────────────────────────────────────────────────
22
+ /** URL mount path for the Console portal inside the ObjectStack server */
23
+ export const CONSOLE_PATH = '/_console';
24
+ // ─── Path Resolution ────────────────────────────────────────────────
25
+ /**
26
+ * Resolve the filesystem path to the @objectstack/console package.
27
+ * Searches workspace locations first, then falls back to node_modules.
28
+ */
29
+ export function resolveConsolePath() {
30
+ const cwd = process.cwd();
31
+ // Workspace candidates (monorepo layouts)
32
+ const candidates = [
33
+ path.resolve(cwd, 'apps/console'),
34
+ path.resolve(cwd, '../../apps/console'),
35
+ path.resolve(cwd, '../apps/console'),
36
+ ];
37
+ for (const candidate of candidates) {
38
+ const pkgPath = path.join(candidate, 'package.json');
39
+ if (fs.existsSync(pkgPath)) {
40
+ try {
41
+ const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
42
+ if (pkg.name === '@objectstack/console')
43
+ return candidate;
44
+ }
45
+ catch {
46
+ // Skip invalid package.json
47
+ }
48
+ }
49
+ }
50
+ // Fallback: resolve from node_modules via createRequire.
51
+ const resolutionBases = [
52
+ pathToFileURL(path.join(cwd, 'package.json')).href, // consumer workspace
53
+ import.meta.url, // CLI package itself
54
+ ];
55
+ for (const base of resolutionBases) {
56
+ try {
57
+ const req = createRequire(base);
58
+ const resolved = req.resolve('@objectstack/console/package.json');
59
+ return path.dirname(resolved);
60
+ }
61
+ catch {
62
+ // Not resolvable from this base — try next
63
+ }
64
+ }
65
+ // Last resort: direct filesystem check in cwd/node_modules
66
+ const directPath = path.join(cwd, 'node_modules', '@objectstack', 'console');
67
+ if (fs.existsSync(path.join(directPath, 'package.json'))) {
68
+ return directPath;
69
+ }
70
+ return null;
71
+ }
72
+ /**
73
+ * Check whether the Console portal has a pre-built `dist/` directory.
74
+ */
75
+ export function hasConsoleDist(consolePath) {
76
+ return fs.existsSync(path.join(consolePath, 'dist', 'index.html'));
77
+ }
78
+ // ─── Plugin Factory ─────────────────────────────────────────────────
79
+ /**
80
+ * Create a lightweight kernel plugin that serves the pre-built Console
81
+ * portal static files at `/_console/*`.
82
+ *
83
+ * Identical SPA-fallback semantics to `createStudioStaticPlugin` and
84
+ * `createAccountStaticPlugin`:
85
+ * - `index.html` is read fresh on every fallback hit (so a rebuild
86
+ * producing new hashed asset names doesn't leave the browser
87
+ * pointing at stale URLs).
88
+ * - Hashed asset paths under `/_console/assets/*` never SPA-fallback —
89
+ * a real 404 surfaces a rebuild/deploy mismatch instead of the
90
+ * dreaded "asset returns text/html" silent failure.
91
+ */
92
+ export function createConsoleStaticPlugin(distPath, options) {
93
+ return {
94
+ name: 'com.objectstack.console-static',
95
+ init: async () => { },
96
+ start: async (ctx) => {
97
+ const httpServer = ctx.getService?.('http.server');
98
+ if (!httpServer?.getRawApp) {
99
+ ctx.logger?.warn?.('Console static: http.server service not found — skipping');
100
+ return;
101
+ }
102
+ const app = httpServer.getRawApp();
103
+ const absoluteDist = path.resolve(distPath);
104
+ const indexPath = path.join(absoluteDist, 'index.html');
105
+ if (!fs.existsSync(indexPath)) {
106
+ ctx.logger?.warn?.(`Console static: dist not found at ${absoluteDist}`);
107
+ return;
108
+ }
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) {
114
+ app.get('/', (c) => c.redirect(`${CONSOLE_PATH}/`));
115
+ }
116
+ // Redirect bare path to trailing-slash (SPA convention)
117
+ app.get(CONSOLE_PATH, (c) => c.redirect(`${CONSOLE_PATH}/`));
118
+ // Serve static files with SPA fallback
119
+ app.get(`${CONSOLE_PATH}/*`, async (c) => {
120
+ const reqPath = c.req.path.substring(CONSOLE_PATH.length) || '/';
121
+ const filePath = path.join(absoluteDist, reqPath);
122
+ // Security: prevent path traversal
123
+ if (!filePath.startsWith(absoluteDist)) {
124
+ return c.text('Forbidden', 403);
125
+ }
126
+ // Try serving the exact file
127
+ if (fs.existsSync(filePath) && fs.statSync(filePath).isFile()) {
128
+ const content = fs.readFileSync(filePath);
129
+ return new Response(content, {
130
+ headers: { 'content-type': mimeType(filePath) },
131
+ });
132
+ }
133
+ // Hashed-asset paths must never SPA-fallback.
134
+ if (reqPath.startsWith('/assets/')) {
135
+ return c.text('Not Found', 404);
136
+ }
137
+ // SPA fallback
138
+ return new Response(readIndexHtml(), {
139
+ headers: { 'content-type': 'text/html; charset=utf-8' },
140
+ });
141
+ });
142
+ // Suppress unused-parameter lint when isDev isn't needed.
143
+ void options;
144
+ },
145
+ };
146
+ }
147
+ // ─── Helpers ────────────────────────────────────────────────────────
148
+ const MIME_TYPES = {
149
+ '.html': 'text/html; charset=utf-8',
150
+ '.js': 'application/javascript; charset=utf-8',
151
+ '.mjs': 'application/javascript; charset=utf-8',
152
+ '.css': 'text/css; charset=utf-8',
153
+ '.json': 'application/json; charset=utf-8',
154
+ '.svg': 'image/svg+xml',
155
+ '.png': 'image/png',
156
+ '.jpg': 'image/jpeg',
157
+ '.jpeg': 'image/jpeg',
158
+ '.gif': 'image/gif',
159
+ '.ico': 'image/x-icon',
160
+ '.woff': 'font/woff',
161
+ '.woff2': 'font/woff2',
162
+ '.ttf': 'font/ttf',
163
+ '.map': 'application/json',
164
+ };
165
+ function mimeType(filePath) {
166
+ const ext = path.extname(filePath).toLowerCase();
167
+ return MIME_TYPES[ext] || 'application/octet-stream';
168
+ }
169
+ //# sourceMappingURL=console.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"console.js","sourceRoot":"","sources":["../../src/utils/console.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export interface ExtractedBody {
2
+ /** Pure function-body source (without the surrounding `(ctx) => {...}`). */
3
+ source: string;
4
+ /** Inferred capability tokens — may be merged with explicit `// @capabilities` line. */
5
+ capabilities: Array<'api.read' | 'api.write' | 'crypto.uuid' | 'crypto.hash' | 'log'>;
6
+ /** True when source is a single expression (arrow with implicit return). */
7
+ isExpression: boolean;
8
+ }
9
+ /**
10
+ * Extract the body source from a callable. Throws on forbidden patterns.
11
+ */
12
+ export declare function extractHookBody(fn: (...a: unknown[]) => unknown, originLabel: string): ExtractedBody;
13
+ //# sourceMappingURL=extract-hook-body.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract-hook-body.d.ts","sourceRoot":"","sources":["../../src/utils/extract-hook-body.ts"],"names":[],"mappings":"AAgDA,MAAM,WAAW,aAAa;IAC5B,4EAA4E;IAC5E,MAAM,EAAE,MAAM,CAAC;IACf,wFAAwF;IACxF,YAAY,EAAE,KAAK,CAAC,UAAU,GAAG,WAAW,GAAG,aAAa,GAAG,aAAa,GAAG,KAAK,CAAC,CAAC;IACtF,4EAA4E;IAC5E,YAAY,EAAE,OAAO,CAAC;CACvB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,KAAK,OAAO,EAAE,WAAW,EAAE,MAAM,GAAG,aAAa,CAmDpG"}