dirsql 0.3.3 → 0.3.5

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.
@@ -1,12 +1,14 @@
1
1
  #!/usr/bin/env node
2
- // npm `bin` entry for `dirsql`. Runs the launcher when invoked from the
3
- // command line; doesn't do anything when imported (so tests can pull in
4
- // individual modules without side effects).
2
+ // npm `bin` entry for `dirsql`. The package.json `bin` field points at
3
+ // the compiled version of this file; npm symlinks `node_modules/.bin/dirsql`
4
+ // to it. Always runs the launcher -- nothing else should import this
5
+ // file (test the helpers in `main.ts` / `resolveBinary.ts` instead).
6
+ //
7
+ // A prior `process.argv[1] === import.meta.filename` self-detection
8
+ // guard tripped up the npm-bin symlink: argv[1] is the (unresolved)
9
+ // symlink path, while import.meta.filename is the realpath, and the
10
+ // guard silently skipped main() so `dirsql --version` produced no
11
+ // output (caught by the pack-install build-CI smoke test).
5
12
  import { main } from "./main.js";
6
- // `import.meta.filename` (Node 20.11+) avoids the
7
- // `dirname(fileURLToPath(import.meta.url))` boilerplate. When this
8
- // module is the script Node was invoked with, run the launcher.
9
- if (process.argv[1] === import.meta.filename) {
10
- main();
11
- }
13
+ main();
12
14
  //# sourceMappingURL=dirsql.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"dirsql.js","sourceRoot":"","sources":["../../ts/bin/dirsql.ts"],"names":[],"mappings":";AACA,wEAAwE;AACxE,wEAAwE;AACxE,4CAA4C;AAE5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,kDAAkD;AAClD,mEAAmE;AACnE,gEAAgE;AAChE,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;IAC7C,IAAI,EAAE,CAAC;AACT,CAAC"}
1
+ {"version":3,"file":"dirsql.js","sourceRoot":"","sources":["../../ts/bin/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"}
package/docs/guide/cli.md CHANGED
@@ -32,6 +32,13 @@ dirsql
32
32
  The `cli` feature is **opt-in**. Adding `dirsql` as a library dependency (`cargo add dirsql`) pulls no CLI dependencies — only the core library. See the [Rust library README](https://github.com/thekevinscott/dirsql/tree/main/packages/rust) for details.
33
33
  :::
34
34
 
35
+ ## Subcommands
36
+
37
+ | Command | Purpose |
38
+ |---|---|
39
+ | `dirsql` (no subcommand) | Start the long-lived HTTP server (default behavior, see below). |
40
+ | `dirsql init` | Generate a starter `.dirsql.toml` from the contents of a directory. See [Generating a Config](./init.md). |
41
+
35
42
  ## Running the server
36
43
 
37
44
  Run `dirsql` from the directory containing your files:
@@ -0,0 +1,84 @@
1
+ ---
2
+ canonical: https://thekevinscott.github.io/dirsql/guide/init
3
+ ---
4
+
5
+ # Generating a config with `dirsql init`
6
+
7
+ > Online: <https://thekevinscott.github.io/dirsql/guide/init>
8
+
9
+ `dirsql init` generates a `.dirsql.toml` by running `claude` over the target directory.
10
+
11
+ The output is limited to filesystem-fact tables. For content-aware schemas, see [Defining Tables](./tables.md).
12
+
13
+ ## Examples
14
+
15
+ ### Mixed files
16
+
17
+ ```
18
+ my-downloads/
19
+ ├── archive.zip
20
+ ├── invoice.pdf
21
+ ├── notes.txt
22
+ └── photo.jpg
23
+ ```
24
+
25
+ ```toml
26
+ [[table]]
27
+ ddl = "CREATE TABLE files (_path TEXT, _ext TEXT, _size INTEGER)"
28
+ glob = "*"
29
+ ```
30
+
31
+ ### Path captures
32
+
33
+ ```
34
+ photos/
35
+ ├── 2024-01/
36
+ │ ├── beach.jpg
37
+ │ └── sunset.jpg
38
+ └── 2024-02/
39
+ ├── snow.jpg
40
+ └── mountain.jpg
41
+ ```
42
+
43
+ ```toml
44
+ [[table]]
45
+ ddl = "CREATE TABLE photos (month TEXT, _basename TEXT, _mtime INTEGER)"
46
+ glob = "{month}/*.jpg"
47
+ ```
48
+
49
+ ### Multiple tables
50
+
51
+ ```
52
+ my-blog/
53
+ ├── posts/
54
+ │ ├── hello-world.md
55
+ │ └── second.md
56
+ └── _comments/
57
+ └── hello-world/
58
+ ├── 2024-01-15.jsonl
59
+ └── 2024-02-03.jsonl
60
+ ```
61
+
62
+ ```toml
63
+ [[table]]
64
+ ddl = "CREATE TABLE posts (_basename TEXT, _mtime INTEGER, _size INTEGER)"
65
+ glob = "posts/*.md"
66
+
67
+ [[table]]
68
+ ddl = "CREATE TABLE comments (thread_id TEXT, _basename TEXT, _mtime INTEGER)"
69
+ glob = "_comments/{thread_id}/*.jsonl"
70
+ ```
71
+
72
+ `init` will not overwrite an existing config without `--force`.
73
+
74
+ ## Flags
75
+
76
+ | Flag | Default | Description |
77
+ |---|---|---|
78
+ | `--root <path>` | cwd | Directory to scan |
79
+ | `--output <path>` | `<root>/.dirsql.toml` | Output path |
80
+ | `--force` | off | Overwrite if the output exists |
81
+
82
+ ## Authentication
83
+
84
+ Requires `claude` on `PATH` and signed in. There is no separate API key. If `claude` is missing, `dirsql init` raises an exception.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dirsql",
3
- "version": "0.3.3",
3
+ "version": "0.3.5",
4
4
  "description": "Ephemeral SQL index over a local directory",
5
5
  "license": "MIT",
6
6
  "repository": "https://github.com/thekevinscott/dirsql",
@@ -39,6 +39,7 @@
39
39
  "test": "wireit",
40
40
  "test:unit": "wireit",
41
41
  "test:integration": "wireit",
42
+ "test:e2e": "wireit",
42
43
  "coverage": "wireit",
43
44
  "lint": "biome check .",
44
45
  "lint:fix": "biome check --write .",
@@ -142,6 +143,21 @@
142
143
  ],
143
144
  "output": []
144
145
  },
146
+ "test:e2e": {
147
+ "command": "vitest run --dir test-e2e --passWithNoTests",
148
+ "dependencies": [
149
+ "build"
150
+ ],
151
+ "files": [
152
+ "ts/**/*.ts",
153
+ "tools/**/*.ts",
154
+ "test-e2e/**/*.ts",
155
+ "vitest.config.ts",
156
+ "../rust/src/**/*.rs",
157
+ "../rust/Cargo.toml"
158
+ ],
159
+ "output": []
160
+ },
145
161
  "coverage": {
146
162
  "command": "vitest run --coverage",
147
163
  "dependencies": [
@@ -175,15 +191,15 @@
175
191
  ]
176
192
  },
177
193
  "optionalDependencies": {
178
- "@dirsql/lib-linux-x64-gnu": "0.3.3",
179
- "@dirsql/lib-linux-arm64-gnu": "0.3.3",
180
- "@dirsql/lib-darwin-x64": "0.3.3",
181
- "@dirsql/lib-darwin-arm64": "0.3.3",
182
- "@dirsql/lib-win32-x64-msvc": "0.3.3",
183
- "@dirsql/cli-linux-x64-gnu": "0.3.3",
184
- "@dirsql/cli-linux-arm64-gnu": "0.3.3",
185
- "@dirsql/cli-darwin-x64": "0.3.3",
186
- "@dirsql/cli-darwin-arm64": "0.3.3",
187
- "@dirsql/cli-win32-x64-msvc": "0.3.3"
194
+ "@dirsql/lib-linux-x64-gnu": "0.3.5",
195
+ "@dirsql/lib-linux-arm64-gnu": "0.3.5",
196
+ "@dirsql/lib-darwin-x64": "0.3.5",
197
+ "@dirsql/lib-darwin-arm64": "0.3.5",
198
+ "@dirsql/lib-win32-x64-msvc": "0.3.5",
199
+ "@dirsql/cli-linux-x64-gnu": "0.3.5",
200
+ "@dirsql/cli-linux-arm64-gnu": "0.3.5",
201
+ "@dirsql/cli-darwin-x64": "0.3.5",
202
+ "@dirsql/cli-darwin-arm64": "0.3.5",
203
+ "@dirsql/cli-win32-x64-msvc": "0.3.5"
188
204
  }
189
205
  }
@@ -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":["../../ts/bin/die.test.ts"],"names":[],"mappings":""}
@@ -1,34 +0,0 @@
1
- import { afterEach, describe, expect, it, vi } from "vitest";
2
- import { die } from "./die.js";
3
- afterEach(() => vi.restoreAllMocks());
4
- describe("die", () => {
5
- describe("by default", () => {
6
- it("writes a `dirsql: ` prefixed message to stderr", () => {
7
- const write = vi.spyOn(process.stderr, "write").mockReturnValue(true);
8
- vi.spyOn(process, "exit").mockImplementation(((code) => {
9
- throw new Error(`exit:${code}`);
10
- }));
11
- expect(() => die("boom")).toThrow("exit:1");
12
- expect(write).toHaveBeenCalledWith("dirsql: boom\n");
13
- });
14
- it("exits with code 1", () => {
15
- vi.spyOn(process.stderr, "write").mockReturnValue(true);
16
- const exit = vi.spyOn(process, "exit").mockImplementation(((code) => {
17
- throw new Error(`exit:${code}`);
18
- }));
19
- expect(() => die("boom")).toThrow();
20
- expect(exit).toHaveBeenCalledWith(1);
21
- });
22
- });
23
- describe("with an explicit exit code", () => {
24
- it("passes the code to process.exit", () => {
25
- vi.spyOn(process.stderr, "write").mockReturnValue(true);
26
- const exit = vi.spyOn(process, "exit").mockImplementation(((code) => {
27
- throw new Error(`exit:${code}`);
28
- }));
29
- expect(() => die("nope", 7)).toThrow();
30
- expect(exit).toHaveBeenCalledWith(7);
31
- });
32
- });
33
- });
34
- //# sourceMappingURL=die.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"die.test.js","sourceRoot":"","sources":["../../ts/bin/die.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC7D,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAE/B,SAAS,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,eAAe,EAAE,CAAC,CAAC;AAEtC,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE;IACnB,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;QAC1B,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;YACxD,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YACtE,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAC5C,IAA6B,EAC7B,EAAE;gBACF,MAAM,IAAI,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;YAClC,CAAC,CAAwB,CAAC,CAAC;YAE3B,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC5C,MAAM,CAAC,KAAK,CAAC,CAAC,oBAAoB,CAAC,gBAAgB,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mBAAmB,EAAE,GAAG,EAAE;YAC3B,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YACxD,MAAM,IAAI,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC,CACzD,IAA6B,EAC7B,EAAE;gBACF,MAAM,IAAI,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;YAClC,CAAC,CAAwB,CAAC,CAAC;YAE3B,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;YACpC,MAAM,CAAC,IAAI,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;QAC1C,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;YACzC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YACxD,MAAM,IAAI,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC,CACzD,IAA6B,EAC7B,EAAE;gBACF,MAAM,IAAI,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;YAClC,CAAC,CAAwB,CAAC,CAAC;YAE3B,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;YACvC,MAAM,CAAC,IAAI,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=main.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"main.test.d.ts","sourceRoot":"","sources":["../../ts/bin/main.test.ts"],"names":[],"mappings":""}
@@ -1,121 +0,0 @@
1
- import { afterEach, describe, expect, it, vi } from "vitest";
2
- vi.mock("./resolveBinary", () => ({ resolveBinary: vi.fn() }));
3
- vi.mock("node:child_process", () => ({ spawnSync: vi.fn() }));
4
- import { spawnSync } from "node:child_process";
5
- import { main } from "./main.js";
6
- import { resolveBinary } from "./resolveBinary.js";
7
- const spawnSyncMock = vi.mocked(spawnSync);
8
- const resolveBinaryMock = vi.mocked(resolveBinary);
9
- afterEach(() => vi.restoreAllMocks());
10
- function stubExit() {
11
- return vi.spyOn(process, "exit").mockImplementation(((code) => {
12
- throw new Error(`exit:${code}`);
13
- }));
14
- }
15
- function stubStderr() {
16
- vi.spyOn(process.stderr, "write").mockReturnValue(true);
17
- }
18
- function stubKill() {
19
- return vi.spyOn(process, "kill").mockImplementation(() => true);
20
- }
21
- describe("main", () => {
22
- describe("on success", () => {
23
- it("resolves the binary, spawns it with argv, and exits with the child's status", () => {
24
- resolveBinaryMock.mockReturnValue("/real/dirsql");
25
- spawnSyncMock.mockReturnValue({
26
- status: 0,
27
- signal: null,
28
- pid: 123,
29
- output: [],
30
- stdout: Buffer.from(""),
31
- stderr: Buffer.from(""),
32
- });
33
- const exit = stubExit();
34
- expect(() => main(["--help"])).toThrow("exit:0");
35
- expect(resolveBinaryMock).toHaveBeenCalledTimes(1);
36
- expect(spawnSyncMock).toHaveBeenCalledWith("/real/dirsql", ["--help"], {
37
- stdio: "inherit",
38
- });
39
- expect(exit).toHaveBeenCalledWith(0);
40
- });
41
- });
42
- describe("when the child exits non-zero", () => {
43
- it("forwards the exit code", () => {
44
- resolveBinaryMock.mockReturnValue("/real/dirsql");
45
- spawnSyncMock.mockReturnValue({
46
- status: 42,
47
- signal: null,
48
- pid: 1,
49
- output: [],
50
- stdout: Buffer.from(""),
51
- stderr: Buffer.from(""),
52
- });
53
- const exit = stubExit();
54
- expect(() => main([])).toThrow("exit:42");
55
- expect(exit).toHaveBeenCalledWith(42);
56
- });
57
- });
58
- describe("when spawn fails to launch the child", () => {
59
- it("dies with the spawn error message and exits 1", () => {
60
- resolveBinaryMock.mockReturnValue("/real/dirsql");
61
- spawnSyncMock.mockReturnValue({
62
- status: null,
63
- signal: null,
64
- pid: 0,
65
- output: [],
66
- stdout: Buffer.from(""),
67
- stderr: Buffer.from(""),
68
- error: new Error("ENOENT"),
69
- });
70
- stubStderr();
71
- const exit = stubExit();
72
- expect(() => main([])).toThrow();
73
- expect(exit).toHaveBeenCalledWith(1);
74
- expect(process.stderr.write).toHaveBeenCalledWith(expect.stringContaining("ENOENT"));
75
- });
76
- });
77
- describe("when the child dies from a signal", () => {
78
- it("re-raises the same signal against itself", () => {
79
- resolveBinaryMock.mockReturnValue("/real/dirsql");
80
- spawnSyncMock.mockReturnValue({
81
- status: null,
82
- signal: "SIGINT",
83
- pid: 1,
84
- output: [],
85
- stdout: Buffer.from(""),
86
- stderr: Buffer.from(""),
87
- });
88
- const kill = stubKill();
89
- const exit = stubExit();
90
- expect(() => main([])).toThrow();
91
- expect(kill).toHaveBeenCalledWith(process.pid, "SIGINT");
92
- expect(exit).toHaveBeenCalledWith(1);
93
- });
94
- });
95
- describe("when argv is omitted", () => {
96
- it("defaults to process.argv.slice(2)", () => {
97
- resolveBinaryMock.mockReturnValue("/real/dirsql");
98
- spawnSyncMock.mockReturnValue({
99
- status: 0,
100
- signal: null,
101
- pid: 1,
102
- output: [],
103
- stdout: Buffer.from(""),
104
- stderr: Buffer.from(""),
105
- });
106
- vi.stubGlobal("process", {
107
- ...process,
108
- argv: ["node", "bin", "a", "b"],
109
- });
110
- stubExit();
111
- try {
112
- main();
113
- }
114
- catch {
115
- // process.exit is stubbed to throw
116
- }
117
- expect(spawnSyncMock).toHaveBeenCalledWith("/real/dirsql", ["a", "b"], expect.any(Object));
118
- });
119
- });
120
- });
121
- //# sourceMappingURL=main.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"main.test.js","sourceRoot":"","sources":["../../ts/bin/main.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=resolveBinary.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"resolveBinary.test.d.ts","sourceRoot":"","sources":["../../ts/bin/resolveBinary.test.ts"],"names":[],"mappings":""}
@@ -1,60 +0,0 @@
1
- import { afterEach, describe, expect, it, vi } from "vitest";
2
- import { defaultResolver, resolveBinary, } from "./resolveBinary.js";
3
- afterEach(() => {
4
- vi.restoreAllMocks();
5
- });
6
- function exitThrower() {
7
- return vi.spyOn(process, "exit").mockImplementation(((code) => {
8
- throw new Error(`exit:${code}`);
9
- }));
10
- }
11
- describe("defaultResolver", () => {
12
- it("returns a function that resolves node built-ins", () => {
13
- const resolve = defaultResolver();
14
- expect(typeof resolve).toBe("function");
15
- // `node:fs` is always resolvable from any Node-reachable module.
16
- expect(resolve("node:fs")).toBe("node:fs");
17
- });
18
- });
19
- describe("resolveBinary", () => {
20
- describe("with a supported platform key", () => {
21
- it("returns the resolver's result for the matching package", () => {
22
- const resolver = vi.fn().mockReturnValue("/real/linux/dirsql");
23
- const path = resolveBinary("linux-x64", resolver);
24
- expect(path).toBe("/real/linux/dirsql");
25
- expect(resolver).toHaveBeenCalledWith(expect.stringContaining("@dirsql/cli-linux-x64-gnu"));
26
- });
27
- });
28
- describe("with an unsupported platform key", () => {
29
- it("dies with a `cargo install` hint", () => {
30
- vi.spyOn(process.stderr, "write").mockReturnValue(true);
31
- const exit = exitThrower();
32
- expect(() => resolveBinary("sunos-sparc", () => "")).toThrow();
33
- expect(exit).toHaveBeenCalledWith(1);
34
- expect(process.stderr.write).toHaveBeenCalledWith(expect.stringContaining("no prebuilt binary for sunos-sparc"));
35
- });
36
- });
37
- describe("on Windows", () => {
38
- it("appends .exe to the resolved binary name", () => {
39
- vi.stubGlobal("process", { ...process, platform: "win32" });
40
- const resolver = vi
41
- .fn()
42
- .mockReturnValue("C:\\fake\\dirsql.exe");
43
- resolveBinary("win32-x64", resolver);
44
- expect(resolver).toHaveBeenCalledWith(expect.stringMatching(/dirsql\.exe$/));
45
- });
46
- });
47
- describe("when the optional dep is not installed", () => {
48
- it("dies with an `--no-optional` hint", () => {
49
- vi.spyOn(process.stderr, "write").mockReturnValue(true);
50
- const exit = exitThrower();
51
- const resolver = () => {
52
- throw new Error("Cannot find module");
53
- };
54
- expect(() => resolveBinary("linux-x64", resolver)).toThrow();
55
- expect(exit).toHaveBeenCalledWith(1);
56
- expect(process.stderr.write).toHaveBeenCalledWith(expect.stringContaining("is not installed"));
57
- });
58
- });
59
- });
60
- //# sourceMappingURL=resolveBinary.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"resolveBinary.test.js","sourceRoot":"","sources":["../../ts/bin/resolveBinary.test.ts"],"names":[],"mappings":"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"}