@dbx-tools/cli 0.9.58 → 0.9.60
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 +548 -58
- package/bin/dbx-graphiti.ts +5 -0
- package/bin/dbx-lakebase-proxy.ts +4 -0
- package/bin/dbx-model-gateway.ts +5 -0
- package/index.ts +35 -1
- package/lib/bin/dbx-graphiti.d.ts +2 -0
- package/lib/bin/dbx-graphiti.js +4 -0
- package/lib/bin/dbx-lakebase-proxy.d.ts +2 -0
- package/lib/bin/dbx-lakebase-proxy.js +4 -0
- package/lib/bin/dbx-model-gateway.d.ts +2 -0
- package/lib/bin/dbx-model-gateway.js +4 -0
- package/lib/index.d.ts +35 -1
- package/lib/index.js +26 -2
- package/lib/src/appkit/cli.d.ts +24 -0
- package/lib/src/appkit/cli.js +54 -0
- package/lib/src/appkit/env-export.d.ts +40 -0
- package/lib/src/appkit/env-export.js +99 -0
- package/lib/src/auth/cli.d.ts +20 -0
- package/lib/src/auth/cli.js +118 -0
- package/lib/src/auth/options.d.ts +41 -0
- package/lib/src/auth/options.js +64 -0
- package/lib/src/cli.d.ts +2 -0
- package/lib/src/cli.js +13 -7
- package/lib/src/graphiti/cli.d.ts +18 -0
- package/lib/src/graphiti/cli.js +43 -0
- package/lib/src/graphiti/options.d.ts +10 -0
- package/lib/src/graphiti/options.js +10 -0
- package/lib/src/lakebase-proxy/cancellation.d.ts +22 -0
- package/lib/src/lakebase-proxy/cancellation.js +100 -0
- package/lib/src/lakebase-proxy/cli.d.ts +13 -0
- package/lib/src/lakebase-proxy/cli.js +54 -0
- package/lib/src/lakebase-proxy/options.d.ts +23 -0
- package/lib/src/lakebase-proxy/options.js +41 -0
- package/lib/src/lakebase-proxy/protocol.d.ts +37 -0
- package/lib/src/lakebase-proxy/protocol.js +124 -0
- package/lib/src/lakebase-proxy/proxy.d.ts +22 -0
- package/lib/src/lakebase-proxy/proxy.js +200 -0
- package/lib/src/model-gateway/cli.d.ts +19 -0
- package/lib/src/model-gateway/cli.js +63 -0
- package/lib/src/model-gateway/server.d.ts +13 -0
- package/lib/src/model-gateway/server.js +53 -0
- package/lib/src/tunnel/app.d.ts +20 -0
- package/lib/src/tunnel/app.js +52 -0
- package/lib/src/tunnel/cli.d.ts +27 -0
- package/lib/src/tunnel/cli.js +190 -0
- package/lib/src/tunnel/options.d.ts +72 -0
- package/lib/src/tunnel/options.js +138 -0
- package/lib/src/tunnel/proxy.d.ts +51 -0
- package/lib/src/tunnel/proxy.js +143 -0
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +124 -9
- package/src/appkit/cli.ts +72 -0
- package/src/appkit/env-export.ts +124 -0
- package/src/auth/cli.ts +165 -0
- package/src/auth/options.ts +79 -0
- package/src/cli.ts +22 -6
- package/src/graphiti/cli.ts +75 -0
- package/src/graphiti/options.ts +20 -0
- package/src/lakebase-proxy/cancellation.ts +116 -0
- package/src/lakebase-proxy/cli.ts +80 -0
- package/src/lakebase-proxy/options.ts +56 -0
- package/src/lakebase-proxy/protocol.ts +170 -0
- package/src/lakebase-proxy/proxy.ts +256 -0
- package/src/model-gateway/cli.ts +89 -0
- package/src/model-gateway/server.ts +62 -0
- package/src/tunnel/app.ts +58 -0
- package/src/tunnel/cli.ts +218 -0
- package/src/tunnel/options.ts +169 -0
- package/src/tunnel/proxy.ts +194 -0
package/index.ts
CHANGED
|
@@ -3,10 +3,44 @@
|
|
|
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.9.
|
|
6
|
+
export const PACKAGE_VERSION = "0.9.60";
|
|
7
|
+
export * as appkitCli from "./src/appkit/cli.ts";
|
|
8
|
+
export * as appkitEnvExport from "./src/appkit/env-export.ts";
|
|
9
|
+
export * as authCli from "./src/auth/cli.ts";
|
|
10
|
+
export * as authOptions from "./src/auth/options.ts";
|
|
7
11
|
export * as bootstrap from "./src/bootstrap.ts";
|
|
8
12
|
export * as bun from "./src/bun.ts";
|
|
9
13
|
export * as cli from "./src/cli.ts";
|
|
14
|
+
export * as graphitiCli from "./src/graphiti/cli.ts";
|
|
15
|
+
export * as graphitiOptions from "./src/graphiti/options.ts";
|
|
16
|
+
export * as lakebaseProxyCancellation from "./src/lakebase-proxy/cancellation.ts";
|
|
17
|
+
export * as lakebaseProxyCli from "./src/lakebase-proxy/cli.ts";
|
|
18
|
+
export * as lakebaseProxyOptions from "./src/lakebase-proxy/options.ts";
|
|
19
|
+
export * as lakebaseProxyProtocol from "./src/lakebase-proxy/protocol.ts";
|
|
20
|
+
export * as lakebaseProxyProxy from "./src/lakebase-proxy/proxy.ts";
|
|
21
|
+
export * as modelGatewayCli from "./src/model-gateway/cli.ts";
|
|
22
|
+
export * as modelGatewayServer from "./src/model-gateway/server.ts";
|
|
10
23
|
export * as root from "./src/root.ts";
|
|
24
|
+
export * as tunnelApp from "./src/tunnel/app.ts";
|
|
25
|
+
export * as tunnelCli from "./src/tunnel/cli.ts";
|
|
26
|
+
export * as tunnelOptions from "./src/tunnel/options.ts";
|
|
27
|
+
export * as tunnelProxy from "./src/tunnel/proxy.ts";
|
|
28
|
+
export { EnvExportFormatSchema, EnvCommandOptionsSchema } from "./src/appkit/env-export.ts";
|
|
29
|
+
export type { EnvExportFormat, EnvCommandOptions } from "./src/appkit/env-export.ts";
|
|
30
|
+
export { AuthCliOptionsSchema, TokenCommandOptionsSchema } from "./src/auth/options.ts";
|
|
31
|
+
export type { AuthCliOptions, TokenCommandOptions } from "./src/auth/options.ts";
|
|
11
32
|
export { resolveBunArgv } from "./src/bun.ts";
|
|
33
|
+
export type { GraphitiCliDependencies, GraphitiServiceOptions } from "./src/graphiti/cli.ts";
|
|
34
|
+
export { CancellationRegistry } from "./src/lakebase-proxy/cancellation.ts";
|
|
35
|
+
export type { CancellationTarget, CancellationForwarder } from "./src/lakebase-proxy/cancellation.ts";
|
|
36
|
+
export type { LakebaseProxyCliDependencies } from "./src/lakebase-proxy/cli.ts";
|
|
37
|
+
export { LakebaseProxyOptionsSchema, LakebaseProxyUrlOptionsSchema } from "./src/lakebase-proxy/options.ts";
|
|
38
|
+
export type { LakebaseProxyOptions, ResolvedLakebaseProxyOptions, LakebaseProxyUrlOptions } from "./src/lakebase-proxy/options.ts";
|
|
39
|
+
export { SSL_REQUEST, CANCEL_REQUEST, PROTOCOL_3, PostgresProtocolError } from "./src/lakebase-proxy/protocol.ts";
|
|
40
|
+
export type { StartupMessage, CancelMessage, InitialMessage } from "./src/lakebase-proxy/protocol.ts";
|
|
41
|
+
export { LakebaseProxy } from "./src/lakebase-proxy/proxy.ts";
|
|
42
|
+
export type { ModelGatewayCliDependencies } from "./src/model-gateway/cli.ts";
|
|
12
43
|
export { workspaceRoot } from "./src/root.ts";
|
|
44
|
+
export { TunnelOptionsSchema } from "./src/tunnel/options.ts";
|
|
45
|
+
export type { TunnelOptions, ResolvedTunnelOptions } from "./src/tunnel/options.ts";
|
|
46
|
+
export type { ProxyOptions } from "./src/tunnel/proxy.ts";
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
import { buildProgram } from "../src/graphiti/cli.js";
|
|
3
|
+
await buildProgram("dbx-graphiti").parseAsync(process.argv);
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGJ4LWdyYXBoaXRpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vYmluL2RieC1ncmFwaGl0aS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBRUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRXRELE1BQU0sWUFBWSxDQUFDLGNBQWMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBidW5cblxuaW1wb3J0IHsgYnVpbGRQcm9ncmFtIH0gZnJvbSBcIi4uL3NyYy9ncmFwaGl0aS9jbGkudHNcIjtcblxuYXdhaXQgYnVpbGRQcm9ncmFtKFwiZGJ4LWdyYXBoaXRpXCIpLnBhcnNlQXN5bmMocHJvY2Vzcy5hcmd2KTtcbiJdfQ==
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { buildProgram } from "../src/lakebase-proxy/cli.js";
|
|
3
|
+
await buildProgram("dbx-lakebase-proxy").parseAsync(process.argv);
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGJ4LWxha2ViYXNlLXByb3h5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vYmluL2RieC1sYWtlYmFzZS1wcm94eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQ0EsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRTVELE1BQU0sWUFBWSxDQUFDLG9CQUFvQixDQUFDLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIiMhL3Vzci9iaW4vZW52IG5vZGVcbmltcG9ydCB7IGJ1aWxkUHJvZ3JhbSB9IGZyb20gXCIuLi9zcmMvbGFrZWJhc2UtcHJveHkvY2xpLnRzXCI7XG5cbmF3YWl0IGJ1aWxkUHJvZ3JhbShcImRieC1sYWtlYmFzZS1wcm94eVwiKS5wYXJzZUFzeW5jKHByb2Nlc3MuYXJndik7XG4iXX0=
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
import { buildProgram } from "../src/model-gateway/cli.js";
|
|
3
|
+
await buildProgram("dbx-model-gateway").parseAsync(process.argv);
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGJ4LW1vZGVsLWdhdGV3YXkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9iaW4vZGJ4LW1vZGVsLWdhdGV3YXkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUVBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUUzRCxNQUFNLFlBQVksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBidW5cblxuaW1wb3J0IHsgYnVpbGRQcm9ncmFtIH0gZnJvbSBcIi4uL3NyYy9tb2RlbC1nYXRld2F5L2NsaS50c1wiO1xuXG5hd2FpdCBidWlsZFByb2dyYW0oXCJkYngtbW9kZWwtZ2F0ZXdheVwiKS5wYXJzZUFzeW5jKHByb2Nlc3MuYXJndik7XG4iXX0=
|
package/lib/index.d.ts
CHANGED
|
@@ -1,8 +1,42 @@
|
|
|
1
1
|
export declare const PACKAGE_IDENTIFIER = "@dbx-tools/cli";
|
|
2
|
-
export declare const PACKAGE_VERSION = "0.9.
|
|
2
|
+
export declare const PACKAGE_VERSION = "0.9.60";
|
|
3
|
+
export * as appkitCli from "./src/appkit/cli.ts";
|
|
4
|
+
export * as appkitEnvExport from "./src/appkit/env-export.ts";
|
|
5
|
+
export * as authCli from "./src/auth/cli.ts";
|
|
6
|
+
export * as authOptions from "./src/auth/options.ts";
|
|
3
7
|
export * as bootstrap from "./src/bootstrap.ts";
|
|
4
8
|
export * as bun from "./src/bun.ts";
|
|
5
9
|
export * as cli from "./src/cli.ts";
|
|
10
|
+
export * as graphitiCli from "./src/graphiti/cli.ts";
|
|
11
|
+
export * as graphitiOptions from "./src/graphiti/options.ts";
|
|
12
|
+
export * as lakebaseProxyCancellation from "./src/lakebase-proxy/cancellation.ts";
|
|
13
|
+
export * as lakebaseProxyCli from "./src/lakebase-proxy/cli.ts";
|
|
14
|
+
export * as lakebaseProxyOptions from "./src/lakebase-proxy/options.ts";
|
|
15
|
+
export * as lakebaseProxyProtocol from "./src/lakebase-proxy/protocol.ts";
|
|
16
|
+
export * as lakebaseProxyProxy from "./src/lakebase-proxy/proxy.ts";
|
|
17
|
+
export * as modelGatewayCli from "./src/model-gateway/cli.ts";
|
|
18
|
+
export * as modelGatewayServer from "./src/model-gateway/server.ts";
|
|
6
19
|
export * as root from "./src/root.ts";
|
|
20
|
+
export * as tunnelApp from "./src/tunnel/app.ts";
|
|
21
|
+
export * as tunnelCli from "./src/tunnel/cli.ts";
|
|
22
|
+
export * as tunnelOptions from "./src/tunnel/options.ts";
|
|
23
|
+
export * as tunnelProxy from "./src/tunnel/proxy.ts";
|
|
24
|
+
export { EnvExportFormatSchema, EnvCommandOptionsSchema } from "./src/appkit/env-export.ts";
|
|
25
|
+
export type { EnvExportFormat, EnvCommandOptions } from "./src/appkit/env-export.ts";
|
|
26
|
+
export { AuthCliOptionsSchema, TokenCommandOptionsSchema } from "./src/auth/options.ts";
|
|
27
|
+
export type { AuthCliOptions, TokenCommandOptions } from "./src/auth/options.ts";
|
|
7
28
|
export { resolveBunArgv } from "./src/bun.ts";
|
|
29
|
+
export type { GraphitiCliDependencies, GraphitiServiceOptions } from "./src/graphiti/cli.ts";
|
|
30
|
+
export { CancellationRegistry } from "./src/lakebase-proxy/cancellation.ts";
|
|
31
|
+
export type { CancellationTarget, CancellationForwarder } from "./src/lakebase-proxy/cancellation.ts";
|
|
32
|
+
export type { LakebaseProxyCliDependencies } from "./src/lakebase-proxy/cli.ts";
|
|
33
|
+
export { LakebaseProxyOptionsSchema, LakebaseProxyUrlOptionsSchema } from "./src/lakebase-proxy/options.ts";
|
|
34
|
+
export type { LakebaseProxyOptions, ResolvedLakebaseProxyOptions, LakebaseProxyUrlOptions } from "./src/lakebase-proxy/options.ts";
|
|
35
|
+
export { SSL_REQUEST, CANCEL_REQUEST, PROTOCOL_3, PostgresProtocolError } from "./src/lakebase-proxy/protocol.ts";
|
|
36
|
+
export type { StartupMessage, CancelMessage, InitialMessage } from "./src/lakebase-proxy/protocol.ts";
|
|
37
|
+
export { LakebaseProxy } from "./src/lakebase-proxy/proxy.ts";
|
|
38
|
+
export type { ModelGatewayCliDependencies } from "./src/model-gateway/cli.ts";
|
|
8
39
|
export { workspaceRoot } from "./src/root.ts";
|
|
40
|
+
export { TunnelOptionsSchema } from "./src/tunnel/options.ts";
|
|
41
|
+
export type { TunnelOptions, ResolvedTunnelOptions } from "./src/tunnel/options.ts";
|
|
42
|
+
export type { ProxyOptions } from "./src/tunnel/proxy.ts";
|
package/lib/index.js
CHANGED
|
@@ -2,11 +2,35 @@
|
|
|
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.9.
|
|
5
|
+
export const PACKAGE_VERSION = "0.9.60";
|
|
6
|
+
export * as appkitCli from "./src/appkit/cli.js";
|
|
7
|
+
export * as appkitEnvExport from "./src/appkit/env-export.js";
|
|
8
|
+
export * as authCli from "./src/auth/cli.js";
|
|
9
|
+
export * as authOptions from "./src/auth/options.js";
|
|
6
10
|
export * as bootstrap from "./src/bootstrap.js";
|
|
7
11
|
export * as bun from "./src/bun.js";
|
|
8
12
|
export * as cli from "./src/cli.js";
|
|
13
|
+
export * as graphitiCli from "./src/graphiti/cli.js";
|
|
14
|
+
export * as graphitiOptions from "./src/graphiti/options.js";
|
|
15
|
+
export * as lakebaseProxyCancellation from "./src/lakebase-proxy/cancellation.js";
|
|
16
|
+
export * as lakebaseProxyCli from "./src/lakebase-proxy/cli.js";
|
|
17
|
+
export * as lakebaseProxyOptions from "./src/lakebase-proxy/options.js";
|
|
18
|
+
export * as lakebaseProxyProtocol from "./src/lakebase-proxy/protocol.js";
|
|
19
|
+
export * as lakebaseProxyProxy from "./src/lakebase-proxy/proxy.js";
|
|
20
|
+
export * as modelGatewayCli from "./src/model-gateway/cli.js";
|
|
21
|
+
export * as modelGatewayServer from "./src/model-gateway/server.js";
|
|
9
22
|
export * as root from "./src/root.js";
|
|
23
|
+
export * as tunnelApp from "./src/tunnel/app.js";
|
|
24
|
+
export * as tunnelCli from "./src/tunnel/cli.js";
|
|
25
|
+
export * as tunnelOptions from "./src/tunnel/options.js";
|
|
26
|
+
export * as tunnelProxy from "./src/tunnel/proxy.js";
|
|
27
|
+
export { EnvExportFormatSchema, EnvCommandOptionsSchema } from "./src/appkit/env-export.js";
|
|
28
|
+
export { AuthCliOptionsSchema, TokenCommandOptionsSchema } from "./src/auth/options.js";
|
|
10
29
|
export { resolveBunArgv } from "./src/bun.js";
|
|
30
|
+
export { CancellationRegistry } from "./src/lakebase-proxy/cancellation.js";
|
|
31
|
+
export { LakebaseProxyOptionsSchema, LakebaseProxyUrlOptionsSchema } from "./src/lakebase-proxy/options.js";
|
|
32
|
+
export { SSL_REQUEST, CANCEL_REQUEST, PROTOCOL_3, PostgresProtocolError } from "./src/lakebase-proxy/protocol.js";
|
|
33
|
+
export { LakebaseProxy } from "./src/lakebase-proxy/proxy.js";
|
|
11
34
|
export { workspaceRoot } from "./src/root.js";
|
|
12
|
-
|
|
35
|
+
export { TunnelOptionsSchema } from "./src/tunnel/options.js";
|
|
36
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxnQkFBZ0IsQ0FBQztBQUNuRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxTQUFTLE1BQU0scUJBQXFCLENBQUM7QUFDakQsT0FBTyxLQUFLLGVBQWUsTUFBTSw0QkFBNEIsQ0FBQztBQUM5RCxPQUFPLEtBQUssT0FBTyxNQUFNLG1CQUFtQixDQUFDO0FBQzdDLE9BQU8sS0FBSyxXQUFXLE1BQU0sdUJBQXVCLENBQUM7QUFDckQsT0FBTyxLQUFLLFNBQVMsTUFBTSxvQkFBb0IsQ0FBQztBQUNoRCxPQUFPLEtBQUssR0FBRyxNQUFNLGNBQWMsQ0FBQztBQUNwQyxPQUFPLEtBQUssR0FBRyxNQUFNLGNBQWMsQ0FBQztBQUNwQyxPQUFPLEtBQUssV0FBVyxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sS0FBSyxlQUFlLE1BQU0sMkJBQTJCLENBQUM7QUFDN0QsT0FBTyxLQUFLLHlCQUF5QixNQUFNLHNDQUFzQyxDQUFDO0FBQ2xGLE9BQU8sS0FBSyxnQkFBZ0IsTUFBTSw2QkFBNkIsQ0FBQztBQUNoRSxPQUFPLEtBQUssb0JBQW9CLE1BQU0saUNBQWlDLENBQUM7QUFDeEUsT0FBTyxLQUFLLHFCQUFxQixNQUFNLGtDQUFrQyxDQUFDO0FBQzFFLE9BQU8sS0FBSyxrQkFBa0IsTUFBTSwrQkFBK0IsQ0FBQztBQUNwRSxPQUFPLEtBQUssZUFBZSxNQUFNLDRCQUE0QixDQUFDO0FBQzlELE9BQU8sS0FBSyxrQkFBa0IsTUFBTSwrQkFBK0IsQ0FBQztBQUNwRSxPQUFPLEtBQUssSUFBSSxNQUFNLGVBQWUsQ0FBQztBQUN0QyxPQUFPLEtBQUssU0FBUyxNQUFNLHFCQUFxQixDQUFDO0FBQ2pELE9BQU8sS0FBSyxTQUFTLE1BQU0scUJBQXFCLENBQUM7QUFDakQsT0FBTyxLQUFLLGFBQWEsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEtBQUssV0FBVyxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRTVGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXhGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFOUMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFHNUUsT0FBTyxFQUFFLDBCQUEwQixFQUFFLDZCQUE2QixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFNUcsT0FBTyxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUUsVUFBVSxFQUFFLHFCQUFxQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFFbEgsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRTlELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDOUMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBHRU5FUkFURUQgYnkgcHJvamVuIHdhdGNoIC0gRE8gTk9UIEVESVQuXG4vLyBSZWdlbmVyYXRlZCBmcm9tIHRoZSBleHBvcnRpbmcgbW9kdWxlcyBpbiAuL3NyYy5cbi8vIEhhbmQgZWRpdHMgYXJlIG92ZXJ3cml0dGVuIG9uIHRoZSBuZXh0IHdhdGNoOyB0aGlzIGZpbGUgaXMgcmVhZC1vbmx5LlxuXG5leHBvcnQgY29uc3QgUEFDS0FHRV9JREVOVElGSUVSID0gXCJAZGJ4LXRvb2xzL2NsaVwiO1xuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfVkVSU0lPTiA9IFwiMC45LjYwXCI7XG5leHBvcnQgKiBhcyBhcHBraXRDbGkgZnJvbSBcIi4vc3JjL2FwcGtpdC9jbGkudHNcIjtcbmV4cG9ydCAqIGFzIGFwcGtpdEVudkV4cG9ydCBmcm9tIFwiLi9zcmMvYXBwa2l0L2Vudi1leHBvcnQudHNcIjtcbmV4cG9ydCAqIGFzIGF1dGhDbGkgZnJvbSBcIi4vc3JjL2F1dGgvY2xpLnRzXCI7XG5leHBvcnQgKiBhcyBhdXRoT3B0aW9ucyBmcm9tIFwiLi9zcmMvYXV0aC9vcHRpb25zLnRzXCI7XG5leHBvcnQgKiBhcyBib290c3RyYXAgZnJvbSBcIi4vc3JjL2Jvb3RzdHJhcC50c1wiO1xuZXhwb3J0ICogYXMgYnVuIGZyb20gXCIuL3NyYy9idW4udHNcIjtcbmV4cG9ydCAqIGFzIGNsaSBmcm9tIFwiLi9zcmMvY2xpLnRzXCI7XG5leHBvcnQgKiBhcyBncmFwaGl0aUNsaSBmcm9tIFwiLi9zcmMvZ3JhcGhpdGkvY2xpLnRzXCI7XG5leHBvcnQgKiBhcyBncmFwaGl0aU9wdGlvbnMgZnJvbSBcIi4vc3JjL2dyYXBoaXRpL29wdGlvbnMudHNcIjtcbmV4cG9ydCAqIGFzIGxha2ViYXNlUHJveHlDYW5jZWxsYXRpb24gZnJvbSBcIi4vc3JjL2xha2ViYXNlLXByb3h5L2NhbmNlbGxhdGlvbi50c1wiO1xuZXhwb3J0ICogYXMgbGFrZWJhc2VQcm94eUNsaSBmcm9tIFwiLi9zcmMvbGFrZWJhc2UtcHJveHkvY2xpLnRzXCI7XG5leHBvcnQgKiBhcyBsYWtlYmFzZVByb3h5T3B0aW9ucyBmcm9tIFwiLi9zcmMvbGFrZWJhc2UtcHJveHkvb3B0aW9ucy50c1wiO1xuZXhwb3J0ICogYXMgbGFrZWJhc2VQcm94eVByb3RvY29sIGZyb20gXCIuL3NyYy9sYWtlYmFzZS1wcm94eS9wcm90b2NvbC50c1wiO1xuZXhwb3J0ICogYXMgbGFrZWJhc2VQcm94eVByb3h5IGZyb20gXCIuL3NyYy9sYWtlYmFzZS1wcm94eS9wcm94eS50c1wiO1xuZXhwb3J0ICogYXMgbW9kZWxHYXRld2F5Q2xpIGZyb20gXCIuL3NyYy9tb2RlbC1nYXRld2F5L2NsaS50c1wiO1xuZXhwb3J0ICogYXMgbW9kZWxHYXRld2F5U2VydmVyIGZyb20gXCIuL3NyYy9tb2RlbC1nYXRld2F5L3NlcnZlci50c1wiO1xuZXhwb3J0ICogYXMgcm9vdCBmcm9tIFwiLi9zcmMvcm9vdC50c1wiO1xuZXhwb3J0ICogYXMgdHVubmVsQXBwIGZyb20gXCIuL3NyYy90dW5uZWwvYXBwLnRzXCI7XG5leHBvcnQgKiBhcyB0dW5uZWxDbGkgZnJvbSBcIi4vc3JjL3R1bm5lbC9jbGkudHNcIjtcbmV4cG9ydCAqIGFzIHR1bm5lbE9wdGlvbnMgZnJvbSBcIi4vc3JjL3R1bm5lbC9vcHRpb25zLnRzXCI7XG5leHBvcnQgKiBhcyB0dW5uZWxQcm94eSBmcm9tIFwiLi9zcmMvdHVubmVsL3Byb3h5LnRzXCI7XG5leHBvcnQgeyBFbnZFeHBvcnRGb3JtYXRTY2hlbWEsIEVudkNvbW1hbmRPcHRpb25zU2NoZW1hIH0gZnJvbSBcIi4vc3JjL2FwcGtpdC9lbnYtZXhwb3J0LnRzXCI7XG5leHBvcnQgdHlwZSB7IEVudkV4cG9ydEZvcm1hdCwgRW52Q29tbWFuZE9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvYXBwa2l0L2Vudi1leHBvcnQudHNcIjtcbmV4cG9ydCB7IEF1dGhDbGlPcHRpb25zU2NoZW1hLCBUb2tlbkNvbW1hbmRPcHRpb25zU2NoZW1hIH0gZnJvbSBcIi4vc3JjL2F1dGgvb3B0aW9ucy50c1wiO1xuZXhwb3J0IHR5cGUgeyBBdXRoQ2xpT3B0aW9ucywgVG9rZW5Db21tYW5kT3B0aW9ucyB9IGZyb20gXCIuL3NyYy9hdXRoL29wdGlvbnMudHNcIjtcbmV4cG9ydCB7IHJlc29sdmVCdW5Bcmd2IH0gZnJvbSBcIi4vc3JjL2J1bi50c1wiO1xuZXhwb3J0IHR5cGUgeyBHcmFwaGl0aUNsaURlcGVuZGVuY2llcywgR3JhcGhpdGlTZXJ2aWNlT3B0aW9ucyB9IGZyb20gXCIuL3NyYy9ncmFwaGl0aS9jbGkudHNcIjtcbmV4cG9ydCB7IENhbmNlbGxhdGlvblJlZ2lzdHJ5IH0gZnJvbSBcIi4vc3JjL2xha2ViYXNlLXByb3h5L2NhbmNlbGxhdGlvbi50c1wiO1xuZXhwb3J0IHR5cGUgeyBDYW5jZWxsYXRpb25UYXJnZXQsIENhbmNlbGxhdGlvbkZvcndhcmRlciB9IGZyb20gXCIuL3NyYy9sYWtlYmFzZS1wcm94eS9jYW5jZWxsYXRpb24udHNcIjtcbmV4cG9ydCB0eXBlIHsgTGFrZWJhc2VQcm94eUNsaURlcGVuZGVuY2llcyB9IGZyb20gXCIuL3NyYy9sYWtlYmFzZS1wcm94eS9jbGkudHNcIjtcbmV4cG9ydCB7IExha2ViYXNlUHJveHlPcHRpb25zU2NoZW1hLCBMYWtlYmFzZVByb3h5VXJsT3B0aW9uc1NjaGVtYSB9IGZyb20gXCIuL3NyYy9sYWtlYmFzZS1wcm94eS9vcHRpb25zLnRzXCI7XG5leHBvcnQgdHlwZSB7IExha2ViYXNlUHJveHlPcHRpb25zLCBSZXNvbHZlZExha2ViYXNlUHJveHlPcHRpb25zLCBMYWtlYmFzZVByb3h5VXJsT3B0aW9ucyB9IGZyb20gXCIuL3NyYy9sYWtlYmFzZS1wcm94eS9vcHRpb25zLnRzXCI7XG5leHBvcnQgeyBTU0xfUkVRVUVTVCwgQ0FOQ0VMX1JFUVVFU1QsIFBST1RPQ09MXzMsIFBvc3RncmVzUHJvdG9jb2xFcnJvciB9IGZyb20gXCIuL3NyYy9sYWtlYmFzZS1wcm94eS9wcm90b2NvbC50c1wiO1xuZXhwb3J0IHR5cGUgeyBTdGFydHVwTWVzc2FnZSwgQ2FuY2VsTWVzc2FnZSwgSW5pdGlhbE1lc3NhZ2UgfSBmcm9tIFwiLi9zcmMvbGFrZWJhc2UtcHJveHkvcHJvdG9jb2wudHNcIjtcbmV4cG9ydCB7IExha2ViYXNlUHJveHkgfSBmcm9tIFwiLi9zcmMvbGFrZWJhc2UtcHJveHkvcHJveHkudHNcIjtcbmV4cG9ydCB0eXBlIHsgTW9kZWxHYXRld2F5Q2xpRGVwZW5kZW5jaWVzIH0gZnJvbSBcIi4vc3JjL21vZGVsLWdhdGV3YXkvY2xpLnRzXCI7XG5leHBvcnQgeyB3b3Jrc3BhY2VSb290IH0gZnJvbSBcIi4vc3JjL3Jvb3QudHNcIjtcbmV4cG9ydCB7IFR1bm5lbE9wdGlvbnNTY2hlbWEgfSBmcm9tIFwiLi9zcmMvdHVubmVsL29wdGlvbnMudHNcIjtcbmV4cG9ydCB0eXBlIHsgVHVubmVsT3B0aW9ucywgUmVzb2x2ZWRUdW5uZWxPcHRpb25zIH0gZnJvbSBcIi4vc3JjL3R1bm5lbC9vcHRpb25zLnRzXCI7XG5leHBvcnQgdHlwZSB7IFByb3h5T3B0aW9ucyB9IGZyb20gXCIuL3NyYy90dW5uZWwvcHJveHkudHNcIjtcbiJdfQ==
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `dbx appkit` commander program.
|
|
3
|
+
*
|
|
4
|
+
* `env` runs AppKit auto-config and prints the env vars it added or changed as
|
|
5
|
+
* eval-able `export` / `set` lines (or JSON) - e.g. `eval "$(dbx appkit env)"`
|
|
6
|
+
* to load a resolved Lakebase connection into your shell.
|
|
7
|
+
*
|
|
8
|
+
* This package ships no bin of its own: {@link buildProgram} is mounted as the
|
|
9
|
+
* `appkit` subcommand of the single `dbx` CLI (`@dbx-tools/cli`), which imports
|
|
10
|
+
* this module lazily so `dbx dev` never pays for the AppKit load.
|
|
11
|
+
*
|
|
12
|
+
* @module
|
|
13
|
+
*/
|
|
14
|
+
import { Command, CommanderError } from "commander";
|
|
15
|
+
/**
|
|
16
|
+
* Build the `env` command on its own, so a host CLI can mount it under a
|
|
17
|
+
* different parent than {@link buildProgram}'s.
|
|
18
|
+
*/
|
|
19
|
+
export declare function buildEnvCommand(name?: string): Command;
|
|
20
|
+
/** Build the `dbx appkit` commander program (no side effects until parsed). */
|
|
21
|
+
export declare function buildProgram(name?: string): Command;
|
|
22
|
+
/** Parse `argv` and run the matching command. Throws {@link CommanderError} on flag errors. */
|
|
23
|
+
export declare function runCli(argv: string[]): Promise<void>;
|
|
24
|
+
export { CommanderError };
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `dbx appkit` commander program.
|
|
3
|
+
*
|
|
4
|
+
* `env` runs AppKit auto-config and prints the env vars it added or changed as
|
|
5
|
+
* eval-able `export` / `set` lines (or JSON) - e.g. `eval "$(dbx appkit env)"`
|
|
6
|
+
* to load a resolved Lakebase connection into your shell.
|
|
7
|
+
*
|
|
8
|
+
* This package ships no bin of its own: {@link buildProgram} is mounted as the
|
|
9
|
+
* `appkit` subcommand of the single `dbx` CLI (`@dbx-tools/cli`), which imports
|
|
10
|
+
* this module lazily so `dbx dev` never pays for the AppKit load.
|
|
11
|
+
*
|
|
12
|
+
* @module
|
|
13
|
+
*/
|
|
14
|
+
import { appkit } from "@dbx-tools/appkit";
|
|
15
|
+
import { addArgs, parseArgs } from "@dbx-tools/cli-args";
|
|
16
|
+
import { log } from "@dbx-tools/shared-core";
|
|
17
|
+
import { Command, CommanderError } from "commander";
|
|
18
|
+
import { diffEnv, EnvCommandOptionsSchema, formatEnvExport, snapshotEnv, } from "./env-export.js";
|
|
19
|
+
const logger = log.logger("appkit-env");
|
|
20
|
+
/** Run auto-config and write the resulting env delta to stdout. */
|
|
21
|
+
async function writeEnvExport(opts) {
|
|
22
|
+
if (opts.quiet) {
|
|
23
|
+
process.env.LOG_LEVEL = "error";
|
|
24
|
+
}
|
|
25
|
+
logger.debug("Snapshotting env vars");
|
|
26
|
+
const before = snapshotEnv();
|
|
27
|
+
await appkit.autoConfigure({ autoConfigure: "env" });
|
|
28
|
+
const changes = diffEnv(before, snapshotEnv());
|
|
29
|
+
process.stdout.write(formatEnvExport(changes, opts.format));
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Build the `env` command on its own, so a host CLI can mount it under a
|
|
33
|
+
* different parent than {@link buildProgram}'s.
|
|
34
|
+
*/
|
|
35
|
+
export function buildEnvCommand(name = "env") {
|
|
36
|
+
const command = addArgs(new Command(name).description("Run AppKit auto-config and print new/changed env vars."), EnvCommandOptionsSchema);
|
|
37
|
+
return command.action(async () => {
|
|
38
|
+
await writeEnvExport(parseArgs(command, EnvCommandOptionsSchema));
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
/** Build the `dbx appkit` commander program (no side effects until parsed). */
|
|
42
|
+
export function buildProgram(name = "dbx appkit") {
|
|
43
|
+
return new Command()
|
|
44
|
+
.name(name)
|
|
45
|
+
.description("AppKit helpers: resolve the environment an AppKit app would start with.")
|
|
46
|
+
.addCommand(buildEnvCommand())
|
|
47
|
+
.showHelpAfterError();
|
|
48
|
+
}
|
|
49
|
+
/** Parse `argv` and run the matching command. Throws {@link CommanderError} on flag errors. */
|
|
50
|
+
export async function runCli(argv) {
|
|
51
|
+
await buildProgram().parseAsync(argv);
|
|
52
|
+
}
|
|
53
|
+
export { CommanderError };
|
|
54
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGtpdC9jbGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7OztHQVlHO0FBRUgsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDekQsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzdDLE9BQU8sRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRXBELE9BQU8sRUFDTCxPQUFPLEVBQ1AsdUJBQXVCLEVBQ3ZCLGVBQWUsRUFDZixXQUFXLEdBRVosTUFBTSxpQkFBaUIsQ0FBQztBQUV6QixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBRXhDLG1FQUFtRTtBQUNuRSxLQUFLLFVBQVUsY0FBYyxDQUFDLElBQXVCO0lBQ25ELElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDO0lBQ2xDLENBQUM7SUFFRCxNQUFNLENBQUMsS0FBSyxDQUFDLHVCQUF1QixDQUFDLENBQUM7SUFDdEMsTUFBTSxNQUFNLEdBQUcsV0FBVyxFQUFFLENBQUM7SUFDN0IsTUFBTSxNQUFNLENBQUMsYUFBYSxDQUFDLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDckQsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBRS9DLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDOUQsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsSUFBSSxHQUFHLEtBQUs7SUFDMUMsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUNyQixJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUFXLENBQUMsd0RBQXdELENBQUMsRUFDdkYsdUJBQXVCLENBQ3hCLENBQUM7SUFDRixPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLEVBQUU7UUFDL0IsTUFBTSxjQUFjLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSx1QkFBdUIsQ0FBQyxDQUFDLENBQUM7SUFDcEUsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsK0VBQStFO0FBQy9FLE1BQU0sVUFBVSxZQUFZLENBQUMsSUFBSSxHQUFHLFlBQVk7SUFDOUMsT0FBTyxJQUFJLE9BQU8sRUFBRTtTQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDO1NBQ1YsV0FBVyxDQUFDLHlFQUF5RSxDQUFDO1NBQ3RGLFVBQVUsQ0FBQyxlQUFlLEVBQUUsQ0FBQztTQUM3QixrQkFBa0IsRUFBRSxDQUFDO0FBQzFCLENBQUM7QUFFRCwrRkFBK0Y7QUFDL0YsTUFBTSxDQUFDLEtBQUssVUFBVSxNQUFNLENBQUMsSUFBYztJQUN6QyxNQUFNLFlBQVksRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN4QyxDQUFDO0FBRUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBgZGJ4IGFwcGtpdGAgY29tbWFuZGVyIHByb2dyYW0uXG4gKlxuICogYGVudmAgcnVucyBBcHBLaXQgYXV0by1jb25maWcgYW5kIHByaW50cyB0aGUgZW52IHZhcnMgaXQgYWRkZWQgb3IgY2hhbmdlZCBhc1xuICogZXZhbC1hYmxlIGBleHBvcnRgIC8gYHNldGAgbGluZXMgKG9yIEpTT04pIC0gZS5nLiBgZXZhbCBcIiQoZGJ4IGFwcGtpdCBlbnYpXCJgXG4gKiB0byBsb2FkIGEgcmVzb2x2ZWQgTGFrZWJhc2UgY29ubmVjdGlvbiBpbnRvIHlvdXIgc2hlbGwuXG4gKlxuICogVGhpcyBwYWNrYWdlIHNoaXBzIG5vIGJpbiBvZiBpdHMgb3duOiB7QGxpbmsgYnVpbGRQcm9ncmFtfSBpcyBtb3VudGVkIGFzIHRoZVxuICogYGFwcGtpdGAgc3ViY29tbWFuZCBvZiB0aGUgc2luZ2xlIGBkYnhgIENMSSAoYEBkYngtdG9vbHMvY2xpYCksIHdoaWNoIGltcG9ydHNcbiAqIHRoaXMgbW9kdWxlIGxhemlseSBzbyBgZGJ4IGRldmAgbmV2ZXIgcGF5cyBmb3IgdGhlIEFwcEtpdCBsb2FkLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBhcHBraXQgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbmltcG9ydCB7IGFkZEFyZ3MsIHBhcnNlQXJncyB9IGZyb20gXCJAZGJ4LXRvb2xzL2NsaS1hcmdzXCI7XG5pbXBvcnQgeyBsb2cgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgQ29tbWFuZCwgQ29tbWFuZGVyRXJyb3IgfSBmcm9tIFwiY29tbWFuZGVyXCI7XG5cbmltcG9ydCB7XG4gIGRpZmZFbnYsXG4gIEVudkNvbW1hbmRPcHRpb25zU2NoZW1hLFxuICBmb3JtYXRFbnZFeHBvcnQsXG4gIHNuYXBzaG90RW52LFxuICB0eXBlIEVudkNvbW1hbmRPcHRpb25zLFxufSBmcm9tIFwiLi9lbnYtZXhwb3J0LnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJhcHBraXQtZW52XCIpO1xuXG4vKiogUnVuIGF1dG8tY29uZmlnIGFuZCB3cml0ZSB0aGUgcmVzdWx0aW5nIGVudiBkZWx0YSB0byBzdGRvdXQuICovXG5hc3luYyBmdW5jdGlvbiB3cml0ZUVudkV4cG9ydChvcHRzOiBFbnZDb21tYW5kT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAob3B0cy5xdWlldCkge1xuICAgIHByb2Nlc3MuZW52LkxPR19MRVZFTCA9IFwiZXJyb3JcIjtcbiAgfVxuXG4gIGxvZ2dlci5kZWJ1ZyhcIlNuYXBzaG90dGluZyBlbnYgdmFyc1wiKTtcbiAgY29uc3QgYmVmb3JlID0gc25hcHNob3RFbnYoKTtcbiAgYXdhaXQgYXBwa2l0LmF1dG9Db25maWd1cmUoeyBhdXRvQ29uZmlndXJlOiBcImVudlwiIH0pO1xuICBjb25zdCBjaGFuZ2VzID0gZGlmZkVudihiZWZvcmUsIHNuYXBzaG90RW52KCkpO1xuXG4gIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGZvcm1hdEVudkV4cG9ydChjaGFuZ2VzLCBvcHRzLmZvcm1hdCkpO1xufVxuXG4vKipcbiAqIEJ1aWxkIHRoZSBgZW52YCBjb21tYW5kIG9uIGl0cyBvd24sIHNvIGEgaG9zdCBDTEkgY2FuIG1vdW50IGl0IHVuZGVyIGFcbiAqIGRpZmZlcmVudCBwYXJlbnQgdGhhbiB7QGxpbmsgYnVpbGRQcm9ncmFtfSdzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRFbnZDb21tYW5kKG5hbWUgPSBcImVudlwiKTogQ29tbWFuZCB7XG4gIGNvbnN0IGNvbW1hbmQgPSBhZGRBcmdzKFxuICAgIG5ldyBDb21tYW5kKG5hbWUpLmRlc2NyaXB0aW9uKFwiUnVuIEFwcEtpdCBhdXRvLWNvbmZpZyBhbmQgcHJpbnQgbmV3L2NoYW5nZWQgZW52IHZhcnMuXCIpLFxuICAgIEVudkNvbW1hbmRPcHRpb25zU2NoZW1hLFxuICApO1xuICByZXR1cm4gY29tbWFuZC5hY3Rpb24oYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IHdyaXRlRW52RXhwb3J0KHBhcnNlQXJncyhjb21tYW5kLCBFbnZDb21tYW5kT3B0aW9uc1NjaGVtYSkpO1xuICB9KTtcbn1cblxuLyoqIEJ1aWxkIHRoZSBgZGJ4IGFwcGtpdGAgY29tbWFuZGVyIHByb2dyYW0gKG5vIHNpZGUgZWZmZWN0cyB1bnRpbCBwYXJzZWQpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUHJvZ3JhbShuYW1lID0gXCJkYnggYXBwa2l0XCIpOiBDb21tYW5kIHtcbiAgcmV0dXJuIG5ldyBDb21tYW5kKClcbiAgICAubmFtZShuYW1lKVxuICAgIC5kZXNjcmlwdGlvbihcIkFwcEtpdCBoZWxwZXJzOiByZXNvbHZlIHRoZSBlbnZpcm9ubWVudCBhbiBBcHBLaXQgYXBwIHdvdWxkIHN0YXJ0IHdpdGguXCIpXG4gICAgLmFkZENvbW1hbmQoYnVpbGRFbnZDb21tYW5kKCkpXG4gICAgLnNob3dIZWxwQWZ0ZXJFcnJvcigpO1xufVxuXG4vKiogUGFyc2UgYGFyZ3ZgIGFuZCBydW4gdGhlIG1hdGNoaW5nIGNvbW1hbmQuIFRocm93cyB7QGxpbmsgQ29tbWFuZGVyRXJyb3J9IG9uIGZsYWcgZXJyb3JzLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bkNsaShhcmd2OiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBidWlsZFByb2dyYW0oKS5wYXJzZUFzeW5jKGFyZ3YpO1xufVxuXG5leHBvcnQgeyBDb21tYW5kZXJFcnJvciB9O1xuIl19
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Snapshot `process.env`, diff after auto-config, and format deltas as
|
|
3
|
+
* eval-able shell `export` / Windows `set` lines or JSON.
|
|
4
|
+
*
|
|
5
|
+
* @module
|
|
6
|
+
*/
|
|
7
|
+
import { z } from "zod";
|
|
8
|
+
export declare const EnvExportFormatSchema: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodEnum<{
|
|
9
|
+
json: "json";
|
|
10
|
+
export: "export";
|
|
11
|
+
windows: "windows";
|
|
12
|
+
}>>;
|
|
13
|
+
export type EnvExportFormat = z.output<typeof EnvExportFormatSchema>;
|
|
14
|
+
/** Shallow copy of the current process environment. */
|
|
15
|
+
export declare function snapshotEnv(env?: NodeJS.ProcessEnv): Record<string, string>;
|
|
16
|
+
/**
|
|
17
|
+
* Keys whose values were added, changed, or cleared between snapshots. A key
|
|
18
|
+
* that went from a non-blank value to blank/removed is emitted with an empty
|
|
19
|
+
* value so it can be unset. Keys that were already blank/absent and stayed that
|
|
20
|
+
* way are omitted.
|
|
21
|
+
*/
|
|
22
|
+
export declare function diffEnv(before: Record<string, string>, after: Record<string, string>): Record<string, string>;
|
|
23
|
+
/** Select Windows `set` output on Windows and POSIX `export` output elsewhere. */
|
|
24
|
+
export declare function defaultEnvExportFormat(platform?: NodeJS.Platform): EnvExportFormat;
|
|
25
|
+
export declare const EnvCommandOptionsSchema: z.ZodObject<{
|
|
26
|
+
format: z.ZodDefault<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodEnum<{
|
|
27
|
+
json: "json";
|
|
28
|
+
export: "export";
|
|
29
|
+
windows: "windows";
|
|
30
|
+
}>>>;
|
|
31
|
+
quiet: z.ZodDefault<z.ZodBoolean>;
|
|
32
|
+
}, z.core.$strict>;
|
|
33
|
+
export type EnvCommandOptions = z.output<typeof EnvCommandOptionsSchema>;
|
|
34
|
+
/**
|
|
35
|
+
* Format env entries for the requested output style. An empty map prints
|
|
36
|
+
* nothing (no trailing newline).
|
|
37
|
+
*/
|
|
38
|
+
export declare function formatEnvExport(env: Record<string, string>, format: EnvExportFormat): string;
|
|
39
|
+
/** Normalize CLI format aliases to a supported export format. */
|
|
40
|
+
export declare function parseEnvExportFormat(value: string): EnvExportFormat;
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Snapshot `process.env`, diff after auto-config, and format deltas as
|
|
3
|
+
* eval-able shell `export` / Windows `set` lines or JSON.
|
|
4
|
+
*
|
|
5
|
+
* @module
|
|
6
|
+
*/
|
|
7
|
+
import { z } from "zod";
|
|
8
|
+
export const EnvExportFormatSchema = z
|
|
9
|
+
.preprocess((value) => {
|
|
10
|
+
if (typeof value !== "string")
|
|
11
|
+
return value;
|
|
12
|
+
const normalized = value.trim().toLowerCase();
|
|
13
|
+
if (["export", "shell", "nix", "bash"].includes(normalized))
|
|
14
|
+
return "export";
|
|
15
|
+
if (["windows", "win", "cmd"].includes(normalized))
|
|
16
|
+
return "windows";
|
|
17
|
+
return normalized;
|
|
18
|
+
}, z.enum(["export", "windows", "json"]))
|
|
19
|
+
.describe("Environment export output format.");
|
|
20
|
+
/** Shallow copy of the current process environment. */
|
|
21
|
+
export function snapshotEnv(env = process.env) {
|
|
22
|
+
const out = {};
|
|
23
|
+
for (const [key, value] of Object.entries(env)) {
|
|
24
|
+
if (value !== undefined) {
|
|
25
|
+
out[key] = value;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return out;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Keys whose values were added, changed, or cleared between snapshots. A key
|
|
32
|
+
* that went from a non-blank value to blank/removed is emitted with an empty
|
|
33
|
+
* value so it can be unset. Keys that were already blank/absent and stayed that
|
|
34
|
+
* way are omitted.
|
|
35
|
+
*/
|
|
36
|
+
export function diffEnv(before, after) {
|
|
37
|
+
const keys = new Set([...Object.keys(before), ...Object.keys(after)]);
|
|
38
|
+
const out = {};
|
|
39
|
+
for (const key of [...keys].sort()) {
|
|
40
|
+
// Treat a removed key as blank so a non-blank -> blank/removed transition is a delta.
|
|
41
|
+
const prev = before[key] ?? "";
|
|
42
|
+
const next = after[key] ?? "";
|
|
43
|
+
if (next !== prev) {
|
|
44
|
+
out[key] = next;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return out;
|
|
48
|
+
}
|
|
49
|
+
/** Select Windows `set` output on Windows and POSIX `export` output elsewhere. */
|
|
50
|
+
export function defaultEnvExportFormat(platform = process.platform) {
|
|
51
|
+
return platform === "win32" ? "windows" : "export";
|
|
52
|
+
}
|
|
53
|
+
export const EnvCommandOptionsSchema = z
|
|
54
|
+
.object({
|
|
55
|
+
format: EnvExportFormatSchema.default(defaultEnvExportFormat()).describe("Output format: export, windows, or json."),
|
|
56
|
+
quiet: z.boolean().default(false).describe("Suppress auto-config log output."),
|
|
57
|
+
})
|
|
58
|
+
.strict()
|
|
59
|
+
.describe("Options for exporting the AppKit auto-config environment.");
|
|
60
|
+
function escapeExportValue(value) {
|
|
61
|
+
return value
|
|
62
|
+
.replace(/\\/g, "\\\\")
|
|
63
|
+
.replace(/"/g, '\\"')
|
|
64
|
+
.replace(/\$/g, "\\$")
|
|
65
|
+
.replace(/`/g, "\\`");
|
|
66
|
+
}
|
|
67
|
+
function escapeWindowsSetValue(value) {
|
|
68
|
+
if (/[\s"&|<>^]/.test(value)) {
|
|
69
|
+
return `"${value.replace(/"/g, '""')}"`;
|
|
70
|
+
}
|
|
71
|
+
return value;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Format env entries for the requested output style. An empty map prints
|
|
75
|
+
* nothing (no trailing newline).
|
|
76
|
+
*/
|
|
77
|
+
export function formatEnvExport(env, format) {
|
|
78
|
+
const entries = Object.entries(env).sort(([a], [b]) => a.localeCompare(b));
|
|
79
|
+
if (entries.length === 0) {
|
|
80
|
+
return "";
|
|
81
|
+
}
|
|
82
|
+
switch (format) {
|
|
83
|
+
case "json":
|
|
84
|
+
return `${JSON.stringify(Object.fromEntries(entries), null, 2)}\n`;
|
|
85
|
+
case "windows":
|
|
86
|
+
return (entries.map(([key, value]) => `set ${key}=${escapeWindowsSetValue(value)}`).join("\n") +
|
|
87
|
+
"\n");
|
|
88
|
+
case "export":
|
|
89
|
+
return (entries.map(([key, value]) => `export ${key}="${escapeExportValue(value)}"`).join("\n") +
|
|
90
|
+
"\n");
|
|
91
|
+
default:
|
|
92
|
+
throw new Error(`Unknown env export format: ${format}`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/** Normalize CLI format aliases to a supported export format. */
|
|
96
|
+
export function parseEnvExportFormat(value) {
|
|
97
|
+
return EnvExportFormatSchema.parse(value);
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52LWV4cG9ydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcHBraXQvZW52LWV4cG9ydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQUVILE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFFeEIsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsQ0FBQztLQUNuQyxVQUFVLENBQ1QsQ0FBQyxLQUFLLEVBQUUsRUFBRTtJQUNSLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQzVDLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUM5QyxJQUFJLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQztRQUFFLE9BQU8sUUFBUSxDQUFDO0lBQzdFLElBQUksQ0FBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUNyRSxPQUFPLFVBQVUsQ0FBQztBQUNwQixDQUFDLEVBQ0QsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FDdEM7S0FDQSxRQUFRLENBQUMsbUNBQW1DLENBQUMsQ0FBQztBQUlqRCx1REFBdUQ7QUFDdkQsTUFBTSxVQUFVLFdBQVcsQ0FBQyxNQUF5QixPQUFPLENBQUMsR0FBRztJQUM5RCxNQUFNLEdBQUcsR0FBMkIsRUFBRSxDQUFDO0lBQ3ZDLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDL0MsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDeEIsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUNuQixDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLE9BQU8sQ0FDckIsTUFBOEIsRUFDOUIsS0FBNkI7SUFFN0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN0RSxNQUFNLEdBQUcsR0FBMkIsRUFBRSxDQUFDO0lBQ3ZDLEtBQUssTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7UUFDbkMsc0ZBQXNGO1FBQ3RGLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDL0IsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUM5QixJQUFJLElBQUksS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUNsQixHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsa0ZBQWtGO0FBQ2xGLE1BQU0sVUFBVSxzQkFBc0IsQ0FDcEMsV0FBNEIsT0FBTyxDQUFDLFFBQVE7SUFFNUMsT0FBTyxRQUFRLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztBQUNyRCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsQ0FBQztLQUNyQyxNQUFNLENBQUM7SUFDTixNQUFNLEVBQUUscUJBQXFCLENBQUMsT0FBTyxDQUFDLHNCQUFzQixFQUFFLENBQUMsQ0FBQyxRQUFRLENBQ3RFLDBDQUEwQyxDQUMzQztJQUNELEtBQUssRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsQ0FBQyxrQ0FBa0MsQ0FBQztDQUMvRSxDQUFDO0tBQ0QsTUFBTSxFQUFFO0tBQ1IsUUFBUSxDQUFDLDJEQUEyRCxDQUFDLENBQUM7QUFJekUsU0FBUyxpQkFBaUIsQ0FBQyxLQUFhO0lBQ3RDLE9BQU8sS0FBSztTQUNULE9BQU8sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDO1NBQ3RCLE9BQU8sQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDO1NBQ3BCLE9BQU8sQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDO1NBQ3JCLE9BQU8sQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDMUIsQ0FBQztBQUVELFNBQVMscUJBQXFCLENBQUMsS0FBYTtJQUMxQyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUM3QixPQUFPLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQztJQUMxQyxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FBQyxHQUEyQixFQUFFLE1BQXVCO0lBQ2xGLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDM0UsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3pCLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVELFFBQVEsTUFBTSxFQUFFLENBQUM7UUFDZixLQUFLLE1BQU07WUFDVCxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ3JFLEtBQUssU0FBUztZQUNaLE9BQU8sQ0FDTCxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLE9BQU8sR0FBRyxJQUFJLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO2dCQUN0RixJQUFJLENBQ0wsQ0FBQztRQUNKLEtBQUssUUFBUTtZQUNYLE9BQU8sQ0FDTCxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLFVBQVUsR0FBRyxLQUFLLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO2dCQUN2RixJQUFJLENBQ0wsQ0FBQztRQUNKO1lBQ0UsTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsTUFBc0IsRUFBRSxDQUFDLENBQUM7SUFDNUUsQ0FBQztBQUNILENBQUM7QUFFRCxpRUFBaUU7QUFDakUsTUFBTSxVQUFVLG9CQUFvQixDQUFDLEtBQWE7SUFDaEQsT0FBTyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDNUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU25hcHNob3QgYHByb2Nlc3MuZW52YCwgZGlmZiBhZnRlciBhdXRvLWNvbmZpZywgYW5kIGZvcm1hdCBkZWx0YXMgYXNcbiAqIGV2YWwtYWJsZSBzaGVsbCBgZXhwb3J0YCAvIFdpbmRvd3MgYHNldGAgbGluZXMgb3IgSlNPTi5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuZXhwb3J0IGNvbnN0IEVudkV4cG9ydEZvcm1hdFNjaGVtYSA9IHpcbiAgLnByZXByb2Nlc3MoXG4gICAgKHZhbHVlKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiKSByZXR1cm4gdmFsdWU7XG4gICAgICBjb25zdCBub3JtYWxpemVkID0gdmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAoW1wiZXhwb3J0XCIsIFwic2hlbGxcIiwgXCJuaXhcIiwgXCJiYXNoXCJdLmluY2x1ZGVzKG5vcm1hbGl6ZWQpKSByZXR1cm4gXCJleHBvcnRcIjtcbiAgICAgIGlmIChbXCJ3aW5kb3dzXCIsIFwid2luXCIsIFwiY21kXCJdLmluY2x1ZGVzKG5vcm1hbGl6ZWQpKSByZXR1cm4gXCJ3aW5kb3dzXCI7XG4gICAgICByZXR1cm4gbm9ybWFsaXplZDtcbiAgICB9LFxuICAgIHouZW51bShbXCJleHBvcnRcIiwgXCJ3aW5kb3dzXCIsIFwianNvblwiXSksXG4gIClcbiAgLmRlc2NyaWJlKFwiRW52aXJvbm1lbnQgZXhwb3J0IG91dHB1dCBmb3JtYXQuXCIpO1xuXG5leHBvcnQgdHlwZSBFbnZFeHBvcnRGb3JtYXQgPSB6Lm91dHB1dDx0eXBlb2YgRW52RXhwb3J0Rm9ybWF0U2NoZW1hPjtcblxuLyoqIFNoYWxsb3cgY29weSBvZiB0aGUgY3VycmVudCBwcm9jZXNzIGVudmlyb25tZW50LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNuYXBzaG90RW52KGVudjogTm9kZUpTLlByb2Nlc3NFbnYgPSBwcm9jZXNzLmVudik6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCBvdXQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZW52KSkge1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBvdXRba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIEtleXMgd2hvc2UgdmFsdWVzIHdlcmUgYWRkZWQsIGNoYW5nZWQsIG9yIGNsZWFyZWQgYmV0d2VlbiBzbmFwc2hvdHMuIEEga2V5XG4gKiB0aGF0IHdlbnQgZnJvbSBhIG5vbi1ibGFuayB2YWx1ZSB0byBibGFuay9yZW1vdmVkIGlzIGVtaXR0ZWQgd2l0aCBhbiBlbXB0eVxuICogdmFsdWUgc28gaXQgY2FuIGJlIHVuc2V0LiBLZXlzIHRoYXQgd2VyZSBhbHJlYWR5IGJsYW5rL2Fic2VudCBhbmQgc3RheWVkIHRoYXRcbiAqIHdheSBhcmUgb21pdHRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpZmZFbnYoXG4gIGJlZm9yZTogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgYWZ0ZXI6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3Qga2V5cyA9IG5ldyBTZXQoWy4uLk9iamVjdC5rZXlzKGJlZm9yZSksIC4uLk9iamVjdC5rZXlzKGFmdGVyKV0pO1xuICBjb25zdCBvdXQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgZm9yIChjb25zdCBrZXkgb2YgWy4uLmtleXNdLnNvcnQoKSkge1xuICAgIC8vIFRyZWF0IGEgcmVtb3ZlZCBrZXkgYXMgYmxhbmsgc28gYSBub24tYmxhbmsgLT4gYmxhbmsvcmVtb3ZlZCB0cmFuc2l0aW9uIGlzIGEgZGVsdGEuXG4gICAgY29uc3QgcHJldiA9IGJlZm9yZVtrZXldID8/IFwiXCI7XG4gICAgY29uc3QgbmV4dCA9IGFmdGVyW2tleV0gPz8gXCJcIjtcbiAgICBpZiAobmV4dCAhPT0gcHJldikge1xuICAgICAgb3V0W2tleV0gPSBuZXh0O1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG4vKiogU2VsZWN0IFdpbmRvd3MgYHNldGAgb3V0cHV0IG9uIFdpbmRvd3MgYW5kIFBPU0lYIGBleHBvcnRgIG91dHB1dCBlbHNld2hlcmUuICovXG5leHBvcnQgZnVuY3Rpb24gZGVmYXVsdEVudkV4cG9ydEZvcm1hdChcbiAgcGxhdGZvcm06IE5vZGVKUy5QbGF0Zm9ybSA9IHByb2Nlc3MucGxhdGZvcm0sXG4pOiBFbnZFeHBvcnRGb3JtYXQge1xuICByZXR1cm4gcGxhdGZvcm0gPT09IFwid2luMzJcIiA/IFwid2luZG93c1wiIDogXCJleHBvcnRcIjtcbn1cblxuZXhwb3J0IGNvbnN0IEVudkNvbW1hbmRPcHRpb25zU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICBmb3JtYXQ6IEVudkV4cG9ydEZvcm1hdFNjaGVtYS5kZWZhdWx0KGRlZmF1bHRFbnZFeHBvcnRGb3JtYXQoKSkuZGVzY3JpYmUoXG4gICAgICBcIk91dHB1dCBmb3JtYXQ6IGV4cG9ydCwgd2luZG93cywgb3IganNvbi5cIixcbiAgICApLFxuICAgIHF1aWV0OiB6LmJvb2xlYW4oKS5kZWZhdWx0KGZhbHNlKS5kZXNjcmliZShcIlN1cHByZXNzIGF1dG8tY29uZmlnIGxvZyBvdXRwdXQuXCIpLFxuICB9KVxuICAuc3RyaWN0KClcbiAgLmRlc2NyaWJlKFwiT3B0aW9ucyBmb3IgZXhwb3J0aW5nIHRoZSBBcHBLaXQgYXV0by1jb25maWcgZW52aXJvbm1lbnQuXCIpO1xuXG5leHBvcnQgdHlwZSBFbnZDb21tYW5kT3B0aW9ucyA9IHoub3V0cHV0PHR5cGVvZiBFbnZDb21tYW5kT3B0aW9uc1NjaGVtYT47XG5cbmZ1bmN0aW9uIGVzY2FwZUV4cG9ydFZhbHVlKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdmFsdWVcbiAgICAucmVwbGFjZSgvXFxcXC9nLCBcIlxcXFxcXFxcXCIpXG4gICAgLnJlcGxhY2UoL1wiL2csICdcXFxcXCInKVxuICAgIC5yZXBsYWNlKC9cXCQvZywgXCJcXFxcJFwiKVxuICAgIC5yZXBsYWNlKC9gL2csIFwiXFxcXGBcIik7XG59XG5cbmZ1bmN0aW9uIGVzY2FwZVdpbmRvd3NTZXRWYWx1ZSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKC9bXFxzXCImfDw+Xl0vLnRlc3QodmFsdWUpKSB7XG4gICAgcmV0dXJuIGBcIiR7dmFsdWUucmVwbGFjZSgvXCIvZywgJ1wiXCInKX1cImA7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG4vKipcbiAqIEZvcm1hdCBlbnYgZW50cmllcyBmb3IgdGhlIHJlcXVlc3RlZCBvdXRwdXQgc3R5bGUuIEFuIGVtcHR5IG1hcCBwcmludHNcbiAqIG5vdGhpbmcgKG5vIHRyYWlsaW5nIG5ld2xpbmUpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0RW52RXhwb3J0KGVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgZm9ybWF0OiBFbnZFeHBvcnRGb3JtYXQpOiBzdHJpbmcge1xuICBjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXMoZW52KS5zb3J0KChbYV0sIFtiXSkgPT4gYS5sb2NhbGVDb21wYXJlKGIpKTtcbiAgaWYgKGVudHJpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFwiXCI7XG4gIH1cblxuICBzd2l0Y2ggKGZvcm1hdCkge1xuICAgIGNhc2UgXCJqc29uXCI6XG4gICAgICByZXR1cm4gYCR7SlNPTi5zdHJpbmdpZnkoT2JqZWN0LmZyb21FbnRyaWVzKGVudHJpZXMpLCBudWxsLCAyKX1cXG5gO1xuICAgIGNhc2UgXCJ3aW5kb3dzXCI6XG4gICAgICByZXR1cm4gKFxuICAgICAgICBlbnRyaWVzLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBgc2V0ICR7a2V5fT0ke2VzY2FwZVdpbmRvd3NTZXRWYWx1ZSh2YWx1ZSl9YCkuam9pbihcIlxcblwiKSArXG4gICAgICAgIFwiXFxuXCJcbiAgICAgICk7XG4gICAgY2FzZSBcImV4cG9ydFwiOlxuICAgICAgcmV0dXJuIChcbiAgICAgICAgZW50cmllcy5tYXAoKFtrZXksIHZhbHVlXSkgPT4gYGV4cG9ydCAke2tleX09XCIke2VzY2FwZUV4cG9ydFZhbHVlKHZhbHVlKX1cImApLmpvaW4oXCJcXG5cIikgK1xuICAgICAgICBcIlxcblwiXG4gICAgICApO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gZW52IGV4cG9ydCBmb3JtYXQ6ICR7Zm9ybWF0IHNhdGlzZmllcyBuZXZlcn1gKTtcbiAgfVxufVxuXG4vKiogTm9ybWFsaXplIENMSSBmb3JtYXQgYWxpYXNlcyB0byBhIHN1cHBvcnRlZCBleHBvcnQgZm9ybWF0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRW52RXhwb3J0Rm9ybWF0KHZhbHVlOiBzdHJpbmcpOiBFbnZFeHBvcnRGb3JtYXQge1xuICByZXR1cm4gRW52RXhwb3J0Rm9ybWF0U2NoZW1hLnBhcnNlKHZhbHVlKTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `dbx auth` Commander program for Databricks OAuth.
|
|
3
|
+
*
|
|
4
|
+
* The command delegates profile resolution and token lifecycle to
|
|
5
|
+
* `@dbx-tools/auth`.
|
|
6
|
+
*
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
import * as databricks from "@dbx-tools/auth";
|
|
10
|
+
import { Command, CommanderError } from "commander";
|
|
11
|
+
interface AuthCliDependencies {
|
|
12
|
+
createAuthClient: typeof databricks.client.createAuthClient;
|
|
13
|
+
writeJson(value: unknown): void;
|
|
14
|
+
writeText(value: string): void;
|
|
15
|
+
}
|
|
16
|
+
/** Build the `dbx auth` Commander program without parsing arguments. */
|
|
17
|
+
export declare function buildProgram(name?: string, overrides?: Partial<AuthCliDependencies>): Command;
|
|
18
|
+
/** Parse `argv` and run the selected auth operation. */
|
|
19
|
+
export declare function runCli(argv: string[]): Promise<void>;
|
|
20
|
+
export { CommanderError };
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `dbx auth` Commander program for Databricks OAuth.
|
|
3
|
+
*
|
|
4
|
+
* The command delegates profile resolution and token lifecycle to
|
|
5
|
+
* `@dbx-tools/auth`.
|
|
6
|
+
*
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
import * as databricks from "@dbx-tools/auth";
|
|
10
|
+
import { addArgs, parseArgs } from "@dbx-tools/cli-args";
|
|
11
|
+
import { Command, CommanderError } from "commander";
|
|
12
|
+
import { AuthCliOptionsSchema, databricksAuthOptions, TokenCommandOptionsSchema, } from "./options.js";
|
|
13
|
+
const DEFAULT_DEPENDENCIES = {
|
|
14
|
+
createAuthClient: databricks.client.createAuthClient,
|
|
15
|
+
writeJson: (value) => {
|
|
16
|
+
process.stdout.write(`${JSON.stringify(value, null, 2)}\n`);
|
|
17
|
+
},
|
|
18
|
+
writeText: (value) => {
|
|
19
|
+
process.stdout.write(`${value}\n`);
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
/** Open the selected authentication client. */
|
|
23
|
+
async function openAuth(options, dependencies) {
|
|
24
|
+
return {
|
|
25
|
+
auth: await dependencies.createAuthClient(databricksAuthOptions(options)),
|
|
26
|
+
close: async () => { },
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
/** Execute an auth action and close resources owned by the command. */
|
|
30
|
+
async function withAuth(options, dependencies, action) {
|
|
31
|
+
const context = await openAuth(options, dependencies);
|
|
32
|
+
try {
|
|
33
|
+
await action(context);
|
|
34
|
+
}
|
|
35
|
+
finally {
|
|
36
|
+
await context.close();
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/** Shape a generated token record for stable CLI JSON output. */
|
|
40
|
+
function tokenJson(token) {
|
|
41
|
+
return {
|
|
42
|
+
access_token: token.accessToken,
|
|
43
|
+
token_type: token.tokenType,
|
|
44
|
+
...(token.expiry ? { expiry: token.expiry } : {}),
|
|
45
|
+
...(token.scopes.length ? { scopes: token.scopes } : {}),
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
/** Select the serializable identity fields from an authentication client. */
|
|
49
|
+
function clientInfo(auth) {
|
|
50
|
+
return {
|
|
51
|
+
...(auth.profile ? { profile: auth.profile } : {}),
|
|
52
|
+
host: auth.host,
|
|
53
|
+
...(auth.accountId ? { accountId: auth.accountId } : {}),
|
|
54
|
+
...(auth.workspaceId ? { workspaceId: auth.workspaceId } : {}),
|
|
55
|
+
target: auth.target,
|
|
56
|
+
authType: auth.authType,
|
|
57
|
+
principal: auth.principal,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
/** Build the `dbx auth` Commander program without parsing arguments. */
|
|
61
|
+
export function buildProgram(name = "dbx auth", overrides = {}) {
|
|
62
|
+
const dependencies = { ...DEFAULT_DEPENDENCIES, ...overrides };
|
|
63
|
+
const program = addArgs(new Command()
|
|
64
|
+
.name(name)
|
|
65
|
+
.description("Authenticate to Databricks with user or machine OAuth")
|
|
66
|
+
.showHelpAfterError(), AuthCliOptionsSchema);
|
|
67
|
+
const options = () => parseArgs(program, AuthCliOptionsSchema);
|
|
68
|
+
program
|
|
69
|
+
.command("login")
|
|
70
|
+
.description("Force browser login and return an access token")
|
|
71
|
+
.action(async () => {
|
|
72
|
+
await withAuth(options(), dependencies, async ({ auth }) => {
|
|
73
|
+
dependencies.writeJson(tokenJson(await auth.token({ login: true })));
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
const tokenCommand = addArgs(program.command("token").description("Return a valid access token, logging in when needed"), TokenCommandOptionsSchema);
|
|
77
|
+
tokenCommand.action(async () => {
|
|
78
|
+
const tokenOptions = parseArgs(tokenCommand, TokenCommandOptionsSchema);
|
|
79
|
+
await withAuth(options(), dependencies, async ({ auth }) => {
|
|
80
|
+
const token = await auth.token({
|
|
81
|
+
...(tokenOptions.login ? {} : { login: false }),
|
|
82
|
+
...(tokenOptions.forceRefresh ? { refresh: true } : {}),
|
|
83
|
+
});
|
|
84
|
+
dependencies.writeJson(tokenJson(token));
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
program
|
|
88
|
+
.command("profile")
|
|
89
|
+
.description("Print the configured or automatically detected profile")
|
|
90
|
+
.action(async () => {
|
|
91
|
+
await withAuth(options(), dependencies, async ({ auth }) => {
|
|
92
|
+
dependencies.writeText(auth.profile ?? "ambient");
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
program
|
|
96
|
+
.command("logout")
|
|
97
|
+
.description("Delete the stored credential for the selected profile")
|
|
98
|
+
.action(async () => {
|
|
99
|
+
await withAuth(options(), dependencies, async ({ auth }) => {
|
|
100
|
+
await auth.logout();
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
program
|
|
104
|
+
.command("status")
|
|
105
|
+
.description("Show the resolved authentication client configuration")
|
|
106
|
+
.action(async () => {
|
|
107
|
+
await withAuth(options(), dependencies, async ({ auth }) => {
|
|
108
|
+
dependencies.writeJson(clientInfo(auth));
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
return program;
|
|
112
|
+
}
|
|
113
|
+
/** Parse `argv` and run the selected auth operation. */
|
|
114
|
+
export async function runCli(argv) {
|
|
115
|
+
await buildProgram().parseAsync(argv);
|
|
116
|
+
}
|
|
117
|
+
export { CommanderError };
|
|
118
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2F1dGgvY2xpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7O0dBT0c7QUFFSCxPQUFPLEtBQUssVUFBVSxNQUFNLGlCQUFpQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFekQsT0FBTyxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFcEQsT0FBTyxFQUNMLG9CQUFvQixFQUNwQixxQkFBcUIsRUFDckIseUJBQXlCLEdBRTFCLE1BQU0sY0FBYyxDQUFDO0FBYXRCLE1BQU0sb0JBQW9CLEdBQXdCO0lBQ2hELGdCQUFnQixFQUFFLFVBQVUsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCO0lBQ3BELFNBQVMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO1FBQ25CLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBQ0QsU0FBUyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7UUFDbkIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFLLElBQUksQ0FBQyxDQUFDO0lBQ3JDLENBQUM7Q0FDRixDQUFDO0FBRUYsK0NBQStDO0FBQy9DLEtBQUssVUFBVSxRQUFRLENBQ3JCLE9BQXVCLEVBQ3ZCLFlBQWlDO0lBRWpDLE9BQU87UUFDTCxJQUFJLEVBQUUsTUFBTSxZQUFZLENBQUMsZ0JBQWdCLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDekUsS0FBSyxFQUFFLEtBQUssSUFBSSxFQUFFLEdBQUUsQ0FBQztLQUN0QixDQUFDO0FBQ0osQ0FBQztBQUVELHVFQUF1RTtBQUN2RSxLQUFLLFVBQVUs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LE9BQU8sQ0FBQyxRQUFRLENBQUM7U0FDakIsV0FBVyxDQUFDLHVEQUF1RCxDQUFDO1NBQ3BFLE1BQU0sQ0FBQyxLQUFLLElBQUksRUFBRTtRQUNqQixNQUFNLFFBQVEsQ0FBQyxPQUFPLEVBQUUsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRTtZQUN6RCxNQUFNLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUN0QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUwsT0FBTztTQUNKLE9BQU8sQ0FBQyxRQUFRLENBQUM7U0FDakIsV0FBVyxDQUFDLHVEQUF1RCxDQUFDO1NBQ3BFLE1BQU0sQ0FBQyxLQUFLLElBQUksRUFBRTtRQUNqQixNQUFNLFFBQVEsQ0FBQyxPQUFPLEVBQUUsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRTtZQUN6RCxZQUFZLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQzNDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFTCxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDO0FBRUQsd0RBQXdEO0FBQ3hELE1BQU0sQ0FBQyxLQUFLLFVBQVUsTUFBTSxDQUFDLElBQWM7SUFDekMsTUFBTSxZQUFZLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDeEMsQ0FBQztBQUVELE9BQU8sRUFBRSxjQUFjLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogYGRieCBhdXRoYCBDb21tYW5kZXIgcHJvZ3JhbSBmb3IgRGF0YWJyaWNrcyBPQXV0aC5cbiAqXG4gKiBUaGUgY29tbWFuZCBkZWxlZ2F0ZXMgcHJvZmlsZSByZXNvbHV0aW9uIGFuZCB0b2tlbiBsaWZlY3ljbGUgdG9cbiAqIGBAZGJ4LXRvb2xzL2F1dGhgLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgKiBhcyBkYXRhYnJpY2tzIGZyb20gXCJAZGJ4LXRvb2xzL2F1dGhcIjtcbmltcG9ydCB7IGFkZEFyZ3MsIHBhcnNlQXJncyB9IGZyb20gXCJAZGJ4LXRvb2xzL2NsaS1hcmdzXCI7XG5pbXBvcnQgdHlwZSB7IERhdGFicmlja3NBdXRoQ2xpZW50SW5mbyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1hdXRoL2NsaWVudFwiO1xuaW1wb3J0IHsgQ29tbWFuZCwgQ29tbWFuZGVyRXJyb3IgfSBmcm9tIFwiY29tbWFuZGVyXCI7XG5cbmltcG9ydCB7XG4gIEF1dGhDbGlPcHRpb25zU2NoZW1hLFxuICBkYXRhYnJpY2tzQXV0aE9wdGlvbnMsXG4gIFRva2VuQ29tbWFuZE9wdGlvbnNTY2hlbWEsXG4gIHR5cGUgQXV0aENsaU9wdGlvbnMsXG59IGZyb20gXCIuL29wdGlvbnMudHNcIjtcblxuaW50ZXJmYWNlIEF1dGhDb250ZXh0IHtcbiAgYXV0aDogZGF0YWJyaWNrcy5BdXRoQ2xpZW50O1xuICBjbG9zZSgpOiBQcm9taXNlPHZvaWQ+O1xufVxuXG5pbnRlcmZhY2UgQXV0aENsaURlcGVuZGVuY2llcyB7XG4gIGNyZWF0ZUF1dGhDbGllbnQ6IHR5cGVvZiBkYXRhYnJpY2tzLmNsaWVudC5jcmVhdGVBdXRoQ2xpZW50O1xuICB3cml0ZUpzb24odmFsdWU6IHVua25vd24pOiB2b2lkO1xuICB3cml0ZVRleHQodmFsdWU6IHN0cmluZyk6IHZvaWQ7XG59XG5cbmNvbnN0IERFRkFVTFRfREVQRU5ERU5DSUVTOiBBdXRoQ2xpRGVwZW5kZW5jaWVzID0ge1xuICBjcmVhdGVBdXRoQ2xpZW50OiBkYXRhYnJpY2tzLmNsaWVudC5jcmVhdGVBdXRoQ2xpZW50LFxuICB3cml0ZUpzb246ICh2YWx1ZSkgPT4ge1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGAke0pTT04uc3RyaW5naWZ5KHZhbHVlLCBudWxsLCAyKX1cXG5gKTtcbiAgfSxcbiAgd3JpdGVUZXh0OiAodmFsdWUpID0+IHtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShgJHt2YWx1ZX1cXG5gKTtcbiAgfSxcbn07XG5cbi8qKiBPcGVuIHRoZSBzZWxlY3RlZCBhdXRoZW50aWNhdGlvbiBjbGllbnQuICovXG5hc3luYyBmdW5jdGlvbiBvcGVuQXV0aChcbiAgb3B0aW9uczogQXV0aENsaU9wdGlvbnMsXG4gIGRlcGVuZGVuY2llczogQXV0aENsaURlcGVuZGVuY2llcyxcbik6IFByb21pc2U8QXV0aENvbnRleHQ+IHtcbiAgcmV0dXJuIHtcbiAgICBhdXRoOiBhd2FpdCBkZXBlbmRlbmNpZXMuY3JlYXRlQXV0aENsaWVudChkYXRhYnJpY2tzQXV0aE9wdGlvbnMob3B0aW9ucykpLFxuICAgIGNsb3NlOiBhc3luYyAoKSA9PiB7fSxcbiAgfTtcbn1cblxuLyoqIEV4ZWN1dGUgYW4gYXV0aCBhY3Rpb24gYW5kIGNsb3NlIHJlc291cmNlcyBvd25lZCBieSB0aGUgY29tbWFuZC4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdpdGhBdXRoKFxuICBvcHRpb25zOiBBdXRoQ2xpT3B0aW9ucyxcbiAgZGVwZW5kZW5jaWVzOiBBdXRoQ2xpRGVwZW5kZW5jaWVzLFxuICBhY3Rpb246IChjb250ZXh0OiBBdXRoQ29udGV4dCkgPT4gUHJvbWlzZTx2b2lkPixcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjb250ZXh0ID0gYXdhaXQgb3BlbkF1dGgob3B0aW9ucywgZGVwZW5kZW5jaWVzKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBhY3Rpb24oY29udGV4dCk7XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgY29udGV4dC5jbG9zZSgpO1xuICB9XG59XG5cbi8qKiBTaGFwZSBhIGdlbmVyYXRlZCB0b2tlbiByZWNvcmQgZm9yIHN0YWJsZSBDTEkgSlNPTiBvdXRwdXQuICovXG5mdW5jdGlvbiB0b2tlbkpzb24odG9rZW46IGRhdGFicmlja3MuQWNjZXNzVG9rZW4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIHJldHVybiB7XG4gICAgYWNjZXNzX3Rva2VuOiB0b2tlbi5hY2Nlc3NUb2tlbixcbiAgICB0b2tlbl90eXBlOiB0b2tlbi50b2tlblR5cGUsXG4gICAgLi4uKHRva2VuLmV4cGlyeSA/IHsgZXhwaXJ5OiB0b2tlbi5leHBpcnkgfSA6IHt9KSxcbiAgICAuLi4odG9rZW4uc2NvcGVzLmxlbmd0aCA/IHsgc2NvcGVzOiB0b2tlbi5zY29wZXMgfSA6IHt9KSxcbiAgfTtcbn1cblxuLyoqIFNlbGVjdCB0aGUgc2VyaWFsaXphYmxlIGlkZW50aXR5IGZpZWxkcyBmcm9tIGFuIGF1dGhlbnRpY2F0aW9uIGNsaWVudC4gKi9cbmZ1bmN0aW9uIGNsaWVudEluZm8oYXV0aDogZGF0YWJyaWNrcy5BdXRoQ2xpZW50KTogRGF0YWJyaWNrc0F1dGhDbGllbnRJbmZvIHtcbiAgcmV0dXJuIHtcbiAgICAuLi4oYXV0aC5wcm9maWxlID8geyBwcm9maWxlOiBhdXRoLnByb2ZpbGUgfSA6IHt9KSxcbiAgICBob3N0OiBhdXRoLmhvc3QsXG4gICAgLi4uKGF1dGguYWNjb3VudElkID8geyBhY2NvdW50SWQ6IGF1dGguYWNjb3VudElkIH0gOiB7fSksXG4gICAgLi4uKGF1dGgud29ya3NwYWNlSWQgPyB7IHdvcmtzcGFjZUlkOiBhdXRoLndvcmtzcGFjZUlkIH0gOiB7fSksXG4gICAgdGFyZ2V0OiBhdXRoLnRhcmdldCxcbiAgICBhdXRoVHlwZTogYXV0aC5hdXRoVHlwZSxcbiAgICBwcmluY2lwYWw6IGF1dGgucHJpbmNpcGFsLFxuICB9O1xufVxuXG4vKiogQnVpbGQgdGhlIGBkYnggYXV0aGAgQ29tbWFuZGVyIHByb2dyYW0gd2l0aG91dCBwYXJzaW5nIGFyZ3VtZW50cy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFByb2dyYW0oXG4gIG5hbWUgPSBcImRieCBhdXRoXCIsXG4gIG92ZXJyaWRlczogUGFydGlhbDxBdXRoQ2xpRGVwZW5kZW5jaWVzPiA9IHt9LFxuKTogQ29tbWFuZCB7XG4gIGNvbnN0IGRlcGVuZGVuY2llcyA9IHsgLi4uREVGQVVMVF9ERVBFTkRFTkNJRVMsIC4uLm92ZXJyaWRlcyB9O1xuICBjb25zdCBwcm9ncmFtID0gYWRkQXJncyhcbiAgICBuZXcgQ29tbWFuZCgpXG4gICAgICAubmFtZShuYW1lKVxuICAgICAgLmRlc2NyaXB0aW9uKFwiQXV0aGVudGljYXRlIHRvIERhdGFicmlja3Mgd2l0aCB1c2VyIG9yIG1hY2hpbmUgT0F1dGhcIilcbiAgICAgIC5zaG93SGVscEFmdGVyRXJyb3IoKSxcbiAgICBBdXRoQ2xpT3B0aW9uc1NjaGVtYSxcbiAgKTtcbiAgY29uc3Qgb3B0aW9ucyA9ICgpOiBBdXRoQ2xpT3B0aW9ucyA9PiBwYXJzZUFyZ3MocHJvZ3JhbSwgQXV0aENsaU9wdGlvbnNTY2hlbWEpO1xuXG4gIHByb2dyYW1cbiAgICAuY29tbWFuZChcImxvZ2luXCIpXG4gICAgLmRlc2NyaXB0aW9uKFwiRm9yY2UgYnJvd3NlciBsb2dpbiBhbmQgcmV0dXJuIGFuIGFjY2VzcyB0b2tlblwiKVxuICAgIC5hY3Rpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgd2l0aEF1dGgob3B0aW9ucygpLCBkZXBlbmRlbmNpZXMsIGFzeW5jICh7IGF1dGggfSkgPT4ge1xuICAgICAgICBkZXBlbmRlbmNpZXMud3JpdGVKc29uKHRva2VuSnNvbihhd2FpdCBhdXRoLnRva2VuKHsgbG9naW46IHRydWUgfSkpKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gIGNvbnN0IHRva2VuQ29tbWFuZCA9IGFkZEFyZ3MoXG4gICAgcHJvZ3JhbS5jb21tYW5kKFwidG9rZW5cIikuZGVzY3JpcHRpb24oXCJSZXR1cm4gYSB2YWxpZCBhY2Nlc3MgdG9rZW4sIGxvZ2dpbmcgaW4gd2hlbiBuZWVkZWRcIiksXG4gICAgVG9rZW5Db21tYW5kT3B0aW9uc1NjaGVtYSxcbiAgKTtcbiAgdG9rZW5Db21tYW5kLmFjdGlvbihhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdG9rZW5PcHRpb25zID0gcGFyc2VBcmdzKHRva2VuQ29tbWFuZCwgVG9rZW5Db21tYW5kT3B0aW9uc1NjaGVtYSk7XG4gICAgYXdhaXQgd2l0aEF1dGgob3B0aW9ucygpLCBkZXBlbmRlbmNpZXMsIGFzeW5jICh7IGF1dGggfSkgPT4ge1xuICAgICAgY29uc3QgdG9rZW4gPSBhd2FpdCBhdXRoLnRva2VuKHtcbiAgICAgICAgLi4uKHRva2VuT3B0aW9ucy5sb2dpbiA/IHt9IDogeyBsb2dpbjogZmFsc2UgfSksXG4gICAgICAgIC4uLih0b2tlbk9wdGlvbnMuZm9yY2VSZWZyZXNoID8geyByZWZyZXNoOiB0cnVlIH0gOiB7fSksXG4gICAgICB9KTtcbiAgICAgIGRlcGVuZGVuY2llcy53cml0ZUpzb24odG9rZW5Kc29uKHRva2VuKSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIHByb2dyYW1cbiAgICAuY29tbWFuZChcInByb2ZpbGVcIilcbiAgICAuZGVzY3JpcHRpb24oXCJQcmludCB0aGUgY29uZmlndXJlZCBvciBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHByb2ZpbGVcIilcbiAgICAuYWN0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHdpdGhBdXRoKG9wdGlvbnMoKSwgZGVwZW5kZW5jaWVzLCBhc3luYyAoeyBhdXRoIH0pID0+IHtcbiAgICAgICAgZGVwZW5kZW5jaWVzLndyaXRlVGV4dChhdXRoLnByb2ZpbGUgPz8gXCJhbWJpZW50XCIpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgcHJvZ3JhbVxuICAgIC5jb21tYW5kKFwibG9nb3V0XCIpXG4gICAgLmRlc2NyaXB0aW9uKFwiRGVsZXRlIHRoZSBzdG9yZWQgY3JlZGVudGlhbCBmb3IgdGhlIHNlbGVjdGVkIHByb2ZpbGVcIilcbiAgICAuYWN0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHdpdGhBdXRoKG9wdGlvbnMoKSwgZGVwZW5kZW5jaWVzLCBhc3luYyAoeyBhdXRoIH0pID0+IHtcbiAgICAgICAgYXdhaXQgYXV0aC5sb2dvdXQoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gIHByb2dyYW1cbiAgICAuY29tbWFuZChcInN0YXR1c1wiKVxuICAgIC5kZXNjcmlwdGlvbihcIlNob3cgdGhlIHJlc29sdmVkIGF1dGhlbnRpY2F0aW9uIGNsaWVudCBjb25maWd1cmF0aW9uXCIpXG4gICAgLmFjdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCB3aXRoQXV0aChvcHRpb25zKCksIGRlcGVuZGVuY2llcywgYXN5bmMgKHsgYXV0aCB9KSA9PiB7XG4gICAgICAgIGRlcGVuZGVuY2llcy53cml0ZUpzb24oY2xpZW50SW5mbyhhdXRoKSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICByZXR1cm4gcHJvZ3JhbTtcbn1cblxuLyoqIFBhcnNlIGBhcmd2YCBhbmQgcnVuIHRoZSBzZWxlY3RlZCBhdXRoIG9wZXJhdGlvbi4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5DbGkoYXJndjogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgYnVpbGRQcm9ncmFtKCkucGFyc2VBc3luYyhhcmd2KTtcbn1cblxuZXhwb3J0IHsgQ29tbWFuZGVyRXJyb3IgfTtcbiJdfQ==
|