@lowlighter/is 1.3.3

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 ADDED
@@ -0,0 +1,33 @@
1
+ # 🪪 Is
2
+
3
+ [![JSR](https://jsr.io/badges/@libs/is)](https://jsr.io/@libs/is) [![JSR Score](https://jsr.io/badges/@libs/is/score)](https://jsr.io/@libs/is)
4
+
5
+ A wrapper around [Zod](https://zod.dev/) to ease type validation and assertions.
6
+
7
+ It also contains some additional validators, in addition to a spec checker.
8
+
9
+ - [`📚 Documentation`](https://jsr.io/@libs/is/doc)
10
+
11
+ ## 📖 Usage
12
+
13
+ ```ts
14
+ import { coerce, duration, is, parse, url } from "@libs/is"
15
+
16
+ // `is` re-exports Zod, augmented with additional validators and transformers
17
+ const schema = is.object({
18
+ origin: url,
19
+ timeout: duration(is.number().min(0)),
20
+ retries: coerce(is.number().int().nonnegative()).default(3),
21
+ })
22
+
23
+ // `parse()` works like `schema.parse()` but throws a `TypeError` with prettified issues instead of a `ZodError`
24
+ parse(schema, { origin: "https://example.com", timeout: "1m 30s", retries: "5" })
25
+ // { origin: "https://example.com", timeout: 90000, retries: 5 }
26
+ ```
27
+
28
+ ## 📜 License
29
+
30
+ ```plaintext
31
+ Copyright (c) Simon Lecoq <@lowlighter>. (MIT License)
32
+ https://github.com/lowlighter/libs/blob/main/LICENSE
33
+ ```
package/is.d.ts ADDED
@@ -0,0 +1,40 @@
1
+ import type { ParseOptions as ParseArgsOptions } from "@std/cli/parse-args";
2
+ import * as is from "@zod/zod";
3
+ export * as is from "@zod/zod";
4
+ export type * from "@zod/zod";
5
+ /** Coalesces a parsed value to `undefined` so schema defaults can be applied. */ export declare function coalesce<T extends is.ZodType>(schema: T): is.ZodPreprocess<T>;
6
+ /** Coerces a parsed value into `number` type when possible. */ export declare function coerce<T extends is.ZodType>(schema: T): is.ZodPreprocess<T>;
7
+ /** Allows the `null` value and makes it the default value in schemas. */ export declare function nullable<T extends is.ZodType>(schema: T): is.ZodDefault<is.ZodNullable<T>>;
8
+ /** Ensures a parsed value is compatible with `structuredClone` algorithm. */ export declare function clonable<T extends is.ZodType>(schema: T): is.ZodPreprocess<T>;
9
+ /** Transforms a parsed value into an array if it is not already one. */ export declare function arrayable<T extends is.ZodType>(schema: T): is.ZodPreprocess<T>;
10
+ /** Transforms a CLI arguments string into an object or array. */ export declare function cliable<T extends is.ZodType>(schema: T, options?: ParseArgsOptions): is.ZodPreprocess<T>;
11
+ /** Parses a regular expression back into a `RegExp`. */ export declare function regex<T extends is.ZodType>(schema: T): is.ZodPreprocess<T>;
12
+ /** Parses a date string back into a `Date`. */ export declare function date<T extends is.ZodType>(schema: T): is.ZodPreprocess<T>;
13
+ /** Parses a duration string into milliseconds. */ export declare function duration<T extends is.ZodType>(schema: T): is.ZodPreprocess<T>;
14
+ /** Type alias for primitive values. */ export declare const primitive: is.ZodUnion<readonly [is.ZodString, is.ZodNumber, is.ZodBigInt, is.ZodBoolean, is.ZodUndefined, is.ZodNull, is.ZodDate, is.ZodCustom<Error, Error>]>;
15
+ /** Type alias for typed arrays. */ export declare const typedArray: is.ZodUnion<readonly [is.ZodCustom<Int8Array, Int8Array>, is.ZodCustom<Uint8Array, Uint8Array>, is.ZodCustom<Uint8ClampedArray, Uint8ClampedArray>, is.ZodCustom<Int16Array, Int16Array>, is.ZodCustom<Uint16Array, Uint16Array>, is.ZodCustom<Int32Array, Int32Array>, is.ZodCustom<Uint32Array, Uint32Array>, is.ZodCustom<Float16Array, Float16Array>, is.ZodCustom<Float32Array, Float32Array>, is.ZodCustom<Float64Array, Float64Array>, is.ZodCustom<BigInt64Array, BigInt64Array>, is.ZodCustom<BigUint64Array, BigUint64Array>]>;
16
+ /** Type alias for URLs with supported protocols. */ export declare const url: is.ZodURL & {
17
+ /** Create a new type alias for URLs with additional custom supported protocols. */ with(additional: string[], params?: Omit<is.z.core.$ZodURLParams, "protocol">): is.ZodURL;
18
+ };
19
+ /** Type alias for body init. */ export declare const bodyInit: is.ZodNullable<is.ZodUnion<readonly [is.ZodString, is.ZodCustom<String, String>, is.ZodCustom<Blob, Blob>, is.ZodCustom<ArrayBuffer, ArrayBuffer>, is.ZodCustom<DataView, DataView>, is.ZodCustom<FormData, FormData>, is.ZodCustom<ReadableStream, ReadableStream>, is.ZodCustom<URLSearchParams, URLSearchParams>, typeof typedArray]>>;
20
+ /** Type alias factory for permissions object. */ export declare function permissions<T extends keyof Deno.PermissionOptionsObject>(options?: {
21
+ set?: T[];
22
+ expand?: false;
23
+ }): is.ZodUnion<readonly [is.ZodObject<Record<T, is.ZodOptional<is.ZodPreprocess<is.ZodUnion<[is.ZodLiteral<"inherit">, is.ZodBoolean, is.ZodArray<is.ZodString>]>>>>>, is.ZodUnion<readonly [is.ZodLiteral<"inherit">, is.ZodLiteral<"none">]>]>;
24
+ /** Type alias factory for permissions object. */ export declare function permissions<T extends keyof Deno.PermissionOptionsObject>(options: {
25
+ set?: T[];
26
+ expand: true;
27
+ }): is.ZodPreprocess<is.ZodObject<Record<T, is.ZodPreprocess<is.ZodUnion<[is.ZodLiteral<"inherit">, is.ZodLiteral<true>, is.ZodArray<is.ZodString>]>>>>>;
28
+ /** Type alias for expression strings. */ export declare const expression: is.ZodString;
29
+ /** Type alias for callable values. */ export declare const callable: is.ZodCustom<Function, unknown>;
30
+ /** Type alias for Zod schemas. */ export declare const parser: is.ZodCustom<is.ZodType, unknown>;
31
+ /** Options for {@linkcode parse()}. */ export type ParseOptions = {
32
+ /** Whether to parse asynchronously. */ async?: boolean;
33
+ /** Whether to throw a `ZodError` rather than a `TypeError` in case of failure */ zodError?: boolean;
34
+ };
35
+ /** Parse a schema synchronously. */ export declare function parse<T extends is.ZodType>(schema: T, values: unknown, options?: Omit<ParseOptions, "async"> & {
36
+ async?: false;
37
+ }): is.infer<T>;
38
+ /** Parse a schema asynchronously. */ export declare function parse<T extends is.ZodType>(schema: T, values: unknown, options: Omit<ParseOptions, "async"> & {
39
+ async: true;
40
+ }): Promise<is.infer<T>>;
package/is.js ADDED
@@ -0,0 +1,338 @@
1
+ // Imports
2
+ // deno-lint-ignore-file no-explicit-any ban-types
3
+ import { parseArgs } from "@std/cli/parse-args";
4
+ import * as is from "@zod/zod";
5
+ export * as is from "@zod/zod";
6
+ /** Coalesces a parsed value to `undefined` so schema defaults can be applied. */ export function coalesce(schema) {
7
+ return is.preprocess((value)=>{
8
+ return value ?? undefined;
9
+ }, schema);
10
+ }
11
+ /** Coerces a parsed value into `number` type when possible. */ export function coerce(schema) {
12
+ return is.preprocess((value)=>{
13
+ if (typeof value === "string") {
14
+ const coerced = Number(value);
15
+ if (!Number.isNaN(coerced) || value === "NaN") return coerced;
16
+ }
17
+ return value;
18
+ }, schema);
19
+ }
20
+ /** Allows the `null` value and makes it the default value in schemas. */ export function nullable(schema) {
21
+ return schema.nullable().default(null);
22
+ }
23
+ /** Ensures a parsed value is compatible with `structuredClone` algorithm. */ export function clonable(schema) {
24
+ return is.preprocess((value, context)=>{
25
+ try {
26
+ structuredClone(value);
27
+ } catch (error) {
28
+ context.addIssue(`Invalid input: Value must be compatible with structuredClone algorithm: ${error}`);
29
+ }
30
+ return value;
31
+ }, schema);
32
+ }
33
+ /** Transforms a parsed value into an array if it is not already one. */ export function arrayable(schema) {
34
+ return is.preprocess((value)=>{
35
+ if (!Array.isArray(value)) return [
36
+ value
37
+ ];
38
+ return value;
39
+ }, schema);
40
+ }
41
+ /** Transforms a CLI arguments string into an object or array. */ export function cliable(schema, options) {
42
+ return is.preprocess((value, context)=>{
43
+ if (typeof value === "string") {
44
+ const args = [];
45
+ let current = "";
46
+ let quoted = "";
47
+ let escape = false;
48
+ let quotes = false;
49
+ for (const char of value){
50
+ if (escape) {
51
+ current += char;
52
+ escape = false;
53
+ continue;
54
+ }
55
+ if (quoted === '"' && char === "\\") {
56
+ escape = true;
57
+ continue;
58
+ }
59
+ if (!quoted && (char === '"' || char === "'")) {
60
+ quoted = char;
61
+ quotes = true;
62
+ continue;
63
+ }
64
+ if (quoted === char) {
65
+ quoted = "";
66
+ continue;
67
+ }
68
+ if (!quoted && char === " ") {
69
+ if (current || quotes) {
70
+ args.push(current);
71
+ current = "";
72
+ quotes = false;
73
+ }
74
+ continue;
75
+ }
76
+ current += char;
77
+ }
78
+ if (quoted) {
79
+ context.addIssue(`Unclosed quote: ${quoted}${current}`);
80
+ return value;
81
+ }
82
+ if (current || quotes) args.push(current);
83
+ return options ? parseArgs(args, options) : args;
84
+ }
85
+ return value;
86
+ }, schema);
87
+ }
88
+ /** Parses a regular expression back into a `RegExp`. */ export function regex(schema) {
89
+ const definition = /^\/(?<pattern>.*?)\/(?<flags>[dgimsuvy]*)$/s;
90
+ return is.preprocess((value)=>{
91
+ if (typeof value === "string") {
92
+ const groups = value.match(definition)?.groups;
93
+ if (groups) {
94
+ const { pattern, flags } = groups;
95
+ try {
96
+ return new RegExp(pattern, flags);
97
+ } catch {
98
+ return value;
99
+ }
100
+ }
101
+ }
102
+ return value;
103
+ }, schema);
104
+ }
105
+ /** Parses a date string back into a `Date`. */ export function date(schema) {
106
+ return is.preprocess((value)=>{
107
+ if (typeof value === "string") {
108
+ const date = new Date(value);
109
+ if (!Number.isNaN(date.getTime())) return date;
110
+ }
111
+ return value;
112
+ }, schema);
113
+ }
114
+ /** Parses a duration string into milliseconds. */ export function duration(schema) {
115
+ return is.preprocess((value)=>{
116
+ if (typeof value === "string") {
117
+ const groups = value.match(/^\s*(?:(?<days>\d+)d(?:ays?)?)?\s*(?:(?<hours>\d+)h(?:(?:ou)?rs?)?)?\s*(?:(?<minutes>\d+)m(?:in(?:ute)?s?)?)?\s*(?:(?<seconds>\d+)s(?:ec(?:ond)?s?)?)?\s*(?:(?<milliseconds>\d+)(?:m(?:illi)?s(?:ec(?:ond)?s?)?)?)?\s*$/)?.groups;
118
+ if (groups) {
119
+ let { days = 0, hours = 0, minutes = 0, seconds = 0, milliseconds = 0 } = Object.fromEntries(Object.entries(groups).map(([key, value])=>[
120
+ key,
121
+ Number(value)
122
+ ]).filter(([_, value])=>Number.isFinite(value)));
123
+ hours += days * 24;
124
+ minutes += hours * 60;
125
+ seconds += minutes * 60;
126
+ milliseconds += seconds * 1000;
127
+ return milliseconds;
128
+ }
129
+ }
130
+ return value;
131
+ }, schema);
132
+ }
133
+ /** Type alias for primitive values. */ export const primitive = is.union([
134
+ is.string(),
135
+ is.number(),
136
+ is.bigint(),
137
+ is.boolean(),
138
+ is.undefined(),
139
+ is.null(),
140
+ is.date(),
141
+ is.instanceof(Error)
142
+ ]);
143
+ /** Type alias for typed arrays. */ export const typedArray = is.union([
144
+ is.instanceof(Int8Array),
145
+ is.instanceof(Uint8Array),
146
+ is.instanceof(Uint8ClampedArray),
147
+ is.instanceof(Int16Array),
148
+ is.instanceof(Uint16Array),
149
+ is.instanceof(Int32Array),
150
+ is.instanceof(Uint32Array),
151
+ is.instanceof(Float16Array),
152
+ is.instanceof(Float32Array),
153
+ is.instanceof(Float64Array),
154
+ is.instanceof(BigInt64Array),
155
+ is.instanceof(BigUint64Array)
156
+ ]);
157
+ /** Supported protocols for {@linkcode url} type alias. */ const protocols = [
158
+ "https?",
159
+ "file",
160
+ "wasm",
161
+ "data",
162
+ "blob",
163
+ "jsr",
164
+ "npm"
165
+ ];
166
+ /** Type alias for URLs with supported protocols. */ export const url = Object.assign(is.url({
167
+ protocol: new RegExp(`^(?:${protocols.join("|")})$`),
168
+ hostname: /.*/
169
+ }), {
170
+ with (additional, { hostname = /.*/, ...options } = {}) {
171
+ const escaped = additional.map((protocol)=>protocol.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"));
172
+ return is.url({
173
+ ...options,
174
+ protocol: new RegExp(`^(?:${[
175
+ ...protocols,
176
+ ...escaped
177
+ ].join("|")})$`),
178
+ hostname
179
+ });
180
+ }
181
+ });
182
+ /** Type alias for body init. */ export const bodyInit = is.union([
183
+ is.string(),
184
+ is.instanceof(String),
185
+ is.instanceof(Blob),
186
+ is.instanceof(ArrayBuffer),
187
+ is.instanceof(DataView),
188
+ is.instanceof(FormData),
189
+ is.instanceof(ReadableStream),
190
+ is.instanceof(URLSearchParams),
191
+ typedArray
192
+ ]).nullable();
193
+ /**
194
+ * System permissions flags.
195
+ *
196
+ * See {@link https://docs.deno.com/runtime/fundamentals/security/#system-information}.
197
+ */ const sysflags = [
198
+ "hostname",
199
+ "osRelease",
200
+ "osUptime",
201
+ "loadavg",
202
+ "networkInterfaces",
203
+ "systemMemoryInfo",
204
+ "uid",
205
+ "gid"
206
+ ];
207
+ /** Type alias factory for permission descriptors. */ function permission({ expand = false, urls = false, sys = false } = {}) {
208
+ return is.preprocess((value)=>{
209
+ if (value === "inherit") return value;
210
+ if (typeof value === "string") value = [
211
+ value
212
+ ];
213
+ if (expand) {
214
+ if (value === undefined || value === false) value = [];
215
+ }
216
+ if (urls && Array.isArray(value)) value = value.map((value)=>value instanceof URL ? value.href : value);
217
+ return value;
218
+ }, is.union([
219
+ is.literal("inherit"),
220
+ is.boolean(),
221
+ is.array(sys ? is.enum(sysflags) : is.string())
222
+ ]));
223
+ }
224
+ export function permissions({ set = [
225
+ "read",
226
+ "write",
227
+ "net",
228
+ "env",
229
+ "run",
230
+ "sys",
231
+ "ffi",
232
+ "import"
233
+ ], expand = false } = {}) {
234
+ const validator = is.object({
235
+ read: permission({
236
+ expand,
237
+ urls: true
238
+ }),
239
+ write: permission({
240
+ expand,
241
+ urls: true
242
+ }),
243
+ net: permission({
244
+ expand
245
+ }),
246
+ env: permission({
247
+ expand
248
+ }),
249
+ sys: permission({
250
+ expand,
251
+ sys: true
252
+ }),
253
+ run: permission({
254
+ expand,
255
+ urls: true
256
+ }),
257
+ ffi: permission({
258
+ expand,
259
+ urls: true
260
+ }),
261
+ import: permission({
262
+ expand
263
+ })
264
+ }).pick(Object.fromEntries(set.map((key)=>[
265
+ key,
266
+ true
267
+ ]))).strict();
268
+ // Return either the compact or expanded version
269
+ if (!expand) return validator.partial().or(is.union([
270
+ is.literal("inherit"),
271
+ is.literal("none")
272
+ ]));
273
+ return is.preprocess((value)=>{
274
+ if (value === "inherit" || value === "none") return Object.fromEntries(set.map((key)=>[
275
+ key,
276
+ value === "none" ? [] : value
277
+ ]));
278
+ if (typeof value === "string") value = [
279
+ value
280
+ ];
281
+ if (Array.isArray(value)) return {
282
+ ...Object.fromEntries(set.map((permission)=>[
283
+ permission,
284
+ false
285
+ ])),
286
+ ...Object.fromEntries(value.map((permission)=>[
287
+ permission,
288
+ "inherit"
289
+ ]))
290
+ };
291
+ return value;
292
+ }, validator);
293
+ }
294
+ /** Type alias for expression strings. */ export const expression = is.string().regex(/\$\{.*\}/);
295
+ /** Type alias for callable values. */ export const callable = is.unknown().refine((value)=>typeof value === "function", {
296
+ message: "Invalid input: Value must be callable"
297
+ });
298
+ /** Type alias for Zod schemas. */ export const parser = is.custom((value)=>value instanceof is.ZodType || value && typeof value === "object" && typeof value.parse === "function", {
299
+ message: "Invalid input: Value must be a Zod schema"
300
+ });
301
+ /** Convert a property key path to a string. */ function toPath(path = []) {
302
+ const segments = [];
303
+ for (const segment of path){
304
+ if (typeof segment === "number") segments.push(`[${segment}]`);
305
+ else if (typeof segment === "symbol" || /[^\w$]/.test(String(segment))) segments.push(`[${JSON.stringify(String(segment))}]`);
306
+ else segments.push(`.${segment}`);
307
+ }
308
+ return segments.join("");
309
+ }
310
+ /** Prettify validation issues in a more detailed way. */ function prettifyIssue(errors, { indent = "" } = {}) {
311
+ const lines = [];
312
+ errors = [
313
+ ...errors
314
+ ].sort((a, b)=>(a.path ?? []).length - (b.path ?? []).length);
315
+ for (const error of errors){
316
+ lines.push(`${indent}✘ ${error.message}`);
317
+ if (error.path?.length) lines.push(`${indent} → at ${toPath(error.path)}`);
318
+ if (error.errors?.length) {
319
+ lines.push(`${indent} → tried to fit into one of the allowed types:`);
320
+ for (const suberror of error.errors)lines.push(prettifyIssue(suberror, {
321
+ indent: `${indent} `
322
+ }).replace(" ✘", "- ✘"));
323
+ }
324
+ }
325
+ return lines.join("\n");
326
+ }
327
+ export function parse(schema, values, { async = false, zodError } = {}) {
328
+ try {
329
+ return async ? schema.parseAsync(values).catch((error)=>{
330
+ if (!(error instanceof is.ZodError) || zodError) throw error;
331
+ throw new TypeError(`Validation failed: \n${prettifyIssue(error.issues)}`);
332
+ }) : schema.parse(values);
333
+ } catch (error) {
334
+ if (!(error instanceof is.ZodError) || zodError) throw error;
335
+ throw new TypeError(`Validation failed: \n${prettifyIssue(error.issues)}`);
336
+ }
337
+ }
338
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZpbGU6Ly8vaG9tZS9ydW5uZXIvd29yay9saWJzL2xpYnMvQGxpYnMvaXMvaXMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gSW1wb3J0c1xuLy8gZGVuby1saW50LWlnbm9yZS1maWxlIG5vLWV4cGxpY2l0LWFueSBiYW4tdHlwZXNcbmltcG9ydCB0eXBlIHsgUGFyc2VPcHRpb25zIGFzIFBhcnNlQXJnc09wdGlvbnMgfSBmcm9tIFwiQHN0ZC9jbGkvcGFyc2UtYXJnc1wiXG5pbXBvcnQgeyBwYXJzZUFyZ3MgfSBmcm9tIFwiQHN0ZC9jbGkvcGFyc2UtYXJnc1wiXG5pbXBvcnQgKiBhcyBpcyBmcm9tIFwiQHpvZC96b2RcIlxuZXhwb3J0ICogYXMgaXMgZnJvbSBcIkB6b2Qvem9kXCJcbmV4cG9ydCB0eXBlICogZnJvbSBcIkB6b2Qvem9kXCJcblxuLyoqIENvYWxlc2NlcyBhIHBhcnNlZCB2YWx1ZSB0byBgdW5kZWZpbmVkYCBzbyBzY2hlbWEgZGVmYXVsdHMgY2FuIGJlIGFwcGxpZWQuICovXG5leHBvcnQgZnVuY3Rpb24gY29hbGVzY2U8VCBleHRlbmRzIGlzLlpvZFR5cGU+KHNjaGVtYTogVCk6IGlzLlpvZFByZXByb2Nlc3M8VD4ge1xuICByZXR1cm4gaXMucHJlcHJvY2VzcygodmFsdWUpID0+IHtcbiAgICByZXR1cm4gdmFsdWUgPz8gdW5kZWZpbmVkXG4gIH0sIHNjaGVtYSlcbn1cblxuLyoqIENvZXJjZXMgYSBwYXJzZWQgdmFsdWUgaW50byBgbnVtYmVyYCB0eXBlIHdoZW4gcG9zc2libGUuICovXG5leHBvcnQgZnVuY3Rpb24gY29lcmNlPFQgZXh0ZW5kcyBpcy5ab2RUeXBlPihzY2hlbWE6IFQpOiBpcy5ab2RQcmVwcm9jZXNzPFQ+IHtcbiAgcmV0dXJuIGlzLnByZXByb2Nlc3MoKHZhbHVlKSA9PiB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgY29uc3QgY29lcmNlZCA9IE51bWJlcih2YWx1ZSlcbiAgICAgIGlmICgoIU51bWJlci5pc05hTihjb2VyY2VkKSkgfHwgKHZhbHVlID09PSBcIk5hTlwiKSlcbiAgICAgICAgcmV0dXJuIGNvZXJjZWRcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlXG4gIH0sIHNjaGVtYSlcbn1cblxuLyoqIEFsbG93cyB0aGUgYG51bGxgIHZhbHVlIGFuZCBtYWtlcyBpdCB0aGUgZGVmYXVsdCB2YWx1ZSBpbiBzY2hlbWFzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG51bGxhYmxlPFQgZXh0ZW5kcyBpcy5ab2RUeXBlPihzY2hlbWE6IFQpOiBpcy5ab2REZWZhdWx0PGlzLlpvZE51bGxhYmxlPFQ+PiB7XG4gIHJldHVybiBzY2hlbWEubnVsbGFibGUoKS5kZWZhdWx0KG51bGwpXG59XG5cbi8qKiBFbnN1cmVzIGEgcGFyc2VkIHZhbHVlIGlzIGNvbXBhdGlibGUgd2l0aCBgc3RydWN0dXJlZENsb25lYCBhbGdvcml0aG0uICovXG5leHBvcnQgZnVuY3Rpb24gY2xvbmFibGU8VCBleHRlbmRzIGlzLlpvZFR5cGU+KHNjaGVtYTogVCk6IGlzLlpvZFByZXByb2Nlc3M8VD4ge1xuICByZXR1cm4gaXMucHJlcHJvY2VzcygodmFsdWUsIGNvbnRleHQpID0+IHtcbiAgICB0cnkge1xuICAgICAgc3RydWN0dXJlZENsb25lKHZhbHVlKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb250ZXh0LmFkZElzc3VlKGBJbnZhbGlkIGlucHV0OiBWYWx1ZSBtdXN0IGJlIGNvbXBhdGlibGUgd2l0aCBzdHJ1Y3R1cmVkQ2xvbmUgYWxnb3JpdGhtOiAke2Vycm9yfWApXG4gICAgfVxuICAgIHJldHVybiB2YWx1ZVxuICB9LCBzY2hlbWEpXG59XG5cbi8qKiBUcmFuc2Zvcm1zIGEgcGFyc2VkIHZhbHVlIGludG8gYW4gYXJyYXkgaWYgaXQgaXMgbm90IGFscmVhZHkgb25lLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFycmF5YWJsZTxUIGV4dGVuZHMgaXMuWm9kVHlwZT4oc2NoZW1hOiBUKTogaXMuWm9kUHJlcHJvY2VzczxUPiB7XG4gIHJldHVybiBpcy5wcmVwcm9jZXNzKCh2YWx1ZSkgPT4ge1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpXG4gICAgICByZXR1cm4gW3ZhbHVlXVxuICAgIHJldHVybiB2YWx1ZVxuICB9LCBzY2hlbWEpXG59XG5cbi8qKiBUcmFuc2Zvcm1zIGEgQ0xJIGFyZ3VtZW50cyBzdHJpbmcgaW50byBhbiBvYmplY3Qgb3IgYXJyYXkuICovXG5leHBvcnQgZnVuY3Rpb24gY2xpYWJsZTxUIGV4dGVuZHMgaXMuWm9kVHlwZT4oc2NoZW1hOiBULCBvcHRpb25zPzogUGFyc2VBcmdzT3B0aW9ucyk6IGlzLlpvZFByZXByb2Nlc3M8VD4ge1xuICByZXR1cm4gaXMucHJlcHJvY2VzcygodmFsdWUsIGNvbnRleHQpID0+IHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBjb25zdCBhcmdzID0gW11cbiAgICAgIGxldCBjdXJyZW50ID0gXCJcIlxuICAgICAgbGV0IHF1b3RlZCA9IFwiXCJcbiAgICAgIGxldCBlc2NhcGUgPSBmYWxzZVxuICAgICAgbGV0IHF1b3RlcyA9IGZhbHNlXG4gICAgICBmb3IgKGNvbnN0IGNoYXIgb2YgdmFsdWUpIHtcbiAgICAgICAgaWYgKGVzY2FwZSkge1xuICAgICAgICAgIGN1cnJlbnQgKz0gY2hhclxuICAgICAgICAgIGVzY2FwZSA9IGZhbHNlXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgICBpZiAoKHF1b3RlZCA9PT0gJ1wiJykgJiYgKGNoYXIgPT09IFwiXFxcXFwiKSkge1xuICAgICAgICAgIGVzY2FwZSA9IHRydWVcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIGlmICgoIXF1b3RlZCkgJiYgKChjaGFyID09PSAnXCInKSB8fCAoY2hhciA9PT0gXCInXCIpKSkge1xuICAgICAgICAgIHF1b3RlZCA9IGNoYXJcbiAgICAgICAgICBxdW90ZXMgPSB0cnVlXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgICBpZiAocXVvdGVkID09PSBjaGFyKSB7XG4gICAgICAgICAgcXVvdGVkID0gXCJcIlxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgICAgaWYgKCghcXVvdGVkKSAmJiAoY2hhciA9PT0gXCIgXCIpKSB7XG4gICAgICAgICAgaWYgKGN1cnJlbnQgfHwgcXVvdGVzKSB7XG4gICAgICAgICAgICBhcmdzLnB1c2goY3VycmVudClcbiAgICAgICAgICAgIGN1cnJlbnQgPSBcIlwiXG4gICAgICAgICAgICBxdW90ZXMgPSBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnQgKz0gY2hhclxuICAgICAgfVxuICAgICAgaWYgKHF1b3RlZCkge1xuICAgICAgICBjb250ZXh0LmFkZElzc3VlKGBVbmNsb3NlZCBxdW90ZTogJHtxdW90ZWR9JHtjdXJyZW50fWApXG4gICAgICAgIHJldHVybiB2YWx1ZVxuICAgICAgfVxuICAgICAgaWYgKGN1cnJlbnQgfHwgcXVvdGVzKVxuICAgICAgICBhcmdzLnB1c2goY3VycmVudClcbiAgICAgIHJldHVybiBvcHRpb25zID8gcGFyc2VBcmdzKGFyZ3MsIG9wdGlvbnMpIDogYXJnc1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWVcbiAgfSwgc2NoZW1hKVxufVxuXG4vKiogUGFyc2VzIGEgcmVndWxhciBleHByZXNzaW9uIGJhY2sgaW50byBhIGBSZWdFeHBgLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2V4PFQgZXh0ZW5kcyBpcy5ab2RUeXBlPihzY2hlbWE6IFQpOiBpcy5ab2RQcmVwcm9jZXNzPFQ+IHtcbiAgY29uc3QgZGVmaW5pdGlvbiA9IC9eXFwvKD88cGF0dGVybj4uKj8pXFwvKD88ZmxhZ3M+W2RnaW1zdXZ5XSopJC9zXG4gIHJldHVybiBpcy5wcmVwcm9jZXNzKCh2YWx1ZSkgPT4ge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGNvbnN0IGdyb3VwcyA9IHZhbHVlLm1hdGNoKGRlZmluaXRpb24pPy5ncm91cHNcbiAgICAgIGlmIChncm91cHMpIHtcbiAgICAgICAgY29uc3QgeyBwYXR0ZXJuLCBmbGFncyB9ID0gZ3JvdXBzXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAocGF0dGVybiwgZmxhZ3MpXG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHJldHVybiB2YWx1ZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZVxuICB9LCBzY2hlbWEpXG59XG5cbi8qKiBQYXJzZXMgYSBkYXRlIHN0cmluZyBiYWNrIGludG8gYSBgRGF0ZWAuICovXG5leHBvcnQgZnVuY3Rpb24gZGF0ZTxUIGV4dGVuZHMgaXMuWm9kVHlwZT4oc2NoZW1hOiBUKTogaXMuWm9kUHJlcHJvY2VzczxUPiB7XG4gIHJldHVybiBpcy5wcmVwcm9jZXNzKCh2YWx1ZSkgPT4ge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh2YWx1ZSlcbiAgICAgIGlmICghTnVtYmVyLmlzTmFOKGRhdGUuZ2V0VGltZSgpKSlcbiAgICAgICAgcmV0dXJuIGRhdGVcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlXG4gIH0sIHNjaGVtYSlcbn1cblxuLyoqIFBhcnNlcyBhIGR1cmF0aW9uIHN0cmluZyBpbnRvIG1pbGxpc2Vjb25kcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkdXJhdGlvbjxUIGV4dGVuZHMgaXMuWm9kVHlwZT4oc2NoZW1hOiBUKTogaXMuWm9kUHJlcHJvY2VzczxUPiB7XG4gIHJldHVybiBpcy5wcmVwcm9jZXNzKCh2YWx1ZSkgPT4ge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGNvbnN0IGdyb3VwcyA9IHZhbHVlLm1hdGNoKC9eXFxzKig/Oig/PGRheXM+XFxkKylkKD86YXlzPyk/KT9cXHMqKD86KD88aG91cnM+XFxkKyloKD86KD86b3UpP3JzPyk/KT9cXHMqKD86KD88bWludXRlcz5cXGQrKW0oPzppbig/OnV0ZSk/cz8pPyk/XFxzKig/Oig/PHNlY29uZHM+XFxkKylzKD86ZWMoPzpvbmQpP3M/KT8pP1xccyooPzooPzxtaWxsaXNlY29uZHM+XFxkKykoPzptKD86aWxsaSk/cyg/OmVjKD86b25kKT9zPyk/KT8pP1xccyokLyk/Lmdyb3Vwc1xuICAgICAgaWYgKGdyb3Vwcykge1xuICAgICAgICBsZXQgeyBkYXlzID0gMCwgaG91cnMgPSAwLCBtaW51dGVzID0gMCwgc2Vjb25kcyA9IDAsIG1pbGxpc2Vjb25kcyA9IDAgfSA9IE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhncm91cHMpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBba2V5LCBOdW1iZXIodmFsdWUpXSkuZmlsdGVyKChbXywgdmFsdWVdKSA9PiBOdW1iZXIuaXNGaW5pdGUodmFsdWUpKSlcbiAgICAgICAgaG91cnMgKz0gZGF5cyAqIDI0XG4gICAgICAgIG1pbnV0ZXMgKz0gaG91cnMgKiA2MFxuICAgICAgICBzZWNvbmRzICs9IG1pbnV0ZXMgKiA2MFxuICAgICAgICBtaWxsaXNlY29uZHMgKz0gc2Vjb25kcyAqIDEwMDBcbiAgICAgICAgcmV0dXJuIG1pbGxpc2Vjb25kc1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmFsdWVcbiAgfSwgc2NoZW1hKVxufVxuXG4vKiogVHlwZSBhbGlhcyBmb3IgcHJpbWl0aXZlIHZhbHVlcy4gKi9cbmV4cG9ydCBjb25zdCBwcmltaXRpdmUgPSBpcy51bmlvbihbaXMuc3RyaW5nKCksIGlzLm51bWJlcigpLCBpcy5iaWdpbnQoKSwgaXMuYm9vbGVhbigpLCBpcy51bmRlZmluZWQoKSwgaXMubnVsbCgpLCBpcy5kYXRlKCksIGlzLmluc3RhbmNlb2YoRXJyb3IpXSkgYXMgaXMuWm9kVW5pb248XG4gIHJlYWRvbmx5IFtpcy5ab2RTdHJpbmcsIGlzLlpvZE51bWJlciwgaXMuWm9kQmlnSW50LCBpcy5ab2RCb29sZWFuLCBpcy5ab2RVbmRlZmluZWQsIGlzLlpvZE51bGwsIGlzLlpvZERhdGUsIGlzLlpvZEN1c3RvbTxFcnJvciwgRXJyb3I+XVxuPlxuXG4vKiogVHlwZSBhbGlhcyBmb3IgdHlwZWQgYXJyYXlzLiAqL1xuZXhwb3J0IGNvbnN0IHR5cGVkQXJyYXkgPSBpcy51bmlvbihbXG4gIGlzLmluc3RhbmNlb2YoSW50OEFycmF5KSxcbiAgaXMuaW5zdGFuY2VvZihVaW50OEFycmF5KSxcbiAgaXMuaW5zdGFuY2VvZihVaW50OENsYW1wZWRBcnJheSksXG4gIGlzLmluc3RhbmNlb2YoSW50MTZBcnJheSksXG4gIGlzLmluc3RhbmNlb2YoVWludDE2QXJyYXkpLFxuICBpcy5pbnN0YW5jZW9mKEludDMyQXJyYXkpLFxuICBpcy5pbnN0YW5jZW9mKFVpbnQzMkFycmF5KSxcbiAgaXMuaW5zdGFuY2VvZihGbG9hdDE2QXJyYXkpLFxuICBpcy5pbnN0YW5jZW9mKEZsb2F0MzJBcnJheSksXG4gIGlzLmluc3RhbmNlb2YoRmxvYXQ2NEFycmF5KSxcbiAgaXMuaW5zdGFuY2VvZihCaWdJbnQ2NEFycmF5KSxcbiAgaXMuaW5zdGFuY2VvZihCaWdVaW50NjRBcnJheSksXG5dKSBhcyBpcy5ab2RVbmlvbjxcbiAgcmVhZG9ubHkgW1xuICAgIGlzLlpvZEN1c3RvbTxJbnQ4QXJyYXksIEludDhBcnJheT4sXG4gICAgaXMuWm9kQ3VzdG9tPFVpbnQ4QXJyYXksIFVpbnQ4QXJyYXk+LFxuICAgIGlzLlpvZEN1c3RvbTxVaW50OENsYW1wZWRBcnJheSwgVWludDhDbGFtcGVkQXJyYXk+LFxuICAgIGlzLlpvZEN1c3RvbTxJbnQxNkFycmF5LCBJbnQxNkFycmF5PixcbiAgICBpcy5ab2RDdXN0b208VWludDE2QXJyYXksIFVpbnQxNkFycmF5PixcbiAgICBpcy5ab2RDdXN0b208SW50MzJBcnJheSwgSW50MzJBcnJheT4sXG4gICAgaXMuWm9kQ3VzdG9tPFVpbnQzMkFycmF5LCBVaW50MzJBcnJheT4sXG4gICAgaXMuWm9kQ3VzdG9tPEZsb2F0MTZBcnJheSwgRmxvYXQxNkFycmF5PixcbiAgICBpcy5ab2RDdXN0b208RmxvYXQzMkFycmF5LCBGbG9hdDMyQXJyYXk+LFxuICAgIGlzLlpvZEN1c3RvbTxGbG9hdDY0QXJyYXksIEZsb2F0NjRBcnJheT4sXG4gICAgaXMuWm9kQ3VzdG9tPEJpZ0ludDY0QXJyYXksIEJpZ0ludDY0QXJyYXk+LFxuICAgIGlzLlpvZEN1c3RvbTxCaWdVaW50NjRBcnJheSwgQmlnVWludDY0QXJyYXk+LFxuICBdXG4+XG5cbi8qKiBTdXBwb3J0ZWQgcHJvdG9jb2xzIGZvciB7QGxpbmtjb2RlIHVybH0gdHlwZSBhbGlhcy4gKi9cbmNvbnN0IHByb3RvY29scyA9IFtcImh0dHBzP1wiLCBcImZpbGVcIiwgXCJ3YXNtXCIsIFwiZGF0YVwiLCBcImJsb2JcIiwgXCJqc3JcIiwgXCJucG1cIl1cblxuLyoqIFR5cGUgYWxpYXMgZm9yIFVSTHMgd2l0aCBzdXBwb3J0ZWQgcHJvdG9jb2xzLiAqL1xuZXhwb3J0IGNvbnN0IHVybCA9IE9iamVjdC5hc3NpZ24oaXMudXJsKHsgcHJvdG9jb2w6IG5ldyBSZWdFeHAoYF4oPzoke3Byb3RvY29scy5qb2luKFwifFwiKX0pJGApLCBob3N0bmFtZTogLy4qLyB9KSwge1xuICB3aXRoKGFkZGl0aW9uYWw6IHN0cmluZ1tdLCB7IGhvc3RuYW1lID0gLy4qLywgLi4ub3B0aW9ucyB9OiBPbWl0PGlzLnouY29yZS4kWm9kVVJMUGFyYW1zLCBcInByb3RvY29sXCI+ID0ge30pIHtcbiAgICBjb25zdCBlc2NhcGVkID0gYWRkaXRpb25hbC5tYXAoKHByb3RvY29sKSA9PiBwcm90b2NvbC5yZXBsYWNlKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgXCJcXFxcJCZcIikpXG4gICAgcmV0dXJuIGlzLnVybCh7IC4uLm9wdGlvbnMsIHByb3RvY29sOiBuZXcgUmVnRXhwKGBeKD86JHtbLi4ucHJvdG9jb2xzLCAuLi5lc2NhcGVkXS5qb2luKFwifFwiKX0pJGApLCBob3N0bmFtZSB9KVxuICB9LFxufSkgYXMgaXMuWm9kVVJMICYge1xuICAvKiogQ3JlYXRlIGEgbmV3IHR5cGUgYWxpYXMgZm9yIFVSTHMgd2l0aCBhZGRpdGlvbmFsIGN1c3RvbSBzdXBwb3J0ZWQgcHJvdG9jb2xzLiAqL1xuICB3aXRoKGFkZGl0aW9uYWw6IHN0cmluZ1tdLCBwYXJhbXM/OiBPbWl0PGlzLnouY29yZS4kWm9kVVJMUGFyYW1zLCBcInByb3RvY29sXCI+KTogaXMuWm9kVVJMXG59XG5cbi8qKiBUeXBlIGFsaWFzIGZvciBib2R5IGluaXQuICovXG5leHBvcnQgY29uc3QgYm9keUluaXQgPSBpcy51bmlvbihbXG4gIGlzLnN0cmluZygpLFxuICBpcy5pbnN0YW5jZW9mKFN0cmluZyksXG4gIGlzLmluc3RhbmNlb2YoQmxvYiksXG4gIGlzLmluc3RhbmNlb2YoQXJyYXlCdWZmZXIpLFxuICBpcy5pbnN0YW5jZW9mKERhdGFWaWV3KSxcbiAgaXMuaW5zdGFuY2VvZihGb3JtRGF0YSksXG4gIGlzLmluc3RhbmNlb2YoUmVhZGFibGVTdHJlYW0pLFxuICBpcy5pbnN0YW5jZW9mKFVSTFNlYXJjaFBhcmFtcyksXG4gIHR5cGVkQXJyYXksXG5dKS5udWxsYWJsZSgpIGFzIGlzLlpvZE51bGxhYmxlPFxuICBpcy5ab2RVbmlvbjxcbiAgICByZWFkb25seSBbXG4gICAgICBpcy5ab2RTdHJpbmcsXG4gICAgICBpcy5ab2RDdXN0b208U3RyaW5nLCBTdHJpbmc+LFxuICAgICAgaXMuWm9kQ3VzdG9tPEJsb2IsIEJsb2I+LFxuICAgICAgaXMuWm9kQ3VzdG9tPEFycmF5QnVmZmVyLCBBcnJheUJ1ZmZlcj4sXG4gICAgICBpcy5ab2RDdXN0b208RGF0YVZpZXcsIERhdGFWaWV3PixcbiAgICAgIGlzLlpvZEN1c3RvbTxGb3JtRGF0YSwgRm9ybURhdGE+LFxuICAgICAgaXMuWm9kQ3VzdG9tPFJlYWRhYmxlU3RyZWFtLCBSZWFkYWJsZVN0cmVhbT4sXG4gICAgICBpcy5ab2RDdXN0b208VVJMU2VhcmNoUGFyYW1zLCBVUkxTZWFyY2hQYXJhbXM+LFxuICAgICAgdHlwZW9mIHR5cGVkQXJyYXksXG4gICAgXVxuICA+XG4+XG5cbi8qKlxuICogU3lzdGVtIHBlcm1pc3Npb25zIGZsYWdzLlxuICpcbiAqIFNlZSB7QGxpbmsgaHR0cHM6Ly9kb2NzLmRlbm8uY29tL3J1bnRpbWUvZnVuZGFtZW50YWxzL3NlY3VyaXR5LyNzeXN0ZW0taW5mb3JtYXRpb259LlxuICovXG5jb25zdCBzeXNmbGFncyA9IFtcImhvc3RuYW1lXCIsIFwib3NSZWxlYXNlXCIsIFwib3NVcHRpbWVcIiwgXCJsb2FkYXZnXCIsIFwibmV0d29ya0ludGVyZmFjZXNcIiwgXCJzeXN0ZW1NZW1vcnlJbmZvXCIsIFwidWlkXCIsIFwiZ2lkXCJdIGFzIGNvbnN0XG5cbi8qKiBUeXBlIGFsaWFzIGZhY3RvcnkgZm9yIHBlcm1pc3Npb24gZGVzY3JpcHRvcnMuICovXG5mdW5jdGlvbiBwZXJtaXNzaW9uKHsgZXhwYW5kID0gZmFsc2UsIHVybHMgPSBmYWxzZSwgc3lzID0gZmFsc2UgfSA9IHt9KSB7XG4gIHJldHVybiBpcy5wcmVwcm9jZXNzKCh2YWx1ZSkgPT4ge1xuICAgIGlmICh2YWx1ZSA9PT0gXCJpbmhlcml0XCIpXG4gICAgICByZXR1cm4gdmFsdWVcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKVxuICAgICAgdmFsdWUgPSBbdmFsdWVdXG4gICAgaWYgKGV4cGFuZCkge1xuICAgICAgaWYgKCh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB8fCAodmFsdWUgPT09IGZhbHNlKSlcbiAgICAgICAgdmFsdWUgPSBbXVxuICAgIH1cbiAgICBpZiAodXJscyAmJiBBcnJheS5pc0FycmF5KHZhbHVlKSlcbiAgICAgIHZhbHVlID0gdmFsdWUubWFwKCh2YWx1ZSkgPT4gdmFsdWUgaW5zdGFuY2VvZiBVUkwgPyB2YWx1ZS5ocmVmIDogdmFsdWUpXG4gICAgcmV0dXJuIHZhbHVlXG4gIH0sIGlzLnVuaW9uKFtpcy5saXRlcmFsKFwiaW5oZXJpdFwiKSwgaXMuYm9vbGVhbigpLCBpcy5hcnJheShzeXMgPyBpcy5lbnVtKHN5c2ZsYWdzKSA6IGlzLnN0cmluZygpKV0pKVxufVxuXG4vKiogVHlwZSBhbGlhcyBmYWN0b3J5IGZvciBwZXJtaXNzaW9ucyBvYmplY3QuICovXG5leHBvcnQgZnVuY3Rpb24gcGVybWlzc2lvbnM8VCBleHRlbmRzIGtleW9mIERlbm8uUGVybWlzc2lvbk9wdGlvbnNPYmplY3Q+KFxuICBvcHRpb25zPzogeyBzZXQ/OiBUW107IGV4cGFuZD86IGZhbHNlIH0sXG4pOiBpcy5ab2RVbmlvbjxyZWFkb25seSBbaXMuWm9kT2JqZWN0PFJlY29yZDxULCBpcy5ab2RPcHRpb25hbDxpcy5ab2RQcmVwcm9jZXNzPGlzLlpvZFVuaW9uPFtpcy5ab2RMaXRlcmFsPFwiaW5oZXJpdFwiPiwgaXMuWm9kQm9vbGVhbiwgaXMuWm9kQXJyYXk8aXMuWm9kU3RyaW5nPl0+Pj4+PiwgaXMuWm9kVW5pb248cmVhZG9ubHkgW2lzLlpvZExpdGVyYWw8XCJpbmhlcml0XCI+LCBpcy5ab2RMaXRlcmFsPFwibm9uZVwiPl0+XT5cbi8qKiBUeXBlIGFsaWFzIGZhY3RvcnkgZm9yIHBlcm1pc3Npb25zIG9iamVjdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwZXJtaXNzaW9uczxUIGV4dGVuZHMga2V5b2YgRGVuby5QZXJtaXNzaW9uT3B0aW9uc09iamVjdD4oXG4gIG9wdGlvbnM6IHsgc2V0PzogVFtdOyBleHBhbmQ6IHRydWUgfSxcbik6IGlzLlpvZFByZXByb2Nlc3M8aXMuWm9kT2JqZWN0PFJlY29yZDxULCBpcy5ab2RQcmVwcm9jZXNzPGlzLlpvZFVuaW9uPFtpcy5ab2RMaXRlcmFsPFwiaW5oZXJpdFwiPiwgaXMuWm9kTGl0ZXJhbDx0cnVlPiwgaXMuWm9kQXJyYXk8aXMuWm9kU3RyaW5nPl0+Pj4+PlxuZXhwb3J0IGZ1bmN0aW9uIHBlcm1pc3Npb25zPFQgZXh0ZW5kcyBrZXlvZiBEZW5vLlBlcm1pc3Npb25PcHRpb25zT2JqZWN0Pih7IHNldCA9IFtcInJlYWRcIiwgXCJ3cml0ZVwiLCBcIm5ldFwiLCBcImVudlwiLCBcInJ1blwiLCBcInN5c1wiLCBcImZmaVwiLCBcImltcG9ydFwiXSBhcyBUW10sIGV4cGFuZCA9IGZhbHNlIH06IHsgc2V0PzogVFtdOyBleHBhbmQ/OiBib29sZWFuIH0gPSB7fSkge1xuICBjb25zdCB2YWxpZGF0b3IgPSBpcy5vYmplY3Qoe1xuICAgIHJlYWQ6IHBlcm1pc3Npb24oeyBleHBhbmQsIHVybHM6IHRydWUgfSksXG4gICAgd3JpdGU6IHBlcm1pc3Npb24oeyBleHBhbmQsIHVybHM6IHRydWUgfSksXG4gICAgbmV0OiBwZXJtaXNzaW9uKHsgZXhwYW5kIH0pLFxuICAgIGVudjogcGVybWlzc2lvbih7IGV4cGFuZCB9KSxcbiAgICBzeXM6IHBlcm1pc3Npb24oeyBleHBhbmQsIHN5czogdHJ1ZSB9KSxcbiAgICBydW46IHBlcm1pc3Npb24oeyBleHBhbmQsIHVybHM6IHRydWUgfSksXG4gICAgZmZpOiBwZXJtaXNzaW9uKHsgZXhwYW5kLCB1cmxzOiB0cnVlIH0pLFxuICAgIGltcG9ydDogcGVybWlzc2lvbih7IGV4cGFuZCB9KSxcbiAgfSkucGljazxhbnk+KE9iamVjdC5mcm9tRW50cmllcyhzZXQubWFwKChrZXkpID0+IFtrZXksIHRydWVdKSkpLnN0cmljdCgpXG5cbiAgLy8gUmV0dXJuIGVpdGhlciB0aGUgY29tcGFjdCBvciBleHBhbmRlZCB2ZXJzaW9uXG4gIGlmICghZXhwYW5kKVxuICAgIHJldHVybiB2YWxpZGF0b3IucGFydGlhbCgpLm9yKGlzLnVuaW9uKFtpcy5saXRlcmFsKFwiaW5oZXJpdFwiKSwgaXMubGl0ZXJhbChcIm5vbmVcIildKSlcbiAgcmV0dXJuIGlzLnByZXByb2Nlc3MoKHZhbHVlKSA9PiB7XG4gICAgaWYgKCh2YWx1ZSA9PT0gXCJpbmhlcml0XCIpIHx8ICh2YWx1ZSA9PT0gXCJub25lXCIpKVxuICAgICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhzZXQubWFwKChrZXkpID0+IFtrZXksIHZhbHVlID09PSBcIm5vbmVcIiA/IFtdIDogdmFsdWVdKSlcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKVxuICAgICAgdmFsdWUgPSBbdmFsdWVdXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKVxuICAgICAgcmV0dXJuIHsgLi4uT2JqZWN0LmZyb21FbnRyaWVzKHNldC5tYXAoKHBlcm1pc3Npb24pID0+IFtwZXJtaXNzaW9uLCBmYWxzZV0pKSwgLi4uT2JqZWN0LmZyb21FbnRyaWVzKHZhbHVlLm1hcCgocGVybWlzc2lvbikgPT4gW3Blcm1pc3Npb24sIFwiaW5oZXJpdFwiXSkpIH1cbiAgICByZXR1cm4gdmFsdWVcbiAgfSwgdmFsaWRhdG9yKSBhcyB1bmtub3duXG59XG5cbi8qKiBUeXBlIGFsaWFzIGZvciBleHByZXNzaW9uIHN0cmluZ3MuICovXG5leHBvcnQgY29uc3QgZXhwcmVzc2lvbiA9IGlzLnN0cmluZygpLnJlZ2V4KC9cXCRcXHsuKlxcfS8pIGFzIGlzLlpvZFN0cmluZ1xuXG4vKiogVHlwZSBhbGlhcyBmb3IgY2FsbGFibGUgdmFsdWVzLiAqL1xuZXhwb3J0IGNvbnN0IGNhbGxhYmxlID0gaXMudW5rbm93bigpLnJlZmluZSgodmFsdWUpID0+IHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiLCB7IG1lc3NhZ2U6IFwiSW52YWxpZCBpbnB1dDogVmFsdWUgbXVzdCBiZSBjYWxsYWJsZVwiIH0pIGFzIHVua25vd24gYXMgaXMuWm9kQ3VzdG9tPEZ1bmN0aW9uLCB1bmtub3duPlxuXG4vKiogVHlwZSBhbGlhcyBmb3IgWm9kIHNjaGVtYXMuICovXG5leHBvcnQgY29uc3QgcGFyc2VyID0gaXMuY3VzdG9tKCh2YWx1ZSkgPT4gKHZhbHVlIGluc3RhbmNlb2YgaXMuWm9kVHlwZSkgfHwgKHZhbHVlICYmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpICYmICh0eXBlb2YgKHZhbHVlIGFzIFJlY29yZDxQcm9wZXJ0eUtleSwgdW5rbm93bj4pLnBhcnNlID09PSBcImZ1bmN0aW9uXCIpKSwgeyBtZXNzYWdlOiBcIkludmFsaWQgaW5wdXQ6IFZhbHVlIG11c3QgYmUgYSBab2Qgc2NoZW1hXCIgfSkgYXMgaXMuWm9kQ3VzdG9tPFxuICBpcy5ab2RUeXBlLFxuICB1bmtub3duXG4+XG5cbi8qKiBPYmplY3QgdGhhdCByZXNzZW1ibGUgYSBab2RFcnJvci4gKi9cbnR5cGUgWm9kRXJyb3JMaWtlID0geyBwYXRoPzogUHJvcGVydHlLZXlbXTsgbWVzc2FnZTogc3RyaW5nOyBlcnJvcnM/OiBab2RFcnJvckxpa2VbXVtdIH1cblxuLyoqIENvbnZlcnQgYSBwcm9wZXJ0eSBrZXkgcGF0aCB0byBhIHN0cmluZy4gKi9cbmZ1bmN0aW9uIHRvUGF0aChwYXRoOiBQcm9wZXJ0eUtleVtdID0gW10pOiBzdHJpbmcge1xuICBjb25zdCBzZWdtZW50cyA9IFtdXG4gIGZvciAoY29uc3Qgc2VnbWVudCBvZiBwYXRoKSB7XG4gICAgaWYgKHR5cGVvZiBzZWdtZW50ID09PSBcIm51bWJlclwiKVxuICAgICAgc2VnbWVudHMucHVzaChgWyR7c2VnbWVudH1dYClcbiAgICBlbHNlIGlmICh0eXBlb2Ygc2VnbWVudCA9PT0gXCJzeW1ib2xcIiB8fCAvW15cXHckXS8udGVzdChTdHJpbmcoc2VnbWVudCkpKVxuICAgICAgc2VnbWVudHMucHVzaChgWyR7SlNPTi5zdHJpbmdpZnkoU3RyaW5nKHNlZ21lbnQpKX1dYClcbiAgICBlbHNlXG4gICAgICBzZWdtZW50cy5wdXNoKGAuJHtzZWdtZW50fWApXG4gIH1cbiAgcmV0dXJuIHNlZ21lbnRzLmpvaW4oXCJcIilcbn1cblxuLyoqIFByZXR0aWZ5IHZhbGlkYXRpb24gaXNzdWVzIGluIGEgbW9yZSBkZXRhaWxlZCB3YXkuICovXG5mdW5jdGlvbiBwcmV0dGlmeUlzc3VlKGVycm9yczogWm9kRXJyb3JMaWtlW10sIHsgaW5kZW50ID0gXCJcIiB9ID0ge30pOiBzdHJpbmcge1xuICBjb25zdCBsaW5lcyA9IFtdXG4gIGVycm9ycyA9IFsuLi5lcnJvcnNdLnNvcnQoKGEsIGIpID0+IChhLnBhdGggPz8gW10pLmxlbmd0aCAtIChiLnBhdGggPz8gW10pLmxlbmd0aClcbiAgZm9yIChjb25zdCBlcnJvciBvZiBlcnJvcnMpIHtcbiAgICBsaW5lcy5wdXNoKGAke2luZGVudH3inJggJHtlcnJvci5tZXNzYWdlfWApXG4gICAgaWYgKGVycm9yLnBhdGg/Lmxlbmd0aClcbiAgICAgIGxpbmVzLnB1c2goYCR7aW5kZW50fSAg4oaSIGF0ICR7dG9QYXRoKGVycm9yLnBhdGgpfWApXG4gICAgaWYgKGVycm9yLmVycm9ycz8ubGVuZ3RoKSB7XG4gICAgICBsaW5lcy5wdXNoKGAke2luZGVudH0gIOKGkiB0cmllZCB0byBmaXQgaW50byBvbmUgb2YgdGhlIGFsbG93ZWQgdHlwZXM6YClcbiAgICAgIGZvciAoY29uc3Qgc3ViZXJyb3Igb2YgZXJyb3IuZXJyb3JzKVxuICAgICAgICBsaW5lcy5wdXNoKHByZXR0aWZ5SXNzdWUoc3ViZXJyb3IsIHsgaW5kZW50OiBgJHtpbmRlbnR9ICAgICAgYCB9KS5yZXBsYWNlKFwiICDinJhcIiwgXCItIOKcmFwiKSlcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGxpbmVzLmpvaW4oXCJcXG5cIilcbn1cblxuLyoqIE9wdGlvbnMgZm9yIHtAbGlua2NvZGUgcGFyc2UoKX0uICovXG5leHBvcnQgdHlwZSBQYXJzZU9wdGlvbnMgPSB7XG4gIC8qKiBXaGV0aGVyIHRvIHBhcnNlIGFzeW5jaHJvbm91c2x5LiAqL1xuICBhc3luYz86IGJvb2xlYW5cbiAgLyoqIFdoZXRoZXIgdG8gdGhyb3cgYSBgWm9kRXJyb3JgIHJhdGhlciB0aGFuIGEgYFR5cGVFcnJvcmAgaW4gY2FzZSBvZiBmYWlsdXJlICovXG4gIHpvZEVycm9yPzogYm9vbGVhblxufVxuXG4vKiogUGFyc2UgYSBzY2hlbWEgc3luY2hyb25vdXNseS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZTxUIGV4dGVuZHMgaXMuWm9kVHlwZT4oc2NoZW1hOiBULCB2YWx1ZXM6IHVua25vd24sIG9wdGlvbnM/OiBPbWl0PFBhcnNlT3B0aW9ucywgXCJhc3luY1wiPiAmIHsgYXN5bmM/OiBmYWxzZSB9KTogaXMuaW5mZXI8VD5cbi8qKiBQYXJzZSBhIHNjaGVtYSBhc3luY2hyb25vdXNseS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZTxUIGV4dGVuZHMgaXMuWm9kVHlwZT4oc2NoZW1hOiBULCB2YWx1ZXM6IHVua25vd24sIG9wdGlvbnM6IE9taXQ8UGFyc2VPcHRpb25zLCBcImFzeW5jXCI+ICYgeyBhc3luYzogdHJ1ZSB9KTogUHJvbWlzZTxpcy5pbmZlcjxUPj5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZTxUIGV4dGVuZHMgaXMuWm9kVHlwZT4oc2NoZW1hOiBULCB2YWx1ZXM6IHVua25vd24sIHsgYXN5bmMgPSBmYWxzZSwgem9kRXJyb3IgfTogUGFyc2VPcHRpb25zID0ge30pIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXN5bmNcbiAgICAgID8gc2NoZW1hLnBhcnNlQXN5bmModmFsdWVzKS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKCghKGVycm9yIGluc3RhbmNlb2YgaXMuWm9kRXJyb3IpKSB8fCB6b2RFcnJvcilcbiAgICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBWYWxpZGF0aW9uIGZhaWxlZDogXFxuJHtwcmV0dGlmeUlzc3VlKGVycm9yLmlzc3Vlcyl9YClcbiAgICAgIH0pXG4gICAgICA6IHNjaGVtYS5wYXJzZSh2YWx1ZXMpXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKCghKGVycm9yIGluc3RhbmNlb2YgaXMuWm9kRXJyb3IpKSB8fCB6b2RFcnJvcilcbiAgICAgIHRocm93IGVycm9yXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgVmFsaWRhdGlvbiBmYWlsZWQ6IFxcbiR7cHJldHRpZnlJc3N1ZShlcnJvci5pc3N1ZXMpfWApXG4gIH1cbn1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxVQUFVO0FBQ1Ysa0RBQWtEO0FBRWxELFNBQVMsU0FBUyxRQUFRLHNCQUFxQjtBQUMvQyxZQUFZLFFBQVEsV0FBVTtBQUM5QixPQUFPLEtBQUssRUFBRSxNQUFNLFdBQVU7QUFHOUIsK0VBQStFLEdBQy9FLE9BQU8sU0FBUyxTQUErQixNQUFTO0VBQ3RELE9BQU8sR0FBRyxVQUFVLENBQUMsQ0FBQztJQUNwQixPQUFPLFNBQVM7RUFDbEIsR0FBRztBQUNMO0FBRUEsNkRBQTZELEdBQzdELE9BQU8sU0FBUyxPQUE2QixNQUFTO0VBQ3BELE9BQU8sR0FBRyxVQUFVLENBQUMsQ0FBQztJQUNwQixJQUFJLE9BQU8sVUFBVSxVQUFVO01BQzdCLE1BQU0sVUFBVSxPQUFPO01BQ3ZCLElBQUksQUFBQyxDQUFDLE9BQU8sS0FBSyxDQUFDLFlBQWMsVUFBVSxPQUN6QyxPQUFPO0lBQ1g7SUFDQSxPQUFPO0VBQ1QsR0FBRztBQUNMO0FBRUEsdUVBQXVFLEdBQ3ZFLE9BQU8sU0FBUyxTQUErQixNQUFTO0VBQ3RELE9BQU8sT0FBTyxRQUFRLEdBQUcsT0FBTyxDQUFDO0FBQ25DO0FBRUEsMkVBQTJFLEdBQzNFLE9BQU8sU0FBUyxTQUErQixNQUFTO0VBQ3RELE9BQU8sR0FBRyxVQUFVLENBQUMsQ0FBQyxPQUFPO0lBQzNCLElBQUk7TUFDRixnQkFBZ0I7SUFDbEIsRUFBRSxPQUFPLE9BQU87TUFDZCxRQUFRLFFBQVEsQ0FBQyxDQUFDLHdFQUF3RSxFQUFFLE9BQU87SUFDckc7SUFDQSxPQUFPO0VBQ1QsR0FBRztBQUNMO0FBRUEsc0VBQXNFLEdBQ3RFLE9BQU8sU0FBUyxVQUFnQyxNQUFTO0VBQ3ZELE9BQU8sR0FBRyxVQUFVLENBQUMsQ0FBQztJQUNwQixJQUFJLENBQUMsTUFBTSxPQUFPLENBQUMsUUFDakIsT0FBTztNQUFDO0tBQU07SUFDaEIsT0FBTztF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
package/mod.d.ts ADDED
@@ -0,0 +1 @@
1
+ export * from "./is.js";
package/mod.js ADDED
@@ -0,0 +1,2 @@
1
+ export * from "./is.js";
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZpbGU6Ly8vaG9tZS9ydW5uZXIvd29yay9saWJzL2xpYnMvQGxpYnMvaXMvbW9kLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gXCIuL2lzLmpzXCJcbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLFVBQVMifQ==
package/package.json ADDED
@@ -0,0 +1,25 @@
1
+ {
2
+ "name": "@lowlighter/is",
3
+ "version": "1.3.3",
4
+ "type": "module",
5
+ "main": "./mod.js",
6
+ "types": "./mod.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "types": "./mod.d.ts",
10
+ "import": "./mod.js",
11
+ "default": "./mod.js"
12
+ },
13
+ "./testing": {
14
+ "types": "./testing/mod.d.ts",
15
+ "import": "./testing/mod.js",
16
+ "default": "./testing/mod.js"
17
+ }
18
+ },
19
+ "dependencies": {
20
+ "@jsr/std__cli": "^1.0.28",
21
+ "@jsr/std__collections": "^1.1.6",
22
+ "@jsr/zod__zod": "^4.4.3",
23
+ "@lowlighter/testing": "^6.0.0"
24
+ }
25
+ }
@@ -0,0 +1 @@
1
+ export * from "./spec.js";
package/testing/mod.js ADDED
@@ -0,0 +1,2 @@
1
+ export * from "./spec.js";
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZpbGU6Ly8vaG9tZS9ydW5uZXIvd29yay9saWJzL2xpYnMvQGxpYnMvaXMvdGVzdGluZy9tb2QudHMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSBcIi4vc3BlYy5qc1wiXG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxZQUFXIn0=
@@ -0,0 +1,48 @@
1
+ import { is } from "../is.js";
2
+ /** Test case definition. */ export type testcase = {
3
+ a: unknown;
4
+ b?: unknown;
5
+ env?: Record<string, string>;
6
+ };
7
+ /** Configuration options for {@linkcode spec()}. */ export type SpecOptions = {
8
+ /** Whether to perform a prefault check. */ prefault?: boolean;
9
+ /** Whether to perform a strictness check. */ strict?: boolean;
10
+ /** Setup function to run before tests. */ setup?: () => void;
11
+ };
12
+ /** Specification check helper. */ export declare const spec: ((name: string, schema: is.ZodType, testsuites: Array<testcase> | Record<PropertyKey, Array<testcase>>, options?: SpecOptions) => void) & {
13
+ optional: Array<testcase>;
14
+ nullable: Array<testcase>;
15
+ primitive: Array<testcase>;
16
+ boolean: Array<testcase>;
17
+ string: {
18
+ arrayable: Array<testcase>;
19
+ } & Array<testcase>;
20
+ positive: {
21
+ int: Array<testcase>;
22
+ finite: Array<testcase>;
23
+ infinity: Array<testcase>;
24
+ };
25
+ record: {
26
+ primitive: Array<testcase>;
27
+ } & Array<testcase>;
28
+ array: {
29
+ unique: Array<testcase>;
30
+ typed: Array<testcase>;
31
+ };
32
+ response: {
33
+ body: {
34
+ init: Array<testcase>;
35
+ };
36
+ };
37
+ ulid: Array<testcase>;
38
+ url: Array<testcase>;
39
+ date: Array<testcase>;
40
+ error: Array<testcase>;
41
+ expression: Array<testcase>;
42
+ callable: Array<testcase>;
43
+ parser: Array<testcase>;
44
+ unknown: Array<testcase>;
45
+ meta: (meta: ImportMeta) => Array<testcase>;
46
+ enum: (values: readonly string[]) => Array<testcase>;
47
+ default: (b: unknown, options?: Omit<testcase, "a" | "b">) => Array<testcase>;
48
+ };
@@ -0,0 +1,504 @@
1
+ // Imports
2
+ import { is } from "../is.js";
3
+ import { pick } from "@std/collections";
4
+ import { expect } from "@lowlighter/testing";
5
+ import { inspect } from "@lowlighter/testing/highlight";
6
+ /** Specification check helper. */ export const spec = Object.assign(function(name, schema, testsuites, { prefault = true, strict = true, setup } = {}) {
7
+ if (Array.isArray(testsuites)) testsuites = {
8
+ "*": testsuites
9
+ };
10
+ // Prefault check
11
+ if (prefault) Deno.test(`\`${name}.parse()\` has prefault`, ()=>expect(schema.parse(undefined)).toMatchObject({}));
12
+ // Strictness check
13
+ if (strict) Deno.test(`\`${name}.parse()\` is strict`, ()=>expect(()=>schema.parse({
14
+ __strictness_test__: true
15
+ })).toThrow());
16
+ // Parsing checks
17
+ for (const [key, testcases] of Object.entries(testsuites)){
18
+ for (const testcase of testcases){
19
+ const a = key === "*" ? testcase.a : {
20
+ [key]: testcase.a
21
+ };
22
+ const b = "b" in testcase ? testcase.b : testcase.a;
23
+ Deno.test(`\`${name}.parse(${inspect(a)})\` ${b === Error ? "throws error" : `is parsed${"b" in testcase ? ` as \`${inspect(b)}\`` : ""}`}${"env" in testcase ? ` with \`${inspect(testcase.env)}\`` : ""}`, {
24
+ permissions: {
25
+ env: testcase.env ? true : false
26
+ }
27
+ }, ()=>{
28
+ const env = {};
29
+ try {
30
+ setup?.();
31
+ // Apply environment variables
32
+ if (testcase.env) {
33
+ for (const [key, value] of Object.entries(testcase.env)){
34
+ if (Deno.env.has(key)) env[key] = Deno.env.get(key);
35
+ Deno.env.set(key, value);
36
+ }
37
+ }
38
+ // Apply test
39
+ if (b === Error) expect(()=>schema.parse(a)).toThrow();
40
+ else {
41
+ if (key === "*" && (typeof b !== "object" || b === null)) {
42
+ expect(schema.parse(a)).toEqual(b);
43
+ return;
44
+ }
45
+ if (b instanceof Date || b === "2024-01-01T00:00:00.000Z") {
46
+ const da = schema.parse(a);
47
+ expect((key === "*" ? da : da[key]).getTime()).toBe(new Date(b).getTime());
48
+ return;
49
+ }
50
+ expect(schema.parse(a)).toMatchObject(key === "*" ? b : {
51
+ [key]: b
52
+ });
53
+ }
54
+ } finally{
55
+ for (const [key, value] of Object.entries(env))Deno.env.set(key, value);
56
+ }
57
+ });
58
+ }
59
+ }
60
+ }, {
61
+ optional: [
62
+ {
63
+ a: undefined,
64
+ b: undefined
65
+ }
66
+ ],
67
+ nullable: [
68
+ {
69
+ a: null
70
+ }
71
+ ],
72
+ primitive: [
73
+ {
74
+ a: "foo"
75
+ },
76
+ {
77
+ a: 123
78
+ },
79
+ {
80
+ a: 123n
81
+ },
82
+ {
83
+ a: true
84
+ },
85
+ {
86
+ a: undefined
87
+ },
88
+ {
89
+ a: null
90
+ },
91
+ {
92
+ a: new Date("2024-01-01T00:00:00.000Z")
93
+ },
94
+ {
95
+ a: new Error("Testing")
96
+ },
97
+ {
98
+ a: Symbol.for("@@testing"),
99
+ b: Error
100
+ },
101
+ {
102
+ a: {},
103
+ b: Error
104
+ },
105
+ {
106
+ a: [],
107
+ b: Error
108
+ },
109
+ {
110
+ a: function() {},
111
+ b: Error
112
+ }
113
+ ],
114
+ boolean: [
115
+ {
116
+ a: true
117
+ },
118
+ {
119
+ a: false
120
+ }
121
+ ],
122
+ string: Object.assign([
123
+ {
124
+ a: "foo"
125
+ }
126
+ ], {
127
+ arrayable: [
128
+ {
129
+ a: "a",
130
+ b: [
131
+ "a"
132
+ ]
133
+ },
134
+ {
135
+ a: [
136
+ "a",
137
+ "b"
138
+ ],
139
+ b: [
140
+ "a",
141
+ "b"
142
+ ]
143
+ }
144
+ ]
145
+ }),
146
+ positive: {
147
+ int: [
148
+ {
149
+ a: 1
150
+ },
151
+ {
152
+ a: "1",
153
+ b: 1
154
+ },
155
+ {
156
+ a: -1,
157
+ b: Error
158
+ },
159
+ {
160
+ a: "-1",
161
+ b: Error
162
+ },
163
+ {
164
+ a: "NaN",
165
+ b: Error
166
+ }
167
+ ],
168
+ finite: [
169
+ {
170
+ a: 1
171
+ },
172
+ {
173
+ a: NaN,
174
+ b: Error
175
+ },
176
+ {
177
+ a: Infinity,
178
+ b: Error
179
+ }
180
+ ],
181
+ infinity: [
182
+ {
183
+ a: Infinity
184
+ },
185
+ {
186
+ a: "Infinity",
187
+ b: Infinity
188
+ }
189
+ ]
190
+ },
191
+ record: Object.assign([
192
+ {
193
+ a: {
194
+ foo: "bar",
195
+ baz: 123
196
+ },
197
+ b: {
198
+ foo: "bar",
199
+ baz: 123
200
+ }
201
+ },
202
+ {
203
+ a: "foo",
204
+ b: Error
205
+ }
206
+ ], {
207
+ primitive: [
208
+ {
209
+ a: {
210
+ foo: "bar"
211
+ }
212
+ },
213
+ {
214
+ a: {
215
+ foo: 123
216
+ }
217
+ },
218
+ {
219
+ a: {
220
+ foo: 123n
221
+ }
222
+ },
223
+ {
224
+ a: {
225
+ foo: true
226
+ }
227
+ },
228
+ {
229
+ a: {
230
+ foo: undefined
231
+ }
232
+ },
233
+ {
234
+ a: {
235
+ foo: null
236
+ }
237
+ },
238
+ {
239
+ a: {
240
+ foo: Symbol.for("@@testing")
241
+ },
242
+ b: Error
243
+ },
244
+ {
245
+ a: {
246
+ foo: {}
247
+ },
248
+ b: Error
249
+ },
250
+ {
251
+ a: {
252
+ foo: []
253
+ },
254
+ b: Error
255
+ },
256
+ {
257
+ a: {
258
+ foo: function() {}
259
+ },
260
+ b: Error
261
+ }
262
+ ]
263
+ }),
264
+ array: {
265
+ unique: [
266
+ {
267
+ a: [
268
+ "a",
269
+ "b",
270
+ "b",
271
+ "a",
272
+ "c"
273
+ ],
274
+ b: [
275
+ "a",
276
+ "b",
277
+ "c"
278
+ ]
279
+ }
280
+ ],
281
+ typed: [
282
+ {
283
+ a: new Int8Array()
284
+ },
285
+ {
286
+ a: new Uint8Array()
287
+ },
288
+ {
289
+ a: new Uint8ClampedArray()
290
+ },
291
+ {
292
+ a: new Int16Array()
293
+ },
294
+ {
295
+ a: new Uint16Array()
296
+ },
297
+ {
298
+ a: new Int32Array()
299
+ },
300
+ {
301
+ a: new Uint32Array()
302
+ },
303
+ {
304
+ a: new Float16Array()
305
+ },
306
+ {
307
+ a: new Float32Array()
308
+ },
309
+ {
310
+ a: new Float64Array()
311
+ },
312
+ {
313
+ a: new BigInt64Array()
314
+ },
315
+ {
316
+ a: new BigUint64Array()
317
+ }
318
+ ]
319
+ },
320
+ response: {
321
+ body: {
322
+ init: [
323
+ {
324
+ a: null
325
+ },
326
+ {
327
+ a: "foo"
328
+ },
329
+ {
330
+ a: new Blob()
331
+ },
332
+ {
333
+ a: new ArrayBuffer(8)
334
+ },
335
+ {
336
+ a: new DataView(new ArrayBuffer(8))
337
+ },
338
+ {
339
+ a: new FormData()
340
+ },
341
+ {
342
+ a: new ReadableStream()
343
+ },
344
+ {
345
+ a: new URLSearchParams()
346
+ },
347
+ {
348
+ a: new Int8Array()
349
+ }
350
+ ]
351
+ }
352
+ },
353
+ ulid: [
354
+ {
355
+ a: "0".repeat(26)
356
+ },
357
+ {
358
+ a: "TEST_INVALID_ULID",
359
+ b: Error
360
+ }
361
+ ],
362
+ url: [
363
+ {
364
+ a: "http://example.com"
365
+ },
366
+ {
367
+ a: "https://example.com"
368
+ },
369
+ {
370
+ a: "jsr:@scope/test"
371
+ },
372
+ {
373
+ a: "npm:@scope/test"
374
+ },
375
+ {
376
+ a: "file:///test/path"
377
+ },
378
+ {
379
+ a: "data:application/test,null"
380
+ },
381
+ {
382
+ a: "test_invalid_url",
383
+ b: Error
384
+ }
385
+ ],
386
+ date: [
387
+ {
388
+ a: new Date("2024-01-01T00:00:00.000Z")
389
+ },
390
+ {
391
+ a: "test_invalid_date",
392
+ b: Error
393
+ }
394
+ ],
395
+ error: [
396
+ {
397
+ a: new Error("Test error")
398
+ },
399
+ {
400
+ a: `${new Error("Test error")}`,
401
+ b: Error
402
+ }
403
+ ],
404
+ expression: [
405
+ {
406
+ a: "${foo + 1}"
407
+ },
408
+ {
409
+ a: "foo + 1",
410
+ b: Error
411
+ }
412
+ ],
413
+ callable: [
414
+ {
415
+ a: ()=>{}
416
+ },
417
+ {
418
+ a: async ()=>{}
419
+ },
420
+ {
421
+ a: null,
422
+ b: Error
423
+ },
424
+ {
425
+ a: {},
426
+ b: Error
427
+ }
428
+ ],
429
+ parser: [
430
+ {
431
+ a: Object.assign(is.object({
432
+ foo: is.string()
433
+ }), {
434
+ [Symbol.for("Deno.customInspect")]: ()=>"schema"
435
+ })
436
+ },
437
+ {
438
+ a: {
439
+ parse: ()=>({})
440
+ }
441
+ }
442
+ ],
443
+ unknown: [
444
+ {
445
+ a: null
446
+ },
447
+ {
448
+ a: 123
449
+ },
450
+ {
451
+ a: "string"
452
+ },
453
+ {
454
+ a: true
455
+ },
456
+ {
457
+ a: []
458
+ },
459
+ {
460
+ a: {}
461
+ },
462
+ {
463
+ a: {
464
+ foo: "bar"
465
+ }
466
+ }
467
+ ],
468
+ meta (meta) {
469
+ return [
470
+ {
471
+ a: pick(meta, [
472
+ "url",
473
+ "dirname",
474
+ "filename"
475
+ ])
476
+ },
477
+ {
478
+ a: {},
479
+ b: Error
480
+ }
481
+ ];
482
+ },
483
+ enum (values) {
484
+ return [
485
+ ...values.map((a)=>({
486
+ a
487
+ })),
488
+ {
489
+ a: "TEST_INVALID_ENUM_VALUE",
490
+ b: Error
491
+ }
492
+ ];
493
+ },
494
+ default (b, options) {
495
+ return [
496
+ {
497
+ a: undefined,
498
+ b,
499
+ ...options
500
+ }
501
+ ];
502
+ }
503
+ });
504
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZpbGU6Ly8vaG9tZS9ydW5uZXIvd29yay9saWJzL2xpYnMvQGxpYnMvaXMvdGVzdGluZy9zcGVjLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEltcG9ydHNcbmltcG9ydCB0eXBlIHsgdGVzdGluZyB9IGZyb20gXCJAbGlicy90ZXN0aW5nXCJcbmltcG9ydCB7IGlzIH0gZnJvbSBcIi4uL2lzLmpzXCJcbmltcG9ydCB7IHBpY2sgfSBmcm9tIFwiQHN0ZC9jb2xsZWN0aW9uc1wiXG5pbXBvcnQgeyBleHBlY3QgfSBmcm9tIFwiQGxpYnMvdGVzdGluZ1wiXG5pbXBvcnQgeyBpbnNwZWN0IH0gZnJvbSBcIkBsaWJzL3Rlc3RpbmcvaGlnaGxpZ2h0XCJcblxuLyoqIFRlc3QgY2FzZSBkZWZpbml0aW9uLiAqL1xuZXhwb3J0IHR5cGUgdGVzdGNhc2UgPSB7IGE6IHVua25vd247IGI/OiB1bmtub3duOyBlbnY/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IH1cblxuLyoqIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3Ige0BsaW5rY29kZSBzcGVjKCl9LiAqL1xuZXhwb3J0IHR5cGUgU3BlY09wdGlvbnMgPSB7XG4gIC8qKiBXaGV0aGVyIHRvIHBlcmZvcm0gYSBwcmVmYXVsdCBjaGVjay4gKi9cbiAgcHJlZmF1bHQ/OiBib29sZWFuXG4gIC8qKiBXaGV0aGVyIHRvIHBlcmZvcm0gYSBzdHJpY3RuZXNzIGNoZWNrLiAqL1xuICBzdHJpY3Q/OiBib29sZWFuXG4gIC8qKiBTZXR1cCBmdW5jdGlvbiB0byBydW4gYmVmb3JlIHRlc3RzLiAqL1xuICBzZXR1cD86ICgpID0+IHZvaWRcbn1cblxuLyoqIFNwZWNpZmljYXRpb24gY2hlY2sgaGVscGVyLiAqL1xuZXhwb3J0IGNvbnN0IHNwZWMgPSBPYmplY3QuYXNzaWduKGZ1bmN0aW9uIChuYW1lOiBzdHJpbmcsIHNjaGVtYTogaXMuWm9kVHlwZSwgdGVzdHN1aXRlczogQXJyYXk8dGVzdGNhc2U+IHwgUmVjb3JkPFByb3BlcnR5S2V5LCBBcnJheTx0ZXN0Y2FzZT4+LCB7IHByZWZhdWx0ID0gdHJ1ZSwgc3RyaWN0ID0gdHJ1ZSwgc2V0dXAgfTogU3BlY09wdGlvbnMgPSB7fSk6IHZvaWQge1xuICBpZiAoQXJyYXkuaXNBcnJheSh0ZXN0c3VpdGVzKSlcbiAgICB0ZXN0c3VpdGVzID0geyBcIipcIjogdGVzdHN1aXRlcyB9XG4gIC8vIFByZWZhdWx0IGNoZWNrXG4gIGlmIChwcmVmYXVsdClcbiAgICBEZW5vLnRlc3QoYFxcYCR7bmFtZX0ucGFyc2UoKVxcYCBoYXMgcHJlZmF1bHRgLCAoKSA9PiBleHBlY3Qoc2NoZW1hLnBhcnNlKHVuZGVmaW5lZCkpLnRvTWF0Y2hPYmplY3Qoe30pKVxuICAvLyBTdHJpY3RuZXNzIGNoZWNrXG4gIGlmIChzdHJpY3QpXG4gICAgRGVuby50ZXN0KGBcXGAke25hbWV9LnBhcnNlKClcXGAgaXMgc3RyaWN0YCwgKCkgPT4gZXhwZWN0KCgpID0+IHNjaGVtYS5wYXJzZSh7IF9fc3RyaWN0bmVzc190ZXN0X186IHRydWUgfSkpLnRvVGhyb3coKSlcbiAgLy8gUGFyc2luZyBjaGVja3NcbiAgZm9yIChjb25zdCBba2V5LCB0ZXN0Y2FzZXNdIG9mIE9iamVjdC5lbnRyaWVzKHRlc3RzdWl0ZXMpKSB7XG4gICAgZm9yIChjb25zdCB0ZXN0Y2FzZSBvZiB0ZXN0Y2FzZXMpIHtcbiAgICAgIGNvbnN0IGEgPSBrZXkgPT09IFwiKlwiID8gdGVzdGNhc2UuYSA6IHsgW2tleV06IHRlc3RjYXNlLmEgfVxuICAgICAgY29uc3QgYiA9IFwiYlwiIGluIHRlc3RjYXNlID8gdGVzdGNhc2UuYiA6IHRlc3RjYXNlLmFcbiAgICAgIERlbm8udGVzdChgXFxgJHtuYW1lfS5wYXJzZSgke2luc3BlY3QoYSl9KVxcYCAke2IgPT09IEVycm9yID8gXCJ0aHJvd3MgZXJyb3JcIiA6IGBpcyBwYXJzZWQke1wiYlwiIGluIHRlc3RjYXNlID8gYCBhcyBcXGAke2luc3BlY3QoYil9XFxgYCA6IFwiXCJ9YH0ke1wiZW52XCIgaW4gdGVzdGNhc2UgPyBgIHdpdGggXFxgJHtpbnNwZWN0KHRlc3RjYXNlLmVudil9XFxgYCA6IFwiXCJ9YCwgeyBwZXJtaXNzaW9uczogeyBlbnY6IHRlc3RjYXNlLmVudiA/IHRydWUgOiBmYWxzZSB9IH0sICgpID0+IHtcbiAgICAgICAgY29uc3QgZW52ID0ge30gYXMgTm9uTnVsbGFibGU8dGVzdGNhc2VbXCJlbnZcIl0+XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgc2V0dXA/LigpXG5cbiAgICAgICAgICAvLyBBcHBseSBlbnZpcm9ubWVudCB2YXJpYWJsZXNcbiAgICAgICAgICBpZiAodGVzdGNhc2UuZW52KSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0ZXN0Y2FzZS5lbnYpKSB7XG4gICAgICAgICAgICAgIGlmIChEZW5vLmVudi5oYXMoa2V5KSlcbiAgICAgICAgICAgICAgICBlbnZba2V5XSA9IERlbm8uZW52LmdldChrZXkpIVxuICAgICAgICAgICAgICBEZW5vLmVudi5zZXQoa2V5LCB2YWx1ZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gQXBwbHkgdGVzdFxuICAgICAgICAgIGlmIChiID09PSBFcnJvcilcbiAgICAgICAgICAgIGV4cGVjdCgoKSA9PiBzY2hlbWEucGFyc2UoYSkpLnRvVGhyb3coKVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKChrZXkgPT09IFwiKlwiKSAmJiAoKHR5cGVvZiBiICE9PSBcIm9iamVjdFwiKSB8fCAoYiA9PT0gbnVsbCkpKSB7XG4gICAgICAgICAgICAgIGV4cGVjdChzY2hlbWEucGFyc2UoYSkpLnRvRXF1YWwoYiBhcyBSZWNvcmQ8UHJvcGVydHlLZXksIHVua25vd24+KVxuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgoYiBpbnN0YW5jZW9mIERhdGUpIHx8IChiID09PSBcIjIwMjQtMDEtMDFUMDA6MDA6MDAuMDAwWlwiKSkge1xuICAgICAgICAgICAgICBjb25zdCBkYSA9IHNjaGVtYS5wYXJzZShhKSBhcyBEYXRlXG4gICAgICAgICAgICAgIGV4cGVjdCgoa2V5ID09PSBcIipcIiA/IGRhIDogKGRhIGFzIHRlc3RpbmcpW2tleV0pLmdldFRpbWUoKSkudG9CZShuZXcgRGF0ZShiKS5nZXRUaW1lKCkpXG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZXhwZWN0KHNjaGVtYS5wYXJzZShhKSkudG9NYXRjaE9iamVjdChrZXkgPT09IFwiKlwiID8gYiBhcyBSZWNvcmQ8UHJvcGVydHlLZXksIHVua25vd24+IDogeyBba2V5XTogYiB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhlbnYpKVxuICAgICAgICAgICAgRGVuby5lbnYuc2V0KGtleSwgdmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9XG59LCB7XG4gIG9wdGlvbmFsOiBbXG4gICAgeyBhOiB1bmRlZmluZWQsIGI6IHVuZGVmaW5lZCB9LFxuICBdLFxuICBudWxsYWJsZTogW1xuICAgIHsgYTogbnVsbCB9LFxuICBdLFxuICBwcmltaXRpdmU6IFtcbiAgICB7IGE6IFwiZm9vXCIgfSxcbiAgICB7IGE6IDEyMyB9LFxuICAgIHsgYTogMTIzbiB9LFxuICAgIHsgYTogdHJ1ZSB9LFxuICAgIHsgYTogdW5kZWZpbmVkIH0sXG4gICAgeyBhOiBudWxsIH0sXG4gICAgeyBhOiBuZXcgRGF0ZShcIjIwMjQtMDEtMDFUMDA6MDA6MDAuMDAwWlwiKSB9LFxuICAgIHsgYTogbmV3IEVycm9yKFwiVGVzdGluZ1wiKSB9LFxuICAgIHsgYTogU3ltYm9sLmZvcihcIkBAdGVzdGluZ1wiKSwgYjogRXJyb3IgfSxcbiAgICB7IGE6IHt9LCBiOiBFcnJvciB9LFxuICAgIHsgYTogW10sIGI6IEVycm9yIH0sXG4gICAgeyBhOiBmdW5jdGlvbiAoKSB7fSwgYjogRXJyb3IgfSxcbiAgXSxcbiAgYm9vbGVhbjogW1xuICAgIHsgYTogdHJ1ZSB9LFxuICAgIHsgYTogZmFsc2UgfSxcbiAgXSxcbiAgc3RyaW5nOiBPYmplY3QuYXNzaWduKFtcbiAgICB7IGE6IFwiZm9vXCIgfSxcbiAgXSwge1xuICAgIGFycmF5YWJsZTogW1xuICAgICAgeyBhOiBcImFcIiwgYjogW1wiYVwiXSB9LFxuICAgICAgeyBhOiBbXCJhXCIsIFwiYlwiXSwgYjogW1wiYVwiLCBcImJcIl0gfSxcbiAgICBdLFxuICB9KSxcbiAgcG9zaXRpdmU6IHtcbiAgICBpbnQ6IFtcbiAgICAgIHsgYTogMSB9LFxuICAgICAgeyBhOiBcIjFcIiwgYjogMSB9LFxuICAgICAgeyBhOiAtMSwgYjogRXJyb3IgfSxcbiAgICAgIHsgYTogXCItMVwiLCBiOiBFcnJvciB9LFxuICAgICAgeyBhOiBcIk5hTlwiLCBiOiBFcnJvciB9LFxuICAgIF0sXG4gICAgZmluaXRlOiBbXG4gICAgICB7IGE6IDEgfSxcbiAgICAgIHsgYTogTmFOLCBiOiBFcnJvciB9LFxuICAgICAgeyBhOiBJbmZpbml0eSwgYjogRXJyb3IgfSxcbiAgICBdLFxuICAgIGluZmluaXR5OiBbXG4gICAgICB7IGE6IEluZmluaXR5IH0sXG4gICAgICB7IGE6IFwiSW5maW5pdHlcIiwgYjogSW5maW5pdHkgfSxcbiAgICBdLFxuICB9LFxuICByZWNvcmQ6IE9iamVjdC5hc3NpZ24oW1xuICAgIHsgYTogeyBmb286IFwiYmFyXCIsIGJhejogMTIzIH0sIGI6IHsgZm9vOiBcImJhclwiLCBiYXo6IDEyMyB9IH0sXG4gICAgeyBhOiBcImZvb1wiLCBiOiBFcnJvciB9LFxuICBdLCB7XG4gICAgcHJpbWl0aXZlOiBbXG4gICAgICB7IGE6IHsgZm9vOiBcImJhclwiIH0gfSxcbiAgICAgIHsgYTogeyBmb286IDEyMyB9IH0sXG4gICAgICB7IGE6IHsgZm9vOiAxMjNuIH0gfSxcbiAgICAgIHsgYTogeyBmb286IHRydWUgfSB9LFxuICAgICAgeyBhOiB7IGZvbzogdW5kZWZpbmVkIH0gfSxcbiAgICAgIHsgYTogeyBmb286IG51bGwgfSB9LFxuICAgICAgeyBhOiB7IGZvbzogU3ltYm9sLmZvcihcIkBAdGVzdGluZ1wiKSB9LCBiOiBFcnJvciB9LFxuICAgICAgeyBhOiB7IGZvbzoge30gfSwgYjogRXJyb3IgfSxcbiAgICAgIHsgYTogeyBmb286IFtdIH0sIGI6IEVycm9yIH0sXG4gICAgICB7IGE6IHsgZm9vOiBmdW5jdGlvbiAoKSB7fSB9LCBiOiBFcnJvciB9LFxuICAgIF0sXG4gIH0pLFxuICBhcnJheToge1xuICAgIHVuaXF1ZTogW1xuICAgICAgeyBhOiBbXCJhXCIsIFwiYlwiLCBcImJcIiwgXCJhXCIsIFwiY1wiXSwgYjogW1wiYVwiLCBcImJcIiwgXCJjXCJdIH0sXG4gICAgXSxcbiAgICB0eXBlZDogW1xuICAgICAgeyBhOiBuZXcgSW50OEFycmF5KCkgfSxcbiAgICAgIHsgYTogbmV3IFVpbnQ4QXJyYXkoKSB9LFxuICAgICAgeyBhOiBuZXcgVWludDhDbGFtcGVkQXJyYXkoKSB9LFxuICAgICAgeyBhOiBuZXcgSW50MTZBcnJheSgpIH0sXG4gICAgICB7IGE6IG5ldyBVaW50MTZBcnJheSgpIH0sXG4gICAgICB7IGE6IG5ldyBJbnQzMkFycmF5KCkgfSxcbiAgICAgIHsgYTogbmV3IFVpbnQzMkFycmF5KCkgfSxcbiAgICAgIHsgYTogbmV3IEZsb2F0MTZBcnJheSgpIH0sXG4gICAgICB7IGE6IG5ldyBGbG9hdDMyQXJyYXkoKSB9LFxuICAgICAgeyBhOiBuZXcgRmxvYXQ2NEFycmF5KCkgfSxcbiAgICAgIHsgYTogbmV3IEJpZ0ludDY0QXJyYXkoKSB9LFxuICAgICAgeyBhOiBuZXcgQmlnVWludDY0QXJyYXkoKSB9LFxuICAgIF0sXG4gIH0sXG4gIHJlc3BvbnNlOiB7XG4gICAgYm9keToge1xuICAgICAgaW5pdDogW1xuICAgICAgICB7IGE6IG51bGwgfSxcbiAgICAgICAgeyBhOiBcImZvb1wiIH0sXG4gICAgICAgIHsgYTogbmV3IEJsb2IoKSB9LFxuICAgICAgICB7IGE6IG5ldyBBcnJheUJ1ZmZlcig4KSB9LFxuICAgICAgICB7IGE6IG5ldyBEYXRhVmlldyhuZXcgQXJyYXlCdWZmZXIoOCkpIH0sXG4gICAgICAgIHsgYTogbmV3IEZvcm1EYXRhKCkgfSxcbiAgICAgICAgeyBhOiBuZXcgUmVhZGFibGVTdHJlYW0oKSB9LFxuICAgICAgICB7IGE6IG5ldyBVUkxTZWFyY2hQYXJhbXMoKSB9LFxuICAgICAgICB7IGE6IG5ldyBJbnQ4QXJyYXkoKSB9LFxuICAgICAgXSxcbiAgICB9LFxuICB9LFxuICB1bGlkOiBbXG4gICAgeyBhOiBcIjBcIi5yZXBlYXQoMjYpIH0sXG4gICAgeyBhOiBcIlRFU1RfSU5WQUxJRF9VTElEXCIsIGI6IEVycm9yIH0sXG4gIF0sXG4gIHVybDogW1xuICAgIHsgYTogXCJodHRwOi8vZXhhbXBsZS5jb21cIiB9LFxuICAgIHsgYTogXCJodHRwczovL2V4YW1wbGUuY29tXCIgfSxcbiAgICB7IGE6IFwianNyOkBzY29wZS90ZXN0XCIgfSxcbiAgICB7IGE6IFwibnBtOkBzY29wZS90ZXN0XCIgfSxcbiAgICB7IGE6IFwiZmlsZTovLy90ZXN0L3BhdGhcIiB9LFxuICAgIHsgYTogXCJkYXRhOmFwcGxpY2F0aW9uL3Rlc3QsbnVsbFwiIH0sXG4gICAgeyBhOiBcInRlc3RfaW52YWxpZF91cmxcIiwgYjogRXJyb3IgfSxcbiAgXSxcbiAgZGF0ZTogW1xuICAgIHsgYTogbmV3IERhdGUoXCIyMDI0LTAxLTAxVDAwOjAwOjAwLjAwMFpcIikgfSxcbiAgICB7IGE6IFwidGVzdF9pbnZhbGlkX2RhdGVcIiwgYjogRXJyb3IgfSxcbiAgXSxcbiAgZXJyb3I6IFtcbiAgICB7IGE6IG5ldyBFcnJvcihcIlRlc3QgZXJyb3JcIikgfSxcbiAgICB7IGE6IGAke25ldyBFcnJvcihcIlRlc3QgZXJyb3JcIil9YCwgYjogRXJyb3IgfSxcbiAgXSxcbiAgZXhwcmVzc2lvbjogW1xuICAgIHsgYTogXCIke2ZvbyArIDF9XCIgfSxcbiAgICB7IGE6IFwiZm9vICsgMVwiLCBiOiBFcnJvciB9LFxuICBdLFxuICBjYWxsYWJsZTogW1xuICAgIHsgYTogKCkgPT4ge30gfSxcbiAgICB7IGE6IGFzeW5jICgpID0+IHt9IH0sXG4gICAgeyBhOiBudWxsLCBiOiBFcnJvciB9LFxuICAgIHsgYToge30sIGI6IEVycm9yIH0sXG4gIF0sXG4gIHBhcnNlcjogW1xuICAgIHsgYTogT2JqZWN0LmFzc2lnbihpcy5vYmplY3QoeyBmb286IGlzLnN0cmluZygpIH0pLCB7IFtTeW1ib2wuZm9yKFwiRGVuby5jdXN0b21JbnNwZWN0XCIpXTogKCkgPT4gXCJzY2hlbWFcIiB9KSB9LFxuICAgIHsgYTogeyBwYXJzZTogKCkgPT4gKHt9KSB9IH0sXG4gIF0sXG4gIHVua25vd246IFtcbiAgICB7IGE6IG51bGwgfSxcbiAgICB7IGE6IDEyMyB9LFxuICAgIHsgYTogXCJzdHJpbmdcIiB9LFxuICAgIHsgYTogdHJ1ZSB9LFxuICAgIHsgYTogW10gfSxcbiAgICB7IGE6IHt9IH0sXG4gICAgeyBhOiB7IGZvbzogXCJiYXJcIiB9IH0sXG4gIF0sXG4gIG1ldGEobWV0YTogSW1wb3J0TWV0YSkge1xuICAgIHJldHVybiBbXG4gICAgICB7IGE6IHBpY2sobWV0YSwgW1widXJsXCIsIFwiZGlybmFtZVwiLCBcImZpbGVuYW1lXCJdKSB9LFxuICAgICAgeyBhOiB7fSwgYjogRXJyb3IgfSxcbiAgICBdXG4gIH0sXG4gIGVudW0odmFsdWVzOiByZWFkb25seSBzdHJpbmdbXSkge1xuICAgIHJldHVybiBbXG4gICAgICAuLi52YWx1ZXMubWFwKChhKSA9PiAoeyBhIH0pKSxcbiAgICAgIHsgYTogXCJURVNUX0lOVkFMSURfRU5VTV9WQUxVRVwiLCBiOiBFcnJvciB9LFxuICAgIF1cbiAgfSxcbiAgZGVmYXVsdChiOiB1bmtub3duLCBvcHRpb25zPzogT21pdDx0ZXN0Y2FzZSwgXCJhXCIgfCBcImJcIj4pIHtcbiAgICByZXR1cm4gW1xuICAgICAgeyBhOiB1bmRlZmluZWQsIGIsIC4uLm9wdGlvbnMgfSxcbiAgICBdXG4gIH0sXG59KSBhcyAoKG5hbWU6IHN0cmluZywgc2NoZW1hOiBpcy5ab2RUeXBlLCB0ZXN0c3VpdGVzOiBBcnJheTx0ZXN0Y2FzZT4gfCBSZWNvcmQ8UHJvcGVydHlLZXksIEFycmF5PHRlc3RjYXNlPj4sIG9wdGlvbnM/OiBTcGVjT3B0aW9ucykgPT4gdm9pZCkgJiB7XG4gIG9wdGlvbmFsOiBBcnJheTx0ZXN0Y2FzZT5cbiAgbnVsbGFibGU6IEFycmF5PHRlc3RjYXNlPlxuICBwcmltaXRpdmU6IEFycmF5PHRlc3RjYXNlPlxuICBib29sZWFuOiBBcnJheTx0ZXN0Y2FzZT5cbiAgc3RyaW5nOiB7XG4gICAgYXJyYXlhYmxlOiBBcnJheTx0ZXN0Y2FzZT5cbiAgfSAmIEFycmF5PHRlc3RjYXNlPlxuICBwb3NpdGl2ZToge1xuICAgIGludDogQXJyYXk8dGVzdGNhc2U+XG4gICAgZmluaXRlOiBBcnJheTx0ZXN0Y2FzZT5cbiAgICBpbmZpbml0eTogQXJyYXk8dGVzdGNhc2U+XG4gIH1cbiAgcmVjb3JkOiB7XG4gICAgcHJpbWl0aXZlOiBBcnJheTx0ZXN0Y2FzZT5cbiAgfSAmIEFycmF5PHRlc3RjYXNlPlxuICBhcnJheToge1xuICAgIHVuaXF1ZTogQXJyYXk8dGVzdGNhc2U+XG4gICAgdHlwZWQ6IEFycmF5PHRlc3RjYXNlPlxuICB9XG4gIHJlc3BvbnNlOiB7XG4gICAgYm9keToge1xuICAgICAgaW5pdDogQXJyYXk8dGVzdGNhc2U+XG4gICAgfVxuICB9XG4gIHVsaWQ6IEFycmF5PHRlc3RjYXNlPlxuICB1cmw6IEFycmF5PHRlc3RjYXNlPlxuICBkYXRlOiBBcnJheTx0ZXN0Y2FzZT5cbiAgZXJyb3I6IEFycmF5PHRlc3RjYXNlPlxuICBleHByZXNzaW9uOiBBcnJheTx0ZXN0Y2FzZT5cbiAgY2FsbGFibGU6IEFycmF5PHRlc3RjYXNlPlxuICBwYXJzZXI6IEFycmF5PHRlc3RjYXNlPlxuICB1bmtub3duOiBBcnJheTx0ZXN0Y2FzZT5cbiAgbWV0YTogKG1ldGE6IEltcG9ydE1ldGEpID0+IEFycmF5PHRlc3RjYXNlPlxuICBlbnVtOiAodmFsdWVzOiByZWFkb25seSBzdHJpbmdbXSkgPT4gQXJyYXk8dGVzdGNhc2U+XG4gIGRlZmF1bHQ6IChiOiB1bmtub3duLCBvcHRpb25zPzogT21pdDx0ZXN0Y2FzZSwgXCJhXCIgfCBcImJcIj4pID0+IEFycmF5PHRlc3RjYXNlPlxufVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFVBQVU7QUFFVixTQUFTLEVBQUUsUUFBUSxXQUFVO0FBQzdCLFNBQVMsSUFBSSxRQUFRLG1CQUFrQjtBQUN2QyxTQUFTLE1BQU0sUUFBUSxnQkFBZTtBQUN0QyxTQUFTLE9BQU8sUUFBUSwwQkFBeUI7QUFlakQsZ0NBQWdDLEdBQ2hDLE9BQU8sTUFBTSxPQUFPLE9BQU8sTUFBTSxDQUFDLFNBQVUsSUFBWSxFQUFFLE1BQWtCLEVBQUUsVUFBa0UsRUFBRSxFQUFFLFdBQVcsSUFBSSxFQUFFLFNBQVMsSUFBSSxFQUFFLEtBQUssRUFBZSxHQUFHLENBQUMsQ0FBQztFQUMzTSxJQUFJLE1BQU0sT0FBTyxDQUFDLGFBQ2hCLGFBQWE7SUFBRSxLQUFLO0VBQVc7RUFDakMsaUJBQWlCO0VBQ2pCLElBQUksVUFDRixLQUFLLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxLQUFLLHVCQUF1QixDQUFDLEVBQUUsSUFBTSxPQUFPLE9BQU8sS0FBSyxDQUFDLFlBQVksYUFBYSxDQUFDLENBQUM7RUFDckcsbUJBQW1CO0VBQ25CLElBQUksUUFDRixLQUFLLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxLQUFLLG9CQUFvQixDQUFDLEVBQUUsSUFBTSxPQUFPLElBQU0sT0FBTyxLQUFLLENBQUM7UUFBRSxxQkFBcUI7TUFBSyxJQUFJLE9BQU87RUFDcEgsaUJBQWlCO0VBQ2pCLEtBQUssTUFBTSxDQUFDLEtBQUssVUFBVSxJQUFJ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