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.
Files changed (65) hide show
  1. package/dist/cli/dirsql.js +4 -1
  2. package/dist/cli/dirsql.js.map +1 -1
  3. package/dist/cli/interpret/buildTables.d.ts +3 -0
  4. package/dist/cli/interpret/buildTables.d.ts.map +1 -0
  5. package/dist/cli/interpret/buildTables.js +18 -0
  6. package/dist/cli/interpret/buildTables.js.map +1 -0
  7. package/dist/cli/interpret/buildTables.test.d.ts +2 -0
  8. package/dist/cli/interpret/buildTables.test.d.ts.map +1 -0
  9. package/dist/cli/interpret/buildTables.test.js +62 -0
  10. package/dist/cli/interpret/buildTables.test.js.map +1 -0
  11. package/dist/cli/interpret/dispatchExtract.d.ts +16 -0
  12. package/dist/cli/interpret/dispatchExtract.d.ts.map +1 -0
  13. package/dist/cli/interpret/dispatchExtract.js +25 -0
  14. package/dist/cli/interpret/dispatchExtract.js.map +1 -0
  15. package/dist/cli/interpret/dispatchExtract.test.d.ts +2 -0
  16. package/dist/cli/interpret/dispatchExtract.test.d.ts.map +1 -0
  17. package/dist/cli/interpret/dispatchExtract.test.js +75 -0
  18. package/dist/cli/interpret/dispatchExtract.test.js.map +1 -0
  19. package/dist/cli/interpret/errMessage.d.ts +2 -0
  20. package/dist/cli/interpret/errMessage.d.ts.map +1 -0
  21. package/dist/cli/interpret/errMessage.js +7 -0
  22. package/dist/cli/interpret/errMessage.js.map +1 -0
  23. package/dist/cli/interpret/errMessage.test.d.ts +2 -0
  24. package/dist/cli/interpret/errMessage.test.d.ts.map +1 -0
  25. package/dist/cli/interpret/errMessage.test.js +23 -0
  26. package/dist/cli/interpret/errMessage.test.js.map +1 -0
  27. package/dist/cli/interpret/index.d.ts +2 -0
  28. package/dist/cli/interpret/index.d.ts.map +1 -0
  29. package/dist/cli/interpret/index.js +7 -0
  30. package/dist/cli/interpret/index.js.map +1 -0
  31. package/dist/cli/interpret/interpret.d.ts +2 -0
  32. package/dist/cli/interpret/interpret.d.ts.map +1 -0
  33. package/dist/cli/interpret/interpret.js +66 -0
  34. package/dist/cli/interpret/interpret.js.map +1 -0
  35. package/dist/cli/interpret/interpret.test.d.ts +2 -0
  36. package/dist/cli/interpret/interpret.test.d.ts.map +1 -0
  37. package/dist/cli/interpret/interpret.test.js +153 -0
  38. package/dist/cli/interpret/interpret.test.js.map +1 -0
  39. package/dist/cli/interpret/loadApp.d.ts +3 -0
  40. package/dist/cli/interpret/loadApp.d.ts.map +1 -0
  41. package/dist/cli/interpret/loadApp.js +18 -0
  42. package/dist/cli/interpret/loadApp.js.map +1 -0
  43. package/dist/cli/interpret/loadApp.test.d.ts +2 -0
  44. package/dist/cli/interpret/loadApp.test.d.ts.map +1 -0
  45. package/dist/cli/interpret/loadApp.test.js +41 -0
  46. package/dist/cli/interpret/loadApp.test.js.map +1 -0
  47. package/dist/cli/interpret/writeMessage.d.ts +2 -0
  48. package/dist/cli/interpret/writeMessage.d.ts.map +1 -0
  49. package/dist/cli/interpret/writeMessage.js +8 -0
  50. package/dist/cli/interpret/writeMessage.js.map +1 -0
  51. package/dist/cli/interpret/writeMessage.test.d.ts +2 -0
  52. package/dist/cli/interpret/writeMessage.test.d.ts.map +1 -0
  53. package/dist/cli/interpret/writeMessage.test.js +25 -0
  54. package/dist/cli/interpret/writeMessage.test.js.map +1 -0
  55. package/dist/cli/main.d.ts +1 -1
  56. package/dist/cli/main.d.ts.map +1 -1
  57. package/dist/cli/main.js +10 -2
  58. package/dist/cli/main.js.map +1 -1
  59. package/dist/cli/main.test.js +36 -10
  60. package/dist/cli/main.test.js.map +1 -1
  61. package/dist/index.d.ts +29 -1
  62. package/dist/index.d.ts.map +1 -1
  63. package/dist/index.js +35 -1
  64. package/dist/index.js.map +1 -1
  65. package/package.json +11 -11
@@ -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
@@ -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,3 @@
1
+ import { type DirSQL, type TableDef } from "../../index.js";
2
+ export declare function buildTables(app: DirSQL): Map<string, TableDef>;
3
+ //# sourceMappingURL=buildTables.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=buildTables.test.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=dispatchExtract.test.d.ts.map
@@ -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,2 @@
1
+ export declare function errMessage(e: unknown): string;
2
+ //# sourceMappingURL=errMessage.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=errMessage.test.d.ts.map
@@ -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,2 @@
1
+ export { interpret } from "./interpret.js";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -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,2 @@
1
+ export declare function interpret(configPath: string): Promise<number>;
2
+ //# sourceMappingURL=interpret.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=interpret.test.d.ts.map
@@ -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,3 @@
1
+ import type { DirSQL } from "../../index.js";
2
+ export declare function loadApp(configPath: string): Promise<DirSQL>;
3
+ //# sourceMappingURL=loadApp.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=loadApp.test.d.ts.map
@@ -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,2 @@
1
+ export declare function writeMessage(msg: unknown): void;
2
+ //# sourceMappingURL=writeMessage.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=writeMessage.test.d.ts.map
@@ -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"}
@@ -1,2 +1,2 @@
1
- export declare function main(argv?: string[]): never;
1
+ export declare function main(argv?: string[]): Promise<void>;
2
2
  //# sourceMappingURL=main.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"AAOA,wBAAgB,IAAI,CAAC,IAAI,GAAE,MAAM,EAA0B,GAAG,KAAK,CAUlE"}
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) {
@@ -1 +1 @@
1
- {"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,0BAA0B;AAE1B,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,MAAM,UAAU,IAAI,CAAC,OAAiB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACzD,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"}
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"}
@@ -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(() => main(["--version"])).toThrow("EXIT_0");
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(() => main([])).toThrow("EXIT_1");
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(() => main([])).toThrow("DIE: spawn ENOENT");
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(() => main([])).toThrow("EXIT_0");
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(() => main()).toThrow("EXIT_0");
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":"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"}
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,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,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,sBAAsB,CAAC,CAAC;AAChC,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,KAAK,IAAI,EAAE;QACxF,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,eAAe,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAEhE,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC5D,MAAM,CAAC,SAAS,CAAC,CAAC,oBAAoB,CAAC,aAAa,EAAE,CAAC,WAAW,CAAC,EAAE;YACnE,KAAK,EAAE,SAAS;SACjB,CAAC,CAAC;QACH,MAAM,CAAC,IAAI,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;QAC1E,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,eAAe,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAEnE,MAAM,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACjD,MAAM,CAAC,IAAI,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oEAAoE,EAAE,KAAK,IAAI,EAAE;QAClF,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,eAAe,CAClC,UAAU,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC,CAC/D,CAAC;QAEF,MAAM,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;QAC5D,MAAM,CAAC,GAAG,CAAC,CAAC,oBAAoB,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+EAA+E,EAAE,KAAK,IAAI,EAAE;QAC7F,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,eAAe,CAClC,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAC5C,CAAC;QAEF,MAAM,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACjD,MAAM,CAAC,IAAI,CAAC,CAAC,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;QAC/E,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,eAAe,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAChE,EAAE,CAAC,UAAU,CAAC,SAAS,EAAE;YACvB,GAAG,OAAO;YACV,IAAI,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC;YAClC,IAAI;YACJ,IAAI;YACJ,GAAG,EAAE,QAAQ;SACd,CAAC,CAAC;QAEH,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC/C,MAAM,CAAC,SAAS,CAAC,CAAC,oBAAoB,CAAC,aAAa,EAAE,CAAC,QAAQ,CAAC,EAAE;YAChE,KAAK,EAAE,SAAS;SACjB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;QAC3C,EAAE,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;YACjF,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;YAE1C,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC1E,MAAM,CAAC,SAAS,CAAC,CAAC,oBAAoB,CAAC,YAAY,CAAC,CAAC;YACrD,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;YACzC,MAAM,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAC/C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;YACzD,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;YAE1C,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACzE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;YACnE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;YAE1C,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC5D,MAAM,CAAC,SAAS,CAAC,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;YACxE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,eAAe,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAEhE,MAAM,MAAM,CACV,IAAI,CAAC,CAAC,WAAW,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC,CAC/C,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC5B,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;YACzC,MAAM,CAAC,SAAS,CAAC,CAAC,gBAAgB,EAAE,CAAC;QACvC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
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
- private readonly _options;
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. */
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
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":"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"}
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.18",
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.18",
197
- "@dirsql/lib-linux-arm64-gnu": "0.3.18",
198
- "@dirsql/lib-darwin-x64": "0.3.18",
199
- "@dirsql/lib-darwin-arm64": "0.3.18",
200
- "@dirsql/lib-win32-x64-msvc": "0.3.18",
201
- "@dirsql/cli-linux-x64-gnu": "0.3.18",
202
- "@dirsql/cli-linux-arm64-gnu": "0.3.18",
203
- "@dirsql/cli-darwin-x64": "0.3.18",
204
- "@dirsql/cli-darwin-arm64": "0.3.18",
205
- "@dirsql/cli-win32-x64-msvc": "0.3.18"
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
  }