@askdb/studio 0.2.0-beta.3 → 0.2.0-beta.31
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 +27 -4
- package/bin/askdb-studio.js +3 -1
- package/dist/bin.d.ts +1 -1
- package/dist/bin.d.ts.map +1 -1
- package/dist/bin.js +14 -2
- package/dist/bin.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +39 -8
- package/dist/cli.js.map +1 -1
- package/dist/client/assets/index--yhpKSeb.css +2 -0
- package/dist/client/assets/index-4MdacYa2.js +107 -0
- package/dist/client/index.html +2 -2
- package/dist/execute-registry.d.ts +34 -0
- package/dist/execute-registry.d.ts.map +1 -0
- package/dist/execute-registry.js +244 -0
- package/dist/execute-registry.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/introspection.d.ts +35 -0
- package/dist/introspection.d.ts.map +1 -0
- package/dist/introspection.js +138 -0
- package/dist/introspection.js.map +1 -0
- package/dist/server.d.ts +10 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +868 -117
- package/dist/server.js.map +1 -1
- package/dist/setup.d.ts +72 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +469 -0
- package/dist/setup.js.map +1 -0
- package/dist/shared/api.d.ts +153 -1
- package/dist/shared/api.d.ts.map +1 -1
- package/package.json +63 -24
- package/dist/client/assets/index-Bn3ZXmWq.js +0 -8
- package/dist/client/assets/index-Bsn2S5X2.css +0 -2
package/dist/setup.js
ADDED
|
@@ -0,0 +1,469 @@
|
|
|
1
|
+
import { spawnSync } from "node:child_process";
|
|
2
|
+
import { existsSync, readFileSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { createRequire } from "node:module";
|
|
4
|
+
import { basename, dirname, join, resolve, isAbsolute, relative } from "node:path";
|
|
5
|
+
import { bootstrapAskDbEnv, discoverAskDbConfigPath, getAskDbRuntimeConfig } from "@askdb/config";
|
|
6
|
+
/** Mirrors `AI_DEFAULTS` in `apps/cli/src/init.ts` — keep the two in sync. */
|
|
7
|
+
const AI_DEFAULTS = {
|
|
8
|
+
openai: { keyEnv: "OPENAI_API_KEY", modelEnv: "OPENAI_MODEL" },
|
|
9
|
+
anthropic: { keyEnv: "ANTHROPIC_API_KEY", modelEnv: "ANTHROPIC_MODEL" },
|
|
10
|
+
google: { keyEnv: "GOOGLE_GENERATIVE_AI_API_KEY", modelEnv: "GOOGLE_GENERATIVE_AI_MODEL" },
|
|
11
|
+
azure: { keyEnv: "AZURE_OPENAI_API_KEY", modelEnv: "AZURE_OPENAI_DEPLOYMENT" },
|
|
12
|
+
foundry: { keyEnv: "AZURE_OPENAI_API_KEY", modelEnv: "AZURE_OPENAI_DEPLOYMENT" },
|
|
13
|
+
};
|
|
14
|
+
const CONNECTION_ENV_DEFAULTS = {
|
|
15
|
+
postgres: "DATABASE_URL",
|
|
16
|
+
mysql: "MYSQL_URL",
|
|
17
|
+
sqlserver: "SQLSERVER_URL",
|
|
18
|
+
};
|
|
19
|
+
const EXECUTE_CONNECTION_ENV_DEFAULTS = {
|
|
20
|
+
postgres: "DATABASE_URL",
|
|
21
|
+
mysql: "MYSQL_URL",
|
|
22
|
+
sqlserver: "SQLSERVER_URL",
|
|
23
|
+
};
|
|
24
|
+
const ENV_NAME_PATTERN = /^[A-Z][A-Z0-9_]*$/;
|
|
25
|
+
/** Live-introspection driver per engine — mirrors `DB_DRIVER_PACKAGES` in `apps/cli/src/init.ts`. */
|
|
26
|
+
const DB_DRIVER_PACKAGES = {
|
|
27
|
+
postgres: "pg",
|
|
28
|
+
mysql: "mysql2",
|
|
29
|
+
sqlite: "better-sqlite3",
|
|
30
|
+
sqlserver: "mssql",
|
|
31
|
+
};
|
|
32
|
+
function pushEnvVar(envVars, entry) {
|
|
33
|
+
if (envVars.some((v) => v.name === entry.name))
|
|
34
|
+
return;
|
|
35
|
+
envVars.push(entry);
|
|
36
|
+
}
|
|
37
|
+
/** Mirrors `renderRagSection` in `apps/cli/src/init.ts` — keep the two in sync. */
|
|
38
|
+
function renderRagSection(ragStore, pgvectorEnv) {
|
|
39
|
+
switch (ragStore) {
|
|
40
|
+
case "file":
|
|
41
|
+
return ` rag: {
|
|
42
|
+
embedder: "mock",
|
|
43
|
+
embedderConfig: {},
|
|
44
|
+
store: "file",
|
|
45
|
+
storeConfig: { file: {} },
|
|
46
|
+
},`;
|
|
47
|
+
case "memory":
|
|
48
|
+
return ` rag: {
|
|
49
|
+
embedder: "mock",
|
|
50
|
+
embedderConfig: {},
|
|
51
|
+
store: "memory",
|
|
52
|
+
storeConfig: { memory: {} },
|
|
53
|
+
},`;
|
|
54
|
+
case "pgvector":
|
|
55
|
+
return ` rag: {
|
|
56
|
+
embedder: "mock",
|
|
57
|
+
embedderConfig: {},
|
|
58
|
+
store: "pgvector",
|
|
59
|
+
storeConfig: {
|
|
60
|
+
pgvector: {
|
|
61
|
+
databaseUrl: env("${pgvectorEnv ?? "ASKDB_PGVECTOR_URL"}"),
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
},`;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Write `askdb.config.ts` (and `.env.example`) into `cwd`. Accepts env var
|
|
69
|
+
* NAMES only — secret values never travel through this endpoint. Refuses to
|
|
70
|
+
* overwrite an existing config. Templates mirror `askdb init`'s output.
|
|
71
|
+
*/
|
|
72
|
+
export function writeSetupConfig(cwd, input) {
|
|
73
|
+
const existing = discoverAskDbConfigPath(cwd);
|
|
74
|
+
if (existing) {
|
|
75
|
+
throw new SetupError(409, `A config already exists at ${existing}. Edit it directly instead.`);
|
|
76
|
+
}
|
|
77
|
+
const schemaOut = validateRelativePath(input.schemaOut ?? "./askdb", "schemaOut");
|
|
78
|
+
const aiDefaults = AI_DEFAULTS[input.aiProvider];
|
|
79
|
+
if (!aiDefaults)
|
|
80
|
+
throw new SetupError(400, `Unknown AI provider: ${input.aiProvider}`);
|
|
81
|
+
const aiKeyEnv = validateEnvName(input.aiKeyEnv ?? aiDefaults.keyEnv, "aiKeyEnv");
|
|
82
|
+
const aiModelEnv = input.aiModelEnv ? validateEnvName(input.aiModelEnv, "aiModelEnv") : undefined;
|
|
83
|
+
const envVars = [
|
|
84
|
+
{ name: aiKeyEnv, purpose: `${input.aiProvider} API key`, requiredForIntrospection: false },
|
|
85
|
+
];
|
|
86
|
+
if (aiModelEnv) {
|
|
87
|
+
envVars.push({ name: aiModelEnv, purpose: `${input.aiProvider} model override`, requiredForIntrospection: false });
|
|
88
|
+
}
|
|
89
|
+
let introspectionSection;
|
|
90
|
+
switch (input.database) {
|
|
91
|
+
case "postgres":
|
|
92
|
+
case "mysql":
|
|
93
|
+
case "sqlserver": {
|
|
94
|
+
const connectionEnv = validateEnvName(input.connectionEnv ?? CONNECTION_ENV_DEFAULTS[input.database], "connectionEnv");
|
|
95
|
+
envVars.push({
|
|
96
|
+
name: connectionEnv,
|
|
97
|
+
purpose: `${input.database} connection URL (introspection only)`,
|
|
98
|
+
requiredForIntrospection: true,
|
|
99
|
+
});
|
|
100
|
+
introspectionSection = ` introspection: {
|
|
101
|
+
provider: "${input.database}",
|
|
102
|
+
providerConfig: {
|
|
103
|
+
${input.database}: {
|
|
104
|
+
databaseUrl: env("${connectionEnv}"),
|
|
105
|
+
},
|
|
106
|
+
},
|
|
107
|
+
outputDir: "${schemaOut}",
|
|
108
|
+
},`;
|
|
109
|
+
break;
|
|
110
|
+
}
|
|
111
|
+
case "sqlite": {
|
|
112
|
+
const file = validateRelativePath(input.sqliteFile ?? "./data.db", "sqliteFile");
|
|
113
|
+
introspectionSection = ` introspection: {
|
|
114
|
+
provider: "sqlite",
|
|
115
|
+
providerConfig: {
|
|
116
|
+
sqlite: {
|
|
117
|
+
file: "${file}",
|
|
118
|
+
},
|
|
119
|
+
},
|
|
120
|
+
outputDir: "${schemaOut}",
|
|
121
|
+
},`;
|
|
122
|
+
break;
|
|
123
|
+
}
|
|
124
|
+
case "prisma": {
|
|
125
|
+
const schemaLine = input.prismaSchema
|
|
126
|
+
? `\n schemaPath: "${validateRelativePath(input.prismaSchema, "prismaSchema")}",`
|
|
127
|
+
: "";
|
|
128
|
+
introspectionSection = ` introspection: {
|
|
129
|
+
provider: "prisma",
|
|
130
|
+
providerConfig: {
|
|
131
|
+
prisma: {${schemaLine}
|
|
132
|
+
},
|
|
133
|
+
},
|
|
134
|
+
outputDir: "${schemaOut}",
|
|
135
|
+
},`;
|
|
136
|
+
break;
|
|
137
|
+
}
|
|
138
|
+
default:
|
|
139
|
+
throw new SetupError(400, `Unknown database: ${String(input.database)}`);
|
|
140
|
+
}
|
|
141
|
+
const ragStore = input.ragStore ?? "file";
|
|
142
|
+
let pgvectorEnv;
|
|
143
|
+
if (ragStore === "pgvector") {
|
|
144
|
+
pgvectorEnv = validateEnvName(input.pgvectorEnv ?? "ASKDB_PGVECTOR_URL", "pgvectorEnv");
|
|
145
|
+
pushEnvVar(envVars, { name: pgvectorEnv, purpose: "pgvector connection URL", requiredForIntrospection: false });
|
|
146
|
+
}
|
|
147
|
+
const ragSection = renderRagSection(ragStore, pgvectorEnv);
|
|
148
|
+
let studioSection = null;
|
|
149
|
+
let studioExecuteProvider;
|
|
150
|
+
if (input.studioExecute) {
|
|
151
|
+
studioExecuteProvider =
|
|
152
|
+
input.studioExecuteProvider ?? (input.database !== "prisma" ? input.database : undefined);
|
|
153
|
+
if (!studioExecuteProvider) {
|
|
154
|
+
throw new SetupError(400, "`studioExecuteProvider` is required when `studioExecute` is enabled and `database` is \"prisma\".");
|
|
155
|
+
}
|
|
156
|
+
if (studioExecuteProvider === "sqlite") {
|
|
157
|
+
const file = validateRelativePath(input.studioExecuteSqliteFile ?? input.sqliteFile ?? "./data.db", "studioExecuteSqliteFile");
|
|
158
|
+
studioSection = ` studio: {
|
|
159
|
+
execute: {
|
|
160
|
+
provider: "sqlite",
|
|
161
|
+
file: "${file}",
|
|
162
|
+
},
|
|
163
|
+
},`;
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
const execConnectionEnv = validateEnvName(input.studioExecuteConnectionEnv ?? EXECUTE_CONNECTION_ENV_DEFAULTS[studioExecuteProvider], "studioExecuteConnectionEnv");
|
|
167
|
+
pushEnvVar(envVars, {
|
|
168
|
+
name: execConnectionEnv,
|
|
169
|
+
purpose: `${studioExecuteProvider} connection URL (Studio execute)`,
|
|
170
|
+
requiredForIntrospection: false,
|
|
171
|
+
});
|
|
172
|
+
studioSection = ` studio: {
|
|
173
|
+
execute: {
|
|
174
|
+
provider: "${studioExecuteProvider}",
|
|
175
|
+
databaseUrl: env("${execConnectionEnv}"),
|
|
176
|
+
},
|
|
177
|
+
},`;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
const modelLine = aiModelEnv ? `\n model: env("${aiModelEnv}"),` : "";
|
|
181
|
+
const sections = [introspectionSection, ragSection, studioSection].filter((s) => s !== null);
|
|
182
|
+
const config = `import { defineConfig, env, type AskDbConfig } from "@askdb/config";
|
|
183
|
+
|
|
184
|
+
export default defineConfig({
|
|
185
|
+
ai: {
|
|
186
|
+
provider: "${input.aiProvider}",
|
|
187
|
+
providerConfig: {
|
|
188
|
+
${input.aiProvider}: {
|
|
189
|
+
apiKey: env("${aiKeyEnv}"),${modelLine}
|
|
190
|
+
},
|
|
191
|
+
},
|
|
192
|
+
},
|
|
193
|
+
${sections.join("\n")}
|
|
194
|
+
} satisfies AskDbConfig);
|
|
195
|
+
`;
|
|
196
|
+
const configPath = join(cwd, "askdb.config.ts");
|
|
197
|
+
writeFileSync(configPath, config, "utf8");
|
|
198
|
+
let envExamplePath = join(cwd, ".env.example");
|
|
199
|
+
if (existsSync(envExamplePath)) {
|
|
200
|
+
envExamplePath = null; // don't clobber an existing example file
|
|
201
|
+
}
|
|
202
|
+
else {
|
|
203
|
+
const example = [
|
|
204
|
+
"# AskDB environment — copy to .env and fill in real values.",
|
|
205
|
+
"# .env is read by Studio, the CLI, and the HTTP API; never commit it.",
|
|
206
|
+
...envVars.map((v) => `${v.name}= # ${v.purpose}`),
|
|
207
|
+
"",
|
|
208
|
+
].join("\n");
|
|
209
|
+
writeFileSync(envExamplePath, example, "utf8");
|
|
210
|
+
}
|
|
211
|
+
// The config imports `@askdb/config`, so the project needs it (plus the
|
|
212
|
+
// live-introspection driver and, if enabled, the Studio execute driver)
|
|
213
|
+
// installed — same as `askdb init` does.
|
|
214
|
+
const deps = ensureProjectDependencies(cwd, input.database, studioExecuteProvider);
|
|
215
|
+
// Install the runtime snapshot from the file we just wrote so the rest of
|
|
216
|
+
// the server (and the introspection step) sees the new config immediately.
|
|
217
|
+
// Skipped when dependencies are still missing, or when the config can't
|
|
218
|
+
// load yet (e.g. `.env` isn't filled in — pgvector's `databaseUrl` must
|
|
219
|
+
// resolve at load time, unlike introspection URLs) — probeSetupState
|
|
220
|
+
// retries later and surfaces the load error.
|
|
221
|
+
if (!deps.manualInstallCommand) {
|
|
222
|
+
try {
|
|
223
|
+
bootstrapAskDbEnv({ cwd });
|
|
224
|
+
}
|
|
225
|
+
catch {
|
|
226
|
+
// probeSetupState re-attempts this after the caller fills in `.env`.
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
return {
|
|
230
|
+
configPath,
|
|
231
|
+
envExamplePath,
|
|
232
|
+
envVars,
|
|
233
|
+
installed: deps.installed,
|
|
234
|
+
manualInstallCommand: deps.manualInstallCommand,
|
|
235
|
+
packageJsonCreated: deps.packageJsonCreated,
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Make sure the project can load the config we just wrote: `@askdb/config` +
|
|
240
|
+
* `dotenv` must be resolvable from the project, and live engines need their
|
|
241
|
+
* introspection driver. Mirrors `askdb init`'s install plan. Falls back to a
|
|
242
|
+
* manual command when the project looks like a workspace root or the install
|
|
243
|
+
* fails — never mutates a monorepo root implicitly.
|
|
244
|
+
*/
|
|
245
|
+
function ensureProjectDependencies(cwd, database, studioExecuteProvider) {
|
|
246
|
+
const missing = [];
|
|
247
|
+
if (!canResolveFrom(cwd, "@askdb/config")) {
|
|
248
|
+
missing.push(`@askdb/config@${resolveConfigSpec()}`, `dotenv@${resolveDotenvSpec()}`);
|
|
249
|
+
}
|
|
250
|
+
const driversNeeded = new Set();
|
|
251
|
+
if (DB_DRIVER_PACKAGES[database])
|
|
252
|
+
driversNeeded.add(database);
|
|
253
|
+
if (studioExecuteProvider && DB_DRIVER_PACKAGES[studioExecuteProvider])
|
|
254
|
+
driversNeeded.add(studioExecuteProvider);
|
|
255
|
+
for (const db of driversNeeded) {
|
|
256
|
+
const driver = DB_DRIVER_PACKAGES[db];
|
|
257
|
+
if (driver && !canResolveFrom(cwd, driver) && !missing.includes(driver)) {
|
|
258
|
+
missing.push(driver);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
if (missing.length === 0) {
|
|
262
|
+
return { installed: null, manualInstallCommand: null, packageJsonCreated: false };
|
|
263
|
+
}
|
|
264
|
+
let packageJsonCreated = false;
|
|
265
|
+
const nearestPkgDir = findNearestPackageJsonDir(cwd);
|
|
266
|
+
if (!nearestPkgDir) {
|
|
267
|
+
writeFileSync(join(cwd, "package.json"), `${JSON.stringify({ name: basename(cwd) || "askdb-project", private: true }, null, 2)}\n`, "utf8");
|
|
268
|
+
packageJsonCreated = true;
|
|
269
|
+
}
|
|
270
|
+
const pkgDir = nearestPkgDir ?? cwd;
|
|
271
|
+
const pm = detectPackageManager(pkgDir);
|
|
272
|
+
// Only auto-install when the project manifest sits exactly at the wizard's
|
|
273
|
+
// directory. A package.json found further up might be a monorepo root or an
|
|
274
|
+
// unrelated project — never mutate those implicitly.
|
|
275
|
+
if (pkgDir !== resolve(cwd) || (isLikelyWorkspaceRoot(pkgDir) && !packageJsonCreated)) {
|
|
276
|
+
return {
|
|
277
|
+
installed: null,
|
|
278
|
+
manualInstallCommand: formatInstallCommand(pm, missing),
|
|
279
|
+
packageJsonCreated,
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
const installer = setupInstallerForTests ?? runInstall;
|
|
283
|
+
const ok = installer(pm, pkgDir, missing);
|
|
284
|
+
if (!ok) {
|
|
285
|
+
return {
|
|
286
|
+
installed: null,
|
|
287
|
+
manualInstallCommand: formatInstallCommand(pm, missing),
|
|
288
|
+
packageJsonCreated,
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
return { installed: missing, manualInstallCommand: null, packageJsonCreated };
|
|
292
|
+
}
|
|
293
|
+
function canResolveFrom(dir, packageName) {
|
|
294
|
+
try {
|
|
295
|
+
// Resolve the package entry point, not `<pkg>/package.json` — the latter
|
|
296
|
+
// fails for packages whose `exports` map doesn't expose "./package.json".
|
|
297
|
+
createRequire(join(dir, "package.json")).resolve(packageName);
|
|
298
|
+
return true;
|
|
299
|
+
}
|
|
300
|
+
catch {
|
|
301
|
+
return false;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Locate the `package.json` of the `@askdb/config` copy Studio itself runs
|
|
306
|
+
* with. `require.resolve("@askdb/config/package.json")` fails because the
|
|
307
|
+
* package's `exports` map doesn't expose it — resolve the entry point and
|
|
308
|
+
* walk up instead.
|
|
309
|
+
*/
|
|
310
|
+
function readStudioConfigPackageJson() {
|
|
311
|
+
try {
|
|
312
|
+
const require = createRequire(import.meta.url);
|
|
313
|
+
const entry = require.resolve("@askdb/config");
|
|
314
|
+
const pkgDir = findNearestPackageJsonDir(dirname(entry));
|
|
315
|
+
if (!pkgDir)
|
|
316
|
+
return undefined;
|
|
317
|
+
return JSON.parse(readFileSync(join(pkgDir, "package.json"), "utf8"));
|
|
318
|
+
}
|
|
319
|
+
catch {
|
|
320
|
+
return undefined;
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
/** Pin `@askdb/config` to the version Studio itself was built against. */
|
|
324
|
+
function resolveConfigSpec() {
|
|
325
|
+
return readStudioConfigPackageJson()?.version ?? "latest";
|
|
326
|
+
}
|
|
327
|
+
function resolveDotenvSpec() {
|
|
328
|
+
return readStudioConfigPackageJson()?.dependencies?.dotenv ?? "latest";
|
|
329
|
+
}
|
|
330
|
+
function findNearestPackageJsonDir(startDir) {
|
|
331
|
+
let dir = resolve(startDir);
|
|
332
|
+
for (let i = 0; i < 40; i += 1) {
|
|
333
|
+
if (existsSync(join(dir, "package.json")))
|
|
334
|
+
return dir;
|
|
335
|
+
const parent = dirname(dir);
|
|
336
|
+
if (parent === dir)
|
|
337
|
+
return undefined;
|
|
338
|
+
dir = parent;
|
|
339
|
+
}
|
|
340
|
+
return undefined;
|
|
341
|
+
}
|
|
342
|
+
function isLikelyWorkspaceRoot(packageDir) {
|
|
343
|
+
if (existsSync(join(packageDir, "pnpm-workspace.yaml")) ||
|
|
344
|
+
existsSync(join(packageDir, "pnpm-workspace.yml"))) {
|
|
345
|
+
return true;
|
|
346
|
+
}
|
|
347
|
+
try {
|
|
348
|
+
const pkg = JSON.parse(readFileSync(join(packageDir, "package.json"), "utf8"));
|
|
349
|
+
return pkg.workspaces !== undefined && pkg.workspaces !== null;
|
|
350
|
+
}
|
|
351
|
+
catch {
|
|
352
|
+
return false;
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
let setupInstallerForTests;
|
|
356
|
+
/** @internal Tests only — replaces the real package-manager install. */
|
|
357
|
+
export function setSetupInstallerForTests(installer) {
|
|
358
|
+
setupInstallerForTests = installer;
|
|
359
|
+
}
|
|
360
|
+
function detectPackageManager(packageDir) {
|
|
361
|
+
let dir = packageDir;
|
|
362
|
+
for (let i = 0; i < 40; i += 1) {
|
|
363
|
+
if (existsSync(join(dir, "pnpm-lock.yaml")))
|
|
364
|
+
return "pnpm";
|
|
365
|
+
if (existsSync(join(dir, "bun.lockb")) || existsSync(join(dir, "bun.lock")))
|
|
366
|
+
return "bun";
|
|
367
|
+
if (existsSync(join(dir, "yarn.lock")))
|
|
368
|
+
return "yarn";
|
|
369
|
+
if (existsSync(join(dir, "package-lock.json")))
|
|
370
|
+
return "npm";
|
|
371
|
+
const parent = dirname(dir);
|
|
372
|
+
if (parent === dir)
|
|
373
|
+
break;
|
|
374
|
+
dir = parent;
|
|
375
|
+
}
|
|
376
|
+
return "npm";
|
|
377
|
+
}
|
|
378
|
+
function runInstall(pm, packageDir, packages) {
|
|
379
|
+
const env = { ...process.env, CI: process.env.CI ?? "true" };
|
|
380
|
+
const win = process.platform === "win32";
|
|
381
|
+
let cmd;
|
|
382
|
+
let args;
|
|
383
|
+
switch (pm) {
|
|
384
|
+
case "pnpm":
|
|
385
|
+
cmd = win ? "pnpm.CMD" : "pnpm";
|
|
386
|
+
args = ["add", ...packages];
|
|
387
|
+
break;
|
|
388
|
+
case "yarn":
|
|
389
|
+
cmd = win ? "yarn.cmd" : "yarn";
|
|
390
|
+
args = ["add", ...packages];
|
|
391
|
+
break;
|
|
392
|
+
case "bun":
|
|
393
|
+
cmd = win ? "bun.exe" : "bun";
|
|
394
|
+
args = ["add", ...packages];
|
|
395
|
+
break;
|
|
396
|
+
default:
|
|
397
|
+
cmd = win ? "npm.cmd" : "npm";
|
|
398
|
+
args = ["install", "--save", ...packages];
|
|
399
|
+
}
|
|
400
|
+
const result = spawnSync(cmd, args, { cwd: packageDir, stdio: "ignore", env, shell: false });
|
|
401
|
+
return result.status === 0;
|
|
402
|
+
}
|
|
403
|
+
function formatInstallCommand(pm, packages) {
|
|
404
|
+
const pkgList = packages.join(" ");
|
|
405
|
+
switch (pm) {
|
|
406
|
+
case "pnpm":
|
|
407
|
+
return `pnpm add ${pkgList}`;
|
|
408
|
+
case "yarn":
|
|
409
|
+
return `yarn add ${pkgList}`;
|
|
410
|
+
case "bun":
|
|
411
|
+
return `bun add ${pkgList}`;
|
|
412
|
+
default:
|
|
413
|
+
return `npm install --save ${pkgList}`;
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
/** Re-check the on-disk state (config file, schema artifact) for setup routing. */
|
|
417
|
+
export function probeSetupState(cwd) {
|
|
418
|
+
const configPath = discoverAskDbConfigPath(cwd) ?? null;
|
|
419
|
+
if (!configPath) {
|
|
420
|
+
return { hasConfig: false, configPath: null, hasArtifact: false, outputDir: null, loadError: null };
|
|
421
|
+
}
|
|
422
|
+
try {
|
|
423
|
+
// Re-bootstrap so config/.env edits made since server start are honored.
|
|
424
|
+
bootstrapAskDbEnv({ cwd });
|
|
425
|
+
const outputDir = resolve(cwd, getAskDbRuntimeConfig().introspection.outputDir);
|
|
426
|
+
return {
|
|
427
|
+
hasConfig: true,
|
|
428
|
+
configPath,
|
|
429
|
+
hasArtifact: existsSync(join(outputDir, "schema.json")),
|
|
430
|
+
outputDir,
|
|
431
|
+
loadError: null,
|
|
432
|
+
};
|
|
433
|
+
}
|
|
434
|
+
catch (error) {
|
|
435
|
+
return {
|
|
436
|
+
hasConfig: true,
|
|
437
|
+
configPath,
|
|
438
|
+
hasArtifact: false,
|
|
439
|
+
outputDir: null,
|
|
440
|
+
loadError: error instanceof Error ? error.message : String(error),
|
|
441
|
+
};
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
function validateEnvName(name, field) {
|
|
445
|
+
const trimmed = name.trim();
|
|
446
|
+
if (!ENV_NAME_PATTERN.test(trimmed)) {
|
|
447
|
+
throw new SetupError(400, `\`${field}\` must be an environment variable NAME like DATABASE_URL (got: ${JSON.stringify(name)}). Values belong in .env, not here.`);
|
|
448
|
+
}
|
|
449
|
+
return trimmed;
|
|
450
|
+
}
|
|
451
|
+
function validateRelativePath(path, field) {
|
|
452
|
+
const trimmed = path.trim();
|
|
453
|
+
if (trimmed === "" ||
|
|
454
|
+
isAbsolute(trimmed) ||
|
|
455
|
+
relative(".", trimmed).startsWith("..") ||
|
|
456
|
+
trimmed.includes("\0")) {
|
|
457
|
+
throw new SetupError(400, `\`${field}\` must be a relative path inside the project (got: ${JSON.stringify(path)}).`);
|
|
458
|
+
}
|
|
459
|
+
return trimmed;
|
|
460
|
+
}
|
|
461
|
+
export class SetupError extends Error {
|
|
462
|
+
status;
|
|
463
|
+
constructor(status, message) {
|
|
464
|
+
super(message);
|
|
465
|
+
this.status = status;
|
|
466
|
+
this.name = "SetupError";
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"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"}
|