@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.
- package/dist/commands/dev.d.ts +1 -1
- package/dist/commands/dev.js +7 -7
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/{projects → environments}/bind.d.ts +3 -3
- package/dist/commands/environments/bind.d.ts.map +1 -0
- package/dist/commands/{projects → environments}/bind.js +10 -10
- package/dist/commands/environments/bind.js.map +1 -0
- package/dist/commands/{projects → environments}/create.d.ts +1 -1
- package/dist/commands/environments/create.d.ts.map +1 -0
- package/dist/commands/{projects → environments}/create.js +3 -3
- package/dist/commands/environments/create.js.map +1 -0
- package/dist/commands/environments/environments.test.d.ts +2 -0
- package/dist/commands/environments/environments.test.d.ts.map +1 -0
- package/dist/commands/{projects/projects.test.js → environments/environments.test.js} +2 -2
- package/dist/commands/environments/environments.test.js.map +1 -0
- package/dist/commands/environments/list.d.ts.map +1 -0
- package/dist/commands/{projects → environments}/list.js +1 -1
- package/dist/commands/environments/list.js.map +1 -0
- package/dist/commands/environments/show.d.ts.map +1 -0
- package/dist/commands/environments/show.js.map +1 -0
- package/dist/commands/{projects → environments}/switch.d.ts +2 -2
- package/dist/commands/environments/switch.d.ts.map +1 -0
- package/dist/commands/{projects → environments}/switch.js +3 -3
- package/dist/commands/environments/switch.js.map +1 -0
- package/dist/commands/package/publish.d.ts +13 -0
- package/dist/commands/package/publish.d.ts.map +1 -1
- package/dist/commands/package/publish.js +199 -0
- package/dist/commands/package/publish.js.map +1 -1
- package/dist/commands/publish.d.ts +1 -1
- package/dist/commands/publish.js +6 -6
- package/dist/commands/publish.js.map +1 -1
- package/dist/commands/rollback.d.ts +1 -1
- package/dist/commands/rollback.js +7 -7
- package/dist/commands/rollback.js.map +1 -1
- package/dist/commands/serve.d.ts.map +1 -1
- package/dist/commands/serve.js +206 -34
- package/dist/commands/serve.js.map +1 -1
- package/dist/commands/start.js +4 -4
- package/dist/commands/start.js.map +1 -1
- package/dist/index.d.ts +5 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -6
- package/dist/index.js.map +1 -1
- package/dist/utils/api-client.d.ts +3 -3
- package/dist/utils/api-client.d.ts.map +1 -1
- package/dist/utils/api-client.js +6 -6
- package/dist/utils/api-client.js.map +1 -1
- package/dist/utils/auth-config.d.ts +1 -1
- package/dist/utils/auth-config.d.ts.map +1 -1
- package/dist/utils/config.d.ts +9 -0
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +24 -0
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/console.d.ts +10 -2
- package/dist/utils/console.d.ts.map +1 -1
- package/dist/utils/console.js +88 -34
- package/dist/utils/console.js.map +1 -1
- package/dist/utils/plugin-detection.js +2 -2
- package/dist/utils/plugin-detection.js.map +1 -1
- package/dist/utils/studio-field-patch.d.ts +43 -0
- package/dist/utils/studio-field-patch.d.ts.map +1 -0
- package/dist/utils/studio-field-patch.js +336 -0
- package/dist/utils/studio-field-patch.js.map +1 -0
- package/dist/utils/studio.d.ts +40 -36
- package/dist/utils/studio.d.ts.map +1 -1
- package/dist/utils/studio.js +301 -174
- package/dist/utils/studio.js.map +1 -1
- package/package.json +38 -32
- package/dist/commands/projects/bind.d.ts.map +0 -1
- package/dist/commands/projects/bind.js.map +0 -1
- package/dist/commands/projects/create.d.ts.map +0 -1
- package/dist/commands/projects/create.js.map +0 -1
- package/dist/commands/projects/list.d.ts.map +0 -1
- package/dist/commands/projects/list.js.map +0 -1
- package/dist/commands/projects/projects.test.d.ts +0 -2
- package/dist/commands/projects/projects.test.d.ts.map +0 -1
- package/dist/commands/projects/projects.test.js.map +0 -1
- package/dist/commands/projects/show.d.ts.map +0 -1
- package/dist/commands/projects/show.js.map +0 -1
- package/dist/commands/projects/switch.d.ts.map +0 -1
- package/dist/commands/projects/switch.js.map +0 -1
- /package/dist/commands/{projects → environments}/list.d.ts +0 -0
- /package/dist/commands/{projects → environments}/show.d.ts +0 -0
- /package/dist/commands/{projects → environments}/show.js +0 -0
package/dist/utils/studio.js
CHANGED
|
@@ -2,49 +2,38 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Studio UI Integration Utilities
|
|
4
4
|
*
|
|
5
|
-
* Handles resolving
|
|
6
|
-
*
|
|
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
|
|
17
|
+
/** URL mount path for the Studio designer inside the ObjectStack server */
|
|
16
18
|
export const STUDIO_PATH = '/_studio';
|
|
17
|
-
/**
|
|
18
|
-
const
|
|
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
|
|
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"`.
|
|
23
33
|
*/
|
|
24
34
|
export function resolveStudioPath() {
|
|
25
35
|
const cwd = process.cwd();
|
|
26
|
-
//
|
|
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
|
-
|
|
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
|
-
//
|
|
63
|
-
const directPath = path.join(cwd, 'node_modules', '@
|
|
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
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
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
|
-
|
|
109
|
-
|
|
110
|
-
if (fs.existsSync(
|
|
111
|
-
|
|
112
|
-
|
|
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
|
-
|
|
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
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return null;
|
|
163
81
|
}
|
|
164
|
-
// ─── Console Plugin Factories ───────────────────────────────────────
|
|
165
82
|
/**
|
|
166
|
-
*
|
|
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
|
|
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
|
-
//
|
|
233
|
-
// (
|
|
234
|
-
//
|
|
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 = () =>
|
|
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',
|
package/dist/utils/studio.js.map
CHANGED
|
@@ -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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"}
|