askdb 1.0.0-beta.47 → 1.0.0-beta.49
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/ask.d.ts +15 -0
- package/dist/ask.d.ts.map +1 -0
- package/dist/ask.js +168 -0
- package/dist/ask.js.map +1 -0
- package/dist/bundle.d.ts +10 -0
- package/dist/bundle.d.ts.map +1 -0
- package/dist/bundle.js +51 -0
- package/dist/bundle.js.map +1 -0
- package/dist/cli-error.d.ts +10 -0
- package/dist/cli-error.d.ts.map +1 -0
- package/dist/cli-error.js +39 -0
- package/dist/cli-error.js.map +1 -0
- package/dist/cli.js +27 -308
- package/dist/cli.js.map +1 -1
- package/dist/command.d.ts +56 -0
- package/dist/command.d.ts.map +1 -0
- package/dist/command.js +139 -0
- package/dist/command.js.map +1 -0
- package/dist/dispatch.d.ts +6 -0
- package/dist/dispatch.d.ts.map +1 -0
- package/dist/dispatch.js +65 -0
- package/dist/dispatch.js.map +1 -0
- package/dist/init.d.ts +33 -20
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +273 -591
- package/dist/init.js.map +1 -1
- package/dist/introspect.d.ts +21 -1
- package/dist/introspect.d.ts.map +1 -1
- package/dist/introspect.js +57 -156
- package/dist/introspect.js.map +1 -1
- package/dist/logger.d.ts +3 -0
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +36 -3
- package/dist/logger.js.map +1 -1
- package/dist/prisma-install.d.ts +1 -1
- package/dist/prisma-install.js +1 -1
- package/dist/rag.d.ts +31 -0
- package/dist/rag.d.ts.map +1 -1
- package/dist/rag.js +175 -185
- package/dist/rag.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/package.json +15 -15
package/dist/ask.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type CommandSpec } from "./command.js";
|
|
2
|
+
import { type CliLoggingFlags } from "./logger.js";
|
|
3
|
+
type AskOptions = CliLoggingFlags & {
|
|
4
|
+
schema?: string;
|
|
5
|
+
question?: string;
|
|
6
|
+
explain?: boolean;
|
|
7
|
+
mockSql?: string;
|
|
8
|
+
mode?: string;
|
|
9
|
+
omitSensitiveFromPrompt?: boolean;
|
|
10
|
+
};
|
|
11
|
+
/** `askdb ask`: SQL for one question, on stdout after `-- sql --`. */
|
|
12
|
+
export declare function askCommand(): CommandSpec<AskOptions>;
|
|
13
|
+
export declare function runAskCli(argv: readonly string[]): Promise<number>;
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=ask.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ask.d.ts","sourceRoot":"","sources":["../src/ask.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAc,KAAK,WAAW,EAAa,MAAM,cAAc,CAAC;AACvE,OAAO,EAAqD,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAOtG,KAAK,UAAU,GAAG,eAAe,GAAG;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACnC,CAAC;AAyCF,sEAAsE;AACtE,wBAAgB,UAAU,IAAI,WAAW,CAAC,UAAU,CAAC,CAapD;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAElE"}
|
package/dist/ask.js
ADDED
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { createAiRegistry } from "@askdb/ai";
|
|
2
|
+
import { createAskDb } from "@askdb/client";
|
|
3
|
+
import { getAskDbRuntimeConfig } from "@askdb/config";
|
|
4
|
+
import { AskDbError, AskDbLogEvent, formatAskDbModesV1, formatSensitiveReference, loadSchema, parseAskDbModeV1, SchemaParseError, } from "@askdb/core";
|
|
5
|
+
import { errorMessage, printCliError } from "./cli-error.js";
|
|
6
|
+
import { runCommand } from "./command.js";
|
|
7
|
+
import { createCliLogger, loggingFlags, resolveCliLogLevel } from "./logger.js";
|
|
8
|
+
// Batteries-included surface: every built-in provider is registered, and each
|
|
9
|
+
// loads its @ai-sdk/* package only when first used, so env config alone
|
|
10
|
+
// selects the provider.
|
|
11
|
+
const ai = createAiRegistry();
|
|
12
|
+
const ASK_FLAGS = [
|
|
13
|
+
{
|
|
14
|
+
names: ["-s", "--schema"],
|
|
15
|
+
value: "<path>",
|
|
16
|
+
help: "Schema v2 directory, bundled JSON, or schema.json. Default: introspection.outputDir, or ./askdb/.",
|
|
17
|
+
apply: (opts, value) => (opts.schema = value),
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
names: ["-q", "--question"],
|
|
21
|
+
value: "<text>",
|
|
22
|
+
help: "The natural-language question (required).",
|
|
23
|
+
apply: (opts, value) => (opts.question = value),
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
names: ["--mode"],
|
|
27
|
+
value: "<id>",
|
|
28
|
+
help: () => `Operating mode (${formatAskDbModesV1()}). Can tighten config modes.askdbMode (default schema_only), never loosen it.`,
|
|
29
|
+
apply: (opts, value) => (opts.mode = value),
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
names: ["--explain"],
|
|
33
|
+
help: "After the SQL, print a JSON block describing the heuristic guardrails satisfied.",
|
|
34
|
+
apply: (opts) => (opts.explain = true),
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
names: ["--omit-sensitive-from-prompt"],
|
|
38
|
+
help: "Omit sensitive column/table names from the NL→SQL prompt. Default: include them, tagged as sensitive.",
|
|
39
|
+
apply: (opts) => (opts.omitSensitiveFromPrompt = true),
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
names: ["--mock-sql"],
|
|
43
|
+
value: "<sql>",
|
|
44
|
+
help: "Deterministic NL→SQL for tests (bypasses the live model call). Default: dev.mockSql.",
|
|
45
|
+
apply: (opts, value) => (opts.mockSql = value),
|
|
46
|
+
},
|
|
47
|
+
...loggingFlags(),
|
|
48
|
+
];
|
|
49
|
+
/** `askdb ask`: SQL for one question, on stdout after `-- sql --`. */
|
|
50
|
+
export function askCommand() {
|
|
51
|
+
return {
|
|
52
|
+
name: "ask",
|
|
53
|
+
summary: "Generate SQL from schema + question",
|
|
54
|
+
usage: ['askdb ask --question "<text>" [--schema <path>] [--mode <id>] [--explain]'],
|
|
55
|
+
flags: ASK_FLAGS,
|
|
56
|
+
initial: () => ({}),
|
|
57
|
+
check(opts) {
|
|
58
|
+
if (opts.question === undefined)
|
|
59
|
+
throw new Error("Missing --question <text>.");
|
|
60
|
+
},
|
|
61
|
+
needsConfig: () => true,
|
|
62
|
+
run: runAsk,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
export function runAskCli(argv) {
|
|
66
|
+
return runCommand(askCommand(), argv);
|
|
67
|
+
}
|
|
68
|
+
async function runAsk(opts) {
|
|
69
|
+
const question = opts.question;
|
|
70
|
+
let logLevel;
|
|
71
|
+
// Only the flag is parsed here: the facade applies config `modes.askdbMode` (ADR 0025).
|
|
72
|
+
let mode;
|
|
73
|
+
const runtime = getAskDbRuntimeConfig();
|
|
74
|
+
try {
|
|
75
|
+
logLevel = resolveCliLogLevel(opts, runtime);
|
|
76
|
+
mode = opts.mode === undefined ? undefined : parseAskDbModeV1(opts.mode);
|
|
77
|
+
}
|
|
78
|
+
catch (e) {
|
|
79
|
+
printCliError(e);
|
|
80
|
+
return 1;
|
|
81
|
+
}
|
|
82
|
+
const logger = createCliLogger(opts, runtime, logLevel);
|
|
83
|
+
const mockSql = opts.mockSql ?? runtime.dev.mockSql;
|
|
84
|
+
const aiConfig = mockSql ? undefined : ai.resolveAiConfig(runtime.ai.aiEnv);
|
|
85
|
+
if (!mockSql && !aiConfig) {
|
|
86
|
+
process.stderr.write(`${ai.keyMissingMessage("NL→SQL generation")}\n`);
|
|
87
|
+
process.stderr.write("Tip: in tests, pass --mock-sql or set dev.mockSql in askdb.config to bypass live model calls.\n");
|
|
88
|
+
return 1;
|
|
89
|
+
}
|
|
90
|
+
logger.info({ event: AskDbLogEvent.RunStart }, "askdb run start");
|
|
91
|
+
try {
|
|
92
|
+
const schema = loadSchemaFromPath(opts.schema ?? runtime.introspection.outputDir);
|
|
93
|
+
const askdb = createAskDb({
|
|
94
|
+
config: runtime,
|
|
95
|
+
registry: ai,
|
|
96
|
+
onResolve: (info) => {
|
|
97
|
+
if (info.dialect.note) {
|
|
98
|
+
logger.info({ event: "askdb.pipeline.dialect_override", note: info.dialect.note }, info.dialect.note);
|
|
99
|
+
process.stderr.write(`Note: ${info.dialect.note}\n`);
|
|
100
|
+
}
|
|
101
|
+
},
|
|
102
|
+
});
|
|
103
|
+
const out = await askdb.ask(question, {
|
|
104
|
+
schema: { schema },
|
|
105
|
+
logger,
|
|
106
|
+
mode,
|
|
107
|
+
explain: opts.explain,
|
|
108
|
+
// The facade adds config `modes.omitSensitiveFromPrompt` as a floor.
|
|
109
|
+
omitSensitiveIdentifiersFromNlToSqlPrompt: opts.omitSensitiveFromPrompt,
|
|
110
|
+
// When --mock-sql flag is set explicitly (not just from runtime config),
|
|
111
|
+
// pass it as a per-call deps override so the flag wins over config.
|
|
112
|
+
...(opts.mockSql !== undefined
|
|
113
|
+
? {
|
|
114
|
+
deps: {
|
|
115
|
+
generateText: (async () => ({ text: opts.mockSql })),
|
|
116
|
+
},
|
|
117
|
+
}
|
|
118
|
+
: {}),
|
|
119
|
+
});
|
|
120
|
+
// `ask()` runs the sensitive-identifier guardrail in warn mode and emits
|
|
121
|
+
// askdb.pipeline.sensitive_sql_warning through the logger above; the CLI
|
|
122
|
+
// only renders it for the operator.
|
|
123
|
+
const sensitive = out.sensitiveGuardrail;
|
|
124
|
+
if (sensitive && sensitive.references.length > 0) {
|
|
125
|
+
const cols = sensitive.references.map(formatSensitiveReference);
|
|
126
|
+
process.stderr.write(`Warning: generated SQL references sensitive columns: ${cols.join(", ")}\n` +
|
|
127
|
+
"Review carefully before sharing or running this SQL outside AskDB.\n");
|
|
128
|
+
}
|
|
129
|
+
if (sensitive?.unresolvedScope) {
|
|
130
|
+
process.stderr.write(`Note: ${sensitive.unresolvedScope.message}\n`);
|
|
131
|
+
}
|
|
132
|
+
process.stdout.write("-- sql --\n");
|
|
133
|
+
process.stdout.write(`${out.sql}\n`);
|
|
134
|
+
if (opts.explain) {
|
|
135
|
+
process.stdout.write("-- explain --\n");
|
|
136
|
+
process.stdout.write(`${JSON.stringify(out.explain ?? null, null, 2)}\n`);
|
|
137
|
+
}
|
|
138
|
+
logger.info({ event: AskDbLogEvent.RunEnd, ok: true }, "askdb run end");
|
|
139
|
+
return 0;
|
|
140
|
+
}
|
|
141
|
+
catch (error) {
|
|
142
|
+
logger.error({ event: AskDbLogEvent.RunError, errMessage: errorMessage(error) }, "askdb run error");
|
|
143
|
+
printCliError(error);
|
|
144
|
+
return 1;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
function formatSchemaPathHint(schemaPath) {
|
|
148
|
+
return `Schema path: ${schemaPath}\nHint: Try \`fixtures/schemas/orders-users.schema/\` (v2 directory) as a known-good example.`;
|
|
149
|
+
}
|
|
150
|
+
function loadSchemaFromPath(schemaPath) {
|
|
151
|
+
try {
|
|
152
|
+
return loadSchema(schemaPath);
|
|
153
|
+
}
|
|
154
|
+
catch (e) {
|
|
155
|
+
const code = e.code;
|
|
156
|
+
if (code === "ENOENT") {
|
|
157
|
+
throw new AskDbError(`Schema path not found.\n${formatSchemaPathHint(schemaPath)}`, e);
|
|
158
|
+
}
|
|
159
|
+
if (code === "EACCES") {
|
|
160
|
+
throw new AskDbError(`Schema path is not readable (permission denied).\n${formatSchemaPathHint(schemaPath)}`, e);
|
|
161
|
+
}
|
|
162
|
+
if (e instanceof SchemaParseError) {
|
|
163
|
+
throw new AskDbError(`Failed to parse schema.\n${formatSchemaPathHint(schemaPath)}\nDetails: ${e.message}`, e);
|
|
164
|
+
}
|
|
165
|
+
throw new AskDbError(`Failed to load schema.\n${formatSchemaPathHint(schemaPath)}\nDetails: ${errorMessage(e)}`, e);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=ask.js.map
|
package/dist/ask.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ask.js","sourceRoot":"","sources":["../src/ask.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EACL,UAAU,EACV,aAAa,EAIb,kBAAkB,EAClB,wBAAwB,EACxB,UAAU,EACV,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,UAAU,EAA+B,MAAM,cAAc,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,kBAAkB,EAAwB,MAAM,aAAa,CAAC;AAEtG,8EAA8E;AAC9E,wEAAwE;AACxE,wBAAwB;AACxB,MAAM,EAAE,GAAG,gBAAgB,EAAE,CAAC;AAW9B,MAAM,SAAS,GAAgC;IAC7C;QACE,KAAK,EAAE,CAAC,IAAI,EAAE,UAAU,CAAC;QACzB,KAAK,EAAE,QAAQ;QACf,IAAI,EAAE,mGAAmG;QACzG,KAAK,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;KAC9C;IACD;QACE,KAAK,EAAE,CAAC,IAAI,EAAE,YAAY,CAAC;QAC3B,KAAK,EAAE,QAAQ;QACf,IAAI,EAAE,2CAA2C;QACjD,KAAK,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;KAChD;IACD;QACE,KAAK,EAAE,CAAC,QAAQ,CAAC;QACjB,KAAK,EAAE,MAAM;QACb,IAAI,EAAE,GAAG,EAAE,CACT,mBAAmB,kBAAkB,EAAE,+EAA+E;QACxH,KAAK,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;KAC5C;IACD;QACE,KAAK,EAAE,CAAC,WAAW,CAAC;QACpB,IAAI,EAAE,kFAAkF;QACxF,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;KACvC;IACD;QACE,KAAK,EAAE,CAAC,8BAA8B,CAAC;QACvC,IAAI,EAAE,uGAAuG;QAC7G,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC;KACvD;IACD;QACE,KAAK,EAAE,CAAC,YAAY,CAAC;QACrB,KAAK,EAAE,OAAO;QACd,IAAI,EAAE,sFAAsF;QAC5F,KAAK,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;KAC/C;IACD,GAAG,YAAY,EAAc;CAC9B,CAAC;AAEF,sEAAsE;AACtE,MAAM,UAAU,UAAU;IACxB,OAAO;QACL,IAAI,EAAE,KAAK;QACX,OAAO,EAAE,qCAAqC;QAC9C,KAAK,EAAE,CAAC,2EAA2E,CAAC;QACpF,KAAK,EAAE,SAAS;QAChB,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC;QACnB,KAAK,CAAC,IAAI;YACR,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS;gBAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QACjF,CAAC;QACD,WAAW,EAAE,GAAG,EAAE,CAAC,IAAI;QACvB,GAAG,EAAE,MAAM;KACZ,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAuB;IAC/C,OAAO,UAAU,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC,CAAC;AACxC,CAAC;AAED,KAAK,UAAU,MAAM,CAAC,IAAgB;IACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAS,CAAC;IAChC,IAAI,QAAuB,CAAC;IAC5B,wFAAwF;IACxF,IAAI,IAA6B,CAAC;IAClC,MAAM,OAAO,GAAG,qBAAqB,EAAE,CAAC;IACxC,IAAI,CAAC;QACH,QAAQ,GAAG,kBAAkB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC7C,IAAI,GAAG,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3E,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,aAAa,CAAC,CAAC,CAAC,CAAC;QACjB,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IAExD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;IACpD,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;IAC5E,IAAI,CAAC,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC1B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;QACvE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iGAAiG,CAAC,CAAC;QACxH,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,aAAa,CAAC,QAAQ,EAAE,EAAE,iBAAiB,CAAC,CAAC;IAElE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,kBAAkB,CAAC,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QAElF,MAAM,KAAK,GAAG,WAAW,CAAC;YACxB,MAAM,EAAE,OAAO;YACf,QAAQ,EAAE,EAAE;YACZ,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE;gBAClB,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;oBACtB,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,iCAAiC,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;oBACtG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC;gBACvD,CAAC;YACH,CAAC;SACF,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE;YACpC,MAAM,EAAE,EAAE,MAAM,EAAE;YAClB,MAAM;YACN,IAAI;YACJ,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,qEAAqE;YACrE,yCAAyC,EAAE,IAAI,CAAC,uBAAuB;YACvE,yEAAyE;YACzE,oEAAoE;YACpE,GAAG,CAAC,IAAI,CAAC,OAAO,KAAK,SAAS;gBAC5B,CAAC,CAAC;oBACE,IAAI,EAAE;wBACJ,YAAY,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,EAAU,CAAA,CAEzD;qBACF;iBACF;gBACH,CAAC,CAAC,EAAE,CAAC;SACR,CAAC,CAAC;QAEH,yEAAyE;QACzE,yEAAyE;QACzE,oCAAoC;QACpC,MAAM,SAAS,GAAG,GAAG,CAAC,kBAAkB,CAAC;QACzC,IAAI,SAAS,IAAI,SAAS,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjD,MAAM,IAAI,GAAG,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;YAChE,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,wDAAwD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;gBACzE,sEAAsE,CACzE,CAAC;QACJ,CAAC;QACD,IAAI,SAAS,EAAE,eAAe,EAAE,CAAC;YAC/B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,SAAS,CAAC,eAAe,CAAC,OAAO,IAAI,CAAC,CAAC;QACvE,CAAC;QAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QACpC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;QACrC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;YACxC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,IAAI,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QAC5E,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,aAAa,CAAC,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,eAAe,CAAC,CAAC;QACxE,OAAO,CAAC,CAAC;IACX,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,aAAa,CAAC,QAAQ,EAAE,UAAU,EAAE,YAAY,CAAC,KAAK,CAAC,EAAE,EAAE,iBAAiB,CAAC,CAAC;QACpG,aAAa,CAAC,KAAK,CAAC,CAAC;QACrB,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB,CAAC,UAAkB;IAC9C,OAAO,gBAAgB,UAAU,+FAA+F,CAAC;AACnI,CAAC;AAED,SAAS,kBAAkB,CAAC,UAAkB;IAC5C,IAAI,CAAC;QACH,OAAO,UAAU,CAAC,UAAU,CAAC,CAAC;IAChC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,IAAI,GAAI,CAAwB,CAAC,IAAI,CAAC;QAC5C,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,MAAM,IAAI,UAAU,CAAC,2BAA2B,oBAAoB,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QACzF,CAAC;QACD,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,MAAM,IAAI,UAAU,CAAC,qDAAqD,oBAAoB,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QACnH,CAAC;QACD,IAAI,CAAC,YAAY,gBAAgB,EAAE,CAAC;YAClC,MAAM,IAAI,UAAU,CAAC,4BAA4B,oBAAoB,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;QACjH,CAAC;QACD,MAAM,IAAI,UAAU,CAAC,2BAA2B,oBAAoB,CAAC,UAAU,CAAC,cAAc,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACtH,CAAC;AACH,CAAC"}
|
package/dist/bundle.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type CommandSpec } from "./command.js";
|
|
2
|
+
type BundleOptions = {
|
|
3
|
+
schemaDir?: string;
|
|
4
|
+
out?: string;
|
|
5
|
+
};
|
|
6
|
+
/** `askdb bundle`: one Schema v2 directory as one JSON file. It never reads askdb.config. */
|
|
7
|
+
export declare function bundleCommand(): CommandSpec<BundleOptions>;
|
|
8
|
+
export declare function runBundleCli(argv: readonly string[]): Promise<number>;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=bundle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bundle.d.ts","sourceRoot":"","sources":["../src/bundle.ts"],"names":[],"mappings":"AAGA,OAAO,EAAc,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAI5D,KAAK,aAAa,GAAG;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1D,6FAA6F;AAC7F,wBAAgB,aAAa,IAAI,WAAW,CAAC,aAAa,CAAC,CAsC1D;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAErE"}
|
package/dist/bundle.js
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { writeFileSync } from "node:fs";
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
import { errorMessage } from "./cli-error.js";
|
|
4
|
+
import { runCommand } from "./command.js";
|
|
5
|
+
const USAGE = "askdb bundle <schema-dir> --out <bundle.json>";
|
|
6
|
+
/** `askdb bundle`: one Schema v2 directory as one JSON file. It never reads askdb.config. */
|
|
7
|
+
export function bundleCommand() {
|
|
8
|
+
return {
|
|
9
|
+
name: "bundle",
|
|
10
|
+
summary: "Bundle a Schema v2 directory into a single JSON file",
|
|
11
|
+
usage: [USAGE],
|
|
12
|
+
flags: [
|
|
13
|
+
{
|
|
14
|
+
names: ["--out"],
|
|
15
|
+
value: "<bundle.json>",
|
|
16
|
+
help: "Write the bundle here (required).",
|
|
17
|
+
apply: (opts, value) => (opts.out = value),
|
|
18
|
+
},
|
|
19
|
+
],
|
|
20
|
+
positional(opts, value, index) {
|
|
21
|
+
if (index > 0) {
|
|
22
|
+
throw new Error("Unexpected argument: askdb bundle takes one <schema-dir>. Pass the output path with --out.");
|
|
23
|
+
}
|
|
24
|
+
opts.schemaDir = value;
|
|
25
|
+
},
|
|
26
|
+
initial: () => ({}),
|
|
27
|
+
check(opts) {
|
|
28
|
+
if (!opts.schemaDir || !opts.out)
|
|
29
|
+
throw new Error(`Usage: ${USAGE}`);
|
|
30
|
+
},
|
|
31
|
+
needsConfig: () => false,
|
|
32
|
+
async run(opts) {
|
|
33
|
+
const { bundleSchemaDirectory } = await import("@askdb/enrich");
|
|
34
|
+
const outPath = resolve(opts.out);
|
|
35
|
+
try {
|
|
36
|
+
const bundle = bundleSchemaDirectory(resolve(opts.schemaDir));
|
|
37
|
+
writeFileSync(outPath, `${JSON.stringify(bundle, null, 2)}\n`, "utf8");
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
process.stderr.write(`askdb bundle: ${errorMessage(error)}\n`);
|
|
41
|
+
return 1;
|
|
42
|
+
}
|
|
43
|
+
process.stdout.write(`Wrote ${outPath}\n`);
|
|
44
|
+
return 0;
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
export function runBundleCli(argv) {
|
|
49
|
+
return runCommand(bundleCommand(), argv);
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=bundle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bundle.js","sourceRoot":"","sources":["../src/bundle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAoB,MAAM,cAAc,CAAC;AAE5D,MAAM,KAAK,GAAG,+CAA+C,CAAC;AAI9D,6FAA6F;AAC7F,MAAM,UAAU,aAAa;IAC3B,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,sDAAsD;QAC/D,KAAK,EAAE,CAAC,KAAK,CAAC;QACd,KAAK,EAAE;YACL;gBACE,KAAK,EAAE,CAAC,OAAO,CAAC;gBAChB,KAAK,EAAE,eAAe;gBACtB,IAAI,EAAE,mCAAmC;gBACzC,KAAK,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC;aAC3C;SACF;QACD,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK;YAC3B,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;gBACd,MAAM,IAAI,KAAK,CAAC,4FAA4F,CAAC,CAAC;YAChH,CAAC;YACD,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACzB,CAAC;QACD,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC;QACnB,KAAK,CAAC,IAAI;YACR,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,GAAG;gBAAE,MAAM,IAAI,KAAK,CAAC,UAAU,KAAK,EAAE,CAAC,CAAC;QACvE,CAAC;QACD,WAAW,EAAE,GAAG,EAAE,CAAC,KAAK;QACxB,KAAK,CAAC,GAAG,CAAC,IAAI;YACZ,MAAM,EAAE,qBAAqB,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;YAChE,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,GAAI,CAAC,CAAC;YACnC,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,qBAAqB,CAAC,OAAO,CAAC,IAAI,CAAC,SAAU,CAAC,CAAC,CAAC;gBAC/D,aAAa,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YACzE,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAiB,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC/D,OAAO,CAAC,CAAC;YACX,CAAC;YACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,OAAO,IAAI,CAAC,CAAC;YAC3C,OAAO,CAAC,CAAC;QACX,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAuB;IAClD,OAAO,UAAU,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,CAAC;AAC3C,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A thrown value as one or more lines, never blank. An error with an empty message, such as the
|
|
3
|
+
* `AggregateError` a driver throws when `localhost` refuses on both ::1 and 127.0.0.1, gives each
|
|
4
|
+
* inner error's message once (a socket error names the address, not the connection string), else
|
|
5
|
+
* its `code`, else its name.
|
|
6
|
+
*/
|
|
7
|
+
export declare function errorMessage(error: unknown): string;
|
|
8
|
+
/** The CLI's printer for `askdb ask` and the top-level handler: AskDB errors keep their name. */
|
|
9
|
+
export declare function printCliError(error: unknown): void;
|
|
10
|
+
//# sourceMappingURL=cli-error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-error.d.ts","sourceRoot":"","sources":["../src/cli-error.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CASnD;AAED,iGAAiG;AACjG,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAelD"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { AskDbError, SqlValidationError } from "@askdb/core";
|
|
2
|
+
import { MissingAskDbConfigError } from "./project-config.js";
|
|
3
|
+
/**
|
|
4
|
+
* A thrown value as one or more lines, never blank. An error with an empty message, such as the
|
|
5
|
+
* `AggregateError` a driver throws when `localhost` refuses on both ::1 and 127.0.0.1, gives each
|
|
6
|
+
* inner error's message once (a socket error names the address, not the connection string), else
|
|
7
|
+
* its `code`, else its name.
|
|
8
|
+
*/
|
|
9
|
+
export function errorMessage(error) {
|
|
10
|
+
if (!(error instanceof Error))
|
|
11
|
+
return String(error);
|
|
12
|
+
if (error.message)
|
|
13
|
+
return error.message;
|
|
14
|
+
if (error instanceof AggregateError && error.errors.length > 0) {
|
|
15
|
+
const lines = new Set(error.errors.map((inner) => errorMessage(inner)));
|
|
16
|
+
return [...lines].join("\n");
|
|
17
|
+
}
|
|
18
|
+
const code = error.code;
|
|
19
|
+
return typeof code === "string" && code ? code : error.name;
|
|
20
|
+
}
|
|
21
|
+
/** The CLI's printer for `askdb ask` and the top-level handler: AskDB errors keep their name. */
|
|
22
|
+
export function printCliError(error) {
|
|
23
|
+
if (error instanceof MissingAskDbConfigError) {
|
|
24
|
+
process.stderr.write(`${error.message}\n`);
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
if (error instanceof SqlValidationError) {
|
|
28
|
+
process.stderr.write(`${error.name} [${error.rule}]: ${error.message}\n`);
|
|
29
|
+
if (error.hint)
|
|
30
|
+
process.stderr.write(`Hint: ${error.hint}\n`);
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
if (error instanceof AskDbError) {
|
|
34
|
+
process.stderr.write(`${error.name}: ${errorMessage(error)}\n`);
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
process.stderr.write(`${errorMessage(error)}\n`);
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=cli-error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-error.js","sourceRoot":"","sources":["../src/cli-error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAE9D;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACpD,IAAI,KAAK,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC,OAAO,CAAC;IACxC,IAAI,KAAK,YAAY,cAAc,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/D,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACxE,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IACD,MAAM,IAAI,GAAI,KAA4B,CAAC,IAAI,CAAC;IAChD,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;AAC9D,CAAC;AAED,iGAAiG;AACjG,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,IAAI,KAAK,YAAY,uBAAuB,EAAE,CAAC;QAC7C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;QAC3C,OAAO;IACT,CAAC;IACD,IAAI,KAAK,YAAY,kBAAkB,EAAE,CAAC;QACxC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,MAAM,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;QAC1E,IAAI,KAAK,CAAC,IAAI;YAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC;QAC9D,OAAO;IACT,CAAC;IACD,IAAI,KAAK,YAAY,UAAU,EAAE,CAAC;QAChC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,IAAI,KAAK,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAChE,OAAO;IACT,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACnD,CAAC"}
|