@dbx-tools/cli-args 0.9.105 → 0.9.108
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/index.ts +2 -2
- package/lib/index.d.ts +2 -2
- package/lib/index.js +2 -2
- package/lib/src/args.d.ts +10 -4
- package/lib/src/args.js +51 -9
- package/package.json +3 -3
- package/src/args.ts +65 -16
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/cli-args";
|
|
6
|
-
export const PACKAGE_VERSION = "0.9.
|
|
6
|
+
export const PACKAGE_VERSION = "0.9.108";
|
|
7
7
|
export * as args from "./src/args.ts";
|
|
8
|
-
export type { CliArgsOptions, CliArgMeta, ArgumentSource } from "./src/args.ts";
|
|
8
|
+
export type { CliArgsOptions, CliArgMeta, CliObjectSchema, ArgumentSource } from "./src/args.ts";
|
|
9
9
|
export * from "./exports.ts";
|
package/lib/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export declare const PACKAGE_IDENTIFIER = "@dbx-tools/cli-args";
|
|
2
|
-
export declare const PACKAGE_VERSION = "0.9.
|
|
2
|
+
export declare const PACKAGE_VERSION = "0.9.108";
|
|
3
3
|
export * as args from "./src/args.ts";
|
|
4
|
-
export type { CliArgsOptions, CliArgMeta, ArgumentSource } from "./src/args.ts";
|
|
4
|
+
export type { CliArgsOptions, CliArgMeta, CliObjectSchema, ArgumentSource } from "./src/args.ts";
|
|
5
5
|
export * from "./exports.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/cli-args";
|
|
5
|
-
export const PACKAGE_VERSION = "0.9.
|
|
5
|
+
export const PACKAGE_VERSION = "0.9.108";
|
|
6
6
|
export * as args from "./src/args.js";
|
|
7
7
|
export * from "./exports.js";
|
|
8
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxxQkFBcUIsQ0FBQztBQUN4RCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxJQUFJLE1BQU0sZUFBZSxDQUFDO0FBRXRDLGNBQWMsY0FBYyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gR0VORVJBVEVEIGJ5IHByb2plbiB3YXRjaCAtIERPIE5PVCBFRElULlxuLy8gUmVnZW5lcmF0ZWQgZnJvbSB0aGUgZXhwb3J0aW5nIG1vZHVsZXMgaW4gLi9zcmMuXG4vLyBIYW5kIGVkaXRzIGFyZSBvdmVyd3JpdHRlbiBvbiB0aGUgbmV4dCB3YXRjaDsgdGhpcyBmaWxlIGlzIHJlYWQtb25seS5cblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfSURFTlRJRklFUiA9IFwiQGRieC10b29scy9jbGktYXJnc1wiO1xuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfVkVSU0lPTiA9IFwiMC45LjEwOFwiO1xuZXhwb3J0ICogYXMgYXJncyBmcm9tIFwiLi9zcmMvYXJncy50c1wiO1xuZXhwb3J0IHR5cGUgeyBDbGlBcmdzT3B0aW9ucywgQ2xpQXJnTWV0YSwgQ2xpT2JqZWN0U2NoZW1hLCBBcmd1bWVudFNvdXJjZSB9IGZyb20gXCIuL3NyYy9hcmdzLnRzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9leHBvcnRzLnRzXCI7XG4iXX0=
|
package/lib/src/args.d.ts
CHANGED
|
@@ -9,7 +9,6 @@
|
|
|
9
9
|
*/
|
|
10
10
|
import { configUtils } from "@dbx-tools/core";
|
|
11
11
|
import { Command } from "commander";
|
|
12
|
-
import { z } from "zod";
|
|
13
12
|
/** Layered config lookup used to resolve argument values and help defaults. */
|
|
14
13
|
export type CliArgsOptions = configUtils.ConfigOptions;
|
|
15
14
|
/** CLI metadata read from a field's Zod `.meta()` value. */
|
|
@@ -20,12 +19,19 @@ export interface CliArgMeta {
|
|
|
20
19
|
readonly flag?: boolean;
|
|
21
20
|
/** Set false to keep schema and configured defaults out of generated help. */
|
|
22
21
|
readonly helpDefault?: boolean;
|
|
22
|
+
/** One-character short flag without a dash, or false to disable automatic generation. */
|
|
23
|
+
readonly short?: string | false;
|
|
24
|
+
}
|
|
25
|
+
/** Structural Zod object contract that remains compatible across Zod v4 minors. */
|
|
26
|
+
export interface CliObjectSchema<TOutput extends Readonly<Record<string, unknown>> = Readonly<Record<string, unknown>>> {
|
|
27
|
+
parse(value: unknown): TOutput;
|
|
28
|
+
toJSONSchema(): unknown;
|
|
23
29
|
}
|
|
24
30
|
/** Zod defaults or concrete option values serialized by {@link serializeArgs}. */
|
|
25
|
-
export type ArgumentSource =
|
|
31
|
+
export type ArgumentSource = CliObjectSchema | Readonly<Record<string, unknown>>;
|
|
26
32
|
/** Register Commander arguments for every enabled field on a Zod object schema. */
|
|
27
|
-
export declare function addArgs<
|
|
33
|
+
export declare function addArgs<TSchema extends CliObjectSchema>(command: Command, schema: TSchema, options?: CliArgsOptions): Command;
|
|
28
34
|
/** Merge CLI values over layered config, then validate and default through Zod. */
|
|
29
|
-
export declare function parseArgs<
|
|
35
|
+
export declare function parseArgs<TSchema extends CliObjectSchema>(command: Command, schema: TSchema, options?: CliArgsOptions): ReturnType<TSchema["parse"]>;
|
|
30
36
|
/** Convert schema defaults or concrete option values into Commander arguments. */
|
|
31
37
|
export declare function serializeArgs(source: ArgumentSource): string[];
|
package/lib/src/args.js
CHANGED
|
@@ -10,17 +10,18 @@
|
|
|
10
10
|
import { configUtils } from "@dbx-tools/core";
|
|
11
11
|
import { object, options as sharedOptions, stringUtils } from "@dbx-tools/shared-core";
|
|
12
12
|
import { Option } from "commander";
|
|
13
|
-
import { z } from "zod";
|
|
14
13
|
const boundOptions = new WeakMap();
|
|
15
14
|
/** Register Commander arguments for every enabled field on a Zod object schema. */
|
|
16
15
|
export function addArgs(command, schema, options = {}) {
|
|
17
16
|
boundOptions.set(command, options);
|
|
18
|
-
|
|
17
|
+
const schemaFields = fields(schema);
|
|
18
|
+
const shortFlags = fieldShortFlags(schemaFields);
|
|
19
|
+
for (const field of schemaFields) {
|
|
19
20
|
if (field.flag === false)
|
|
20
21
|
continue;
|
|
21
22
|
const envKeys = fieldEnvKeys(field);
|
|
22
23
|
const envName = envArgName(field, envKeys, options);
|
|
23
|
-
const flags = argFlags(field);
|
|
24
|
+
const flags = argFlags(field, shortFlags.get(field.key));
|
|
24
25
|
const sourced = configValue(field, envKeys, options);
|
|
25
26
|
const fallback = sourced ?? field.fallback;
|
|
26
27
|
const option = new Option(flags, field.description);
|
|
@@ -61,14 +62,14 @@ export function parseArgs(command, schema, options = boundOptions.get(command) ?
|
|
|
61
62
|
}
|
|
62
63
|
/** Convert schema defaults or concrete option values into Commander arguments. */
|
|
63
64
|
export function serializeArgs(source) {
|
|
64
|
-
if (source
|
|
65
|
+
if (isCliObjectSchema(source)) {
|
|
65
66
|
const values = source.parse({});
|
|
66
67
|
return fields(source).flatMap((field) => field.flag === false ? [] : valueArguments(field.key, values[field.key]));
|
|
67
68
|
}
|
|
68
69
|
return Object.entries(source).flatMap(([key, value]) => valueArguments(key, value));
|
|
69
70
|
}
|
|
70
71
|
function fields(schema) {
|
|
71
|
-
const document =
|
|
72
|
+
const document = schema.toJSONSchema();
|
|
72
73
|
const properties = object.isRecord(document) ? document.properties : undefined;
|
|
73
74
|
if (!object.isRecord(properties)) {
|
|
74
75
|
throw new TypeError("Zod Commander binding requires a z.object() schema");
|
|
@@ -88,12 +89,53 @@ function fields(schema) {
|
|
|
88
89
|
env: json.env,
|
|
89
90
|
flag: json.flag,
|
|
90
91
|
helpDefault: json.helpDefault,
|
|
92
|
+
short: json.short,
|
|
91
93
|
};
|
|
92
94
|
});
|
|
93
95
|
}
|
|
94
|
-
function
|
|
95
|
-
|
|
96
|
-
|
|
96
|
+
function isCliObjectSchema(value) {
|
|
97
|
+
return typeof value.parse === "function" && typeof value.toJSONSchema === "function";
|
|
98
|
+
}
|
|
99
|
+
function argFlags(field, short) {
|
|
100
|
+
const long = `--${stringUtils.toSlug(field.key)}`;
|
|
101
|
+
const value = field.type === "boolean" ? "" : " <value>";
|
|
102
|
+
if (short)
|
|
103
|
+
return `-${short}, ${long}${value}`;
|
|
104
|
+
return `${long}${value}`;
|
|
105
|
+
}
|
|
106
|
+
function fieldShortFlags(fields) {
|
|
107
|
+
const result = new Map();
|
|
108
|
+
const reserved = new Map([["h", "help"]]);
|
|
109
|
+
for (const field of fields) {
|
|
110
|
+
if (field.short === false || field.short === undefined)
|
|
111
|
+
continue;
|
|
112
|
+
if (!/^[A-Za-z]$/.test(field.short)) {
|
|
113
|
+
throw new TypeError(`Short flag for "${field.key}" must be one letter or false`);
|
|
114
|
+
}
|
|
115
|
+
const short = field.short.toLowerCase();
|
|
116
|
+
const existing = reserved.get(short);
|
|
117
|
+
if (existing) {
|
|
118
|
+
throw new TypeError(`Short flag -${short} is shared by "${existing}" and "${field.key}"`);
|
|
119
|
+
}
|
|
120
|
+
reserved.set(short, field.key);
|
|
121
|
+
result.set(field.key, short);
|
|
122
|
+
}
|
|
123
|
+
const candidates = new Map();
|
|
124
|
+
for (const field of fields) {
|
|
125
|
+
if (field.short !== undefined)
|
|
126
|
+
continue;
|
|
127
|
+
const short = [...stringUtils.tokenize(field.key)][0]?.[0]?.toLowerCase();
|
|
128
|
+
if (!short || reserved.has(short))
|
|
129
|
+
continue;
|
|
130
|
+
const matching = candidates.get(short) ?? [];
|
|
131
|
+
matching.push(field);
|
|
132
|
+
candidates.set(short, matching);
|
|
133
|
+
}
|
|
134
|
+
for (const [short, matching] of candidates) {
|
|
135
|
+
if (matching.length === 1)
|
|
136
|
+
result.set(matching[0].key, short);
|
|
137
|
+
}
|
|
138
|
+
return result;
|
|
97
139
|
}
|
|
98
140
|
function fieldEnvKeys(field) {
|
|
99
141
|
if (typeof field.env === "string")
|
|
@@ -152,4 +194,4 @@ function listenAddress(value) {
|
|
|
152
194
|
}
|
|
153
195
|
return undefined;
|
|
154
196
|
}
|
|
155
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJncy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcmdzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxJQUFJLGFBQWEsRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RixPQUFPLEVBQVcsTUFBTSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzVDLE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFrQ3hCLE1BQU0sWUFBWSxHQUFHLElBQUksT0FBTyxFQUEyQixDQUFDO0FBRTVELG1GQUFtRjtBQUNuRixNQUFNLFVBQVUsT0FBTyxDQUNyQixPQUFnQixFQUNoQixNQUFzQixFQUN0QixVQUEwQixFQUFFO0lBRTVCLFlBQVksQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ25DLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDbkMsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLEtBQUs7WUFBRSxTQUFTO1FBQ25DLE1BQU0sT0FBTyxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNwQyxNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNwRCxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUIsTUFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDckQsTUFBTSxRQUFRLEdBQUcsT0FBTyxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUM7UUFDM0MsTUFBTSxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsS0FB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QUFLLFFBQVEsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUN4RixPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN2QixDQUFDO0lBQ0QsTUFBTSxPQUFPLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3JDLElBQUksT0FBTztRQUFFLE9BQU8sYUFBYSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQy9ELE1BQU0sSUFBSSxTQUFTLENBQUMsa0NBQWtDLEdBQUcsMkJBQTJCLENBQUMsQ0FBQztBQUN4RixDQUFDO0FBRUQsU0FBUyxhQUFhLENBQUMsS0FBYztJQUNuQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUM5QyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssS0FBSyxJQUFJLE9BQU8sS0FBSyxDQUFDLElBQUksS0FBSyxRQUFRLElBQUksT0FBTyxLQUFLLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQy9GLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDL0QsQ0FBQztJQUNELElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxNQUFNLElBQUksT0FBTyxLQUFLLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzlELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDOUMsQ0FBQztJQUNELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbW1hbmRlciBhcmd1bWVudHMgZ2VuZXJhdGVkIGZyb20gYSBab2Qgb2JqZWN0IHNjaGVtYS5cbiAqXG4gKiBab2Qgb3ducyB2YWxpZGF0aW9uLCBjb2VyY2lvbiwgbWV0YWRhdGEsIGFuZCBkZWZhdWx0cy4gQ29tbWFuZGVyIG93bnMgZmxhZ3MsXG4gKiBoZWxwLCBhbmQgZW52aXJvbm1lbnQgZGlzcGxheS4ge0BsaW5rIGNvbmZpZ1V0aWxzfSBzdXBwbGllcyBsYXllcmVkIGxvY2FsXG4gKiBjb25maWd1cmF0aW9uIGJlZm9yZSB0aGUgZmluYWwgWm9kIHBhcnNlLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBjb25maWdVdGlscyB9IGZyb20gXCJAZGJ4LXRvb2xzL2NvcmVcIjtcbmltcG9ydCB7IG9iamVjdCwgb3B0aW9ucyBhcyBzaGFyZWRPcHRpb25zLCBzdHJpbmdVdGlscyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyBDb21tYW5kLCBPcHRpb24gfSBmcm9tIFwiY29tbWFuZGVyXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG4vKiogTGF5ZXJlZCBjb25maWcgbG9va3VwIHVzZWQgdG8gcmVzb2x2ZSBhcmd1bWVudCB2YWx1ZXMgYW5kIGhlbHAgZGVmYXVsdHMuICovXG5leHBvcnQgdHlwZSBDbGlBcmdzT3B0aW9ucyA9IGNvbmZpZ1V0aWxzLkNvbmZpZ09wdGlvbnM7XG5cbi8qKiBDTEkgbWV0YWRhdGEgcmVhZCBmcm9tIGEgZmllbGQncyBab2QgYC5tZXRhKClgIHZhbHVlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDbGlBcmdNZXRhIHtcbiAgLyoqIEV4YWN0IGVudmlyb25tZW50IG5hbWUgb3Igb3JkZXJlZCBhbGlhc2VzIHVzZWQgaW5zdGVhZCBvZiBmaWVsZC1uYW1lIGRlcml2YXRpb24uICovXG4gIHJlYWRvbmx5IGVudj86IHN0cmluZyB8IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvKiogU2V0IGZhbHNlIHRvIHJlc29sdmUgdGhlIGZpZWxkIGZyb20gY29uZmlnIHdpdGhvdXQgZ2VuZXJhdGluZyBhIENvbW1hbmRlciBmbGFnLiAqL1xuICByZWFkb25seSBmbGFnPzogYm9vbGVhbjtcbiAgLyoqIFNldCBmYWxzZSB0byBrZWVwIHNjaGVtYSBhbmQgY29uZmlndXJlZCBkZWZhdWx0cyBvdXQgb2YgZ2VuZXJhdGVkIGhlbHAuICovXG4gIHJlYWRvbmx5IGhlbHBEZWZhdWx0PzogYm9vbGVhbjtcbn1cblxuLyoqIFpvZCBkZWZhdWx0cyBvciBjb25jcmV0ZSBvcHRpb24gdmFsdWVzIHNlcmlhbGl6ZWQgYnkge0BsaW5rIHNlcmlhbGl6ZUFyZ3N9LiAqL1xuZXhwb3J0IHR5cGUgQXJndW1lbnRTb3VyY2UgPSB6LlpvZE9iamVjdDx6LlpvZFJhd1NoYXBlPiB8IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PjtcblxuaW50ZXJmYWNlIEpzb25GaWVsZCBleHRlbmRzIENsaUFyZ01ldGEge1xuICB0eXBlPzogc3RyaW5nO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgZGVmYXVsdD86IHVua25vd247XG4gIGVudW0/OiB1bmtub3duW107XG4gIGNvbnN0PzogdW5rbm93bjtcbn1cblxuaW50ZXJmYWNlIEZpZWxkIGV4dGVuZHMgQ2xpQXJnTWV0YSB7XG4gIGtleTogc3RyaW5nO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICB0eXBlPzogc3RyaW5nO1xuICBjaG9pY2VzPzogc3RyaW5nW107XG4gIGZhbGxiYWNrPzogdW5rbm93bjtcbn1cblxuY29uc3QgYm91bmRPcHRpb25zID0gbmV3IFdlYWtNYXA8Q29tbWFuZCwgQ2xpQXJnc09wdGlvbnM+KCk7XG5cbi8qKiBSZWdpc3RlciBDb21tYW5kZXIgYXJndW1lbnRzIGZvciBldmVyeSBlbmFibGVkIGZpZWxkIG9uIGEgWm9kIG9iamVjdCBzY2hlbWEuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkQXJnczxUIGV4dGVuZHMgei5ab2RSYXdTaGFwZT4oXG4gIGNvbW1hbmQ6IENvbW1hbmQsXG4gIHNjaGVtYTogei5ab2RPYmplY3Q8VD4sXG4gIG9wdGlvbnM6IENsaUFyZ3NPcHRpb25zID0ge30sXG4pOiBDb21tYW5kIHtcbiAgYm91bmRPcHRpb25zLnNldChjb21tYW5kLCBvcHRpb25zKTtcbiAgZm9yIChjb25zdCBmaWVsZCBvZiBmaWVsZHMoc2NoZW1hKSkge1xuICAgIGlmIChmaWVsZC5mbGFnID09PSBmYWxzZSkgY29udGludWU7XG4gICAgY29uc3QgZW52S2V5cyA9IGZpZWxkRW52S2V5cyhmaWVsZCk7XG4gICAgY29uc3QgZW52TmFtZSA9IGVudkFyZ05hbWUoZmllbGQsIGVudktleXMsIG9wdGlvbnMpO1xuICAgIGNvbnN0IGZsYWdzID0gYXJnRmxhZ3MoZmllbGQpO1xuICAgIGNvbnN0IHNvdXJjZWQgPSBjb25maWdWYWx1ZShmaWVsZCwgZW52S2V5cywgb3B0aW9ucyk7XG4gICAgY29uc3QgZmFsbGJhY2sgPSBzb3VyY2VkID8/IGZpZWxkLmZhbGxiYWNrO1xuICAgIGNvbnN0IG9wdGlvbiA9IG5ldyBPcHRpb24oZmxhZ3MsIGZpZWxkLmRlc2NyaXB0aW9uKTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob3B0aW9uLCBcInNjaGVtYUhlbHBEZWZhdWx0XCIsIHtcbiAgICAgIHZhbHVlOiBmaWVsZC5oZWxwRGVmYXVsdCA9PT0gZmFsc2UgPyB1bmRlZmluZWQgOiBmaWVsZC5mYWxsYmFjayxcbiAgICB9KTtcbiAgICBpZiAoZW52TmFtZSkgb3B0aW9uLmVudihlbnZOYW1lKTtcbiAgICBpZiAoZmllbGQuY2hvaWNlcyAmJiBmaWVsZC5jaG9pY2VzLmxlbmd0aCA+IDApIG9wdGlvbi5jaG9pY2VzKGZpZWxkLmNob2ljZXMpO1xuICAgIGlmIChmYWxsYmFjayAhPT0gdW5kZWZpbmVkICYmIGZpZWxkLmhlbHBEZWZhdWx0ICE9PSBmYWxzZSkge1xuICAgICAgY29uc3QgYWRkcmVzcyA9IGxpc3RlbkFkZHJlc3MoZmFsbGJhY2spO1xuICAgICAgb3B0aW9uLmRlZmF1bHQoZmFsbGJhY2ssIGFkZHJlc3MgPyBzaGFyZWRPcHRpb25zLmZvcm1hdExpc3RlbkFkZHJlc3MoYWRkcmVzcykgOiB1bmRlZmluZWQpO1xuICAgIH1cbiAgICBpZiAoZmllbGQudHlwZSA9PT0gXCJhcnJheVwiKSB7XG4gICAgICBvcHRpb24uYXJnUGFyc2VyKCh2YWx1ZTogc3RyaW5nLCBwcmV2aW91czogdW5rbm93bikgPT5cbiAgICAgICAgcHJldmlvdXMgPT09IGZhbGxiYWNrIHx8ICFBcnJheS5pc0FycmF5KHByZXZpb3VzKSA/IFt2YWx1ZV0gOiBbLi4ucHJldmlvdXMsIHZhbHVlXSxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbW1hbmQuYWRkT3B0aW9uKG9wdGlvbik7XG4gICAgaWYgKGZpZWxkLnR5cGUgPT09IFwiYm9vbGVhblwiICYmIG9wdGlvbi5sb25nKSB7XG4gICAgICBjb21tYW5kLmFkZE9wdGlvbihcbiAgICAgICAgbmV3IE9wdGlvbihgLS1uby0ke29wdGlvbi5sb25nLnNsaWNlKDIpfWAsIGBEaXNhYmxlICR7ZmllbGQuZGVzY3JpcHRpb24udG9Mb3dlckNhc2UoKX1gKSxcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIHJldHVybiBjb21tYW5kO1xufVxuXG4vKiogTWVyZ2UgQ0xJIHZhbHVlcyBvdmVyIGxheWVyZWQgY29uZmlnLCB0aGVuIHZhbGlkYXRlIGFuZCBkZWZhdWx0IHRocm91Z2ggWm9kLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQXJnczxUIGV4dGVuZHMgei5ab2RSYXdTaGFwZT4oXG4gIGNvbW1hbmQ6IENvbW1hbmQsXG4gIHNjaGVtYTogei5ab2RPYmplY3Q8VD4sXG4gIG9wdGlvbnM6IENsaUFyZ3NPcHRpb25zID0gYm91bmRPcHRpb25zLmdldChjb21tYW5kKSA/PyB7fSxcbik6IHoub3V0cHV0PHouWm9kT2JqZWN0PFQ+PiB7XG4gIGNvbnN0IHZhbHVlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgZm9yIChjb25zdCBmaWVsZCBvZiBmaWVsZHMoc2NoZW1hKSkge1xuICAgIGlmIChjb21tYW5kLmdldE9wdGlvblZhbHVlU291cmNlKGZpZWxkLmtleSkgPT09IFwiY2xpXCIpIHtcbiAgICAgIHZhbHVlc1tmaWVsZC5rZXldID0gY29tbWFuZC5nZXRPcHRpb25WYWx1ZShmaWVsZC5rZXkpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IHNvdXJjZWQgPSBjb25maWdWYWx1ZShmaWVsZCwgZmllbGRFbnZLZXlzKGZpZWxkKSwgb3B0aW9ucyk7XG4gICAgaWYgKHNvdXJjZWQgIT09IHVuZGVmaW5lZCkgdmFsdWVzW2ZpZWxkLmtleV0gPSBzb3VyY2VkO1xuICB9XG4gIHJldHVybiBzY2hlbWEucGFyc2UodmFsdWVzKTtcbn1cblxuLyoqIENvbnZlcnQgc2NoZW1hIGRlZmF1bHRzIG9yIGNvbmNyZXRlIG9wdGlvbiB2YWx1ZXMgaW50byBDb21tYW5kZXIgYXJndW1lbnRzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZUFyZ3Moc291cmNlOiBBcmd1bWVudFNvdXJjZSk6IHN0cmluZ1tdIHtcbiAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIHouWm9kT2JqZWN0KSB7XG4gICAgY29uc3QgdmFsdWVzID0gc291cmNlLnBhcnNlKHt9KSBhcyBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj47XG4gICAgcmV0dXJuIGZpZWxkcyhzb3VyY2UpLmZsYXRNYXAoKGZpZWxkKSA9PlxuICAgICAgZmllbGQuZmxhZyA9PT0gZmFsc2UgPyBbXSA6IHZhbHVlQXJndW1lbnRzKGZpZWxkLmtleSwgdmFsdWVzW2ZpZWxkLmtleV0pLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHNvdXJjZSkuZmxhdE1hcCgoW2tleSwgdmFsdWVdKSA9PiB2YWx1ZUFyZ3VtZW50cyhrZXksIHZhbHVlKSk7XG59XG5cbmZ1bmN0aW9uIGZpZWxkcyhzY2hlbWE6IHouWm9kT2JqZWN0PHouWm9kUmF3U2hhcGU+KTogRmllbGRbXSB7XG4gIGNvbnN0IGRvY3VtZW50ID0gei50b0pTT05TY2hlbWEoc2NoZW1hKTtcbiAgY29uc3QgcHJvcGVydGllcyA9IG9iamVjdC5pc1JlY29yZChkb2N1bWVudCkgPyBkb2N1bWVudC5wcm9wZXJ0aWVzIDogdW5kZWZpbmVkO1xuICBpZiAoIW9iamVjdC5pc1JlY29yZChwcm9wZXJ0aWVzKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJab2QgQ29tbWFuZGVyIGJpbmRpbmcgcmVxdWlyZXMgYSB6Lm9iamVjdCgpIHNjaGVtYVwiKTtcbiAgfVxuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocHJvcGVydGllcykubWFwKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICBpZiAoIW9iamVjdC5pc1JlY29yZCh2YWx1ZSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYENhbm5vdCBiaW5kIENMSSBhcmd1bWVudCBcIiR7a2V5fVwiYCk7XG4gICAgfVxuICAgIGNvbnN0IGpzb24gPSB2YWx1ZSBhcyBKc29uRmllbGQ7XG4gICAgY29uc3QgY2hvaWNlcyA9XG4gICAgICBqc29uLmVudW0/Lm1hcChTdHJpbmcpID8/IChqc29uLmNvbnN0ID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBbU3RyaW5nKGpzb24uY29uc3QpXSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtleSxcbiAgICAgIGRlc2NyaXB0aW9uOiB0eXBlb2YganNvbi5kZXNjcmlwdGlvbiA9PT0gXCJzdHJpbmdcIiA/IGpzb24uZGVzY3JpcHRpb24gOiBcIlwiLFxuICAgICAgdHlwZToganNvbi50eXBlLFxuICAgICAgY2hvaWNlcyxcbiAgICAgIGZhbGxiYWNrOiBqc29uLmRlZmF1bHQsXG4gICAgICBlbnY6IGpzb24uZW52LFxuICAgICAgZmxhZzoganNvbi5mbGFnLFxuICAgICAgaGVscERlZmF1bHQ6IGpzb24uaGVscERlZmF1bHQsXG4gICAgfTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGFyZ0ZsYWdzKGZpZWxkOiBGaWVsZCk6IHN0cmluZyB7XG4gIGNvbnN0IGZsYWcgPSBgLS0ke3N0cmluZ1V0aWxzLnRvU2x1ZyhmaWVsZC5rZXkpfWA7XG4gIHJldHVybiBmaWVsZC50eXBlID09PSBcImJvb2xlYW5cIiA/IGZsYWcgOiBgJHtmbGFnfSA8dmFsdWU+YDtcbn1cblxuZnVuY3Rpb24gZmllbGRFbnZLZXlzKGZpZWxkOiBGaWVsZCk6IHJlYWRvbmx5IHN0cmluZ1tdIHtcbiAgaWYgKHR5cGVvZiBmaWVsZC5lbnYgPT09IFwic3RyaW5nXCIpIHJldHVybiBbZmllbGQuZW52XTtcbiAgaWYgKEFycmF5LmlzQXJyYXkoZmllbGQuZW52KSkgcmV0dXJuIFsuLi5maWVsZC5lbnZdO1xuICByZXR1cm4gY29uZmlnVXRpbHMuZW52aXJvbm1lbnRLZXlzKGZpZWxkLmtleSk7XG59XG5cbmZ1bmN0aW9uIGVudkFyZ05hbWUoZmllbGQ6IEZpZWxkLCBlbnZLZXlzOiByZWFkb25seSBzdHJpbmdbXSwgb3B0aW9uczogQ2xpQXJnc09wdGlvbnMpOiBzdHJpbmcge1xuICBpZiAoZmllbGQuZW52ICE9PSB1bmRlZmluZWQpIHJldHVybiBlbnZLZXlzWzBdID8/IFwiXCI7XG4gIGNvbnN0IGNhbm9uaWNhbCA9XG4gICAgZW52S2V5cy5maW5kKChrZXkpID0+IC9eW0EtWl1bQS1aMC05XSooX1tBLVowLTldKykrJC8udGVzdChrZXkpKSA/P1xuICAgIGVudktleXMuZmluZCgoa2V5KSA9PiBrZXkgPT09IGtleS50b1VwcGVyQ2FzZSgpICYmIC9bQS1aXS8udGVzdChrZXkpKSA/P1xuICAgIGVudktleXMuYXQoLTEpID8/XG4gICAgXCJcIjtcbiAgLy8gSGVscCBzaG93cyB0aGUgdW5zY29wZWQgbmFtZTsgY29uZmlnVXRpbHMgc3RpbGwgcmVhZHMgREJYX1RPT0xTXyBhbGlhc2VzLlxuICByZXR1cm4gY29uZmlnVXRpbHMubmFtZShjYW5vbmljYWwsIHsgLi4ub3B0aW9ucywgc2NvcGU6IFtdIH0pO1xufVxuXG5mdW5jdGlvbiBjb25maWdWYWx1ZShcbiAgZmllbGQ6IEZpZWxkLFxuICBlbnZLZXlzOiBzdHJpbmcgfCByZWFkb25seSBzdHJpbmdbXSxcbiAgb3B0aW9uczogQ2xpQXJnc09wdGlvbnMsXG4pOiB1bmtub3duIHtcbiAgaWYgKGZpZWxkLnR5cGUgPT09IFwiYXJyYXlcIikge1xuICAgIGNvbnN0IHZhbHVlcyA9IGNvbmZpZ1V0aWxzLmxpc3QodW5kZWZpbmVkLCBlbnZLZXlzLCB1bmRlZmluZWQsIG9wdGlvbnMpO1xuICAgIHJldHVybiB2YWx1ZXMubGVuZ3RoID4gMCA/IHZhbHVlcyA6IHVuZGVmaW5lZDtcbiAgfVxuICBpZiAoZmllbGQudHlwZSA9PT0gXCJib29sZWFuXCIpIHJldHVybiBjb25maWdVdGlscy5ib29sZWFuKHVuZGVmaW5lZCwgZW52S2V5cywgb3B0aW9ucyk7XG4gIHJldHVybiBjb25maWdVdGlscy50ZXh0KGVudktleXMsIG9wdGlvbnMpO1xufVxuXG5mdW5jdGlvbiB2YWx1ZUFyZ3VtZW50cyhrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiBzdHJpbmdbXSB7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSByZXR1cm4gW107XG4gIGNvbnN0IGZsYWcgPSBgLS0ke3N0cmluZ1V0aWxzLnRvU2x1ZyhrZXkpfWA7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiKSByZXR1cm4gW3ZhbHVlID8gZmxhZyA6IGAtLW5vLSR7ZmxhZy5zbGljZSgyKX1gXTtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlLmZsYXRNYXAoKGVudHJ5KSA9PiBbZmxhZywgc2NhbGFyQXJndW1lbnQoa2V5LCBlbnRyeSldKTtcbiAgfVxuICByZXR1cm4gW2ZsYWcsIHNjYWxhckFyZ3VtZW50KGtleSwgdmFsdWUpXTtcbn1cblxuZnVuY3Rpb24gc2NhbGFyQXJndW1lbnQoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcImJpZ2ludFwiKSB7XG4gICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gIH1cbiAgY29uc3QgYWRkcmVzcyA9IGxpc3RlbkFkZHJlc3ModmFsdWUpO1xuICBpZiAoYWRkcmVzcykgcmV0dXJuIHNoYXJlZE9wdGlvbnMuZm9ybWF0TGlzdGVuQWRkcmVzcyhhZGRyZXNzKTtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihgQ2Fubm90IHNlcmlhbGl6ZSBDTEkgYXJndW1lbnQgXCIke2tleX1cIiB3aXRoIGEgbm9uLXNjYWxhciB2YWx1ZWApO1xufVxuXG5mdW5jdGlvbiBsaXN0ZW5BZGRyZXNzKHZhbHVlOiB1bmtub3duKTogc2hhcmVkT3B0aW9ucy5MaXN0ZW5BZGRyZXNzIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFvYmplY3QuaXNSZWNvcmQodmFsdWUpKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAodmFsdWUuc2NoZW1lID09PSBcInRjcFwiICYmIHR5cGVvZiB2YWx1ZS5ob3N0ID09PSBcInN0cmluZ1wiICYmIHR5cGVvZiB2YWx1ZS5wb3J0ID09PSBcIm51bWJlclwiKSB7XG4gICAgcmV0dXJuIHsgc2NoZW1lOiBcInRjcFwiLCBob3N0OiB2YWx1ZS5ob3N0LCBwb3J0OiB2YWx1ZS5wb3J0IH07XG4gIH1cbiAgaWYgKHZhbHVlLnNjaGVtZSA9PT0gXCJ1bml4XCIgJiYgdHlwZW9mIHZhbHVlLnBhdGggPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4geyBzY2hlbWU6IFwidW5peFwiLCBwYXRoOiB2YWx1ZS5wYXRoIH07XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbiJdfQ==
|
|
197
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJncy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcmdzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxJQUFJLGFBQWEsRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RixPQUFPLEVBQVcsTUFBTSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBNEM1QyxNQUFNLFlBQVksR0FBRyxJQUFJLE9BQU8sRUFBMkIsQ0FBQztBQUU1RCxtRkFBbUY7QUFDbkYsTUFBTSxVQUFVLE9BQU8sQ0FDckIsT0FBZ0IsRUFDaEIsTUFBZSxFQUNmLFVBQTBCLEVBQUU7SUFFNUIsWUFBWSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDbkMsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3BDLE1BQU0sVUFBVSxHQUFHLGVBQWUsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNqRCxLQUFLLE1BQU0sS0FBSyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ2pDLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxLQUFLO1lBQUUsU0FBUztRQUNuQyxNQUFNLE9BQU8sR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDcEMsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDcEQsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3pELE1BQU0sT0FBTyxHQUFHLFdBQVcsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3JELE1BQU0s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QUM7UUFDRCxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDL0IsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFDRCxNQUFNLFVBQVUsR0FBRyxJQUFJLEdBQUcsRUFBbUIsQ0FBQztJQUM5QyxLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQzNCLElBQUksS0FBSyxDQUFDLEtBQUssS0FBSyxTQUFTO1lBQUUsU0FBUztRQUN4QyxNQUFNLEtBQUssR0FBRyxDQUFDLEdBQUcsV0FBVyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDO1FBQzFFLElBQUksQ0FBQyxLQUFLLElBQUksUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUM7WUFBRSxTQUFTO1FBQzVDLE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzdDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDckIsVUFBVSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUNELEtBQUssTUFBTSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsSUFBSSxVQUFVLEVBQUUsQ0FBQztRQUMzQyxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBRSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELFNBQVMsWUFBWSxDQUFDLEtBQVk7SUFDaEMsSUFBSSxPQUFPLEtBQUssQ0FBQyxHQUFHLEtBQUssUUFBUTtRQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdEQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUM7UUFBRSxPQUFPLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDcEQsT0FBTyxXQUFXLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNoRCxDQUFDO0FBRUQsU0FBUyxVQUFVLENBQUMsS0FBWSxFQUFFLE9BQTBCLEVBQUUsT0FBdUI7SUFDbkYsSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLFNBQVM7UUFBRSxPQUFPLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDckQsTUFBTSxTQUFTLEdBQ2IsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsK0JBQStCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2hFLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUMsV0FBVyxFQUFFLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNyRSxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2QsRUFBRSxDQUFDO0lBQ0wsNEVBQTRFO0lBQzVFLE9BQU8sV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxHQUFHLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUNoRSxDQUFDO0FBRUQsU0FBUyxXQUFXLENBQ2xCLEtBQVksRUFDWixPQUFtQyxFQUNuQyxPQUF1QjtJQUV2QixJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssT0FBTyxFQUFFLENBQUM7UUFDM0IsTUFBTSxNQUFNLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN4RSxPQUFPLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUNoRCxDQUFDO0lBQ0QsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLFNBQVM7UUFBRSxPQUFPLFdBQVcsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN0RixPQUFPLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQzVDLENBQUM7QUFFRCxTQUFTLGNBQWMsQ0FBQyxHQUFXLEVBQUUsS0FBYztJQUNqRCxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxLQUFLLElBQUk7UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUNyRCxNQUFNLElBQUksR0FBRyxLQUFLLFdBQVcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztJQUM1QyxJQUFJLE9BQU8sS0FBSyxLQUFLLFNBQVM7UUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDaEYsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDekIsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxjQUFjLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBQ0QsT0FBTyxDQUFDLElBQUksRUFBRSxjQUFjLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDNUMsQ0FBQztBQUVELFNBQVMsY0FBYyxDQUFDLEdBQVcsRUFBRSxLQUFjO0lBQ2pELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUN4RixPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN2QixDQUFDO0lBQ0QsTUFBTSxPQUFPLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3JDLElBQUksT0FBTztRQUFFLE9BQU8sYUFBYSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQy9ELE1BQU0sSUFBSSxTQUFTLENBQUMsa0NBQWtDLEdBQUcsMkJBQTJCLENBQUMsQ0FBQztBQUN4RixDQUFDO0FBRUQsU0FBUyxhQUFhLENBQUMsS0FBYztJQUNuQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUM5QyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssS0FBSyxJQUFJLE9BQU8sS0FBSyxDQUFDLElBQUksS0FBSyxRQUFRLElBQUksT0FBTyxLQUFLLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQy9GLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDL0QsQ0FBQztJQUNELElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxNQUFNLElBQUksT0FBTyxLQUFLLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzlELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDOUMsQ0FBQztJQUNELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbW1hbmRlciBhcmd1bWVudHMgZ2VuZXJhdGVkIGZyb20gYSBab2Qgb2JqZWN0IHNjaGVtYS5cbiAqXG4gKiBab2Qgb3ducyB2YWxpZGF0aW9uLCBjb2VyY2lvbiwgbWV0YWRhdGEsIGFuZCBkZWZhdWx0cy4gQ29tbWFuZGVyIG93bnMgZmxhZ3MsXG4gKiBoZWxwLCBhbmQgZW52aXJvbm1lbnQgZGlzcGxheS4ge0BsaW5rIGNvbmZpZ1V0aWxzfSBzdXBwbGllcyBsYXllcmVkIGxvY2FsXG4gKiBjb25maWd1cmF0aW9uIGJlZm9yZSB0aGUgZmluYWwgWm9kIHBhcnNlLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBjb25maWdVdGlscyB9IGZyb20gXCJAZGJ4LXRvb2xzL2NvcmVcIjtcbmltcG9ydCB7IG9iamVjdCwgb3B0aW9ucyBhcyBzaGFyZWRPcHRpb25zLCBzdHJpbmdVdGlscyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyBDb21tYW5kLCBPcHRpb24gfSBmcm9tIFwiY29tbWFuZGVyXCI7XG5cbi8qKiBMYXllcmVkIGNvbmZpZyBsb29rdXAgdXNlZCB0byByZXNvbHZlIGFyZ3VtZW50IHZhbHVlcyBhbmQgaGVscCBkZWZhdWx0cy4gKi9cbmV4cG9ydCB0eXBlIENsaUFyZ3NPcHRpb25zID0gY29uZmlnVXRpbHMuQ29uZmlnT3B0aW9ucztcblxuLyoqIENMSSBtZXRhZGF0YSByZWFkIGZyb20gYSBmaWVsZCdzIFpvZCBgLm1ldGEoKWAgdmFsdWUuICovXG5leHBvcnQgaW50ZXJmYWNlIENsaUFyZ01ldGEge1xuICAvKiogRXhhY3QgZW52aXJvbm1lbnQgbmFtZSBvciBvcmRlcmVkIGFsaWFzZXMgdXNlZCBpbnN0ZWFkIG9mIGZpZWxkLW5hbWUgZGVyaXZhdGlvbi4gKi9cbiAgcmVhZG9ubHkgZW52Pzogc3RyaW5nIHwgcmVhZG9ubHkgc3RyaW5nW107XG4gIC8qKiBTZXQgZmFsc2UgdG8gcmVzb2x2ZSB0aGUgZmllbGQgZnJvbSBjb25maWcgd2l0aG91dCBnZW5lcmF0aW5nIGEgQ29tbWFuZGVyIGZsYWcuICovXG4gIHJlYWRvbmx5IGZsYWc/OiBib29sZWFuO1xuICAvKiogU2V0IGZhbHNlIHRvIGtlZXAgc2NoZW1hIGFuZCBjb25maWd1cmVkIGRlZmF1bHRzIG91dCBvZiBnZW5lcmF0ZWQgaGVscC4gKi9cbiAgcmVhZG9ubHkgaGVscERlZmF1bHQ/OiBib29sZWFuO1xuICAvKiogT25lLWNoYXJhY3RlciBzaG9ydCBmbGFnIHdpdGhvdXQgYSBkYXNoLCBvciBmYWxzZSB0byBkaXNhYmxlIGF1dG9tYXRpYyBnZW5lcmF0aW9uLiAqL1xuICByZWFkb25seSBzaG9ydD86IHN0cmluZyB8IGZhbHNlO1xufVxuXG4vKiogU3RydWN0dXJhbCBab2Qgb2JqZWN0IGNvbnRyYWN0IHRoYXQgcmVtYWlucyBjb21wYXRpYmxlIGFjcm9zcyBab2QgdjQgbWlub3JzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDbGlPYmplY3RTY2hlbWE8XG4gIFRPdXRwdXQgZXh0ZW5kcyBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gPSBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sXG4+IHtcbiAgcGFyc2UodmFsdWU6IHVua25vd24pOiBUT3V0cHV0O1xuICB0b0pTT05TY2hlbWEoKTogdW5rbm93bjtcbn1cblxuLyoqIFpvZCBkZWZhdWx0cyBvciBjb25jcmV0ZSBvcHRpb24gdmFsdWVzIHNlcmlhbGl6ZWQgYnkge0BsaW5rIHNlcmlhbGl6ZUFyZ3N9LiAqL1xuZXhwb3J0IHR5cGUgQXJndW1lbnRTb3VyY2UgPSBDbGlPYmplY3RTY2hlbWEgfCBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj47XG5cbmludGVyZmFjZSBKc29uRmllbGQgZXh0ZW5kcyBDbGlBcmdNZXRhIHtcbiAgdHlwZT86IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIGRlZmF1bHQ/OiB1bmtub3duO1xuICBlbnVtPzogdW5rbm93bltdO1xuICBjb25zdD86IHVua25vd247XG59XG5cbmludGVyZmFjZSBGaWVsZCBleHRlbmRzIENsaUFyZ01ldGEge1xuICBrZXk6IHN0cmluZztcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgdHlwZT86IHN0cmluZztcbiAgY2hvaWNlcz86IHN0cmluZ1tdO1xuICBmYWxsYmFjaz86IHVua25vd247XG59XG5cbmNvbnN0IGJvdW5kT3B0aW9ucyA9IG5ldyBXZWFrTWFwPENvbW1hbmQsIENsaUFyZ3NPcHRpb25zPigpO1xuXG4vKiogUmVnaXN0ZXIgQ29tbWFuZGVyIGFyZ3VtZW50cyBmb3IgZXZlcnkgZW5hYmxlZCBmaWVsZCBvbiBhIFpvZCBvYmplY3Qgc2NoZW1hLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZEFyZ3M8VFNjaGVtYSBleHRlbmRzIENsaU9iamVjdFNjaGVtYT4oXG4gIGNvbW1hbmQ6IENvbW1hbmQsXG4gIHNjaGVtYTogVFNjaGVtYSxcbiAgb3B0aW9uczogQ2xpQXJnc09wdGlvbnMgPSB7fSxcbik6IENvbW1hbmQge1xuICBib3VuZE9wdGlvbnMuc2V0KGNvbW1hbmQsIG9wdGlvbnMpO1xuICBjb25zdCBzY2hlbWFGaWVsZHMgPSBmaWVsZHMoc2NoZW1hKTtcbiAgY29uc3Qgc2hvcnRGbGFncyA9IGZpZWxkU2hvcnRGbGFncyhzY2hlbWFGaWVsZHMpO1xuICBmb3IgKGNvbnN0IGZpZWxkIG9mIHNjaGVtYUZpZWxkcykge1xuICAgIGlmIChmaWVsZC5mbGFnID09PSBmYWxzZSkgY29udGludWU7XG4gICAgY29uc3QgZW52S2V5cyA9IGZpZWxkRW52S2V5cyhmaWVsZCk7XG4gICAgY29uc3QgZW52TmFtZSA9IGVudkFyZ05hbWUoZmllbGQsIGVudktleXMsIG9wdGlvbnMpO1xuICAgIGNvbnN0IGZsYWdzID0gYXJnRmxhZ3MoZmllbGQsIHNob3J0RmxhZ3MuZ2V0KGZpZWxkLmtleSkpO1xuICAgIGNvbnN0IHNvdXJjZWQgPSBjb25maWdWYWx1ZShmaWVsZCwgZW52S2V5cywgb3B0aW9ucyk7XG4gICAgY29uc3QgZmFsbGJhY2sgPSBzb3VyY2VkID8/IGZpZWxkLmZhbGxiYWNrO1xuICAgIGNvbnN0IG9wdGlvbiA9IG5ldyBPcHRpb24oZmxhZ3MsIGZpZWxkLmRlc2NyaXB0aW9uKTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob3B0aW9uLCBcInNjaGVtYUhlbHBEZWZhdWx0XCIsIHtcbiAgICAgIHZhbHVlOiBmaWVsZC5oZWxwRGVmYXVsdCA9PT0gZmFsc2UgPyB1bmRlZmluZWQgOiBmaWVsZC5mYWxsYmFjayxcbiAgICB9KTtcbiAgICBpZiAoZW52TmFtZSkgb3B0aW9uLmVudihlbnZOYW1lKTtcbiAgICBpZiAoZmllbGQuY2hvaWNlcyAmJiBmaWVsZC5jaG9pY2VzLmxlbmd0aCA+IDApIG9wdGlvbi5jaG9pY2VzKGZpZWxkLmNob2ljZXMpO1xuICAgIGlmIChmYWxsYmFjayAhPT0gdW5kZWZpbmVkICYmIGZpZWxkLmhlbHBEZWZhdWx0ICE9PSBmYWxzZSkge1xuICAgICAgY29uc3QgYWRkcmVzcyA9IGxpc3RlbkFkZHJlc3MoZmFsbGJhY2spO1xuICAgICAgb3B0aW9uLmRlZmF1bHQoZmFsbGJhY2ssIGFkZHJlc3MgPyBzaGFyZWRPcHRpb25zLmZvcm1hdExpc3RlbkFkZHJlc3MoYWRkcmVzcykgOiB1bmRlZmluZWQpO1xuICAgIH1cbiAgICBpZiAoZmllbGQudHlwZSA9PT0gXCJhcnJheVwiKSB7XG4gICAgICBvcHRpb24uYXJnUGFyc2VyKCh2YWx1ZTogc3RyaW5nLCBwcmV2aW91czogdW5rbm93bikgPT5cbiAgICAgICAgcHJldmlvdXMgPT09IGZhbGxiYWNrIHx8ICFBcnJheS5pc0FycmF5KHByZXZpb3VzKSA/IFt2YWx1ZV0gOiBbLi4ucHJldmlvdXMsIHZhbHVlXSxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbW1hbmQuYWRkT3B0aW9uKG9wdGlvbik7XG4gICAgaWYgKGZpZWxkLnR5cGUgPT09IFwiYm9vbGVhblwiICYmIG9wdGlvbi5sb25nKSB7XG4gICAgICBjb21tYW5kLmFkZE9wdGlvbihcbiAgICAgICAgbmV3IE9wdGlvbihgLS1uby0ke29wdGlvbi5sb25nLnNsaWNlKDIpfWAsIGBEaXNhYmxlICR7ZmllbGQuZGVzY3JpcHRpb24udG9Mb3dlckNhc2UoKX1gKSxcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIHJldHVybiBjb21tYW5kO1xufVxuXG4vKiogTWVyZ2UgQ0xJIHZhbHVlcyBvdmVyIGxheWVyZWQgY29uZmlnLCB0aGVuIHZhbGlkYXRlIGFuZCBkZWZhdWx0IHRocm91Z2ggWm9kLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQXJnczxUU2NoZW1hIGV4dGVuZHMgQ2xpT2JqZWN0U2NoZW1hPihcbiAgY29tbWFuZDogQ29tbWFuZCxcbiAgc2NoZW1hOiBUU2NoZW1hLFxuICBvcHRpb25zOiBDbGlBcmdzT3B0aW9ucyA9IGJvdW5kT3B0aW9ucy5nZXQoY29tbWFuZCkgPz8ge30sXG4pOiBSZXR1cm5UeXBlPFRTY2hlbWFbXCJwYXJzZVwiXT4ge1xuICBjb25zdCB2YWx1ZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gIGZvciAoY29uc3QgZmllbGQgb2YgZmllbGRzKHNjaGVtYSkpIHtcbiAgICBpZiAoY29tbWFuZC5nZXRPcHRpb25WYWx1ZVNvdXJjZShmaWVsZC5rZXkpID09PSBcImNsaVwiKSB7XG4gICAgICB2YWx1ZXNbZmllbGQua2V5XSA9IGNvbW1hbmQuZ2V0T3B0aW9uVmFsdWUoZmllbGQua2V5KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBzb3VyY2VkID0gY29uZmlnVmFsdWUoZmllbGQsIGZpZWxkRW52S2V5cyhmaWVsZCksIG9wdGlvbnMpO1xuICAgIGlmIChzb3VyY2VkICE9PSB1bmRlZmluZWQpIHZhbHVlc1tmaWVsZC5rZXldID0gc291cmNlZDtcbiAgfVxuICByZXR1cm4gc2NoZW1hLnBhcnNlKHZhbHVlcykgYXMgUmV0dXJuVHlwZTxUU2NoZW1hW1wicGFyc2VcIl0+O1xufVxuXG4vKiogQ29udmVydCBzY2hlbWEgZGVmYXVsdHMgb3IgY29uY3JldGUgb3B0aW9uIHZhbHVlcyBpbnRvIENvbW1hbmRlciBhcmd1bWVudHMuICovXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplQXJncyhzb3VyY2U6IEFyZ3VtZW50U291cmNlKTogc3RyaW5nW10ge1xuICBpZiAoaXNDbGlPYmplY3RTY2hlbWEoc291cmNlKSkge1xuICAgIGNvbnN0IHZhbHVlcyA9IHNvdXJjZS5wYXJzZSh7fSkgYXMgUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xuICAgIHJldHVybiBmaWVsZHMoc291cmNlKS5mbGF0TWFwKChmaWVsZCkgPT5cbiAgICAgIGZpZWxkLmZsYWcgPT09IGZhbHNlID8gW10gOiB2YWx1ZUFyZ3VtZW50cyhmaWVsZC5rZXksIHZhbHVlc1tmaWVsZC5rZXldKSxcbiAgICApO1xuICB9XG4gIHJldHVybiBPYmplY3QuZW50cmllcyhzb3VyY2UpLmZsYXRNYXAoKFtrZXksIHZhbHVlXSkgPT4gdmFsdWVBcmd1bWVudHMoa2V5LCB2YWx1ZSkpO1xufVxuXG5mdW5jdGlvbiBmaWVsZHMoc2NoZW1hOiBDbGlPYmplY3RTY2hlbWEpOiBGaWVsZFtdIHtcbiAgY29uc3QgZG9jdW1lbnQgPSBzY2hlbWEudG9KU09OU2NoZW1hKCk7XG4gIGNvbnN0IHByb3BlcnRpZXMgPSBvYmplY3QuaXNSZWNvcmQoZG9jdW1lbnQpID8gZG9jdW1lbnQucHJvcGVydGllcyA6IHVuZGVmaW5lZDtcbiAgaWYgKCFvYmplY3QuaXNSZWNvcmQocHJvcGVydGllcykpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiWm9kIENvbW1hbmRlciBiaW5kaW5nIHJlcXVpcmVzIGEgei5vYmplY3QoKSBzY2hlbWFcIik7XG4gIH1cbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHByb3BlcnRpZXMpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgaWYgKCFvYmplY3QuaXNSZWNvcmQodmFsdWUpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBDYW5ub3QgYmluZCBDTEkgYXJndW1lbnQgXCIke2tleX1cImApO1xuICAgIH1cbiAgICBjb25zdCBqc29uID0gdmFsdWUgYXMgSnNvbkZpZWxkO1xuICAgIGNvbnN0IGNob2ljZXMgPVxuICAgICAganNvbi5lbnVtPy5tYXAoU3RyaW5nKSA/PyAoanNvbi5jb25zdCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogW1N0cmluZyhqc29uLmNvbnN0KV0pO1xuICAgIHJldHVybiB7XG4gICAgICBrZXksXG4gICAgICBkZXNjcmlwdGlvbjogdHlwZW9mIGpzb24uZGVzY3JpcHRpb24gPT09IFwic3RyaW5nXCIgPyBqc29uLmRlc2NyaXB0aW9uIDogXCJcIixcbiAgICAgIHR5cGU6IGpzb24udHlwZSxcbiAgICAgIGNob2ljZXMsXG4gICAgICBmYWxsYmFjazoganNvbi5kZWZhdWx0LFxuICAgICAgZW52OiBqc29uLmVudixcbiAgICAgIGZsYWc6IGpzb24uZmxhZyxcbiAgICAgIGhlbHBEZWZhdWx0OiBqc29uLmhlbHBEZWZhdWx0LFxuICAgICAgc2hvcnQ6IGpzb24uc2hvcnQsXG4gICAgfTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGlzQ2xpT2JqZWN0U2NoZW1hKHZhbHVlOiBBcmd1bWVudFNvdXJjZSk6IHZhbHVlIGlzIENsaU9iamVjdFNjaGVtYSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUucGFyc2UgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgdmFsdWUudG9KU09OU2NoZW1hID09PSBcImZ1bmN0aW9uXCI7XG59XG5cbmZ1bmN0aW9uIGFyZ0ZsYWdzKGZpZWxkOiBGaWVsZCwgc2hvcnQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIGNvbnN0IGxvbmcgPSBgLS0ke3N0cmluZ1V0aWxzLnRvU2x1ZyhmaWVsZC5rZXkpfWA7XG4gIGNvbnN0IHZhbHVlID0gZmllbGQudHlwZSA9PT0gXCJib29sZWFuXCIgPyBcIlwiIDogXCIgPHZhbHVlPlwiO1xuICBpZiAoc2hvcnQpIHJldHVybiBgLSR7c2hvcnR9LCAke2xvbmd9JHt2YWx1ZX1gO1xuICByZXR1cm4gYCR7bG9uZ30ke3ZhbHVlfWA7XG59XG5cbmZ1bmN0aW9uIGZpZWxkU2hvcnRGbGFncyhmaWVsZHM6IHJlYWRvbmx5IEZpZWxkW10pOiBSZWFkb25seU1hcDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCByZXN1bHQgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBjb25zdCByZXNlcnZlZCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KFtbXCJoXCIsIFwiaGVscFwiXV0pO1xuICBmb3IgKGNvbnN0IGZpZWxkIG9mIGZpZWxkcykge1xuICAgIGlmIChmaWVsZC5zaG9ydCA9PT0gZmFsc2UgfHwgZmllbGQuc2hvcnQgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgaWYgKCEvXltBLVphLXpdJC8udGVzdChmaWVsZC5zaG9ydCkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFNob3J0IGZsYWcgZm9yIFwiJHtmaWVsZC5rZXl9XCIgbXVzdCBiZSBvbmUgbGV0dGVyIG9yIGZhbHNlYCk7XG4gICAgfVxuICAgIGNvbnN0IHNob3J0ID0gZmllbGQuc2hvcnQudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBleGlzdGluZyA9IHJlc2VydmVkLmdldChzaG9ydCk7XG4gICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBTaG9ydCBmbGFnIC0ke3Nob3J0fSBpcyBzaGFyZWQgYnkgXCIke2V4aXN0aW5nfVwiIGFuZCBcIiR7ZmllbGQua2V5fVwiYCk7XG4gICAgfVxuICAgIHJlc2VydmVkLnNldChzaG9ydCwgZmllbGQua2V5KTtcbiAgICByZXN1bHQuc2V0KGZpZWxkLmtleSwgc2hvcnQpO1xuICB9XG4gIGNvbnN0IGNhbmRpZGF0ZXMgPSBuZXcgTWFwPHN0cmluZywgRmllbGRbXT4oKTtcbiAgZm9yIChjb25zdCBmaWVsZCBvZiBmaWVsZHMpIHtcbiAgICBpZiAoZmllbGQuc2hvcnQgIT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgY29uc3Qgc2hvcnQgPSBbLi4uc3RyaW5nVXRpbHMudG9rZW5pemUoZmllbGQua2V5KV1bMF0/LlswXT8udG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoIXNob3J0IHx8IHJlc2VydmVkLmhhcyhzaG9ydCkpIGNvbnRpbnVlO1xuICAgIGNvbnN0IG1hdGNoaW5nID0gY2FuZGlkYXRlcy5nZXQoc2hvcnQpID8/IFtdO1xuICAgIG1hdGNoaW5nLnB1c2goZmllbGQpO1xuICAgIGNhbmRpZGF0ZXMuc2V0KHNob3J0LCBtYXRjaGluZyk7XG4gIH1cbiAgZm9yIChjb25zdCBbc2hvcnQsIG1hdGNoaW5nXSBvZiBjYW5kaWRhdGVzKSB7XG4gICAgaWYgKG1hdGNoaW5nLmxlbmd0aCA9PT0gMSkgcmVzdWx0LnNldChtYXRjaGluZ1swXSEua2V5LCBzaG9ydCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gZmllbGRFbnZLZXlzKGZpZWxkOiBGaWVsZCk6IHJlYWRvbmx5IHN0cmluZ1tdIHtcbiAgaWYgKHR5cGVvZiBmaWVsZC5lbnYgPT09IFwic3RyaW5nXCIpIHJldHVybiBbZmllbGQuZW52XTtcbiAgaWYgKEFycmF5LmlzQXJyYXkoZmllbGQuZW52KSkgcmV0dXJuIFsuLi5maWVsZC5lbnZdO1xuICByZXR1cm4gY29uZmlnVXRpbHMuZW52aXJvbm1lbnRLZXlzKGZpZWxkLmtleSk7XG59XG5cbmZ1bmN0aW9uIGVudkFyZ05hbWUoZmllbGQ6IEZpZWxkLCBlbnZLZXlzOiByZWFkb25seSBzdHJpbmdbXSwgb3B0aW9uczogQ2xpQXJnc09wdGlvbnMpOiBzdHJpbmcge1xuICBpZiAoZmllbGQuZW52ICE9PSB1bmRlZmluZWQpIHJldHVybiBlbnZLZXlzWzBdID8/IFwiXCI7XG4gIGNvbnN0IGNhbm9uaWNhbCA9XG4gICAgZW52S2V5cy5maW5kKChrZXkpID0+IC9eW0EtWl1bQS1aMC05XSooX1tBLVowLTldKykrJC8udGVzdChrZXkpKSA/P1xuICAgIGVudktleXMuZmluZCgoa2V5KSA9PiBrZXkgPT09IGtleS50b1VwcGVyQ2FzZSgpICYmIC9bQS1aXS8udGVzdChrZXkpKSA/P1xuICAgIGVudktleXMuYXQoLTEpID8/XG4gICAgXCJcIjtcbiAgLy8gSGVscCBzaG93cyB0aGUgdW5zY29wZWQgbmFtZTsgY29uZmlnVXRpbHMgc3RpbGwgcmVhZHMgREJYX1RPT0xTXyBhbGlhc2VzLlxuICByZXR1cm4gY29uZmlnVXRpbHMubmFtZShjYW5vbmljYWwsIHsgLi4ub3B0aW9ucywgc2NvcGU6IFtdIH0pO1xufVxuXG5mdW5jdGlvbiBjb25maWdWYWx1ZShcbiAgZmllbGQ6IEZpZWxkLFxuICBlbnZLZXlzOiBzdHJpbmcgfCByZWFkb25seSBzdHJpbmdbXSxcbiAgb3B0aW9uczogQ2xpQXJnc09wdGlvbnMsXG4pOiB1bmtub3duIHtcbiAgaWYgKGZpZWxkLnR5cGUgPT09IFwiYXJyYXlcIikge1xuICAgIGNvbnN0IHZhbHVlcyA9IGNvbmZpZ1V0aWxzLmxpc3QodW5kZWZpbmVkLCBlbnZLZXlzLCB1bmRlZmluZWQsIG9wdGlvbnMpO1xuICAgIHJldHVybiB2YWx1ZXMubGVuZ3RoID4gMCA/IHZhbHVlcyA6IHVuZGVmaW5lZDtcbiAgfVxuICBpZiAoZmllbGQudHlwZSA9PT0gXCJib29sZWFuXCIpIHJldHVybiBjb25maWdVdGlscy5ib29sZWFuKHVuZGVmaW5lZCwgZW52S2V5cywgb3B0aW9ucyk7XG4gIHJldHVybiBjb25maWdVdGlscy50ZXh0KGVudktleXMsIG9wdGlvbnMpO1xufVxuXG5mdW5jdGlvbiB2YWx1ZUFyZ3VtZW50cyhrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiBzdHJpbmdbXSB7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSByZXR1cm4gW107XG4gIGNvbnN0IGZsYWcgPSBgLS0ke3N0cmluZ1V0aWxzLnRvU2x1ZyhrZXkpfWA7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiKSByZXR1cm4gW3ZhbHVlID8gZmxhZyA6IGAtLW5vLSR7ZmxhZy5zbGljZSgyKX1gXTtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlLmZsYXRNYXAoKGVudHJ5KSA9PiBbZmxhZywgc2NhbGFyQXJndW1lbnQoa2V5LCBlbnRyeSldKTtcbiAgfVxuICByZXR1cm4gW2ZsYWcsIHNjYWxhckFyZ3VtZW50KGtleSwgdmFsdWUpXTtcbn1cblxuZnVuY3Rpb24gc2NhbGFyQXJndW1lbnQoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcImJpZ2ludFwiKSB7XG4gICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gIH1cbiAgY29uc3QgYWRkcmVzcyA9IGxpc3RlbkFkZHJlc3ModmFsdWUpO1xuICBpZiAoYWRkcmVzcykgcmV0dXJuIHNoYXJlZE9wdGlvbnMuZm9ybWF0TGlzdGVuQWRkcmVzcyhhZGRyZXNzKTtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihgQ2Fubm90IHNlcmlhbGl6ZSBDTEkgYXJndW1lbnQgXCIke2tleX1cIiB3aXRoIGEgbm9uLXNjYWxhciB2YWx1ZWApO1xufVxuXG5mdW5jdGlvbiBsaXN0ZW5BZGRyZXNzKHZhbHVlOiB1bmtub3duKTogc2hhcmVkT3B0aW9ucy5MaXN0ZW5BZGRyZXNzIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFvYmplY3QuaXNSZWNvcmQodmFsdWUpKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAodmFsdWUuc2NoZW1lID09PSBcInRjcFwiICYmIHR5cGVvZiB2YWx1ZS5ob3N0ID09PSBcInN0cmluZ1wiICYmIHR5cGVvZiB2YWx1ZS5wb3J0ID09PSBcIm51bWJlclwiKSB7XG4gICAgcmV0dXJuIHsgc2NoZW1lOiBcInRjcFwiLCBob3N0OiB2YWx1ZS5ob3N0LCBwb3J0OiB2YWx1ZS5wb3J0IH07XG4gIH1cbiAgaWYgKHZhbHVlLnNjaGVtZSA9PT0gXCJ1bml4XCIgJiYgdHlwZW9mIHZhbHVlLnBhdGggPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4geyBzY2hlbWU6IFwidW5peFwiLCBwYXRoOiB2YWx1ZS5wYXRoIH07XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbiJdfQ==
|
package/package.json
CHANGED
|
@@ -23,8 +23,8 @@
|
|
|
23
23
|
"typescript": "^5.9.3"
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
|
-
"@dbx-tools/core": "^0.9.
|
|
27
|
-
"@dbx-tools/shared-core": "^0.9.
|
|
26
|
+
"@dbx-tools/core": "^0.9.108",
|
|
27
|
+
"@dbx-tools/shared-core": "^0.9.108",
|
|
28
28
|
"commander": "^15.0.0",
|
|
29
29
|
"zod": "4.3.6"
|
|
30
30
|
},
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
"./package.json": "./package.json"
|
|
47
47
|
}
|
|
48
48
|
},
|
|
49
|
-
"version": "0.9.
|
|
49
|
+
"version": "0.9.108",
|
|
50
50
|
"types": "./lib/index.d.ts",
|
|
51
51
|
"dbxToolsConfig": {
|
|
52
52
|
"tags": [
|
package/src/args.ts
CHANGED
|
@@ -11,7 +11,6 @@
|
|
|
11
11
|
import { configUtils } from "@dbx-tools/core";
|
|
12
12
|
import { object, options as sharedOptions, stringUtils } from "@dbx-tools/shared-core";
|
|
13
13
|
import { Command, Option } from "commander";
|
|
14
|
-
import { z } from "zod";
|
|
15
14
|
|
|
16
15
|
/** Layered config lookup used to resolve argument values and help defaults. */
|
|
17
16
|
export type CliArgsOptions = configUtils.ConfigOptions;
|
|
@@ -24,10 +23,20 @@ export interface CliArgMeta {
|
|
|
24
23
|
readonly flag?: boolean;
|
|
25
24
|
/** Set false to keep schema and configured defaults out of generated help. */
|
|
26
25
|
readonly helpDefault?: boolean;
|
|
26
|
+
/** One-character short flag without a dash, or false to disable automatic generation. */
|
|
27
|
+
readonly short?: string | false;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** Structural Zod object contract that remains compatible across Zod v4 minors. */
|
|
31
|
+
export interface CliObjectSchema<
|
|
32
|
+
TOutput extends Readonly<Record<string, unknown>> = Readonly<Record<string, unknown>>,
|
|
33
|
+
> {
|
|
34
|
+
parse(value: unknown): TOutput;
|
|
35
|
+
toJSONSchema(): unknown;
|
|
27
36
|
}
|
|
28
37
|
|
|
29
38
|
/** Zod defaults or concrete option values serialized by {@link serializeArgs}. */
|
|
30
|
-
export type ArgumentSource =
|
|
39
|
+
export type ArgumentSource = CliObjectSchema | Readonly<Record<string, unknown>>;
|
|
31
40
|
|
|
32
41
|
interface JsonField extends CliArgMeta {
|
|
33
42
|
type?: string;
|
|
@@ -48,17 +57,19 @@ interface Field extends CliArgMeta {
|
|
|
48
57
|
const boundOptions = new WeakMap<Command, CliArgsOptions>();
|
|
49
58
|
|
|
50
59
|
/** Register Commander arguments for every enabled field on a Zod object schema. */
|
|
51
|
-
export function addArgs<
|
|
60
|
+
export function addArgs<TSchema extends CliObjectSchema>(
|
|
52
61
|
command: Command,
|
|
53
|
-
schema:
|
|
62
|
+
schema: TSchema,
|
|
54
63
|
options: CliArgsOptions = {},
|
|
55
64
|
): Command {
|
|
56
65
|
boundOptions.set(command, options);
|
|
57
|
-
|
|
66
|
+
const schemaFields = fields(schema);
|
|
67
|
+
const shortFlags = fieldShortFlags(schemaFields);
|
|
68
|
+
for (const field of schemaFields) {
|
|
58
69
|
if (field.flag === false) continue;
|
|
59
70
|
const envKeys = fieldEnvKeys(field);
|
|
60
71
|
const envName = envArgName(field, envKeys, options);
|
|
61
|
-
const flags = argFlags(field);
|
|
72
|
+
const flags = argFlags(field, shortFlags.get(field.key));
|
|
62
73
|
const sourced = configValue(field, envKeys, options);
|
|
63
74
|
const fallback = sourced ?? field.fallback;
|
|
64
75
|
const option = new Option(flags, field.description);
|
|
@@ -87,11 +98,11 @@ export function addArgs<T extends z.ZodRawShape>(
|
|
|
87
98
|
}
|
|
88
99
|
|
|
89
100
|
/** Merge CLI values over layered config, then validate and default through Zod. */
|
|
90
|
-
export function parseArgs<
|
|
101
|
+
export function parseArgs<TSchema extends CliObjectSchema>(
|
|
91
102
|
command: Command,
|
|
92
|
-
schema:
|
|
103
|
+
schema: TSchema,
|
|
93
104
|
options: CliArgsOptions = boundOptions.get(command) ?? {},
|
|
94
|
-
):
|
|
105
|
+
): ReturnType<TSchema["parse"]> {
|
|
95
106
|
const values: Record<string, unknown> = {};
|
|
96
107
|
for (const field of fields(schema)) {
|
|
97
108
|
if (command.getOptionValueSource(field.key) === "cli") {
|
|
@@ -101,12 +112,12 @@ export function parseArgs<T extends z.ZodRawShape>(
|
|
|
101
112
|
const sourced = configValue(field, fieldEnvKeys(field), options);
|
|
102
113
|
if (sourced !== undefined) values[field.key] = sourced;
|
|
103
114
|
}
|
|
104
|
-
return schema.parse(values)
|
|
115
|
+
return schema.parse(values) as ReturnType<TSchema["parse"]>;
|
|
105
116
|
}
|
|
106
117
|
|
|
107
118
|
/** Convert schema defaults or concrete option values into Commander arguments. */
|
|
108
119
|
export function serializeArgs(source: ArgumentSource): string[] {
|
|
109
|
-
if (source
|
|
120
|
+
if (isCliObjectSchema(source)) {
|
|
110
121
|
const values = source.parse({}) as Readonly<Record<string, unknown>>;
|
|
111
122
|
return fields(source).flatMap((field) =>
|
|
112
123
|
field.flag === false ? [] : valueArguments(field.key, values[field.key]),
|
|
@@ -115,8 +126,8 @@ export function serializeArgs(source: ArgumentSource): string[] {
|
|
|
115
126
|
return Object.entries(source).flatMap(([key, value]) => valueArguments(key, value));
|
|
116
127
|
}
|
|
117
128
|
|
|
118
|
-
function fields(schema:
|
|
119
|
-
const document =
|
|
129
|
+
function fields(schema: CliObjectSchema): Field[] {
|
|
130
|
+
const document = schema.toJSONSchema();
|
|
120
131
|
const properties = object.isRecord(document) ? document.properties : undefined;
|
|
121
132
|
if (!object.isRecord(properties)) {
|
|
122
133
|
throw new TypeError("Zod Commander binding requires a z.object() schema");
|
|
@@ -137,13 +148,51 @@ function fields(schema: z.ZodObject<z.ZodRawShape>): Field[] {
|
|
|
137
148
|
env: json.env,
|
|
138
149
|
flag: json.flag,
|
|
139
150
|
helpDefault: json.helpDefault,
|
|
151
|
+
short: json.short,
|
|
140
152
|
};
|
|
141
153
|
});
|
|
142
154
|
}
|
|
143
155
|
|
|
144
|
-
function
|
|
145
|
-
|
|
146
|
-
|
|
156
|
+
function isCliObjectSchema(value: ArgumentSource): value is CliObjectSchema {
|
|
157
|
+
return typeof value.parse === "function" && typeof value.toJSONSchema === "function";
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
function argFlags(field: Field, short: string | undefined): string {
|
|
161
|
+
const long = `--${stringUtils.toSlug(field.key)}`;
|
|
162
|
+
const value = field.type === "boolean" ? "" : " <value>";
|
|
163
|
+
if (short) return `-${short}, ${long}${value}`;
|
|
164
|
+
return `${long}${value}`;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
function fieldShortFlags(fields: readonly Field[]): ReadonlyMap<string, string> {
|
|
168
|
+
const result = new Map<string, string>();
|
|
169
|
+
const reserved = new Map<string, string>([["h", "help"]]);
|
|
170
|
+
for (const field of fields) {
|
|
171
|
+
if (field.short === false || field.short === undefined) continue;
|
|
172
|
+
if (!/^[A-Za-z]$/.test(field.short)) {
|
|
173
|
+
throw new TypeError(`Short flag for "${field.key}" must be one letter or false`);
|
|
174
|
+
}
|
|
175
|
+
const short = field.short.toLowerCase();
|
|
176
|
+
const existing = reserved.get(short);
|
|
177
|
+
if (existing) {
|
|
178
|
+
throw new TypeError(`Short flag -${short} is shared by "${existing}" and "${field.key}"`);
|
|
179
|
+
}
|
|
180
|
+
reserved.set(short, field.key);
|
|
181
|
+
result.set(field.key, short);
|
|
182
|
+
}
|
|
183
|
+
const candidates = new Map<string, Field[]>();
|
|
184
|
+
for (const field of fields) {
|
|
185
|
+
if (field.short !== undefined) continue;
|
|
186
|
+
const short = [...stringUtils.tokenize(field.key)][0]?.[0]?.toLowerCase();
|
|
187
|
+
if (!short || reserved.has(short)) continue;
|
|
188
|
+
const matching = candidates.get(short) ?? [];
|
|
189
|
+
matching.push(field);
|
|
190
|
+
candidates.set(short, matching);
|
|
191
|
+
}
|
|
192
|
+
for (const [short, matching] of candidates) {
|
|
193
|
+
if (matching.length === 1) result.set(matching[0]!.key, short);
|
|
194
|
+
}
|
|
195
|
+
return result;
|
|
147
196
|
}
|
|
148
197
|
|
|
149
198
|
function fieldEnvKeys(field: Field): readonly string[] {
|