@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.
@@ -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
@@ -1 +0,0 @@
1
- {"version":3,"file":"studio.js","sourceRoot":"","sources":["../../src/utils/studio.ts"],"names":[],"mappings":"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"}