@dbx-tools/shared-core 0.9.40 → 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
@@ -22,6 +22,7 @@ import {
22
22
  log,
23
23
  net,
24
24
  object,
25
+ options,
25
26
  stringUtils,
26
27
  } from "@dbx-tools/shared-core";
27
28
  ```
@@ -47,6 +48,8 @@ Key features:
47
48
  grab-bag default import.
48
49
  - A Zod-backed `BrandContext` contract with dbx tools defaults, JSON Schema
49
50
  output, and prompt serialization for browser, library, and LLM consumers.
51
+ - Shared Zod option schemas for Databricks environment names, normalized URLs,
52
+ TCP ports, listener addresses, and schema-driven parse/serialization.
50
53
 
51
54
  ## Brand Context
52
55
 
@@ -428,6 +431,8 @@ when disabled.
428
431
  - `http` - header iteration, cookie parsing, and fetch error creation.
429
432
  - `execution` - direct executor fallback, cancellation merging, and result unwrapping.
430
433
  - `net` - URL building, email parsing, path matching, IP/CIDR helpers.
434
+ - `options` - Databricks environment/config schemas, ports, listener addresses,
435
+ URL normalization, nullable map parsing, and flag/env JSON serialization.
431
436
  - `token` - JWT payload and scope readers.
432
437
  - `functionUtils` - memoization.
433
438
  - `log` - tagged leveled logging.
package/index.ts CHANGED
@@ -3,7 +3,7 @@
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/shared-core";
6
- export const PACKAGE_VERSION = "0.9.40";
6
+ export const PACKAGE_VERSION = "0.9.43";
7
7
  export * as asyncUtils from "./src/async-utils.ts";
8
8
  export * as brandUtils from "./src/brand-utils.ts";
9
9
  export * as environmentUtils from "./src/environment-utils.ts";
@@ -16,6 +16,7 @@ export * as json from "./src/json.ts";
16
16
  export * as log from "./src/log.ts";
17
17
  export * as net from "./src/net.ts";
18
18
  export * as object from "./src/object.ts";
19
+ export * as options from "./src/options.ts";
19
20
  export * as pattern from "./src/pattern.ts";
20
21
  export * as predicate from "./src/predicate.ts";
21
22
  export * as stringUtils from "./src/string-utils.ts";
@@ -30,6 +31,8 @@ export type { HeaderLike } from "./src/http.ts";
30
31
  export type { LogLevel, Logger } from "./src/log.ts";
31
32
  export type { UrlLike, IpVersion, ParsedIp, Cidr, UrlBuilder, ParseEmailsOptions } from "./src/net.ts";
32
33
  export type { Sequence, Container, Collection, OneOrMany, NameLike, NonFunctionKeys, SerializablePrimitive, SerializableValue, ToNumberOptions, ToDateOptions, ToDurationOptions, DeepEqualComparator } from "./src/object.ts";
34
+ export { DatabricksEnvironmentNamesSchema, databricksEnvironmentNames, MAX_TCP_PORT, tcpPortSchema, tcpPortOrZeroSchema, normalizedUrlSchema, DatabricksOptionsSchema, LakebaseOptionsSchema } from "./src/options.ts";
35
+ export type { DatabricksEnvironmentNames, DatabricksOptions, OptionSerializationFormat, LakebaseOptions, OptionValueMap, ListenAddress, ListenAddressOptions } from "./src/options.ts";
33
36
  export type { PatternOptions } from "./src/pattern.ts";
34
37
  export type { PredicateFunction, TypePredicateFunction, PredicateInput, Predicate } from "./src/predicate.ts";
35
38
  export type { TokenizeOptions, KeyOptions, IdentifierOptions, DedentOptions, Description } from "./src/string-utils.ts";
package/lib/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export declare const PACKAGE_IDENTIFIER = "@dbx-tools/shared-core";
2
- export declare const PACKAGE_VERSION = "0.9.40";
2
+ export declare const PACKAGE_VERSION = "0.9.43";
3
3
  export * as asyncUtils from "./src/async-utils.ts";
4
4
  export * as brandUtils from "./src/brand-utils.ts";
5
5
  export * as environmentUtils from "./src/environment-utils.ts";
@@ -12,6 +12,7 @@ export * as json from "./src/json.ts";
12
12
  export * as log from "./src/log.ts";
13
13
  export * as net from "./src/net.ts";
14
14
  export * as object from "./src/object.ts";
15
+ export * as options from "./src/options.ts";
15
16
  export * as pattern from "./src/pattern.ts";
16
17
  export * as predicate from "./src/predicate.ts";
17
18
  export * as stringUtils from "./src/string-utils.ts";
@@ -26,6 +27,8 @@ export type { HeaderLike } from "./src/http.ts";
26
27
  export type { LogLevel, Logger } from "./src/log.ts";
27
28
  export type { UrlLike, IpVersion, ParsedIp, Cidr, UrlBuilder, ParseEmailsOptions } from "./src/net.ts";
28
29
  export type { Sequence, Container, Collection, OneOrMany, NameLike, NonFunctionKeys, SerializablePrimitive, SerializableValue, ToNumberOptions, ToDateOptions, ToDurationOptions, DeepEqualComparator } from "./src/object.ts";
30
+ export { DatabricksEnvironmentNamesSchema, databricksEnvironmentNames, MAX_TCP_PORT, tcpPortSchema, tcpPortOrZeroSchema, normalizedUrlSchema, DatabricksOptionsSchema, LakebaseOptionsSchema } from "./src/options.ts";
31
+ export type { DatabricksEnvironmentNames, DatabricksOptions, OptionSerializationFormat, LakebaseOptions, OptionValueMap, ListenAddress, ListenAddressOptions } from "./src/options.ts";
29
32
  export type { PatternOptions } from "./src/pattern.ts";
30
33
  export type { PredicateFunction, TypePredicateFunction, PredicateInput, Predicate } from "./src/predicate.ts";
31
34
  export type { TokenizeOptions, KeyOptions, IdentifierOptions, DedentOptions, Description } from "./src/string-utils.ts";
package/lib/index.js CHANGED
@@ -2,7 +2,7 @@
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/shared-core";
5
- export const PACKAGE_VERSION = "0.9.40";
5
+ export const PACKAGE_VERSION = "0.9.43";
6
6
  export * as asyncUtils from "./src/async-utils.js";
7
7
  export * as brandUtils from "./src/brand-utils.js";
8
8
  export * as environmentUtils from "./src/environment-utils.js";
@@ -15,10 +15,12 @@ export * as json from "./src/json.js";
15
15
  export * as log from "./src/log.js";
16
16
  export * as net from "./src/net.js";
17
17
  export * as object from "./src/object.js";
18
+ export * as options from "./src/options.js";
18
19
  export * as pattern from "./src/pattern.js";
19
20
  export * as predicate from "./src/predicate.js";
20
21
  export * as stringUtils from "./src/string-utils.js";
21
22
  export * as token from "./src/token.js";
22
23
  export { DEFAULT_BRAND_ASSETS, BrandAssetSetSchema, BrandColorsSchema, BrandVoiceSchema, BrandContextSchema, defaultBrandContext } from "./src/brand-utils.js";
24
+ export { DatabricksEnvironmentNamesSchema, databricksEnvironmentNames, MAX_TCP_PORT, tcpPortSchema, tcpPortOrZeroSchema, normalizedUrlSchema, DatabricksOptionsSchema, LakebaseOptionsSchema } from "./src/options.js";
23
25
  export { ACCESS_TOKEN_HEADER, USER_ID_HEADER, USER_EMAIL_HEADER } from "./src/token.js";
24
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyx3QkFBd0IsQ0FBQztBQUMzRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxVQUFVLE1BQU0sc0JBQXNCLENBQUM7QUFDbkQsT0FBTyxLQUFLLFVBQVUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRCxPQUFPLEtBQUssZ0JBQWdCLE1BQU0sNEJBQTRCLENBQUM7QUFDL0QsT0FBTyxLQUFLLFVBQVUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRCxPQUFPLEtBQUssU0FBUyxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sS0FBSyxhQUFhLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxLQUFLLElBQUksTUFBTSxlQUFlLENBQUM7QUFDdEMsT0FBTyxLQUFLLElBQUksTUFBTSxlQUFlLENBQUM7QUFDdEMsT0FBTyxLQUFLLElBQUksTUFBTSxlQUFlLENBQUM7QUFDdEMsT0FBTyxLQUFLLEdBQUcsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxLQUFLLEdBQUcsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sS0FBSyxTQUFTLE1BQU0sb0JBQW9CLENBQUM7QUFDaEQsT0FBTyxLQUFLLFdBQVcsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEtBQUssS0FBSyxNQUFNLGdCQUFnQixDQUFDO0FBRXhDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxtQkFBbUIsRUFBRSxpQkFBaUIsRUFBRSxnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBWS9KLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxjQUFjLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdFTkVSQVRFRCBieSBwcm9qZW4gd2F0Y2ggLSBETyBOT1QgRURJVC5cbi8vIFJlZ2VuZXJhdGVkIGZyb20gdGhlIGV4cG9ydGluZyBtb2R1bGVzIGluIC4vc3JjLlxuLy8gSGFuZCBlZGl0cyBhcmUgb3ZlcndyaXR0ZW4gb24gdGhlIG5leHQgd2F0Y2g7IHRoaXMgZmlsZSBpcyByZWFkLW9ubHkuXG5cbmV4cG9ydCBjb25zdCBQQUNLQUdFX0lERU5USUZJRVIgPSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmV4cG9ydCBjb25zdCBQQUNLQUdFX1ZFUlNJT04gPSBcIjAuOS40MFwiO1xuZXhwb3J0ICogYXMgYXN5bmNVdGlscyBmcm9tIFwiLi9zcmMvYXN5bmMtdXRpbHMudHNcIjtcbmV4cG9ydCAqIGFzIGJyYW5kVXRpbHMgZnJvbSBcIi4vc3JjL2JyYW5kLXV0aWxzLnRzXCI7XG5leHBvcnQgKiBhcyBlbnZpcm9ubWVudFV0aWxzIGZyb20gXCIuL3NyYy9lbnZpcm9ubWVudC11dGlscy50c1wiO1xuZXhwb3J0ICogYXMgZXJyb3JVdGlscyBmcm9tIFwiLi9zcmMvZXJyb3ItdXRpbHMudHNcIjtcbmV4cG9ydCAqIGFzIGV4ZWN1dGlvbiBmcm9tIFwiLi9zcmMvZXhlY3V0aW9uLnRzXCI7XG5leHBvcnQgKiBhcyBmdW5jdGlvblV0aWxzIGZyb20gXCIuL3NyYy9mdW5jdGlvbi11dGlscy50c1wiO1xuZXhwb3J0ICogYXMgaGFzaCBmcm9tIFwiLi9zcmMvaGFzaC50c1wiO1xuZXhwb3J0ICogYXMgaHR0cCBmcm9tIFwiLi9zcmMvaHR0cC50c1wiO1xuZXhwb3J0ICogYXMganNvbiBmcm9tIFwiLi9zcmMvanNvbi50c1wiO1xuZXhwb3J0ICogYXMgbG9nIGZyb20gXCIuL3NyYy9sb2cudHNcIjtcbmV4cG9ydCAqIGFzIG5ldCBmcm9tIFwiLi9zcmMvbmV0LnRzXCI7XG5leHBvcnQgKiBhcyBvYmplY3QgZnJvbSBcIi4vc3JjL29iamVjdC50c1wiO1xuZXhwb3J0ICogYXMgcGF0dGVybiBmcm9tIFwiLi9zcmMvcGF0dGVybi50c1wiO1xuZXhwb3J0ICogYXMgcHJlZGljYXRlIGZyb20gXCIuL3NyYy9wcmVkaWNhdGUudHNcIjtcbmV4cG9ydCAqIGFzIHN0cmluZ1V0aWxzIGZyb20gXCIuL3NyYy9zdHJpbmctdXRpbHMudHNcIjtcbmV4cG9ydCAqIGFzIHRva2VuIGZyb20gXCIuL3NyYy90b2tlbi50c1wiO1xuZXhwb3J0IHR5cGUgeyBDb25jdXJyZW50RXJyb3JNb2RlLCBNYXBDb25jdXJyZW50T3B0aW9ucywgUG9sbENvbnRleHQsIFBvbGxQcm9kdWNlciwgUG9sbE9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvYXN5bmMtdXRpbHMudHNcIjtcbmV4cG9ydCB7IERFRkFVTFRfQlJBTkRfQVNTRVRTLCBCcmFuZEFzc2V0U2V0U2NoZW1hLCBCcmFuZENvbG9yc1NjaGVtYSwgQnJhbmRWb2ljZVNjaGVtYSwgQnJhbmRDb250ZXh0U2NoZW1hLCBkZWZhdWx0QnJhbmRDb250ZXh0IH0gZnJvbSBcIi4vc3JjL2JyYW5kLXV0aWxzLnRzXCI7XG5leHBvcnQgdHlwZSB7IEJyYW5kQ29udGV4dCwgQnJhbmRDb250ZXh0SW5wdXQsIEJyYW5kQXNzZXRTZXQgfSBmcm9tIFwiLi9zcmMvYnJhbmQtdXRpbHMudHNcIjtcbmV4cG9ydCB0eXBlIHsgRXJyb3JDb250ZXh0IH0gZnJvbSBcIi4vc3JjL2Vycm9yLXV0aWxzLnRzXCI7XG5leHBvcnQgdHlwZSB7IEV4ZWN1dGlvblJlc3VsdCwgRXhlY3V0b3IsIEV4ZWN1dGlvbkZhaWx1cmUsIFJ1bk9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvZXhlY3V0aW9uLnRzXCI7XG5leHBvcnQgdHlwZSB7IE1lbW9pemVPcHRpb25zIH0gZnJvbSBcIi4vc3JjL2Z1bmN0aW9uLXV0aWxzLnRzXCI7XG5leHBvcnQgdHlwZSB7IEhlYWRlckxpa2UgfSBmcm9tIFwiLi9zcmMvaHR0cC50c1wiO1xuZXhwb3J0IHR5cGUgeyBMb2dMZXZlbCwgTG9nZ2VyIH0gZnJvbSBcIi4vc3JjL2xvZy50c1wiO1xuZXhwb3J0IHR5cGUgeyBVcmxMaWtlLCBJcFZlcnNpb24sIFBhcnNlZElwLCBDaWRyLCBVcmxCdWlsZGVyLCBQYXJzZUVtYWlsc09wdGlvbnMgfSBmcm9tIFwiLi9zcmMvbmV0LnRzXCI7XG5leHBvcnQgdHlwZSB7IFNlcXVlbmNlLCBDb250YWluZXIsIENvbGxlY3Rpb24sIE9uZU9yTWFueSwgTmFtZUxpa2UsIE5vbkZ1bmN0aW9uS2V5cywgU2VyaWFsaXphYmxlUHJpbWl0aXZlLCBTZXJpYWxpemFibGVWYWx1ZSwgVG9OdW1iZXJPcHRpb25zLCBUb0RhdGVPcHRpb25zLCBUb0R1cmF0aW9uT3B0aW9ucywgRGVlcEVxdWFsQ29tcGFyYXRvciB9IGZyb20gXCIuL3NyYy9vYmplY3QudHNcIjtcbmV4cG9ydCB0eXBlIHsgUGF0dGVybk9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvcGF0dGVybi50c1wiO1xuZXhwb3J0IHR5cGUgeyBQcmVkaWNhdGVGdW5jdGlvbiwgVHlwZVByZWRpY2F0ZUZ1bmN0aW9uLCBQcmVkaWNhdGVJbnB1dCwgUHJlZGljYXRlIH0gZnJvbSBcIi4vc3JjL3ByZWRpY2F0ZS50c1wiO1xuZXhwb3J0IHR5cGUgeyBUb2tlbml6ZU9wdGlvbnMsIEtleU9wdGlvbnMsIElkZW50aWZpZXJPcHRpb25zLCBEZWRlbnRPcHRpb25zLCBEZXNjcmlwdGlvbiB9IGZyb20gXCIuL3NyYy9zdHJpbmctdXRpbHMudHNcIjtcbmV4cG9ydCB7IEFDQ0VTU19UT0tFTl9IRUFERVIsIFVTRVJfSURfSEVBREVSLCBVU0VSX0VNQUlMX0hFQURFUiB9IGZyb20gXCIuL3NyYy90b2tlbi50c1wiO1xuIl19
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyx3QkFBd0IsQ0FBQztBQUMzRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxVQUFVLE1BQU0sc0JBQXNCLENBQUM7QUFDbkQsT0FBTyxLQUFLLFVBQVUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRCxPQUFPLEtBQUssZ0JBQWdCLE1BQU0sNEJBQTRCLENBQUM7QUFDL0QsT0FBTyxLQUFLLFVBQVUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRCxPQUFPLEtBQUssU0FBUyxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sS0FBSyxhQUFhLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxLQUFLLElBQUksTUFBTSxlQUFlLENBQUM7QUFDdEMsT0FBTyxLQUFLLElBQUksTUFBTSxlQUFlLENBQUM7QUFDdEMsT0FBTyxLQUFLLElBQUksTUFBTSxlQUFlLENBQUM7QUFDdEMsT0FBTyxLQUFLLEdBQUcsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxLQUFLLEdBQUcsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxLQUFLLFNBQVMsTUFBTSxvQkFBb0IsQ0FBQztBQUNoRCxPQUFPLEtBQUssV0FBVyxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sS0FBSyxLQUFLLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLG1CQUFtQixFQUFFLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLGtCQUFrQixFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFTL0osT0FBTyxFQUFFLGdDQUFnQyxFQUFFLDBCQUEwQixFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsbUJBQW1CLEVBQUUsbUJBQW1CLEVBQUUsdUJBQXVCLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUt2TixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsY0FBYyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBHRU5FUkFURUQgYnkgcHJvamVuIHdhdGNoIC0gRE8gTk9UIEVESVQuXG4vLyBSZWdlbmVyYXRlZCBmcm9tIHRoZSBleHBvcnRpbmcgbW9kdWxlcyBpbiAuL3NyYy5cbi8vIEhhbmQgZWRpdHMgYXJlIG92ZXJ3cml0dGVuIG9uIHRoZSBuZXh0IHdhdGNoOyB0aGlzIGZpbGUgaXMgcmVhZC1vbmx5LlxuXG5leHBvcnQgY29uc3QgUEFDS0FHRV9JREVOVElGSUVSID0gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5leHBvcnQgY29uc3QgUEFDS0FHRV9WRVJTSU9OID0gXCIwLjkuNDNcIjtcbmV4cG9ydCAqIGFzIGFzeW5jVXRpbHMgZnJvbSBcIi4vc3JjL2FzeW5jLXV0aWxzLnRzXCI7XG5leHBvcnQgKiBhcyBicmFuZFV0aWxzIGZyb20gXCIuL3NyYy9icmFuZC11dGlscy50c1wiO1xuZXhwb3J0ICogYXMgZW52aXJvbm1lbnRVdGlscyBmcm9tIFwiLi9zcmMvZW52aXJvbm1lbnQtdXRpbHMudHNcIjtcbmV4cG9ydCAqIGFzIGVycm9yVXRpbHMgZnJvbSBcIi4vc3JjL2Vycm9yLXV0aWxzLnRzXCI7XG5leHBvcnQgKiBhcyBleGVjdXRpb24gZnJvbSBcIi4vc3JjL2V4ZWN1dGlvbi50c1wiO1xuZXhwb3J0ICogYXMgZnVuY3Rpb25VdGlscyBmcm9tIFwiLi9zcmMvZnVuY3Rpb24tdXRpbHMudHNcIjtcbmV4cG9ydCAqIGFzIGhhc2ggZnJvbSBcIi4vc3JjL2hhc2gudHNcIjtcbmV4cG9ydCAqIGFzIGh0dHAgZnJvbSBcIi4vc3JjL2h0dHAudHNcIjtcbmV4cG9ydCAqIGFzIGpzb24gZnJvbSBcIi4vc3JjL2pzb24udHNcIjtcbmV4cG9ydCAqIGFzIGxvZyBmcm9tIFwiLi9zcmMvbG9nLnRzXCI7XG5leHBvcnQgKiBhcyBuZXQgZnJvbSBcIi4vc3JjL25ldC50c1wiO1xuZXhwb3J0ICogYXMgb2JqZWN0IGZyb20gXCIuL3NyYy9vYmplY3QudHNcIjtcbmV4cG9ydCAqIGFzIG9wdGlvbnMgZnJvbSBcIi4vc3JjL29wdGlvbnMudHNcIjtcbmV4cG9ydCAqIGFzIHBhdHRlcm4gZnJvbSBcIi4vc3JjL3BhdHRlcm4udHNcIjtcbmV4cG9ydCAqIGFzIHByZWRpY2F0ZSBmcm9tIFwiLi9zcmMvcHJlZGljYXRlLnRzXCI7XG5leHBvcnQgKiBhcyBzdHJpbmdVdGlscyBmcm9tIFwiLi9zcmMvc3RyaW5nLXV0aWxzLnRzXCI7XG5leHBvcnQgKiBhcyB0b2tlbiBmcm9tIFwiLi9zcmMvdG9rZW4udHNcIjtcbmV4cG9ydCB0eXBlIHsgQ29uY3VycmVudEVycm9yTW9kZSwgTWFwQ29uY3VycmVudE9wdGlvbnMsIFBvbGxDb250ZXh0LCBQb2xsUHJvZHVjZXIsIFBvbGxPcHRpb25zIH0gZnJvbSBcIi4vc3JjL2FzeW5jLXV0aWxzLnRzXCI7XG5leHBvcnQgeyBERUZBVUxUX0JSQU5EX0FTU0VUUywgQnJhbmRBc3NldFNldFNjaGVtYSwgQnJhbmRDb2xvcnNTY2hlbWEsIEJyYW5kVm9pY2VTY2hlbWEsIEJyYW5kQ29udGV4dFNjaGVtYSwgZGVmYXVsdEJyYW5kQ29udGV4dCB9IGZyb20gXCIuL3NyYy9icmFuZC11dGlscy50c1wiO1xuZXhwb3J0IHR5cGUgeyBCcmFuZENvbnRleHQsIEJyYW5kQ29udGV4dElucHV0LCBCcmFuZEFzc2V0U2V0IH0gZnJvbSBcIi4vc3JjL2JyYW5kLXV0aWxzLnRzXCI7XG5leHBvcnQgdHlwZSB7IEVycm9yQ29udGV4dCB9IGZyb20gXCIuL3NyYy9lcnJvci11dGlscy50c1wiO1xuZXhwb3J0IHR5cGUgeyBFeGVjdXRpb25SZXN1bHQsIEV4ZWN1dG9yLCBFeGVjdXRpb25GYWlsdXJlLCBSdW5PcHRpb25zIH0gZnJvbSBcIi4vc3JjL2V4ZWN1dGlvbi50c1wiO1xuZXhwb3J0IHR5cGUgeyBNZW1vaXplT3B0aW9ucyB9IGZyb20gXCIuL3NyYy9mdW5jdGlvbi11dGlscy50c1wiO1xuZXhwb3J0IHR5cGUgeyBIZWFkZXJMaWtlIH0gZnJvbSBcIi4vc3JjL2h0dHAudHNcIjtcbmV4cG9ydCB0eXBlIHsgTG9nTGV2ZWwsIExvZ2dlciB9IGZyb20gXCIuL3NyYy9sb2cudHNcIjtcbmV4cG9ydCB0eXBlIHsgVXJsTGlrZSwgSXBWZXJzaW9uLCBQYXJzZWRJcCwgQ2lkciwgVXJsQnVpbGRlciwgUGFyc2VFbWFpbHNPcHRpb25zIH0gZnJvbSBcIi4vc3JjL25ldC50c1wiO1xuZXhwb3J0IHR5cGUgeyBTZXF1ZW5jZSwgQ29udGFpbmVyLCBDb2xsZWN0aW9uLCBPbmVPck1hbnksIE5hbWVMaWtlLCBOb25GdW5jdGlvbktleXMsIFNlcmlhbGl6YWJsZVByaW1pdGl2ZSwgU2VyaWFsaXphYmxlVmFsdWUsIFRvTnVtYmVyT3B0aW9ucywgVG9EYXRlT3B0aW9ucywgVG9EdXJhdGlvbk9wdGlvbnMsIERlZXBFcXVhbENvbXBhcmF0b3IgfSBmcm9tIFwiLi9zcmMvb2JqZWN0LnRzXCI7XG5leHBvcnQgeyBEYXRhYnJpY2tzRW52aXJvbm1lbnROYW1lc1NjaGVtYSwgZGF0YWJyaWNrc0Vudmlyb25tZW50TmFtZXMsIE1BWF9UQ1BfUE9SVCwgdGNwUG9ydFNjaGVtYSwgdGNwUG9ydE9yWmVyb1NjaGVtYSwgbm9ybWFsaXplZFVybFNjaGVtYSwgRGF0YWJyaWNrc09wdGlvbnNTY2hlbWEsIExha2ViYXNlT3B0aW9uc1NjaGVtYSB9IGZyb20gXCIuL3NyYy9vcHRpb25zLnRzXCI7XG5leHBvcnQgdHlwZSB7IERhdGFicmlja3NFbnZpcm9ubWVudE5hbWVzLCBEYXRhYnJpY2tzT3B0aW9ucywgT3B0aW9uU2VyaWFsaXphdGlvbkZvcm1hdCwgTGFrZWJhc2VPcHRpb25zLCBPcHRpb25WYWx1ZU1hcCwgTGlzdGVuQWRkcmVzcywgTGlzdGVuQWRkcmVzc09wdGlvbnMgfSBmcm9tIFwiLi9zcmMvb3B0aW9ucy50c1wiO1xuZXhwb3J0IHR5cGUgeyBQYXR0ZXJuT3B0aW9ucyB9IGZyb20gXCIuL3NyYy9wYXR0ZXJuLnRzXCI7XG5leHBvcnQgdHlwZSB7IFByZWRpY2F0ZUZ1bmN0aW9uLCBUeXBlUHJlZGljYXRlRnVuY3Rpb24sIFByZWRpY2F0ZUlucHV0LCBQcmVkaWNhdGUgfSBmcm9tIFwiLi9zcmMvcHJlZGljYXRlLnRzXCI7XG5leHBvcnQgdHlwZSB7IFRva2VuaXplT3B0aW9ucywgS2V5T3B0aW9ucywgSWRlbnRpZmllck9wdGlvbnMsIERlZGVudE9wdGlvbnMsIERlc2NyaXB0aW9uIH0gZnJvbSBcIi4vc3JjL3N0cmluZy11dGlscy50c1wiO1xuZXhwb3J0IHsgQUNDRVNTX1RPS0VOX0hFQURFUiwgVVNFUl9JRF9IRUFERVIsIFVTRVJfRU1BSUxfSEVBREVSIH0gZnJvbSBcIi4vc3JjL3Rva2VuLnRzXCI7XG4iXX0=
@@ -1,7 +1,7 @@
1
1
  import { toBoolean } from "./object.js";
2
- const MAX_TCP_PORT = 65_535;
2
+ import { MAX_TCP_PORT } from "./options.js";
3
3
  function runtimeEnvironment() {
4
- return globalThis.process?.env ?? {};
4
+ return (globalThis.process?.env ?? {});
5
5
  }
6
6
  /** Detect a Databricks App runtime from its required name, host, and port. */
7
7
  export function isDatabricksAppEnv(source = runtimeEnvironment()) {
@@ -24,4 +24,4 @@ export function isDatabricksAppEnv(source = runtimeEnvironment()) {
24
24
  return false;
25
25
  }
26
26
  }
27
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52aXJvbm1lbnQtdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZW52aXJvbm1lbnQtdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUV4QyxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUM7QUFFNUIsU0FBUyxrQkFBa0I7SUFDekIsT0FDRSxVQUdELENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxFQUFFLENBQUM7QUFDdkIsQ0FBQztBQUVELDhFQUE4RTtBQUM5RSxNQUFNLFVBQVUsa0JBQWtCLENBQ2hDLFNBQTZDLGtCQUFrQixFQUFFO0lBRWpFLE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsNEJBQTRCLENBQUMsQ0FBQztJQUNoRSxJQUFJLFFBQVEsS0FBSyxTQUFTO1FBQUUsT0FBTyxRQUFRLENBQUM7SUFDNUMsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLG1CQUFtQixFQUFFLElBQUksRUFBRSxDQUFDO0lBQ2hELE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxlQUFlLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDNUMsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLG1CQUFtQixFQUFFLElBQUksRUFBRSxDQUFDO0lBQ2hELElBQUksQ0FBQyxJQUFJLElBQUksYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDN0YsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxJQUFJLFVBQVUsR0FBRyxDQUFDLElBQUksVUFBVSxHQUFHLFlBQVk7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUMvRixJQUFJLENBQUM7UUFDSCxNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxQixPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsS0FBSyxPQUFPLElBQUksR0FBRyxDQUFDLFFBQVEsS0FBSyxRQUFRLENBQUMsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzFGLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdG9Cb29sZWFuIH0gZnJvbSBcIi4vb2JqZWN0LnRzXCI7XG5cbmNvbnN0IE1BWF9UQ1BfUE9SVCA9IDY1XzUzNTtcblxuZnVuY3Rpb24gcnVudGltZUVudmlyb25tZW50KCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICByZXR1cm4gKFxuICAgIGdsb2JhbFRoaXMgYXMgdHlwZW9mIGdsb2JhbFRoaXMgJiB7XG4gICAgICBwcm9jZXNzPzogeyBlbnY/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IH07XG4gICAgfVxuICApLnByb2Nlc3M/LmVudiA/PyB7fTtcbn1cblxuLyoqIERldGVjdCBhIERhdGFicmlja3MgQXBwIHJ1bnRpbWUgZnJvbSBpdHMgcmVxdWlyZWQgbmFtZSwgaG9zdCwgYW5kIHBvcnQuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEYXRhYnJpY2tzQXBwRW52KFxuICBzb3VyY2U6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4gPSBydW50aW1lRW52aXJvbm1lbnQoKSxcbik6IGJvb2xlYW4ge1xuICBjb25zdCBvdmVycmlkZSA9IHRvQm9vbGVhbihzb3VyY2UuREJYX1RPT0xTX0RBVEFCUklDS1NfQVBQX0VOVik7XG4gIGlmIChvdmVycmlkZSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gb3ZlcnJpZGU7XG4gIGNvbnN0IG5hbWUgPSBzb3VyY2UuREFUQUJSSUNLU19BUFBfTkFNRT8udHJpbSgpO1xuICBjb25zdCBob3N0ID0gc291cmNlLkRBVEFCUklDS1NfSE9TVD8udHJpbSgpO1xuICBjb25zdCBwb3J0ID0gc291cmNlLkRBVEFCUklDS1NfQVBQX1BPUlQ/LnRyaW0oKTtcbiAgaWYgKCFuYW1lIHx8IC9cXCRcXHtbXn1dK1xcfS8udGVzdChuYW1lKSB8fCAhaG9zdCB8fCAhcG9ydCB8fCAhL15cXGQrJC8udGVzdChwb3J0KSkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBwYXJzZWRQb3J0ID0gTnVtYmVyKHBvcnQpO1xuICBpZiAoIU51bWJlci5pc0ludGVnZXIocGFyc2VkUG9ydCkgfHwgcGFyc2VkUG9ydCA8IDEgfHwgcGFyc2VkUG9ydCA+IE1BWF9UQ1BfUE9SVCkgcmV0dXJuIGZhbHNlO1xuICB0cnkge1xuICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoaG9zdCk7XG4gICAgcmV0dXJuICh1cmwucHJvdG9jb2wgPT09IFwiaHR0cDpcIiB8fCB1cmwucHJvdG9jb2wgPT09IFwiaHR0cHM6XCIpICYmIEJvb2xlYW4odXJsLmhvc3RuYW1lKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4iXX0=
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52aXJvbm1lbnQtdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZW52aXJvbm1lbnQtdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN4QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRTVDLFNBQVMsa0JBQWtCO0lBQ3pCLE9BQU8sQ0FFSCxVQUdELENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxFQUFFLENBQ3JCLENBQUM7QUFDSixDQUFDO0FBRUQsOEVBQThFO0FBQzlFLE1BQU0sVUFBVSxrQkFBa0IsQ0FDaEMsU0FBNkMsa0JBQWtCLEVBQUU7SUFFakUsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO0lBQ2hFLElBQUksUUFBUSxLQUFLLFNBQVM7UUFBRSxPQUFPLFFBQVEsQ0FBQztJQUM1QyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDaEQsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLGVBQWUsRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUM1QyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDaEQsSUFBSSxDQUFDLElBQUksSUFBSSxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUM3RixNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDaEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksVUFBVSxHQUFHLENBQUMsSUFBSSxVQUFVLEdBQUcsWUFBWTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQy9GLElBQUksQ0FBQztRQUNILE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFCLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxLQUFLLE9BQU8sSUFBSSxHQUFHLENBQUMsUUFBUSxLQUFLLFFBQVEsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDMUYsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0b0Jvb2xlYW4gfSBmcm9tIFwiLi9vYmplY3QudHNcIjtcbmltcG9ydCB7IE1BWF9UQ1BfUE9SVCB9IGZyb20gXCIuL29wdGlvbnMudHNcIjtcblxuZnVuY3Rpb24gcnVudGltZUVudmlyb25tZW50KCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICByZXR1cm4gKFxuICAgIChcbiAgICAgIGdsb2JhbFRoaXMgYXMgdHlwZW9mIGdsb2JhbFRoaXMgJiB7XG4gICAgICAgIHByb2Nlc3M/OiB7IGVudj86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4gfTtcbiAgICAgIH1cbiAgICApLnByb2Nlc3M/LmVudiA/PyB7fVxuICApO1xufVxuXG4vKiogRGV0ZWN0IGEgRGF0YWJyaWNrcyBBcHAgcnVudGltZSBmcm9tIGl0cyByZXF1aXJlZCBuYW1lLCBob3N0LCBhbmQgcG9ydC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RhdGFicmlja3NBcHBFbnYoXG4gIHNvdXJjZTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiA9IHJ1bnRpbWVFbnZpcm9ubWVudCgpLFxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IG92ZXJyaWRlID0gdG9Cb29sZWFuKHNvdXJjZS5EQlhfVE9PTFNfREFUQUJSSUNLU19BUFBfRU5WKTtcbiAgaWYgKG92ZXJyaWRlICE9PSB1bmRlZmluZWQpIHJldHVybiBvdmVycmlkZTtcbiAgY29uc3QgbmFtZSA9IHNvdXJjZS5EQVRBQlJJQ0tTX0FQUF9OQU1FPy50cmltKCk7XG4gIGNvbnN0IGhvc3QgPSBzb3VyY2UuREFUQUJSSUNLU19IT1NUPy50cmltKCk7XG4gIGNvbnN0IHBvcnQgPSBzb3VyY2UuREFUQUJSSUNLU19BUFBfUE9SVD8udHJpbSgpO1xuICBpZiAoIW5hbWUgfHwgL1xcJFxce1tefV0rXFx9Ly50ZXN0KG5hbWUpIHx8ICFob3N0IHx8ICFwb3J0IHx8ICEvXlxcZCskLy50ZXN0KHBvcnQpKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHBhcnNlZFBvcnQgPSBOdW1iZXIocG9ydCk7XG4gIGlmICghTnVtYmVyLmlzSW50ZWdlcihwYXJzZWRQb3J0KSB8fCBwYXJzZWRQb3J0IDwgMSB8fCBwYXJzZWRQb3J0ID4gTUFYX1RDUF9QT1JUKSByZXR1cm4gZmFsc2U7XG4gIHRyeSB7XG4gICAgY29uc3QgdXJsID0gbmV3IFVSTChob3N0KTtcbiAgICByZXR1cm4gKHVybC5wcm90b2NvbCA9PT0gXCJodHRwOlwiIHx8IHVybC5wcm90b2NvbCA9PT0gXCJodHRwczpcIikgJiYgQm9vbGVhbih1cmwuaG9zdG5hbWUpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Browser-safe option primitives shared across dbx-tools packages.
3
+ *
4
+ * @module
5
+ */
6
+ import { z } from "zod";
7
+ export declare const DatabricksEnvironmentNamesSchema: z.ZodObject<{
8
+ profile: z.ZodDefault<z.ZodLiteral<"DATABRICKS_CONFIG_PROFILE">>;
9
+ host: z.ZodDefault<z.ZodLiteral<"DATABRICKS_HOST">>;
10
+ accountId: z.ZodDefault<z.ZodLiteral<"DATABRICKS_ACCOUNT_ID">>;
11
+ workspaceId: z.ZodDefault<z.ZodLiteral<"DATABRICKS_WORKSPACE_ID">>;
12
+ configFile: z.ZodDefault<z.ZodLiteral<"DATABRICKS_CONFIG_FILE">>;
13
+ clientId: z.ZodDefault<z.ZodLiteral<"DATABRICKS_CLIENT_ID">>;
14
+ clientSecret: z.ZodDefault<z.ZodLiteral<"DATABRICKS_CLIENT_SECRET">>;
15
+ accessToken: z.ZodDefault<z.ZodLiteral<"DATABRICKS_TOKEN">>;
16
+ groupId: z.ZodDefault<z.ZodLiteral<"DATABRICKS_GROUP_ID">>;
17
+ authType: z.ZodDefault<z.ZodLiteral<"DATABRICKS_AUTH_TYPE">>;
18
+ appName: z.ZodDefault<z.ZodLiteral<"DATABRICKS_APP_NAME">>;
19
+ appPort: z.ZodDefault<z.ZodLiteral<"DATABRICKS_APP_PORT">>;
20
+ lakebaseEndpoint: z.ZodDefault<z.ZodLiteral<"LAKEBASE_ENDPOINT">>;
21
+ }, z.core.$strict>;
22
+ export type DatabricksEnvironmentNames = z.output<typeof DatabricksEnvironmentNamesSchema>;
23
+ /** Canonical Databricks environment names derived from the owning schema. */
24
+ export declare const databricksEnvironmentNames: Readonly<{
25
+ profile: "DATABRICKS_CONFIG_PROFILE";
26
+ host: "DATABRICKS_HOST";
27
+ accountId: "DATABRICKS_ACCOUNT_ID";
28
+ workspaceId: "DATABRICKS_WORKSPACE_ID";
29
+ configFile: "DATABRICKS_CONFIG_FILE";
30
+ clientId: "DATABRICKS_CLIENT_ID";
31
+ clientSecret: "DATABRICKS_CLIENT_SECRET";
32
+ accessToken: "DATABRICKS_TOKEN";
33
+ groupId: "DATABRICKS_GROUP_ID";
34
+ authType: "DATABRICKS_AUTH_TYPE";
35
+ appName: "DATABRICKS_APP_NAME";
36
+ appPort: "DATABRICKS_APP_PORT";
37
+ lakebaseEndpoint: "LAKEBASE_ENDPOINT";
38
+ }>;
39
+ /** Highest valid TCP port number. */
40
+ export declare const MAX_TCP_PORT = 65535;
41
+ export declare const tcpPortSchema: z.ZodCoercedNumber<number>;
42
+ export declare const tcpPortOrZeroSchema: z.ZodCoercedNumber<number>;
43
+ export declare const normalizedUrlSchema: z.ZodString;
44
+ export declare const DatabricksOptionsSchema: z.ZodObject<{
45
+ profile: z.ZodOptional<z.ZodString>;
46
+ host: z.ZodOptional<z.ZodString>;
47
+ accountId: z.ZodOptional<z.ZodString>;
48
+ workspaceId: z.ZodOptional<z.ZodString>;
49
+ configFile: z.ZodOptional<z.ZodString>;
50
+ clientId: z.ZodOptional<z.ZodString>;
51
+ clientSecret: z.ZodOptional<z.ZodString>;
52
+ accessToken: z.ZodOptional<z.ZodString>;
53
+ groupId: z.ZodOptional<z.ZodString>;
54
+ authType: z.ZodOptional<z.ZodString>;
55
+ appName: z.ZodOptional<z.ZodString>;
56
+ appPort: z.ZodOptional<z.ZodCoercedNumber<number>>;
57
+ lakebaseEndpoint: z.ZodOptional<z.ZodString>;
58
+ }, z.core.$strict>;
59
+ export type DatabricksOptions = z.input<typeof DatabricksOptionsSchema>;
60
+ /** Key format emitted by {@link serializeOpts}. */
61
+ export type OptionSerializationFormat = "flag" | "env";
62
+ /** Serialize complete parsed options as JSON keyed by flags or environment names. */
63
+ export declare function serializeOpts<T extends z.ZodRawShape>(schema: z.ZodObject<T>, values: z.input<z.ZodObject<T>>, format: OptionSerializationFormat): string;
64
+ export declare const LakebaseOptionsSchema: z.ZodObject<{
65
+ lakebaseEndpoint: z.ZodOptional<z.ZodString>;
66
+ }, z.core.$strict>;
67
+ export type LakebaseOptions = z.input<typeof LakebaseOptionsSchema>;
68
+ /** Explicit option values or environment entries consumed by option parsing helpers. */
69
+ export type OptionValueMap = Readonly<Record<string, unknown>> | null;
70
+ /** Parse only supplied flag and environment values through an owning Zod object schema. */
71
+ export declare function parseOpts<T extends z.ZodRawShape>(schema: z.ZodObject<T>, flags?: OptionValueMap, environment?: OptionValueMap): Partial<z.output<z.ZodObject<T>>>;
72
+ /** Host and TCP port returned by {@link listenAddressSchema}. */
73
+ export interface ListenAddress {
74
+ readonly host: string;
75
+ readonly port: number;
76
+ }
77
+ /** Defaults and validation policy for {@link listenAddressSchema}. */
78
+ export interface ListenAddressOptions {
79
+ readonly port: number;
80
+ readonly host?: string;
81
+ readonly loopback?: boolean;
82
+ }
83
+ /** Build a listener address schema accepting a port, `:port`, `host:port`, or object. */
84
+ export declare function listenAddressSchema(options: ListenAddressOptions): z.ZodDefault<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodObject<{
85
+ host: z.ZodDefault<z.ZodString>;
86
+ port: z.ZodDefault<z.ZodCoercedNumber<number>>;
87
+ }, z.core.$strict>>>;
88
+ /** Render a listener address as `host:port`, with IPv6 hosts bracketed. */
89
+ export declare function formatListenAddress(address: ListenAddress): string;
@@ -0,0 +1,262 @@
1
+ /**
2
+ * Browser-safe option primitives shared across dbx-tools packages.
3
+ *
4
+ * @module
5
+ */
6
+ import { z } from "zod";
7
+ import { isLoopbackHost, urlBuilder } from "./net.js";
8
+ import { isRecord, toBoolean } from "./object.js";
9
+ import { parseList, toIdentifierWithOptions, toSlug } from "./string-utils.js";
10
+ const environmentName = (name, description) => z.literal(name).default(name).describe(description);
11
+ export const DatabricksEnvironmentNamesSchema = z
12
+ .object({
13
+ profile: environmentName("DATABRICKS_CONFIG_PROFILE", "Databricks CLI profile environment."),
14
+ host: environmentName("DATABRICKS_HOST", "Databricks host environment."),
15
+ accountId: environmentName("DATABRICKS_ACCOUNT_ID", "Databricks account ID environment."),
16
+ workspaceId: environmentName("DATABRICKS_WORKSPACE_ID", "Databricks workspace ID environment."),
17
+ configFile: environmentName("DATABRICKS_CONFIG_FILE", "Databricks CLI config file environment."),
18
+ clientId: environmentName("DATABRICKS_CLIENT_ID", "Databricks OAuth client ID environment."),
19
+ clientSecret: environmentName("DATABRICKS_CLIENT_SECRET", "Databricks OAuth client secret environment."),
20
+ accessToken: environmentName("DATABRICKS_TOKEN", "Databricks access token environment."),
21
+ groupId: environmentName("DATABRICKS_GROUP_ID", "Databricks group ID environment."),
22
+ authType: environmentName("DATABRICKS_AUTH_TYPE", "Databricks auth type environment."),
23
+ appName: environmentName("DATABRICKS_APP_NAME", "Databricks App name environment."),
24
+ appPort: environmentName("DATABRICKS_APP_PORT", "Databricks App port environment."),
25
+ lakebaseEndpoint: environmentName("LAKEBASE_ENDPOINT", "Lakebase endpoint environment."),
26
+ })
27
+ .strict()
28
+ .describe("Canonical Databricks CLI, SDK, Apps, and Lakebase environment names.");
29
+ /** Canonical Databricks environment names derived from the owning schema. */
30
+ export const databricksEnvironmentNames = Object.freeze(DatabricksEnvironmentNamesSchema.parse({}));
31
+ /** Highest valid TCP port number. */
32
+ export const MAX_TCP_PORT = 65_535;
33
+ export const tcpPortSchema = z.coerce
34
+ .number()
35
+ .int()
36
+ .min(1)
37
+ .max(MAX_TCP_PORT)
38
+ .describe("TCP port from 1 through 65535.");
39
+ export const tcpPortOrZeroSchema = z.coerce
40
+ .number()
41
+ .int()
42
+ .min(0)
43
+ .max(MAX_TCP_PORT)
44
+ .describe("TCP port from 0 through 65535, where zero requests automatic allocation.");
45
+ export const normalizedUrlSchema = z
46
+ .string()
47
+ .trim()
48
+ .min(1)
49
+ .refine((value) => urlBuilder(value) !== undefined, {
50
+ message: "Expected a valid URL or host.",
51
+ })
52
+ .overwrite(normalizeUrl)
53
+ .describe("URL normalized through the shared URL builder.");
54
+ const databricksText = (description) => z.string().trim().min(1).optional().describe(description);
55
+ export const DatabricksOptionsSchema = z
56
+ .object({
57
+ profile: databricksText("Databricks CLI profile.").meta({
58
+ env: databricksEnvironmentNames.profile,
59
+ }),
60
+ host: normalizedUrlSchema
61
+ .optional()
62
+ .describe("Databricks host.")
63
+ .meta({ env: databricksEnvironmentNames.host, flag: false }),
64
+ accountId: databricksText("Databricks account ID.").meta({
65
+ env: databricksEnvironmentNames.accountId,
66
+ flag: false,
67
+ }),
68
+ workspaceId: databricksText("Databricks workspace ID.").meta({
69
+ env: databricksEnvironmentNames.workspaceId,
70
+ flag: false,
71
+ }),
72
+ configFile: databricksText("Databricks CLI config file.").meta({
73
+ env: databricksEnvironmentNames.configFile,
74
+ flag: false,
75
+ }),
76
+ clientId: databricksText("Databricks OAuth client ID.").meta({
77
+ env: databricksEnvironmentNames.clientId,
78
+ flag: false,
79
+ }),
80
+ clientSecret: databricksText("Databricks OAuth client secret.").meta({
81
+ env: databricksEnvironmentNames.clientSecret,
82
+ flag: false,
83
+ }),
84
+ accessToken: databricksText("Databricks access token.").meta({
85
+ env: databricksEnvironmentNames.accessToken,
86
+ flag: false,
87
+ }),
88
+ groupId: databricksText("Databricks group ID.").meta({
89
+ env: databricksEnvironmentNames.groupId,
90
+ flag: false,
91
+ }),
92
+ authType: databricksText("Databricks authentication type.").meta({
93
+ env: databricksEnvironmentNames.authType,
94
+ flag: false,
95
+ }),
96
+ appName: databricksText("Databricks App name.").meta({
97
+ env: databricksEnvironmentNames.appName,
98
+ flag: false,
99
+ }),
100
+ appPort: tcpPortSchema.optional().describe("Databricks App port.").meta({
101
+ env: databricksEnvironmentNames.appPort,
102
+ flag: false,
103
+ }),
104
+ lakebaseEndpoint: databricksText("Lakebase endpoint.").meta({
105
+ env: databricksEnvironmentNames.lakebaseEndpoint,
106
+ flag: false,
107
+ }),
108
+ })
109
+ .strict()
110
+ .describe("Common Databricks CLI, SDK, Apps, and Lakebase options.");
111
+ /** Serialize complete parsed options as JSON keyed by flags or environment names. */
112
+ export function serializeOpts(schema, values, format) {
113
+ const parsed = schema.parse(values);
114
+ const entries = optionProperties(schema).flatMap((property) => {
115
+ if (format === "flag" && property.flag === false)
116
+ return [];
117
+ const key = format === "flag"
118
+ ? `--${toSlug(property.key)}`
119
+ : (optionEnvironmentNames(property.key, property.env)[0] ?? "");
120
+ if (!key)
121
+ return [];
122
+ const value = parsed[property.key];
123
+ return value === undefined ? [] : [[key, serializedOptionValue(value)]];
124
+ });
125
+ return JSON.stringify(Object.fromEntries(entries), null, 2);
126
+ }
127
+ const optionalText = (description, env) => z.string().trim().min(1).optional().describe(description).meta({ env, flag: false });
128
+ export const LakebaseOptionsSchema = z
129
+ .object({
130
+ lakebaseEndpoint: optionalText("Lakebase project, resource path, host, or URL.", databricksEnvironmentNames.lakebaseEndpoint),
131
+ })
132
+ .strict()
133
+ .describe("Common Lakebase options.");
134
+ /** Parse only supplied flag and environment values through an owning Zod object schema. */
135
+ export function parseOpts(schema, flags = null, environment = null) {
136
+ const configured = optionValues(schema, flags, environment);
137
+ const parsed = schema.parse(configured);
138
+ return Object.fromEntries(Object.keys(configured).map((key) => [key, parsed[key]]));
139
+ }
140
+ /** Build a listener address schema accepting a port, `:port`, `host:port`, or object. */
141
+ export function listenAddressSchema(options) {
142
+ const defaults = {
143
+ host: options.host ?? "localhost",
144
+ port: options.port,
145
+ };
146
+ return z
147
+ .preprocess((value) => parseListenAddress(value, defaults), z
148
+ .object({
149
+ host: z.string().trim().toLowerCase().min(1).default(defaults.host),
150
+ port: tcpPortOrZeroSchema.default(defaults.port),
151
+ })
152
+ .strict()
153
+ .refine((address) => !options.loopback || isLoopbackHost(address.host), "Listener host must be loopback."))
154
+ .default(defaults)
155
+ .describe("Listener host and port.");
156
+ }
157
+ /** Render a listener address as `host:port`, with IPv6 hosts bracketed. */
158
+ export function formatListenAddress(address) {
159
+ const host = address.host.includes(":") ? `[${address.host}]` : address.host;
160
+ return `${host}:${address.port}`;
161
+ }
162
+ function parseListenAddress(value, defaults) {
163
+ if (typeof value === "number")
164
+ return { host: defaults.host, port: value };
165
+ if (typeof value !== "string")
166
+ return value;
167
+ const text = value.trim();
168
+ if (/^\d+$/.test(text))
169
+ return { host: defaults.host, port: text };
170
+ if (/^:\d+$/.test(text))
171
+ return { host: defaults.host, port: text.slice(1) };
172
+ const bracketed = text.match(/^\[([^\]]+)\](?::(\d+))?$/);
173
+ if (bracketed) {
174
+ return { host: bracketed[1], port: bracketed[2] ?? defaults.port };
175
+ }
176
+ const separator = text.lastIndexOf(":");
177
+ if (separator > 0 && !text.slice(0, separator).includes(":")) {
178
+ return {
179
+ host: text.slice(0, separator),
180
+ port: text.slice(separator + 1),
181
+ };
182
+ }
183
+ return { host: text || defaults.host, port: defaults.port };
184
+ }
185
+ function optionProperties(schema) {
186
+ const document = z.toJSONSchema(schema);
187
+ if (!isRecord(document.properties))
188
+ return [];
189
+ return Object.entries(document.properties).flatMap(([key, value]) => {
190
+ if (!isRecord(value))
191
+ return [];
192
+ return [
193
+ {
194
+ key,
195
+ type: typeof value.type === "string" ? value.type : undefined,
196
+ env: typeof value.env === "string" || Array.isArray(value.env)
197
+ ? value.env
198
+ : undefined,
199
+ flag: typeof value.flag === "boolean" ? value.flag : undefined,
200
+ },
201
+ ];
202
+ });
203
+ }
204
+ function serializedOptionValue(value) {
205
+ if (isRecord(value) && typeof value.host === "string" && typeof value.port === "number") {
206
+ return formatListenAddress({ host: value.host, port: value.port });
207
+ }
208
+ return value;
209
+ }
210
+ function optionValues(schema, values, environment) {
211
+ const document = z.toJSONSchema(schema);
212
+ const properties = isRecord(document.properties) ? document.properties : {};
213
+ const configured = {};
214
+ for (const [key, property] of Object.entries(properties)) {
215
+ if (!isRecord(property))
216
+ continue;
217
+ const explicit = firstOptionValue(values, [key, `--${toSlug(key)}`]);
218
+ if (explicit !== undefined) {
219
+ configured[key] = optionEnvironmentValue(property.type, explicit);
220
+ continue;
221
+ }
222
+ const names = optionEnvironmentNames(key, property.env);
223
+ const sourced = firstOptionValue(environment, names);
224
+ if (sourced === undefined)
225
+ continue;
226
+ configured[key] = optionEnvironmentValue(property.type, sourced);
227
+ }
228
+ return configured;
229
+ }
230
+ function optionEnvironmentNames(key, configured) {
231
+ if (typeof configured === "string")
232
+ return [configured];
233
+ if (Array.isArray(configured)) {
234
+ return configured.filter((value) => typeof value === "string");
235
+ }
236
+ return [toIdentifierWithOptions({ delimiter: "_" }, key).toUpperCase()];
237
+ }
238
+ function optionEnvironmentValue(type, value) {
239
+ if (type === "boolean")
240
+ return toBoolean(value) ?? value;
241
+ if (type === "array" && typeof value === "string")
242
+ return parseList(value);
243
+ return value;
244
+ }
245
+ function firstOptionValue(source, keys) {
246
+ if (!source)
247
+ return undefined;
248
+ for (const key of keys) {
249
+ const value = source[key];
250
+ if (value !== undefined && value !== null && value !== "")
251
+ return value;
252
+ }
253
+ return undefined;
254
+ }
255
+ function normalizeUrl(value) {
256
+ const url = urlBuilder(value);
257
+ if (!url)
258
+ return value;
259
+ const normalized = url.toString();
260
+ return url.pathname === "/" && !url.search && !url.hash ? normalized.slice(0, -1) : normalized;
261
+ }
262
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3B0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vcHRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFFSCxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBQ3hCLE9BQU8sRUFBRSxjQUFjLEVBQUUsVUFBVSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3RELE9BQU8sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2xELE9BQU8sRUFBRSxTQUFTLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFL0UsTUFBTSxlQUFlLEdBQUcsQ0FBbUIsSUFBTyxFQUFFLFdBQW1CLEVBQUUsRUFBRSxDQUN6RSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7QUFFdEQsTUFBTSxDQUFDLE1BQU0sZ0NBQWdDLEdBQUcsQ0FBQztLQUM5QyxNQUFNLENBQUM7SUFDTixPQUFPLEVBQUUsZUFBZSxDQUFDLDJCQUEyQixFQUFFLHFDQUFxQyxDQUFDO0lBQzVGLElBQUksRUFBRSxlQUFlLENBQUMsaUJBQWlCLEVBQUUsOEJBQThCLENBQUM7SUFDeEUsU0FBUyxFQUFFLGVBQWUsQ0FBQyx1QkFBdUIsRUFBRSxvQ0FBb0MsQ0FBQztJQUN6RixXQUFXLEVBQUUsZUFBZSxDQUFDLHlCQUF5QixFQUFFLHNDQUFzQyxDQUFDO0lBQy9GLFVBQVUsRUFBRSxlQUFlLENBQ3pCLHdCQUF3QixFQUN4Qix5Q0FBeUMsQ0FDMUM7SUFDRCxRQUFRLEVBQUUsZUFBZSxDQUFDLHNCQUFzQixFQUFFLHlDQUF5QyxDQUFDO0lBQzVGLFlBQVksRUFBRSxlQUFlLENBQzNCLDBCQUEwQixFQUMxQiw2Q0FBNkMsQ0FDOUM7SUFDRCxXQUFXLEVBQUUsZUFBZSxD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QUksQ0FBQyxNQUFNO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDOUIsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN2QixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDMUIsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLEVBQUU7WUFBRSxPQUFPLEtBQUssQ0FBQztJQUMxRSxDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVELFNBQVMsWUFBWSxDQUFDLEtBQWE7SUFDakMsTUFBTSxHQUFHLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzlCLElBQUksQ0FBQyxHQUFHO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDdkIsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2xDLE9BQU8sR0FBRyxDQUFDLFFBQVEsS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO0FBQ2pHLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEJyb3dzZXItc2FmZSBvcHRpb24gcHJpbWl0aXZlcyBzaGFyZWQgYWNyb3NzIGRieC10b29scyBwYWNrYWdlcy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB7IGlzTG9vcGJhY2tIb3N0LCB1cmxCdWlsZGVyIH0gZnJvbSBcIi4vbmV0LnRzXCI7XG5pbXBvcnQgeyBpc1JlY29yZCwgdG9Cb29sZWFuIH0gZnJvbSBcIi4vb2JqZWN0LnRzXCI7XG5pbXBvcnQgeyBwYXJzZUxpc3QsIHRvSWRlbnRpZmllcldpdGhPcHRpb25zLCB0b1NsdWcgfSBmcm9tIFwiLi9zdHJpbmctdXRpbHMudHNcIjtcblxuY29uc3QgZW52aXJvbm1lbnROYW1lID0gPFQgZXh0ZW5kcyBzdHJpbmc+KG5hbWU6IFQsIGRlc2NyaXB0aW9uOiBzdHJpbmcpID0+XG4gIHoubGl0ZXJhbChuYW1lKS5kZWZhdWx0KG5hbWUpLmRlc2NyaWJlKGRlc2NyaXB0aW9uKTtcblxuZXhwb3J0IGNvbnN0IERhdGFicmlja3NFbnZpcm9ubWVudE5hbWVzU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICBwcm9maWxlOiBlbnZpcm9ubWVudE5hbWUoXCJEQVRBQlJJQ0tTX0NPTkZJR19QUk9GSUxFXCIsIFwiRGF0YWJyaWNrcyBDTEkgcHJvZmlsZSBlbnZpcm9ubWVudC5cIiksXG4gICAgaG9zdDogZW52aXJvbm1lbnROYW1lKFwiREFUQUJSSUNLU19IT1NUXCIsIFwiRGF0YWJyaWNrcyBob3N0IGVudmlyb25tZW50LlwiKSxcbiAgICBhY2NvdW50SWQ6IGVudmlyb25tZW50TmFtZShcIkRBVEFCUklDS1NfQUNDT1VOVF9JRFwiLCBcIkRhdGFicmlja3MgYWNjb3VudCBJRCBlbnZpcm9ubWVudC5cIiksXG4gICAgd29ya3NwYWNlSWQ6IGVudmlyb25tZW50TmFtZShcIkRBVEFCUklDS1NfV09SS1NQQUNFX0lEXCIsIFwiRGF0YWJyaWNrcyB3b3Jrc3BhY2UgSUQgZW52aXJvbm1lbnQuXCIpLFxuICAgIGNvbmZpZ0ZpbGU6IGVudmlyb25tZW50TmFtZShcbiAgICAgIFwiREFUQUJSSUNLU19DT05GSUdfRklMRVwiLFxuICAgICAgXCJEYXRhYnJpY2tzIENMSSBjb25maWcgZmlsZSBlbnZpcm9ubWVudC5cIixcbiAgICApLFxuICAgIGNsaWVudElkOiBlbnZpcm9ubWVudE5hbWUoXCJEQVRBQlJJQ0tTX0NMSUVOVF9JRFwiLCBcIkRhdGFicmlja3MgT0F1dGggY2xpZW50IElEIGVudmlyb25tZW50LlwiKSxcbiAgICBjbGllbnRTZWNyZXQ6IGVudmlyb25tZW50TmFtZShcbiAgICAgIFwiREFUQUJSSUNLU19DTElFTlRfU0VDUkVUXCIsXG4gICAgICBcIkRhdGFicmlja3MgT0F1dGggY2xpZW50IHNlY3JldCBlbnZpcm9ubWVudC5cIixcbiAgICApLFxuICAgIGFjY2Vzc1Rva2VuOiBlbnZpcm9ubWVudE5hbWUoXCJEQVRBQlJJQ0tTX1RPS0VOXCIsIFwiRGF0YWJyaWNrcyBhY2Nlc3MgdG9rZW4gZW52aXJvbm1lbnQuXCIpLFxuICAgIGdyb3VwSWQ6IGVudmlyb25tZW50TmFtZShcIkRBVEFCUklDS1NfR1JPVVBfSURcIiwgXCJEYXRhYnJpY2tzIGdyb3VwIElEIGVudmlyb25tZW50LlwiKSxcbiAgICBhdXRoVHlwZTogZW52aXJvbm1lbnROYW1lKFwiREFUQUJSSUNLU19BVVRIX1RZUEVcIiwgXCJEYXRhYnJpY2tzIGF1dGggdHlwZSBlbnZpcm9ubWVudC5cIiksXG4gICAgYXBwTmFtZTogZW52aXJvbm1lbnROYW1lKFwiREFUQUJSSUNLU19BUFBfTkFNRVwiLCBcIkRhdGFicmlja3MgQXBwIG5hbWUgZW52aXJvbm1lbnQuXCIpLFxuICAgIGFwcFBvcnQ6IGVudmlyb25tZW50TmFtZShcIkRBVEFCUklDS1NfQVBQX1BPUlRcIiwgXCJEYXRhYnJpY2tzIEFwcCBwb3J0IGVudmlyb25tZW50LlwiKSxcbiAgICBsYWtlYmFzZUVuZHBvaW50OiBlbnZpcm9ubWVudE5hbWUoXCJMQUtFQkFTRV9FTkRQT0lOVFwiLCBcIkxha2ViYXNlIGVuZHBvaW50IGVudmlyb25tZW50LlwiKSxcbiAgfSlcbiAgLnN0cmljdCgpXG4gIC5kZXNjcmliZShcIkNhbm9uaWNhbCBEYXRhYnJpY2tzIENMSSwgU0RLLCBBcHBzLCBhbmQgTGFrZWJhc2UgZW52aXJvbm1lbnQgbmFtZXMuXCIpO1xuXG5leHBvcnQgdHlwZSBEYXRhYnJpY2tzRW52aXJvbm1lbnROYW1lcyA9IHoub3V0cHV0PHR5cGVvZiBEYXRhYnJpY2tzRW52aXJvbm1lbnROYW1lc1NjaGVtYT47XG5cbi8qKiBDYW5vbmljYWwgRGF0YWJyaWNrcyBlbnZpcm9ubWVudCBuYW1lcyBkZXJpdmVkIGZyb20gdGhlIG93bmluZyBzY2hlbWEuICovXG5leHBvcnQgY29uc3QgZGF0YWJyaWNrc0Vudmlyb25tZW50TmFtZXMgPSBPYmplY3QuZnJlZXplKERhdGFicmlja3NFbnZpcm9ubWVudE5hbWVzU2NoZW1hLnBhcnNlKHt9KSk7XG5cbi8qKiBIaWdoZXN0IHZhbGlkIFRDUCBwb3J0IG51bWJlci4gKi9cbmV4cG9ydCBjb25zdCBNQVhfVENQX1BPUlQgPSA2NV81MzU7XG5cbmV4cG9ydCBjb25zdCB0Y3BQb3J0U2NoZW1hID0gei5jb2VyY2VcbiAgLm51bWJlcjxudW1iZXI+KClcbiAgLmludCgpXG4gIC5taW4oMSlcbiAgLm1heChNQVhfVENQX1BPUlQpXG4gIC5kZXNjcmliZShcIlRDUCBwb3J0IGZyb20gMSB0aHJvdWdoIDY1NTM1LlwiKTtcblxuZXhwb3J0IGNvbnN0IHRjcFBvcnRPclplcm9TY2hlbWEgPSB6LmNvZXJjZVxuICAubnVtYmVyPG51bWJlcj4oKVxuICAuaW50KClcbiAgLm1pbigwKVxuICAubWF4KE1BWF9UQ1BfUE9SVClcbiAgLmRlc2NyaWJlKFwiVENQIHBvcnQgZnJvbSAwIHRocm91Z2ggNjU1MzUsIHdoZXJlIHplcm8gcmVxdWVzdHMgYXV0b21hdGljIGFsbG9jYXRpb24uXCIpO1xuXG5leHBvcnQgY29uc3Qgbm9ybWFsaXplZFVybFNjaGVtYSA9IHpcbiAgLnN0cmluZygpXG4gIC50cmltKClcbiAgLm1pbigxKVxuICAucmVmaW5lKCh2YWx1ZSkgPT4gdXJsQnVpbGRlcih2YWx1ZSkgIT09IHVuZGVmaW5lZCwge1xuICAgIG1lc3NhZ2U6IFwiRXhwZWN0ZWQgYSB2YWxpZCBVUkwgb3IgaG9zdC5cIixcbiAgfSlcbiAgLm92ZXJ3cml0ZShub3JtYWxpemVVcmwpXG4gIC5kZXNjcmliZShcIlVSTCBub3JtYWxpemVkIHRocm91Z2ggdGhlIHNoYXJlZCBVUkwgYnVpbGRlci5cIik7XG5cbmNvbnN0IGRhdGFicmlja3NUZXh0ID0gKGRlc2NyaXB0aW9uOiBzdHJpbmcpID0+XG4gIHouc3RyaW5nKCkudHJpbSgpLm1pbigxKS5vcHRpb25hbCgpLmRlc2NyaWJlKGRlc2NyaXB0aW9uKTtcblxuZXhwb3J0IGNvbnN0IERhdGFicmlja3NPcHRpb25zU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICBwcm9maWxlOiBkYXRhYnJpY2tzVGV4dChcIkRhdGFicmlja3MgQ0xJIHByb2ZpbGUuXCIpLm1ldGEoe1xuICAgICAgZW52OiBkYXRhYnJpY2tzRW52aXJvbm1lbnROYW1lcy5wcm9maWxlLFxuICAgIH0pLFxuICAgIGhvc3Q6IG5vcm1hbGl6ZWRVcmxTY2hlbWFcbiAgICAgIC5vcHRpb25hbCgpXG4gICAgICAuZGVzY3JpYmUoXCJEYXRhYnJpY2tzIGhvc3QuXCIpXG4gICAgICAubWV0YSh7IGVudjogZGF0YWJyaWNrc0Vudmlyb25tZW50TmFtZXMuaG9zdCwgZmxhZzogZmFsc2UgfSksXG4gICAgYWNjb3VudElkOiBkYXRhYnJpY2tzVGV4dChcIkRhdGFicmlja3MgYWNjb3VudCBJRC5cIikubWV0YSh7XG4gICAgICBlbnY6IGRhdGFicmlja3NFbnZpcm9ubWVudE5hbWVzLmFjY291bnRJZCxcbiAgICAgIGZsYWc6IGZhbHNlLFxuICAgIH0pLFxuICAgIHdvcmtzcGFjZUlkOiBkYXRhYnJpY2tzVGV4dChcIkRhdGFicmlja3Mgd29ya3NwYWNlIElELlwiKS5tZXRhKHtcbiAgICAgIGVudjogZGF0YWJyaWNrc0Vudmlyb25tZW50TmFtZXMud29ya3NwYWNlSWQsXG4gICAgICBmbGFnOiBmYWxzZSxcbiAgICB9KSxcbiAgICBjb25maWdGaWxlOiBkYXRhYnJpY2tzVGV4dChcIkRhdGFicmlja3MgQ0xJIGNvbmZpZyBmaWxlLlwiKS5tZXRhKHtcbiAgICAgIGVudjogZGF0YWJyaWNrc0Vudmlyb25tZW50TmFtZXMuY29uZmlnRmlsZSxcbiAgICAgIGZsYWc6IGZhbHNlLFxuICAgIH0pLFxuICAgIGNsaWVudElkOiBkYXRhYnJpY2tzVGV4dChcIkRhdGFicmlja3MgT0F1dGggY2xpZW50IElELlwiKS5tZXRhKHtcbiAgICAgIGVudjogZGF0YWJyaWNrc0Vudmlyb25tZW50TmFtZXMuY2xpZW50SWQsXG4gICAgICBmbGFnOiBmYWxzZSxcbiAgICB9KSxcbiAgICBjbGllbnRTZWNyZXQ6IGRhdGFicmlja3NUZXh0KFwiRGF0YWJyaWNrcyBPQXV0aCBjbGllbnQgc2VjcmV0LlwiKS5tZXRhKHtcbiAgICAgIGVudjogZGF0YWJyaWNrc0Vudmlyb25tZW50TmFtZXMuY2xpZW50U2VjcmV0LFxuICAgICAgZmxhZzogZmFsc2UsXG4gICAgfSksXG4gICAgYWNjZXNzVG9rZW46IGRhdGFicmlja3NUZXh0KFwiRGF0YWJyaWNrcyBhY2Nlc3MgdG9rZW4uXCIpLm1ldGEoe1xuICAgICAgZW52OiBkYXRhYnJpY2tzRW52aXJvbm1lbnROYW1lcy5hY2Nlc3NUb2tlbixcbiAgICAgIGZsYWc6IGZhbHNlLFxuICAgIH0pLFxuICAgIGdyb3VwSWQ6IGRhdGFicmlja3NUZXh0KFwiRGF0YWJyaWNrcyBncm91cCBJRC5cIikubWV0YSh7XG4gICAgICBlbnY6IGRhdGFicmlja3NFbnZpcm9ubWVudE5hbWVzLmdyb3VwSWQsXG4gICAgICBmbGFnOiBmYWxzZSxcbiAgICB9KSxcbiAgICBhdXRoVHlwZTogZGF0YWJyaWNrc1RleHQoXCJEYXRhYnJpY2tzIGF1dGhlbnRpY2F0aW9uIHR5cGUuXCIpLm1ldGEoe1xuICAgICAgZW52OiBkYXRhYnJpY2tzRW52aXJvbm1lbnROYW1lcy5hdXRoVHlwZSxcbiAgICAgIGZsYWc6IGZhbHNlLFxuICAgIH0pLFxuICAgIGFwcE5hbWU6IGRhdGFicmlja3NUZXh0KFwiRGF0YWJyaWNrcyBBcHAgbmFtZS5cIikubWV0YSh7XG4gICAgICBlbnY6IGRhdGFicmlja3NFbnZpcm9ubWVudE5hbWVzLmFwcE5hbWUsXG4gICAgICBmbGFnOiBmYWxzZSxcbiAgICB9KSxcbiAgICBhcHBQb3J0OiB0Y3BQb3J0U2NoZW1hLm9wdGlvbmFsKCkuZGVzY3JpYmUoXCJEYXRhYnJpY2tzIEFwcCBwb3J0LlwiKS5tZXRhKHtcbiAgICAgIGVudjogZGF0YWJyaWNrc0Vudmlyb25tZW50TmFtZXMuYXBwUG9ydCxcbiAgICAgIGZsYWc6IGZhbHNlLFxuICAgIH0pLFxuICAgIGxha2ViYXNlRW5kcG9pbnQ6IGRhdGFicmlja3NUZXh0KFwiTGFrZWJhc2UgZW5kcG9pbnQuXCIpLm1ldGEoe1xuICAgICAgZW52OiBkYXRhYnJpY2tzRW52aXJvbm1lbnROYW1lcy5sYWtlYmFzZUVuZHBvaW50LFxuICAgICAgZmxhZzogZmFsc2UsXG4gICAgfSksXG4gIH0pXG4gIC5zdHJpY3QoKVxuICAuZGVzY3JpYmUoXCJDb21tb24gRGF0YWJyaWNrcyBDTEksIFNESywgQXBwcywgYW5kIExha2ViYXNlIG9wdGlvbnMuXCIpO1xuXG5leHBvcnQgdHlwZSBEYXRhYnJpY2tzT3B0aW9ucyA9IHouaW5wdXQ8dHlwZW9mIERhdGFicmlja3NPcHRpb25zU2NoZW1hPjtcblxuLyoqIEtleSBmb3JtYXQgZW1pdHRlZCBieSB7QGxpbmsgc2VyaWFsaXplT3B0c30uICovXG5leHBvcnQgdHlwZSBPcHRpb25TZXJpYWxpemF0aW9uRm9ybWF0ID0gXCJmbGFnXCIgfCBcImVudlwiO1xuXG5pbnRlcmZhY2UgT3B0aW9uUHJvcGVydHkge1xuICByZWFkb25seSBrZXk6IHN0cmluZztcbiAgcmVhZG9ubHkgdHlwZT86IHN0cmluZztcbiAgcmVhZG9ubHkgZW52Pzogc3RyaW5nIHwgcmVhZG9ubHkgc3RyaW5nW107XG4gIHJlYWRvbmx5IGZsYWc/OiBib29sZWFuO1xufVxuXG4vKiogU2VyaWFsaXplIGNvbXBsZXRlIHBhcnNlZCBvcHRpb25zIGFzIEpTT04ga2V5ZWQgYnkgZmxhZ3Mgb3IgZW52aXJvbm1lbnQgbmFtZXMuICovXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplT3B0czxUIGV4dGVuZHMgei5ab2RSYXdTaGFwZT4oXG4gIHNjaGVtYTogei5ab2RPYmplY3Q8VD4sXG4gIHZhbHVlczogei5pbnB1dDx6LlpvZE9iamVjdDxUPj4sXG4gIGZvcm1hdDogT3B0aW9uU2VyaWFsaXphdGlvbkZvcm1hdCxcbik6IHN0cmluZyB7XG4gIGNvbnN0IHBhcnNlZCA9IHNjaGVtYS5wYXJzZSh2YWx1ZXMpIGFzIFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PjtcbiAgY29uc3QgZW50cmllcyA9IG9wdGlvblByb3BlcnRpZXMoc2NoZW1hKS5mbGF0TWFwKChwcm9wZXJ0eSkgPT4ge1xuICAgIGlmIChmb3JtYXQgPT09IFwiZmxhZ1wiICYmIHByb3BlcnR5LmZsYWcgPT09IGZhbHNlKSByZXR1cm4gW107XG4gICAgY29uc3Qga2V5ID1cbiAgICAgIGZvcm1hdCA9PT0gXCJmbGFnXCJcbiAgICAgICAgPyBgLS0ke3RvU2x1Zyhwcm9wZXJ0eS5rZXkpfWBcbiAgICAgICAgOiAob3B0aW9uRW52aXJvbm1lbnROYW1lcyhwcm9wZXJ0eS5rZXksIHByb3BlcnR5LmVudilbMF0gPz8gXCJcIik7XG4gICAgaWYgKCFrZXkpIHJldHVybiBbXTtcbiAgICBjb25zdCB2YWx1ZSA9IHBhcnNlZFtwcm9wZXJ0eS5rZXldO1xuICAgIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gW10gOiBbW2tleSwgc2VyaWFsaXplZE9wdGlvblZhbHVlKHZhbHVlKV0gYXMgY29uc3RdO1xuICB9KTtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KE9iamVjdC5mcm9tRW50cmllcyhlbnRyaWVzKSwgbnVsbCwgMik7XG59XG5cbmNvbnN0IG9wdGlvbmFsVGV4dCA9IChkZXNjcmlwdGlvbjogc3RyaW5nLCBlbnY6IHN0cmluZykgPT5cbiAgei5zdHJpbmcoKS50cmltKCkubWluKDEpLm9wdGlvbmFsKCkuZGVzY3JpYmUoZGVzY3JpcHRpb24pLm1ldGEoeyBlbnYsIGZsYWc6IGZhbHNlIH0pO1xuXG5leHBvcnQgY29uc3QgTGFrZWJhc2VPcHRpb25zU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICBsYWtlYmFzZUVuZHBvaW50OiBvcHRpb25hbFRleHQoXG4gICAgICBcIkxha2ViYXNlIHByb2plY3QsIHJlc291cmNlIHBhdGgsIGhvc3QsIG9yIFVSTC5cIixcbiAgICAgIGRhdGFicmlja3NFbnZpcm9ubWVudE5hbWVzLmxha2ViYXNlRW5kcG9pbnQsXG4gICAgKSxcbiAgfSlcbiAgLnN0cmljdCgpXG4gIC5kZXNjcmliZShcIkNvbW1vbiBMYWtlYmFzZSBvcHRpb25zLlwiKTtcblxuZXhwb3J0IHR5cGUgTGFrZWJhc2VPcHRpb25zID0gei5pbnB1dDx0eXBlb2YgTGFrZWJhc2VPcHRpb25zU2NoZW1hPjtcblxuLyoqIEV4cGxpY2l0IG9wdGlvbiB2YWx1ZXMgb3IgZW52aXJvbm1lbnQgZW50cmllcyBjb25zdW1lZCBieSBvcHRpb24gcGFyc2luZyBoZWxwZXJzLiAqL1xuZXhwb3J0IHR5cGUgT3B0aW9uVmFsdWVNYXAgPSBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gfCBudWxsO1xuXG4vKiogUGFyc2Ugb25seSBzdXBwbGllZCBmbGFnIGFuZCBlbnZpcm9ubWVudCB2YWx1ZXMgdGhyb3VnaCBhbiBvd25pbmcgWm9kIG9iamVjdCBzY2hlbWEuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VPcHRzPFQgZXh0ZW5kcyB6LlpvZFJhd1NoYXBlPihcbiAgc2NoZW1hOiB6LlpvZE9iamVjdDxUPixcbiAgZmxhZ3M6IE9wdGlvblZhbHVlTWFwID0gbnVsbCxcbiAgZW52aXJvbm1lbnQ6IE9wdGlvblZhbHVlTWFwID0gbnVsbCxcbik6IFBhcnRpYWw8ei5vdXRwdXQ8ei5ab2RPYmplY3Q8VD4+PiB7XG4gIGNvbnN0IGNvbmZpZ3VyZWQgPSBvcHRpb25WYWx1ZXMoc2NoZW1hLCBmbGFncywgZW52aXJvbm1lbnQpO1xuICBjb25zdCBwYXJzZWQgPSBzY2hlbWEucGFyc2UoY29uZmlndXJlZCk7XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmtleXMoY29uZmlndXJlZCkubWFwKChrZXkpID0+IFtrZXksIHBhcnNlZFtrZXkgYXMga2V5b2YgdHlwZW9mIHBhcnNlZF1dKSxcbiAgKSBhcyBQYXJ0aWFsPHoub3V0cHV0PHouWm9kT2JqZWN0PFQ+Pj47XG59XG5cbi8qKiBIb3N0IGFuZCBUQ1AgcG9ydCByZXR1cm5lZCBieSB7QGxpbmsgbGlzdGVuQWRkcmVzc1NjaGVtYX0uICovXG5leHBvcnQgaW50ZXJmYWNlIExpc3RlbkFkZHJlc3Mge1xuICByZWFkb25seSBob3N0OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBvcnQ6IG51bWJlcjtcbn1cblxuLyoqIERlZmF1bHRzIGFuZCB2YWxpZGF0aW9uIHBvbGljeSBmb3Ige0BsaW5rIGxpc3RlbkFkZHJlc3NTY2hlbWF9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaXN0ZW5BZGRyZXNzT3B0aW9ucyB7XG4gIHJlYWRvbmx5IHBvcnQ6IG51bWJlcjtcbiAgcmVhZG9ubHkgaG9zdD86IHN0cmluZztcbiAgcmVhZG9ubHkgbG9vcGJhY2s/OiBib29sZWFuO1xufVxuXG4vKiogQnVpbGQgYSBsaXN0ZW5lciBhZGRyZXNzIHNjaGVtYSBhY2NlcHRpbmcgYSBwb3J0LCBgOnBvcnRgLCBgaG9zdDpwb3J0YCwgb3Igb2JqZWN0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpc3RlbkFkZHJlc3NTY2hlbWEob3B0aW9uczogTGlzdGVuQWRkcmVzc09wdGlvbnMpIHtcbiAgY29uc3QgZGVmYXVsdHM6IExpc3RlbkFkZHJlc3MgPSB7XG4gICAgaG9zdDogb3B0aW9ucy5ob3N0ID8/IFwibG9jYWxob3N0XCIsXG4gICAgcG9ydDogb3B0aW9ucy5wb3J0LFxuICB9O1xuICByZXR1cm4gelxuICAgIC5wcmVwcm9jZXNzKFxuICAgICAgKHZhbHVlKSA9PiBwYXJzZUxpc3RlbkFkZHJlc3ModmFsdWUsIGRlZmF1bHRzKSxcbiAgICAgIHpcbiAgICAgICAgLm9iamVjdCh7XG4gICAgICAgICAgaG9zdDogei5zdHJpbmcoKS50cmltKCkudG9Mb3dlckNhc2UoKS5taW4oMSkuZGVmYXVsdChkZWZhdWx0cy5ob3N0KSxcbiAgICAgICAgICBwb3J0OiB0Y3BQb3J0T3JaZXJvU2NoZW1hLmRlZmF1bHQoZGVmYXVsdHMucG9ydCksXG4gICAgICAgIH0pXG4gICAgICAgIC5zdHJpY3QoKVxuICAgICAgICAucmVmaW5lKFxuICAgICAgICAgIChhZGRyZXNzKSA9PiAhb3B0aW9ucy5sb29wYmFjayB8fCBpc0xvb3BiYWNrSG9zdChhZGRyZXNzLmhvc3QpLFxuICAgICAgICAgIFwiTGlzdGVuZXIgaG9zdCBtdXN0IGJlIGxvb3BiYWNrLlwiLFxuICAgICAgICApLFxuICAgIClcbiAgICAuZGVmYXVsdChkZWZhdWx0cylcbiAgICAuZGVzY3JpYmUoXCJMaXN0ZW5lciBob3N0IGFuZCBwb3J0LlwiKTtcbn1cblxuLyoqIFJlbmRlciBhIGxpc3RlbmVyIGFkZHJlc3MgYXMgYGhvc3Q6cG9ydGAsIHdpdGggSVB2NiBob3N0cyBicmFja2V0ZWQuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0TGlzdGVuQWRkcmVzcyhhZGRyZXNzOiBMaXN0ZW5BZGRyZXNzKTogc3RyaW5nIHtcbiAgY29uc3QgaG9zdCA9IGFkZHJlc3MuaG9zdC5pbmNsdWRlcyhcIjpcIikgPyBgWyR7YWRkcmVzcy5ob3N0fV1gIDogYWRkcmVzcy5ob3N0O1xuICByZXR1cm4gYCR7aG9zdH06JHthZGRyZXNzLnBvcnR9YDtcbn1cblxuZnVuY3Rpb24gcGFyc2VMaXN0ZW5BZGRyZXNzKHZhbHVlOiB1bmtub3duLCBkZWZhdWx0czogTGlzdGVuQWRkcmVzcyk6IHVua25vd24ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSByZXR1cm4geyBob3N0OiBkZWZhdWx0cy5ob3N0LCBwb3J0OiB2YWx1ZSB9O1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiKSByZXR1cm4gdmFsdWU7XG4gIGNvbnN0IHRleHQgPSB2YWx1ZS50cmltKCk7XG4gIGlmICgvXlxcZCskLy50ZXN0KHRleHQpKSByZXR1cm4geyBob3N0OiBkZWZhdWx0cy5ob3N0LCBwb3J0OiB0ZXh0IH07XG4gIGlmICgvXjpcXGQrJC8udGVzdCh0ZXh0KSkgcmV0dXJuIHsgaG9zdDogZGVmYXVsdHMuaG9zdCwgcG9ydDogdGV4dC5zbGljZSgxKSB9O1xuICBjb25zdCBicmFja2V0ZWQgPSB0ZXh0Lm1hdGNoKC9eXFxbKFteXFxdXSspXFxdKD86OihcXGQrKSk/JC8pO1xuICBpZiAoYnJhY2tldGVkKSB7XG4gICAgcmV0dXJuIHsgaG9zdDogYnJhY2tldGVkWzFdLCBwb3J0OiBicmFja2V0ZWRbMl0gPz8gZGVmYXVsdHMucG9ydCB9O1xuICB9XG4gIGNvbnN0IHNlcGFyYXRvciA9IHRleHQubGFzdEluZGV4T2YoXCI6XCIpO1xuICBpZiAoc2VwYXJhdG9yID4gMCAmJiAhdGV4dC5zbGljZSgwLCBzZXBhcmF0b3IpLmluY2x1ZGVzKFwiOlwiKSkge1xuICAgIHJldHVybiB7XG4gICAgICBob3N0OiB0ZXh0LnNsaWNlKDAsIHNlcGFyYXRvciksXG4gICAgICBwb3J0OiB0ZXh0LnNsaWNlKHNlcGFyYXRvciArIDEpLFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHsgaG9zdDogdGV4dCB8fCBkZWZhdWx0cy5ob3N0LCBwb3J0OiBkZWZhdWx0cy5wb3J0IH07XG59XG5cbmZ1bmN0aW9uIG9wdGlvblByb3BlcnRpZXMoc2NoZW1hOiB6LlpvZE9iamVjdDx6LlpvZFJhd1NoYXBlPik6IE9wdGlvblByb3BlcnR5W10ge1xuICBjb25zdCBkb2N1bWVudCA9IHoudG9KU09OU2NoZW1hKHNjaGVtYSk7XG4gIGlmICghaXNSZWNvcmQoZG9jdW1lbnQucHJvcGVydGllcykpIHJldHVybiBbXTtcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGRvY3VtZW50LnByb3BlcnRpZXMpLmZsYXRNYXAoKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgIGlmICghaXNSZWNvcmQodmFsdWUpKSByZXR1cm4gW107XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAga2V5LFxuICAgICAgICB0eXBlOiB0eXBlb2YgdmFsdWUudHlwZSA9PT0gXCJzdHJpbmdcIiA/IHZhbHVlLnR5cGUgOiB1bmRlZmluZWQsXG4gICAgICAgIGVudjpcbiAgICAgICAgICB0eXBlb2YgdmFsdWUuZW52ID09PSBcInN0cmluZ1wiIHx8IEFycmF5LmlzQXJyYXkodmFsdWUuZW52KVxuICAgICAgICAgICAgPyAodmFsdWUuZW52IGFzIHN0cmluZyB8IHJlYWRvbmx5IHN0cmluZ1tdKVxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIGZsYWc6IHR5cGVvZiB2YWx1ZS5mbGFnID09PSBcImJvb2xlYW5cIiA/IHZhbHVlLmZsYWcgOiB1bmRlZmluZWQsXG4gICAgICB9LFxuICAgIF07XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBzZXJpYWxpemVkT3B0aW9uVmFsdWUodmFsdWU6IHVua25vd24pOiB1bmtub3duIHtcbiAgaWYgKGlzUmVjb3JkKHZhbHVlKSAmJiB0eXBlb2YgdmFsdWUuaG9zdCA9PT0gXCJzdHJpbmdcIiAmJiB0eXBlb2YgdmFsdWUucG9ydCA9PT0gXCJudW1iZXJcIikge1xuICAgIHJldHVybiBmb3JtYXRMaXN0ZW5BZGRyZXNzKHsgaG9zdDogdmFsdWUuaG9zdCwgcG9ydDogdmFsdWUucG9ydCB9KTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIG9wdGlvblZhbHVlczxUIGV4dGVuZHMgei5ab2RSYXdTaGFwZT4oXG4gIHNjaGVtYTogei5ab2RPYmplY3Q8VD4sXG4gIHZhbHVlczogT3B0aW9uVmFsdWVNYXAsXG4gIGVudmlyb25tZW50OiBPcHRpb25WYWx1ZU1hcCxcbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgY29uc3QgZG9jdW1lbnQgPSB6LnRvSlNPTlNjaGVtYShzY2hlbWEpO1xuICBjb25zdCBwcm9wZXJ0aWVzID0gaXNSZWNvcmQoZG9jdW1lbnQucHJvcGVydGllcykgPyBkb2N1bWVudC5wcm9wZXJ0aWVzIDoge307XG4gIGNvbnN0IGNvbmZpZ3VyZWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gIGZvciAoY29uc3QgW2tleSwgcHJvcGVydHldIG9mIE9iamVjdC5lbnRyaWVzKHByb3BlcnRpZXMpKSB7XG4gICAgaWYgKCFpc1JlY29yZChwcm9wZXJ0eSkpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGV4cGxpY2l0ID0gZmlyc3RPcHRpb25WYWx1ZSh2YWx1ZXMsIFtrZXksIGAtLSR7dG9TbHVnKGtleSl9YF0pO1xuICAgIGlmIChleHBsaWNpdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25maWd1cmVkW2tleV0gPSBvcHRpb25FbnZpcm9ubWVudFZhbHVlKHByb3BlcnR5LnR5cGUsIGV4cGxpY2l0KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBuYW1lcyA9IG9wdGlvbkVudmlyb25tZW50TmFtZXMoa2V5LCBwcm9wZXJ0eS5lbnYpO1xuICAgIGNvbnN0IHNvdXJjZWQgPSBmaXJzdE9wdGlvblZhbHVlKGVudmlyb25tZW50LCBuYW1lcyk7XG4gICAgaWYgKHNvdXJjZWQgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgY29uZmlndXJlZFtrZXldID0gb3B0aW9uRW52aXJvbm1lbnRWYWx1ZShwcm9wZXJ0eS50eXBlLCBzb3VyY2VkKTtcbiAgfVxuICByZXR1cm4gY29uZmlndXJlZDtcbn1cblxuZnVuY3Rpb24gb3B0aW9uRW52aXJvbm1lbnROYW1lcyhrZXk6IHN0cmluZywgY29uZmlndXJlZDogdW5rbm93bik6IHN0cmluZ1tdIHtcbiAgaWYgKHR5cGVvZiBjb25maWd1cmVkID09PSBcInN0cmluZ1wiKSByZXR1cm4gW2NvbmZpZ3VyZWRdO1xuICBpZiAoQXJyYXkuaXNBcnJheShjb25maWd1cmVkKSkge1xuICAgIHJldHVybiBjb25maWd1cmVkLmZpbHRlcigodmFsdWUpOiB2YWx1ZSBpcyBzdHJpbmcgPT4gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKTtcbiAgfVxuICByZXR1cm4gW3RvSWRlbnRpZmllcldpdGhPcHRpb25zKHsgZGVsaW1pdGVyOiBcIl9cIiB9LCBrZXkpLnRvVXBwZXJDYXNlKCldO1xufVxuXG5mdW5jdGlvbiBvcHRpb25FbnZpcm9ubWVudFZhbHVlKHR5cGU6IHVua25vd24sIHZhbHVlOiB1bmtub3duKTogdW5rbm93biB7XG4gIGlmICh0eXBlID09PSBcImJvb2xlYW5cIikgcmV0dXJuIHRvQm9vbGVhbih2YWx1ZSkgPz8gdmFsdWU7XG4gIGlmICh0eXBlID09PSBcImFycmF5XCIgJiYgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSByZXR1cm4gcGFyc2VMaXN0KHZhbHVlKTtcbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5mdW5jdGlvbiBmaXJzdE9wdGlvblZhbHVlKHNvdXJjZTogT3B0aW9uVmFsdWVNYXAsIGtleXM6IHJlYWRvbmx5IHN0cmluZ1tdKTogdW5rbm93biB8IHVuZGVmaW5lZCB7XG4gIGlmICghc291cmNlKSByZXR1cm4gdW5kZWZpbmVkO1xuICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgY29uc3QgdmFsdWUgPSBzb3VyY2Vba2V5XTtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gXCJcIikgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVVybCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgdXJsID0gdXJsQnVpbGRlcih2YWx1ZSk7XG4gIGlmICghdXJsKSByZXR1cm4gdmFsdWU7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSB1cmwudG9TdHJpbmcoKTtcbiAgcmV0dXJuIHVybC5wYXRobmFtZSA9PT0gXCIvXCIgJiYgIXVybC5zZWFyY2ggJiYgIXVybC5oYXNoID8gbm9ybWFsaXplZC5zbGljZSgwLCAtMSkgOiBub3JtYWxpemVkO1xufVxuIl19
@@ -1 +1 @@
1
- {"root":["../src/async-utils.ts","../src/brand-utils.ts","../src/environment-utils.ts","../src/error-utils.ts","../src/execution.ts","../src/function-utils.ts","../src/hash.ts","../src/http.ts","../src/json.ts","../src/log.ts","../src/net.ts","../src/object.ts","../src/pattern.ts","../src/predicate.ts","../src/string-utils.ts","../src/token.ts","../index.ts"],"version":"5.9.3"}
1
+ {"root":["../src/async-utils.ts","../src/brand-utils.ts","../src/environment-utils.ts","../src/error-utils.ts","../src/execution.ts","../src/function-utils.ts","../src/hash.ts","../src/http.ts","../src/json.ts","../src/log.ts","../src/net.ts","../src/object.ts","../src/options.ts","../src/pattern.ts","../src/predicate.ts","../src/string-utils.ts","../src/token.ts","../index.ts"],"version":"5.9.3"}
package/package.json CHANGED
@@ -19,7 +19,7 @@
19
19
  "projen": "projen"
20
20
  },
21
21
  "devDependencies": {
22
- "@dbx-tools/test-polyglot": "^0.9.40",
22
+ "@dbx-tools/test-polyglot": "^0.9.43",
23
23
  "typescript": "^5.9.3"
24
24
  },
25
25
  "dependencies": {
@@ -84,6 +84,10 @@
84
84
  "types": "./lib/src/object.d.ts",
85
85
  "default": "./lib/src/object.js"
86
86
  },
87
+ "./options": {
88
+ "types": "./lib/src/options.d.ts",
89
+ "default": "./lib/src/options.js"
90
+ },
87
91
  "./pattern": {
88
92
  "types": "./lib/src/pattern.d.ts",
89
93
  "default": "./lib/src/pattern.js"
@@ -103,7 +107,7 @@
103
107
  "./package.json": "./package.json"
104
108
  }
105
109
  },
106
- "version": "0.9.40",
110
+ "version": "0.9.43",
107
111
  "types": "./lib/index.d.ts",
108
112
  "dbxToolsConfig": {
109
113
  "tags": [
@@ -164,6 +168,10 @@
164
168
  "types": "./lib/src/object.d.ts",
165
169
  "default": "./lib/src/object.js"
166
170
  },
171
+ "./options": {
172
+ "types": "./lib/src/options.d.ts",
173
+ "default": "./lib/src/options.js"
174
+ },
167
175
  "./pattern": {
168
176
  "types": "./lib/src/pattern.d.ts",
169
177
  "default": "./lib/src/pattern.js"
@@ -1,13 +1,14 @@
1
1
  import { toBoolean } from "./object.ts";
2
-
3
- const MAX_TCP_PORT = 65_535;
2
+ import { MAX_TCP_PORT } from "./options.ts";
4
3
 
5
4
  function runtimeEnvironment(): Record<string, string | undefined> {
6
5
  return (
7
- globalThis as typeof globalThis & {
8
- process?: { env?: Record<string, string | undefined> };
9
- }
10
- ).process?.env ?? {};
6
+ (
7
+ globalThis as typeof globalThis & {
8
+ process?: { env?: Record<string, string | undefined> };
9
+ }
10
+ ).process?.env ?? {}
11
+ );
11
12
  }
12
13
 
13
14
  /** Detect a Databricks App runtime from its required name, host, and port. */
package/src/options.ts ADDED
@@ -0,0 +1,335 @@
1
+ /**
2
+ * Browser-safe option primitives shared across dbx-tools packages.
3
+ *
4
+ * @module
5
+ */
6
+
7
+ import { z } from "zod";
8
+ import { isLoopbackHost, urlBuilder } from "./net.ts";
9
+ import { isRecord, toBoolean } from "./object.ts";
10
+ import { parseList, toIdentifierWithOptions, toSlug } from "./string-utils.ts";
11
+
12
+ const environmentName = <T extends string>(name: T, description: string) =>
13
+ z.literal(name).default(name).describe(description);
14
+
15
+ export const DatabricksEnvironmentNamesSchema = z
16
+ .object({
17
+ profile: environmentName("DATABRICKS_CONFIG_PROFILE", "Databricks CLI profile environment."),
18
+ host: environmentName("DATABRICKS_HOST", "Databricks host environment."),
19
+ accountId: environmentName("DATABRICKS_ACCOUNT_ID", "Databricks account ID environment."),
20
+ workspaceId: environmentName("DATABRICKS_WORKSPACE_ID", "Databricks workspace ID environment."),
21
+ configFile: environmentName(
22
+ "DATABRICKS_CONFIG_FILE",
23
+ "Databricks CLI config file environment.",
24
+ ),
25
+ clientId: environmentName("DATABRICKS_CLIENT_ID", "Databricks OAuth client ID environment."),
26
+ clientSecret: environmentName(
27
+ "DATABRICKS_CLIENT_SECRET",
28
+ "Databricks OAuth client secret environment.",
29
+ ),
30
+ accessToken: environmentName("DATABRICKS_TOKEN", "Databricks access token environment."),
31
+ groupId: environmentName("DATABRICKS_GROUP_ID", "Databricks group ID environment."),
32
+ authType: environmentName("DATABRICKS_AUTH_TYPE", "Databricks auth type environment."),
33
+ appName: environmentName("DATABRICKS_APP_NAME", "Databricks App name environment."),
34
+ appPort: environmentName("DATABRICKS_APP_PORT", "Databricks App port environment."),
35
+ lakebaseEndpoint: environmentName("LAKEBASE_ENDPOINT", "Lakebase endpoint environment."),
36
+ })
37
+ .strict()
38
+ .describe("Canonical Databricks CLI, SDK, Apps, and Lakebase environment names.");
39
+
40
+ export type DatabricksEnvironmentNames = z.output<typeof DatabricksEnvironmentNamesSchema>;
41
+
42
+ /** Canonical Databricks environment names derived from the owning schema. */
43
+ export const databricksEnvironmentNames = Object.freeze(DatabricksEnvironmentNamesSchema.parse({}));
44
+
45
+ /** Highest valid TCP port number. */
46
+ export const MAX_TCP_PORT = 65_535;
47
+
48
+ export const tcpPortSchema = z.coerce
49
+ .number<number>()
50
+ .int()
51
+ .min(1)
52
+ .max(MAX_TCP_PORT)
53
+ .describe("TCP port from 1 through 65535.");
54
+
55
+ export const tcpPortOrZeroSchema = z.coerce
56
+ .number<number>()
57
+ .int()
58
+ .min(0)
59
+ .max(MAX_TCP_PORT)
60
+ .describe("TCP port from 0 through 65535, where zero requests automatic allocation.");
61
+
62
+ export const normalizedUrlSchema = z
63
+ .string()
64
+ .trim()
65
+ .min(1)
66
+ .refine((value) => urlBuilder(value) !== undefined, {
67
+ message: "Expected a valid URL or host.",
68
+ })
69
+ .overwrite(normalizeUrl)
70
+ .describe("URL normalized through the shared URL builder.");
71
+
72
+ const databricksText = (description: string) =>
73
+ z.string().trim().min(1).optional().describe(description);
74
+
75
+ export const DatabricksOptionsSchema = z
76
+ .object({
77
+ profile: databricksText("Databricks CLI profile.").meta({
78
+ env: databricksEnvironmentNames.profile,
79
+ }),
80
+ host: normalizedUrlSchema
81
+ .optional()
82
+ .describe("Databricks host.")
83
+ .meta({ env: databricksEnvironmentNames.host, flag: false }),
84
+ accountId: databricksText("Databricks account ID.").meta({
85
+ env: databricksEnvironmentNames.accountId,
86
+ flag: false,
87
+ }),
88
+ workspaceId: databricksText("Databricks workspace ID.").meta({
89
+ env: databricksEnvironmentNames.workspaceId,
90
+ flag: false,
91
+ }),
92
+ configFile: databricksText("Databricks CLI config file.").meta({
93
+ env: databricksEnvironmentNames.configFile,
94
+ flag: false,
95
+ }),
96
+ clientId: databricksText("Databricks OAuth client ID.").meta({
97
+ env: databricksEnvironmentNames.clientId,
98
+ flag: false,
99
+ }),
100
+ clientSecret: databricksText("Databricks OAuth client secret.").meta({
101
+ env: databricksEnvironmentNames.clientSecret,
102
+ flag: false,
103
+ }),
104
+ accessToken: databricksText("Databricks access token.").meta({
105
+ env: databricksEnvironmentNames.accessToken,
106
+ flag: false,
107
+ }),
108
+ groupId: databricksText("Databricks group ID.").meta({
109
+ env: databricksEnvironmentNames.groupId,
110
+ flag: false,
111
+ }),
112
+ authType: databricksText("Databricks authentication type.").meta({
113
+ env: databricksEnvironmentNames.authType,
114
+ flag: false,
115
+ }),
116
+ appName: databricksText("Databricks App name.").meta({
117
+ env: databricksEnvironmentNames.appName,
118
+ flag: false,
119
+ }),
120
+ appPort: tcpPortSchema.optional().describe("Databricks App port.").meta({
121
+ env: databricksEnvironmentNames.appPort,
122
+ flag: false,
123
+ }),
124
+ lakebaseEndpoint: databricksText("Lakebase endpoint.").meta({
125
+ env: databricksEnvironmentNames.lakebaseEndpoint,
126
+ flag: false,
127
+ }),
128
+ })
129
+ .strict()
130
+ .describe("Common Databricks CLI, SDK, Apps, and Lakebase options.");
131
+
132
+ export type DatabricksOptions = z.input<typeof DatabricksOptionsSchema>;
133
+
134
+ /** Key format emitted by {@link serializeOpts}. */
135
+ export type OptionSerializationFormat = "flag" | "env";
136
+
137
+ interface OptionProperty {
138
+ readonly key: string;
139
+ readonly type?: string;
140
+ readonly env?: string | readonly string[];
141
+ readonly flag?: boolean;
142
+ }
143
+
144
+ /** Serialize complete parsed options as JSON keyed by flags or environment names. */
145
+ export function serializeOpts<T extends z.ZodRawShape>(
146
+ schema: z.ZodObject<T>,
147
+ values: z.input<z.ZodObject<T>>,
148
+ format: OptionSerializationFormat,
149
+ ): string {
150
+ const parsed = schema.parse(values) as Readonly<Record<string, unknown>>;
151
+ const entries = optionProperties(schema).flatMap((property) => {
152
+ if (format === "flag" && property.flag === false) return [];
153
+ const key =
154
+ format === "flag"
155
+ ? `--${toSlug(property.key)}`
156
+ : (optionEnvironmentNames(property.key, property.env)[0] ?? "");
157
+ if (!key) return [];
158
+ const value = parsed[property.key];
159
+ return value === undefined ? [] : [[key, serializedOptionValue(value)] as const];
160
+ });
161
+ return JSON.stringify(Object.fromEntries(entries), null, 2);
162
+ }
163
+
164
+ const optionalText = (description: string, env: string) =>
165
+ z.string().trim().min(1).optional().describe(description).meta({ env, flag: false });
166
+
167
+ export const LakebaseOptionsSchema = z
168
+ .object({
169
+ lakebaseEndpoint: optionalText(
170
+ "Lakebase project, resource path, host, or URL.",
171
+ databricksEnvironmentNames.lakebaseEndpoint,
172
+ ),
173
+ })
174
+ .strict()
175
+ .describe("Common Lakebase options.");
176
+
177
+ export type LakebaseOptions = z.input<typeof LakebaseOptionsSchema>;
178
+
179
+ /** Explicit option values or environment entries consumed by option parsing helpers. */
180
+ export type OptionValueMap = Readonly<Record<string, unknown>> | null;
181
+
182
+ /** Parse only supplied flag and environment values through an owning Zod object schema. */
183
+ export function parseOpts<T extends z.ZodRawShape>(
184
+ schema: z.ZodObject<T>,
185
+ flags: OptionValueMap = null,
186
+ environment: OptionValueMap = null,
187
+ ): Partial<z.output<z.ZodObject<T>>> {
188
+ const configured = optionValues(schema, flags, environment);
189
+ const parsed = schema.parse(configured);
190
+ return Object.fromEntries(
191
+ Object.keys(configured).map((key) => [key, parsed[key as keyof typeof parsed]]),
192
+ ) as Partial<z.output<z.ZodObject<T>>>;
193
+ }
194
+
195
+ /** Host and TCP port returned by {@link listenAddressSchema}. */
196
+ export interface ListenAddress {
197
+ readonly host: string;
198
+ readonly port: number;
199
+ }
200
+
201
+ /** Defaults and validation policy for {@link listenAddressSchema}. */
202
+ export interface ListenAddressOptions {
203
+ readonly port: number;
204
+ readonly host?: string;
205
+ readonly loopback?: boolean;
206
+ }
207
+
208
+ /** Build a listener address schema accepting a port, `:port`, `host:port`, or object. */
209
+ export function listenAddressSchema(options: ListenAddressOptions) {
210
+ const defaults: ListenAddress = {
211
+ host: options.host ?? "localhost",
212
+ port: options.port,
213
+ };
214
+ return z
215
+ .preprocess(
216
+ (value) => parseListenAddress(value, defaults),
217
+ z
218
+ .object({
219
+ host: z.string().trim().toLowerCase().min(1).default(defaults.host),
220
+ port: tcpPortOrZeroSchema.default(defaults.port),
221
+ })
222
+ .strict()
223
+ .refine(
224
+ (address) => !options.loopback || isLoopbackHost(address.host),
225
+ "Listener host must be loopback.",
226
+ ),
227
+ )
228
+ .default(defaults)
229
+ .describe("Listener host and port.");
230
+ }
231
+
232
+ /** Render a listener address as `host:port`, with IPv6 hosts bracketed. */
233
+ export function formatListenAddress(address: ListenAddress): string {
234
+ const host = address.host.includes(":") ? `[${address.host}]` : address.host;
235
+ return `${host}:${address.port}`;
236
+ }
237
+
238
+ function parseListenAddress(value: unknown, defaults: ListenAddress): unknown {
239
+ if (typeof value === "number") return { host: defaults.host, port: value };
240
+ if (typeof value !== "string") return value;
241
+ const text = value.trim();
242
+ if (/^\d+$/.test(text)) return { host: defaults.host, port: text };
243
+ if (/^:\d+$/.test(text)) return { host: defaults.host, port: text.slice(1) };
244
+ const bracketed = text.match(/^\[([^\]]+)\](?::(\d+))?$/);
245
+ if (bracketed) {
246
+ return { host: bracketed[1], port: bracketed[2] ?? defaults.port };
247
+ }
248
+ const separator = text.lastIndexOf(":");
249
+ if (separator > 0 && !text.slice(0, separator).includes(":")) {
250
+ return {
251
+ host: text.slice(0, separator),
252
+ port: text.slice(separator + 1),
253
+ };
254
+ }
255
+ return { host: text || defaults.host, port: defaults.port };
256
+ }
257
+
258
+ function optionProperties(schema: z.ZodObject<z.ZodRawShape>): OptionProperty[] {
259
+ const document = z.toJSONSchema(schema);
260
+ if (!isRecord(document.properties)) return [];
261
+ return Object.entries(document.properties).flatMap(([key, value]) => {
262
+ if (!isRecord(value)) return [];
263
+ return [
264
+ {
265
+ key,
266
+ type: typeof value.type === "string" ? value.type : undefined,
267
+ env:
268
+ typeof value.env === "string" || Array.isArray(value.env)
269
+ ? (value.env as string | readonly string[])
270
+ : undefined,
271
+ flag: typeof value.flag === "boolean" ? value.flag : undefined,
272
+ },
273
+ ];
274
+ });
275
+ }
276
+
277
+ function serializedOptionValue(value: unknown): unknown {
278
+ if (isRecord(value) && typeof value.host === "string" && typeof value.port === "number") {
279
+ return formatListenAddress({ host: value.host, port: value.port });
280
+ }
281
+ return value;
282
+ }
283
+
284
+ function optionValues<T extends z.ZodRawShape>(
285
+ schema: z.ZodObject<T>,
286
+ values: OptionValueMap,
287
+ environment: OptionValueMap,
288
+ ): Record<string, unknown> {
289
+ const document = z.toJSONSchema(schema);
290
+ const properties = isRecord(document.properties) ? document.properties : {};
291
+ const configured: Record<string, unknown> = {};
292
+ for (const [key, property] of Object.entries(properties)) {
293
+ if (!isRecord(property)) continue;
294
+ const explicit = firstOptionValue(values, [key, `--${toSlug(key)}`]);
295
+ if (explicit !== undefined) {
296
+ configured[key] = optionEnvironmentValue(property.type, explicit);
297
+ continue;
298
+ }
299
+ const names = optionEnvironmentNames(key, property.env);
300
+ const sourced = firstOptionValue(environment, names);
301
+ if (sourced === undefined) continue;
302
+ configured[key] = optionEnvironmentValue(property.type, sourced);
303
+ }
304
+ return configured;
305
+ }
306
+
307
+ function optionEnvironmentNames(key: string, configured: unknown): string[] {
308
+ if (typeof configured === "string") return [configured];
309
+ if (Array.isArray(configured)) {
310
+ return configured.filter((value): value is string => typeof value === "string");
311
+ }
312
+ return [toIdentifierWithOptions({ delimiter: "_" }, key).toUpperCase()];
313
+ }
314
+
315
+ function optionEnvironmentValue(type: unknown, value: unknown): unknown {
316
+ if (type === "boolean") return toBoolean(value) ?? value;
317
+ if (type === "array" && typeof value === "string") return parseList(value);
318
+ return value;
319
+ }
320
+
321
+ function firstOptionValue(source: OptionValueMap, keys: readonly string[]): unknown | undefined {
322
+ if (!source) return undefined;
323
+ for (const key of keys) {
324
+ const value = source[key];
325
+ if (value !== undefined && value !== null && value !== "") return value;
326
+ }
327
+ return undefined;
328
+ }
329
+
330
+ function normalizeUrl(value: string): string {
331
+ const url = urlBuilder(value);
332
+ if (!url) return value;
333
+ const normalized = url.toString();
334
+ return url.pathname === "/" && !url.search && !url.hash ? normalized.slice(0, -1) : normalized;
335
+ }