@dbx-tools/cli-appkit-env 0.9.38 → 0.9.43

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
@@ -1,77 +1,82 @@
1
1
  # @dbx-tools/cli-appkit-env
2
2
 
3
- CLI and formatting helpers for exporting AppKit auto-configuration results.
3
+ Export the environment that AppKit resolves so another process can use the same
4
+ Lakebase connection and application configuration. Choose shell, JSON, or
5
+ Windows output without repeating AppKit discovery in your startup scripts.
4
6
 
5
- Use `dbx appkit env` when a shell or process manager needs the Lakebase /
6
- AppKit environment that [`@dbx-tools/appkit`](../../node/appkit) would
7
- resolve before `createApp()`.
7
+ ## Configure A Shell
8
8
 
9
- Key features:
10
-
11
- - Runs the same AppKit auto-configuration path used by
12
- [`@dbx-tools/appkit`](../../node/appkit).
13
- - Emits only variables that changed during auto-configuration.
14
- - Supports shell `export`, JSON, and Windows `set` output formats.
15
- - Provides importable env snapshot/diff/format helpers for tests and wrapper
16
- CLIs.
17
- - Keeps local shell setup aligned with deployed AppKit startup behavior.
18
-
19
- ## Load Env Into A Shell
9
+ Install the [`dbx` CLI](../dbx-tools), then run this from your AppKit project:
20
10
 
21
11
  ```sh
22
12
  eval "$(dbx appkit env --quiet)"
23
13
  ```
24
14
 
25
- The command snapshots `process.env`, runs AppKit auto-config, diffs the result,
26
- and prints only new or changed variables. On POSIX shells the default output is
27
- `export KEY=value`.
28
-
29
- This package ships no bin of its own. It contributes the `appkit` command group
30
- to the single `dbx` CLI in [`@dbx-tools/cli`](../dbx-tools), which is what you
31
- install:
32
-
33
- ```sh
34
- npm install --global @dbx-tools/cli
35
- dbx appkit env --quiet
36
- ```
37
-
38
- `dbx` imports this package lazily, so AppKit loads only when an `appkit`
39
- command actually runs.
15
+ The command runs AppKit auto-configuration and prints only variables that were
16
+ added or changed. The default format is POSIX `export KEY=value` statements.
17
+ `--quiet` keeps configuration logs out of the output you evaluate.
40
18
 
41
- This is useful when another process must start after Lakebase discovery has
42
- filled `PGHOST`, `PGDATABASE`, `PGUSER`, or related AppKit variables.
19
+ Use this before starting a process that needs resolved variables such as
20
+ `PGHOST`, `PGDATABASE`, or `PGUSER`.
43
21
 
44
- ## Inspect JSON Or Windows Output
22
+ ## Inspect Configuration
45
23
 
46
24
  ```sh
47
25
  dbx appkit env --format json
48
26
  dbx appkit env --format windows
49
27
  ```
50
28
 
51
- Use JSON for process managers and tests. Use Windows format for `cmd.exe`
52
- `set KEY=value` lines.
29
+ JSON is useful for process managers and scripts. Windows format produces
30
+ `set KEY=value` statements for `cmd.exe`. Review output before sharing it:
31
+ resolved configuration may contain credentials.
53
32
 
54
- ## Format Env Diffs Programmatically
33
+ ## Format Environment Changes In Code
55
34
 
56
35
  ```ts
57
36
  import { envExport } from "@dbx-tools/cli-appkit-env";
58
37
 
59
38
  const before = envExport.snapshotEnv();
60
- process.env.PGHOST = "ep-foo.database.azuredatabricks.net";
61
- const diff = envExport.diffEnv(before);
39
+ process.env.PGHOST = "ep-example.database.cloud.databricks.com";
40
+ const changed = envExport.diffEnv(before);
41
+ console.log(envExport.formatEnvExport(changed, "export"));
42
+ ```
43
+
44
+ Reuse these helpers when a custom CLI or test needs the same formats. For AppKit
45
+ application startup itself, use
46
+ [`@dbx-tools/appkit`](../../node/appkit) rather than invoking a shell command.
47
+
48
+ <!-- cli-reference:start -->
62
49
 
63
- console.log(envExport.formatEnvExport(diff, "export"));
50
+ ## Command Reference
51
+
52
+ ### `dbx appkit`
53
+
54
+ AppKit helpers: resolve the environment an AppKit app would start with.
55
+
56
+ ```sh
57
+ dbx appkit [command]
64
58
  ```
65
59
 
66
- These helpers are useful in tests for auto-config behavior or in custom CLIs
67
- that want the same output formats without invoking the bin.
60
+ #### Commands
61
+
62
+ | Command | Description |
63
+ | --------------- | ------------------------------------------------------ |
64
+ | `env [options]` | Run AppKit auto-config and print new/changed env vars. |
65
+
66
+ ### `dbx appkit env`
67
+
68
+ Run AppKit auto-config and print new/changed env vars.
69
+
70
+ ```sh
71
+ dbx appkit env [options]
72
+ ```
68
73
 
69
- ## Modules
74
+ #### Options
70
75
 
71
- - `cli` - the `dbx appkit` commander program: `buildProgram(name?)` (what
72
- `@dbx-tools/cli` mounts), `buildEnvCommand()`, and `runCli()`.
73
- - `envExport` - env snapshots, env diffs, default format detection,
74
- `formatEnvExport()`, and `parseEnvExportFormat()`.
76
+ | Option | Description |
77
+ | ------------------ | --------------------------------------------------------------------------------------------------------------- |
78
+ | `--format <value>` | Output format: export, windows, or json. (choices: "export", "windows", "json", default: "export", env: FORMAT) |
79
+ | `--quiet` | Suppress auto-config log output. (default: false, env: QUIET) |
80
+ | `--no-quiet` | Disable suppress auto-config log output. |
75
81
 
76
- Auto-config itself lives in
77
- [`@dbx-tools/appkit`](../../node/appkit).
82
+ <!-- cli-reference:end -->
package/index.ts CHANGED
@@ -3,8 +3,9 @@
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-appkit-env";
6
- export const PACKAGE_VERSION = "0.9.38";
6
+ export const PACKAGE_VERSION = "0.9.43";
7
7
  export * as cli from "./src/cli.ts";
8
8
  export * as envExport from "./src/env-export.ts";
9
9
  export { CommanderError } from "./src/cli.ts";
10
- export type { EnvExportFormat } from "./src/env-export.ts";
10
+ export { EnvExportFormatSchema, EnvCommandOptionsSchema } from "./src/env-export.ts";
11
+ export type { EnvExportFormat, EnvCommandOptions } from "./src/env-export.ts";
package/lib/index.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  export declare const PACKAGE_IDENTIFIER = "@dbx-tools/cli-appkit-env";
2
- export declare const PACKAGE_VERSION = "0.9.38";
2
+ export declare const PACKAGE_VERSION = "0.9.43";
3
3
  export * as cli from "./src/cli.ts";
4
4
  export * as envExport from "./src/env-export.ts";
5
5
  export { CommanderError } from "./src/cli.ts";
6
- export type { EnvExportFormat } from "./src/env-export.ts";
6
+ export { EnvExportFormatSchema, EnvCommandOptionsSchema } from "./src/env-export.ts";
7
+ export type { EnvExportFormat, EnvCommandOptions } from "./src/env-export.ts";
package/lib/index.js CHANGED
@@ -2,8 +2,9 @@
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-appkit-env";
5
- export const PACKAGE_VERSION = "0.9.38";
5
+ export const PACKAGE_VERSION = "0.9.43";
6
6
  export * as cli from "./src/cli.js";
7
7
  export * as envExport from "./src/env-export.js";
8
8
  export { CommanderError } from "./src/cli.js";
9
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRywyQkFBMkIsQ0FBQztBQUM5RCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxHQUFHLE1BQU0sY0FBYyxDQUFDO0FBQ3BDLE9BQU8sS0FBSyxTQUFTLE1BQU0scUJBQXFCLENBQUM7QUFDakQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdFTkVSQVRFRCBieSBwcm9qZW4gd2F0Y2ggLSBETyBOT1QgRURJVC5cbi8vIFJlZ2VuZXJhdGVkIGZyb20gdGhlIGV4cG9ydGluZyBtb2R1bGVzIGluIC4vc3JjLlxuLy8gSGFuZCBlZGl0cyBhcmUgb3ZlcndyaXR0ZW4gb24gdGhlIG5leHQgd2F0Y2g7IHRoaXMgZmlsZSBpcyByZWFkLW9ubHkuXG5cbmV4cG9ydCBjb25zdCBQQUNLQUdFX0lERU5USUZJRVIgPSBcIkBkYngtdG9vbHMvY2xpLWFwcGtpdC1lbnZcIjtcbmV4cG9ydCBjb25zdCBQQUNLQUdFX1ZFUlNJT04gPSBcIjAuOS4zOFwiO1xuZXhwb3J0ICogYXMgY2xpIGZyb20gXCIuL3NyYy9jbGkudHNcIjtcbmV4cG9ydCAqIGFzIGVudkV4cG9ydCBmcm9tIFwiLi9zcmMvZW52LWV4cG9ydC50c1wiO1xuZXhwb3J0IHsgQ29tbWFuZGVyRXJyb3IgfSBmcm9tIFwiLi9zcmMvY2xpLnRzXCI7XG5leHBvcnQgdHlwZSB7IEVudkV4cG9ydEZvcm1hdCB9IGZyb20gXCIuL3NyYy9lbnYtZXhwb3J0LnRzXCI7XG4iXX0=
9
+ export { EnvExportFormatSchema, EnvCommandOptionsSchema } from "./src/env-export.js";
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRywyQkFBMkIsQ0FBQztBQUM5RCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxHQUFHLE1BQU0sY0FBYyxDQUFDO0FBQ3BDLE9BQU8sS0FBSyxTQUFTLE1BQU0scUJBQXFCLENBQUM7QUFDakQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM5QyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdFTkVSQVRFRCBieSBwcm9qZW4gd2F0Y2ggLSBETyBOT1QgRURJVC5cbi8vIFJlZ2VuZXJhdGVkIGZyb20gdGhlIGV4cG9ydGluZyBtb2R1bGVzIGluIC4vc3JjLlxuLy8gSGFuZCBlZGl0cyBhcmUgb3ZlcndyaXR0ZW4gb24gdGhlIG5leHQgd2F0Y2g7IHRoaXMgZmlsZSBpcyByZWFkLW9ubHkuXG5cbmV4cG9ydCBjb25zdCBQQUNLQUdFX0lERU5USUZJRVIgPSBcIkBkYngtdG9vbHMvY2xpLWFwcGtpdC1lbnZcIjtcbmV4cG9ydCBjb25zdCBQQUNLQUdFX1ZFUlNJT04gPSBcIjAuOS40M1wiO1xuZXhwb3J0ICogYXMgY2xpIGZyb20gXCIuL3NyYy9jbGkudHNcIjtcbmV4cG9ydCAqIGFzIGVudkV4cG9ydCBmcm9tIFwiLi9zcmMvZW52LWV4cG9ydC50c1wiO1xuZXhwb3J0IHsgQ29tbWFuZGVyRXJyb3IgfSBmcm9tIFwiLi9zcmMvY2xpLnRzXCI7XG5leHBvcnQgeyBFbnZFeHBvcnRGb3JtYXRTY2hlbWEsIEVudkNvbW1hbmRPcHRpb25zU2NoZW1hIH0gZnJvbSBcIi4vc3JjL2Vudi1leHBvcnQudHNcIjtcbmV4cG9ydCB0eXBlIHsgRW52RXhwb3J0Rm9ybWF0LCBFbnZDb21tYW5kT3B0aW9ucyB9IGZyb20gXCIuL3NyYy9lbnYtZXhwb3J0LnRzXCI7XG4iXX0=
package/lib/src/cli.js CHANGED
@@ -12,32 +12,31 @@
12
12
  * @module
13
13
  */
14
14
  import { appkit } from "@dbx-tools/appkit";
15
+ import { addArgs, parseArgs } from "@dbx-tools/cli-args/args";
15
16
  import { log } from "@dbx-tools/shared-core";
16
17
  import { Command, CommanderError } from "commander";
17
- import { defaultEnvExportFormat, diffEnv, formatEnvExport, parseEnvExportFormat, snapshotEnv, } from "./env-export.js";
18
+ import { diffEnv, EnvCommandOptionsSchema, formatEnvExport, snapshotEnv, } from "./env-export.js";
18
19
  const logger = log.logger("appkit-env");
19
20
  /** Run auto-config and write the resulting env delta to stdout. */
20
21
  async function writeEnvExport(opts) {
21
22
  if (opts.quiet) {
22
23
  process.env.LOG_LEVEL = "error";
23
24
  }
24
- const format = opts.format ? parseEnvExportFormat(opts.format) : defaultEnvExportFormat();
25
25
  logger.debug("Snapshotting env vars");
26
26
  const before = snapshotEnv();
27
27
  await appkit.autoConfigure({ autoConfigure: "env" });
28
28
  const changes = diffEnv(before, snapshotEnv());
29
- process.stdout.write(formatEnvExport(changes, format));
29
+ process.stdout.write(formatEnvExport(changes, opts.format));
30
30
  }
31
31
  /**
32
32
  * Build the `env` command on its own, so a host CLI can mount it under a
33
33
  * different parent than {@link buildProgram}'s.
34
34
  */
35
35
  export function buildEnvCommand(name = "env") {
36
- return new Command(name)
37
- .description("Run AppKit auto-config and print new/changed env vars.")
38
- .option("-f, --format <format>", "Output: export (POSIX shell), windows (cmd set), or json. Defaults by platform.")
39
- .option("-q, --quiet", "Suppress auto-config log output (LOG_LEVEL=error)")
40
- .action(writeEnvExport);
36
+ const command = addArgs(new Command(name).description("Run AppKit auto-config and print new/changed env vars."), EnvCommandOptionsSchema, { scope: [] });
37
+ return command.action(async () => {
38
+ await writeEnvExport(parseArgs(command, EnvCommandOptionsSchema));
39
+ });
41
40
  }
42
41
  /** Build the `dbx appkit` commander program (no side effects until parsed). */
43
42
  export function buildProgram(name = "dbx appkit") {
@@ -52,4 +51,4 @@ export async function runCli(argv) {
52
51
  await buildProgram().parseAsync(argv);
53
52
  }
54
53
  export { CommanderError };
55
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7O0dBWUc7QUFFSCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDM0MsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzdDLE9BQU8sRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRXBELE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsT0FBTyxFQUNQLGVBQWUsRUFDZixvQkFBb0IsRUFDcEIsV0FBVyxHQUNaLE1BQU0saUJBQWlCLENBQUM7QUFFekIsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztBQVF4QyxtRUFBbUU7QUFDbkUsS0FBSyxVQUFVLGNBQWMsQ0FBQyxJQUFhO0lBQ3pDLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDO0lBQ2xDLENBQUM7SUFFRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLHNCQUFzQixFQUFFLENBQUM7SUFDMUYsTUFBTSxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0lBQ3RDLE1BQU0sTUFBTSxHQUFHLFdBQVcsRUFBRSxDQUFDO0lBQzdCLE1BQU0sTUFBTSxDQUFDLGFBQWEsQ0FBQyxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ3JELE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUUvQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDekQsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsSUFBSSxHQUFHLEtBQUs7SUFDMUMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUM7U0FDckIsV0FBVyxDQUFDLHdEQUF3RCxDQUFDO1NBQ3JFLE1BQU0sQ0FDTCx1QkFBdUIsRUFDdkIsaUZBQWlGLENBQ2xGO1NBQ0EsTUFBTSxDQUFDLGFBQWEsRUFBRSxtREFBbUQsQ0FBQztTQUMxRSxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7QUFDNUIsQ0FBQztBQUVELCtFQUErRTtBQUMvRSxNQUFNLFVBQVUsWUFBWSxDQUFDLElBQUksR0FBRyxZQUFZO0lBQzlDLE9BQU8sSUFBSSxPQUFPLEVBQUU7U0FDakIsSUFBSSxDQUFDLElBQUksQ0FBQztTQUNWLFdBQVcsQ0FBQyx5RUFBeUUsQ0FBQztTQUN0RixVQUFVLENBQUMsZUFBZSxFQUFFLENBQUM7U0FDN0Isa0JBQWtCLEVBQUUsQ0FBQztBQUMxQixDQUFDO0FBRUQsK0ZBQStGO0FBQy9GLE1BQU0sQ0FBQyxLQUFLLFVBQVUsTUFBTSxDQUFDLElBQWM7SUFDekMsTUFBTSxZQUFZLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDeEMsQ0FBQztBQUVELE9BQU8sRUFBRSxjQUFjLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogYGRieCBhcHBraXRgIGNvbW1hbmRlciBwcm9ncmFtLlxuICpcbiAqIGBlbnZgIHJ1bnMgQXBwS2l0IGF1dG8tY29uZmlnIGFuZCBwcmludHMgdGhlIGVudiB2YXJzIGl0IGFkZGVkIG9yIGNoYW5nZWQgYXNcbiAqIGV2YWwtYWJsZSBgZXhwb3J0YCAvIGBzZXRgIGxpbmVzIChvciBKU09OKSAtIGUuZy4gYGV2YWwgXCIkKGRieCBhcHBraXQgZW52KVwiYFxuICogdG8gbG9hZCBhIHJlc29sdmVkIExha2ViYXNlIGNvbm5lY3Rpb24gaW50byB5b3VyIHNoZWxsLlxuICpcbiAqIFRoaXMgcGFja2FnZSBzaGlwcyBubyBiaW4gb2YgaXRzIG93bjoge0BsaW5rIGJ1aWxkUHJvZ3JhbX0gaXMgbW91bnRlZCBhcyB0aGVcbiAqIGBhcHBraXRgIHN1YmNvbW1hbmQgb2YgdGhlIHNpbmdsZSBgZGJ4YCBDTEkgKGBAZGJ4LXRvb2xzL2NsaWApLCB3aGljaCBpbXBvcnRzXG4gKiB0aGlzIG1vZHVsZSBsYXppbHkgc28gYGRieCBkZXZgIG5ldmVyIHBheXMgZm9yIHRoZSBBcHBLaXQgbG9hZC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgYXBwa2l0IH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5pbXBvcnQgeyBsb2cgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgQ29tbWFuZCwgQ29tbWFuZGVyRXJyb3IgfSBmcm9tIFwiY29tbWFuZGVyXCI7XG5cbmltcG9ydCB7XG4gIGRlZmF1bHRFbnZFeHBvcnRGb3JtYXQsXG4gIGRpZmZFbnYsXG4gIGZvcm1hdEVudkV4cG9ydCxcbiAgcGFyc2VFbnZFeHBvcnRGb3JtYXQsXG4gIHNuYXBzaG90RW52LFxufSBmcm9tIFwiLi9lbnYtZXhwb3J0LnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJhcHBraXQtZW52XCIpO1xuXG4vKiogT3B0aW9ucyBmb3IgdGhlIGBlbnZgIGNvbW1hbmQuICovXG5pbnRlcmZhY2UgRW52T3B0cyB7XG4gIGZvcm1hdD86IHN0cmluZztcbiAgcXVpZXQ/OiBib29sZWFuO1xufVxuXG4vKiogUnVuIGF1dG8tY29uZmlnIGFuZCB3cml0ZSB0aGUgcmVzdWx0aW5nIGVudiBkZWx0YSB0byBzdGRvdXQuICovXG5hc3luYyBmdW5jdGlvbiB3cml0ZUVudkV4cG9ydChvcHRzOiBFbnZPcHRzKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChvcHRzLnF1aWV0KSB7XG4gICAgcHJvY2Vzcy5lbnYuTE9HX0xFVkVMID0gXCJlcnJvclwiO1xuICB9XG5cbiAgY29uc3QgZm9ybWF0ID0gb3B0cy5mb3JtYXQgPyBwYXJzZUVudkV4cG9ydEZvcm1hdChvcHRzLmZvcm1hdCkgOiBkZWZhdWx0RW52RXhwb3J0Rm9ybWF0KCk7XG4gIGxvZ2dlci5kZWJ1ZyhcIlNuYXBzaG90dGluZyBlbnYgdmFyc1wiKTtcbiAgY29uc3QgYmVmb3JlID0gc25hcHNob3RFbnYoKTtcbiAgYXdhaXQgYXBwa2l0LmF1dG9Db25maWd1cmUoeyBhdXRvQ29uZmlndXJlOiBcImVudlwiIH0pO1xuICBjb25zdCBjaGFuZ2VzID0gZGlmZkVudihiZWZvcmUsIHNuYXBzaG90RW52KCkpO1xuXG4gIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGZvcm1hdEVudkV4cG9ydChjaGFuZ2VzLCBmb3JtYXQpKTtcbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgYGVudmAgY29tbWFuZCBvbiBpdHMgb3duLCBzbyBhIGhvc3QgQ0xJIGNhbiBtb3VudCBpdCB1bmRlciBhXG4gKiBkaWZmZXJlbnQgcGFyZW50IHRoYW4ge0BsaW5rIGJ1aWxkUHJvZ3JhbX0ncy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRW52Q29tbWFuZChuYW1lID0gXCJlbnZcIik6IENvbW1hbmQge1xuICByZXR1cm4gbmV3IENvbW1hbmQobmFtZSlcbiAgICAuZGVzY3JpcHRpb24oXCJSdW4gQXBwS2l0IGF1dG8tY29uZmlnIGFuZCBwcmludCBuZXcvY2hhbmdlZCBlbnYgdmFycy5cIilcbiAgICAub3B0aW9uKFxuICAgICAgXCItZiwgLS1mb3JtYXQgPGZvcm1hdD5cIixcbiAgICAgIFwiT3V0cHV0OiBleHBvcnQgKFBPU0lYIHNoZWxsKSwgd2luZG93cyAoY21kIHNldCksIG9yIGpzb24uIERlZmF1bHRzIGJ5IHBsYXRmb3JtLlwiLFxuICAgIClcbiAgICAub3B0aW9uKFwiLXEsIC0tcXVpZXRcIiwgXCJTdXBwcmVzcyBhdXRvLWNvbmZpZyBsb2cgb3V0cHV0IChMT0dfTEVWRUw9ZXJyb3IpXCIpXG4gICAgLmFjdGlvbih3cml0ZUVudkV4cG9ydCk7XG59XG5cbi8qKiBCdWlsZCB0aGUgYGRieCBhcHBraXRgIGNvbW1hbmRlciBwcm9ncmFtIChubyBzaWRlIGVmZmVjdHMgdW50aWwgcGFyc2VkKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFByb2dyYW0obmFtZSA9IFwiZGJ4IGFwcGtpdFwiKTogQ29tbWFuZCB7XG4gIHJldHVybiBuZXcgQ29tbWFuZCgpXG4gICAgLm5hbWUobmFtZSlcbiAgICAuZGVzY3JpcHRpb24oXCJBcHBLaXQgaGVscGVyczogcmVzb2x2ZSB0aGUgZW52aXJvbm1lbnQgYW4gQXBwS2l0IGFwcCB3b3VsZCBzdGFydCB3aXRoLlwiKVxuICAgIC5hZGRDb21tYW5kKGJ1aWxkRW52Q29tbWFuZCgpKVxuICAgIC5zaG93SGVscEFmdGVyRXJyb3IoKTtcbn1cblxuLyoqIFBhcnNlIGBhcmd2YCBhbmQgcnVuIHRoZSBtYXRjaGluZyBjb21tYW5kLiBUaHJvd3Mge0BsaW5rIENvbW1hbmRlckVycm9yfSBvbiBmbGFnIGVycm9ycy4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5DbGkoYXJndjogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgYnVpbGRQcm9ncmFtKCkucGFyc2VBc3luYyhhcmd2KTtcbn1cblxuZXhwb3J0IHsgQ29tbWFuZGVyRXJyb3IgfTtcbiJdfQ==
54
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7O0dBWUc7QUFFSCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDM0MsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFcEQsT0FBTyxFQUNMLE9BQU8sRUFDUCx1QkFBdUIsRUFDdkIsZUFBZSxFQUNmLFdBQVcsR0FFWixNQUFNLGlCQUFpQixDQUFDO0FBRXpCLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7QUFFeEMsbUVBQW1FO0FBQ25FLEtBQUssVUFBVSxjQUFjLENBQUMsSUFBdUI7SUFDbkQsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDZixPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUM7SUFDbEMsQ0FBQztJQUVELE1BQU0sQ0FBQyxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQztJQUN0QyxNQUFNLE1BQU0sR0FBRyxXQUFXLEVBQUUsQ0FBQztJQUM3QixNQUFNLE1BQU0sQ0FBQyxhQUFhLENBQUMsRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUNyRCxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFFL0MsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztBQUM5RCxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FBQyxJQUFJLEdBQUcsS0FBSztJQUMxQyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQ3JCLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLFdBQVcsQ0FBQyx3REFBd0QsQ0FBQyxFQUN2Rix1QkFBdUIsRUFDdkIsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQ2QsQ0FBQztJQUNGLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksRUFBRTtRQUMvQixNQUFNLGNBQWMsQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLHVCQUF1QixDQUFDLENBQUMsQ0FBQztJQUNwRSxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCwrRUFBK0U7QUFDL0UsTUFBTSxVQUFVLFlBQVksQ0FBQyxJQUFJLEdBQUcsWUFBWTtJQUM5QyxPQUFPLElBQUksT0FBTyxFQUFFO1NBQ2pCLElBQUksQ0FBQyxJQUFJLENBQUM7U0FDVixXQUFXLENBQUMseUVBQXlFLENBQUM7U0FDdEYsVUFBVSxDQUFDLGVBQWUsRUFBRSxDQUFDO1NBQzdCLGtCQUFrQixFQUFFLENBQUM7QUFDMUIsQ0FBQztBQUVELCtGQUErRjtBQUMvRixNQUFNLENBQUMsS0FBSyxVQUFVLE1BQU0sQ0FBQyxJQUFjO0lBQ3pDLE1BQU0sWUFBWSxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3hDLENBQUM7QUFFRCxPQUFPLEVBQUUsY0FBYyxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGBkYnggYXBwa2l0YCBjb21tYW5kZXIgcHJvZ3JhbS5cbiAqXG4gKiBgZW52YCBydW5zIEFwcEtpdCBhdXRvLWNvbmZpZyBhbmQgcHJpbnRzIHRoZSBlbnYgdmFycyBpdCBhZGRlZCBvciBjaGFuZ2VkIGFzXG4gKiBldmFsLWFibGUgYGV4cG9ydGAgLyBgc2V0YCBsaW5lcyAob3IgSlNPTikgLSBlLmcuIGBldmFsIFwiJChkYnggYXBwa2l0IGVudilcImBcbiAqIHRvIGxvYWQgYSByZXNvbHZlZCBMYWtlYmFzZSBjb25uZWN0aW9uIGludG8geW91ciBzaGVsbC5cbiAqXG4gKiBUaGlzIHBhY2thZ2Ugc2hpcHMgbm8gYmluIG9mIGl0cyBvd246IHtAbGluayBidWlsZFByb2dyYW19IGlzIG1vdW50ZWQgYXMgdGhlXG4gKiBgYXBwa2l0YCBzdWJjb21tYW5kIG9mIHRoZSBzaW5nbGUgYGRieGAgQ0xJIChgQGRieC10b29scy9jbGlgKSwgd2hpY2ggaW1wb3J0c1xuICogdGhpcyBtb2R1bGUgbGF6aWx5IHNvIGBkYnggZGV2YCBuZXZlciBwYXlzIGZvciB0aGUgQXBwS2l0IGxvYWQuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IGFwcGtpdCB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuaW1wb3J0IHsgYWRkQXJncywgcGFyc2VBcmdzIH0gZnJvbSBcIkBkYngtdG9vbHMvY2xpLWFyZ3MvYXJnc1wiO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IENvbW1hbmQsIENvbW1hbmRlckVycm9yIH0gZnJvbSBcImNvbW1hbmRlclwiO1xuXG5pbXBvcnQge1xuICBkaWZmRW52LFxuICBFbnZDb21tYW5kT3B0aW9uc1NjaGVtYSxcbiAgZm9ybWF0RW52RXhwb3J0LFxuICBzbmFwc2hvdEVudixcbiAgdHlwZSBFbnZDb21tYW5kT3B0aW9ucyxcbn0gZnJvbSBcIi4vZW52LWV4cG9ydC50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwiYXBwa2l0LWVudlwiKTtcblxuLyoqIFJ1biBhdXRvLWNvbmZpZyBhbmQgd3JpdGUgdGhlIHJlc3VsdGluZyBlbnYgZGVsdGEgdG8gc3Rkb3V0LiAqL1xuYXN5bmMgZnVuY3Rpb24gd3JpdGVFbnZFeHBvcnQob3B0czogRW52Q29tbWFuZE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKG9wdHMucXVpZXQpIHtcbiAgICBwcm9jZXNzLmVudi5MT0dfTEVWRUwgPSBcImVycm9yXCI7XG4gIH1cblxuICBsb2dnZXIuZGVidWcoXCJTbmFwc2hvdHRpbmcgZW52IHZhcnNcIik7XG4gIGNvbnN0IGJlZm9yZSA9IHNuYXBzaG90RW52KCk7XG4gIGF3YWl0IGFwcGtpdC5hdXRvQ29uZmlndXJlKHsgYXV0b0NvbmZpZ3VyZTogXCJlbnZcIiB9KTtcbiAgY29uc3QgY2hhbmdlcyA9IGRpZmZFbnYoYmVmb3JlLCBzbmFwc2hvdEVudigpKTtcblxuICBwcm9jZXNzLnN0ZG91dC53cml0ZShmb3JtYXRFbnZFeHBvcnQoY2hhbmdlcywgb3B0cy5mb3JtYXQpKTtcbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgYGVudmAgY29tbWFuZCBvbiBpdHMgb3duLCBzbyBhIGhvc3QgQ0xJIGNhbiBtb3VudCBpdCB1bmRlciBhXG4gKiBkaWZmZXJlbnQgcGFyZW50IHRoYW4ge0BsaW5rIGJ1aWxkUHJvZ3JhbX0ncy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRW52Q29tbWFuZChuYW1lID0gXCJlbnZcIik6IENvbW1hbmQge1xuICBjb25zdCBjb21tYW5kID0gYWRkQXJncyhcbiAgICBuZXcgQ29tbWFuZChuYW1lKS5kZXNjcmlwdGlvbihcIlJ1biBBcHBLaXQgYXV0by1jb25maWcgYW5kIHByaW50IG5ldy9jaGFuZ2VkIGVudiB2YXJzLlwiKSxcbiAgICBFbnZDb21tYW5kT3B0aW9uc1NjaGVtYSxcbiAgICB7IHNjb3BlOiBbXSB9LFxuICApO1xuICByZXR1cm4gY29tbWFuZC5hY3Rpb24oYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IHdyaXRlRW52RXhwb3J0KHBhcnNlQXJncyhjb21tYW5kLCBFbnZDb21tYW5kT3B0aW9uc1NjaGVtYSkpO1xuICB9KTtcbn1cblxuLyoqIEJ1aWxkIHRoZSBgZGJ4IGFwcGtpdGAgY29tbWFuZGVyIHByb2dyYW0gKG5vIHNpZGUgZWZmZWN0cyB1bnRpbCBwYXJzZWQpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUHJvZ3JhbShuYW1lID0gXCJkYnggYXBwa2l0XCIpOiBDb21tYW5kIHtcbiAgcmV0dXJuIG5ldyBDb21tYW5kKClcbiAgICAubmFtZShuYW1lKVxuICAgIC5kZXNjcmlwdGlvbihcIkFwcEtpdCBoZWxwZXJzOiByZXNvbHZlIHRoZSBlbnZpcm9ubWVudCBhbiBBcHBLaXQgYXBwIHdvdWxkIHN0YXJ0IHdpdGguXCIpXG4gICAgLmFkZENvbW1hbmQoYnVpbGRFbnZDb21tYW5kKCkpXG4gICAgLnNob3dIZWxwQWZ0ZXJFcnJvcigpO1xufVxuXG4vKiogUGFyc2UgYGFyZ3ZgIGFuZCBydW4gdGhlIG1hdGNoaW5nIGNvbW1hbmQuIFRocm93cyB7QGxpbmsgQ29tbWFuZGVyRXJyb3J9IG9uIGZsYWcgZXJyb3JzLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bkNsaShhcmd2OiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBidWlsZFByb2dyYW0oKS5wYXJzZUFzeW5jKGFyZ3YpO1xufVxuXG5leHBvcnQgeyBDb21tYW5kZXJFcnJvciB9O1xuIl19
@@ -4,7 +4,13 @@
4
4
  *
5
5
  * @module
6
6
  */
7
- export type EnvExportFormat = "export" | "windows" | "json";
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>;
8
14
  /** Shallow copy of the current process environment. */
9
15
  export declare function snapshotEnv(env?: NodeJS.ProcessEnv): Record<string, string>;
10
16
  /**
@@ -16,6 +22,15 @@ export declare function snapshotEnv(env?: NodeJS.ProcessEnv): Record<string, str
16
22
  export declare function diffEnv(before: Record<string, string>, after: Record<string, string>): Record<string, string>;
17
23
  /** Select Windows `set` output on Windows and POSIX `export` output elsewhere. */
18
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>;
19
34
  /**
20
35
  * Format env entries for the requested output style. An empty map prints
21
36
  * nothing (no trailing newline).
@@ -4,6 +4,19 @@
4
4
  *
5
5
  * @module
6
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.");
7
20
  /** Shallow copy of the current process environment. */
8
21
  export function snapshotEnv(env = process.env) {
9
22
  const out = {};
@@ -37,6 +50,13 @@ export function diffEnv(before, after) {
37
50
  export function defaultEnvExportFormat(platform = process.platform) {
38
51
  return platform === "win32" ? "windows" : "export";
39
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.");
40
60
  function escapeExportValue(value) {
41
61
  return value
42
62
  .replace(/\\/g, "\\\\")
@@ -74,19 +94,6 @@ export function formatEnvExport(env, format) {
74
94
  }
75
95
  /** Normalize CLI format aliases to a supported export format. */
76
96
  export function parseEnvExportFormat(value) {
77
- const normalized = value.trim().toLowerCase();
78
- if (normalized === "export" ||
79
- normalized === "shell" ||
80
- normalized === "nix" ||
81
- normalized === "bash") {
82
- return "export";
83
- }
84
- if (normalized === "windows" || normalized === "win" || normalized === "cmd") {
85
- return "windows";
86
- }
87
- if (normalized === "json") {
88
- return "json";
89
- }
90
- throw new Error(`Unknown format '${value}'. Use export, windows, or json.`);
97
+ return EnvExportFormatSchema.parse(value);
91
98
  }
92
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52LWV4cG9ydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lbnYtZXhwb3J0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7OztHQUtHO0FBSUgsdURBQXVEO0FBQ3ZELE1BQU0sVUFBVSxXQUFXLENBQUMsTUFBeUIsT0FBTyxDQUFDLEdBQUc7SUFDOUQsTUFBTSxHQUFHLEdBQTJCLEVBQUUsQ0FBQztJQUN2QyxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQy9DLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3hCLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDbkIsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxPQUFPLENBQ3JCLE1BQThCLEVBQzlCLEtBQTZCO0lBRTdCLE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEUsTUFBTSxHQUFHLEdBQTJCLEVBQUUsQ0FBQztJQUN2QyxLQUFLLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO1FBQ25DLHNGQUFzRjtRQUN0RixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQy9CLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDOUIsSUFBSSxJQUFJLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDbEIsR0FBRyxDQUFD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RUFBRSxDQUFDO1FBQzdFLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFDRCxJQUFJLFVBQVUsS0FBSyxNQUFNLEVBQUUsQ0FBQztRQUMxQixPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsS0FBSyxrQ0FBa0MsQ0FBQyxDQUFDO0FBQzlFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNuYXBzaG90IGBwcm9jZXNzLmVudmAsIGRpZmYgYWZ0ZXIgYXV0by1jb25maWcsIGFuZCBmb3JtYXQgZGVsdGFzIGFzXG4gKiBldmFsLWFibGUgc2hlbGwgYGV4cG9ydGAgLyBXaW5kb3dzIGBzZXRgIGxpbmVzIG9yIEpTT04uXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmV4cG9ydCB0eXBlIEVudkV4cG9ydEZvcm1hdCA9IFwiZXhwb3J0XCIgfCBcIndpbmRvd3NcIiB8IFwianNvblwiO1xuXG4vKiogU2hhbGxvdyBjb3B5IG9mIHRoZSBjdXJyZW50IHByb2Nlc3MgZW52aXJvbm1lbnQuICovXG5leHBvcnQgZnVuY3Rpb24gc25hcHNob3RFbnYoZW52OiBOb2RlSlMuUHJvY2Vzc0VudiA9IHByb2Nlc3MuZW52KTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IG91dDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhlbnYpKSB7XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG91dFtrZXldID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogS2V5cyB3aG9zZSB2YWx1ZXMgd2VyZSBhZGRlZCwgY2hhbmdlZCwgb3IgY2xlYXJlZCBiZXR3ZWVuIHNuYXBzaG90cy4gQSBrZXlcbiAqIHRoYXQgd2VudCBmcm9tIGEgbm9uLWJsYW5rIHZhbHVlIHRvIGJsYW5rL3JlbW92ZWQgaXMgZW1pdHRlZCB3aXRoIGFuIGVtcHR5XG4gKiB2YWx1ZSBzbyBpdCBjYW4gYmUgdW5zZXQuIEtleXMgdGhhdCB3ZXJlIGFscmVhZHkgYmxhbmsvYWJzZW50IGFuZCBzdGF5ZWQgdGhhdFxuICogd2F5IGFyZSBvbWl0dGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlmZkVudihcbiAgYmVmb3JlOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBhZnRlcjogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbik6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCBrZXlzID0gbmV3IFNldChbLi4uT2JqZWN0LmtleXMoYmVmb3JlKSwgLi4uT2JqZWN0LmtleXMoYWZ0ZXIpXSk7XG4gIGNvbnN0IG91dDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBmb3IgKGNvbnN0IGtleSBvZiBbLi4ua2V5c10uc29ydCgpKSB7XG4gICAgLy8gVHJlYXQgYSByZW1vdmVkIGtleSBhcyBibGFuayBzbyBhIG5vbi1ibGFuayAtPiBibGFuay9yZW1vdmVkIHRyYW5zaXRpb24gaXMgYSBkZWx0YS5cbiAgICBjb25zdCBwcmV2ID0gYmVmb3JlW2tleV0gPz8gXCJcIjtcbiAgICBjb25zdCBuZXh0ID0gYWZ0ZXJba2V5XSA/PyBcIlwiO1xuICAgIGlmIChuZXh0ICE9PSBwcmV2KSB7XG4gICAgICBvdXRba2V5XSA9IG5leHQ7XG4gICAgfVxuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKiBTZWxlY3QgV2luZG93cyBgc2V0YCBvdXRwdXQgb24gV2luZG93cyBhbmQgUE9TSVggYGV4cG9ydGAgb3V0cHV0IGVsc2V3aGVyZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWZhdWx0RW52RXhwb3J0Rm9ybWF0KFxuICBwbGF0Zm9ybTogTm9kZUpTLlBsYXRmb3JtID0gcHJvY2Vzcy5wbGF0Zm9ybSxcbik6IEVudkV4cG9ydEZvcm1hdCB7XG4gIHJldHVybiBwbGF0Zm9ybSA9PT0gXCJ3aW4zMlwiID8gXCJ3aW5kb3dzXCIgOiBcImV4cG9ydFwiO1xufVxuXG5mdW5jdGlvbiBlc2NhcGVFeHBvcnRWYWx1ZSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHZhbHVlXG4gICAgLnJlcGxhY2UoL1xcXFwvZywgXCJcXFxcXFxcXFwiKVxuICAgIC5yZXBsYWNlKC9cIi9nLCAnXFxcXFwiJylcbiAgICAucmVwbGFjZSgvXFwkL2csIFwiXFxcXCRcIilcbiAgICAucmVwbGFjZSgvYC9nLCBcIlxcXFxgXCIpO1xufVxuXG5mdW5jdGlvbiBlc2NhcGVXaW5kb3dzU2V0VmFsdWUodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICgvW1xcc1wiJnw8Pl5dLy50ZXN0KHZhbHVlKSkge1xuICAgIHJldHVybiBgXCIke3ZhbHVlLnJlcGxhY2UoL1wiL2csICdcIlwiJyl9XCJgO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuLyoqXG4gKiBGb3JtYXQgZW52IGVudHJpZXMgZm9yIHRoZSByZXF1ZXN0ZWQgb3V0cHV0IHN0eWxlLiBBbiBlbXB0eSBtYXAgcHJpbnRzXG4gKiBub3RoaW5nIChubyB0cmFpbGluZyBuZXdsaW5lKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdEVudkV4cG9ydChlbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sIGZvcm1hdDogRW52RXhwb3J0Rm9ybWF0KTogc3RyaW5nIHtcbiAgY29uc3QgZW50cmllcyA9IE9iamVjdC5lbnRyaWVzKGVudikuc29ydCgoW2FdLCBbYl0pID0+IGEubG9jYWxlQ29tcGFyZShiKSk7XG4gIGlmIChlbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBcIlwiO1xuICB9XG5cbiAgc3dpdGNoIChmb3JtYXQpIHtcbiAgICBjYXNlIFwianNvblwiOlxuICAgICAgcmV0dXJuIGAke0pTT04uc3RyaW5naWZ5KE9iamVjdC5mcm9tRW50cmllcyhlbnRyaWVzKSwgbnVsbCwgMil9XFxuYDtcbiAgICBjYXNlIFwid2luZG93c1wiOlxuICAgICAgcmV0dXJuIChcbiAgICAgICAgZW50cmllcy5tYXAoKFtrZXksIHZhbHVlXSkgPT4gYHNldCAke2tleX09JHtlc2NhcGVXaW5kb3dzU2V0VmFsdWUodmFsdWUpfWApLmpvaW4oXCJcXG5cIikgK1xuICAgICAgICBcIlxcblwiXG4gICAgICApO1xuICAgIGNhc2UgXCJleHBvcnRcIjpcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGVudHJpZXMubWFwKChba2V5LCB2YWx1ZV0pID0+IGBleHBvcnQgJHtrZXl9PVwiJHtlc2NhcGVFeHBvcnRWYWx1ZSh2YWx1ZSl9XCJgKS5qb2luKFwiXFxuXCIpICtcbiAgICAgICAgXCJcXG5cIlxuICAgICAgKTtcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGVudiBleHBvcnQgZm9ybWF0OiAke2Zvcm1hdCBzYXRpc2ZpZXMgbmV2ZXJ9YCk7XG4gIH1cbn1cblxuLyoqIE5vcm1hbGl6ZSBDTEkgZm9ybWF0IGFsaWFzZXMgdG8gYSBzdXBwb3J0ZWQgZXhwb3J0IGZvcm1hdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUVudkV4cG9ydEZvcm1hdCh2YWx1ZTogc3RyaW5nKTogRW52RXhwb3J0Rm9ybWF0IHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IHZhbHVlLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICBpZiAoXG4gICAgbm9ybWFsaXplZCA9PT0gXCJleHBvcnRcIiB8fFxuICAgIG5vcm1hbGl6ZWQgPT09IFwic2hlbGxcIiB8fFxuICAgIG5vcm1hbGl6ZWQgPT09IFwibml4XCIgfHxcbiAgICBub3JtYWxpemVkID09PSBcImJhc2hcIlxuICApIHtcbiAgICByZXR1cm4gXCJleHBvcnRcIjtcbiAgfVxuICBpZiAobm9ybWFsaXplZCA9PT0gXCJ3aW5kb3dzXCIgfHwgbm9ybWFsaXplZCA9PT0gXCJ3aW5cIiB8fCBub3JtYWxpemVkID09PSBcImNtZFwiKSB7XG4gICAgcmV0dXJuIFwid2luZG93c1wiO1xuICB9XG4gIGlmIChub3JtYWxpemVkID09PSBcImpzb25cIikge1xuICAgIHJldHVybiBcImpzb25cIjtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gZm9ybWF0ICcke3ZhbHVlfScuIFVzZSBleHBvcnQsIHdpbmRvd3MsIG9yIGpzb24uYCk7XG59XG4iXX0=
99
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52LWV4cG9ydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lbnYtZXhwb3J0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7OztHQUtHO0FBRUgsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLEtBQUssQ0FBQztBQUV4QixNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxDQUFDO0tBQ25DLFVBQVUsQ0FDVCxDQUFDLEtBQUssRUFBRSxFQUFFO0lBQ1IsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDNUMsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQzlDLElBQUksQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDO1FBQUUsT0FBTyxRQUFRLENBQUM7SUFDN0UsSUFBSSxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ3JFLE9BQU8sVUFBVSxDQUFDO0FBQ3BCLENBQUMsRUFDRCxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUN0QztLQUNBLFFBQVEsQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO0FBSWpELHVEQUF1RDtBQUN2RCxNQUFNLFVBQVUsV0FBVyxDQUFDLE1BQXlCLE9BQU8sQ0FBQyxHQUFHO0lBQzlELE1BQU0sR0FBRyxHQUEyQixFQUFFLENBQUM7SUFDdkMsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUMvQyxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN4QixHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ25CLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsT0FBTyxDQUNyQixNQUE4QixFQUM5QixLQUE2QjtJQUU3QixNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3RFLE1BQU0sR0FBRyxHQUEyQixFQUFFLENBQUM7SUFDdkMsS0FBSyxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQztRQUNuQyxzRkFBc0Y7UUFDdEYsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUMvQixNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzlCLElBQUksSUFBSSxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ2xCLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDbEIsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRCxrRkFBa0Y7QUFDbEYsTUFBTSxVQUFVLHNCQUFzQixDQUNwQyxXQUE0QixPQUFPLENBQUMsUUFBUTtJQUU1QyxPQUFPLFFBQVEsS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO0FBQ3JELENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxDQUFDO0tBQ3JDLE1BQU0sQ0FBQztJQUNOLE1BQU0sRUFBRSxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsc0JBQXNCLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FDdEUsMENBQTBDLENBQzNDO0lBQ0QsS0FBSyxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLGtDQUFrQyxDQUFDO0NBQy9FLENBQUM7S0FDRCxNQUFNLEVBQUU7S0FDUixRQUFRLENBQUMsMkRBQTJELENBQUMsQ0FBQztBQUl6RSxTQUFTLGlCQUFpQixDQUFDLEtBQWE7SUFDdEMsT0FBTyxLQUFLO1NBQ1QsT0FBTyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUM7U0FDdEIsT0FBTyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUM7U0FDcEIsT0FBTyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUM7U0FDckIsT0FBTyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztBQUMxQixDQUFDO0FBRUQsU0FBUyxxQkFBcUIsQ0FBQyxLQUFhO0lBQzFDLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzdCLE9BQU8sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDO0lBQzFDLENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsZUFBZSxDQUFDLEdBQTJCLEVBQUUsTUFBdUI7SUFDbEYsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMzRSxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDekIsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRUQsUUFBUSxNQUFNLEVBQUUsQ0FBQztRQUNmLEtBQUssTUFBTTtZQUNULE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDckUsS0FBSyxTQUFTO1lBQ1osT0FBTyxDQUNMLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsT0FBTyxHQUFHLElBQUkscUJBQXFCLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7Z0JBQ3RGLElBQUksQ0FDTCxDQUFDO1FBQ0osS0FBSyxRQUFRO1lBQ1gsT0FBTyxDQUNMLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxHQUFHLEtBQUssaUJBQWlCLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7Z0JBQ3ZGLElBQUksQ0FDTCxDQUFDO1FBQ0o7WUFDRSxNQUFNLElBQUksS0FBSyxDQUFDLDhCQUE4QixNQUFzQixFQUFFLENBQUMsQ0FBQztJQUM1RSxDQUFDO0FBQ0gsQ0FBQztBQUVELGlFQUFpRTtBQUNqRSxNQUFNLFVBQVUsb0JBQW9CLENBQUMsS0FBYTtJQUNoRCxPQUFPLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM1QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTbmFwc2hvdCBgcHJvY2Vzcy5lbnZgLCBkaWZmIGFmdGVyIGF1dG8tY29uZmlnLCBhbmQgZm9ybWF0IGRlbHRhcyBhc1xuICogZXZhbC1hYmxlIHNoZWxsIGBleHBvcnRgIC8gV2luZG93cyBgc2V0YCBsaW5lcyBvciBKU09OLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5leHBvcnQgY29uc3QgRW52RXhwb3J0Rm9ybWF0U2NoZW1hID0gelxuICAucHJlcHJvY2VzcyhcbiAgICAodmFsdWUpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIpIHJldHVybiB2YWx1ZTtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgIGlmIChbXCJleHBvcnRcIiwgXCJzaGVsbFwiLCBcIm5peFwiLCBcImJhc2hcIl0uaW5jbHVkZXMobm9ybWFsaXplZCkpIHJldHVybiBcImV4cG9ydFwiO1xuICAgICAgaWYgKFtcIndpbmRvd3NcIiwgXCJ3aW5cIiwgXCJjbWRcIl0uaW5jbHVkZXMobm9ybWFsaXplZCkpIHJldHVybiBcIndpbmRvd3NcIjtcbiAgICAgIHJldHVybiBub3JtYWxpemVkO1xuICAgIH0sXG4gICAgei5lbnVtKFtcImV4cG9ydFwiLCBcIndpbmRvd3NcIiwgXCJqc29uXCJdKSxcbiAgKVxuICAuZGVzY3JpYmUoXCJFbnZpcm9ubWVudCBleHBvcnQgb3V0cHV0IGZvcm1hdC5cIik7XG5cbmV4cG9ydCB0eXBlIEVudkV4cG9ydEZvcm1hdCA9IHoub3V0cHV0PHR5cGVvZiBFbnZFeHBvcnRGb3JtYXRTY2hlbWE+O1xuXG4vKiogU2hhbGxvdyBjb3B5IG9mIHRoZSBjdXJyZW50IHByb2Nlc3MgZW52aXJvbm1lbnQuICovXG5leHBvcnQgZnVuY3Rpb24gc25hcHNob3RFbnYoZW52OiBOb2RlSlMuUHJvY2Vzc0VudiA9IHByb2Nlc3MuZW52KTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IG91dDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhlbnYpKSB7XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG91dFtrZXldID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogS2V5cyB3aG9zZSB2YWx1ZXMgd2VyZSBhZGRlZCwgY2hhbmdlZCwgb3IgY2xlYXJlZCBiZXR3ZWVuIHNuYXBzaG90cy4gQSBrZXlcbiAqIHRoYXQgd2VudCBmcm9tIGEgbm9uLWJsYW5rIHZhbHVlIHRvIGJsYW5rL3JlbW92ZWQgaXMgZW1pdHRlZCB3aXRoIGFuIGVtcHR5XG4gKiB2YWx1ZSBzbyBpdCBjYW4gYmUgdW5zZXQuIEtleXMgdGhhdCB3ZXJlIGFscmVhZHkgYmxhbmsvYWJzZW50IGFuZCBzdGF5ZWQgdGhhdFxuICogd2F5IGFyZSBvbWl0dGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlmZkVudihcbiAgYmVmb3JlOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBhZnRlcjogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbik6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCBrZXlzID0gbmV3IFNldChbLi4uT2JqZWN0LmtleXMoYmVmb3JlKSwgLi4uT2JqZWN0LmtleXMoYWZ0ZXIpXSk7XG4gIGNvbnN0IG91dDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBmb3IgKGNvbnN0IGtleSBvZiBbLi4ua2V5c10uc29ydCgpKSB7XG4gICAgLy8gVHJlYXQgYSByZW1vdmVkIGtleSBhcyBibGFuayBzbyBhIG5vbi1ibGFuayAtPiBibGFuay9yZW1vdmVkIHRyYW5zaXRpb24gaXMgYSBkZWx0YS5cbiAgICBjb25zdCBwcmV2ID0gYmVmb3JlW2tleV0gPz8gXCJcIjtcbiAgICBjb25zdCBuZXh0ID0gYWZ0ZXJba2V5XSA/PyBcIlwiO1xuICAgIGlmIChuZXh0ICE9PSBwcmV2KSB7XG4gICAgICBvdXRba2V5XSA9IG5leHQ7XG4gICAgfVxuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKiBTZWxlY3QgV2luZG93cyBgc2V0YCBvdXRwdXQgb24gV2luZG93cyBhbmQgUE9TSVggYGV4cG9ydGAgb3V0cHV0IGVsc2V3aGVyZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWZhdWx0RW52RXhwb3J0Rm9ybWF0KFxuICBwbGF0Zm9ybTogTm9kZUpTLlBsYXRmb3JtID0gcHJvY2Vzcy5wbGF0Zm9ybSxcbik6IEVudkV4cG9ydEZvcm1hdCB7XG4gIHJldHVybiBwbGF0Zm9ybSA9PT0gXCJ3aW4zMlwiID8gXCJ3aW5kb3dzXCIgOiBcImV4cG9ydFwiO1xufVxuXG5leHBvcnQgY29uc3QgRW52Q29tbWFuZE9wdGlvbnNTY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIGZvcm1hdDogRW52RXhwb3J0Rm9ybWF0U2NoZW1hLmRlZmF1bHQoZGVmYXVsdEVudkV4cG9ydEZvcm1hdCgpKS5kZXNjcmliZShcbiAgICAgIFwiT3V0cHV0IGZvcm1hdDogZXhwb3J0LCB3aW5kb3dzLCBvciBqc29uLlwiLFxuICAgICksXG4gICAgcXVpZXQ6IHouYm9vbGVhbigpLmRlZmF1bHQoZmFsc2UpLmRlc2NyaWJlKFwiU3VwcHJlc3MgYXV0by1jb25maWcgbG9nIG91dHB1dC5cIiksXG4gIH0pXG4gIC5zdHJpY3QoKVxuICAuZGVzY3JpYmUoXCJPcHRpb25zIGZvciBleHBvcnRpbmcgdGhlIEFwcEtpdCBhdXRvLWNvbmZpZyBlbnZpcm9ubWVudC5cIik7XG5cbmV4cG9ydCB0eXBlIEVudkNvbW1hbmRPcHRpb25zID0gei5vdXRwdXQ8dHlwZW9mIEVudkNvbW1hbmRPcHRpb25zU2NoZW1hPjtcblxuZnVuY3Rpb24gZXNjYXBlRXhwb3J0VmFsdWUodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB2YWx1ZVxuICAgIC5yZXBsYWNlKC9cXFxcL2csIFwiXFxcXFxcXFxcIilcbiAgICAucmVwbGFjZSgvXCIvZywgJ1xcXFxcIicpXG4gICAgLnJlcGxhY2UoL1xcJC9nLCBcIlxcXFwkXCIpXG4gICAgLnJlcGxhY2UoL2AvZywgXCJcXFxcYFwiKTtcbn1cblxuZnVuY3Rpb24gZXNjYXBlV2luZG93c1NldFZhbHVlKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoL1tcXHNcIiZ8PD5eXS8udGVzdCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gYFwiJHt2YWx1ZS5yZXBsYWNlKC9cIi9nLCAnXCJcIicpfVwiYDtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbi8qKlxuICogRm9ybWF0IGVudiBlbnRyaWVzIGZvciB0aGUgcmVxdWVzdGVkIG91dHB1dCBzdHlsZS4gQW4gZW1wdHkgbWFwIHByaW50c1xuICogbm90aGluZyAobm8gdHJhaWxpbmcgbmV3bGluZSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRFbnZFeHBvcnQoZW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LCBmb3JtYXQ6IEVudkV4cG9ydEZvcm1hdCk6IHN0cmluZyB7XG4gIGNvbnN0IGVudHJpZXMgPSBPYmplY3QuZW50cmllcyhlbnYpLnNvcnQoKFthXSwgW2JdKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpO1xuICBpZiAoZW50cmllcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gXCJcIjtcbiAgfVxuXG4gIHN3aXRjaCAoZm9ybWF0KSB7XG4gICAgY2FzZSBcImpzb25cIjpcbiAgICAgIHJldHVybiBgJHtKU09OLnN0cmluZ2lmeShPYmplY3QuZnJvbUVudHJpZXMoZW50cmllcyksIG51bGwsIDIpfVxcbmA7XG4gICAgY2FzZSBcIndpbmRvd3NcIjpcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGVudHJpZXMubWFwKChba2V5LCB2YWx1ZV0pID0+IGBzZXQgJHtrZXl9PSR7ZXNjYXBlV2luZG93c1NldFZhbHVlKHZhbHVlKX1gKS5qb2luKFwiXFxuXCIpICtcbiAgICAgICAgXCJcXG5cIlxuICAgICAgKTtcbiAgICBjYXNlIFwiZXhwb3J0XCI6XG4gICAgICByZXR1cm4gKFxuICAgICAgICBlbnRyaWVzLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBgZXhwb3J0ICR7a2V5fT1cIiR7ZXNjYXBlRXhwb3J0VmFsdWUodmFsdWUpfVwiYCkuam9pbihcIlxcblwiKSArXG4gICAgICAgIFwiXFxuXCJcbiAgICAgICk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBlbnYgZXhwb3J0IGZvcm1hdDogJHtmb3JtYXQgc2F0aXNmaWVzIG5ldmVyfWApO1xuICB9XG59XG5cbi8qKiBOb3JtYWxpemUgQ0xJIGZvcm1hdCBhbGlhc2VzIHRvIGEgc3VwcG9ydGVkIGV4cG9ydCBmb3JtYXQuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VFbnZFeHBvcnRGb3JtYXQodmFsdWU6IHN0cmluZyk6IEVudkV4cG9ydEZvcm1hdCB7XG4gIHJldHVybiBFbnZFeHBvcnRGb3JtYXRTY2hlbWEucGFyc2UodmFsdWUpO1xufVxuIl19
package/package.json CHANGED
@@ -24,9 +24,11 @@
24
24
  },
25
25
  "dependencies": {
26
26
  "@databricks/appkit": "0.81.0",
27
- "@dbx-tools/appkit": "^0.9.38",
28
- "@dbx-tools/shared-core": "^0.9.38",
29
- "commander": "^15.0.0"
27
+ "@dbx-tools/appkit": "^0.9.43",
28
+ "@dbx-tools/cli-args": "^0.9.43",
29
+ "@dbx-tools/shared-core": "^0.9.43",
30
+ "commander": "^15.0.0",
31
+ "zod": "4.3.6"
30
32
  },
31
33
  "main": "./lib/index.js",
32
34
  "license": "Apache-2.0",
@@ -50,7 +52,7 @@
50
52
  "./package.json": "./package.json"
51
53
  }
52
54
  },
53
- "version": "0.9.38",
55
+ "version": "0.9.43",
54
56
  "types": "./lib/index.d.ts",
55
57
  "dbxToolsConfig": {
56
58
  "tags": [
package/src/cli.ts CHANGED
@@ -13,38 +13,32 @@
13
13
  */
14
14
 
15
15
  import { appkit } from "@dbx-tools/appkit";
16
+ import { addArgs, parseArgs } from "@dbx-tools/cli-args/args";
16
17
  import { log } from "@dbx-tools/shared-core";
17
18
  import { Command, CommanderError } from "commander";
18
19
 
19
20
  import {
20
- defaultEnvExportFormat,
21
21
  diffEnv,
22
+ EnvCommandOptionsSchema,
22
23
  formatEnvExport,
23
- parseEnvExportFormat,
24
24
  snapshotEnv,
25
+ type EnvCommandOptions,
25
26
  } from "./env-export.ts";
26
27
 
27
28
  const logger = log.logger("appkit-env");
28
29
 
29
- /** Options for the `env` command. */
30
- interface EnvOpts {
31
- format?: string;
32
- quiet?: boolean;
33
- }
34
-
35
30
  /** Run auto-config and write the resulting env delta to stdout. */
36
- async function writeEnvExport(opts: EnvOpts): Promise<void> {
31
+ async function writeEnvExport(opts: EnvCommandOptions): Promise<void> {
37
32
  if (opts.quiet) {
38
33
  process.env.LOG_LEVEL = "error";
39
34
  }
40
35
 
41
- const format = opts.format ? parseEnvExportFormat(opts.format) : defaultEnvExportFormat();
42
36
  logger.debug("Snapshotting env vars");
43
37
  const before = snapshotEnv();
44
38
  await appkit.autoConfigure({ autoConfigure: "env" });
45
39
  const changes = diffEnv(before, snapshotEnv());
46
40
 
47
- process.stdout.write(formatEnvExport(changes, format));
41
+ process.stdout.write(formatEnvExport(changes, opts.format));
48
42
  }
49
43
 
50
44
  /**
@@ -52,14 +46,14 @@ async function writeEnvExport(opts: EnvOpts): Promise<void> {
52
46
  * different parent than {@link buildProgram}'s.
53
47
  */
54
48
  export function buildEnvCommand(name = "env"): Command {
55
- return new Command(name)
56
- .description("Run AppKit auto-config and print new/changed env vars.")
57
- .option(
58
- "-f, --format <format>",
59
- "Output: export (POSIX shell), windows (cmd set), or json. Defaults by platform.",
60
- )
61
- .option("-q, --quiet", "Suppress auto-config log output (LOG_LEVEL=error)")
62
- .action(writeEnvExport);
49
+ const command = addArgs(
50
+ new Command(name).description("Run AppKit auto-config and print new/changed env vars."),
51
+ EnvCommandOptionsSchema,
52
+ { scope: [] },
53
+ );
54
+ return command.action(async () => {
55
+ await writeEnvExport(parseArgs(command, EnvCommandOptionsSchema));
56
+ });
63
57
  }
64
58
 
65
59
  /** Build the `dbx appkit` commander program (no side effects until parsed). */
package/src/env-export.ts CHANGED
@@ -5,7 +5,22 @@
5
5
  * @module
6
6
  */
7
7
 
8
- export type EnvExportFormat = "export" | "windows" | "json";
8
+ import { z } from "zod";
9
+
10
+ export const EnvExportFormatSchema = z
11
+ .preprocess(
12
+ (value) => {
13
+ if (typeof value !== "string") return value;
14
+ const normalized = value.trim().toLowerCase();
15
+ if (["export", "shell", "nix", "bash"].includes(normalized)) return "export";
16
+ if (["windows", "win", "cmd"].includes(normalized)) return "windows";
17
+ return normalized;
18
+ },
19
+ z.enum(["export", "windows", "json"]),
20
+ )
21
+ .describe("Environment export output format.");
22
+
23
+ export type EnvExportFormat = z.output<typeof EnvExportFormatSchema>;
9
24
 
10
25
  /** Shallow copy of the current process environment. */
11
26
  export function snapshotEnv(env: NodeJS.ProcessEnv = process.env): Record<string, string> {
@@ -48,6 +63,18 @@ export function defaultEnvExportFormat(
48
63
  return platform === "win32" ? "windows" : "export";
49
64
  }
50
65
 
66
+ export const EnvCommandOptionsSchema = z
67
+ .object({
68
+ format: EnvExportFormatSchema.default(defaultEnvExportFormat()).describe(
69
+ "Output format: export, windows, or json.",
70
+ ),
71
+ quiet: z.boolean().default(false).describe("Suppress auto-config log output."),
72
+ })
73
+ .strict()
74
+ .describe("Options for exporting the AppKit auto-config environment.");
75
+
76
+ export type EnvCommandOptions = z.output<typeof EnvCommandOptionsSchema>;
77
+
51
78
  function escapeExportValue(value: string): string {
52
79
  return value
53
80
  .replace(/\\/g, "\\\\")
@@ -93,20 +120,5 @@ export function formatEnvExport(env: Record<string, string>, format: EnvExportFo
93
120
 
94
121
  /** Normalize CLI format aliases to a supported export format. */
95
122
  export function parseEnvExportFormat(value: string): EnvExportFormat {
96
- const normalized = value.trim().toLowerCase();
97
- if (
98
- normalized === "export" ||
99
- normalized === "shell" ||
100
- normalized === "nix" ||
101
- normalized === "bash"
102
- ) {
103
- return "export";
104
- }
105
- if (normalized === "windows" || normalized === "win" || normalized === "cmd") {
106
- return "windows";
107
- }
108
- if (normalized === "json") {
109
- return "json";
110
- }
111
- throw new Error(`Unknown format '${value}'. Use export, windows, or json.`);
123
+ return EnvExportFormatSchema.parse(value);
112
124
  }