@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/client/index.html
CHANGED
|
@@ -6,8 +6,8 @@
|
|
|
6
6
|
<title>AskDB Studio</title>
|
|
7
7
|
<link rel="icon" type="image/png" media="(prefers-color-scheme: light)" href="/assets/brand/light-icon.png" />
|
|
8
8
|
<link rel="icon" type="image/png" media="(prefers-color-scheme: dark)" href="/assets/brand/dark-icon.png" />
|
|
9
|
-
<script type="module" crossorigin src="/assets/index-
|
|
10
|
-
<link rel="stylesheet" crossorigin href="/assets/index
|
|
9
|
+
<script type="module" crossorigin src="/assets/index-4MdacYa2.js"></script>
|
|
10
|
+
<link rel="stylesheet" crossorigin href="/assets/index--yhpKSeb.css">
|
|
11
11
|
</head>
|
|
12
12
|
<body>
|
|
13
13
|
<div id="root"></div>
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Studio execute-driver registry.
|
|
3
|
+
*
|
|
4
|
+
* Each entry describes a live execute provider — how to dynamically import the
|
|
5
|
+
* driver package, what connection shape it expects, and how to normalize its
|
|
6
|
+
* results into the shared `ExecuteResponse` DTO.
|
|
7
|
+
*
|
|
8
|
+
* Drivers are optional peers. The registry never imports a driver at module
|
|
9
|
+
* load time; every import lives inside an `executeXxx()` function so a missing
|
|
10
|
+
* package only fails when the user actually tries to execute a query.
|
|
11
|
+
*/
|
|
12
|
+
import type { ExecuteResponse } from "./shared/api.js";
|
|
13
|
+
export type StudioExecuteProvider = "postgres" | "mysql" | "sqlite" | "sqlserver";
|
|
14
|
+
export type StudioExecuteInput = {
|
|
15
|
+
connectionString?: string;
|
|
16
|
+
file?: string;
|
|
17
|
+
sql: string;
|
|
18
|
+
params: unknown[];
|
|
19
|
+
/** Absolute path to the user's project root, used for driver resolution. */
|
|
20
|
+
projectRoot: string;
|
|
21
|
+
};
|
|
22
|
+
export type StudioDriverDefinition = {
|
|
23
|
+
provider: StudioExecuteProvider;
|
|
24
|
+
label: string;
|
|
25
|
+
packageName: "pg" | "mysql2" | "better-sqlite3" | "mssql";
|
|
26
|
+
installCommand: string;
|
|
27
|
+
execute(input: StudioExecuteInput): Promise<ExecuteResponse>;
|
|
28
|
+
};
|
|
29
|
+
export declare const EXECUTE_DRIVER_REGISTRY: Record<StudioExecuteProvider, StudioDriverDefinition>;
|
|
30
|
+
/**
|
|
31
|
+
* Check whether a driver package is resolvable from the user's project root.
|
|
32
|
+
*/
|
|
33
|
+
export declare function isDriverInstalled(packageName: string, projectRoot: string): boolean;
|
|
34
|
+
//# sourceMappingURL=execute-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execute-registry.d.ts","sourceRoot":"","sources":["../src/execute-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAWH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAMvD,MAAM,MAAM,qBAAqB,GAAG,UAAU,GAAG,OAAO,GAAG,QAAQ,GAAG,WAAW,CAAC;AAElF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,OAAO,EAAE,CAAC;IAClB,4EAA4E;IAC5E,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,QAAQ,EAAE,qBAAqB,CAAC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,IAAI,GAAG,QAAQ,GAAG,gBAAgB,GAAG,OAAO,CAAC;IAC1D,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;CAC9D,CAAC;AA0PF,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,qBAAqB,EAAE,sBAAsB,CA6BzF,CAAC;AAEF;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAanF"}
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Studio execute-driver registry.
|
|
3
|
+
*
|
|
4
|
+
* Each entry describes a live execute provider — how to dynamically import the
|
|
5
|
+
* driver package, what connection shape it expects, and how to normalize its
|
|
6
|
+
* results into the shared `ExecuteResponse` DTO.
|
|
7
|
+
*
|
|
8
|
+
* Drivers are optional peers. The registry never imports a driver at module
|
|
9
|
+
* load time; every import lives inside an `executeXxx()` function so a missing
|
|
10
|
+
* package only fails when the user actually tries to execute a query.
|
|
11
|
+
*/
|
|
12
|
+
import { loadPgDriver, isPgDriverInstalled } from "@askdb/postgres";
|
|
13
|
+
import { loadMysql2Driver, isMysql2DriverInstalled } from "@askdb/mysql";
|
|
14
|
+
import { loadBetterSqlite3Driver, isBetterSqlite3DriverInstalled } from "@askdb/sqlite";
|
|
15
|
+
import { loadMssqlDriver, isMssqlDriverInstalled, resolveConnectionInput, } from "@askdb/sqlserver";
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
// Normalization helpers
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
const MAX_ROWS = 500;
|
|
20
|
+
function buildOkResponse(columns, rows, rowCount, durationMs) {
|
|
21
|
+
const truncated = rows.length > MAX_ROWS;
|
|
22
|
+
return {
|
|
23
|
+
ok: true,
|
|
24
|
+
columns,
|
|
25
|
+
rows: rows.slice(0, MAX_ROWS),
|
|
26
|
+
rowCount,
|
|
27
|
+
durationMs,
|
|
28
|
+
truncated,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
async function executePostgres(input) {
|
|
32
|
+
const { connectionString, sql, params, projectRoot } = input;
|
|
33
|
+
if (!connectionString) {
|
|
34
|
+
return { ok: false, error: "No connection URL configured for Postgres execute. Set ASKDB_STUDIO_DATABASE_URL or introspection.providerConfig.postgres.databaseUrl." };
|
|
35
|
+
}
|
|
36
|
+
let pgMod;
|
|
37
|
+
try {
|
|
38
|
+
pgMod = await loadPgDriver({ resolveFrom: projectRoot });
|
|
39
|
+
}
|
|
40
|
+
catch (err) {
|
|
41
|
+
return { ok: false, error: err instanceof Error ? err.message : String(err) };
|
|
42
|
+
}
|
|
43
|
+
const client = new pgMod.Client({ connectionString });
|
|
44
|
+
try {
|
|
45
|
+
await client.connect();
|
|
46
|
+
}
|
|
47
|
+
catch (err) {
|
|
48
|
+
return { ok: false, error: err instanceof Error ? err.message : String(err) };
|
|
49
|
+
}
|
|
50
|
+
const startMs = Date.now();
|
|
51
|
+
try {
|
|
52
|
+
await client.query("BEGIN READ ONLY");
|
|
53
|
+
const result = await client.query({ text: sql, values: params });
|
|
54
|
+
await client.query("COMMIT");
|
|
55
|
+
const durationMs = Date.now() - startMs;
|
|
56
|
+
const columns = result.fields.map((f) => f.name);
|
|
57
|
+
const rows = result.rows.map((r) => columns.map((c) => r[c]));
|
|
58
|
+
return buildOkResponse(columns, rows, result.rowCount ?? rows.length, durationMs);
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
await client.query("ROLLBACK").catch(() => { });
|
|
62
|
+
return { ok: false, error: err instanceof Error ? err.message : String(err) };
|
|
63
|
+
}
|
|
64
|
+
finally {
|
|
65
|
+
await client.end().catch(() => { });
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
async function executeMySQL(input) {
|
|
69
|
+
const { connectionString, sql, params, projectRoot } = input;
|
|
70
|
+
if (!connectionString) {
|
|
71
|
+
return { ok: false, error: "No connection URL configured for MySQL execute. Set ASKDB_STUDIO_DATABASE_URL or introspection.providerConfig.mysql.databaseUrl." };
|
|
72
|
+
}
|
|
73
|
+
let mysql2Mod;
|
|
74
|
+
try {
|
|
75
|
+
mysql2Mod = await loadMysql2Driver({ resolveFrom: projectRoot });
|
|
76
|
+
}
|
|
77
|
+
catch (err) {
|
|
78
|
+
return { ok: false, error: err instanceof Error ? err.message : String(err) };
|
|
79
|
+
}
|
|
80
|
+
let conn;
|
|
81
|
+
try {
|
|
82
|
+
conn = await mysql2Mod.createConnection({ uri: connectionString });
|
|
83
|
+
}
|
|
84
|
+
catch (err) {
|
|
85
|
+
return { ok: false, error: err instanceof Error ? err.message : String(err) };
|
|
86
|
+
}
|
|
87
|
+
const startMs = Date.now();
|
|
88
|
+
try {
|
|
89
|
+
await conn.query("SET SESSION TRANSACTION READ ONLY");
|
|
90
|
+
await conn.query("START TRANSACTION");
|
|
91
|
+
const [rowsRaw, fields] = await conn.execute(sql, params);
|
|
92
|
+
await conn.query("ROLLBACK");
|
|
93
|
+
const durationMs = Date.now() - startMs;
|
|
94
|
+
const columns = fields.map((f) => f.name);
|
|
95
|
+
const rows = rowsRaw.map((r) => columns.map((c) => r[c]));
|
|
96
|
+
return buildOkResponse(columns, rows, rows.length, durationMs);
|
|
97
|
+
}
|
|
98
|
+
catch (err) {
|
|
99
|
+
await conn.query("ROLLBACK").catch(() => { });
|
|
100
|
+
return { ok: false, error: err instanceof Error ? err.message : String(err) };
|
|
101
|
+
}
|
|
102
|
+
finally {
|
|
103
|
+
await conn.end().catch(() => { });
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
async function executeSQLite(input) {
|
|
107
|
+
const { file, sql, params, projectRoot } = input;
|
|
108
|
+
if (!file) {
|
|
109
|
+
return { ok: false, error: "No SQLite file path configured for execute. Set ASKDB_STUDIO_SQLITE_FILE or introspection.providerConfig.sqlite.file." };
|
|
110
|
+
}
|
|
111
|
+
let Sqlite3;
|
|
112
|
+
try {
|
|
113
|
+
const mod = await loadBetterSqlite3Driver({ resolveFrom: projectRoot });
|
|
114
|
+
Sqlite3 = mod.default;
|
|
115
|
+
}
|
|
116
|
+
catch (err) {
|
|
117
|
+
return { ok: false, error: err instanceof Error ? err.message : String(err) };
|
|
118
|
+
}
|
|
119
|
+
const startMs = Date.now();
|
|
120
|
+
const db = new Sqlite3(file, { readonly: true, fileMustExist: true });
|
|
121
|
+
try {
|
|
122
|
+
const stmt = db.prepare(sql);
|
|
123
|
+
const columns = stmt.columns().map((c) => c.name);
|
|
124
|
+
const rowsRaw = stmt.all(...params);
|
|
125
|
+
const durationMs = Date.now() - startMs;
|
|
126
|
+
const rows = rowsRaw.map((r) => columns.map((c) => r[c]));
|
|
127
|
+
return buildOkResponse(columns, rows, rows.length, durationMs);
|
|
128
|
+
}
|
|
129
|
+
catch (err) {
|
|
130
|
+
return { ok: false, error: err instanceof Error ? err.message : String(err) };
|
|
131
|
+
}
|
|
132
|
+
finally {
|
|
133
|
+
db.close();
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Rewrite `$1`, `$2`, ... or bare `?` positional params to MSSQL `@p0`, `@p1`, ...
|
|
138
|
+
* and return an object of named bindings.
|
|
139
|
+
*/
|
|
140
|
+
function rewriteSqlServerParams(sql, params) {
|
|
141
|
+
if (params.length === 0)
|
|
142
|
+
return { sql, bindings: {} };
|
|
143
|
+
const bindings = {};
|
|
144
|
+
params.forEach((value, idx) => {
|
|
145
|
+
bindings[`p${idx}`] = value;
|
|
146
|
+
});
|
|
147
|
+
// Replace $N placeholders (1-indexed) first, then bare ? placeholders.
|
|
148
|
+
let idx = 0;
|
|
149
|
+
const rewritten = sql
|
|
150
|
+
.replace(/\$\d+/g, () => `@p${idx++}`)
|
|
151
|
+
.replace(/\?/g, () => `@p${idx++}`);
|
|
152
|
+
return { sql: rewritten, bindings };
|
|
153
|
+
}
|
|
154
|
+
async function executeSQLServer(input) {
|
|
155
|
+
const { connectionString, sql, params, projectRoot } = input;
|
|
156
|
+
if (!connectionString) {
|
|
157
|
+
return { ok: false, error: "No connection URL configured for SQL Server execute. Set ASKDB_STUDIO_DATABASE_URL or introspection.providerConfig.sqlserver.databaseUrl." };
|
|
158
|
+
}
|
|
159
|
+
let mssqlMod;
|
|
160
|
+
try {
|
|
161
|
+
mssqlMod = await loadMssqlDriver({ resolveFrom: projectRoot });
|
|
162
|
+
}
|
|
163
|
+
catch (err) {
|
|
164
|
+
return { ok: false, error: err instanceof Error ? err.message : String(err) };
|
|
165
|
+
}
|
|
166
|
+
let pool;
|
|
167
|
+
try {
|
|
168
|
+
pool = await new mssqlMod.ConnectionPool(resolveConnectionInput(connectionString)).connect();
|
|
169
|
+
}
|
|
170
|
+
catch (err) {
|
|
171
|
+
return { ok: false, error: err instanceof Error ? err.message : String(err) };
|
|
172
|
+
}
|
|
173
|
+
const startMs = Date.now();
|
|
174
|
+
try {
|
|
175
|
+
const { sql: rewrittenSql, bindings } = rewriteSqlServerParams(sql, params);
|
|
176
|
+
const req = pool.request();
|
|
177
|
+
for (const [name, value] of Object.entries(bindings)) {
|
|
178
|
+
req.input(name, value);
|
|
179
|
+
}
|
|
180
|
+
const result = await req.query(rewrittenSql);
|
|
181
|
+
const durationMs = Date.now() - startMs;
|
|
182
|
+
const rowsRaw = result.recordset ?? [];
|
|
183
|
+
const columns = rowsRaw.length > 0 ? Object.keys(rowsRaw[0]) : [];
|
|
184
|
+
const rows = rowsRaw.map((r) => columns.map((c) => r[c]));
|
|
185
|
+
return buildOkResponse(columns, rows, rows.length, durationMs);
|
|
186
|
+
}
|
|
187
|
+
catch (err) {
|
|
188
|
+
return { ok: false, error: err instanceof Error ? err.message : String(err) };
|
|
189
|
+
}
|
|
190
|
+
finally {
|
|
191
|
+
await pool.close();
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
// ---------------------------------------------------------------------------
|
|
195
|
+
// Registry
|
|
196
|
+
// ---------------------------------------------------------------------------
|
|
197
|
+
export const EXECUTE_DRIVER_REGISTRY = {
|
|
198
|
+
postgres: {
|
|
199
|
+
provider: "postgres",
|
|
200
|
+
label: "Postgres",
|
|
201
|
+
packageName: "pg",
|
|
202
|
+
installCommand: "pnpm add pg",
|
|
203
|
+
execute: executePostgres,
|
|
204
|
+
},
|
|
205
|
+
mysql: {
|
|
206
|
+
provider: "mysql",
|
|
207
|
+
label: "MySQL",
|
|
208
|
+
packageName: "mysql2",
|
|
209
|
+
installCommand: "pnpm add mysql2",
|
|
210
|
+
execute: executeMySQL,
|
|
211
|
+
},
|
|
212
|
+
sqlite: {
|
|
213
|
+
provider: "sqlite",
|
|
214
|
+
label: "SQLite",
|
|
215
|
+
packageName: "better-sqlite3",
|
|
216
|
+
installCommand: "pnpm add better-sqlite3",
|
|
217
|
+
execute: executeSQLite,
|
|
218
|
+
},
|
|
219
|
+
sqlserver: {
|
|
220
|
+
provider: "sqlserver",
|
|
221
|
+
label: "SQL Server",
|
|
222
|
+
packageName: "mssql",
|
|
223
|
+
installCommand: "pnpm add mssql",
|
|
224
|
+
execute: executeSQLServer,
|
|
225
|
+
},
|
|
226
|
+
};
|
|
227
|
+
/**
|
|
228
|
+
* Check whether a driver package is resolvable from the user's project root.
|
|
229
|
+
*/
|
|
230
|
+
export function isDriverInstalled(packageName, projectRoot) {
|
|
231
|
+
switch (packageName) {
|
|
232
|
+
case "pg":
|
|
233
|
+
return isPgDriverInstalled({ resolveFrom: projectRoot });
|
|
234
|
+
case "mysql2":
|
|
235
|
+
return isMysql2DriverInstalled({ resolveFrom: projectRoot });
|
|
236
|
+
case "better-sqlite3":
|
|
237
|
+
return isBetterSqlite3DriverInstalled({ resolveFrom: projectRoot });
|
|
238
|
+
case "mssql":
|
|
239
|
+
return isMssqlDriverInstalled({ resolveFrom: projectRoot });
|
|
240
|
+
default:
|
|
241
|
+
return false;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
//# sourceMappingURL=execute-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execute-registry.js","sourceRoot":"","sources":["../src/execute-registry.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACrE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACrE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAErE,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAErE,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { type ConnectorProvider } from "@askdb/connectors";
|
|
2
|
+
export type StudioIntrospectionPlan = {
|
|
3
|
+
ok: true;
|
|
4
|
+
engine: ConnectorProvider;
|
|
5
|
+
sourceLabel: string;
|
|
6
|
+
} | {
|
|
7
|
+
ok: false;
|
|
8
|
+
engine: ConnectorProvider | null;
|
|
9
|
+
error: string;
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Resolve what a server-side introspection run would do, from the runtime
|
|
13
|
+
* config alone. Mirrors the CLI's flag-free resolution in
|
|
14
|
+
* `apps/cli/src/introspect.ts` (config provider + per-engine connection).
|
|
15
|
+
* Never includes credentials in `sourceLabel` — it is shown in the UI.
|
|
16
|
+
*/
|
|
17
|
+
export declare function resolveStudioIntrospectionPlan(): StudioIntrospectionPlan;
|
|
18
|
+
export type StudioIntrospectionRun = {
|
|
19
|
+
engine: ConnectorProvider;
|
|
20
|
+
schemaId: string;
|
|
21
|
+
tables: number;
|
|
22
|
+
warnings: string[];
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Run introspection server-side into `outDir`, preserving any existing
|
|
26
|
+
* enrichment markdown (the writer keeps `tables/*.md`, `concepts.md`, and
|
|
27
|
+
* `tenant-policy.md` when `existingArtifactDir` is supplied — the same
|
|
28
|
+
* guarantee `askdb introspect` gives).
|
|
29
|
+
*/
|
|
30
|
+
export declare function runStudioIntrospection(options: {
|
|
31
|
+
outDir: string;
|
|
32
|
+
schemaId?: string;
|
|
33
|
+
hasExistingArtifact: boolean;
|
|
34
|
+
}): Promise<StudioIntrospectionRun>;
|
|
35
|
+
//# sourceMappingURL=introspection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"introspection.d.ts","sourceRoot":"","sources":["../src/introspection.ts"],"names":[],"mappings":"AAOA,OAAO,EAGL,KAAK,iBAAiB,EACvB,MAAM,mBAAmB,CAAC;AAe3B,MAAM,MAAM,uBAAuB,GAC/B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,iBAAiB,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAC5D;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnE;;;;;GAKG;AACH,wBAAgB,8BAA8B,IAAI,uBAAuB,CASxE;AA4ED,MAAM,MAAM,sBAAsB,GAAG;IACnC,MAAM,EAAE,iBAAiB,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,CAAC;AAEF;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAAC,OAAO,EAAE;IACpD,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mBAAmB,EAAE,OAAO,CAAC;CAC9B,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAkClC"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { basename } from "node:path";
|
|
2
|
+
import { getAskDbRuntimeConfig } from "@askdb/config";
|
|
3
|
+
import { introspect, } from "@askdb/introspect";
|
|
4
|
+
import { createConnectorRegistry, } from "@askdb/connectors";
|
|
5
|
+
import { postgresConnectorProvider } from "@askdb/postgres";
|
|
6
|
+
import { mysqlConnectorProvider } from "@askdb/mysql";
|
|
7
|
+
import { sqliteConnectorProvider } from "@askdb/sqlite";
|
|
8
|
+
import { sqlServerConnectorProvider } from "@askdb/sqlserver";
|
|
9
|
+
import { prismaConnectorProvider } from "@askdb/prisma";
|
|
10
|
+
const connectorRegistry = createConnectorRegistry([
|
|
11
|
+
postgresConnectorProvider,
|
|
12
|
+
mysqlConnectorProvider,
|
|
13
|
+
sqliteConnectorProvider,
|
|
14
|
+
sqlServerConnectorProvider,
|
|
15
|
+
prismaConnectorProvider,
|
|
16
|
+
]);
|
|
17
|
+
/**
|
|
18
|
+
* Resolve what a server-side introspection run would do, from the runtime
|
|
19
|
+
* config alone. Mirrors the CLI's flag-free resolution in
|
|
20
|
+
* `apps/cli/src/introspect.ts` (config provider + per-engine connection).
|
|
21
|
+
* Never includes credentials in `sourceLabel` — it is shown in the UI.
|
|
22
|
+
*/
|
|
23
|
+
export function resolveStudioIntrospectionPlan() {
|
|
24
|
+
const rt = getAskDbRuntimeConfig();
|
|
25
|
+
const engine = rt.introspection.provider;
|
|
26
|
+
if (!connectorRegistry.hasProvider(engine)) {
|
|
27
|
+
return { ok: false, engine: null, error: `Unsupported introspection provider: ${engine}` };
|
|
28
|
+
}
|
|
29
|
+
const connection = resolveConnection(engine);
|
|
30
|
+
if (!connection.ok)
|
|
31
|
+
return { ok: false, engine, error: connection.error };
|
|
32
|
+
return { ok: true, engine, sourceLabel: connection.sourceLabel };
|
|
33
|
+
}
|
|
34
|
+
function resolveConnection(engine) {
|
|
35
|
+
const rt = getAskDbRuntimeConfig();
|
|
36
|
+
switch (engine) {
|
|
37
|
+
case "postgres": {
|
|
38
|
+
const url = rt.introspection.postgresDatabaseUrl;
|
|
39
|
+
if (!url) {
|
|
40
|
+
return {
|
|
41
|
+
ok: false,
|
|
42
|
+
error: "No Postgres connection configured. Set introspection.providerConfig.postgres.databaseUrl in askdb.config.ts (bound to an env var in .env).",
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
return { ok: true, url, sourceLabel: redactUrl(url) };
|
|
46
|
+
}
|
|
47
|
+
case "mysql": {
|
|
48
|
+
const url = rt.introspection.mysqlDatabaseUrl;
|
|
49
|
+
if (!url) {
|
|
50
|
+
return {
|
|
51
|
+
ok: false,
|
|
52
|
+
error: "No MySQL connection configured. Set introspection.providerConfig.mysql.databaseUrl in askdb.config.ts (bound to an env var in .env).",
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
return { ok: true, url, sourceLabel: redactUrl(url) };
|
|
56
|
+
}
|
|
57
|
+
case "sqlserver": {
|
|
58
|
+
const url = rt.introspection.sqlserverDatabaseUrl;
|
|
59
|
+
if (!url) {
|
|
60
|
+
return {
|
|
61
|
+
ok: false,
|
|
62
|
+
error: "No SQL Server connection configured. Set introspection.providerConfig.sqlserver.databaseUrl in askdb.config.ts (bound to an env var in .env).",
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
return { ok: true, url, sourceLabel: redactUrl(url) };
|
|
66
|
+
}
|
|
67
|
+
case "sqlite": {
|
|
68
|
+
const file = rt.introspection.sqliteFile;
|
|
69
|
+
if (!file) {
|
|
70
|
+
return {
|
|
71
|
+
ok: false,
|
|
72
|
+
error: "No SQLite file configured. Set introspection.providerConfig.sqlite.file in askdb.config.ts.",
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
return { ok: true, url: file, sourceLabel: file };
|
|
76
|
+
}
|
|
77
|
+
case "prisma": {
|
|
78
|
+
// When unset, @askdb/prisma auto-discovers prisma/schema.prisma in the project root.
|
|
79
|
+
const schemaPath = rt.introspection.prismaSchemaPath;
|
|
80
|
+
return {
|
|
81
|
+
ok: true,
|
|
82
|
+
schemaPath,
|
|
83
|
+
sourceLabel: schemaPath ?? "auto-discovered prisma/schema.prisma",
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/** Strip credentials from a connection string for display (never shown raw in the UI). */
|
|
89
|
+
function redactUrl(raw) {
|
|
90
|
+
try {
|
|
91
|
+
const url = new URL(raw);
|
|
92
|
+
return `${url.protocol}//${url.host}${url.pathname}`;
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
// ADO.NET-style or otherwise unparseable — show only that it is configured.
|
|
96
|
+
return "configured connection";
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Run introspection server-side into `outDir`, preserving any existing
|
|
101
|
+
* enrichment markdown (the writer keeps `tables/*.md`, `concepts.md`, and
|
|
102
|
+
* `tenant-policy.md` when `existingArtifactDir` is supplied — the same
|
|
103
|
+
* guarantee `askdb introspect` gives).
|
|
104
|
+
*/
|
|
105
|
+
export async function runStudioIntrospection(options) {
|
|
106
|
+
const plan = resolveStudioIntrospectionPlan();
|
|
107
|
+
if (!plan.ok)
|
|
108
|
+
throw new Error(plan.error);
|
|
109
|
+
const connection = resolveConnection(plan.engine);
|
|
110
|
+
if (!connection.ok)
|
|
111
|
+
throw new Error(connection.error);
|
|
112
|
+
const schemaId = options.schemaId ?? inferSchemaId(options.outDir);
|
|
113
|
+
const connectorConfig = {
|
|
114
|
+
provider: plan.engine,
|
|
115
|
+
url: connection.url,
|
|
116
|
+
schemaPath: connection.schemaPath,
|
|
117
|
+
schemaId,
|
|
118
|
+
};
|
|
119
|
+
const runConfig = connectorRegistry.createConnector(connectorConfig);
|
|
120
|
+
const connector = runConfig.connector;
|
|
121
|
+
const result = await introspect(runConfig.input, {
|
|
122
|
+
outDir: options.outDir,
|
|
123
|
+
schemaId,
|
|
124
|
+
existingArtifactDir: options.hasExistingArtifact ? options.outDir : undefined,
|
|
125
|
+
}, { connector });
|
|
126
|
+
return {
|
|
127
|
+
engine: plan.engine,
|
|
128
|
+
schemaId,
|
|
129
|
+
tables: result.schema.schemas.reduce((sum, namespace) => sum + namespace.tables.length, 0),
|
|
130
|
+
warnings: result.warnings.map((warning) => typeof warning === "string" ? warning : JSON.stringify(warning)),
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
function inferSchemaId(path) {
|
|
134
|
+
const name = basename(path);
|
|
135
|
+
const inferred = name.endsWith(".schema") ? name.slice(0, -".schema".length) : name;
|
|
136
|
+
return inferred || "introspected";
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=introspection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"introspection.js","sourceRoot":"","sources":["../src/introspection.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
CHANGED
|
@@ -1,12 +1,21 @@
|
|
|
1
1
|
import { createServer } from "node:http";
|
|
2
|
+
import { createPgvectorStore } from "@askdb/rag";
|
|
2
3
|
import { type Workspace } from "@askdb/enrich";
|
|
3
|
-
import type { StudioWorkspaceDto } from "./shared/api.js";
|
|
4
|
+
import type { SetupReason, StudioWorkspaceDto } from "./shared/api.js";
|
|
4
5
|
export type StudioOptions = {
|
|
5
6
|
schema: string;
|
|
6
7
|
host?: string;
|
|
7
8
|
port?: number;
|
|
9
|
+
/**
|
|
10
|
+
* Start in setup mode instead of failing: `"no-config"` when no
|
|
11
|
+
* `askdb.config.*` was found, `"no-artifact"` when the config exists but the
|
|
12
|
+
* schema artifact hasn't been introspected yet. The browser wizard walks the
|
|
13
|
+
* user through the missing steps and flips the server to ready.
|
|
14
|
+
*/
|
|
15
|
+
setupReason?: SetupReason | null;
|
|
8
16
|
};
|
|
9
17
|
export type StudioServer = ReturnType<typeof createServer>;
|
|
18
|
+
export declare function setStudioPgvectorStoreFactoryForTests(factory: typeof createPgvectorStore | undefined): void;
|
|
10
19
|
export declare function createStudioServer(options: StudioOptions): StudioServer;
|
|
11
20
|
export declare function serializeWorkspace(workspace: Workspace): StudioWorkspaceDto;
|
|
12
21
|
//# sourceMappingURL=server.d.ts.map
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAA6C,MAAM,WAAW,CAAC;AA+BpF,OAAO,EAOL,mBAAmB,EAOpB,MAAM,YAAY,CAAC;AACpB,OAAO,EAaL,KAAK,SAAS,EACf,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAYV,WAAW,EAKX,kBAAkB,EAGnB,MAAM,iBAAiB,CAAC;AAUzB,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;;OAKG;IACH,WAAW,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;AA0D3D,wBAAgB,qCAAqC,CACnD,OAAO,EAAE,OAAO,mBAAmB,GAAG,SAAS,GAC9C,IAAI,CAEN;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,aAAa,GAAG,YAAY,CAwJvE;AAED,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,SAAS,GAAG,kBAAkB,CA8C3E"}
|