@objectstack/cli 5.1.0 → 6.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/dist/commands/dev.d.ts +1 -1
  2. package/dist/commands/dev.js +7 -7
  3. package/dist/commands/dev.js.map +1 -1
  4. package/dist/commands/{projects → environments}/bind.d.ts +3 -3
  5. package/dist/commands/environments/bind.d.ts.map +1 -0
  6. package/dist/commands/{projects → environments}/bind.js +10 -10
  7. package/dist/commands/environments/bind.js.map +1 -0
  8. package/dist/commands/{projects → environments}/create.d.ts +1 -1
  9. package/dist/commands/environments/create.d.ts.map +1 -0
  10. package/dist/commands/{projects → environments}/create.js +3 -3
  11. package/dist/commands/environments/create.js.map +1 -0
  12. package/dist/commands/environments/environments.test.d.ts +2 -0
  13. package/dist/commands/environments/environments.test.d.ts.map +1 -0
  14. package/dist/commands/{projects/projects.test.js → environments/environments.test.js} +2 -2
  15. package/dist/commands/environments/environments.test.js.map +1 -0
  16. package/dist/commands/environments/list.d.ts.map +1 -0
  17. package/dist/commands/{projects → environments}/list.js +1 -1
  18. package/dist/commands/environments/list.js.map +1 -0
  19. package/dist/commands/environments/show.d.ts.map +1 -0
  20. package/dist/commands/environments/show.js.map +1 -0
  21. package/dist/commands/{projects → environments}/switch.d.ts +2 -2
  22. package/dist/commands/environments/switch.d.ts.map +1 -0
  23. package/dist/commands/{projects → environments}/switch.js +3 -3
  24. package/dist/commands/environments/switch.js.map +1 -0
  25. package/dist/commands/package/publish.d.ts +13 -0
  26. package/dist/commands/package/publish.d.ts.map +1 -1
  27. package/dist/commands/package/publish.js +199 -0
  28. package/dist/commands/package/publish.js.map +1 -1
  29. package/dist/commands/publish.d.ts +1 -1
  30. package/dist/commands/publish.js +6 -6
  31. package/dist/commands/publish.js.map +1 -1
  32. package/dist/commands/rollback.d.ts +1 -1
  33. package/dist/commands/rollback.js +7 -7
  34. package/dist/commands/rollback.js.map +1 -1
  35. package/dist/commands/serve.d.ts.map +1 -1
  36. package/dist/commands/serve.js +206 -34
  37. package/dist/commands/serve.js.map +1 -1
  38. package/dist/commands/start.js +4 -4
  39. package/dist/commands/start.js.map +1 -1
  40. package/dist/index.d.ts +5 -5
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +6 -6
  43. package/dist/index.js.map +1 -1
  44. package/dist/utils/api-client.d.ts +3 -3
  45. package/dist/utils/api-client.d.ts.map +1 -1
  46. package/dist/utils/api-client.js +6 -6
  47. package/dist/utils/api-client.js.map +1 -1
  48. package/dist/utils/auth-config.d.ts +1 -1
  49. package/dist/utils/auth-config.d.ts.map +1 -1
  50. package/dist/utils/config.d.ts +9 -0
  51. package/dist/utils/config.d.ts.map +1 -1
  52. package/dist/utils/config.js +24 -0
  53. package/dist/utils/config.js.map +1 -1
  54. package/dist/utils/console.d.ts +10 -2
  55. package/dist/utils/console.d.ts.map +1 -1
  56. package/dist/utils/console.js +88 -34
  57. package/dist/utils/console.js.map +1 -1
  58. package/dist/utils/plugin-detection.js +2 -2
  59. package/dist/utils/plugin-detection.js.map +1 -1
  60. package/dist/utils/studio-field-patch.d.ts +43 -0
  61. package/dist/utils/studio-field-patch.d.ts.map +1 -0
  62. package/dist/utils/studio-field-patch.js +336 -0
  63. package/dist/utils/studio-field-patch.js.map +1 -0
  64. package/dist/utils/studio.d.ts +40 -36
  65. package/dist/utils/studio.d.ts.map +1 -1
  66. package/dist/utils/studio.js +301 -174
  67. package/dist/utils/studio.js.map +1 -1
  68. package/package.json +38 -32
  69. package/dist/commands/projects/bind.d.ts.map +0 -1
  70. package/dist/commands/projects/bind.js.map +0 -1
  71. package/dist/commands/projects/create.d.ts.map +0 -1
  72. package/dist/commands/projects/create.js.map +0 -1
  73. package/dist/commands/projects/list.d.ts.map +0 -1
  74. package/dist/commands/projects/list.js.map +0 -1
  75. package/dist/commands/projects/projects.test.d.ts +0 -2
  76. package/dist/commands/projects/projects.test.d.ts.map +0 -1
  77. package/dist/commands/projects/projects.test.js.map +0 -1
  78. package/dist/commands/projects/show.d.ts.map +0 -1
  79. package/dist/commands/projects/show.js.map +0 -1
  80. package/dist/commands/projects/switch.d.ts.map +0 -1
  81. package/dist/commands/projects/switch.js.map +0 -1
  82. /package/dist/commands/{projects → environments}/list.d.ts +0 -0
  83. /package/dist/commands/{projects → environments}/show.d.ts +0 -0
  84. /package/dist/commands/{projects → environments}/show.js +0 -0
@@ -2,49 +2,38 @@
2
2
  /**
3
3
  * Studio UI Integration Utilities
4
4
  *
5
- * Handles resolving, spawning, and proxying the @objectstack/studio
6
- * frontend when the CLI is started with --ui or via the `studio` command.
5
+ * Handles resolving and serving the `@object-ui/studio` SPA. The Studio
6
+ * source code lives upstream in the `objectstack-ai/objectui` monorepo
7
+ * and is published to npm as `@object-ui/studio`. The framework no
8
+ * longer ships its own copy of the SPA source — we resolve the
9
+ * installed package and serve its pre-built `dist/` verbatim, exactly
10
+ * the same convention used for `@object-ui/console` (see `./console.ts`).
7
11
  */
8
12
  import path from 'path';
9
13
  import fs from 'fs';
10
- import net from 'net';
11
14
  import { createRequire } from 'module';
12
15
  import { pathToFileURL } from 'url';
13
- import { spawn } from 'child_process';
14
16
  // ─── Constants ──────────────────────────────────────────────────────
15
- /** URL mount path for the Console UI inside the ObjectStack server */
17
+ /** URL mount path for the Studio designer inside the ObjectStack server */
16
18
  export const STUDIO_PATH = '/_studio';
17
- /** Internal port range start for the Vite dev server */
18
- const VITE_PORT_START = 24678;
19
+ /** npm package name for the upstream Studio SPA. */
20
+ const STUDIO_PACKAGE = '@object-ui/studio';
19
21
  // ─── Path Resolution ────────────────────────────────────────────────
20
22
  /**
21
- * Resolve the filesystem path to the @objectstack/studio package.
22
- * Searches workspace locations first, then falls back to node_modules.
23
+ * Resolve the filesystem path to the `@object-ui/studio` package.
24
+ *
25
+ * Resolution order (mirrors `resolveConsolePath`):
26
+ * 1. `require.resolve` from the consumer cwd (typical app install).
27
+ * 2. `require.resolve` from this CLI's own location (pnpm workspace).
28
+ * 3. Direct `<cwd>/node_modules/@object-ui/studio` filesystem check.
29
+ * 4. Sibling-repo dev fallback — `../objectui/apps/studio` — so the
30
+ * framework monorepo can be developed against an in-tree checkout
31
+ * of objectui without publishing every change. Matched by checking
32
+ * `package.json.name === "@object-ui/studio"`.
23
33
  */
24
34
  export function resolveStudioPath() {
25
35
  const cwd = process.cwd();
26
- // Workspace candidates (monorepo layouts)
27
- const candidates = [
28
- path.resolve(cwd, 'apps/studio'),
29
- path.resolve(cwd, '../../apps/studio'),
30
- path.resolve(cwd, '../apps/studio'),
31
- ];
32
- for (const candidate of candidates) {
33
- const pkgPath = path.join(candidate, 'package.json');
34
- if (fs.existsSync(pkgPath)) {
35
- try {
36
- const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
37
- if (pkg.name === '@objectstack/studio')
38
- return candidate;
39
- }
40
- catch {
41
- // Skip invalid package.json
42
- }
43
- }
44
- }
45
- // Fallback: resolve from node_modules via createRequire.
46
- // Try the consumer's cwd first (pnpm strict isolation means the CLI's own
47
- // import.meta.url cannot see the consumer's dependencies), then the CLI itself.
36
+ // 1 + 2: node module resolution from cwd and from the CLI itself.
48
37
  const resolutionBases = [
49
38
  pathToFileURL(path.join(cwd, 'package.json')).href, // consumer workspace
50
39
  import.meta.url, // CLI package itself
@@ -52,158 +41,49 @@ export function resolveStudioPath() {
52
41
  for (const base of resolutionBases) {
53
42
  try {
54
43
  const req = createRequire(base);
55
- const resolved = req.resolve('@objectstack/studio/package.json');
44
+ // `@object-ui/studio` ships only `dist/` files (no `main`/`exports`
45
+ // pointing at JS), so the package can't be resolved as a bare
46
+ // import. Resolve `package.json` directly — it's always in the
47
+ // package root and not gated by an `exports` field unless the
48
+ // publisher explicitly removes it (this package doesn't).
49
+ const resolved = req.resolve(`${STUDIO_PACKAGE}/package.json`);
56
50
  return path.dirname(resolved);
57
51
  }
58
52
  catch {
59
- // Not resolvable from this base — try next
53
+ // Not resolvable from this base — try next.
60
54
  }
61
55
  }
62
- // Last resort: direct filesystem check in cwd/node_modules
63
- const directPath = path.join(cwd, 'node_modules', '@objectstack', 'studio');
56
+ // 3: direct filesystem check in cwd/node_modules.
57
+ const directPath = path.join(cwd, 'node_modules', '@object-ui', 'studio');
64
58
  if (fs.existsSync(path.join(directPath, 'package.json'))) {
65
59
  return directPath;
66
60
  }
67
- return null;
68
- }
69
- /**
70
- * Check whether the Studio has a pre-built `dist/` directory.
71
- */
72
- export function hasStudioDist(studioPath) {
73
- return fs.existsSync(path.join(studioPath, 'dist', 'index.html'));
74
- }
75
- // ─── Port Utilities ─────────────────────────────────────────────────
76
- /**
77
- * Find the next available TCP port starting from `start`.
78
- */
79
- export function findAvailablePort(start = VITE_PORT_START) {
80
- return new Promise((resolve, reject) => {
81
- const server = net.createServer();
82
- server.once('error', () => {
83
- // Port in use — try next
84
- findAvailablePort(start + 1).then(resolve, reject);
85
- });
86
- server.once('listening', () => {
87
- server.close(() => resolve(start));
88
- });
89
- server.listen(start);
90
- });
91
- }
92
- /**
93
- * Spawn a Vite dev server for the Console application.
94
- *
95
- * Sets environment variables so the Console runs in server mode and
96
- * connects to the ObjectStack API on the same origin.
97
- *
98
- * @param studioPath - Absolute path to the @objectstack/studio package
99
- * @param options.serverPort - The main ObjectStack server port (for display only)
100
- */
101
- export async function spawnViteDevServer(studioPath, options = {}) {
102
- const vitePort = await findAvailablePort(VITE_PORT_START);
103
- // Resolve the Vite binary from the Studio's own dependencies
104
- const viteBinCandidates = [
105
- path.join(studioPath, 'node_modules', '.bin', 'vite'),
106
- path.join(studioPath, '..', '..', 'node_modules', '.bin', 'vite'),
61
+ // 4: sibling-repo dev fallback. Useful when iterating on Studio
62
+ // source inside `objectui` while running the framework CLI here.
63
+ const siblingCandidates = [
64
+ path.resolve(cwd, '../objectui/apps/studio'),
65
+ path.resolve(cwd, '../../objectui/apps/studio'),
107
66
  ];
108
- let viteBin = null;
109
- for (const candidate of viteBinCandidates) {
110
- if (fs.existsSync(candidate)) {
111
- viteBin = candidate;
112
- break;
113
- }
114
- }
115
- const command = viteBin || 'npx';
116
- const args = viteBin
117
- ? ['--port', String(vitePort), '--strictPort']
118
- : ['vite', '--port', String(vitePort), '--strictPort'];
119
- const child = spawn(command, args, {
120
- cwd: studioPath,
121
- env: {
122
- ...process.env,
123
- VITE_BASE: `${STUDIO_PATH}/`,
124
- VITE_PORT: String(vitePort),
125
- VITE_HMR_PORT: String(vitePort),
126
- VITE_RUNTIME_MODE: 'server',
127
- VITE_SERVER_URL: '', // Same-origin API
128
- NODE_ENV: 'development',
129
- },
130
- stdio: ['ignore', 'pipe', 'pipe'],
131
- });
132
- // Accumulate stderr for error reporting
133
- let stderr = '';
134
- child.stderr?.on('data', (data) => {
135
- stderr += data.toString();
136
- });
137
- // Wait for Vite to signal readiness
138
- await new Promise((resolve, reject) => {
139
- const timeout = setTimeout(() => {
140
- child.kill();
141
- reject(new Error(`Vite dev server timed out after 30 s.\n${stderr}`));
142
- }, 30_000);
143
- child.stdout?.on('data', (data) => {
144
- const output = data.toString();
145
- // Vite prints "ready in Xms" or "Local: http://..." when ready
146
- if (output.includes('Local:') || output.includes('ready in')) {
147
- clearTimeout(timeout);
148
- resolve();
67
+ for (const candidate of siblingCandidates) {
68
+ const pkgPath = path.join(candidate, 'package.json');
69
+ if (fs.existsSync(pkgPath)) {
70
+ try {
71
+ const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
72
+ if (pkg.name === STUDIO_PACKAGE)
73
+ return candidate;
149
74
  }
150
- });
151
- child.on('error', (err) => {
152
- clearTimeout(timeout);
153
- reject(err);
154
- });
155
- child.on('exit', (code) => {
156
- if (code !== 0 && code !== null) {
157
- clearTimeout(timeout);
158
- reject(new Error(`Vite exited with code ${code}.\n${stderr}`));
75
+ catch {
76
+ // Skip invalid package.json
159
77
  }
160
- });
161
- });
162
- return { port: vitePort, process: child };
78
+ }
79
+ }
80
+ return null;
163
81
  }
164
- // ─── Console Plugin Factories ───────────────────────────────────────
165
82
  /**
166
- * Create a lightweight kernel plugin that proxies `/_studio/*` requests
167
- * to the Vite dev server. Used in development mode.
83
+ * Check whether the Studio package has a pre-built `dist/` directory.
168
84
  */
169
- export function createStudioProxyPlugin(vitePort) {
170
- return {
171
- name: 'com.objectstack.studio-proxy',
172
- init: async () => { },
173
- start: async (ctx) => {
174
- const httpServer = ctx.getService?.('http.server');
175
- if (!httpServer?.getRawApp) {
176
- ctx.logger?.warn?.('Studio proxy: http.server service not found — skipping');
177
- return;
178
- }
179
- const app = httpServer.getRawApp();
180
- // Redirect bare path to trailing-slash (SPA convention)
181
- app.get(STUDIO_PATH, (c) => c.redirect(`${STUDIO_PATH}/`));
182
- // Proxy all /_studio/* requests to the Vite dev server
183
- app.all(`${STUDIO_PATH}/*`, async (c) => {
184
- const targetUrl = `http://localhost:${vitePort}${c.req.path}`;
185
- try {
186
- const headers = new Headers(c.req.raw.headers);
187
- headers.delete('host');
188
- const isBodyAllowed = !['GET', 'HEAD'].includes(c.req.method);
189
- const resp = await fetch(targetUrl, {
190
- method: c.req.method,
191
- headers,
192
- body: isBodyAllowed ? c.req.raw.body : undefined,
193
- duplex: isBodyAllowed ? 'half' : undefined,
194
- });
195
- // Forward the full response (status, headers, body)
196
- return new Response(resp.body, {
197
- status: resp.status,
198
- headers: resp.headers,
199
- });
200
- }
201
- catch {
202
- return c.text('Console dev server is starting…', 502);
203
- }
204
- });
205
- },
206
- };
85
+ export function hasStudioDist(studioPath) {
86
+ return fs.existsSync(path.join(studioPath, 'dist', 'index.html'));
207
87
  }
208
88
  /**
209
89
  * Create a lightweight kernel plugin that serves the pre-built Studio
@@ -229,16 +109,32 @@ export function createStudioStaticPlugin(distPath, options) {
229
109
  ctx.logger?.warn?.(`Studio static: dist not found at ${absoluteDist}`);
230
110
  return;
231
111
  }
232
- // Studio is always built with `base: '/_studio/'`, so its asset URLs
233
- // (and runtime router basepath) are already absolute and correct. We
234
- // can serve the pre-built dist verbatim.
112
+ // The published @object-ui/studio build uses RELATIVE asset URLs
113
+ // (`./assets/...`) so the same bundle can be mounted at any path.
114
+ // Inject `<base href="${STUDIO_PATH}/">` into index.html so:
115
+ // 1. Relative asset URLs resolve against the mount point
116
+ // regardless of how deep the SPA-fallback route is
117
+ // (e.g. `/_studio/objects/foo/edit` would otherwise try to
118
+ // fetch `/_studio/objects/foo/assets/...`).
119
+ // 2. The SPA's router can derive its basename from
120
+ // `document.baseURI` if it needs to.
121
+ //
122
+ // Idempotent — older Studio builds that already shipped an
123
+ // absolute `<base>` or were built with `base: '/_studio/'` are
124
+ // left untouched.
235
125
  //
236
126
  // IMPORTANT: read index.html fresh on every fallback hit. Caching the
237
127
  // bytes at startup means a Studio rebuild (which mints new hashed asset
238
128
  // names) yields a server that points the browser at non-existent assets,
239
129
  // and the SPA fallback then re-serves the stale HTML with text/html MIME
240
130
  // — producing the "Failed to load module script" browser error.
241
- const readIndexHtml = () => fs.readFileSync(indexPath, 'utf-8');
131
+ const readIndexHtml = () => {
132
+ const raw = fs.readFileSync(indexPath, 'utf-8');
133
+ if (/<base\s/i.test(raw))
134
+ return raw;
135
+ const baseTag = `<base href="${STUDIO_PATH}/">`;
136
+ return raw.replace(/<head(\s[^>]*)?>/i, (m) => `${m}\n ${baseTag}`);
137
+ };
242
138
  // Redirect root to Studio when the orchestrator says so. This is the
243
139
  // case in dev mode (convenience), and also in production deployments
244
140
  // that disable the runtime Console (e.g. control-plane hosts like
@@ -256,8 +152,14 @@ export function createStudioStaticPlugin(distPath, options) {
256
152
  if (!filePath.startsWith(absoluteDist)) {
257
153
  return c.text('Forbidden', 403);
258
154
  }
259
- // Try serving the exact file
155
+ // Try serving the exact file (HTML files go through the base-tag
156
+ // injection path so all entry points stay path-portable).
260
157
  if (fs.existsSync(filePath) && fs.statSync(filePath).isFile()) {
158
+ if (filePath.endsWith('.html')) {
159
+ return new Response(readIndexHtml(), {
160
+ headers: { 'content-type': 'text/html; charset=utf-8' },
161
+ });
162
+ }
261
163
  const content = fs.readFileSync(filePath);
262
164
  return new Response(content, {
263
165
  headers: { 'content-type': mimeType(filePath) },
@@ -278,6 +180,231 @@ export function createStudioStaticPlugin(distPath, options) {
278
180
  },
279
181
  };
280
182
  }
183
+ // ─── Dev-only Write API ─────────────────────────────────────────────
184
+ /**
185
+ * Dev-only plugin that exposes a tiny write API at
186
+ * `/_studio/api/metadata/*` so Studio's "Create" dialogs can scaffold
187
+ * real `.ts` files instead of asking the user to paste a snippet.
188
+ *
189
+ * Security posture: enabled ONLY when `isDev === true`. All file paths
190
+ * must live under `<cwd>`, contain a `/src/` segment, and carry an
191
+ * approved extension. Path traversal (`..`) and absolute paths are
192
+ * rejected outright. Existing files are NEVER overwritten unless the
193
+ * caller passes `mode: 'overwrite'`.
194
+ *
195
+ * Endpoints:
196
+ * GET /_studio/api/metadata/layout?package=<id>
197
+ * 200: { srcRoot: string } relative to cwd, e.g. "src" or "packages/<id>/src"
198
+ *
199
+ * POST /_studio/api/metadata/file
200
+ * body: { path: string, content: string, mode?: 'create' | 'overwrite' }
201
+ * 200: { ok: true, path: string }
202
+ * 409: { ok: false, error: 'exists' }
203
+ * 400: { ok: false, error: ... }
204
+ */
205
+ export function createStudioWriteApiPlugin(cwd, options = { isDev: false }) {
206
+ return {
207
+ name: 'com.objectstack.studio-write-api',
208
+ init: async () => { },
209
+ start: async (ctx) => {
210
+ if (!options.isDev)
211
+ return;
212
+ const httpServer = ctx.getService?.('http.server');
213
+ if (!httpServer?.getRawApp) {
214
+ ctx.logger?.warn?.('Studio write API: http.server not found — skipping');
215
+ return;
216
+ }
217
+ const app = httpServer.getRawApp();
218
+ const projectRoot = path.resolve(cwd);
219
+ const ALLOWED_EXT = new Set(['.ts', '.tsx', '.json']);
220
+ const respond = (_c, status, body) => new Response(JSON.stringify(body), {
221
+ status,
222
+ headers: { 'content-type': 'application/json; charset=utf-8' },
223
+ });
224
+ // Resolve the most likely source-code root for a given package id.
225
+ const resolveSrcRoot = (pkgId) => {
226
+ const candidates = [
227
+ pkgId ? path.join('packages', pkgId, 'src') : null,
228
+ pkgId ? path.join('examples', pkgId, 'src') : null,
229
+ 'src', // single-app project layout
230
+ ].filter(Boolean);
231
+ for (const c of candidates) {
232
+ if (fs.existsSync(path.join(projectRoot, c)))
233
+ return c;
234
+ }
235
+ return null;
236
+ };
237
+ app.get(`${STUDIO_PATH}/api/metadata/layout`, (c) => {
238
+ const pkgId = c.req.query?.('package') ?? null;
239
+ const srcRoot = resolveSrcRoot(pkgId);
240
+ return respond(c, 200, { srcRoot });
241
+ });
242
+ app.post(`${STUDIO_PATH}/api/metadata/file`, async (c) => {
243
+ let body;
244
+ try {
245
+ body = await c.req.json();
246
+ }
247
+ catch {
248
+ return respond(c, 400, { ok: false, error: 'invalid json body' });
249
+ }
250
+ const rel = typeof body?.path === 'string' ? body.path : '';
251
+ const content = typeof body?.content === 'string' ? body.content : '';
252
+ const mode = body?.mode === 'overwrite' ? 'overwrite' : 'create';
253
+ if (!rel)
254
+ return respond(c, 400, { ok: false, error: 'path is required' });
255
+ if (path.isAbsolute(rel) || rel.split(/[\\/]/).includes('..')) {
256
+ return respond(c, 400, { ok: false, error: 'path must be a project-relative path without `..`' });
257
+ }
258
+ const ext = path.extname(rel).toLowerCase();
259
+ if (!ALLOWED_EXT.has(ext)) {
260
+ return respond(c, 400, { ok: false, error: `unsupported extension ${ext}` });
261
+ }
262
+ const abs = path.resolve(projectRoot, rel);
263
+ if (!abs.startsWith(projectRoot + path.sep)) {
264
+ return respond(c, 400, { ok: false, error: 'path escapes project root' });
265
+ }
266
+ // Must contain a `/src/` segment — keeps writes scoped to source
267
+ // code, not random config files at the repo root.
268
+ const segments = path.relative(projectRoot, abs).split(path.sep);
269
+ if (!segments.includes('src')) {
270
+ return respond(c, 400, { ok: false, error: 'path must live under a src/ directory' });
271
+ }
272
+ if (fs.existsSync(abs) && mode === 'create') {
273
+ return respond(c, 409, { ok: false, error: 'exists' });
274
+ }
275
+ try {
276
+ await fs.promises.mkdir(path.dirname(abs), { recursive: true });
277
+ await fs.promises.writeFile(abs, content, 'utf-8');
278
+ ctx.logger?.info?.(`Studio write API: ${mode} ${rel}`);
279
+ return respond(c, 200, { ok: true, path: rel });
280
+ }
281
+ catch (err) {
282
+ ctx.logger?.error?.(`Studio write API failed: ${err?.message}`);
283
+ return respond(c, 500, { ok: false, error: err?.message ?? String(err) });
284
+ }
285
+ });
286
+ ctx.logger?.info?.(`Studio write API mounted at ${STUDIO_PATH}/api/metadata/* (dev mode)`);
287
+ /**
288
+ * Shared validation for endpoints that mutate an existing `.ts`
289
+ * source file by relative path. Returns `{ abs }` on success or
290
+ * a respond() Response when validation fails.
291
+ */
292
+ const validateTsPath = (c, rel) => {
293
+ if (!rel)
294
+ return respond(c, 400, { ok: false, error: 'path is required' });
295
+ if (path.isAbsolute(rel) || rel.split(/[\\/]/).includes('..')) {
296
+ return respond(c, 400, { ok: false, error: 'path must be a project-relative path without `..`' });
297
+ }
298
+ if (path.extname(rel).toLowerCase() !== '.ts') {
299
+ return respond(c, 400, { ok: false, error: 'only .ts files are supported' });
300
+ }
301
+ const abs = path.resolve(projectRoot, rel);
302
+ if (!abs.startsWith(projectRoot + path.sep)) {
303
+ return respond(c, 400, { ok: false, error: 'path escapes project root' });
304
+ }
305
+ if (!path.relative(projectRoot, abs).split(path.sep).includes('src')) {
306
+ return respond(c, 400, { ok: false, error: 'path must live under a src/ directory' });
307
+ }
308
+ if (!fs.existsSync(abs)) {
309
+ return respond(c, 404, { ok: false, error: 'file not found' });
310
+ }
311
+ return { abs };
312
+ };
313
+ app.post(`${STUDIO_PATH}/api/metadata/field-patch`, async (c) => {
314
+ let body;
315
+ try {
316
+ body = await c.req.json();
317
+ }
318
+ catch {
319
+ return respond(c, 400, { ok: false, error: 'invalid json body' });
320
+ }
321
+ const rel = typeof body?.path === 'string' ? body.path : '';
322
+ const fieldKey = typeof body?.field === 'string' ? body.field : '';
323
+ const patch = body?.patch && typeof body.patch === 'object' ? body.patch : null;
324
+ if (!fieldKey || !patch) {
325
+ return respond(c, 400, { ok: false, error: 'field and patch are required' });
326
+ }
327
+ const v = validateTsPath(c, rel);
328
+ if (!v.abs)
329
+ return v;
330
+ try {
331
+ const { patchObjectFieldFile } = await import('./studio-field-patch.js');
332
+ const result = await patchObjectFieldFile(v.abs, fieldKey, patch);
333
+ if (!result.ok)
334
+ return respond(c, 400, result);
335
+ ctx.logger?.info?.(`Studio field-patch: ${rel} field=${fieldKey} keys=${Object.keys(patch).join(',')}`);
336
+ return respond(c, 200, { ok: true, path: rel, field: fieldKey });
337
+ }
338
+ catch (err) {
339
+ ctx.logger?.error?.(`Studio field-patch failed: ${err?.message}`);
340
+ return respond(c, 500, { ok: false, error: err?.message ?? String(err) });
341
+ }
342
+ });
343
+ app.post(`${STUDIO_PATH}/api/metadata/field-add`, async (c) => {
344
+ let body;
345
+ try {
346
+ body = await c.req.json();
347
+ }
348
+ catch {
349
+ return respond(c, 400, { ok: false, error: 'invalid json body' });
350
+ }
351
+ const rel = typeof body?.path === 'string' ? body.path : '';
352
+ const fieldName = typeof body?.fieldName === 'string' ? body.fieldName : '';
353
+ const initializer = typeof body?.initializer === 'string' ? body.initializer : '';
354
+ if (!fieldName || !initializer) {
355
+ return respond(c, 400, { ok: false, error: 'fieldName and initializer are required' });
356
+ }
357
+ const v = validateTsPath(c, rel);
358
+ if (!v.abs)
359
+ return v;
360
+ try {
361
+ const { addObjectField } = await import('./studio-field-patch.js');
362
+ const result = await addObjectField(v.abs, fieldName, initializer);
363
+ if (!result.ok) {
364
+ // Existing field is a 409 conflict; other errors stay 400.
365
+ const status = result.error.includes('already exists') ? 409 : 400;
366
+ return respond(c, status, result);
367
+ }
368
+ ctx.logger?.info?.(`Studio field-add: ${rel} field=${fieldName}`);
369
+ return respond(c, 200, { ok: true, path: rel, field: fieldName });
370
+ }
371
+ catch (err) {
372
+ ctx.logger?.error?.(`Studio field-add failed: ${err?.message}`);
373
+ return respond(c, 500, { ok: false, error: err?.message ?? String(err) });
374
+ }
375
+ });
376
+ app.post(`${STUDIO_PATH}/api/metadata/field-reorder`, async (c) => {
377
+ let body;
378
+ try {
379
+ body = await c.req.json();
380
+ }
381
+ catch {
382
+ return respond(c, 400, { ok: false, error: 'invalid json body' });
383
+ }
384
+ const rel = typeof body?.path === 'string' ? body.path : '';
385
+ const order = Array.isArray(body?.order) ? body.order.filter((s) => typeof s === 'string') : null;
386
+ if (!order || order.length === 0) {
387
+ return respond(c, 400, { ok: false, error: 'order is required (non-empty string[])' });
388
+ }
389
+ const v = validateTsPath(c, rel);
390
+ if (!v.abs)
391
+ return v;
392
+ try {
393
+ const { reorderObjectFields } = await import('./studio-field-patch.js');
394
+ const result = await reorderObjectFields(v.abs, order);
395
+ if (!result.ok)
396
+ return respond(c, 400, result);
397
+ ctx.logger?.info?.(`Studio field-reorder: ${rel} (${order.length} fields)`);
398
+ return respond(c, 200, { ok: true, path: rel, count: order.length });
399
+ }
400
+ catch (err) {
401
+ ctx.logger?.error?.(`Studio field-reorder failed: ${err?.message}`);
402
+ return respond(c, 500, { ok: false, error: err?.message ?? String(err) });
403
+ }
404
+ });
405
+ },
406
+ };
407
+ }
281
408
  // ─── Helpers ────────────────────────────────────────────────────────
282
409
  const MIME_TYPES = {
283
410
  '.html': 'text/html; charset=utf-8',
@@ -1 +1 @@
1
- {"version":3,"file":"studio.js","sourceRoot":"","sources":["../../src/utils/studio.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"studio.js","sourceRoot":"","sources":["../../src/utils/studio.ts"],"names":[],"mappings":"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"}