@dbx-tools/cli 0.6.186 → 0.6.188

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/README.md CHANGED
@@ -5,12 +5,14 @@ gated public tunnel.
5
5
 
6
6
  Available commands:
7
7
 
8
- | Command | What it does |
9
- | ---------------- | ------------------------------------------------------------------------ |
10
- | `dbx dev` | Bootstrap or repair a dbx-tools workspace, then forward to projen. |
11
- | `dbx appkit env` | Print the environment an AppKit app resolves, as eval-able shell output. |
12
- | `dbx auth` | Generate U2M or M2M OAuth tokens with secure credential storage. |
13
- | `dbx tunnel` | Front any command with a public portr tunnel and an email-OTP gate. |
8
+ | Command | What it does |
9
+ | -------------------- | ------------------------------------------------------------------------ |
10
+ | `dbx dev` | Bootstrap or repair a dbx-tools workspace, then forward to projen. |
11
+ | `dbx appkit env` | Print the environment an AppKit app resolves, as eval-able shell output. |
12
+ | `dbx auth` | Generate U2M or M2M OAuth tokens with secure credential storage. |
13
+ | `dbx tunnel` | Front any command with a public portr tunnel and an email-OTP gate. |
14
+ | `dbx model-proxy` | Run the multi-protocol Databricks Model Serving proxy. |
15
+ | `dbx lakebase-proxy` | Run the loopback PostgreSQL proxy for Databricks Lakebase. |
14
16
 
15
17
  Key features:
16
18
 
@@ -32,6 +34,13 @@ SMTP, or X.509 code. Run
32
34
  `dbx <group> --help` for a group's own flags; each forwards `--help` to the child
33
35
  program rather than answering it at the root.
34
36
 
37
+ Rust commands are generated from the workspace's release metadata. The first
38
+ invocation downloads the exact GitHub release asset matching `PACKAGE_VERSION`
39
+ and the operating system, then installs it as
40
+ `~/.dbx-tools/bin/<binary>_<major>_<minor>_<patch>`. Later invocations reuse
41
+ that versioned executable. Root help never downloads a binary, and all command
42
+ arguments are forwarded directly to the Rust CLI.
43
+
35
44
  ## Bootstrap A Workspace
36
45
 
37
46
  ```sh
package/index.ts CHANGED
@@ -3,10 +3,12 @@
3
3
  // Hand edits are overwritten on the next watch; this file is read-only.
4
4
 
5
5
  export const PACKAGE_IDENTIFIER = "@dbx-tools/cli";
6
- export const PACKAGE_VERSION = "0.6.186";
6
+ export const PACKAGE_VERSION = "0.6.188";
7
7
  export * as bootstrap from "./src/bootstrap.ts";
8
8
  export * as bun from "./src/bun.ts";
9
9
  export * as cli from "./src/cli.ts";
10
10
  export * as root from "./src/root.ts";
11
+ export * as rustBinary from "./src/rust-binary.ts";
11
12
  export { resolveBunArgv } from "./src/bun.ts";
12
13
  export { workspaceRoot } from "./src/root.ts";
14
+ export type { RustReleaseBinaryAsset, RustReleaseBinaryCommand, RustReleaseBinaryOptions } from "./src/rust-binary.ts";
package/lib/index.d.ts CHANGED
@@ -1,8 +1,10 @@
1
1
  export declare const PACKAGE_IDENTIFIER = "@dbx-tools/cli";
2
- export declare const PACKAGE_VERSION = "0.6.186";
2
+ export declare const PACKAGE_VERSION = "0.6.188";
3
3
  export * as bootstrap from "./src/bootstrap.ts";
4
4
  export * as bun from "./src/bun.ts";
5
5
  export * as cli from "./src/cli.ts";
6
6
  export * as root from "./src/root.ts";
7
+ export * as rustBinary from "./src/rust-binary.ts";
7
8
  export { resolveBunArgv } from "./src/bun.ts";
8
9
  export { workspaceRoot } from "./src/root.ts";
10
+ export type { RustReleaseBinaryAsset, RustReleaseBinaryCommand, RustReleaseBinaryOptions } from "./src/rust-binary.ts";
package/lib/index.js CHANGED
@@ -2,11 +2,12 @@
2
2
  // Regenerated from the exporting modules in ./src.
3
3
  // Hand edits are overwritten on the next watch; this file is read-only.
4
4
  export const PACKAGE_IDENTIFIER = "@dbx-tools/cli";
5
- export const PACKAGE_VERSION = "0.6.186";
5
+ export const PACKAGE_VERSION = "0.6.188";
6
6
  export * as bootstrap from "./src/bootstrap.js";
7
7
  export * as bun from "./src/bun.js";
8
8
  export * as cli from "./src/cli.js";
9
9
  export * as root from "./src/root.js";
10
+ export * as rustBinary from "./src/rust-binary.js";
10
11
  export { resolveBunArgv } from "./src/bun.js";
11
12
  export { workspaceRoot } from "./src/root.js";
12
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxnQkFBZ0IsQ0FBQztBQUNuRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxTQUFTLE1BQU0sb0JBQW9CLENBQUM7QUFDaEQsT0FBTyxLQUFLLEdBQUcsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxLQUFLLEdBQUcsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxLQUFLLElBQUksTUFBTSxlQUFlLENBQUM7QUFDdEMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM5QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sZUFBZSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gR0VORVJBVEVEIGJ5IHByb2plbiB3YXRjaCAtIERPIE5PVCBFRElULlxuLy8gUmVnZW5lcmF0ZWQgZnJvbSB0aGUgZXhwb3J0aW5nIG1vZHVsZXMgaW4gLi9zcmMuXG4vLyBIYW5kIGVkaXRzIGFyZSBvdmVyd3JpdHRlbiBvbiB0aGUgbmV4dCB3YXRjaDsgdGhpcyBmaWxlIGlzIHJlYWQtb25seS5cblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfSURFTlRJRklFUiA9IFwiQGRieC10b29scy9jbGlcIjtcbmV4cG9ydCBjb25zdCBQQUNLQUdFX1ZFUlNJT04gPSBcIjAuNi4xODZcIjtcbmV4cG9ydCAqIGFzIGJvb3RzdHJhcCBmcm9tIFwiLi9zcmMvYm9vdHN0cmFwLnRzXCI7XG5leHBvcnQgKiBhcyBidW4gZnJvbSBcIi4vc3JjL2J1bi50c1wiO1xuZXhwb3J0ICogYXMgY2xpIGZyb20gXCIuL3NyYy9jbGkudHNcIjtcbmV4cG9ydCAqIGFzIHJvb3QgZnJvbSBcIi4vc3JjL3Jvb3QudHNcIjtcbmV4cG9ydCB7IHJlc29sdmVCdW5Bcmd2IH0gZnJvbSBcIi4vc3JjL2J1bi50c1wiO1xuZXhwb3J0IHsgd29ya3NwYWNlUm9vdCB9IGZyb20gXCIuL3NyYy9yb290LnRzXCI7XG4iXX0=
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxnQkFBZ0IsQ0FBQztBQUNuRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxTQUFTLE1BQU0sb0JBQW9CLENBQUM7QUFDaEQsT0FBTyxLQUFLLEdBQUcsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxLQUFLLEdBQUcsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxLQUFLLElBQUksTUFBTSxlQUFlLENBQUM7QUFDdEMsT0FBTyxLQUFLLFVBQVUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzlDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxlQUFlLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBHRU5FUkFURUQgYnkgcHJvamVuIHdhdGNoIC0gRE8gTk9UIEVESVQuXG4vLyBSZWdlbmVyYXRlZCBmcm9tIHRoZSBleHBvcnRpbmcgbW9kdWxlcyBpbiAuL3NyYy5cbi8vIEhhbmQgZWRpdHMgYXJlIG92ZXJ3cml0dGVuIG9uIHRoZSBuZXh0IHdhdGNoOyB0aGlzIGZpbGUgaXMgcmVhZC1vbmx5LlxuXG5leHBvcnQgY29uc3QgUEFDS0FHRV9JREVOVElGSUVSID0gXCJAZGJ4LXRvb2xzL2NsaVwiO1xuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfVkVSU0lPTiA9IFwiMC42LjE4OFwiO1xuZXhwb3J0ICogYXMgYm9vdHN0cmFwIGZyb20gXCIuL3NyYy9ib290c3RyYXAudHNcIjtcbmV4cG9ydCAqIGFzIGJ1biBmcm9tIFwiLi9zcmMvYnVuLnRzXCI7XG5leHBvcnQgKiBhcyBjbGkgZnJvbSBcIi4vc3JjL2NsaS50c1wiO1xuZXhwb3J0ICogYXMgcm9vdCBmcm9tIFwiLi9zcmMvcm9vdC50c1wiO1xuZXhwb3J0ICogYXMgcnVzdEJpbmFyeSBmcm9tIFwiLi9zcmMvcnVzdC1iaW5hcnkudHNcIjtcbmV4cG9ydCB7IHJlc29sdmVCdW5Bcmd2IH0gZnJvbSBcIi4vc3JjL2J1bi50c1wiO1xuZXhwb3J0IHsgd29ya3NwYWNlUm9vdCB9IGZyb20gXCIuL3NyYy9yb290LnRzXCI7XG5leHBvcnQgdHlwZSB7IFJ1c3RSZWxlYXNlQmluYXJ5QXNzZXQsIFJ1c3RSZWxlYXNlQmluYXJ5Q29tbWFuZCwgUnVzdFJlbGVhc2VCaW5hcnlPcHRpb25zIH0gZnJvbSBcIi4vc3JjL3J1c3QtYmluYXJ5LnRzXCI7XG4iXX0=
@@ -0,0 +1,49 @@
1
+ export declare const RUST_RELEASE_BINARY_COMMANDS: readonly [{
2
+ readonly command: "lakebase-proxy";
3
+ readonly description: "Loopback PostgreSQL proxy for Databricks Lakebase";
4
+ readonly binaryName: "dbx-lakebase-proxy";
5
+ readonly repository: "https://github.com/reggie-db/dbx-tools";
6
+ readonly assets: readonly [{
7
+ readonly os: "linux";
8
+ readonly cpu: "x64";
9
+ readonly name: "dbx-lakebase-proxy-linux-x64-gnu.tar.gz";
10
+ }, {
11
+ readonly os: "linux";
12
+ readonly cpu: "arm64";
13
+ readonly name: "dbx-lakebase-proxy-linux-arm64-gnu.tar.gz";
14
+ }, {
15
+ readonly os: "darwin";
16
+ readonly cpu: "x64";
17
+ readonly name: "dbx-lakebase-proxy-darwin-x64.tar.gz";
18
+ }, {
19
+ readonly os: "darwin";
20
+ readonly cpu: "arm64";
21
+ readonly name: "dbx-lakebase-proxy-darwin-arm64.tar.gz";
22
+ }];
23
+ }, {
24
+ readonly command: "model-proxy";
25
+ readonly description: "Multi-protocol Databricks model proxy";
26
+ readonly binaryName: "dbx-model-proxy";
27
+ readonly repository: "https://github.com/reggie-db/dbx-tools";
28
+ readonly assets: readonly [{
29
+ readonly os: "linux";
30
+ readonly cpu: "x64";
31
+ readonly name: "dbx-model-proxy-linux-x64-gnu.tar.gz";
32
+ }, {
33
+ readonly os: "linux";
34
+ readonly cpu: "arm64";
35
+ readonly name: "dbx-model-proxy-linux-arm64-gnu.tar.gz";
36
+ }, {
37
+ readonly os: "darwin";
38
+ readonly cpu: "x64";
39
+ readonly name: "dbx-model-proxy-darwin-x64.tar.gz";
40
+ }, {
41
+ readonly os: "darwin";
42
+ readonly cpu: "arm64";
43
+ readonly name: "dbx-model-proxy-darwin-arm64.tar.gz";
44
+ }, {
45
+ readonly os: "win32";
46
+ readonly cpu: "x64";
47
+ readonly name: "dbx-model-proxy-win32-x64-msvc.zip";
48
+ }];
49
+ }];
@@ -0,0 +1,66 @@
1
+ // GENERATED by projen - DO NOT EDIT.
2
+ // Rust release package options are the source of truth.
3
+ export const RUST_RELEASE_BINARY_COMMANDS = [
4
+ {
5
+ "command": "lakebase-proxy",
6
+ "description": "Loopback PostgreSQL proxy for Databricks Lakebase",
7
+ "binaryName": "dbx-lakebase-proxy",
8
+ "repository": "https://github.com/reggie-db/dbx-tools",
9
+ "assets": [
10
+ {
11
+ "os": "linux",
12
+ "cpu": "x64",
13
+ "name": "dbx-lakebase-proxy-linux-x64-gnu.tar.gz"
14
+ },
15
+ {
16
+ "os": "linux",
17
+ "cpu": "arm64",
18
+ "name": "dbx-lakebase-proxy-linux-arm64-gnu.tar.gz"
19
+ },
20
+ {
21
+ "os": "darwin",
22
+ "cpu": "x64",
23
+ "name": "dbx-lakebase-proxy-darwin-x64.tar.gz"
24
+ },
25
+ {
26
+ "os": "darwin",
27
+ "cpu": "arm64",
28
+ "name": "dbx-lakebase-proxy-darwin-arm64.tar.gz"
29
+ }
30
+ ]
31
+ },
32
+ {
33
+ "command": "model-proxy",
34
+ "description": "Multi-protocol Databricks model proxy",
35
+ "binaryName": "dbx-model-proxy",
36
+ "repository": "https://github.com/reggie-db/dbx-tools",
37
+ "assets": [
38
+ {
39
+ "os": "linux",
40
+ "cpu": "x64",
41
+ "name": "dbx-model-proxy-linux-x64-gnu.tar.gz"
42
+ },
43
+ {
44
+ "os": "linux",
45
+ "cpu": "arm64",
46
+ "name": "dbx-model-proxy-linux-arm64-gnu.tar.gz"
47
+ },
48
+ {
49
+ "os": "darwin",
50
+ "cpu": "x64",
51
+ "name": "dbx-model-proxy-darwin-x64.tar.gz"
52
+ },
53
+ {
54
+ "os": "darwin",
55
+ "cpu": "arm64",
56
+ "name": "dbx-model-proxy-darwin-arm64.tar.gz"
57
+ },
58
+ {
59
+ "os": "win32",
60
+ "cpu": "x64",
61
+ "name": "dbx-model-proxy-win32-x64-msvc.zip"
62
+ }
63
+ ]
64
+ }
65
+ ];
66
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX3J1c3QtcmVsZWFzZS1iaW5hcmllcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fcnVzdC1yZWxlYXNlLWJpbmFyaWVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHFDQUFxQztBQUNyQyx3REFBd0Q7QUFFeEQsTUFBTSxDQUFDLE1BQU0sNEJBQTRCLEdBQUc7SUFDMUM7UUFDRSxTQUFTLEVBQUUsZ0JBQWdCO1FBQzNCLGFBQWEsRUFBRSxtREFBbUQ7UUFDbEUsWUFBWSxFQUFFLG9CQUFvQjtRQUNsQyxZQUFZLEVBQUUsd0NBQXdDO1FBQ3RELFFBQVEsRUFBRTtZQUNSO2dCQUNFLElBQUksRUFBRSxPQUFPO2dCQUNiLEtBQUssRUFBRSxLQUFLO2dCQUNaLE1BQU0sRUFBRSx5Q0FBeUM7YUFDbEQ7WUFDRDtnQkFDRSxJQUFJLEVBQUUsT0FBTztnQkFDYixLQUFLLEVBQUUsT0FBTztnQkFDZCxNQUFNLEVBQUUsMkNBQTJDO2FBQ3BEO1lBQ0Q7Z0JBQ0UsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsS0FBSyxFQUFFLEtBQUs7Z0JBQ1osTUFBTSxFQUFFLHNDQUFzQzthQUMvQztZQUNEO2dCQUNFLElBQUksRUFBRSxRQUFRO2dCQUNkLEtBQUssRUFBRSxPQUFPO2dCQUNkLE1BQU0sRUFBRSx3Q0FBd0M7YUFDakQ7U0FDRjtLQUNGO0lBQ0Q7UUFDRSxTQUFTLEVBQUUsYUFBYTtRQUN4QixhQUFhLEVBQUUsdUNBQXVDO1FBQ3RELFlBQVksRUFBRSxpQkFBaUI7UUFDL0IsWUFBWSxFQUFFLHdDQUF3QztRQUN0RCxRQUFRLEVBQUU7WUFDUjtnQkFDRSxJQUFJLEVBQUUsT0FBTztnQkFDYixLQUFLLEVBQUUsS0FBSztnQkFDWixNQUFNLEVBQUUsc0NBQXNDO2FBQy9DO1lBQ0Q7Z0JBQ0UsSUFBSSxFQUFFLE9BQU87Z0JBQ2IsS0FBSyxFQUFFLE9BQU87Z0JBQ2QsTUFBTSxFQUFFLHdDQUF3QzthQUNqRDtZQUNEO2dCQUNFLElBQUksRUFBRSxRQUFRO2dCQUNkLEtBQUssRUFBRSxLQUFLO2dCQUNaLE1BQU0sRUFBRSxtQ0FBbUM7YUFDNUM7WUFDRDtnQkFDRSxJQUFJLEVBQUUsUUFBUTtnQkFDZCxLQUFLLEVBQUUsT0FBTztnQkFDZCxNQUFNLEVBQUUscUNBQXFDO2FBQzlDO1lBQ0Q7Z0JBQ0UsSUFBSSxFQUFFLE9BQU87Z0JBQ2IsS0FBSyxFQUFFLEtBQUs7Z0JBQ1osTUFBTSxFQUFFLG9DQUFvQzthQUM3QztTQUNGO0tBQ0Y7Q0FDTyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gR0VORVJBVEVEIGJ5IHByb2plbiAtIERPIE5PVCBFRElULlxuLy8gUnVzdCByZWxlYXNlIHBhY2thZ2Ugb3B0aW9ucyBhcmUgdGhlIHNvdXJjZSBvZiB0cnV0aC5cblxuZXhwb3J0IGNvbnN0IFJVU1RfUkVMRUFTRV9CSU5BUllfQ09NTUFORFMgPSBbXG4gIHtcbiAgICBcImNvbW1hbmRcIjogXCJsYWtlYmFzZS1wcm94eVwiLFxuICAgIFwiZGVzY3JpcHRpb25cIjogXCJMb29wYmFjayBQb3N0Z3JlU1FMIHByb3h5IGZvciBEYXRhYnJpY2tzIExha2ViYXNlXCIsXG4gICAgXCJiaW5hcnlOYW1lXCI6IFwiZGJ4LWxha2ViYXNlLXByb3h5XCIsXG4gICAgXCJyZXBvc2l0b3J5XCI6IFwiaHR0cHM6Ly9naXRodWIuY29tL3JlZ2dpZS1kYi9kYngtdG9vbHNcIixcbiAgICBcImFzc2V0c1wiOiBbXG4gICAgICB7XG4gICAgICAgIFwib3NcIjogXCJsaW51eFwiLFxuICAgICAgICBcImNwdVwiOiBcIng2NFwiLFxuICAgICAgICBcIm5hbWVcIjogXCJkYngtbGFrZWJhc2UtcHJveHktbGludXgteDY0LWdudS50YXIuZ3pcIlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJvc1wiOiBcImxpbnV4XCIsXG4gICAgICAgIFwiY3B1XCI6IFwiYXJtNjRcIixcbiAgICAgICAgXCJuYW1lXCI6IFwiZGJ4LWxha2ViYXNlLXByb3h5LWxpbnV4LWFybTY0LWdudS50YXIuZ3pcIlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJvc1wiOiBcImRhcndpblwiLFxuICAgICAgICBcImNwdVwiOiBcIng2NFwiLFxuICAgICAgICBcIm5hbWVcIjogXCJkYngtbGFrZWJhc2UtcHJveHktZGFyd2luLXg2NC50YXIuZ3pcIlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJvc1wiOiBcImRhcndpblwiLFxuICAgICAgICBcImNwdVwiOiBcImFybTY0XCIsXG4gICAgICAgIFwibmFtZVwiOiBcImRieC1sYWtlYmFzZS1wcm94eS1kYXJ3aW4tYXJtNjQudGFyLmd6XCJcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImNvbW1hbmRcIjogXCJtb2RlbC1wcm94eVwiLFxuICAgIFwiZGVzY3JpcHRpb25cIjogXCJNdWx0aS1wcm90b2NvbCBEYXRhYnJpY2tzIG1vZGVsIHByb3h5XCIsXG4gICAgXCJiaW5hcnlOYW1lXCI6IFwiZGJ4LW1vZGVsLXByb3h5XCIsXG4gICAgXCJyZXBvc2l0b3J5XCI6IFwiaHR0cHM6Ly9naXRodWIuY29tL3JlZ2dpZS1kYi9kYngtdG9vbHNcIixcbiAgICBcImFzc2V0c1wiOiBbXG4gICAgICB7XG4gICAgICAgIFwib3NcIjogXCJsaW51eFwiLFxuICAgICAgICBcImNwdVwiOiBcIng2NFwiLFxuICAgICAgICBcIm5hbWVcIjogXCJkYngtbW9kZWwtcHJveHktbGludXgteDY0LWdudS50YXIuZ3pcIlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJvc1wiOiBcImxpbnV4XCIsXG4gICAgICAgIFwiY3B1XCI6IFwiYXJtNjRcIixcbiAgICAgICAgXCJuYW1lXCI6IFwiZGJ4LW1vZGVsLXByb3h5LWxpbnV4LWFybTY0LWdudS50YXIuZ3pcIlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJvc1wiOiBcImRhcndpblwiLFxuICAgICAgICBcImNwdVwiOiBcIng2NFwiLFxuICAgICAgICBcIm5hbWVcIjogXCJkYngtbW9kZWwtcHJveHktZGFyd2luLXg2NC50YXIuZ3pcIlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJvc1wiOiBcImRhcndpblwiLFxuICAgICAgICBcImNwdVwiOiBcImFybTY0XCIsXG4gICAgICAgIFwibmFtZVwiOiBcImRieC1tb2RlbC1wcm94eS1kYXJ3aW4tYXJtNjQudGFyLmd6XCJcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwib3NcIjogXCJ3aW4zMlwiLFxuICAgICAgICBcImNwdVwiOiBcIng2NFwiLFxuICAgICAgICBcIm5hbWVcIjogXCJkYngtbW9kZWwtcHJveHktd2luMzIteDY0LW1zdmMuemlwXCJcbiAgICAgIH1cbiAgICBdXG4gIH1cbl0gYXMgY29uc3Q7Il19
package/lib/src/cli.js CHANGED
@@ -16,6 +16,7 @@ import { Command } from "commander";
16
16
  import { bootstrapWorkspace, ensureEngineCurrent, runInitialSynth, seedToolchain, } from "./bootstrap.js";
17
17
  import { ensureWorkspaceReady, runBun, runProjen } from "./bun.js";
18
18
  import { findWorkspaceRoot, needsBootstrap, needsToolchain } from "./root.js";
19
+ import { runRustReleaseBinary, rustReleaseBinaryCommands, } from "./rust-binary.js";
19
20
  /** Commands the bin exposes, and the names help is rendered under. */
20
21
  const PROGRAM_NAMES = ["dbx", "dbx-tools"];
21
22
  /**
@@ -67,11 +68,23 @@ function addForwardedCommand(program, name, description, load) {
67
68
  await buildProgram(`${program.name()} ${name}`).parseAsync(args, { from: "user" });
68
69
  });
69
70
  }
71
+ function addRustReleaseCommand(program, command) {
72
+ program
73
+ .command(command.command)
74
+ .description(command.description)
75
+ .argument("[args...]", `arguments forwarded to ${command.binaryName}`)
76
+ .allowUnknownOption()
77
+ .allowExcessArguments()
78
+ .helpOption(false)
79
+ .action(async (args) => {
80
+ process.exitCode = await runRustReleaseBinary(command, args);
81
+ });
82
+ }
70
83
  /** Build the `dbx` commander program (no side effects until parsed). */
71
84
  export function buildProgram(name = PROGRAM_NAMES[0]) {
72
85
  const program = new Command()
73
86
  .name(name)
74
- .description("Databricks developer tools: workspace lifecycle, AppKit env, auth, and tunnel")
87
+ .description("Databricks developer tools: workspace lifecycle, AppKit env, auth, tunnels, and native proxies")
75
88
  .showHelpAfterError()
76
89
  .helpOption("-h, --help", `Show ${name} help`);
77
90
  program
@@ -87,6 +100,9 @@ export function buildProgram(name = PROGRAM_NAMES[0]) {
87
100
  addForwardedCommand(program, "appkit", "AppKit helpers (env: print the environment an AppKit app resolves)", async () => (await import("@dbx-tools/cli-appkit-env/cli")).buildProgram);
88
101
  addForwardedCommand(program, "auth", "Authenticate to Databricks and manage OAuth tokens", async () => (await import("@dbx-tools/cli-auth/cli")).buildProgram);
89
102
  addForwardedCommand(program, "tunnel", "Run a public portr tunnel with an email-OTP gate", async () => (await import("@dbx-tools/cli-tunnel/cli")).buildProgram);
103
+ for (const command of rustReleaseBinaryCommands()) {
104
+ addRustReleaseCommand(program, command);
105
+ }
90
106
  return program;
91
107
  }
92
108
  /**
@@ -101,4 +117,4 @@ function programName(argv) {
101
117
  export async function runCli(argv) {
102
118
  await buildProgram(programName(argv)).parseAsync(argv);
103
119
  }
104
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDcEMsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixtQkFBbUIsRUFDbkIsZUFBZSxFQUNmLGFBQWEsR0FDZCxNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ25FLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRTlFLHNFQUFzRTtBQUN0RSxNQUFNLGFBQWEsR0FBRyxDQUFDLEtBQUssRUFBRSxXQUFXLENBQVUsQ0FBQztBQUVwRDs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxtQkFBbUIsQ0FBQyxVQUFvQixFQUFFLFFBQWlCO0lBQy9FLE1BQU0sSUFBSSxHQUFHLE1BQU0saUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDL0MsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUN6QixrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QixPQUFPO0lBQ1QsQ0FBQztJQUNELElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDekIsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BCLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0QixNQUFNLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMxQixPQUFPO0lBQ1QsQ0FBQztJQUNELG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFD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cEUsTUFBTSxDQUFDLEtBQUssVUFBVSxNQUFNLENBQUMsSUFBYztJQUN6QyxNQUFNLFlBQVksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDekQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29tbWFuZGVyIGVudHJ5IGZvciBgZGJ4YCBhbmQgaXRzIGBkYngtdG9vbHNgIGFsaWFzLlxuICpcbiAqIGBkZXZgIGJvb3RzdHJhcHMgb3IgcmVwYWlycyBhIHdvcmtzcGFjZSBhbmQgZm9yd2FyZHMgdG8gcHJvamVuLlxuICogYGFwcGtpdGAgcHJvdmlkZXMgQXBwS2l0IGVudmlyb25tZW50IGhlbHBlcnMuXG4gKiBgYXV0aGAgbWFuYWdlcyBEYXRhYnJpY2tzIE9BdXRoIGFuZCBhY2Nlc3MgdG9rZW5zLlxuICogYHR1bm5lbGAgcnVucyBhIHB1YmxpYyBwb3J0ciB0dW5uZWwgd2l0aCBwYXNzd29yZGxlc3MgYWNjZXNzIGdhdGluZy5cbiAqXG4gKiBGZWF0dXJlIGNvbW1hbmRzIGxvYWQgdGhlaXIgc2libGluZyBwYWNrYWdlcyBvbmx5IHdoZW4gc2VsZWN0ZWQgYW5kIGZvcndhcmRcbiAqIHRoZWlyIGNvbXBsZXRlIGFyZ3VtZW50IGxpc3QsIGluY2x1ZGluZyBgLS1oZWxwYC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cbmltcG9ydCB7IGJhc2VuYW1lIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIjtcbmltcG9ydCB7XG4gIGJvb3RzdHJhcFdvcmtzcGFjZSxcbiAgZW5zdXJlRW5naW5lQ3VycmVudCxcbiAgcnVuSW5pdGlhbFN5bnRoLFxuICBzZWVkVG9vbGNoYWluLFxufSBmcm9tIFwiLi9ib290c3RyYXAudHNcIjtcbmltcG9ydCB7IGVuc3VyZVdvcmtzcGFjZVJlYWR5LCBydW5CdW4sIHJ1blByb2plbiB9IGZyb20gXCIuL2J1bi50c1wiO1xuaW1wb3J0IHsgZmluZFdvcmtzcGFjZVJvb3QsIG5lZWRzQm9vdHN0cmFwLCBuZWVkc1Rvb2xjaGFpbiB9IGZyb20gXCIuL3Jvb3QudHNcIjtcblxuLyoqIENvbW1hbmRzIHRoZSBiaW4gZXhwb3NlcywgYW5kIHRoZSBuYW1lcyBoZWxwIGlzIHJlbmRlcmVkIHVuZGVyLiAqL1xuY29uc3QgUFJPR1JBTV9OQU1FUyA9IFtcImRieFwiLCBcImRieC10b29sc1wiXSBhcyBjb25zdDtcblxuLyoqXG4gKiBQcmVwYXJlIHRoZSB3b3Jrc3BhY2UgYXQgYHJvb3RgLCB0aGVuIHJ1biBwcm9qZW4gKHZpYSBidW4pIHdpdGggYHByb2plbkFyZ3NgLlxuICpcbiAqIFRocmVlIGNhc2VzLCBpbiBvcmRlcjpcbiAqICAgLSBubyBgLnByb2plbnJjLnRzYCBhdCBhbGwgLT4gZnVsbCBib290c3RyYXAgKHNjYWZmb2xkICsgaW5zdGFsbCArIHN5bnRoKSxcbiAqICAgICB3aGljaCBhbHJlYWR5IHJ1bnMgdGhlIGluaXRpYWwgc3ludGg7IG5vdGhpbmcgbW9yZSB0byBmb3J3YXJkLlxuICogICAtIGEgYC5wcm9qZW5yYy50c2AgYnV0IHRoZSBlbmdpbmUvdG9vbGNoYWluIGlzbid0IGluc3RhbGxlZCAoZS5nLiBhIGZyZXNobHlcbiAqICAgICBjb3BpZWQgcHJvamVjdCB3aG9zZSBnZW5lcmF0ZWQgZmlsZXMgKyBtYW5pZmVzdHMgYXJlIGdpdGlnbm9yZWQpIC0+IHNlZWRcbiAqICAgICB0aGUgdG9vbGNoYWluLCB0aGVuIHJ1biB0aGUgSU5JVElBTCBzeW50aCBkaXJlY3RseSAodGhlIHByb2plbiB0YXNrcyB0aGVcbiAqICAgICBhcmdzIHdvdWxkIG5hbWUsIGxpa2UgYHN5bmNgLCBkb24ndCBleGlzdCB1bnRpbCBgLnByb2plbnJjLnRzYCBoYXMgcnVuXG4gKiAgICAgb25jZSksIGFuZCBpbnN0YWxsLiBEb24ndCBmb3J3YXJkIGBwcm9qZW5BcmdzYCAtIHRoZSBzeW50aCBpcyB0aGUgd29yay5cbiAqICAgLSBvdGhlcndpc2UgKGVzdGFibGlzaGVkIHdvcmtzcGFjZSkgLT4gZW5zdXJlIGRlcHMsIGJyaW5nIHRoZSBlbmdpbmUgdXAgdG9cbiAqICAgICB0aGlzIENMSSdzIHZlcnNpb24sIHRoZW4gZm9yd2FyZCB0byBwcm9qZW4uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcmVwYXJlQW5kUnVuUHJvamVuKHByb2plbkFyZ3M6IHN0cmluZ1tdLCBzdGFydERpcj86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByb290ID0gYXdhaXQgZmluZFdvcmtzcGFjZVJvb3Qoc3RhcnREaXIpO1xuICBpZiAobmVlZHNCb290c3RyYXAocm9vdCkpIHtcbiAgICBib290c3RyYXBXb3Jrc3BhY2Uocm9vdCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChuZWVkc1Rvb2xjaGFpbihyb290KSkge1xuICAgIHNlZWRUb29sY2hhaW4ocm9vdCk7XG4gICAgcnVuSW5pdGlhbFN5bnRoKHJvb3QpO1xuICAgIHJ1bkJ1bihbXCJpbnN0YWxsXCJdLCByb290KTtcbiAgICByZXR1cm47XG4gIH1cbiAgZW5zdXJlV29ya3NwYWNlUmVhZHkocm9vdCk7XG4gIGVuc3VyZUVuZ2luZUN1cnJlbnQocm9vdCk7XG4gIHJ1blByb2plbihwcm9qZW5BcmdzLCByb290KTtcbn1cblxuLyoqXG4gKiBNb3VudCBgbmFtZWAgYXMgYSBjb21tYW5kIHRoYXQgY2FwdHVyZXMgZXZlcnkgZm9sbG93aW5nIHRva2VuIHZlcmJhdGltIGFuZFxuICogaGFuZHMgaXQgdG8gdGhlIHByb2dyYW0gYGxvYWQoKWAgcmVzb2x2ZXMuIGBoZWxwT3B0aW9uKGZhbHNlKWAgaXMgd2hhdCBsZXRzXG4gKiBgLS1oZWxwYCB0aHJvdWdoIHRvIHRoZSBjaGlsZCBpbnN0ZWFkIG9mIGJlaW5nIGFuc3dlcmVkIGhlcmUsIGFuZCB0aGUgY2hpbGRcbiAqIHByb2dyYW0gb3ducyBpdHMgb3duIGZsYWdzLCBzbyB0aGlzIHdyYXBwZXIgbmV2ZXIgaGFzIHRvIHJlc3RhdGUgdGhlbS5cbiAqL1xuZnVuY3Rpb24gYWRkRm9yd2FyZGVkQ29tbWFuZChcbiAgcHJvZ3JhbTogQ29tbWFuZCxcbiAgbmFtZTogc3RyaW5nLFxuICBkZXNjcmlwdGlvbjogc3RyaW5nLFxuICBsb2FkOiAoKSA9PiBQcm9taXNlPChuYW1lOiBzdHJpbmcpID0+IENvbW1hbmQ+LFxuKTogdm9pZCB7XG4gIHByb2dyYW1cbiAgICAuY29tbWFuZChuYW1lKVxuICAgIC5kZXNjcmlwdGlvbihkZXNjcmlwdGlvbilcbiAgICAuYXJndW1lbnQoXCJbYXJncy4uLl1cIiwgYGFyZ3VtZW50cyBmb3J3YXJkZWQgdG8gJHtuYW1lfWApXG4gICAgLmFsbG93VW5rbm93bk9wdGlvbigpXG4gICAgLmFsbG93RXhjZXNzQXJndW1lbnRzKClcbiAgICAuaGVscE9wdGlvbihmYWxzZSlcbiAgICAuYWN0aW9uKGFzeW5jIChhcmdzOiBzdHJpbmdbXSkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRQcm9ncmFtID0gYXdhaXQgbG9hZCgpO1xuICAgICAgYXdhaXQgYnVpbGRQcm9ncmFtKGAke3Byb2dyYW0ubmFtZSgpfSAke25hbWV9YCkucGFyc2VBc3luYyhhcmdzLCB7IGZyb206IFwidXNlclwiIH0pO1xuICAgIH0pO1xufVxuXG4vKiogQnVpbGQgdGhlIGBkYnhgIGNvbW1hbmRlciBwcm9ncmFtIChubyBzaWRlIGVmZmVjdHMgdW50aWwgcGFyc2VkKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFByb2dyYW0obmFtZTogc3RyaW5nID0gUFJPR1JBTV9OQU1FU1swXSk6IENvbW1hbmQge1xuICBjb25zdCBwcm9ncmFtID0gbmV3IENvbW1hbmQoKVxuICAgIC5uYW1lKG5hbWUpXG4gICAgLmRlc2NyaXB0aW9uKFwiRGF0YWJyaWNrcyBkZXZlbG9wZXIgdG9vbHM6IHdvcmtzcGFjZSBsaWZlY3ljbGUsIEFwcEtpdCBlbnYsIGF1dGgsIGFuZCB0dW5uZWxcIilcbiAgICAuc2hvd0hlbHBBZnRlckVycm9yKClcbiAgICAuaGVscE9wdGlvbihcIi1oLCAtLWhlbHBcIiwgYFNob3cgJHtuYW1lfSBoZWxwYCk7XG5cbiAgcHJvZ3JhbVxuICAgIC5jb21tYW5kKFwiZGV2XCIpXG4gICAgLmRlc2NyaXB0aW9uKFwiQm9vdHN0cmFwIG9yIHJlcGFpciBhIGRieC10b29scyB3b3Jrc3BhY2UsIHRoZW4gZm9yd2FyZCB0byBwcm9qZW5cIilcbiAgICAuYXJndW1lbnQoXCJbcHJvamVuQXJncy4uLl1cIiwgXCJwcm9qZW4gdGFzayBhbmQgYXJndW1lbnRzIChlLmcuIHN5bmMgLS13YXRjaClcIilcbiAgICAuYWxsb3dVbmtub3duT3B0aW9uKClcbiAgICAuYWxsb3dFeGNlc3NBcmd1bWVudHMoKVxuICAgIC5oZWxwT3B0aW9uKGZhbHNlKVxuICAgIC5hY3Rpb24oYXN5bmMgKHByb2plbkFyZ3M6IHN0cmluZ1tdKSA9PiB7XG4gICAgICBhd2FpdCBwcmVwYXJlQW5kUnVuUHJvamVuKHByb2plbkFyZ3MpO1xuICAgIH0pO1xuXG4gIGFkZEZvcndhcmRlZENvbW1hbmQoXG4gICAgcHJvZ3JhbSxcbiAgICBcImFwcGtpdFwiLFxuICAgIFwiQXBwS2l0IGhlbHBlcnMgKGVudjogcHJpbnQgdGhlIGVudmlyb25tZW50IGFuIEFwcEtpdCBhcHAgcmVzb2x2ZXMpXCIsXG4gICAgYXN5bmMgKCkgPT4gKGF3YWl0IGltcG9ydChcIkBkYngtdG9vbHMvY2xpLWFwcGtpdC1lbnYvY2xpXCIpKS5idWlsZFByb2dyYW0sXG4gICk7XG5cbiAgYWRkRm9yd2FyZGVkQ29tbWFuZChcbiAgICBwcm9ncmFtLFxuICAgIFwiYXV0aFwiLFxuICAgIFwiQXV0aGVudGljYXRlIHRvIERhdGFicmlja3MgYW5kIG1hbmFnZSBPQXV0aCB0b2tlbnNcIixcbiAgICBhc3luYyAoKSA9PiAoYXdhaXQgaW1wb3J0KFwiQGRieC10b29scy9jbGktYXV0aC9jbGlcIikpLmJ1aWxkUHJvZ3JhbSxcbiAgKTtcblxuICBhZGRGb3J3YXJkZWRDb21tYW5kKFxuICAgIHByb2dyYW0sXG4gICAgXCJ0dW5uZWxcIixcbiAgICBcIlJ1biBhIHB1YmxpYyBwb3J0ciB0dW5uZWwgd2l0aCBhbiBlbWFpbC1PVFAgZ2F0ZVwiLFxuICAgIGFzeW5jICgpID0+IChhd2FpdCBpbXBvcnQoXCJAZGJ4LXRvb2xzL2NsaS10dW5uZWwvY2xpXCIpKS5idWlsZFByb2dyYW0sXG4gICk7XG5cbiAgcmV0dXJuIHByb2dyYW07XG59XG5cbi8qKlxuICogUHJvZ3JhbSBuYW1lIGZvciBoZWxwIG91dHB1dDogd2hpY2hldmVyIGJpbiB0aGUgdXNlciBhY3R1YWxseSB0eXBlZCwgc29cbiAqIGBkYngtdG9vbHMgLS1oZWxwYCBkb2Vzbid0IGRvY3VtZW50IGl0c2VsZiBhcyBgZGJ4YC4gRmFsbHMgYmFjayB0byBgZGJ4YC5cbiAqL1xuZnVuY3Rpb24gcHJvZ3JhbU5hbWUoYXJndjogc3RyaW5nW10pOiBzdHJpbmcge1xuICBjb25zdCBpbnZva2VkID0gYXJndlsxXSA/IGJhc2VuYW1lKGFyZ3ZbMV0pLnJlcGxhY2UoL1xcLig/OltjbV0/W2p0XXMpJC8sIFwiXCIpIDogdW5kZWZpbmVkO1xuICByZXR1cm4gUFJPR1JBTV9OQU1FUy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZSA9PT0gaW52b2tlZCkgPz8gUFJPR1JBTV9OQU1FU1swXTtcbn1cblxuLyoqIFBhcnNlIGBhcmd2YCAoYSBgcHJvY2Vzcy5hcmd2YCkgYW5kIHJ1biB0aGUgbWF0Y2hpbmcgY29tbWFuZC4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5DbGkoYXJndjogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgYnVpbGRQcm9ncmFtKHByb2dyYW1OYW1lKGFyZ3YpKS5wYXJzZUFzeW5jKGFyZ3YpO1xufVxuIl19
120
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDcEMsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixtQkFBbUIsRUFDbkIsZUFBZSxFQUNmLGFBQWEsR0FDZCxNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ25FLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzlFLE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIseUJBQXlCLEdBRTFCLE1BQU0sa0JBQWtCLENBQUM7QUFFMUIsc0VBQXNFO0FBQ3RFLE1BQU0sYUFBYSxHQUFHLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBVSxDQUFDO0FBRXBEOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLG1CQUFtQixDQUFDLFVBQW9CLEVBQUUsUUFBaUI7SUFDL0UsTUFBTSxJQUFJLEdBQUcsTUFBTSxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMvQyxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3pCLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pCLE9BQU87SUFDVCxDQUFDO0lBQ0QsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUN6QixhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEIsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RCLE1BQU0sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUksQ0FB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a0QsRUFDbEQsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sTUFBTSxDQUFDLDJCQUEyQixDQUFDLENBQUMsQ0FBQyxZQUFZLENBQ3JFLENBQUM7SUFFRixLQUFLLE1BQU0sT0FBTyxJQUFJLHlCQUF5QixFQUFFLEVBQUUsQ0FBQztRQUNsRCxxQkFBcUIsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVELE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFTLFdBQVcsQ0FBQyxJQUFjO0lBQ2pDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3pGLE9BQU8sYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsU0FBUyxLQUFLLE9BQU8sQ0FBQyxJQUFJLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0RixDQUFDO0FBRUQsb0VBQW9FO0FBQ3BFLE1BQU0sQ0FBQyxLQUFLLFVBQVUsTUFBTSxDQUFDLElBQWM7SUFDekMsTUFBTSxZQUFZLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3pELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbW1hbmRlciBlbnRyeSBmb3IgYGRieGAgYW5kIGl0cyBgZGJ4LXRvb2xzYCBhbGlhcy5cbiAqXG4gKiBgZGV2YCBib290c3RyYXBzIG9yIHJlcGFpcnMgYSB3b3Jrc3BhY2UgYW5kIGZvcndhcmRzIHRvIHByb2plbi5cbiAqIGBhcHBraXRgIHByb3ZpZGVzIEFwcEtpdCBlbnZpcm9ubWVudCBoZWxwZXJzLlxuICogYGF1dGhgIG1hbmFnZXMgRGF0YWJyaWNrcyBPQXV0aCBhbmQgYWNjZXNzIHRva2Vucy5cbiAqIGB0dW5uZWxgIHJ1bnMgYSBwdWJsaWMgcG9ydHIgdHVubmVsIHdpdGggcGFzc3dvcmRsZXNzIGFjY2VzcyBnYXRpbmcuXG4gKlxuICogRmVhdHVyZSBjb21tYW5kcyBsb2FkIHRoZWlyIHNpYmxpbmcgcGFja2FnZXMgb25seSB3aGVuIHNlbGVjdGVkIGFuZCBmb3J3YXJkXG4gKiB0aGVpciBjb21wbGV0ZSBhcmd1bWVudCBsaXN0LCBpbmNsdWRpbmcgYC0taGVscGAuXG4gKlxuICogQG1vZHVsZVxuICovXG5pbXBvcnQgeyBiYXNlbmFtZSB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCI7XG5pbXBvcnQge1xuICBib290c3RyYXBXb3Jrc3BhY2UsXG4gIGVuc3VyZUVuZ2luZUN1cnJlbnQsXG4gIHJ1bkluaXRpYWxTeW50aCxcbiAgc2VlZFRvb2xjaGFpbixcbn0gZnJvbSBcIi4vYm9vdHN0cmFwLnRzXCI7XG5pbXBvcnQgeyBlbnN1cmVXb3Jrc3BhY2VSZWFkeSwgcnVuQnVuLCBydW5Qcm9qZW4gfSBmcm9tIFwiLi9idW4udHNcIjtcbmltcG9ydCB7IGZpbmRXb3Jrc3BhY2VSb290LCBuZWVkc0Jvb3RzdHJhcCwgbmVlZHNUb29sY2hhaW4gfSBmcm9tIFwiLi9yb290LnRzXCI7XG5pbXBvcnQge1xuICBydW5SdXN0UmVsZWFzZUJpbmFyeSxcbiAgcnVzdFJlbGVhc2VCaW5hcnlDb21tYW5kcyxcbiAgdHlwZSBSdXN0UmVsZWFzZUJpbmFyeUNvbW1hbmQsXG59IGZyb20gXCIuL3J1c3QtYmluYXJ5LnRzXCI7XG5cbi8qKiBDb21tYW5kcyB0aGUgYmluIGV4cG9zZXMsIGFuZCB0aGUgbmFtZXMgaGVscCBpcyByZW5kZXJlZCB1bmRlci4gKi9cbmNvbnN0IFBST0dSQU1fTkFNRVMgPSBbXCJkYnhcIiwgXCJkYngtdG9vbHNcIl0gYXMgY29uc3Q7XG5cbi8qKlxuICogUHJlcGFyZSB0aGUgd29ya3NwYWNlIGF0IGByb290YCwgdGhlbiBydW4gcHJvamVuICh2aWEgYnVuKSB3aXRoIGBwcm9qZW5BcmdzYC5cbiAqXG4gKiBUaHJlZSBjYXNlcywgaW4gb3JkZXI6XG4gKiAgIC0gbm8gYC5wcm9qZW5yYy50c2AgYXQgYWxsIC0+IGZ1bGwgYm9vdHN0cmFwIChzY2FmZm9sZCArIGluc3RhbGwgKyBzeW50aCksXG4gKiAgICAgd2hpY2ggYWxyZWFkeSBydW5zIHRoZSBpbml0aWFsIHN5bnRoOyBub3RoaW5nIG1vcmUgdG8gZm9yd2FyZC5cbiAqICAgLSBhIGAucHJvamVucmMudHNgIGJ1dCB0aGUgZW5naW5lL3Rvb2xjaGFpbiBpc24ndCBpbnN0YWxsZWQgKGUuZy4gYSBmcmVzaGx5XG4gKiAgICAgY29waWVkIHByb2plY3Qgd2hvc2UgZ2VuZXJhdGVkIGZpbGVzICsgbWFuaWZlc3RzIGFyZSBnaXRpZ25vcmVkKSAtPiBzZWVkXG4gKiAgICAgdGhlIHRvb2xjaGFpbiwgdGhlbiBydW4gdGhlIElOSVRJQUwgc3ludGggZGlyZWN0bHkgKHRoZSBwcm9qZW4gdGFza3MgdGhlXG4gKiAgICAgYXJncyB3b3VsZCBuYW1lLCBsaWtlIGBzeW5jYCwgZG9uJ3QgZXhpc3QgdW50aWwgYC5wcm9qZW5yYy50c2AgaGFzIHJ1blxuICogICAgIG9uY2UpLCBhbmQgaW5zdGFsbC4gRG9uJ3QgZm9yd2FyZCBgcHJvamVuQXJnc2AgLSB0aGUgc3ludGggaXMgdGhlIHdvcmsuXG4gKiAgIC0gb3RoZXJ3aXNlIChlc3RhYmxpc2hlZCB3b3Jrc3BhY2UpIC0+IGVuc3VyZSBkZXBzLCBicmluZyB0aGUgZW5naW5lIHVwIHRvXG4gKiAgICAgdGhpcyBDTEkncyB2ZXJzaW9uLCB0aGVuIGZvcndhcmQgdG8gcHJvamVuLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJlcGFyZUFuZFJ1blByb2plbihwcm9qZW5BcmdzOiBzdHJpbmdbXSwgc3RhcnREaXI/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qgcm9vdCA9IGF3YWl0IGZpbmRXb3Jrc3BhY2VSb290KHN0YXJ0RGlyKTtcbiAgaWYgKG5lZWRzQm9vdHN0cmFwKHJvb3QpKSB7XG4gICAgYm9vdHN0cmFwV29ya3NwYWNlKHJvb3QpO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAobmVlZHNUb29sY2hhaW4ocm9vdCkpIHtcbiAgICBzZWVkVG9vbGNoYWluKHJvb3QpO1xuICAgIHJ1bkluaXRpYWxTeW50aChyb290KTtcbiAgICBydW5CdW4oW1wiaW5zdGFsbFwiXSwgcm9vdCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGVuc3VyZVdvcmtzcGFjZVJlYWR5KHJvb3QpO1xuICBlbnN1cmVFbmdpbmVDdXJyZW50KHJvb3QpO1xuICBydW5Qcm9qZW4ocHJvamVuQXJncywgcm9vdCk7XG59XG5cbi8qKlxuICogTW91bnQgYG5hbWVgIGFzIGEgY29tbWFuZCB0aGF0IGNhcHR1cmVzIGV2ZXJ5IGZvbGxvd2luZyB0b2tlbiB2ZXJiYXRpbSBhbmRcbiAqIGhhbmRzIGl0IHRvIHRoZSBwcm9ncmFtIGBsb2FkKClgIHJlc29sdmVzLiBgaGVscE9wdGlvbihmYWxzZSlgIGlzIHdoYXQgbGV0c1xuICogYC0taGVscGAgdGhyb3VnaCB0byB0aGUgY2hpbGQgaW5zdGVhZCBvZiBiZWluZyBhbnN3ZXJlZCBoZXJlLCBhbmQgdGhlIGNoaWxkXG4gKiBwcm9ncmFtIG93bnMgaXRzIG93biBmbGFncywgc28gdGhpcyB3cmFwcGVyIG5ldmVyIGhhcyB0byByZXN0YXRlIHRoZW0uXG4gKi9cbmZ1bmN0aW9uIGFkZEZvcndhcmRlZENvbW1hbmQoXG4gIHByb2dyYW06IENvbW1hbmQsXG4gIG5hbWU6IHN0cmluZyxcbiAgZGVzY3JpcHRpb246IHN0cmluZyxcbiAgbG9hZDogKCkgPT4gUHJvbWlzZTwobmFtZTogc3RyaW5nKSA9PiBDb21tYW5kPixcbik6IHZvaWQge1xuICBwcm9ncmFtXG4gICAgLmNvbW1hbmQobmFtZSlcbiAgICAuZGVzY3JpcHRpb24oZGVzY3JpcHRpb24pXG4gICAgLmFyZ3VtZW50KFwiW2FyZ3MuLi5dXCIsIGBhcmd1bWVudHMgZm9yd2FyZGVkIHRvICR7bmFtZX1gKVxuICAgIC5hbGxvd1Vua25vd25PcHRpb24oKVxuICAgIC5hbGxvd0V4Y2Vzc0FyZ3VtZW50cygpXG4gICAgLmhlbHBPcHRpb24oZmFsc2UpXG4gICAgLmFjdGlvbihhc3luYyAoYXJnczogc3RyaW5nW10pID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkUHJvZ3JhbSA9IGF3YWl0IGxvYWQoKTtcbiAgICAgIGF3YWl0IGJ1aWxkUHJvZ3JhbShgJHtwcm9ncmFtLm5hbWUoKX0gJHtuYW1lfWApLnBhcnNlQXN5bmMoYXJncywgeyBmcm9tOiBcInVzZXJcIiB9KTtcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gYWRkUnVzdFJlbGVhc2VDb21tYW5kKHByb2dyYW06IENvbW1hbmQsIGNvbW1hbmQ6IFJ1c3RSZWxlYXNlQmluYXJ5Q29tbWFuZCk6IHZvaWQge1xuICBwcm9ncmFtXG4gICAgLmNvbW1hbmQoY29tbWFuZC5jb21tYW5kKVxuICAgIC5kZXNjcmlwdGlvbihjb21tYW5kLmRlc2NyaXB0aW9uKVxuICAgIC5hcmd1bWVudChcIlthcmdzLi4uXVwiLCBgYXJndW1lbnRzIGZvcndhcmRlZCB0byAke2NvbW1hbmQuYmluYXJ5TmFtZX1gKVxuICAgIC5hbGxvd1Vua25vd25PcHRpb24oKVxuICAgIC5hbGxvd0V4Y2Vzc0FyZ3VtZW50cygpXG4gICAgLmhlbHBPcHRpb24oZmFsc2UpXG4gICAgLmFjdGlvbihhc3luYyAoYXJnczogc3RyaW5nW10pID0+IHtcbiAgICAgIHByb2Nlc3MuZXhpdENvZGUgPSBhd2FpdCBydW5SdXN0UmVsZWFzZUJpbmFyeShjb21tYW5kLCBhcmdzKTtcbiAgICB9KTtcbn1cblxuLyoqIEJ1aWxkIHRoZSBgZGJ4YCBjb21tYW5kZXIgcHJvZ3JhbSAobm8gc2lkZSBlZmZlY3RzIHVudGlsIHBhcnNlZCkuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRQcm9ncmFtKG5hbWU6IHN0cmluZyA9IFBST0dSQU1fTkFNRVNbMF0pOiBDb21tYW5kIHtcbiAgY29uc3QgcHJvZ3JhbSA9IG5ldyBDb21tYW5kKClcbiAgICAubmFtZShuYW1lKVxuICAgIC5kZXNjcmlwdGlvbihcbiAgICAgIFwiRGF0YWJyaWNrcyBkZXZlbG9wZXIgdG9vbHM6IHdvcmtzcGFjZSBsaWZlY3ljbGUsIEFwcEtpdCBlbnYsIGF1dGgsIHR1bm5lbHMsIGFuZCBuYXRpdmUgcHJveGllc1wiLFxuICAgIClcbiAgICAuc2hvd0hlbHBBZnRlckVycm9yKClcbiAgICAuaGVscE9wdGlvbihcIi1oLCAtLWhlbHBcIiwgYFNob3cgJHtuYW1lfSBoZWxwYCk7XG5cbiAgcHJvZ3JhbVxuICAgIC5jb21tYW5kKFwiZGV2XCIpXG4gICAgLmRlc2NyaXB0aW9uKFwiQm9vdHN0cmFwIG9yIHJlcGFpciBhIGRieC10b29scyB3b3Jrc3BhY2UsIHRoZW4gZm9yd2FyZCB0byBwcm9qZW5cIilcbiAgICAuYXJndW1lbnQoXCJbcHJvamVuQXJncy4uLl1cIiwgXCJwcm9qZW4gdGFzayBhbmQgYXJndW1lbnRzIChlLmcuIHN5bmMgLS13YXRjaClcIilcbiAgICAuYWxsb3dVbmtub3duT3B0aW9uKClcbiAgICAuYWxsb3dFeGNlc3NBcmd1bWVudHMoKVxuICAgIC5oZWxwT3B0aW9uKGZhbHNlKVxuICAgIC5hY3Rpb24oYXN5bmMgKHByb2plbkFyZ3M6IHN0cmluZ1tdKSA9PiB7XG4gICAgICBhd2FpdCBwcmVwYXJlQW5kUnVuUHJvamVuKHByb2plbkFyZ3MpO1xuICAgIH0pO1xuXG4gIGFkZEZvcndhcmRlZENvbW1hbmQoXG4gICAgcHJvZ3JhbSxcbiAgICBcImFwcGtpdFwiLFxuICAgIFwiQXBwS2l0IGhlbHBlcnMgKGVudjogcHJpbnQgdGhlIGVudmlyb25tZW50IGFuIEFwcEtpdCBhcHAgcmVzb2x2ZXMpXCIsXG4gICAgYXN5bmMgKCkgPT4gKGF3YWl0IGltcG9ydChcIkBkYngtdG9vbHMvY2xpLWFwcGtpdC1lbnYvY2xpXCIpKS5idWlsZFByb2dyYW0sXG4gICk7XG5cbiAgYWRkRm9yd2FyZGVkQ29tbWFuZChcbiAgICBwcm9ncmFtLFxuICAgIFwiYXV0aFwiLFxuICAgIFwiQXV0aGVudGljYXRlIHRvIERhdGFicmlja3MgYW5kIG1hbmFnZSBPQXV0aCB0b2tlbnNcIixcbiAgICBhc3luYyAoKSA9PiAoYXdhaXQgaW1wb3J0KFwiQGRieC10b29scy9jbGktYXV0aC9jbGlcIikpLmJ1aWxkUHJvZ3JhbSxcbiAgKTtcblxuICBhZGRGb3J3YXJkZWRDb21tYW5kKFxuICAgIHByb2dyYW0sXG4gICAgXCJ0dW5uZWxcIixcbiAgICBcIlJ1biBhIHB1YmxpYyBwb3J0ciB0dW5uZWwgd2l0aCBhbiBlbWFpbC1PVFAgZ2F0ZVwiLFxuICAgIGFzeW5jICgpID0+IChhd2FpdCBpbXBvcnQoXCJAZGJ4LXRvb2xzL2NsaS10dW5uZWwvY2xpXCIpKS5idWlsZFByb2dyYW0sXG4gICk7XG5cbiAgZm9yIChjb25zdCBjb21tYW5kIG9mIHJ1c3RSZWxlYXNlQmluYXJ5Q29tbWFuZHMoKSkge1xuICAgIGFkZFJ1c3RSZWxlYXNlQ29tbWFuZChwcm9ncmFtLCBjb21tYW5kKTtcbiAgfVxuXG4gIHJldHVybiBwcm9ncmFtO1xufVxuXG4vKipcbiAqIFByb2dyYW0gbmFtZSBmb3IgaGVscCBvdXRwdXQ6IHdoaWNoZXZlciBiaW4gdGhlIHVzZXIgYWN0dWFsbHkgdHlwZWQsIHNvXG4gKiBgZGJ4LXRvb2xzIC0taGVscGAgZG9lc24ndCBkb2N1bWVudCBpdHNlbGYgYXMgYGRieGAuIEZhbGxzIGJhY2sgdG8gYGRieGAuXG4gKi9cbmZ1bmN0aW9uIHByb2dyYW1OYW1lKGFyZ3Y6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgY29uc3QgaW52b2tlZCA9IGFyZ3ZbMV0gPyBiYXNlbmFtZShhcmd2WzFdKS5yZXBsYWNlKC9cXC4oPzpbY21dP1tqdF1zKSQvLCBcIlwiKSA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIFBST0dSQU1fTkFNRVMuZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUgPT09IGludm9rZWQpID8/IFBST0dSQU1fTkFNRVNbMF07XG59XG5cbi8qKiBQYXJzZSBgYXJndmAgKGEgYHByb2Nlc3MuYXJndmApIGFuZCBydW4gdGhlIG1hdGNoaW5nIGNvbW1hbmQuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuQ2xpKGFyZ3Y6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGJ1aWxkUHJvZ3JhbShwcm9ncmFtTmFtZShhcmd2KSkucGFyc2VBc3luYyhhcmd2KTtcbn1cbiJdfQ==
@@ -0,0 +1,34 @@
1
+ import { bin } from "@dbx-tools/core";
2
+ /** One release archive available to the current Node runtime. */
3
+ export interface RustReleaseBinaryAsset {
4
+ readonly os: string;
5
+ readonly cpu: string;
6
+ readonly name: string;
7
+ }
8
+ /** Generated registration for one `dbx` Rust command. */
9
+ export interface RustReleaseBinaryCommand {
10
+ readonly command: string;
11
+ readonly description: string;
12
+ readonly binaryName: string;
13
+ readonly repository: string;
14
+ readonly assets: readonly RustReleaseBinaryAsset[];
15
+ }
16
+ /** Overrides used by tests and callers that install under a custom home. */
17
+ export interface RustReleaseBinaryOptions {
18
+ readonly homeDir?: string;
19
+ readonly platform?: NodeJS.Platform;
20
+ readonly arch?: string;
21
+ readonly version?: string;
22
+ }
23
+ /** Return every Rust command registered by the synthesized workspace. */
24
+ export declare function rustReleaseBinaryCommands(): readonly RustReleaseBinaryCommand[];
25
+ /** Resolve one registered Rust command by its `dbx` subcommand. */
26
+ export declare function rustReleaseBinaryCommand(command: string): RustReleaseBinaryCommand;
27
+ /** Select the archive for an OS and CPU pair. */
28
+ export declare function rustReleaseBinaryAsset(command: RustReleaseBinaryCommand, platform: NodeJS.Platform, arch: string): RustReleaseBinaryAsset;
29
+ /** Build the GitHub release URL for a generated archive entry. */
30
+ export declare function rustReleaseBinaryUrl(command: RustReleaseBinaryCommand, asset: RustReleaseBinaryAsset, version: string): string;
31
+ /** Install the release binary matching this CLI version and host platform. */
32
+ export declare function ensureRustReleaseBinary(command: RustReleaseBinaryCommand, options?: RustReleaseBinaryOptions): Promise<bin.BinContext>;
33
+ /** Install and run a Rust command with inherited terminal I/O. */
34
+ export declare function runRustReleaseBinary(command: RustReleaseBinaryCommand, args: readonly string[], options?: RustReleaseBinaryOptions): Promise<number>;
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Lazy installation and transparent execution of Rust release binaries.
3
+ *
4
+ * @module
5
+ */
6
+ import { spawn } from "node:child_process";
7
+ import { constants as osConstants, homedir } from "node:os";
8
+ import { join } from "node:path";
9
+ import { bin } from "@dbx-tools/core";
10
+ import { RUST_RELEASE_BINARY_COMMANDS } from "./_rust-release-binaries.js";
11
+ /** Return every Rust command registered by the synthesized workspace. */
12
+ export function rustReleaseBinaryCommands() {
13
+ return RUST_RELEASE_BINARY_COMMANDS;
14
+ }
15
+ /** Resolve one registered Rust command by its `dbx` subcommand. */
16
+ export function rustReleaseBinaryCommand(command) {
17
+ const resolved = RUST_RELEASE_BINARY_COMMANDS.find((candidate) => candidate.command === command);
18
+ if (!resolved)
19
+ throw new Error(`Unknown Rust release command: ${command}`);
20
+ return resolved;
21
+ }
22
+ function repositoryName(repository) {
23
+ const parsed = new URL(repository.replace(/^git\+/, ""));
24
+ const name = parsed.pathname.replace(/^\/+|\/+$/g, "").replace(/\.git$/, "");
25
+ if (parsed.hostname !== "github.com" || name.split("/").length !== 2) {
26
+ throw new Error(`Rust release repository must be a GitHub owner/repository: ${repository}`);
27
+ }
28
+ return name;
29
+ }
30
+ async function packageVersion() {
31
+ return (await import("../index.js")).PACKAGE_VERSION;
32
+ }
33
+ function versionedBinaryName(binaryName, version, platform) {
34
+ const suffix = version.replace(/[^0-9A-Za-z]+/g, "_");
35
+ const extension = platform === "win32" ? ".exe" : "";
36
+ return `${binaryName}_${suffix}${extension}`;
37
+ }
38
+ /** Select the archive for an OS and CPU pair. */
39
+ export function rustReleaseBinaryAsset(command, platform, arch) {
40
+ const asset = command.assets.find((candidate) => candidate.os === platform && candidate.cpu === arch);
41
+ if (!asset) {
42
+ throw new Error(`${command.command} has no release binary for ${platform}/${arch}`);
43
+ }
44
+ return asset;
45
+ }
46
+ /** Build the GitHub release URL for a generated archive entry. */
47
+ export function rustReleaseBinaryUrl(command, asset, version) {
48
+ return `https://github.com/${repositoryName(command.repository)}/releases/download/v${version}/${asset.name}`;
49
+ }
50
+ /** Install the release binary matching this CLI version and host platform. */
51
+ export async function ensureRustReleaseBinary(command, options = {}) {
52
+ const platform = options.platform ?? process.platform;
53
+ const arch = options.arch ?? process.arch;
54
+ const version = options.version ?? (await packageVersion());
55
+ const asset = rustReleaseBinaryAsset(command, platform, arch);
56
+ const root = join(options.homeDir ?? homedir(), ".dbx-tools");
57
+ const binDir = join(root, "bin");
58
+ const destination = {
59
+ root,
60
+ binDir,
61
+ path: join(binDir, versionedBinaryName(command.binaryName, version, platform)),
62
+ };
63
+ return bin.ensure(command.binaryName, () => rustReleaseBinaryUrl(command, asset, version), {
64
+ autoUnpackage: true,
65
+ destination,
66
+ minVersion: version,
67
+ versionParser: (output) => {
68
+ const installed = bin.parseVersion(output);
69
+ return installed === version ? installed : undefined;
70
+ },
71
+ });
72
+ }
73
+ function signalExitCode(signal) {
74
+ return 128 + (osConstants.signals[signal] ?? 0);
75
+ }
76
+ /** Install and run a Rust command with inherited terminal I/O. */
77
+ export async function runRustReleaseBinary(command, args, options = {}) {
78
+ const installed = await ensureRustReleaseBinary(command, options);
79
+ const child = spawn(installed.path, args, { stdio: "inherit" });
80
+ const signals = ["SIGINT", "SIGTERM", "SIGHUP"];
81
+ const handlers = new Map();
82
+ for (const signal of signals) {
83
+ const handler = () => {
84
+ if (!child.killed)
85
+ child.kill(signal);
86
+ };
87
+ handlers.set(signal, handler);
88
+ process.on(signal, handler);
89
+ }
90
+ try {
91
+ return await new Promise((resolve, reject) => {
92
+ child.once("error", reject);
93
+ child.once("close", (code, signal) => {
94
+ resolve(signal ? signalExitCode(signal) : (code ?? 1));
95
+ });
96
+ });
97
+ }
98
+ finally {
99
+ for (const [signal, handler] of handlers)
100
+ process.off(signal, handler);
101
+ }
102
+ }
103
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVzdC1iaW5hcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVzdC1iaW5hcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUNILE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsU0FBUyxJQUFJLFdBQVcsRUFBRSxPQUFPLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDNUQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUVqQyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdEMsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUEwQjNFLHlFQUF5RTtBQUN6RSxNQUFNLFVBQVUseUJBQXlCO0lBQ3ZDLE9BQU8sNEJBQTRCLENBQUM7QUFDdEMsQ0FBQztBQUVELG1FQUFtRTtBQUNuRSxNQUFNLFVBQVUsd0JBQXdCLENBQUMsT0FBZTtJQUN0RCxNQUFNLFFBQVEsR0FBRyw0QkFBNEIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEtBQUssT0FBTyxDQUFDLENBQUM7SUFDakcsSUFBSSxDQUFDLFFBQVE7UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLGlDQUFpQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQzNFLE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUM7QUFFRCxTQUFTLGNBQWMsQ0FBQyxVQUFrQjtJQUN4QyxNQUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3pELE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FB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QVEsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzlCLE9BQU8sQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFDRCxJQUFJLENBQUM7UUFDSCxPQUFPLE1BQU0sSUFBSSxPQUFPLENBQVMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDbkQsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDNUIsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLEVBQUU7Z0JBQ25DLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN6RCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztZQUFTLENBQUM7UUFDVCxLQUFLLE1BQU0sQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLElBQUksUUFBUTtZQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3pFLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBMYXp5IGluc3RhbGxhdGlvbiBhbmQgdHJhbnNwYXJlbnQgZXhlY3V0aW9uIG9mIFJ1c3QgcmVsZWFzZSBiaW5hcmllcy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cbmltcG9ydCB7IHNwYXduIH0gZnJvbSBcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IHsgY29uc3RhbnRzIGFzIG9zQ29uc3RhbnRzLCBob21lZGlyIH0gZnJvbSBcIm5vZGU6b3NcIjtcbmltcG9ydCB7IGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5cbmltcG9ydCB7IGJpbiB9IGZyb20gXCJAZGJ4LXRvb2xzL2NvcmVcIjtcbmltcG9ydCB7IFJVU1RfUkVMRUFTRV9CSU5BUllfQ09NTUFORFMgfSBmcm9tIFwiLi9fcnVzdC1yZWxlYXNlLWJpbmFyaWVzLnRzXCI7XG5cbi8qKiBPbmUgcmVsZWFzZSBhcmNoaXZlIGF2YWlsYWJsZSB0byB0aGUgY3VycmVudCBOb2RlIHJ1bnRpbWUuICovXG5leHBvcnQgaW50ZXJmYWNlIFJ1c3RSZWxlYXNlQmluYXJ5QXNzZXQge1xuICByZWFkb25seSBvczogc3RyaW5nO1xuICByZWFkb25seSBjcHU6IHN0cmluZztcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xufVxuXG4vKiogR2VuZXJhdGVkIHJlZ2lzdHJhdGlvbiBmb3Igb25lIGBkYnhgIFJ1c3QgY29tbWFuZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnVzdFJlbGVhc2VCaW5hcnlDb21tYW5kIHtcbiAgcmVhZG9ubHkgY29tbWFuZDogc3RyaW5nO1xuICByZWFkb25seSBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICByZWFkb25seSBiaW5hcnlOYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJlcG9zaXRvcnk6IHN0cmluZztcbiAgcmVhZG9ubHkgYXNzZXRzOiByZWFkb25seSBSdXN0UmVsZWFzZUJpbmFyeUFzc2V0W107XG59XG5cbi8qKiBPdmVycmlkZXMgdXNlZCBieSB0ZXN0cyBhbmQgY2FsbGVycyB0aGF0IGluc3RhbGwgdW5kZXIgYSBjdXN0b20gaG9tZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnVzdFJlbGVhc2VCaW5hcnlPcHRpb25zIHtcbiAgcmVhZG9ubHkgaG9tZURpcj86IHN0cmluZztcbiAgcmVhZG9ubHkgcGxhdGZvcm0/OiBOb2RlSlMuUGxhdGZvcm07XG4gIHJlYWRvbmx5IGFyY2g/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHZlcnNpb24/OiBzdHJpbmc7XG59XG5cbi8qKiBSZXR1cm4gZXZlcnkgUnVzdCBjb21tYW5kIHJlZ2lzdGVyZWQgYnkgdGhlIHN5bnRoZXNpemVkIHdvcmtzcGFjZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBydXN0UmVsZWFzZUJpbmFyeUNvbW1hbmRzKCk6IHJlYWRvbmx5IFJ1c3RSZWxlYXNlQmluYXJ5Q29tbWFuZFtdIHtcbiAgcmV0dXJuIFJVU1RfUkVMRUFTRV9CSU5BUllfQ09NTUFORFM7XG59XG5cbi8qKiBSZXNvbHZlIG9uZSByZWdpc3RlcmVkIFJ1c3QgY29tbWFuZCBieSBpdHMgYGRieGAgc3ViY29tbWFuZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBydXN0UmVsZWFzZUJpbmFyeUNvbW1hbmQoY29tbWFuZDogc3RyaW5nKTogUnVzdFJlbGVhc2VCaW5hcnlDb21tYW5kIHtcbiAgY29uc3QgcmVzb2x2ZWQgPSBSVVNUX1JFTEVBU0VfQklOQVJZX0NPTU1BTkRTLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLmNvbW1hbmQgPT09IGNvbW1hbmQpO1xuICBpZiAoIXJlc29sdmVkKSB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gUnVzdCByZWxlYXNlIGNvbW1hbmQ6ICR7Y29tbWFuZH1gKTtcbiAgcmV0dXJuIHJlc29sdmVkO1xufVxuXG5mdW5jdGlvbiByZXBvc2l0b3J5TmFtZShyZXBvc2l0b3J5OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBwYXJzZWQgPSBuZXcgVVJMKHJlcG9zaXRvcnkucmVwbGFjZSgvXmdpdFxcKy8sIFwiXCIpKTtcbiAgY29uc3QgbmFtZSA9IHBhcnNlZC5wYXRobmFtZS5yZXBsYWNlKC9eXFwvK3xcXC8rJC9nLCBcIlwiKS5yZXBsYWNlKC9cXC5naXQkLywgXCJcIik7XG4gIGlmIChwYXJzZWQuaG9zdG5hbWUgIT09IFwiZ2l0aHViLmNvbVwiIHx8IG5hbWUuc3BsaXQoXCIvXCIpLmxlbmd0aCAhPT0gMikge1xuICAgIHRocm93IG5ldyBFcnJvcihgUnVzdCByZWxlYXNlIHJlcG9zaXRvcnkgbXVzdCBiZSBhIEdpdEh1YiBvd25lci9yZXBvc2l0b3J5OiAke3JlcG9zaXRvcnl9YCk7XG4gIH1cbiAgcmV0dXJuIG5hbWU7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHBhY2thZ2VWZXJzaW9uKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gIHJldHVybiAoYXdhaXQgaW1wb3J0KFwiLi4vaW5kZXgudHNcIikpLlBBQ0tBR0VfVkVSU0lPTjtcbn1cblxuZnVuY3Rpb24gdmVyc2lvbmVkQmluYXJ5TmFtZShcbiAgYmluYXJ5TmFtZTogc3RyaW5nLFxuICB2ZXJzaW9uOiBzdHJpbmcsXG4gIHBsYXRmb3JtOiBOb2RlSlMuUGxhdGZvcm0sXG4pOiBzdHJpbmcge1xuICBjb25zdCBzdWZmaXggPSB2ZXJzaW9uLnJlcGxhY2UoL1teMC05QS1aYS16XSsvZywgXCJfXCIpO1xuICBjb25zdCBleHRlbnNpb24gPSBwbGF0Zm9ybSA9PT0gXCJ3aW4zMlwiID8gXCIuZXhlXCIgOiBcIlwiO1xuICByZXR1cm4gYCR7YmluYXJ5TmFtZX1fJHtzdWZmaXh9JHtleHRlbnNpb259YDtcbn1cblxuLyoqIFNlbGVjdCB0aGUgYXJjaGl2ZSBmb3IgYW4gT1MgYW5kIENQVSBwYWlyLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJ1c3RSZWxlYXNlQmluYXJ5QXNzZXQoXG4gIGNvbW1hbmQ6IFJ1c3RSZWxlYXNlQmluYXJ5Q29tbWFuZCxcbiAgcGxhdGZvcm06IE5vZGVKUy5QbGF0Zm9ybSxcbiAgYXJjaDogc3RyaW5nLFxuKTogUnVzdFJlbGVhc2VCaW5hcnlBc3NldCB7XG4gIGNvbnN0IGFzc2V0ID0gY29tbWFuZC5hc3NldHMuZmluZChcbiAgICAoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUub3MgPT09IHBsYXRmb3JtICYmIGNhbmRpZGF0ZS5jcHUgPT09IGFyY2gsXG4gICk7XG4gIGlmICghYXNzZXQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7Y29tbWFuZC5jb21tYW5kfSBoYXMgbm8gcmVsZWFzZSBiaW5hcnkgZm9yICR7cGxhdGZvcm19LyR7YXJjaH1gKTtcbiAgfVxuICByZXR1cm4gYXNzZXQ7XG59XG5cbi8qKiBCdWlsZCB0aGUgR2l0SHViIHJlbGVhc2UgVVJMIGZvciBhIGdlbmVyYXRlZCBhcmNoaXZlIGVudHJ5LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJ1c3RSZWxlYXNlQmluYXJ5VXJsKFxuICBjb21tYW5kOiBSdXN0UmVsZWFzZUJpbmFyeUNvbW1hbmQsXG4gIGFzc2V0OiBSdXN0UmVsZWFzZUJpbmFyeUFzc2V0LFxuICB2ZXJzaW9uOiBzdHJpbmcsXG4pOiBzdHJpbmcge1xuICByZXR1cm4gYGh0dHBzOi8vZ2l0aHViLmNvbS8ke3JlcG9zaXRvcnlOYW1lKGNvbW1hbmQucmVwb3NpdG9yeSl9L3JlbGVhc2VzL2Rvd25sb2FkL3Yke3ZlcnNpb259LyR7YXNzZXQubmFtZX1gO1xufVxuXG4vKiogSW5zdGFsbCB0aGUgcmVsZWFzZSBiaW5hcnkgbWF0Y2hpbmcgdGhpcyBDTEkgdmVyc2lvbiBhbmQgaG9zdCBwbGF0Zm9ybS4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbnN1cmVSdXN0UmVsZWFzZUJpbmFyeShcbiAgY29tbWFuZDogUnVzdFJlbGVhc2VCaW5hcnlDb21tYW5kLFxuICBvcHRpb25zOiBSdXN0UmVsZWFzZUJpbmFyeU9wdGlvbnMgPSB7fSxcbik6IFByb21pc2U8YmluLkJpbkNvbnRleHQ+IHtcbiAgY29uc3QgcGxhdGZvcm0gPSBvcHRpb25zLnBsYXRmb3JtID8/IHByb2Nlc3MucGxhdGZvcm07XG4gIGNvbnN0IGFyY2ggPSBvcHRpb25zLmFyY2ggPz8gcHJvY2Vzcy5hcmNoO1xuICBjb25zdCB2ZXJzaW9uID0gb3B0aW9ucy52ZXJzaW9uID8/IChhd2FpdCBwYWNrYWdlVmVyc2lvbigpKTtcbiAgY29uc3QgYXNzZXQgPSBydXN0UmVsZWFzZUJpbmFyeUFzc2V0KGNvbW1hbmQsIHBsYXRmb3JtLCBhcmNoKTtcbiAgY29uc3Qgcm9vdCA9IGpvaW4ob3B0aW9ucy5ob21lRGlyID8/IGhvbWVkaXIoKSwgXCIuZGJ4LXRvb2xzXCIpO1xuICBjb25zdCBiaW5EaXIgPSBqb2luKHJvb3QsIFwiYmluXCIpO1xuICBjb25zdCBkZXN0aW5hdGlvbjogYmluLkJpbkNvbnRleHQgPSB7XG4gICAgcm9vdCxcbiAgICBiaW5EaXIsXG4gICAgcGF0aDogam9pbihiaW5EaXIsIHZlcnNpb25lZEJpbmFyeU5hbWUoY29tbWFuZC5iaW5hcnlOYW1lLCB2ZXJzaW9uLCBwbGF0Zm9ybSkpLFxuICB9O1xuICByZXR1cm4gYmluLmVuc3VyZShjb21tYW5kLmJpbmFyeU5hbWUsICgpID0+IHJ1c3RSZWxlYXNlQmluYXJ5VXJsKGNvbW1hbmQsIGFzc2V0LCB2ZXJzaW9uKSwge1xuICAgIGF1dG9VbnBhY2thZ2U6IHRydWUsXG4gICAgZGVzdGluYXRpb24sXG4gICAgbWluVmVyc2lvbjogdmVyc2lvbixcbiAgICB2ZXJzaW9uUGFyc2VyOiAob3V0cHV0KSA9PiB7XG4gICAgICBjb25zdCBpbnN0YWxsZWQgPSBiaW4ucGFyc2VWZXJzaW9uKG91dHB1dCk7XG4gICAgICByZXR1cm4gaW5zdGFsbGVkID09PSB2ZXJzaW9uID8gaW5zdGFsbGVkIDogdW5kZWZpbmVkO1xuICAgIH0sXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBzaWduYWxFeGl0Q29kZShzaWduYWw6IE5vZGVKUy5TaWduYWxzKTogbnVtYmVyIHtcbiAgcmV0dXJuIDEyOCArIChvc0NvbnN0YW50cy5zaWduYWxzW3NpZ25hbF0gPz8gMCk7XG59XG5cbi8qKiBJbnN0YWxsIGFuZCBydW4gYSBSdXN0IGNvbW1hbmQgd2l0aCBpbmhlcml0ZWQgdGVybWluYWwgSS9PLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1blJ1c3RSZWxlYXNlQmluYXJ5KFxuICBjb21tYW5kOiBSdXN0UmVsZWFzZUJpbmFyeUNvbW1hbmQsXG4gIGFyZ3M6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBvcHRpb25zOiBSdXN0UmVsZWFzZUJpbmFyeU9wdGlvbnMgPSB7fSxcbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IGluc3RhbGxlZCA9IGF3YWl0IGVuc3VyZVJ1c3RSZWxlYXNlQmluYXJ5KGNvbW1hbmQsIG9wdGlvbnMpO1xuICBjb25zdCBjaGlsZCA9IHNwYXduKGluc3RhbGxlZC5wYXRoLCBhcmdzLCB7IHN0ZGlvOiBcImluaGVyaXRcIiB9KTtcbiAgY29uc3Qgc2lnbmFscyA9IFtcIlNJR0lOVFwiLCBcIlNJR1RFUk1cIiwgXCJTSUdIVVBcIl0gYXMgY29uc3Q7XG4gIGNvbnN0IGhhbmRsZXJzID0gbmV3IE1hcDxOb2RlSlMuU2lnbmFscywgKCkgPT4gdm9pZD4oKTtcbiAgZm9yIChjb25zdCBzaWduYWwgb2Ygc2lnbmFscykge1xuICAgIGNvbnN0IGhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICBpZiAoIWNoaWxkLmtpbGxlZCkgY2hpbGQua2lsbChzaWduYWwpO1xuICAgIH07XG4gICAgaGFuZGxlcnMuc2V0KHNpZ25hbCwgaGFuZGxlcik7XG4gICAgcHJvY2Vzcy5vbihzaWduYWwsIGhhbmRsZXIpO1xuICB9XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlPG51bWJlcj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY2hpbGQub25jZShcImVycm9yXCIsIHJlamVjdCk7XG4gICAgICBjaGlsZC5vbmNlKFwiY2xvc2VcIiwgKGNvZGUsIHNpZ25hbCkgPT4ge1xuICAgICAgICByZXNvbHZlKHNpZ25hbCA/IHNpZ25hbEV4aXRDb2RlKHNpZ25hbCkgOiAoY29kZSA/PyAxKSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSBmaW5hbGx5IHtcbiAgICBmb3IgKGNvbnN0IFtzaWduYWwsIGhhbmRsZXJdIG9mIGhhbmRsZXJzKSBwcm9jZXNzLm9mZihzaWduYWwsIGhhbmRsZXIpO1xuICB9XG59XG4iXX0=
@@ -1 +1 @@
1
- {"root":["../src/bootstrap.ts","../src/bun.ts","../src/cli.ts","../src/root.ts","../index.ts","../bin/dbx-tools.ts"],"version":"5.9.3"}
1
+ {"root":["../src/_rust-release-binaries.ts","../src/bootstrap.ts","../src/bun.ts","../src/cli.ts","../src/root.ts","../src/rust-binary.ts","../index.ts","../bin/dbx-tools.ts"],"version":"5.9.3"}
package/package.json CHANGED
@@ -28,11 +28,11 @@
28
28
  },
29
29
  "dependencies": {
30
30
  "@clack/prompts": "^1.7.0",
31
- "@dbx-tools/cli-appkit-env": "0.6.186",
32
- "@dbx-tools/cli-auth": "0.6.186",
33
- "@dbx-tools/cli-tunnel": "0.6.186",
34
- "@dbx-tools/core": "0.6.186",
35
- "@dbx-tools/shared-core": "0.6.186",
31
+ "@dbx-tools/cli-appkit-env": "0.6.188",
32
+ "@dbx-tools/cli-auth": "0.6.188",
33
+ "@dbx-tools/cli-tunnel": "0.6.188",
34
+ "@dbx-tools/core": "0.6.188",
35
+ "@dbx-tools/shared-core": "0.6.188",
36
36
  "commander": "^15.0.0"
37
37
  },
38
38
  "main": "./lib/index.js",
@@ -66,10 +66,14 @@
66
66
  "types": "./lib/src/root.d.ts",
67
67
  "default": "./lib/src/root.js"
68
68
  },
69
+ "./rust-binary": {
70
+ "types": "./lib/src/rust-binary.d.ts",
71
+ "default": "./lib/src/rust-binary.js"
72
+ },
69
73
  "./package.json": "./package.json"
70
74
  }
71
75
  },
72
- "version": "0.6.186",
76
+ "version": "0.6.188",
73
77
  "types": "./lib/index.d.ts",
74
78
  "type": "module",
75
79
  "exports": {
@@ -93,6 +97,10 @@
93
97
  "types": "./lib/src/root.d.ts",
94
98
  "default": "./lib/src/root.js"
95
99
  },
100
+ "./rust-binary": {
101
+ "types": "./lib/src/rust-binary.d.ts",
102
+ "default": "./lib/src/rust-binary.js"
103
+ },
96
104
  "./package.json": "./package.json"
97
105
  },
98
106
  "files": [
@@ -0,0 +1,66 @@
1
+ // GENERATED by projen - DO NOT EDIT.
2
+ // Rust release package options are the source of truth.
3
+
4
+ export const RUST_RELEASE_BINARY_COMMANDS = [
5
+ {
6
+ "command": "lakebase-proxy",
7
+ "description": "Loopback PostgreSQL proxy for Databricks Lakebase",
8
+ "binaryName": "dbx-lakebase-proxy",
9
+ "repository": "https://github.com/reggie-db/dbx-tools",
10
+ "assets": [
11
+ {
12
+ "os": "linux",
13
+ "cpu": "x64",
14
+ "name": "dbx-lakebase-proxy-linux-x64-gnu.tar.gz"
15
+ },
16
+ {
17
+ "os": "linux",
18
+ "cpu": "arm64",
19
+ "name": "dbx-lakebase-proxy-linux-arm64-gnu.tar.gz"
20
+ },
21
+ {
22
+ "os": "darwin",
23
+ "cpu": "x64",
24
+ "name": "dbx-lakebase-proxy-darwin-x64.tar.gz"
25
+ },
26
+ {
27
+ "os": "darwin",
28
+ "cpu": "arm64",
29
+ "name": "dbx-lakebase-proxy-darwin-arm64.tar.gz"
30
+ }
31
+ ]
32
+ },
33
+ {
34
+ "command": "model-proxy",
35
+ "description": "Multi-protocol Databricks model proxy",
36
+ "binaryName": "dbx-model-proxy",
37
+ "repository": "https://github.com/reggie-db/dbx-tools",
38
+ "assets": [
39
+ {
40
+ "os": "linux",
41
+ "cpu": "x64",
42
+ "name": "dbx-model-proxy-linux-x64-gnu.tar.gz"
43
+ },
44
+ {
45
+ "os": "linux",
46
+ "cpu": "arm64",
47
+ "name": "dbx-model-proxy-linux-arm64-gnu.tar.gz"
48
+ },
49
+ {
50
+ "os": "darwin",
51
+ "cpu": "x64",
52
+ "name": "dbx-model-proxy-darwin-x64.tar.gz"
53
+ },
54
+ {
55
+ "os": "darwin",
56
+ "cpu": "arm64",
57
+ "name": "dbx-model-proxy-darwin-arm64.tar.gz"
58
+ },
59
+ {
60
+ "os": "win32",
61
+ "cpu": "x64",
62
+ "name": "dbx-model-proxy-win32-x64-msvc.zip"
63
+ }
64
+ ]
65
+ }
66
+ ] as const;
package/src/cli.ts CHANGED
@@ -21,6 +21,11 @@ import {
21
21
  } from "./bootstrap.ts";
22
22
  import { ensureWorkspaceReady, runBun, runProjen } from "./bun.ts";
23
23
  import { findWorkspaceRoot, needsBootstrap, needsToolchain } from "./root.ts";
24
+ import {
25
+ runRustReleaseBinary,
26
+ rustReleaseBinaryCommands,
27
+ type RustReleaseBinaryCommand,
28
+ } from "./rust-binary.ts";
24
29
 
25
30
  /** Commands the bin exposes, and the names help is rendered under. */
26
31
  const PROGRAM_NAMES = ["dbx", "dbx-tools"] as const;
@@ -81,11 +86,26 @@ function addForwardedCommand(
81
86
  });
82
87
  }
83
88
 
89
+ function addRustReleaseCommand(program: Command, command: RustReleaseBinaryCommand): void {
90
+ program
91
+ .command(command.command)
92
+ .description(command.description)
93
+ .argument("[args...]", `arguments forwarded to ${command.binaryName}`)
94
+ .allowUnknownOption()
95
+ .allowExcessArguments()
96
+ .helpOption(false)
97
+ .action(async (args: string[]) => {
98
+ process.exitCode = await runRustReleaseBinary(command, args);
99
+ });
100
+ }
101
+
84
102
  /** Build the `dbx` commander program (no side effects until parsed). */
85
103
  export function buildProgram(name: string = PROGRAM_NAMES[0]): Command {
86
104
  const program = new Command()
87
105
  .name(name)
88
- .description("Databricks developer tools: workspace lifecycle, AppKit env, auth, and tunnel")
106
+ .description(
107
+ "Databricks developer tools: workspace lifecycle, AppKit env, auth, tunnels, and native proxies",
108
+ )
89
109
  .showHelpAfterError()
90
110
  .helpOption("-h, --help", `Show ${name} help`);
91
111
 
@@ -121,6 +141,10 @@ export function buildProgram(name: string = PROGRAM_NAMES[0]): Command {
121
141
  async () => (await import("@dbx-tools/cli-tunnel/cli")).buildProgram,
122
142
  );
123
143
 
144
+ for (const command of rustReleaseBinaryCommands()) {
145
+ addRustReleaseCommand(program, command);
146
+ }
147
+
124
148
  return program;
125
149
  }
126
150
 
@@ -0,0 +1,154 @@
1
+ /**
2
+ * Lazy installation and transparent execution of Rust release binaries.
3
+ *
4
+ * @module
5
+ */
6
+ import { spawn } from "node:child_process";
7
+ import { constants as osConstants, homedir } from "node:os";
8
+ import { join } from "node:path";
9
+
10
+ import { bin } from "@dbx-tools/core";
11
+ import { RUST_RELEASE_BINARY_COMMANDS } from "./_rust-release-binaries.ts";
12
+
13
+ /** One release archive available to the current Node runtime. */
14
+ export interface RustReleaseBinaryAsset {
15
+ readonly os: string;
16
+ readonly cpu: string;
17
+ readonly name: string;
18
+ }
19
+
20
+ /** Generated registration for one `dbx` Rust command. */
21
+ export interface RustReleaseBinaryCommand {
22
+ readonly command: string;
23
+ readonly description: string;
24
+ readonly binaryName: string;
25
+ readonly repository: string;
26
+ readonly assets: readonly RustReleaseBinaryAsset[];
27
+ }
28
+
29
+ /** Overrides used by tests and callers that install under a custom home. */
30
+ export interface RustReleaseBinaryOptions {
31
+ readonly homeDir?: string;
32
+ readonly platform?: NodeJS.Platform;
33
+ readonly arch?: string;
34
+ readonly version?: string;
35
+ }
36
+
37
+ /** Return every Rust command registered by the synthesized workspace. */
38
+ export function rustReleaseBinaryCommands(): readonly RustReleaseBinaryCommand[] {
39
+ return RUST_RELEASE_BINARY_COMMANDS;
40
+ }
41
+
42
+ /** Resolve one registered Rust command by its `dbx` subcommand. */
43
+ export function rustReleaseBinaryCommand(command: string): RustReleaseBinaryCommand {
44
+ const resolved = RUST_RELEASE_BINARY_COMMANDS.find((candidate) => candidate.command === command);
45
+ if (!resolved) throw new Error(`Unknown Rust release command: ${command}`);
46
+ return resolved;
47
+ }
48
+
49
+ function repositoryName(repository: string): string {
50
+ const parsed = new URL(repository.replace(/^git\+/, ""));
51
+ const name = parsed.pathname.replace(/^\/+|\/+$/g, "").replace(/\.git$/, "");
52
+ if (parsed.hostname !== "github.com" || name.split("/").length !== 2) {
53
+ throw new Error(`Rust release repository must be a GitHub owner/repository: ${repository}`);
54
+ }
55
+ return name;
56
+ }
57
+
58
+ async function packageVersion(): Promise<string> {
59
+ return (await import("../index.ts")).PACKAGE_VERSION;
60
+ }
61
+
62
+ function versionedBinaryName(
63
+ binaryName: string,
64
+ version: string,
65
+ platform: NodeJS.Platform,
66
+ ): string {
67
+ const suffix = version.replace(/[^0-9A-Za-z]+/g, "_");
68
+ const extension = platform === "win32" ? ".exe" : "";
69
+ return `${binaryName}_${suffix}${extension}`;
70
+ }
71
+
72
+ /** Select the archive for an OS and CPU pair. */
73
+ export function rustReleaseBinaryAsset(
74
+ command: RustReleaseBinaryCommand,
75
+ platform: NodeJS.Platform,
76
+ arch: string,
77
+ ): RustReleaseBinaryAsset {
78
+ const asset = command.assets.find(
79
+ (candidate) => candidate.os === platform && candidate.cpu === arch,
80
+ );
81
+ if (!asset) {
82
+ throw new Error(`${command.command} has no release binary for ${platform}/${arch}`);
83
+ }
84
+ return asset;
85
+ }
86
+
87
+ /** Build the GitHub release URL for a generated archive entry. */
88
+ export function rustReleaseBinaryUrl(
89
+ command: RustReleaseBinaryCommand,
90
+ asset: RustReleaseBinaryAsset,
91
+ version: string,
92
+ ): string {
93
+ return `https://github.com/${repositoryName(command.repository)}/releases/download/v${version}/${asset.name}`;
94
+ }
95
+
96
+ /** Install the release binary matching this CLI version and host platform. */
97
+ export async function ensureRustReleaseBinary(
98
+ command: RustReleaseBinaryCommand,
99
+ options: RustReleaseBinaryOptions = {},
100
+ ): Promise<bin.BinContext> {
101
+ const platform = options.platform ?? process.platform;
102
+ const arch = options.arch ?? process.arch;
103
+ const version = options.version ?? (await packageVersion());
104
+ const asset = rustReleaseBinaryAsset(command, platform, arch);
105
+ const root = join(options.homeDir ?? homedir(), ".dbx-tools");
106
+ const binDir = join(root, "bin");
107
+ const destination: bin.BinContext = {
108
+ root,
109
+ binDir,
110
+ path: join(binDir, versionedBinaryName(command.binaryName, version, platform)),
111
+ };
112
+ return bin.ensure(command.binaryName, () => rustReleaseBinaryUrl(command, asset, version), {
113
+ autoUnpackage: true,
114
+ destination,
115
+ minVersion: version,
116
+ versionParser: (output) => {
117
+ const installed = bin.parseVersion(output);
118
+ return installed === version ? installed : undefined;
119
+ },
120
+ });
121
+ }
122
+
123
+ function signalExitCode(signal: NodeJS.Signals): number {
124
+ return 128 + (osConstants.signals[signal] ?? 0);
125
+ }
126
+
127
+ /** Install and run a Rust command with inherited terminal I/O. */
128
+ export async function runRustReleaseBinary(
129
+ command: RustReleaseBinaryCommand,
130
+ args: readonly string[],
131
+ options: RustReleaseBinaryOptions = {},
132
+ ): Promise<number> {
133
+ const installed = await ensureRustReleaseBinary(command, options);
134
+ const child = spawn(installed.path, args, { stdio: "inherit" });
135
+ const signals = ["SIGINT", "SIGTERM", "SIGHUP"] as const;
136
+ const handlers = new Map<NodeJS.Signals, () => void>();
137
+ for (const signal of signals) {
138
+ const handler = () => {
139
+ if (!child.killed) child.kill(signal);
140
+ };
141
+ handlers.set(signal, handler);
142
+ process.on(signal, handler);
143
+ }
144
+ try {
145
+ return await new Promise<number>((resolve, reject) => {
146
+ child.once("error", reject);
147
+ child.once("close", (code, signal) => {
148
+ resolve(signal ? signalExitCode(signal) : (code ?? 1));
149
+ });
150
+ });
151
+ } finally {
152
+ for (const [signal, handler] of handlers) process.off(signal, handler);
153
+ }
154
+ }