@objectstack/cli 6.8.0 → 6.9.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.
- package/README.md +23 -0
- package/dist/commands/dev.d.ts +1 -1
- package/dist/commands/dev.d.ts.map +1 -1
- package/dist/commands/dev.js +8 -3
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/serve.d.ts +1 -1
- package/dist/commands/serve.d.ts.map +1 -1
- package/dist/commands/serve.js +49 -72
- package/dist/commands/serve.js.map +1 -1
- package/dist/commands/start.d.ts +3 -3
- package/dist/commands/start.d.ts.map +1 -1
- package/dist/commands/start.js +17 -9
- package/dist/commands/start.js.map +1 -1
- package/dist/utils/account.d.ts +1 -1
- package/dist/utils/account.js +1 -1
- package/dist/utils/console.d.ts +1 -1
- package/dist/utils/console.js +6 -6
- package/dist/utils/console.js.map +1 -1
- package/dist/utils/format.d.ts +0 -1
- package/dist/utils/format.d.ts.map +1 -1
- package/dist/utils/format.js +0 -3
- package/dist/utils/format.js.map +1 -1
- package/dist/utils/plugin-detection.js +1 -1
- package/package.json +37 -38
- package/dist/commands/studio.d.ts +0 -19
- package/dist/commands/studio.d.ts.map +0 -1
- package/dist/commands/studio.js +0 -43
- package/dist/commands/studio.js.map +0 -1
- package/dist/utils/studio-field-patch.d.ts +0 -43
- package/dist/utils/studio-field-patch.d.ts.map +0 -1
- package/dist/utils/studio-field-patch.js +0 -336
- package/dist/utils/studio-field-patch.js.map +0 -1
- package/dist/utils/studio.d.ts +0 -63
- package/dist/utils/studio.d.ts.map +0 -1
- package/dist/utils/studio.js +0 -430
- package/dist/utils/studio.js.map +0 -1
package/dist/utils/studio.js
DELETED
|
@@ -1,430 +0,0 @@
|
|
|
1
|
-
// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.
|
|
2
|
-
/**
|
|
3
|
-
* Studio UI Integration Utilities
|
|
4
|
-
*
|
|
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`).
|
|
11
|
-
*/
|
|
12
|
-
import path from 'path';
|
|
13
|
-
import fs from 'fs';
|
|
14
|
-
import { createRequire } from 'module';
|
|
15
|
-
import { pathToFileURL } from 'url';
|
|
16
|
-
// ─── Constants ──────────────────────────────────────────────────────
|
|
17
|
-
/** URL mount path for the Studio designer inside the ObjectStack server */
|
|
18
|
-
export const STUDIO_PATH = '/_studio';
|
|
19
|
-
/** npm package name for the upstream Studio SPA. */
|
|
20
|
-
const STUDIO_PACKAGE = '@object-ui/studio';
|
|
21
|
-
// ─── Path Resolution ────────────────────────────────────────────────
|
|
22
|
-
/**
|
|
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"`.
|
|
33
|
-
*/
|
|
34
|
-
export function resolveStudioPath() {
|
|
35
|
-
const cwd = process.cwd();
|
|
36
|
-
// 1 + 2: node module resolution from cwd and from the CLI itself.
|
|
37
|
-
const resolutionBases = [
|
|
38
|
-
pathToFileURL(path.join(cwd, 'package.json')).href, // consumer workspace
|
|
39
|
-
import.meta.url, // CLI package itself
|
|
40
|
-
];
|
|
41
|
-
for (const base of resolutionBases) {
|
|
42
|
-
try {
|
|
43
|
-
const req = createRequire(base);
|
|
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`);
|
|
50
|
-
return path.dirname(resolved);
|
|
51
|
-
}
|
|
52
|
-
catch {
|
|
53
|
-
// Not resolvable from this base — try next.
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
// 3: direct filesystem check in cwd/node_modules.
|
|
57
|
-
const directPath = path.join(cwd, 'node_modules', '@object-ui', 'studio');
|
|
58
|
-
if (fs.existsSync(path.join(directPath, 'package.json'))) {
|
|
59
|
-
return directPath;
|
|
60
|
-
}
|
|
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'),
|
|
66
|
-
];
|
|
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;
|
|
74
|
-
}
|
|
75
|
-
catch {
|
|
76
|
-
// Skip invalid package.json
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
return null;
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* Check whether the Studio package has a pre-built `dist/` directory.
|
|
84
|
-
*/
|
|
85
|
-
export function hasStudioDist(studioPath) {
|
|
86
|
-
return fs.existsSync(path.join(studioPath, 'dist', 'index.html'));
|
|
87
|
-
}
|
|
88
|
-
/**
|
|
89
|
-
* Create a lightweight kernel plugin that serves the pre-built Studio
|
|
90
|
-
* static files at `/_studio/*`. Used in production mode.
|
|
91
|
-
*
|
|
92
|
-
* Uses Node.js built-in fs for static file serving to avoid external
|
|
93
|
-
* bundling dependencies.
|
|
94
|
-
*/
|
|
95
|
-
export function createStudioStaticPlugin(distPath, options) {
|
|
96
|
-
return {
|
|
97
|
-
name: 'com.objectstack.studio-static',
|
|
98
|
-
init: async () => { },
|
|
99
|
-
start: async (ctx) => {
|
|
100
|
-
const httpServer = ctx.getService?.('http.server');
|
|
101
|
-
if (!httpServer?.getRawApp) {
|
|
102
|
-
ctx.logger?.warn?.('Studio static: http.server service not found — skipping');
|
|
103
|
-
return;
|
|
104
|
-
}
|
|
105
|
-
const app = httpServer.getRawApp();
|
|
106
|
-
const absoluteDist = path.resolve(distPath);
|
|
107
|
-
const indexPath = path.join(absoluteDist, 'index.html');
|
|
108
|
-
if (!fs.existsSync(indexPath)) {
|
|
109
|
-
ctx.logger?.warn?.(`Studio static: dist not found at ${absoluteDist}`);
|
|
110
|
-
return;
|
|
111
|
-
}
|
|
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.
|
|
125
|
-
//
|
|
126
|
-
// IMPORTANT: read index.html fresh on every fallback hit. Caching the
|
|
127
|
-
// bytes at startup means a Studio rebuild (which mints new hashed asset
|
|
128
|
-
// names) yields a server that points the browser at non-existent assets,
|
|
129
|
-
// and the SPA fallback then re-serves the stale HTML with text/html MIME
|
|
130
|
-
// — producing the "Failed to load module script" browser error.
|
|
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
|
-
};
|
|
138
|
-
// Redirect root to Studio when the orchestrator says so. This is the
|
|
139
|
-
// case in dev mode (convenience), and also in production deployments
|
|
140
|
-
// that disable the runtime Console (e.g. control-plane hosts like
|
|
141
|
-
// `apps/cloud` set OS_DISABLE_CONSOLE=1 so Studio owns `/`).
|
|
142
|
-
if (options?.rootRedirect !== false) {
|
|
143
|
-
app.get('/', (c) => c.redirect(`${STUDIO_PATH}/`));
|
|
144
|
-
}
|
|
145
|
-
// Redirect bare path
|
|
146
|
-
app.get(STUDIO_PATH, (c) => c.redirect(`${STUDIO_PATH}/`));
|
|
147
|
-
// Serve static files with SPA fallback
|
|
148
|
-
app.get(`${STUDIO_PATH}/*`, async (c) => {
|
|
149
|
-
const reqPath = c.req.path.substring(STUDIO_PATH.length) || '/';
|
|
150
|
-
const filePath = path.join(absoluteDist, reqPath);
|
|
151
|
-
// Security: prevent path traversal
|
|
152
|
-
if (!filePath.startsWith(absoluteDist)) {
|
|
153
|
-
return c.text('Forbidden', 403);
|
|
154
|
-
}
|
|
155
|
-
// Try serving the exact file (HTML files go through the base-tag
|
|
156
|
-
// injection path so all entry points stay path-portable).
|
|
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
|
-
}
|
|
163
|
-
const content = fs.readFileSync(filePath);
|
|
164
|
-
return new Response(content, {
|
|
165
|
-
headers: { 'content-type': mimeType(filePath) },
|
|
166
|
-
});
|
|
167
|
-
}
|
|
168
|
-
// Hashed-asset paths must never SPA-fallback. Otherwise a stale HTML
|
|
169
|
-
// pointing at a removed asset name silently degrades into "asset URL
|
|
170
|
-
// returns text/html" and the browser refuses to execute the module.
|
|
171
|
-
// Returning a real 404 surfaces the rebuild/redeploy mismatch instead.
|
|
172
|
-
if (reqPath.startsWith('/assets/')) {
|
|
173
|
-
return c.text('Not Found', 404);
|
|
174
|
-
}
|
|
175
|
-
// SPA fallback: serve index.html for non-file, non-asset routes
|
|
176
|
-
return new Response(readIndexHtml(), {
|
|
177
|
-
headers: { 'content-type': 'text/html; charset=utf-8' },
|
|
178
|
-
});
|
|
179
|
-
});
|
|
180
|
-
},
|
|
181
|
-
};
|
|
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
|
-
}
|
|
408
|
-
// ─── Helpers ────────────────────────────────────────────────────────
|
|
409
|
-
const MIME_TYPES = {
|
|
410
|
-
'.html': 'text/html; charset=utf-8',
|
|
411
|
-
'.js': 'application/javascript; charset=utf-8',
|
|
412
|
-
'.mjs': 'application/javascript; charset=utf-8',
|
|
413
|
-
'.css': 'text/css; charset=utf-8',
|
|
414
|
-
'.json': 'application/json; charset=utf-8',
|
|
415
|
-
'.svg': 'image/svg+xml',
|
|
416
|
-
'.png': 'image/png',
|
|
417
|
-
'.jpg': 'image/jpeg',
|
|
418
|
-
'.jpeg': 'image/jpeg',
|
|
419
|
-
'.gif': 'image/gif',
|
|
420
|
-
'.ico': 'image/x-icon',
|
|
421
|
-
'.woff': 'font/woff',
|
|
422
|
-
'.woff2': 'font/woff2',
|
|
423
|
-
'.ttf': 'font/ttf',
|
|
424
|
-
'.map': 'application/json',
|
|
425
|
-
};
|
|
426
|
-
function mimeType(filePath) {
|
|
427
|
-
const ext = path.extname(filePath).toLowerCase();
|
|
428
|
-
return MIME_TYPES[ext] || 'application/octet-stream';
|
|
429
|
-
}
|
|
430
|
-
//# sourceMappingURL=studio.js.map
|
package/dist/utils/studio.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"studio.js","sourceRoot":"","sources":["../../src/utils/studio.ts"],"names":[],"mappings":"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"}
|