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.
- package/dist/bin/dirsql.js +11 -9
- package/dist/bin/dirsql.js.map +1 -1
- package/docs/guide/cli.md +7 -0
- package/docs/guide/init.md +84 -0
- package/package.json +27 -11
- package/dist/bin/die.test.d.ts +0 -2
- package/dist/bin/die.test.d.ts.map +0 -1
- package/dist/bin/die.test.js +0 -34
- package/dist/bin/die.test.js.map +0 -1
- package/dist/bin/main.test.d.ts +0 -2
- package/dist/bin/main.test.d.ts.map +0 -1
- package/dist/bin/main.test.js +0 -121
- package/dist/bin/main.test.js.map +0 -1
- package/dist/bin/resolveBinary.test.d.ts +0 -2
- package/dist/bin/resolveBinary.test.d.ts.map +0 -1
- package/dist/bin/resolveBinary.test.js +0 -60
- package/dist/bin/resolveBinary.test.js.map +0 -1
package/dist/bin/dirsql.js
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
// npm `bin` entry for `dirsql`.
|
|
3
|
-
//
|
|
4
|
-
//
|
|
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
|
-
|
|
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
|
package/dist/bin/dirsql.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dirsql.js","sourceRoot":"","sources":["../../ts/bin/dirsql.ts"],"names":[],"mappings":";AACA,
|
|
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
|
+
"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.
|
|
179
|
-
"@dirsql/lib-linux-arm64-gnu": "0.3.
|
|
180
|
-
"@dirsql/lib-darwin-x64": "0.3.
|
|
181
|
-
"@dirsql/lib-darwin-arm64": "0.3.
|
|
182
|
-
"@dirsql/lib-win32-x64-msvc": "0.3.
|
|
183
|
-
"@dirsql/cli-linux-x64-gnu": "0.3.
|
|
184
|
-
"@dirsql/cli-linux-arm64-gnu": "0.3.
|
|
185
|
-
"@dirsql/cli-darwin-x64": "0.3.
|
|
186
|
-
"@dirsql/cli-darwin-arm64": "0.3.
|
|
187
|
-
"@dirsql/cli-win32-x64-msvc": "0.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
|
}
|
package/dist/bin/die.test.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"die.test.d.ts","sourceRoot":"","sources":["../../ts/bin/die.test.ts"],"names":[],"mappings":""}
|
package/dist/bin/die.test.js
DELETED
|
@@ -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
|
package/dist/bin/die.test.js.map
DELETED
|
@@ -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"}
|
package/dist/bin/main.test.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"main.test.d.ts","sourceRoot":"","sources":["../../ts/bin/main.test.ts"],"names":[],"mappings":""}
|
package/dist/bin/main.test.js
DELETED
|
@@ -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 +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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"}
|