dirsql 0.3.18 → 0.3.20
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/cli/dirsql.js +4 -1
- package/dist/cli/dirsql.js.map +1 -1
- package/dist/cli/interpret/buildTables.d.ts +3 -0
- package/dist/cli/interpret/buildTables.d.ts.map +1 -0
- package/dist/cli/interpret/buildTables.js +18 -0
- package/dist/cli/interpret/buildTables.js.map +1 -0
- package/dist/cli/interpret/buildTables.test.d.ts +2 -0
- package/dist/cli/interpret/buildTables.test.d.ts.map +1 -0
- package/dist/cli/interpret/buildTables.test.js +62 -0
- package/dist/cli/interpret/buildTables.test.js.map +1 -0
- package/dist/cli/interpret/dispatchExtract.d.ts +16 -0
- package/dist/cli/interpret/dispatchExtract.d.ts.map +1 -0
- package/dist/cli/interpret/dispatchExtract.js +25 -0
- package/dist/cli/interpret/dispatchExtract.js.map +1 -0
- package/dist/cli/interpret/dispatchExtract.test.d.ts +2 -0
- package/dist/cli/interpret/dispatchExtract.test.d.ts.map +1 -0
- package/dist/cli/interpret/dispatchExtract.test.js +75 -0
- package/dist/cli/interpret/dispatchExtract.test.js.map +1 -0
- package/dist/cli/interpret/errMessage.d.ts +2 -0
- package/dist/cli/interpret/errMessage.d.ts.map +1 -0
- package/dist/cli/interpret/errMessage.js +7 -0
- package/dist/cli/interpret/errMessage.js.map +1 -0
- package/dist/cli/interpret/errMessage.test.d.ts +2 -0
- package/dist/cli/interpret/errMessage.test.d.ts.map +1 -0
- package/dist/cli/interpret/errMessage.test.js +23 -0
- package/dist/cli/interpret/errMessage.test.js.map +1 -0
- package/dist/cli/interpret/index.d.ts +2 -0
- package/dist/cli/interpret/index.d.ts.map +1 -0
- package/dist/cli/interpret/index.js +7 -0
- package/dist/cli/interpret/index.js.map +1 -0
- package/dist/cli/interpret/interpret.d.ts +2 -0
- package/dist/cli/interpret/interpret.d.ts.map +1 -0
- package/dist/cli/interpret/interpret.js +66 -0
- package/dist/cli/interpret/interpret.js.map +1 -0
- package/dist/cli/interpret/interpret.test.d.ts +2 -0
- package/dist/cli/interpret/interpret.test.d.ts.map +1 -0
- package/dist/cli/interpret/interpret.test.js +153 -0
- package/dist/cli/interpret/interpret.test.js.map +1 -0
- package/dist/cli/interpret/loadApp.d.ts +3 -0
- package/dist/cli/interpret/loadApp.d.ts.map +1 -0
- package/dist/cli/interpret/loadApp.js +18 -0
- package/dist/cli/interpret/loadApp.js.map +1 -0
- package/dist/cli/interpret/loadApp.test.d.ts +2 -0
- package/dist/cli/interpret/loadApp.test.d.ts.map +1 -0
- package/dist/cli/interpret/loadApp.test.js +41 -0
- package/dist/cli/interpret/loadApp.test.js.map +1 -0
- package/dist/cli/interpret/writeMessage.d.ts +2 -0
- package/dist/cli/interpret/writeMessage.d.ts.map +1 -0
- package/dist/cli/interpret/writeMessage.js +8 -0
- package/dist/cli/interpret/writeMessage.js.map +1 -0
- package/dist/cli/interpret/writeMessage.test.d.ts +2 -0
- package/dist/cli/interpret/writeMessage.test.d.ts.map +1 -0
- package/dist/cli/interpret/writeMessage.test.js +25 -0
- package/dist/cli/interpret/writeMessage.test.js.map +1 -0
- package/dist/cli/main.d.ts +1 -1
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +10 -2
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/main.test.js +36 -10
- package/dist/cli/main.test.js.map +1 -1
- package/dist/index.d.ts +29 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +35 -1
- package/dist/index.js.map +1 -1
- package/package.json +11 -11
package/dist/cli/dirsql.js
CHANGED
|
@@ -10,5 +10,8 @@
|
|
|
10
10
|
// guard silently skipped main() so `dirsql --version` produced no
|
|
11
11
|
// output (caught by the pack-install build-CI smoke test).
|
|
12
12
|
import { main } from "./main.js";
|
|
13
|
-
main()
|
|
13
|
+
main().catch((e) => {
|
|
14
|
+
process.stderr.write(`dirsql: ${e instanceof Error ? e.message : String(e)}\n`);
|
|
15
|
+
process.exit(1);
|
|
16
|
+
});
|
|
14
17
|
//# sourceMappingURL=dirsql.js.map
|
package/dist/cli/dirsql.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dirsql.js","sourceRoot":"","sources":["../../src/cli/dirsql.ts"],"names":[],"mappings":";AACA,uEAAuE;AACvE,6EAA6E;AAC7E,qEAAqE;AACrE,qEAAqE;AACrE,EAAE;AACF,oEAAoE;AACpE,oEAAoE;AACpE,oEAAoE;AACpE,kEAAkE;AAClE,2DAA2D;AAE3D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,IAAI,EAAE,CAAC"}
|
|
1
|
+
{"version":3,"file":"dirsql.js","sourceRoot":"","sources":["../../src/cli/dirsql.ts"],"names":[],"mappings":";AACA,uEAAuE;AACvE,6EAA6E;AAC7E,qEAAqE;AACrE,qEAAqE;AACrE,EAAE;AACF,oEAAoE;AACpE,oEAAoE;AACpE,oEAAoE;AACpE,kEAAkE;AAClE,2DAA2D;AAE3D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,CAAU,EAAE,EAAE;IAC1B,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,WAAW,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAC1D,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildTables.d.ts","sourceRoot":"","sources":["../../../src/cli/interpret/buildTables.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,MAAM,EAAE,KAAK,QAAQ,EAAkB,MAAM,gBAAgB,CAAC;AAE5E,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAU9D"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
// Build a `name -> TableDef` lookup the dispatcher can index by the
|
|
2
|
+
// `table` field on each extract request. Table name comes from the
|
|
3
|
+
// core's canonical `parseTableName` (Rust-side
|
|
4
|
+
// `dirsql::db::parse_table_name`) so the JS side and the orchestrator
|
|
5
|
+
// agree without a duplicate regex.
|
|
6
|
+
import { parseTableName } from "../../index.js";
|
|
7
|
+
export function buildTables(app) {
|
|
8
|
+
const out = new Map();
|
|
9
|
+
for (const t of app._options.tables ?? []) {
|
|
10
|
+
const name = parseTableName(t.ddl);
|
|
11
|
+
if (name === null) {
|
|
12
|
+
throw new Error(`could not parse table name from DDL: ${t.ddl}`);
|
|
13
|
+
}
|
|
14
|
+
out.set(name, t);
|
|
15
|
+
}
|
|
16
|
+
return out;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=buildTables.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildTables.js","sourceRoot":"","sources":["../../../src/cli/interpret/buildTables.ts"],"names":[],"mappings":"AAAA,oEAAoE;AACpE,mEAAmE;AACnE,+CAA+C;AAC/C,sEAAsE;AACtE,mCAAmC;AAEnC,OAAO,EAA8B,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAE5E,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,MAAM,GAAG,GAAG,IAAI,GAAG,EAAoB,CAAC;IACxC,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;QAC1C,MAAM,IAAI,GAAG,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QACnE,CAAC;QACD,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACnB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildTables.test.d.ts","sourceRoot":"","sources":["../../../src/cli/interpret/buildTables.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { __setCoreForTesting, } from "../../index.js";
|
|
3
|
+
import { buildTables } from "./buildTables.js";
|
|
4
|
+
const noopExtract = () => [];
|
|
5
|
+
function fakeApp(tables) {
|
|
6
|
+
return { _options: { tables } };
|
|
7
|
+
}
|
|
8
|
+
describe("buildTables", () => {
|
|
9
|
+
beforeEach(() => {
|
|
10
|
+
__setCoreForTesting({
|
|
11
|
+
// biome-ignore lint/suspicious/noExplicitAny: minimal core stub
|
|
12
|
+
DirSQL: {},
|
|
13
|
+
parseTableName: vi
|
|
14
|
+
.fn()
|
|
15
|
+
.mockImplementation((ddl) => /CREATE\s+TABLE\s+(\w+)/i.exec(ddl)?.[1] ?? null),
|
|
16
|
+
});
|
|
17
|
+
});
|
|
18
|
+
afterEach(() => {
|
|
19
|
+
__setCoreForTesting(null);
|
|
20
|
+
});
|
|
21
|
+
it("returns an empty map when the app has no tables", () => {
|
|
22
|
+
expect(buildTables(fakeApp([]))).toEqual(new Map());
|
|
23
|
+
});
|
|
24
|
+
it("treats undefined tables as empty", () => {
|
|
25
|
+
expect(buildTables(fakeApp(undefined))).toEqual(new Map());
|
|
26
|
+
});
|
|
27
|
+
it("keys the lookup by the SQL identifier parsed from each DDL", () => {
|
|
28
|
+
const t = {
|
|
29
|
+
ddl: "CREATE TABLE papers (title TEXT)",
|
|
30
|
+
glob: "**/*.json",
|
|
31
|
+
extract: noopExtract,
|
|
32
|
+
};
|
|
33
|
+
const tables = buildTables(fakeApp([t]));
|
|
34
|
+
expect(tables.get("papers")).toBe(t);
|
|
35
|
+
});
|
|
36
|
+
it("preserves multiple tables under their respective names", () => {
|
|
37
|
+
const a = {
|
|
38
|
+
ddl: "CREATE TABLE a (x TEXT)",
|
|
39
|
+
glob: "a/*",
|
|
40
|
+
extract: noopExtract,
|
|
41
|
+
};
|
|
42
|
+
const b = {
|
|
43
|
+
ddl: "CREATE TABLE b (y TEXT)",
|
|
44
|
+
glob: "b/*",
|
|
45
|
+
extract: noopExtract,
|
|
46
|
+
};
|
|
47
|
+
const tables = buildTables(fakeApp([a, b]));
|
|
48
|
+
expect(tables.get("a")).toBe(a);
|
|
49
|
+
expect(tables.get("b")).toBe(b);
|
|
50
|
+
expect(tables.size).toBe(2);
|
|
51
|
+
});
|
|
52
|
+
it("throws when parseTableName returns null for a DDL", () => {
|
|
53
|
+
const t = {
|
|
54
|
+
// DDL the fake regex won't match -- no `CREATE TABLE` prefix at all.
|
|
55
|
+
ddl: "DROP TABLE old_papers",
|
|
56
|
+
glob: "*.json",
|
|
57
|
+
extract: noopExtract,
|
|
58
|
+
};
|
|
59
|
+
expect(() => buildTables(fakeApp([t]))).toThrow(/could not parse table name/);
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
//# sourceMappingURL=buildTables.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildTables.test.js","sourceRoot":"","sources":["../../../src/cli/interpret/buildTables.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { TableDef } from "../../index.js";
|
|
2
|
+
export interface ExtractRequest {
|
|
3
|
+
type?: string;
|
|
4
|
+
id?: unknown;
|
|
5
|
+
table?: string;
|
|
6
|
+
path?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface ResultMessage {
|
|
9
|
+
type: "result";
|
|
10
|
+
id: unknown;
|
|
11
|
+
ok: boolean;
|
|
12
|
+
rows?: unknown[];
|
|
13
|
+
error?: string;
|
|
14
|
+
}
|
|
15
|
+
export declare function dispatchExtract(req: ExtractRequest, tables: Map<string, TableDef>): Promise<ResultMessage>;
|
|
16
|
+
//# sourceMappingURL=dispatchExtract.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatchExtract.d.ts","sourceRoot":"","sources":["../../../src/cli/interpret/dispatchExtract.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG/C,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,QAAQ,CAAC;IACf,EAAE,EAAE,OAAO,CAAC;IACZ,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,eAAe,CACnC,GAAG,EAAE,cAAc,EACnB,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,GAC5B,OAAO,CAAC,aAAa,CAAC,CAiBxB"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
// Single-request handler. Given a parsed extract request and the
|
|
2
|
+
// `name -> TableDef` map, call the user's extract callback (which may
|
|
3
|
+
// be sync or async) and build the NDJSON response payload the loop
|
|
4
|
+
// will write back.
|
|
5
|
+
import { errMessage } from "./errMessage.js";
|
|
6
|
+
export async function dispatchExtract(req, tables) {
|
|
7
|
+
const { id, table: name, path } = req;
|
|
8
|
+
const table = name === undefined ? undefined : tables.get(name);
|
|
9
|
+
if (!table) {
|
|
10
|
+
return {
|
|
11
|
+
type: "result",
|
|
12
|
+
id,
|
|
13
|
+
ok: false,
|
|
14
|
+
error: `unknown table: ${JSON.stringify(name)}`,
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
try {
|
|
18
|
+
const rows = await table.extract(path);
|
|
19
|
+
return { type: "result", id, ok: true, rows };
|
|
20
|
+
}
|
|
21
|
+
catch (e) {
|
|
22
|
+
return { type: "result", id, ok: false, error: errMessage(e) };
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=dispatchExtract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatchExtract.js","sourceRoot":"","sources":["../../../src/cli/interpret/dispatchExtract.ts"],"names":[],"mappings":"AAAA,iEAAiE;AACjE,sEAAsE;AACtE,mEAAmE;AACnE,mBAAmB;AAGnB,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAiB7C,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,GAAmB,EACnB,MAA6B;IAE7B,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC;IACtC,MAAM,KAAK,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAChE,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,EAAE;YACF,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,kBAAkB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE;SAChD,CAAC;IACJ,CAAC;IACD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,IAAc,CAAC,CAAC;QACjD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAChD,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;IACjE,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatchExtract.test.d.ts","sourceRoot":"","sources":["../../../src/cli/interpret/dispatchExtract.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { dispatchExtract } from "./dispatchExtract.js";
|
|
3
|
+
function tableMap(entries) {
|
|
4
|
+
return new Map(entries.map(([n, extract]) => [
|
|
5
|
+
n,
|
|
6
|
+
{
|
|
7
|
+
ddl: `CREATE TABLE ${n} (x TEXT)`,
|
|
8
|
+
glob: "*",
|
|
9
|
+
extract,
|
|
10
|
+
},
|
|
11
|
+
]));
|
|
12
|
+
}
|
|
13
|
+
describe("dispatchExtract", () => {
|
|
14
|
+
it("returns ok=true with the rows the sync extract returned", async () => {
|
|
15
|
+
const tables = tableMap([["papers", (p) => [{ row: p }]]]);
|
|
16
|
+
const out = await dispatchExtract({ type: "extract", id: 1, table: "papers", path: "/a" }, tables);
|
|
17
|
+
expect(out).toEqual({
|
|
18
|
+
type: "result",
|
|
19
|
+
id: 1,
|
|
20
|
+
ok: true,
|
|
21
|
+
rows: [{ row: "/a" }],
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
it("echoes the request id verbatim on success", async () => {
|
|
25
|
+
const tables = tableMap([["t", () => []]]);
|
|
26
|
+
const out = await dispatchExtract({ type: "extract", id: 99, table: "t", path: "/" }, tables);
|
|
27
|
+
expect(out.id).toBe(99);
|
|
28
|
+
});
|
|
29
|
+
it("returns ok=false with a JSON-encoded name when the table is unknown", async () => {
|
|
30
|
+
const out = await dispatchExtract({ type: "extract", id: 5, table: "ghost", path: "/" }, tableMap([]));
|
|
31
|
+
expect(out.ok).toBe(false);
|
|
32
|
+
expect(out.error).toContain('"ghost"');
|
|
33
|
+
});
|
|
34
|
+
it("echoes the request id verbatim on unknown-table failure", async () => {
|
|
35
|
+
const out = await dispatchExtract({ type: "extract", id: 17, table: "ghost", path: "/" }, tableMap([]));
|
|
36
|
+
expect(out.id).toBe(17);
|
|
37
|
+
});
|
|
38
|
+
it("returns ok=false with the message when a sync extract throws", async () => {
|
|
39
|
+
const tables = tableMap([
|
|
40
|
+
[
|
|
41
|
+
"papers",
|
|
42
|
+
() => {
|
|
43
|
+
throw new Error("synthetic");
|
|
44
|
+
},
|
|
45
|
+
],
|
|
46
|
+
]);
|
|
47
|
+
const out = await dispatchExtract({ type: "extract", id: 7, table: "papers", path: "/" }, tables);
|
|
48
|
+
expect(out).toEqual({
|
|
49
|
+
type: "result",
|
|
50
|
+
id: 7,
|
|
51
|
+
ok: false,
|
|
52
|
+
error: "synthetic",
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
it("treats a missing table field as unknown table", async () => {
|
|
56
|
+
const out = await dispatchExtract({ type: "extract", id: 1, path: "/" }, tableMap([["t", () => []]]));
|
|
57
|
+
expect(out.ok).toBe(false);
|
|
58
|
+
expect(out.error).toMatch(/unknown table/);
|
|
59
|
+
});
|
|
60
|
+
it("passes the request path to the extract callback", async () => {
|
|
61
|
+
const seen = [];
|
|
62
|
+
const tables = tableMap([
|
|
63
|
+
[
|
|
64
|
+
"t",
|
|
65
|
+
(p) => {
|
|
66
|
+
seen.push(p);
|
|
67
|
+
return [];
|
|
68
|
+
},
|
|
69
|
+
],
|
|
70
|
+
]);
|
|
71
|
+
await dispatchExtract({ type: "extract", id: 1, table: "t", path: "/abs/x.json" }, tables);
|
|
72
|
+
expect(seen).toEqual(["/abs/x.json"]);
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
//# sourceMappingURL=dispatchExtract.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatchExtract.test.js","sourceRoot":"","sources":["../../../src/cli/interpret/dispatchExtract.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errMessage.d.ts","sourceRoot":"","sources":["../../../src/cli/interpret/errMessage.ts"],"names":[],"mappings":"AAIA,wBAAgB,UAAU,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CAE7C"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// Coerce an unknown thrown value into a human-readable string for
|
|
2
|
+
// stderr / NDJSON `error` fields. `Error.message` when available,
|
|
3
|
+
// `String(e)` otherwise.
|
|
4
|
+
export function errMessage(e) {
|
|
5
|
+
return e instanceof Error ? e.message : String(e);
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=errMessage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errMessage.js","sourceRoot":"","sources":["../../../src/cli/interpret/errMessage.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,kEAAkE;AAClE,yBAAyB;AAEzB,MAAM,UAAU,UAAU,CAAC,CAAU;IACnC,OAAO,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACpD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errMessage.test.d.ts","sourceRoot":"","sources":["../../../src/cli/interpret/errMessage.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { errMessage } from "./errMessage.js";
|
|
3
|
+
describe("errMessage", () => {
|
|
4
|
+
it("returns Error.message when the value is an Error", () => {
|
|
5
|
+
expect(errMessage(new Error("boom"))).toBe("boom");
|
|
6
|
+
});
|
|
7
|
+
it("returns Error.message for a subclassed Error", () => {
|
|
8
|
+
expect(errMessage(new TypeError("bad type"))).toBe("bad type");
|
|
9
|
+
});
|
|
10
|
+
it("coerces a string to itself", () => {
|
|
11
|
+
expect(errMessage("plain")).toBe("plain");
|
|
12
|
+
});
|
|
13
|
+
it("coerces null to 'null'", () => {
|
|
14
|
+
expect(errMessage(null)).toBe("null");
|
|
15
|
+
});
|
|
16
|
+
it("coerces a number via String()", () => {
|
|
17
|
+
expect(errMessage(42)).toBe("42");
|
|
18
|
+
});
|
|
19
|
+
it("coerces a plain object via String()", () => {
|
|
20
|
+
expect(errMessage({})).toBe("[object Object]");
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
//# sourceMappingURL=errMessage.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errMessage.test.js","sourceRoot":"","sources":["../../../src/cli/interpret/errMessage.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,CAAC,UAAU,CAAC,IAAI,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;QAChC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/interpret/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// Re-export the `interpret` entry point so callers (the launcher's
|
|
2
|
+
// `main`) can `import { interpret } from "./interpret/index.js"`.
|
|
3
|
+
//
|
|
4
|
+
// Each helper lives in its own module so unit tests can exercise it in
|
|
5
|
+
// isolation without spawning a subprocess.
|
|
6
|
+
export { interpret } from "./interpret.js";
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/interpret/index.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,kEAAkE;AAClE,EAAE;AACF,uEAAuE;AACvE,2CAA2C;AAE3C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interpret.d.ts","sourceRoot":"","sources":["../../../src/cli/interpret/interpret.ts"],"names":[],"mappings":"AA2BA,wBAAsB,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA4CnE"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
// Subcommand entry point for `dirsql interpret <config>`.
|
|
2
|
+
//
|
|
3
|
+
// Glues the per-purpose helpers (`loadApp`, `buildTables`,
|
|
4
|
+
// `dispatchExtract`, `writeMessage`) into the long-running NDJSON
|
|
5
|
+
// loop:
|
|
6
|
+
//
|
|
7
|
+
// handshake (helper -> caller, once on startup):
|
|
8
|
+
// {"type": "config", "state": <app.toJSON()>}
|
|
9
|
+
//
|
|
10
|
+
// extract request (caller -> helper):
|
|
11
|
+
// {"type": "extract", "id": <int>, "table": "<name>", "path": "<abs>"}
|
|
12
|
+
//
|
|
13
|
+
// extract response (helper -> caller):
|
|
14
|
+
// {"type": "result", "id": <int>, "ok": true, "rows": [...]}
|
|
15
|
+
// {"type": "result", "id": <int>, "ok": false, "error": "<msg>"}
|
|
16
|
+
//
|
|
17
|
+
// Exits 0 when stdin closes; non-zero with a single `dirsql interpret:`
|
|
18
|
+
// line on stderr if the config can't be loaded.
|
|
19
|
+
import { createInterface } from "node:readline";
|
|
20
|
+
import { buildTables } from "./buildTables.js";
|
|
21
|
+
import { dispatchExtract } from "./dispatchExtract.js";
|
|
22
|
+
import { errMessage } from "./errMessage.js";
|
|
23
|
+
import { loadApp } from "./loadApp.js";
|
|
24
|
+
import { writeMessage } from "./writeMessage.js";
|
|
25
|
+
export async function interpret(configPath) {
|
|
26
|
+
if (!configPath) {
|
|
27
|
+
process.stderr.write("dirsql interpret: expected one config path, got 0\n");
|
|
28
|
+
return 1;
|
|
29
|
+
}
|
|
30
|
+
let app;
|
|
31
|
+
try {
|
|
32
|
+
app = await loadApp(configPath);
|
|
33
|
+
}
|
|
34
|
+
catch (e) {
|
|
35
|
+
process.stderr.write(`dirsql interpret: ${errMessage(e)}\n`);
|
|
36
|
+
return 1;
|
|
37
|
+
}
|
|
38
|
+
// The SDK constructor kicks off a background scan that calls each
|
|
39
|
+
// table's `extract` for every matched file. If a user `extract`
|
|
40
|
+
// throws, the scan rejects -- and since interpret never awaits the
|
|
41
|
+
// scan (it dispatches to `extract` itself per request), the rejection
|
|
42
|
+
// would surface as an unhandled promise rejection and crash Node.
|
|
43
|
+
// Swallow it here; per-request errors are still reported to the
|
|
44
|
+
// caller in the extract-response.
|
|
45
|
+
app.ready.catch(() => { });
|
|
46
|
+
const tables = buildTables(app);
|
|
47
|
+
writeMessage({ type: "config", state: app.toJSON() });
|
|
48
|
+
for await (const line of createInterface({ input: process.stdin })) {
|
|
49
|
+
if (!line.trim()) {
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
let req;
|
|
53
|
+
try {
|
|
54
|
+
req = JSON.parse(line);
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
if (!req || typeof req !== "object" || req.type !== "extract") {
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
writeMessage(await dispatchExtract(req, tables));
|
|
63
|
+
}
|
|
64
|
+
return 0;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=interpret.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interpret.js","sourceRoot":"","sources":["../../../src/cli/interpret/interpret.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAC1D,EAAE;AACF,2DAA2D;AAC3D,kEAAkE;AAClE,QAAQ;AACR,EAAE;AACF,mDAAmD;AACnD,kDAAkD;AAClD,EAAE;AACF,wCAAwC;AACxC,2EAA2E;AAC3E,EAAE;AACF,yCAAyC;AACzC,kEAAkE;AAClE,qEAAqE;AACrE,EAAE;AACF,wEAAwE;AACxE,gDAAgD;AAEhD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,UAAkB;IAChD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qDAAqD,CAAC,CAAC;QAC5E,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC;IAClC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC7D,OAAO,CAAC,CAAC;IACX,CAAC;IAED,kEAAkE;IAClE,gEAAgE;IAChE,mEAAmE;IACnE,sEAAsE;IACtE,kEAAkE;IAClE,gEAAgE;IAChE,kCAAkC;IAClC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAE1B,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IAEhC,YAAY,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAEtD,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC;QACnE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YACjB,SAAS;QACX,CAAC;QACD,IAAI,GAAmE,CAAC;QACxE,IAAI,CAAC;YACH,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC9D,SAAS;QACX,CAAC;QACD,YAAY,CAAC,MAAM,eAAe,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC;IACnD,CAAC;IAED,OAAO,CAAC,CAAC;AACX,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interpret.test.d.ts","sourceRoot":"","sources":["../../../src/cli/interpret/interpret.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { Readable } from "node:stream";
|
|
2
|
+
import { afterEach, beforeEach, describe, expect, it, vi, } from "vitest";
|
|
3
|
+
import * as buildTablesMod from "./buildTables.js";
|
|
4
|
+
import * as dispatchMod from "./dispatchExtract.js";
|
|
5
|
+
import { interpret } from "./interpret.js";
|
|
6
|
+
import * as loadAppMod from "./loadApp.js";
|
|
7
|
+
import * as writeMod from "./writeMessage.js";
|
|
8
|
+
function fakeApp(overrides = {}) {
|
|
9
|
+
const app = {
|
|
10
|
+
ready: Promise.resolve(),
|
|
11
|
+
toJSON: () => ({ root: "/x" }),
|
|
12
|
+
_options: { tables: [] },
|
|
13
|
+
...overrides,
|
|
14
|
+
};
|
|
15
|
+
return app;
|
|
16
|
+
}
|
|
17
|
+
function asLines(lines) {
|
|
18
|
+
return Readable.from(lines.map((l) => `${l}\n`));
|
|
19
|
+
}
|
|
20
|
+
describe("interpret", () => {
|
|
21
|
+
let stderrWrite;
|
|
22
|
+
beforeEach(() => {
|
|
23
|
+
stderrWrite = vi.fn();
|
|
24
|
+
vi.stubGlobal("process", {
|
|
25
|
+
...process,
|
|
26
|
+
stdin: asLines([]),
|
|
27
|
+
stderr: { write: stderrWrite },
|
|
28
|
+
});
|
|
29
|
+
vi.spyOn(writeMod, "writeMessage").mockImplementation(() => { });
|
|
30
|
+
vi.spyOn(buildTablesMod, "buildTables").mockReturnValue(new Map());
|
|
31
|
+
vi.spyOn(dispatchMod, "dispatchExtract").mockResolvedValue({
|
|
32
|
+
type: "result",
|
|
33
|
+
id: 1,
|
|
34
|
+
ok: true,
|
|
35
|
+
rows: [],
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
afterEach(() => {
|
|
39
|
+
vi.unstubAllGlobals();
|
|
40
|
+
vi.restoreAllMocks();
|
|
41
|
+
});
|
|
42
|
+
describe("startup", () => {
|
|
43
|
+
it("returns 1 and writes to stderr when configPath is empty", async () => {
|
|
44
|
+
expect(await interpret("")).toBe(1);
|
|
45
|
+
expect(stderrWrite).toHaveBeenCalledExactlyOnceWith("dirsql interpret: expected one config path, got 0\n");
|
|
46
|
+
});
|
|
47
|
+
it("returns 1 and writes a dirsql-prefixed line when loadApp throws", async () => {
|
|
48
|
+
vi.spyOn(loadAppMod, "loadApp").mockRejectedValue(new Error("no app"));
|
|
49
|
+
expect(await interpret("bad.mjs")).toBe(1);
|
|
50
|
+
expect(stderrWrite).toHaveBeenCalledExactlyOnceWith("dirsql interpret: no app\n");
|
|
51
|
+
});
|
|
52
|
+
it("coerces non-Error throws via String() in the stderr message", async () => {
|
|
53
|
+
vi.spyOn(loadAppMod, "loadApp").mockRejectedValue("plain string");
|
|
54
|
+
expect(await interpret("bad.mjs")).toBe(1);
|
|
55
|
+
expect(stderrWrite).toHaveBeenCalledExactlyOnceWith("dirsql interpret: plain string\n");
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
describe("handshake", () => {
|
|
59
|
+
it("writes one config message with app.toJSON() as state", async () => {
|
|
60
|
+
const app = fakeApp({
|
|
61
|
+
toJSON: () => ({ root: "/here", tables: [], ignore: [], persist: false }),
|
|
62
|
+
});
|
|
63
|
+
vi.spyOn(loadAppMod, "loadApp").mockResolvedValue(app);
|
|
64
|
+
await interpret("good.mjs");
|
|
65
|
+
expect(writeMod.writeMessage).toHaveBeenCalledWith({
|
|
66
|
+
type: "config",
|
|
67
|
+
state: { root: "/here", tables: [], ignore: [], persist: false },
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
it("attaches a no-op catch to app.ready to swallow background-scan failures", async () => {
|
|
71
|
+
// Verify the structural property -- interpret CALLS `.catch` on
|
|
72
|
+
// `app.ready` -- without exercising the runtime side effect
|
|
73
|
+
// (which fights vitest's own unhandled-rejection handling).
|
|
74
|
+
const catchSpy = vi.fn(() => Promise.resolve());
|
|
75
|
+
const app = fakeApp({
|
|
76
|
+
ready: { catch: catchSpy },
|
|
77
|
+
});
|
|
78
|
+
vi.spyOn(loadAppMod, "loadApp").mockResolvedValue(app);
|
|
79
|
+
await interpret("good.mjs");
|
|
80
|
+
expect(catchSpy).toHaveBeenCalledOnce();
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
describe("extract loop", () => {
|
|
84
|
+
it("dispatches one extract request and writes the response", async () => {
|
|
85
|
+
vi.spyOn(loadAppMod, "loadApp").mockResolvedValue(fakeApp());
|
|
86
|
+
const req = { type: "extract", id: 1, table: "t", path: "/a" };
|
|
87
|
+
vi.stubGlobal("process", {
|
|
88
|
+
...process,
|
|
89
|
+
stdin: asLines([JSON.stringify(req)]),
|
|
90
|
+
stderr: { write: stderrWrite },
|
|
91
|
+
});
|
|
92
|
+
const expected = {
|
|
93
|
+
type: "result",
|
|
94
|
+
id: 1,
|
|
95
|
+
ok: true,
|
|
96
|
+
rows: [{ row: "/a" }],
|
|
97
|
+
};
|
|
98
|
+
vi.mocked(dispatchMod.dispatchExtract).mockResolvedValue(expected);
|
|
99
|
+
expect(await interpret("good.mjs")).toBe(0);
|
|
100
|
+
expect(dispatchMod.dispatchExtract).toHaveBeenCalledWith(req, new Map());
|
|
101
|
+
// handshake first, then response
|
|
102
|
+
expect(writeMod.writeMessage).toHaveBeenCalledTimes(2);
|
|
103
|
+
expect(writeMod.writeMessage).toHaveBeenLastCalledWith(expected);
|
|
104
|
+
});
|
|
105
|
+
it("skips blank lines silently", async () => {
|
|
106
|
+
vi.spyOn(loadAppMod, "loadApp").mockResolvedValue(fakeApp());
|
|
107
|
+
vi.stubGlobal("process", {
|
|
108
|
+
...process,
|
|
109
|
+
stdin: asLines(["", " "]),
|
|
110
|
+
stderr: { write: stderrWrite },
|
|
111
|
+
});
|
|
112
|
+
expect(await interpret("good.mjs")).toBe(0);
|
|
113
|
+
expect(dispatchMod.dispatchExtract).not.toHaveBeenCalled();
|
|
114
|
+
// handshake only
|
|
115
|
+
expect(writeMod.writeMessage).toHaveBeenCalledOnce();
|
|
116
|
+
});
|
|
117
|
+
it("skips malformed JSON silently", async () => {
|
|
118
|
+
vi.spyOn(loadAppMod, "loadApp").mockResolvedValue(fakeApp());
|
|
119
|
+
vi.stubGlobal("process", {
|
|
120
|
+
...process,
|
|
121
|
+
stdin: asLines(["not json", "{also bad"]),
|
|
122
|
+
stderr: { write: stderrWrite },
|
|
123
|
+
});
|
|
124
|
+
expect(await interpret("good.mjs")).toBe(0);
|
|
125
|
+
expect(dispatchMod.dispatchExtract).not.toHaveBeenCalled();
|
|
126
|
+
});
|
|
127
|
+
it("skips non-extract messages silently", async () => {
|
|
128
|
+
vi.spyOn(loadAppMod, "loadApp").mockResolvedValue(fakeApp());
|
|
129
|
+
vi.stubGlobal("process", {
|
|
130
|
+
...process,
|
|
131
|
+
stdin: asLines([JSON.stringify({ type: "ping" })]),
|
|
132
|
+
stderr: { write: stderrWrite },
|
|
133
|
+
});
|
|
134
|
+
expect(await interpret("good.mjs")).toBe(0);
|
|
135
|
+
expect(dispatchMod.dispatchExtract).not.toHaveBeenCalled();
|
|
136
|
+
});
|
|
137
|
+
it("skips a null / non-object JSON payload silently", async () => {
|
|
138
|
+
vi.spyOn(loadAppMod, "loadApp").mockResolvedValue(fakeApp());
|
|
139
|
+
vi.stubGlobal("process", {
|
|
140
|
+
...process,
|
|
141
|
+
stdin: asLines(["null", "42", "[]"]),
|
|
142
|
+
stderr: { write: stderrWrite },
|
|
143
|
+
});
|
|
144
|
+
expect(await interpret("good.mjs")).toBe(0);
|
|
145
|
+
expect(dispatchMod.dispatchExtract).not.toHaveBeenCalled();
|
|
146
|
+
});
|
|
147
|
+
it("returns 0 when stdin closes", async () => {
|
|
148
|
+
vi.spyOn(loadAppMod, "loadApp").mockResolvedValue(fakeApp());
|
|
149
|
+
expect(await interpret("good.mjs")).toBe(0);
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
//# sourceMappingURL=interpret.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interpret.test.js","sourceRoot":"","sources":["../../../src/cli/interpret/interpret.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loadApp.d.ts","sourceRoot":"","sources":["../../../src/cli/interpret/loadApp.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAE7C,wBAAsB,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAQjE"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
// Dynamically import a user's `dirsql` config file (`.js` / `.mjs` /
|
|
2
|
+
// `.cjs`) and return its default export. The default export should be
|
|
3
|
+
// a constructed `DirSQL` instance; the caller relies on the runtime
|
|
4
|
+
// shape (no `instanceof` check), so any object that quacks like one
|
|
5
|
+
// will pass through.
|
|
6
|
+
//
|
|
7
|
+
// Throws if the dynamic `import()` fails or if the loaded module has
|
|
8
|
+
// no `default` export. The launcher in `cli/main.ts` catches both as
|
|
9
|
+
// startup failures.
|
|
10
|
+
import { pathToFileURL } from "node:url";
|
|
11
|
+
export async function loadApp(configPath) {
|
|
12
|
+
const mod = await import(pathToFileURL(configPath).href);
|
|
13
|
+
if (!mod.default) {
|
|
14
|
+
throw new Error(`${configPath}: module must default-export a DirSQL instance`);
|
|
15
|
+
}
|
|
16
|
+
return mod.default;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=loadApp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loadApp.js","sourceRoot":"","sources":["../../../src/cli/interpret/loadApp.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,sEAAsE;AACtE,oEAAoE;AACpE,oEAAoE;AACpE,qBAAqB;AACrB,EAAE;AACF,qEAAqE;AACrE,qEAAqE;AACrE,oBAAoB;AAEpB,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGzC,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,UAAkB;IAC9C,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC;IACzD,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CACb,GAAG,UAAU,gDAAgD,CAC9D,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,CAAC,OAAiB,CAAC;AAC/B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loadApp.test.d.ts","sourceRoot":"","sources":["../../../src/cli/interpret/loadApp.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { mkdtempSync, rmSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { tmpdir } from "node:os";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { afterEach, beforeEach, describe, expect, it } from "vitest";
|
|
5
|
+
import { loadApp } from "./loadApp.js";
|
|
6
|
+
describe("loadApp", () => {
|
|
7
|
+
let dir;
|
|
8
|
+
beforeEach(() => {
|
|
9
|
+
dir = mkdtempSync(join(tmpdir(), "dirsql-loadapp-"));
|
|
10
|
+
});
|
|
11
|
+
afterEach(() => {
|
|
12
|
+
rmSync(dir, { recursive: true, force: true });
|
|
13
|
+
});
|
|
14
|
+
it("returns the default export of an .mjs config", async () => {
|
|
15
|
+
const path = join(dir, "config.mjs");
|
|
16
|
+
writeFileSync(path, "export default { sentinel: 'value' };\n");
|
|
17
|
+
const app = (await loadApp(path));
|
|
18
|
+
expect(app.sentinel).toBe("value");
|
|
19
|
+
});
|
|
20
|
+
it("returns the module.exports of a .cjs config", async () => {
|
|
21
|
+
const path = join(dir, "config.cjs");
|
|
22
|
+
writeFileSync(path, "module.exports = { sentinel: 'cjs' };\n");
|
|
23
|
+
const app = (await loadApp(path));
|
|
24
|
+
expect(app.sentinel).toBe("cjs");
|
|
25
|
+
});
|
|
26
|
+
it("throws a path-aware error when the module has no default export", async () => {
|
|
27
|
+
const path = join(dir, "no_default.mjs");
|
|
28
|
+
writeFileSync(path, "export const x = 1;\n");
|
|
29
|
+
await expect(loadApp(path)).rejects.toThrow(/must default-export a DirSQL instance/);
|
|
30
|
+
await expect(loadApp(path)).rejects.toThrow(path);
|
|
31
|
+
});
|
|
32
|
+
it("propagates errors thrown during module evaluation", async () => {
|
|
33
|
+
const path = join(dir, "boom.mjs");
|
|
34
|
+
writeFileSync(path, "throw new Error('synthetic boom');\n");
|
|
35
|
+
await expect(loadApp(path)).rejects.toThrow(/synthetic boom/);
|
|
36
|
+
});
|
|
37
|
+
it("rejects when the file does not exist", async () => {
|
|
38
|
+
await expect(loadApp(join(dir, "nope.mjs"))).rejects.toThrow();
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
//# sourceMappingURL=loadApp.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loadApp.test.js","sourceRoot":"","sources":["../../../src/cli/interpret/loadApp.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACrE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;IACvB,IAAI,GAAW,CAAC;IAEhB,UAAU,CAAC,GAAG,EAAE;QACd,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,iBAAiB,CAAC,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC5D,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QACrC,aAAa,CAAC,IAAI,EAAE,yCAAyC,CAAC,CAAC;QAC/D,MAAM,GAAG,GAAG,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAoC,CAAC;QACrE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QACrC,aAAa,CAAC,IAAI,EAAE,yCAAyC,CAAC,CAAC;QAC/D,MAAM,GAAG,GAAG,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAoC,CAAC;QACrE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;QAC/E,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;QACzC,aAAa,CAAC,IAAI,EAAE,uBAAuB,CAAC,CAAC;QAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CACzC,uCAAuC,CACxC,CAAC;QACF,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;QACjE,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QACnC,aAAa,CAAC,IAAI,EAAE,sCAAsC,CAAC,CAAC;QAC5D,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACpD,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;IACjE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"writeMessage.d.ts","sourceRoot":"","sources":["../../../src/cli/interpret/writeMessage.ts"],"names":[],"mappings":"AAKA,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAE/C"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// Single-line NDJSON writer. Each protocol message is one JSON object
|
|
2
|
+
// followed by `\n`; `process.stdout.write` flushes to the underlying
|
|
3
|
+
// pipe synchronously on most platforms when the stream is a pipe (as
|
|
4
|
+
// it is when the orchestrator spawns this process).
|
|
5
|
+
export function writeMessage(msg) {
|
|
6
|
+
process.stdout.write(`${JSON.stringify(msg)}\n`);
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=writeMessage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"writeMessage.js","sourceRoot":"","sources":["../../../src/cli/interpret/writeMessage.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,qEAAqE;AACrE,qEAAqE;AACrE,oDAAoD;AAEpD,MAAM,UAAU,YAAY,CAAC,GAAY;IACvC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACnD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"writeMessage.test.d.ts","sourceRoot":"","sources":["../../../src/cli/interpret/writeMessage.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { writeMessage } from "./writeMessage.js";
|
|
3
|
+
describe("writeMessage", () => {
|
|
4
|
+
let write;
|
|
5
|
+
beforeEach(() => {
|
|
6
|
+
write = vi.fn();
|
|
7
|
+
vi.stubGlobal("process", { ...process, stdout: { write } });
|
|
8
|
+
});
|
|
9
|
+
afterEach(() => {
|
|
10
|
+
vi.unstubAllGlobals();
|
|
11
|
+
});
|
|
12
|
+
it("writes one JSON line per call", () => {
|
|
13
|
+
writeMessage({ type: "config", state: {} });
|
|
14
|
+
expect(write).toHaveBeenCalledExactlyOnceWith('{"type":"config","state":{}}\n');
|
|
15
|
+
});
|
|
16
|
+
it("appends a trailing newline", () => {
|
|
17
|
+
writeMessage({ x: 1 });
|
|
18
|
+
expect((write.mock.calls[0]?.[0]).endsWith("\n")).toBe(true);
|
|
19
|
+
});
|
|
20
|
+
it("serializes nested arrays and objects deterministically", () => {
|
|
21
|
+
writeMessage({ rows: [{ a: 1 }, { a: 2 }] });
|
|
22
|
+
expect(write).toHaveBeenCalledExactlyOnceWith('{"rows":[{"a":1},{"a":2}]}\n');
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
//# sourceMappingURL=writeMessage.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"writeMessage.test.js","sourceRoot":"","sources":["../../../src/cli/interpret/writeMessage.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,IAAI,KAA+B,CAAC;IAEpC,UAAU,CAAC,GAAG,EAAE;QACd,KAAK,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAChB,EAAE,CAAC,UAAU,CAAC,SAAS,EAAE,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,gBAAgB,EAAE,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,YAAY,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QAC5C,MAAM,CAAC,KAAK,CAAC,CAAC,+BAA+B,CAC3C,gCAAgC,CACjC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,YAAY,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACvB,MAAM,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAY,CAAA,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,YAAY,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC7C,MAAM,CAAC,KAAK,CAAC,CAAC,+BAA+B,CAC3C,8BAA8B,CAC/B,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/dist/cli/main.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare function main(argv?: string[]):
|
|
1
|
+
export declare function main(argv?: string[]): Promise<void>;
|
|
2
2
|
//# sourceMappingURL=main.d.ts.map
|
package/dist/cli/main.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"AAWA,wBAAsB,IAAI,CACxB,IAAI,GAAE,MAAM,EAA0B,GACrC,OAAO,CAAC,IAAI,CAAC,CAef"}
|
package/dist/cli/main.js
CHANGED
|
@@ -1,9 +1,17 @@
|
|
|
1
1
|
// Launcher entry: spawn the resolved `dirsql` binary and forward argv,
|
|
2
|
-
// exit code, and signals.
|
|
2
|
+
// exit code, and signals. When `argv[0] === "interpret"` the
|
|
3
|
+
// in-process TS helper handles the subcommand directly so a Rust
|
|
4
|
+
// orchestrator can spawn this script for native-language configs
|
|
5
|
+
// (#196) without depending on the bundled Rust binary.
|
|
3
6
|
import { spawnSync } from "node:child_process";
|
|
4
7
|
import { die } from "./die.js";
|
|
8
|
+
import { interpret } from "./interpret/index.js";
|
|
5
9
|
import { resolveBinary } from "./resolveBinary.js";
|
|
6
|
-
export function main(argv = process.argv.slice(2)) {
|
|
10
|
+
export async function main(argv = process.argv.slice(2)) {
|
|
11
|
+
if (argv[0] === "interpret") {
|
|
12
|
+
const code = await interpret(argv[1] ?? "");
|
|
13
|
+
process.exit(code);
|
|
14
|
+
}
|
|
7
15
|
const binary = resolveBinary();
|
|
8
16
|
const result = spawnSync(binary, argv, { stdio: "inherit" });
|
|
9
17
|
if (result.error) {
|
package/dist/cli/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,6DAA6D;AAC7D,iEAAiE;AACjE,iEAAiE;AACjE,uDAAuD;AAEvD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,MAAM,CAAC,KAAK,UAAU,IAAI,CACxB,OAAiB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAEtC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,WAAW,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC5C,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC;IAED,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;IAC/B,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IAC7D,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAC/B,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;AACnC,CAAC"}
|
package/dist/cli/main.test.js
CHANGED
|
@@ -2,10 +2,12 @@
|
|
|
2
2
|
import { spawnSync } from "node:child_process";
|
|
3
3
|
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
4
4
|
import { die } from "./die.js";
|
|
5
|
+
import { interpret } from "./interpret/index.js";
|
|
5
6
|
import { main } from "./main.js";
|
|
6
7
|
import { resolveBinary } from "./resolveBinary.js";
|
|
7
8
|
vi.mock("./resolveBinary.js");
|
|
8
9
|
vi.mock("./die.js");
|
|
10
|
+
vi.mock("./interpret/index.js");
|
|
9
11
|
vi.mock("node:child_process");
|
|
10
12
|
const TEST_PID = 42;
|
|
11
13
|
function fakeResult(overrides) {
|
|
@@ -42,30 +44,30 @@ describe("main", () => {
|
|
|
42
44
|
vi.unstubAllGlobals();
|
|
43
45
|
vi.resetAllMocks();
|
|
44
46
|
});
|
|
45
|
-
it("spawns the resolved binary with the argv and exits with the spawn status", () => {
|
|
47
|
+
it("spawns the resolved binary with the argv and exits with the spawn status", async () => {
|
|
46
48
|
vi.mocked(spawnSync).mockReturnValue(fakeResult({ status: 0 }));
|
|
47
|
-
expect(
|
|
49
|
+
await expect(main(["--version"])).rejects.toThrow("EXIT_0");
|
|
48
50
|
expect(spawnSync).toHaveBeenCalledWith("/bin/dirsql", ["--version"], {
|
|
49
51
|
stdio: "inherit",
|
|
50
52
|
});
|
|
51
53
|
expect(exit).toHaveBeenCalledWith(0);
|
|
52
54
|
});
|
|
53
|
-
it("falls back to exit code 1 when spawn returns a null status", () => {
|
|
55
|
+
it("falls back to exit code 1 when spawn returns a null status", async () => {
|
|
54
56
|
vi.mocked(spawnSync).mockReturnValue(fakeResult({ status: null }));
|
|
55
|
-
expect(
|
|
57
|
+
await expect(main([])).rejects.toThrow("EXIT_1");
|
|
56
58
|
expect(exit).toHaveBeenCalledWith(1);
|
|
57
59
|
});
|
|
58
|
-
it("calls die with the spawn error message when spawn reports an error", () => {
|
|
60
|
+
it("calls die with the spawn error message when spawn reports an error", async () => {
|
|
59
61
|
vi.mocked(spawnSync).mockReturnValue(fakeResult({ status: null, error: new Error("spawn ENOENT") }));
|
|
60
|
-
expect(
|
|
62
|
+
await expect(main([])).rejects.toThrow("DIE: spawn ENOENT");
|
|
61
63
|
expect(die).toHaveBeenCalledWith("spawn ENOENT", 1);
|
|
62
64
|
});
|
|
63
|
-
it("re-raises the spawned process's signal against the current pid before exiting", () => {
|
|
65
|
+
it("re-raises the spawned process's signal against the current pid before exiting", async () => {
|
|
64
66
|
vi.mocked(spawnSync).mockReturnValue(fakeResult({ status: 0, signal: "SIGINT" }));
|
|
65
|
-
expect(
|
|
67
|
+
await expect(main([])).rejects.toThrow("EXIT_0");
|
|
66
68
|
expect(kill).toHaveBeenCalledWith(TEST_PID, "SIGINT");
|
|
67
69
|
});
|
|
68
|
-
it("defaults argv to process.argv.slice(2) when called with no args", () => {
|
|
70
|
+
it("defaults argv to process.argv.slice(2) when called with no args", async () => {
|
|
69
71
|
vi.mocked(spawnSync).mockReturnValue(fakeResult({ status: 0 }));
|
|
70
72
|
vi.stubGlobal("process", {
|
|
71
73
|
...process,
|
|
@@ -74,10 +76,34 @@ describe("main", () => {
|
|
|
74
76
|
kill,
|
|
75
77
|
pid: TEST_PID,
|
|
76
78
|
});
|
|
77
|
-
expect(
|
|
79
|
+
await expect(main()).rejects.toThrow("EXIT_0");
|
|
78
80
|
expect(spawnSync).toHaveBeenCalledWith("/bin/dirsql", ["--help"], {
|
|
79
81
|
stdio: "inherit",
|
|
80
82
|
});
|
|
81
83
|
});
|
|
84
|
+
describe("when argv[0] is 'interpret'", () => {
|
|
85
|
+
it("dispatches to the interpret helper and exits with its return code", async () => {
|
|
86
|
+
vi.mocked(interpret).mockResolvedValue(0);
|
|
87
|
+
await expect(main(["interpret", "config.mjs"])).rejects.toThrow("EXIT_0");
|
|
88
|
+
expect(interpret).toHaveBeenCalledWith("config.mjs");
|
|
89
|
+
expect(spawnSync).not.toHaveBeenCalled();
|
|
90
|
+
expect(resolveBinary).not.toHaveBeenCalled();
|
|
91
|
+
});
|
|
92
|
+
it("propagates a non-zero interpret exit code", async () => {
|
|
93
|
+
vi.mocked(interpret).mockResolvedValue(2);
|
|
94
|
+
await expect(main(["interpret", "bad.mjs"])).rejects.toThrow("EXIT_2");
|
|
95
|
+
});
|
|
96
|
+
it("passes the empty string when no config path follows", async () => {
|
|
97
|
+
vi.mocked(interpret).mockResolvedValue(1);
|
|
98
|
+
await expect(main(["interpret"])).rejects.toThrow("EXIT_1");
|
|
99
|
+
expect(interpret).toHaveBeenCalledWith("");
|
|
100
|
+
});
|
|
101
|
+
it("does not intercept when 'interpret' is not the first arg", async () => {
|
|
102
|
+
vi.mocked(spawnSync).mockReturnValue(fakeResult({ status: 0 }));
|
|
103
|
+
await expect(main(["--verbose", "interpret", "config.mjs"])).rejects.toThrow("EXIT_0");
|
|
104
|
+
expect(interpret).not.toHaveBeenCalled();
|
|
105
|
+
expect(spawnSync).toHaveBeenCalled();
|
|
106
|
+
});
|
|
107
|
+
});
|
|
82
108
|
});
|
|
83
109
|
//# sourceMappingURL=main.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.test.js","sourceRoot":"","sources":["../../src/cli/main.test.ts"],"names":[],"mappings":"AAAA,yBAAyB;AAEzB,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,EAAE,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;AAC9B,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AACpB,EAAE,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;AAE9B,MAAM,QAAQ,GAAG,EAAE,CAAC;AAIpB,SAAS,UAAU,CAAC,SAAkC;IACpD,OAAO;QACL,GAAG,EAAE,QAAQ;QACb,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QACvB,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QACvB,MAAM,EAAE,EAAE;QACV,MAAM,EAAE,CAAC;QACT,MAAM,EAAE,IAAI;QACZ,GAAG,SAAS;KACa,CAAC;AAC9B,CAAC;AAED,QAAQ,CAAC,MAAM,EAAE,GAAG,EAAE;IACpB,IAAI,IAA8B,CAAC;IACnC,IAAI,IAA8B,CAAC;IAEnC,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC;QACxD,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,GAAW,EAAE,EAAE;YACjD,MAAM,IAAI,KAAK,CAAC,QAAQ,GAAG,EAAE,CAAC,CAAC;QACjC,CAAC,CAAe,CAAC,CAAC;QAClB,IAAI,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,CAAC,IAAY,EAAE,EAAE;YACjD,MAAM,IAAI,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QACH,IAAI,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACf,EAAE,CAAC,UAAU,CAAC,SAAS,EAAE;YACvB,GAAG,OAAO;YACV,IAAI;YACJ,IAAI;YACJ,GAAG,EAAE,QAAQ;SACd,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,gBAAgB,EAAE,CAAC;QACtB,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0EAA0E,EAAE,
|
|
1
|
+
{"version":3,"file":"main.test.js","sourceRoot":"","sources":["../../src/cli/main.test.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -14,6 +14,25 @@ export interface TableDef {
|
|
|
14
14
|
/** If true, reject rows with columns not declared in `ddl`. */
|
|
15
15
|
strict?: boolean;
|
|
16
16
|
}
|
|
17
|
+
/**
|
|
18
|
+
* Thin class wrapper around {@link TableDef} for parity with the Python
|
|
19
|
+
* `Table(ddl=..., glob=..., extract=...)` and Rust `Table::new(...)`
|
|
20
|
+
* constructors. `new Table({...})` is structurally identical to a plain
|
|
21
|
+
* object literal satisfying `TableDef` — anything accepting `TableDef[]`
|
|
22
|
+
* (e.g. {@link DirSQL}'s `tables` option) takes either form.
|
|
23
|
+
*
|
|
24
|
+
* `strict` is only copied when present so the instance's enumerable keys
|
|
25
|
+
* match the input literal exactly; field declarations use `declare` to
|
|
26
|
+
* suppress the default class-field initializer that would otherwise pin
|
|
27
|
+
* `strict` to `undefined` under `useDefineForClassFields`.
|
|
28
|
+
*/
|
|
29
|
+
export declare class Table implements TableDef {
|
|
30
|
+
readonly ddl: string;
|
|
31
|
+
readonly glob: string;
|
|
32
|
+
readonly extract: (filePath: string) => Record<string, unknown>[];
|
|
33
|
+
readonly strict?: boolean;
|
|
34
|
+
constructor(def: TableDef);
|
|
35
|
+
}
|
|
17
36
|
/**
|
|
18
37
|
* Options accepted by the {@link DirSQL} constructor.
|
|
19
38
|
*
|
|
@@ -101,7 +120,16 @@ interface NativeDirSQLConstructor {
|
|
|
101
120
|
}
|
|
102
121
|
interface CoreModule {
|
|
103
122
|
DirSQL: NativeDirSQLConstructor;
|
|
123
|
+
parseTableName(ddl: string): string | null;
|
|
104
124
|
}
|
|
125
|
+
/**
|
|
126
|
+
* Parse the table name out of a `CREATE TABLE <name> (...)` DDL.
|
|
127
|
+
*
|
|
128
|
+
* Returns `null` for a DDL the parser doesn't recognize. Backed by the
|
|
129
|
+
* core Rust implementation (`dirsql::db::parse_table_name`) so the JS
|
|
130
|
+
* SDK and the orchestrator agree on table-name resolution.
|
|
131
|
+
*/
|
|
132
|
+
export declare function parseTableName(ddl: string): string | null;
|
|
105
133
|
/**
|
|
106
134
|
* **Test-only.** Replace the core module used by the SDK with a fake.
|
|
107
135
|
*
|
|
@@ -150,7 +178,7 @@ export declare class DirSQL {
|
|
|
150
178
|
*/
|
|
151
179
|
readonly ready: Promise<void>;
|
|
152
180
|
private _inner;
|
|
153
|
-
|
|
181
|
+
readonly _options: DirSQLOptions;
|
|
154
182
|
/** Construct from a `.dirsql.toml` config-file path. */
|
|
155
183
|
constructor(configPath: string);
|
|
156
184
|
/** Construct from structured options. */
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAeA,iEAAiE;AACjE,MAAM,WAAW,QAAQ;IACvB,6EAA6E;IAC7E,GAAG,EAAE,MAAM,CAAC;IACZ,+EAA+E;IAC/E,IAAI,EAAE,MAAM,CAAC;IACb;;;;;OAKG;IACH,OAAO,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IACzD,+DAA+D;IAC/D,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,aAAa;IAC5B,8BAA8B;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,8EAA8E;IAC9E,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC;IACpB,oDAAoD;IACpD,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,qDAAqD;AACrD,MAAM,WAAW,QAAQ;IACvB;;;;OAIG;IACH,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;IACjD,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACxC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;CACjB;AAED;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAGD,UAAU,YAAY;IACpB,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;IACvD,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;CACpD;AAED,UAAU,uBAAuB;IAC/B,SAAS,CACP,IAAI,EAAE,MAAM,GAAG,IAAI,EACnB,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,EACzB,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,EACvB,MAAM,EAAE,MAAM,GAAG,IAAI,EACrB,OAAO,EAAE,OAAO,GAAG,IAAI,EACvB,WAAW,EAAE,MAAM,GAAG,IAAI,GACzB,OAAO,CAAC,YAAY,CAAC,CAAC;CAC1B;AAID,UAAU,UAAU;IAClB,MAAM,EAAE,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -11,6 +11,38 @@
|
|
|
11
11
|
// toolchain is required at install time on any supported platform.
|
|
12
12
|
import { loadNativeCore as defaultLoadNativeCore } from "./loadNativeCore.js";
|
|
13
13
|
import { resolveConfig } from "./resolveConfig.js";
|
|
14
|
+
/**
|
|
15
|
+
* Thin class wrapper around {@link TableDef} for parity with the Python
|
|
16
|
+
* `Table(ddl=..., glob=..., extract=...)` and Rust `Table::new(...)`
|
|
17
|
+
* constructors. `new Table({...})` is structurally identical to a plain
|
|
18
|
+
* object literal satisfying `TableDef` — anything accepting `TableDef[]`
|
|
19
|
+
* (e.g. {@link DirSQL}'s `tables` option) takes either form.
|
|
20
|
+
*
|
|
21
|
+
* `strict` is only copied when present so the instance's enumerable keys
|
|
22
|
+
* match the input literal exactly; field declarations use `declare` to
|
|
23
|
+
* suppress the default class-field initializer that would otherwise pin
|
|
24
|
+
* `strict` to `undefined` under `useDefineForClassFields`.
|
|
25
|
+
*/
|
|
26
|
+
export class Table {
|
|
27
|
+
constructor(def) {
|
|
28
|
+
this.ddl = def.ddl;
|
|
29
|
+
this.glob = def.glob;
|
|
30
|
+
this.extract = def.extract;
|
|
31
|
+
if (def.strict !== undefined) {
|
|
32
|
+
this.strict = def.strict;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Parse the table name out of a `CREATE TABLE <name> (...)` DDL.
|
|
38
|
+
*
|
|
39
|
+
* Returns `null` for a DDL the parser doesn't recognize. Backed by the
|
|
40
|
+
* core Rust implementation (`dirsql::db::parse_table_name`) so the JS
|
|
41
|
+
* SDK and the orchestrator agree on table-name resolution.
|
|
42
|
+
*/
|
|
43
|
+
export function parseTableName(ddl) {
|
|
44
|
+
return getCore().parseTableName(ddl);
|
|
45
|
+
}
|
|
14
46
|
// Lazy-loaded reference to the core module. Populated on first access by
|
|
15
47
|
// `defaultLoadNativeCore()`, or by `__setCoreForTesting()` for tests.
|
|
16
48
|
let core = null;
|
|
@@ -72,7 +104,9 @@ export class DirSQL {
|
|
|
72
104
|
// Initialized by `ready`. Do NOT touch before awaiting `ready`.
|
|
73
105
|
_inner;
|
|
74
106
|
// Constructor options preserved verbatim so `toJSON()` can resolve the
|
|
75
|
-
// serialized state synchronously without waiting for `ready
|
|
107
|
+
// serialized state synchronously without waiting for `ready`, and so
|
|
108
|
+
// `dirsql interpret` (#196) can reach the user-supplied `extract`
|
|
109
|
+
// callbacks (which `toJSON()` deliberately drops). Public-by-design.
|
|
76
110
|
_options;
|
|
77
111
|
constructor(arg) {
|
|
78
112
|
const options = typeof arg === "string" ? { config: arg } : arg;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,yBAAyB;AACzB,EAAE;AACF,wEAAwE;AACxE,kEAAkE;AAClE,qEAAqE;AACrE,qCAAqC;AACrC,EAAE;AACF,qEAAqE;AACrE,uEAAuE;AACvE,uEAAuE;AACvE,mEAAmE;AAEnE,OAAO,EAAE,cAAc,IAAI,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC9E,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dirsql",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.20",
|
|
4
4
|
"description": "Ephemeral SQL index over a local directory",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": "https://github.com/thekevinscott/dirsql",
|
|
@@ -193,15 +193,15 @@
|
|
|
193
193
|
"smol-toml": "^1.6.1"
|
|
194
194
|
},
|
|
195
195
|
"optionalDependencies": {
|
|
196
|
-
"@dirsql/lib-linux-x64-gnu": "0.3.
|
|
197
|
-
"@dirsql/lib-linux-arm64-gnu": "0.3.
|
|
198
|
-
"@dirsql/lib-darwin-x64": "0.3.
|
|
199
|
-
"@dirsql/lib-darwin-arm64": "0.3.
|
|
200
|
-
"@dirsql/lib-win32-x64-msvc": "0.3.
|
|
201
|
-
"@dirsql/cli-linux-x64-gnu": "0.3.
|
|
202
|
-
"@dirsql/cli-linux-arm64-gnu": "0.3.
|
|
203
|
-
"@dirsql/cli-darwin-x64": "0.3.
|
|
204
|
-
"@dirsql/cli-darwin-arm64": "0.3.
|
|
205
|
-
"@dirsql/cli-win32-x64-msvc": "0.3.
|
|
196
|
+
"@dirsql/lib-linux-x64-gnu": "0.3.20",
|
|
197
|
+
"@dirsql/lib-linux-arm64-gnu": "0.3.20",
|
|
198
|
+
"@dirsql/lib-darwin-x64": "0.3.20",
|
|
199
|
+
"@dirsql/lib-darwin-arm64": "0.3.20",
|
|
200
|
+
"@dirsql/lib-win32-x64-msvc": "0.3.20",
|
|
201
|
+
"@dirsql/cli-linux-x64-gnu": "0.3.20",
|
|
202
|
+
"@dirsql/cli-linux-arm64-gnu": "0.3.20",
|
|
203
|
+
"@dirsql/cli-darwin-x64": "0.3.20",
|
|
204
|
+
"@dirsql/cli-darwin-arm64": "0.3.20",
|
|
205
|
+
"@dirsql/cli-win32-x64-msvc": "0.3.20"
|
|
206
206
|
}
|
|
207
207
|
}
|