dirsql 0.3.35 → 0.3.37

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 (54) hide show
  1. package/docs/api/index.md +5 -2
  2. package/package.json +17 -31
  3. package/dist/cli/die.test.d.ts +0 -2
  4. package/dist/cli/die.test.d.ts.map +0 -1
  5. package/dist/cli/die.test.js +0 -29
  6. package/dist/cli/die.test.js.map +0 -1
  7. package/dist/cli/interpret/buildTables.test.d.ts +0 -2
  8. package/dist/cli/interpret/buildTables.test.d.ts.map +0 -1
  9. package/dist/cli/interpret/buildTables.test.js +0 -60
  10. package/dist/cli/interpret/buildTables.test.js.map +0 -1
  11. package/dist/cli/interpret/dispatchExtract.test.d.ts +0 -2
  12. package/dist/cli/interpret/dispatchExtract.test.d.ts.map +0 -1
  13. package/dist/cli/interpret/dispatchExtract.test.js +0 -75
  14. package/dist/cli/interpret/dispatchExtract.test.js.map +0 -1
  15. package/dist/cli/interpret/errMessage.test.d.ts +0 -2
  16. package/dist/cli/interpret/errMessage.test.d.ts.map +0 -1
  17. package/dist/cli/interpret/errMessage.test.js +0 -23
  18. package/dist/cli/interpret/errMessage.test.js.map +0 -1
  19. package/dist/cli/interpret/interpret.test.d.ts +0 -2
  20. package/dist/cli/interpret/interpret.test.d.ts.map +0 -1
  21. package/dist/cli/interpret/interpret.test.js +0 -152
  22. package/dist/cli/interpret/interpret.test.js.map +0 -1
  23. package/dist/cli/interpret/loadApp.test.d.ts +0 -2
  24. package/dist/cli/interpret/loadApp.test.d.ts.map +0 -1
  25. package/dist/cli/interpret/loadApp.test.js +0 -33
  26. package/dist/cli/interpret/loadApp.test.js.map +0 -1
  27. package/dist/cli/interpret/writeMessage.test.d.ts +0 -2
  28. package/dist/cli/interpret/writeMessage.test.d.ts.map +0 -1
  29. package/dist/cli/interpret/writeMessage.test.js +0 -25
  30. package/dist/cli/interpret/writeMessage.test.js.map +0 -1
  31. package/dist/cli/main.test.d.ts +0 -2
  32. package/dist/cli/main.test.d.ts.map +0 -1
  33. package/dist/cli/main.test.js +0 -109
  34. package/dist/cli/main.test.js.map +0 -1
  35. package/dist/cli/platformKey.test.d.ts +0 -2
  36. package/dist/cli/platformKey.test.d.ts.map +0 -1
  37. package/dist/cli/platformKey.test.js +0 -36
  38. package/dist/cli/platformKey.test.js.map +0 -1
  39. package/dist/cli/resolveBinary.test.d.ts +0 -2
  40. package/dist/cli/resolveBinary.test.d.ts.map +0 -1
  41. package/dist/cli/resolveBinary.test.js +0 -54
  42. package/dist/cli/resolveBinary.test.js.map +0 -1
  43. package/dist/loadNativeCore.test.d.ts +0 -2
  44. package/dist/loadNativeCore.test.d.ts.map +0 -1
  45. package/dist/loadNativeCore.test.js +0 -51
  46. package/dist/loadNativeCore.test.js.map +0 -1
  47. package/dist/platforms.test.d.ts +0 -2
  48. package/dist/platforms.test.d.ts.map +0 -1
  49. package/dist/platforms.test.js +0 -84
  50. package/dist/platforms.test.js.map +0 -1
  51. package/dist/resolveConfig.test.d.ts +0 -2
  52. package/dist/resolveConfig.test.d.ts.map +0 -1
  53. package/dist/resolveConfig.test.js +0 -206
  54. package/dist/resolveConfig.test.js.map +0 -1
package/docs/api/index.md CHANGED
@@ -37,6 +37,7 @@ DirSQL(
37
37
  tables: list[Table] | None = None,
38
38
  ignore: list[str] | None = None,
39
39
  config: str | None = None,
40
+ extensions: list[dict] | None = None, # [{ "path": str, "entrypoint"?: str }]
40
41
  )
41
42
  ```
42
43
 
@@ -46,6 +47,7 @@ DirSQL::builder()
46
47
  .tables(tables) // optional; append with .table(t)
47
48
  .ignore(patterns) // optional
48
49
  .config(config_toml_path) // optional
50
+ .extensions(extensions) // optional; Extension { path, entrypoint }
49
51
  .build() // -> Result<DirSQL>
50
52
  ```
51
53
 
@@ -73,7 +75,8 @@ In Python, the constructor starts scanning in a background thread and returns im
73
75
  - `root` -- Path to the directory to index. Optional if `config` is supplied.
74
76
  - `tables` -- List of `Table` definitions. Each defines a SQLite table, a glob pattern, and an extract function.
75
77
  - `ignore` -- Optional list of glob patterns. Files matching any ignore pattern are skipped regardless of table globs.
76
- - `config` -- Optional path to a `.dirsql.toml` config file. Its `[[table]]` entries are appended to any programmatic `tables`; its `[dirsql].ignore` patterns are appended to any explicit `ignore`; its optional `[dirsql].root` supplies the root directory when `root` is not passed explicitly.
78
+ - `config` -- Optional path to a `.dirsql.toml` config file. Its `[[table]]` entries are appended to any programmatic `tables`; its `[dirsql].ignore` patterns are appended to any explicit `ignore`; its optional `[dirsql].root` supplies the root directory when `root` is not passed explicitly; its `[[dirsql.extension]]` entries are appended to any programmatic `extensions`.
79
+ - `extensions` -- Optional SQLite extensions to load onto the connection at startup, before any table DDL (enable → load → disable, so the SQL `load_extension()` function is never left exposed). Each entry pairs a shared-library `path` with an optional `entrypoint` init-symbol override (Python: `{ "path", "entrypoint"? }` dicts; Rust: `Extension { path, entrypoint }`). Programmatic entries load first, then any `[[dirsql.extension]]` from `config`. Available in the Python and Rust SDKs; the TypeScript constructor parameter is tracked in [#230](https://github.com/thekevinscott/dirsql/issues/230). See [Loading extensions](../cli/config.md#loading-extensions).
77
80
 
78
81
  ### Methods
79
82
 
@@ -159,7 +162,7 @@ JSON.stringify(db) // via db.toJSON()
159
162
 
160
163
  :::
161
164
 
162
- Returns the resolved construction state as a JSON-compatible value with fields `root`, `tables`, `ignore`, `persist`, `persist_path` (camelCase `persistPath` in TypeScript). Each table is `{ ddl, glob, strict }`. Excludes the original `config` path (already merged into `root` / `tables` / `ignore`), per-table `extract`, and per-table `name`. Available immediately after construction in Python and TypeScript; Rust's sync `build()` returns a ready instance.
165
+ Returns the resolved construction state as a JSON-compatible value with fields `root`, `tables`, `ignore`, `persist`, `persist_path` (camelCase `persistPath` in TypeScript). Each table is `{ ddl, glob, strict }`. The Python and Rust snapshots also include `extensions` -- an array of `{ path, entrypoint }` (empty when none are configured); the TypeScript `toJSON` snapshot will gain it with [#230](https://github.com/thekevinscott/dirsql/issues/230). Excludes the original `config` path (already merged into `root` / `tables` / `ignore`), per-table `extract`, and per-table `name`. Available immediately after construction in Python and TypeScript; Rust's sync `build()` returns a ready instance.
163
166
 
164
167
  ---
165
168
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dirsql",
3
- "version": "0.3.35",
3
+ "version": "0.3.37",
4
4
  "description": "Ephemeral SQL index over a local directory",
5
5
  "license": "MIT",
6
6
  "repository": "https://github.com/thekevinscott/dirsql",
@@ -39,7 +39,6 @@
39
39
  "test": "wireit",
40
40
  "test:unit": "wireit",
41
41
  "test:integration": "wireit",
42
- "test:e2e": "wireit",
43
42
  "coverage": "wireit",
44
43
  "lint": "biome check .",
45
44
  "lint:fix": "biome check --write .",
@@ -55,10 +54,11 @@
55
54
  ]
56
55
  },
57
56
  "tsc": {
58
- "command": "tsc",
57
+ "command": "tsc -p tsconfig.build.json",
59
58
  "files": [
60
59
  "src/**/*.ts",
61
- "tsconfig.json"
60
+ "tsconfig.json",
61
+ "tsconfig.build.json"
62
62
  ],
63
63
  "output": [
64
64
  "dist/**"
@@ -90,14 +90,15 @@
90
90
  ]
91
91
  },
92
92
  "build:debug": {
93
- "command": "napi build --manifest-path napi/Cargo.toml --output-dir . && tsc",
93
+ "command": "napi build --manifest-path napi/Cargo.toml --output-dir . && tsc -p tsconfig.build.json",
94
94
  "files": [
95
95
  "napi/src/**/*.rs",
96
96
  "napi/build.rs",
97
97
  "napi/Cargo.toml",
98
98
  "../rust/src/**/*.rs",
99
99
  "src/**/*.ts",
100
- "tsconfig.json"
100
+ "tsconfig.json",
101
+ "tsconfig.build.json"
101
102
  ],
102
103
  "output": [
103
104
  "dirsql.node",
@@ -144,21 +145,6 @@
144
145
  ],
145
146
  "output": []
146
147
  },
147
- "test:e2e": {
148
- "command": "vitest run --dir test-e2e --passWithNoTests",
149
- "dependencies": [
150
- "build"
151
- ],
152
- "files": [
153
- "src/**/*.ts",
154
- "tools/**/*.ts",
155
- "test-e2e/**/*.ts",
156
- "vitest.config.ts",
157
- "../rust/src/**/*.rs",
158
- "../rust/Cargo.toml"
159
- ],
160
- "output": []
161
- },
162
148
  "coverage": {
163
149
  "command": "vitest run --coverage",
164
150
  "dependencies": [
@@ -198,15 +184,15 @@
198
184
  "smol-toml": "^1.6.1"
199
185
  },
200
186
  "optionalDependencies": {
201
- "@dirsql/lib-linux-x64-gnu": "0.3.35",
202
- "@dirsql/lib-linux-arm64-gnu": "0.3.35",
203
- "@dirsql/lib-darwin-x64": "0.3.35",
204
- "@dirsql/lib-darwin-arm64": "0.3.35",
205
- "@dirsql/lib-win32-x64-msvc": "0.3.35",
206
- "@dirsql/cli-linux-x64-gnu": "0.3.35",
207
- "@dirsql/cli-linux-arm64-gnu": "0.3.35",
208
- "@dirsql/cli-darwin-x64": "0.3.35",
209
- "@dirsql/cli-darwin-arm64": "0.3.35",
210
- "@dirsql/cli-win32-x64-msvc": "0.3.35"
187
+ "@dirsql/lib-linux-x64-gnu": "0.3.37",
188
+ "@dirsql/lib-linux-arm64-gnu": "0.3.37",
189
+ "@dirsql/lib-darwin-x64": "0.3.37",
190
+ "@dirsql/lib-darwin-arm64": "0.3.37",
191
+ "@dirsql/lib-win32-x64-msvc": "0.3.37",
192
+ "@dirsql/cli-linux-x64-gnu": "0.3.37",
193
+ "@dirsql/cli-linux-arm64-gnu": "0.3.37",
194
+ "@dirsql/cli-darwin-x64": "0.3.37",
195
+ "@dirsql/cli-darwin-arm64": "0.3.37",
196
+ "@dirsql/cli-win32-x64-msvc": "0.3.37"
211
197
  }
212
198
  }
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=die.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"die.test.d.ts","sourceRoot":"","sources":["../../src/cli/die.test.ts"],"names":[],"mappings":""}
@@ -1,29 +0,0 @@
1
- // Unit tests for `die`.
2
- import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
3
- import { die } from "./die.js";
4
- describe("die", () => {
5
- let stderrWrite;
6
- let exit;
7
- beforeEach(() => {
8
- stderrWrite = vi.fn();
9
- exit = vi.fn().mockImplementation((code) => {
10
- throw new Error(`EXIT_${code}`);
11
- });
12
- vi.stubGlobal("process", {
13
- ...process,
14
- stderr: { write: stderrWrite },
15
- exit,
16
- });
17
- });
18
- afterEach(() => vi.unstubAllGlobals());
19
- it("writes a 'dirsql: ' prefixed message to stderr and exits with the given code", () => {
20
- expect(() => die("boom", 2)).toThrow("EXIT_2");
21
- expect(stderrWrite).toHaveBeenCalledWith("dirsql: boom\n");
22
- expect(exit).toHaveBeenCalledWith(2);
23
- });
24
- it("defaults the exit code to 1", () => {
25
- expect(() => die("boom")).toThrow("EXIT_1");
26
- expect(exit).toHaveBeenCalledWith(1);
27
- });
28
- });
29
- //# sourceMappingURL=die.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"die.test.js","sourceRoot":"","sources":["../../src/cli/die.test.ts"],"names":[],"mappings":"AAAA,wBAAwB;AAExB,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;AAE/B,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE;IACnB,IAAI,WAAqC,CAAC;IAC1C,IAAI,IAA8B,CAAC;IAEnC,UAAU,CAAC,GAAG,EAAE;QACd,WAAW,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACtB,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,EAAE,CAAC,UAAU,CAAC,SAAS,EAAE;YACvB,GAAG,OAAO;YACV,MAAM,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE;YAC9B,IAAI;SACL,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAEvC,EAAE,CAAC,8EAA8E,EAAE,GAAG,EAAE;QACtF,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC/C,MAAM,CAAC,WAAW,CAAC,CAAC,oBAAoB,CAAC,gBAAgB,CAAC,CAAC;QAC3D,MAAM,CAAC,IAAI,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC5C,MAAM,CAAC,IAAI,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=buildTables.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"buildTables.test.d.ts","sourceRoot":"","sources":["../../../src/cli/interpret/buildTables.test.ts"],"names":[],"mappings":""}
@@ -1,60 +0,0 @@
1
- import { describe, expect, it, vi } from "vitest";
2
- import { buildTables } from "./buildTables.js";
3
- // `buildTables`'s only collaborator is `parseTableName` from the core barrel.
4
- // Mock it so the SUT picks up the fake directly -- no real core, no
5
- // `__setCoreForTesting` seam.
6
- // Anchor the double to the real barrel (so it can't drift), then override the
7
- // only collaborator `buildTables` reaches for. The barrel's `parseTableName`
8
- // lazy-loads the native core *when called*; the fake below is what runs, so
9
- // the real native implementation is never invoked.
10
- vi.mock("../../index.js", async () => ({
11
- ...(await vi.importActual("../../index.js")),
12
- parseTableName: vi.fn((ddl) => /CREATE\s+TABLE\s+(\w+)/i.exec(ddl)?.[1] ?? null),
13
- }));
14
- const noopExtract = () => [];
15
- function fakeApp(tables) {
16
- return { _options: { tables } };
17
- }
18
- describe("buildTables", () => {
19
- it("returns an empty map when the app has no tables", () => {
20
- expect(buildTables(fakeApp([]))).toEqual(new Map());
21
- });
22
- it("treats undefined tables as empty", () => {
23
- expect(buildTables(fakeApp(undefined))).toEqual(new Map());
24
- });
25
- it("keys the lookup by the SQL identifier parsed from each DDL", () => {
26
- const t = {
27
- ddl: "CREATE TABLE papers (title TEXT)",
28
- glob: "**/*.json",
29
- extract: noopExtract,
30
- };
31
- const tables = buildTables(fakeApp([t]));
32
- expect(tables.get("papers")).toBe(t);
33
- });
34
- it("preserves multiple tables under their respective names", () => {
35
- const a = {
36
- ddl: "CREATE TABLE a (x TEXT)",
37
- glob: "a/*",
38
- extract: noopExtract,
39
- };
40
- const b = {
41
- ddl: "CREATE TABLE b (y TEXT)",
42
- glob: "b/*",
43
- extract: noopExtract,
44
- };
45
- const tables = buildTables(fakeApp([a, b]));
46
- expect(tables.get("a")).toBe(a);
47
- expect(tables.get("b")).toBe(b);
48
- expect(tables.size).toBe(2);
49
- });
50
- it("throws when parseTableName returns null for a DDL", () => {
51
- const t = {
52
- // DDL the fake regex won't match -- no `CREATE TABLE` prefix at all.
53
- ddl: "DROP TABLE old_papers",
54
- glob: "*.json",
55
- extract: noopExtract,
56
- };
57
- expect(() => buildTables(fakeApp([t]))).toThrow(/could not parse table name/);
58
- });
59
- });
60
- //# sourceMappingURL=buildTables.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"buildTables.test.js","sourceRoot":"","sources":["../../../src/cli/interpret/buildTables.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=dispatchExtract.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dispatchExtract.test.d.ts","sourceRoot":"","sources":["../../../src/cli/interpret/dispatchExtract.test.ts"],"names":[],"mappings":""}
@@ -1,75 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"dispatchExtract.test.js","sourceRoot":"","sources":["../../../src/cli/interpret/dispatchExtract.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=errMessage.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"errMessage.test.d.ts","sourceRoot":"","sources":["../../../src/cli/interpret/errMessage.test.ts"],"names":[],"mappings":""}
@@ -1,23 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=interpret.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"interpret.test.d.ts","sourceRoot":"","sources":["../../../src/cli/interpret/interpret.test.ts"],"names":[],"mappings":""}
@@ -1,152 +0,0 @@
1
- import { afterEach, beforeEach, describe, expect, it, vi, } from "vitest";
2
- import { buildTables } from "./buildTables.js";
3
- import { dispatchExtract } from "./dispatchExtract.js";
4
- import { interpret } from "./interpret.js";
5
- import { loadApp } from "./loadApp.js";
6
- import { writeMessage } from "./writeMessage.js";
7
- // Every collaborator is mocked so the test isolates `interpret`'s glue logic.
8
- // `node:readline`'s `createInterface` is faked to return an async iterable of
9
- // lines directly -- this stands in for the line-buffered read over stdin, so
10
- // the test never needs a real `Readable` stream.
11
- vi.mock("./buildTables.js");
12
- vi.mock("./dispatchExtract.js");
13
- vi.mock("./loadApp.js");
14
- vi.mock("./writeMessage.js");
15
- vi.mock("node:readline", async () => ({
16
- ...(await vi.importActual("node:readline")),
17
- createInterface: vi.fn(),
18
- }));
19
- // Imported after the mock so we get the mocked module.
20
- const { createInterface } = await import("node:readline");
21
- function fakeApp(overrides = {}) {
22
- const app = {
23
- ready: Promise.resolve(),
24
- toJSON: () => ({ root: "/x" }),
25
- _options: { tables: [] },
26
- ...overrides,
27
- };
28
- return app;
29
- }
30
- // Fake the readline interface as an async iterable yielding the given lines.
31
- function stubLines(lines) {
32
- vi.mocked(createInterface).mockReturnValue((async function* () {
33
- for (const l of lines) {
34
- yield l;
35
- }
36
- // biome-ignore lint/suspicious/noExplicitAny: minimal readline stub
37
- })());
38
- }
39
- describe("interpret", () => {
40
- let stderrWrite;
41
- beforeEach(() => {
42
- stderrWrite = vi.fn();
43
- vi.stubGlobal("process", {
44
- ...process,
45
- stderr: { write: stderrWrite },
46
- });
47
- stubLines([]);
48
- vi.mocked(writeMessage).mockImplementation(() => { });
49
- vi.mocked(buildTables).mockReturnValue(new Map());
50
- vi.mocked(dispatchExtract).mockResolvedValue({
51
- type: "result",
52
- id: 1,
53
- ok: true,
54
- rows: [],
55
- });
56
- });
57
- afterEach(() => {
58
- vi.unstubAllGlobals();
59
- vi.restoreAllMocks();
60
- });
61
- describe("startup", () => {
62
- it("returns 1 and writes to stderr when configPath is empty", async () => {
63
- expect(await interpret("")).toBe(1);
64
- expect(stderrWrite).toHaveBeenCalledExactlyOnceWith("dirsql interpret: expected one config path, got 0\n");
65
- });
66
- it("returns 1 and writes a dirsql-prefixed line when loadApp throws", async () => {
67
- vi.mocked(loadApp).mockRejectedValue(new Error("no app"));
68
- expect(await interpret("bad.mjs")).toBe(1);
69
- expect(stderrWrite).toHaveBeenCalledExactlyOnceWith("dirsql interpret: no app\n");
70
- });
71
- it("coerces non-Error throws via String() in the stderr message", async () => {
72
- vi.mocked(loadApp).mockRejectedValue("plain string");
73
- expect(await interpret("bad.mjs")).toBe(1);
74
- expect(stderrWrite).toHaveBeenCalledExactlyOnceWith("dirsql interpret: plain string\n");
75
- });
76
- });
77
- describe("handshake", () => {
78
- it("writes one config message with app.toJSON() as state", async () => {
79
- const app = fakeApp({
80
- toJSON: () => ({ root: "/here", tables: [], ignore: [], persist: false }),
81
- });
82
- vi.mocked(loadApp).mockResolvedValue(app);
83
- await interpret("good.mjs");
84
- expect(writeMessage).toHaveBeenCalledWith({
85
- type: "config",
86
- state: { root: "/here", tables: [], ignore: [], persist: false },
87
- });
88
- });
89
- it("attaches a no-op catch to app.ready to swallow background-scan failures", async () => {
90
- // Verify the structural property -- interpret CALLS `.catch` on
91
- // `app.ready` -- without exercising the runtime side effect
92
- // (which fights vitest's own unhandled-rejection handling).
93
- const catchSpy = vi.fn(() => Promise.resolve());
94
- const app = fakeApp({
95
- ready: { catch: catchSpy },
96
- });
97
- vi.mocked(loadApp).mockResolvedValue(app);
98
- await interpret("good.mjs");
99
- expect(catchSpy).toHaveBeenCalledOnce();
100
- });
101
- });
102
- describe("extract loop", () => {
103
- it("dispatches one extract request and writes the response", async () => {
104
- vi.mocked(loadApp).mockResolvedValue(fakeApp());
105
- const req = { type: "extract", id: 1, table: "t", path: "/a" };
106
- stubLines([JSON.stringify(req)]);
107
- const expected = {
108
- type: "result",
109
- id: 1,
110
- ok: true,
111
- rows: [{ row: "/a" }],
112
- };
113
- vi.mocked(dispatchExtract).mockResolvedValue(expected);
114
- expect(await interpret("good.mjs")).toBe(0);
115
- expect(dispatchExtract).toHaveBeenCalledWith(req, new Map());
116
- // handshake first, then response
117
- expect(writeMessage).toHaveBeenCalledTimes(2);
118
- expect(writeMessage).toHaveBeenLastCalledWith(expected);
119
- });
120
- it("skips blank lines silently", async () => {
121
- vi.mocked(loadApp).mockResolvedValue(fakeApp());
122
- stubLines(["", " "]);
123
- expect(await interpret("good.mjs")).toBe(0);
124
- expect(dispatchExtract).not.toHaveBeenCalled();
125
- // handshake only
126
- expect(writeMessage).toHaveBeenCalledOnce();
127
- });
128
- it("skips malformed JSON silently", async () => {
129
- vi.mocked(loadApp).mockResolvedValue(fakeApp());
130
- stubLines(["not json", "{also bad"]);
131
- expect(await interpret("good.mjs")).toBe(0);
132
- expect(dispatchExtract).not.toHaveBeenCalled();
133
- });
134
- it("skips non-extract messages silently", async () => {
135
- vi.mocked(loadApp).mockResolvedValue(fakeApp());
136
- stubLines([JSON.stringify({ type: "ping" })]);
137
- expect(await interpret("good.mjs")).toBe(0);
138
- expect(dispatchExtract).not.toHaveBeenCalled();
139
- });
140
- it("skips a null / non-object JSON payload silently", async () => {
141
- vi.mocked(loadApp).mockResolvedValue(fakeApp());
142
- stubLines(["null", "42", "[]"]);
143
- expect(await interpret("good.mjs")).toBe(0);
144
- expect(dispatchExtract).not.toHaveBeenCalled();
145
- });
146
- it("returns 0 when stdin closes", async () => {
147
- vi.mocked(loadApp).mockResolvedValue(fakeApp());
148
- expect(await interpret("good.mjs")).toBe(0);
149
- });
150
- });
151
- });
152
- //# sourceMappingURL=interpret.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"interpret.test.js","sourceRoot":"","sources":["../../../src/cli/interpret/interpret.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=loadApp.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"loadApp.test.d.ts","sourceRoot":"","sources":["../../../src/cli/interpret/loadApp.test.ts"],"names":[],"mappings":""}
@@ -1,33 +0,0 @@
1
- import { describe, expect, it, vi } from "vitest";
2
- import { loadApp } from "./loadApp.js";
3
- describe("loadApp", () => {
4
- it("returns the default export the importer yields", async () => {
5
- const importer = vi
6
- .fn()
7
- .mockResolvedValue({ default: { sentinel: "value" } });
8
- const app = (await loadApp("/cfg/config.mjs", importer));
9
- expect(app.sentinel).toBe("value");
10
- // The importer receives the file:// URL form of the config path.
11
- expect(importer).toHaveBeenCalledWith(expect.stringMatching(/^file:.*config\.mjs$/));
12
- });
13
- it("throws a path-aware error when the module has no default export", async () => {
14
- const importer = vi.fn().mockResolvedValue({ x: 1 });
15
- await expect(loadApp("/cfg/no_default.mjs", importer)).rejects.toThrow(/must default-export a DirSQL instance/);
16
- await expect(loadApp("/cfg/no_default.mjs", importer)).rejects.toThrow("/cfg/no_default.mjs");
17
- });
18
- it("propagates errors thrown during module evaluation", async () => {
19
- const importer = vi.fn().mockRejectedValue(new Error("synthetic boom"));
20
- await expect(loadApp("/cfg/boom.mjs", importer)).rejects.toThrow(/synthetic boom/);
21
- });
22
- it("rejects when the importer rejects (missing file)", async () => {
23
- const importer = vi.fn().mockRejectedValue(new Error("Cannot find module"));
24
- await expect(loadApp("/cfg/nope.mjs", importer)).rejects.toThrow();
25
- });
26
- it("defaults to the real dynamic import when no importer is injected", async () => {
27
- // Exercises the default `importer` arg (a real `import()`). The path
28
- // doesn't exist, so the underlying import rejects -- which is all we
29
- // need to drive the default callback's single line.
30
- await expect(loadApp("/no/such/dirsql.config.mjs")).rejects.toThrow();
31
- });
32
- });
33
- //# sourceMappingURL=loadApp.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"loadApp.test.js","sourceRoot":"","sources":["../../../src/cli/interpret/loadApp.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;IACvB,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC9D,MAAM,QAAQ,GAAG,EAAE;aAChB,EAAE,EAAE;aACJ,iBAAiB,CAAC,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;QACzD,MAAM,GAAG,GAAG,CAAC,MAAM,OAAO,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAEtD,CAAC;QACF,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnC,iEAAiE;QACjE,MAAM,CAAC,QAAQ,CAAC,CAAC,oBAAoB,CACnC,MAAM,CAAC,cAAc,CAAC,sBAAsB,CAAC,CAC9C,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;QAC/E,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACrD,MAAM,MAAM,CAAC,OAAO,CAAC,qBAAqB,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CACpE,uCAAuC,CACxC,CAAC;QACF,MAAM,MAAM,CAAC,OAAO,CAAC,qBAAqB,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CACpE,qBAAqB,CACtB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;QACjE,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC;QACxE,MAAM,MAAM,CAAC,OAAO,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAC9D,gBAAgB,CACjB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAChE,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAC;QAC5E,MAAM,MAAM,CAAC,OAAO,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;QAChF,qEAAqE;QACrE,qEAAqE;QACrE,oDAAoD;QACpD,MAAM,MAAM,CAAC,OAAO,CAAC,4BAA4B,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;IACxE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=writeMessage.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"writeMessage.test.d.ts","sourceRoot":"","sources":["../../../src/cli/interpret/writeMessage.test.ts"],"names":[],"mappings":""}
@@ -1,25 +0,0 @@
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