@mnaoumov/typescript-lib 1.2.0 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -48,7 +48,10 @@ export const COUNTER_API_CONTRACT = defineApiContract<CounterApi>({
48
48
  - `createArgumentsSchema(guards, { vendor })` validates an argument list: one guard per parameter, issues carrying the argument index, too many arguments refused.
49
49
  - `createTypeGuardSchema({ expected, typeGuard, vendor })` validates one value.
50
50
  - `BOOLEAN_GUARD`, `NUMBER_GUARD`, `STRING_GUARD`, `STRING_ARRAY_GUARD` and `UNDEFINED_GUARD` are ready-made guards, `optionalGuard` and `nullableGuard` widen one, and a spread renames what it expects.
51
- - The schema `vendor` defaults to `@mnaoumov/typescript-lib`.
51
+ - `arrayGuard`, `literalGuard`, `unionGuard` and `instanceOfGuard` build a guard together with what it expects, and `createExpectedTypeGuard(expected, typeGuard)` pairs any other type guard with its text.
52
+ - The schema `vendor` defaults to `@mnaoumov/typescript-lib`. `createApiContractSchemaBuilders(vendor)` binds it once: destructure `createArgumentsSchema` and `createTypeGuardSchema` from it, and no call passes the vendor again.
53
+
54
+ The guards for an API's own shapes come from `@mnaoumov/typescript-lib/type-guards`, whose combinators work on bare type guards: `objectTypeGuard<T>({ ... })` takes one guard per property of `T` and none may be missing (`{ shouldRejectUnknownKeys: true }` refuses extra keys), and `arrayTypeGuard`, `literalTypeGuard`, `unionTypeGuard`, `optionalTypeGuard`, `nullableTypeGuard`, `instanceOfTypeGuard` and `functionTypeGuard` build the rest. A name ending in `TypeGuard` returns a bare type guard; the `api-contract` name without `Type` returns the same guard paired with its `expected` text.
52
55
 
53
56
  Running the schemas belongs to whoever owns the call path. `@mnaoumov/obsidian-lib`'s plugin API registry runs them while its debugger is on.
54
57
 
@@ -28,11 +28,17 @@ __export(api_contract_exports, {
28
28
  STRING_ARRAY_GUARD: () => STRING_ARRAY_GUARD,
29
29
  STRING_GUARD: () => STRING_GUARD,
30
30
  UNDEFINED_GUARD: () => UNDEFINED_GUARD,
31
+ arrayGuard: () => arrayGuard,
32
+ createApiContractSchemaBuilders: () => createApiContractSchemaBuilders,
31
33
  createArgumentsSchema: () => createArgumentsSchema,
34
+ createExpectedTypeGuard: () => createExpectedTypeGuard,
32
35
  createTypeGuardSchema: () => createTypeGuardSchema,
33
36
  defineApiContract: () => defineApiContract,
37
+ instanceOfGuard: () => instanceOfGuard,
38
+ literalGuard: () => literalGuard,
34
39
  nullableGuard: () => nullableGuard,
35
- optionalGuard: () => optionalGuard
40
+ optionalGuard: () => optionalGuard,
41
+ unionGuard: () => unionGuard
36
42
  });
37
43
  module.exports = __toCommonJS(api_contract_exports);
38
44
  var import_library = require('./library.cjs');
@@ -43,6 +49,15 @@ const NUMBER_GUARD = { expected: "a number", typeGuard: import_type_guards.isNum
43
49
  const STRING_GUARD = { expected: "a string", typeGuard: import_type_guards.isString };
44
50
  const STRING_ARRAY_GUARD = { expected: "an array of strings", typeGuard: import_type_guards.isStringArray };
45
51
  const UNDEFINED_GUARD = { expected: "undefined", typeGuard: import_type_guards.isUndefined };
52
+ function arrayGuard(itemGuard) {
53
+ return createExpectedTypeGuard(`an array whose every item is ${itemGuard.expected}`, (0, import_type_guards.arrayTypeGuard)(itemGuard.typeGuard));
54
+ }
55
+ function createApiContractSchemaBuilders(vendor) {
56
+ return {
57
+ createArgumentsSchema: (parameters) => createArgumentsSchema(parameters, { vendor }),
58
+ createTypeGuardSchema: (guard) => createTypeGuardSchema({ ...guard, vendor })
59
+ };
60
+ }
46
61
  function createArgumentsSchema(parameters, options) {
47
62
  const parameterList = (0, import_object_utils.castTo)(parameters);
48
63
  return createSchema((value) => {
@@ -56,6 +71,9 @@ function createArgumentsSchema(parameters, options) {
56
71
  return issues.length === 0 ? { value: (0, import_object_utils.castTo)(value) } : { issues };
57
72
  }, options?.vendor);
58
73
  }
74
+ function createExpectedTypeGuard(expected, typeGuard) {
75
+ return { expected, typeGuard };
76
+ }
59
77
  function createTypeGuardSchema(params) {
60
78
  return createSchema(
61
79
  (value) => params.typeGuard(value) ? { value } : { issues: [{ message: `Expected ${params.expected}.` }] },
@@ -65,6 +83,13 @@ function createTypeGuardSchema(params) {
65
83
  function defineApiContract(contract) {
66
84
  return contract;
67
85
  }
86
+ function instanceOfGuard(constructor) {
87
+ return createExpectedTypeGuard(`an instance of ${constructor.name}`, (0, import_type_guards.instanceOfTypeGuard)(constructor));
88
+ }
89
+ function literalGuard(literals) {
90
+ const literalList = isReadonlyArray(literals) ? literals : Object.keys(literals);
91
+ return createExpectedTypeGuard(`one of ${literalList.map((literal) => formatLiteral(literal)).join(", ")}`, (0, import_type_guards.literalTypeGuard)(literalList));
92
+ }
68
93
  function nullableGuard(guard) {
69
94
  return {
70
95
  expected: `${guard.expected} or null`,
@@ -77,6 +102,12 @@ function optionalGuard(guard) {
77
102
  typeGuard: (value) => value === void 0 || guard.typeGuard(value)
78
103
  };
79
104
  }
105
+ function unionGuard(...guards) {
106
+ return createExpectedTypeGuard(
107
+ guards.map((guard) => guard.expected).join(" or "),
108
+ (0, import_type_guards.unionTypeGuard)(...guards.map((guard) => guard.typeGuard))
109
+ );
110
+ }
80
111
  function createSchema(validate, vendor) {
81
112
  return {
82
113
  "~standard": {
@@ -86,6 +117,15 @@ function createSchema(validate, vendor) {
86
117
  }
87
118
  };
88
119
  }
120
+ function formatLiteral(literal) {
121
+ if ((0, import_type_guards.isString)(literal)) {
122
+ return `'${literal}'`;
123
+ }
124
+ return typeof literal === "bigint" ? `${String(literal)}n` : String(literal);
125
+ }
126
+ function isReadonlyArray(value) {
127
+ return Array.isArray(value);
128
+ }
89
129
  // Annotate the CommonJS export names for ESM import in node:
90
130
  0 && (module.exports = {
91
131
  BOOLEAN_GUARD,
@@ -93,10 +133,16 @@ function createSchema(validate, vendor) {
93
133
  STRING_ARRAY_GUARD,
94
134
  STRING_GUARD,
95
135
  UNDEFINED_GUARD,
136
+ arrayGuard,
137
+ createApiContractSchemaBuilders,
96
138
  createArgumentsSchema,
139
+ createExpectedTypeGuard,
97
140
  createTypeGuardSchema,
98
141
  defineApiContract,
142
+ instanceOfGuard,
143
+ literalGuard,
99
144
  nullableGuard,
100
- optionalGuard
145
+ optionalGuard,
146
+ unionGuard
101
147
  });
102
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2FwaS1jb250cmFjdC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFRoZSBjb250cmFjdCBvZiBhbiBBUEkgb25lIG1vZHVsZSBleHBvc2VzIHRvIGFub3RoZXI6IHdoaWNoIG1ldGhvZHMgaXQgcHJvbWlzZXMsIGFuZCBhXG4gKiB7QGxpbmsgaHR0cHM6Ly9zdGFuZGFyZHNjaGVtYS5kZXYgfCBTdGFuZGFyZCBTY2hlbWF9IG92ZXIgZWFjaCBtZXRob2QncyBhcmd1bWVudHMgYW5kIHJldHVybiB2YWx1ZS5cbiAqXG4gKiBUaGUgc2NoZW1hcyBhcmUgcGxhaW4gb2JqZWN0cyBvdmVyIHBsYWluIGZ1bmN0aW9ucywgd2hpY2ggYSB0eXBlIGd1YXJkIGFscmVhZHkgaXMsIHNvIGEgY29udHJhY3QgY2FuIGNyb3NzIGFcbiAqIGJvdW5kYXJ5IGJldHdlZW4gdHdvIGNvcGllcyBvZiBhIGxpYnJhcnkgYW5kIHN0aWxsIGJlIHJ1biBieSB3aGljaGV2ZXIgY29weSByZWFkcyBpdC4gVGhlIGJ1aWxkZXJzIGhlcmUgdHVyblxuICogdGhlIGd1YXJkcyBhIG1vZHVsZSBhbHJlYWR5IGhhcyBpbnRvIHRoZSB0d28gc2hhcGVzIGEgbWV0aG9kIGNvbnRyYWN0IG5lZWRzOiBvbmUgdmFsdWUgKGFuIG91dHB1dCkgYW5kIG9uZVxuICogYXJndW1lbnQgbGlzdCAoYW4gaW5wdXQpLiB6b2QgLyB2YWxpYm90IC8gYXJrdHlwZSBzY2hlbWFzIHBsdWcgaW50byB0aGUgc2FtZSBzbG90cyB1bmNoYW5nZWQ7IHRoaXMgbW9kdWxlIGp1c3RcbiAqIGRvZXMgbm90IG1ha2UgZXZlcnkgcHJvdmlkZXIgYnVuZGxlIG9uZSB0byBkZXNjcmliZSB0d28gYXJndW1lbnRzLlxuICpcbiAqIFJ1bm5pbmcgdGhlIHNjaGVtYXMgaXMgbGVmdCB0byB3aG9ldmVyIG93bnMgdGhlIGNhbGwgcGF0aCwgc2luY2UgdGhhdCBpcyB3aGVyZSBhbiBpc3N1ZSBjYW4gYmUgcmVwb3J0ZWQuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBTdGFuZGFyZFNjaGVtYVYxIH0gZnJvbSAnQHN0YW5kYXJkLXNjaGVtYS9zcGVjJztcblxuaW1wb3J0IHsgTElCUkFSWV9OQU1FIH0gZnJvbSAnLi9saWJyYXJ5LnRzJztcbmltcG9ydCB7IGNhc3RUbyB9IGZyb20gJy4vb2JqZWN0LXV0aWxzLnRzJztcbmltcG9ydCB7XG4gIGlzQm9vbGVhbixcbiAgaXNOdW1iZXIsXG4gIGlzU3RyaW5nLFxuICBpc1N0cmluZ0FycmF5LFxuICBpc1VuZGVmaW5lZFxufSBmcm9tICcuL3R5cGUtZ3VhcmRzLnRzJztcblxuLyoqXG4gKiBUaGUgY29udHJhY3QgYW4gQVBJIGRlY2xhcmVzOiBldmVyeSBrZXkgaXMgYSBtZXRob2QgdGhlIEFQSSBwcm9taXNlcyB0byBleHBvc2UsIGFuZCBpdHMgdmFsdWUgb3B0aW9uYWxseVxuICogY2FycmllcyB0aGUgcGF5bG9hZCBzY2hlbWFzIGZvciB0aGF0IG1ldGhvZC5cbiAqXG4gKiBUeXBlZCBvdmVyIHRoZSBBUEkgd2hlbiBvbmUgaXMgbmFtZWQ6IGBBcGlDb250cmFjdDxNeUFwaT5gIGhhcyBleGFjdGx5IG9uZSBlbnRyeSBwZXIgZnVuY3Rpb24gbWVtYmVyIG9mXG4gKiBgTXlBcGlgIChhIG1pc3NpbmcgbWV0aG9kLCBhbiBleHRyYSBvbmUgb3IgYSBtaXNzcGVsbGVkIG9uZSBkb2VzIG5vdCBjb21waWxlKSwgYW5kIGVhY2ggZW50cnkncyBzY2hlbWFzIG11c3RcbiAqIHByb2R1Y2UgdGhhdCBtZXRob2QncyBwYXJhbWV0ZXJzIGFuZCBhd2FpdGVkIHJldHVybiB2YWx1ZS4gV2l0aG91dCBhIHR5cGUgYXJndW1lbnQsIG9yIGZvciBgb2JqZWN0YCwgaXQgaXMgdGhlXG4gKiBsb29zZSByZWNvcmQgYSByZWFkZXIgdGhhdCBrbm93cyBub3RoaW5nIGFib3V0IHRoZSBBUEkgc2Vlcy5cbiAqXG4gKiBAdHlwZVBhcmFtIFRBcGkgLSBUaGUgQVBJIHRoZSBjb250cmFjdCBkZXNjcmliZXMuIGBvYmplY3RgLCB0aGUgZGVmYXVsdCwgbWVhbnMgXCJub3QgdHlwZWRcIi5cbiAqL1xuZXhwb3J0IHR5cGUgQXBpQ29udHJhY3Q8VEFwaSBleHRlbmRzIG9iamVjdCA9IG9iamVjdD4gPSBvYmplY3QgZXh0ZW5kcyBUQXBpID8gUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgQXBpTWV0aG9kQ29udHJhY3Q+PlxuICA6IFR5cGVkQXBpQ29udHJhY3Q8VEFwaT47XG5cbi8qKlxuICogVGhlIHBheWxvYWQgc2NoZW1hcyBmb3IgYSBzaW5nbGUgQVBJIG1ldGhvZC4gQm90aCBoYWx2ZXMgYXJlIG9wdGlvbmFsOiBhIG1ldGhvZCBtYXkgZGVjbGFyZSBvbmx5IGl0cyBpbnB1dCxcbiAqIG9ubHkgaXRzIG91dHB1dCwgbmVpdGhlciAodGhlIGVudHJ5IHRoZW4ganVzdCBkZWNsYXJlcyB0aGF0IHRoZSBtZXRob2QgbXVzdCBleGlzdCksIG9yIGJvdGguXG4gKlxuICogQHR5cGVQYXJhbSBUUGFyYW1ldGVycyAtIFRoZSBtZXRob2QncyBwYXJhbWV0ZXJzLCBhcyBhIHR1cGxlLCB3aGljaCB0aGUgaW5wdXQgc2NoZW1hIG11c3QgcHJvZHVjZS5cbiAqIEB0eXBlUGFyYW0gVFJldHVyblZhbHVlIC0gVGhlIG1ldGhvZCdzIHJldHVybiB2YWx1ZSwgYXdhaXRlZCwgd2hpY2ggdGhlIG91dHB1dCBzY2hlbWEgbXVzdCBwcm9kdWNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwaU1ldGhvZENvbnRyYWN0PFRQYXJhbWV0ZXJzID0gdW5rbm93biwgVFJldHVyblZhbHVlID0gdW5rbm93bj4ge1xuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBtZXRob2QncyBhcmd1bWVudHMsIGFzIGFuIGFycmF5LlxuICAgKi9cbiAgcmVhZG9ubHkgaW5wdXQ/OiBTdGFuZGFyZFNjaGVtYVYxPHVua25vd24sIFRQYXJhbWV0ZXJzPjtcblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBtZXRob2QncyByZXR1cm4gdmFsdWUsIG9yLCB3aGVuIHRoZSBtZXRob2QgcmV0dXJucyBhIHRoZW5hYmxlLCB0aGUgdmFsdWUgaXQgcmVzb2x2ZXMgdG8uXG4gICAqL1xuICByZWFkb25seSBvdXRwdXQ/OiBTdGFuZGFyZFNjaGVtYVYxPHVua25vd24sIFRSZXR1cm5WYWx1ZT47XG59XG5cbi8qKlxuICogVGhlIG5hbWVzIG9mIHRoZSBmdW5jdGlvbiBtZW1iZXJzIG9mIGFuIEFQSSwgd2hpY2ggYXJlIGV4YWN0bHkgdGhlIGtleXMgYSB0eXBlZCB7QGxpbmsgQXBpQ29udHJhY3R9IGhhcy5cbiAqXG4gKiBAdHlwZVBhcmFtIFRBcGkgLSBUaGUgQVBJLlxuICovXG5leHBvcnQgdHlwZSBBcGlNZXRob2ROYW1lPFRBcGkgZXh0ZW5kcyBvYmplY3Q+ID0ga2V5b2YgQXBpTWV0aG9kczxUQXBpPiAmIHN0cmluZztcblxuLyoqXG4gKiBUaGUgZnVuY3Rpb24gbWVtYmVycyBvZiBhbiBBUEkuXG4gKlxuICogQHR5cGVQYXJhbSBUQXBpIC0gVGhlIEFQSS5cbiAqL1xuZXhwb3J0IHR5cGUgQXBpTWV0aG9kczxUQXBpIGV4dGVuZHMgb2JqZWN0PiA9IHtcbiAgW1RLZXkgaW4ga2V5b2YgVEFwaSBhcyBUQXBpW1RLZXldIGV4dGVuZHMgKC4uLmFyZ3VtZW50c186IG5ldmVyKSA9PiB1bmtub3duID8gVEtleSA6IG5ldmVyXTogVEFwaVtUS2V5XTtcbn07XG5cbi8qKlxuICogT25lIHR5cGUgZ3VhcmQgcGVyIHBhcmFtZXRlciBvZiBhIG1ldGhvZCwgaW4gb3JkZXIuXG4gKlxuICogQHR5cGVQYXJhbSBUUGFyYW1ldGVycyAtIFRoZSBtZXRob2QncyBwYXJhbWV0ZXJzLlxuICovXG5leHBvcnQgdHlwZSBBcmd1bWVudFR5cGVHdWFyZHM8VFBhcmFtZXRlcnMgZXh0ZW5kcyByZWFkb25seSB1bmtub3duW10+ID0ge1xuICByZWFkb25seSBbVEluZGV4IGluIGtleW9mIFRQYXJhbWV0ZXJzXTogRXhwZWN0ZWRUeXBlR3VhcmQ8VFBhcmFtZXRlcnNbVEluZGV4XT47XG59O1xuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgY3JlYXRlQXJndW1lbnRzU2NoZW1hfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVBcmd1bWVudHNTY2hlbWFPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBTdGFuZGFyZCBTY2hlbWEgYHZlbmRvcmAgdGhlIHNjaGVtYSByZXBvcnRzLiBEZWZhdWx0cyB0byB0aGlzIGxpYnJhcnkncyBuYW1lLlxuICAgKi9cbiAgcmVhZG9ubHkgdmVuZG9yPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBjcmVhdGVUeXBlR3VhcmRTY2hlbWF9OiB0aGUgZ3VhcmQsIHdoYXQgaXQgZXhwZWN0cywgYW5kIG9wdGlvbmFsbHkgdGhlIHNjaGVtYSdzIHZlbmRvci5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSB0aGUgZ3VhcmQgbmFycm93cyB0by5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVUeXBlR3VhcmRTY2hlbWFQYXJhbXM8VD4gZXh0ZW5kcyBFeHBlY3RlZFR5cGVHdWFyZDxUPiB7XG4gIC8qKlxuICAgKiBUaGUgU3RhbmRhcmQgU2NoZW1hIGB2ZW5kb3JgIHRoZSBzY2hlbWEgcmVwb3J0cy4gRGVmYXVsdHMgdG8gdGhpcyBsaWJyYXJ5J3MgbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IHZlbmRvcj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBPbmUgdmFsdWUgYSBzY2hlbWEgYWNjZXB0cywgZGVzY3JpYmVkIGJ5IGEgdHlwZSBndWFyZCBhbmQgYnkgd2hhdCBpdCBleHBlY3RzLCBmb3IgdGhlIGlzc3VlIG1lc3NhZ2UuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgdGhlIGd1YXJkIG5hcnJvd3MgdG8uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXhwZWN0ZWRUeXBlR3VhcmQ8VD4ge1xuICAvKipcbiAgICogV2hhdCB0aGUgdmFsdWUgc2hvdWxkIGhhdmUgYmVlbiwgcGhyYXNlZCB0byBmb2xsb3cgXCJFeHBlY3RlZFwiLCBlLmcuIGAnYSBzdHJpbmcnYC5cbiAgICovXG4gIHJlYWRvbmx5IGV4cGVjdGVkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERlY2lkZXMgd2hldGhlciB0aGUgdmFsdWUgaXMgYWNjZXB0YWJsZS5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSB2YWx1ZSBpcyBhIGBUYC5cbiAgICovXG4gIHJlYWRvbmx5IHR5cGVHdWFyZDogKHZhbHVlOiB1bmtub3duKSA9PiB2YWx1ZSBpcyBUO1xufVxuXG4vKipcbiAqIFRoZSB7QGxpbmsgQXBpQ29udHJhY3R9IG9mIGEgbmFtZWQgQVBJOiBvbmUgZW50cnkgcGVyIGZ1bmN0aW9uIG1lbWJlciwgZWFjaCB0eXBlZCBhZ2FpbnN0IHRoYXQgbWVtYmVyLiBCb3RoXG4gKiBzY2hlbWFzIGFyZSBSRVFVSVJFRCBoZXJlLCBzbyBhIHR5cGVkIGNvbnRyYWN0IGlzIGEgZnVsbCBkZXNjcmlwdGlvbiBvZiBldmVyeSBzaWduYXR1cmUgYW5kIGEgYHt9YCBlbnRyeSBkb2VzXG4gKiBub3QgY29tcGlsZS4gT25seSB0aGUgbG9vc2UgZm9ybSBsZWF2ZXMgdGhlbSBvcHRpb25hbC5cbiAqXG4gKiBAdHlwZVBhcmFtIFRBcGkgLSBUaGUgQVBJIHRoZSBjb250cmFjdCBkZXNjcmliZXMuXG4gKi9cbmV4cG9ydCB0eXBlIFR5cGVkQXBpQ29udHJhY3Q8VEFwaSBleHRlbmRzIG9iamVjdD4gPSB7XG4gIHJlYWRvbmx5IFtUS2V5IGluIEFwaU1ldGhvZE5hbWU8VEFwaT5dLT86IFRBcGlbVEtleV0gZXh0ZW5kcyAoLi4uYXJndW1lbnRzXzogaW5mZXIgVFBhcmFtZXRlcnMpID0+IGluZmVyIFRSZXR1cm5WYWx1ZSA/IFJlcXVpcmVkPEFwaU1ldGhvZENvbnRyYWN0PFRQYXJhbWV0ZXJzLCBBd2FpdGVkPFRSZXR1cm5WYWx1ZT4+PlxuICAgIDogbmV2ZXI7XG59O1xuXG50eXBlIE11dGFibGVUdXBsZTxUVHVwbGUgZXh0ZW5kcyByZWFkb25seSB1bmtub3duW10+ID0geyAtcmVhZG9ubHkgW1RJbmRleCBpbiBrZXlvZiBUVHVwbGVdOiBUVHVwbGVbVEluZGV4XSB9O1xuXG4vKipcbiAqIEFjY2VwdHMgYSBib29sZWFuLlxuICovXG5leHBvcnQgY29uc3QgQk9PTEVBTl9HVUFSRDogRXhwZWN0ZWRUeXBlR3VhcmQ8Ym9vbGVhbj4gPSB7IGV4cGVjdGVkOiAnYSBib29sZWFuJywgdHlwZUd1YXJkOiBpc0Jvb2xlYW4gfTtcblxuLyoqXG4gKiBBY2NlcHRzIGEgbnVtYmVyLlxuICovXG5leHBvcnQgY29uc3QgTlVNQkVSX0dVQVJEOiBFeHBlY3RlZFR5cGVHdWFyZDxudW1iZXI+ID0geyBleHBlY3RlZDogJ2EgbnVtYmVyJywgdHlwZUd1YXJkOiBpc051bWJlciB9O1xuXG4vKipcbiAqIEFjY2VwdHMgYSBzdHJpbmcuIFNwcmVhZCBpdCB0byBzYXkgd2hhdCB0aGUgc3RyaW5nIGlzOiBgeyAuLi5TVFJJTkdfR1VBUkQsIGV4cGVjdGVkOiAnYSBwYXRoJyB9YC5cbiAqL1xuZXhwb3J0IGNvbnN0IFNUUklOR19HVUFSRDogRXhwZWN0ZWRUeXBlR3VhcmQ8c3RyaW5nPiA9IHsgZXhwZWN0ZWQ6ICdhIHN0cmluZycsIHR5cGVHdWFyZDogaXNTdHJpbmcgfTtcblxuLyoqXG4gKiBBY2NlcHRzIGFuIGFycmF5IG9mIHN0cmluZ3MuXG4gKi9cbmV4cG9ydCBjb25zdCBTVFJJTkdfQVJSQVlfR1VBUkQ6IEV4cGVjdGVkVHlwZUd1YXJkPHN0cmluZ1tdPiA9IHsgZXhwZWN0ZWQ6ICdhbiBhcnJheSBvZiBzdHJpbmdzJywgdHlwZUd1YXJkOiBpc1N0cmluZ0FycmF5IH07XG5cbi8qKlxuICogQWNjZXB0cyBgdW5kZWZpbmVkYCwgd2hpY2ggaXMgdGhlIG91dHB1dCBvZiBhIG1ldGhvZCByZXR1cm5pbmcgYHZvaWRgIG9yIGBQcm9taXNlPHZvaWQ+YC5cbiAqL1xuZXhwb3J0IGNvbnN0IFVOREVGSU5FRF9HVUFSRDogRXhwZWN0ZWRUeXBlR3VhcmQ8dW5kZWZpbmVkPiA9IHsgZXhwZWN0ZWQ6ICd1bmRlZmluZWQnLCB0eXBlR3VhcmQ6IGlzVW5kZWZpbmVkIH07XG5cbi8qKlxuICogQnVpbGRzIHRoZSBpbnB1dCBzY2hlbWEgb2YgYSBtZXRob2QgY29udHJhY3Q6IGEgc2NoZW1hIG92ZXIgdGhlIG1ldGhvZCdzIEFSR1VNRU5UIExJU1QsIG9uZSB0eXBlIGd1YXJkIHBlclxuICogcGFyYW1ldGVyLiBBbiBhcmd1bWVudCB0aGF0IGZhaWxzIGl0cyBndWFyZCBpcyByZXBvcnRlZCB3aXRoIGl0cyBpbmRleCBhcyB0aGUgaXNzdWUgcGF0aCwgYW5kIGFuIGFyZ3VtZW50IGxpc3RcbiAqIGxvbmdlciB0aGFuIHRoZSBwYXJhbWV0ZXIgbGlzdCBpcyByZWZ1c2VkLiBBIG1pc3NpbmcgYXJndW1lbnQgcmVhY2hlcyBpdHMgZ3VhcmQgYXMgYHVuZGVmaW5lZGAsIHNvIGFuIG9wdGlvbmFsXG4gKiBwYXJhbWV0ZXIncyBndWFyZCBhY2NlcHRzIGB1bmRlZmluZWRgIChzZWUge0BsaW5rIG9wdGlvbmFsR3VhcmR9KS5cbiAqXG4gKiBAdHlwZVBhcmFtIFRQYXJhbWV0ZXJzIC0gVGhlIG1ldGhvZCdzIHBhcmFtZXRlcnMsIGluZmVycmVkIGZyb20gdGhlIGd1YXJkcyBvciBmcm9tIHRoZSBjb250cmFjdCBlbnRyeS5cbiAqIEBwYXJhbSBwYXJhbWV0ZXJzIC0gT25lIGd1YXJkIHBlciBwYXJhbWV0ZXIsIGluIG9yZGVyLlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgdGhlIHNjaGVtYS5cbiAqIEByZXR1cm5zIFRoZSBzY2hlbWEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBcmd1bWVudHNTY2hlbWE8Y29uc3QgVFBhcmFtZXRlcnMgZXh0ZW5kcyByZWFkb25seSB1bmtub3duW10+KFxuICBwYXJhbWV0ZXJzOiBBcmd1bWVudFR5cGVHdWFyZHM8VFBhcmFtZXRlcnM+LFxuICBvcHRpb25zPzogQ3JlYXRlQXJndW1lbnRzU2NoZW1hT3B0aW9uc1xuKTogU3RhbmRhcmRTY2hlbWFWMTx1bmtub3duLCBNdXRhYmxlVHVwbGU8VFBhcmFtZXRlcnM+PiB7XG4gIGNvbnN0IHBhcmFtZXRlckxpc3QgPSBjYXN0VG88cmVhZG9ubHkgRXhwZWN0ZWRUeXBlR3VhcmQ8dW5rbm93bj5bXT4ocGFyYW1ldGVycyk7XG4gIHJldHVybiBjcmVhdGVTY2hlbWEoKHZhbHVlOiB1bmtub3duKTogU3RhbmRhcmRTY2hlbWFWMS5SZXN1bHQ8TXV0YWJsZVR1cGxlPFRQYXJhbWV0ZXJzPj4gPT4ge1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB7IGlzc3VlczogW3sgbWVzc2FnZTogJ0V4cGVjdGVkIGFuIGFyZ3VtZW50IGxpc3QuJyB9XSB9O1xuICAgIH1cblxuICAgIGlmICh2YWx1ZS5sZW5ndGggPiBwYXJhbWV0ZXJMaXN0Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHsgaXNzdWVzOiBbeyBtZXNzYWdlOiBgRXhwZWN0ZWQgYXQgbW9zdCAke1N0cmluZyhwYXJhbWV0ZXJMaXN0Lmxlbmd0aCl9IGFyZ3VtZW50KHMpLCBnb3QgJHtTdHJpbmcodmFsdWUubGVuZ3RoKX0uYCB9XSB9O1xuICAgIH1cblxuICAgIGNvbnN0IGlzc3VlcyA9IHBhcmFtZXRlckxpc3QuZmxhdE1hcCgocGFyYW1ldGVyLCBpbmRleCk6IFN0YW5kYXJkU2NoZW1hVjEuSXNzdWVbXSA9PiBwYXJhbWV0ZXIudHlwZUd1YXJkKHZhbHVlW2luZGV4XSkgPyBbXSA6IFt7IG1lc3NhZ2U6IGBFeHBlY3RlZCAke3BhcmFtZXRlci5leHBlY3RlZH0uYCwgcGF0aDogW2luZGV4XSB9XSk7XG4gICAgcmV0dXJuIGlzc3Vlcy5sZW5ndGggPT09IDAgPyB7IHZhbHVlOiBjYXN0VG88TXV0YWJsZVR1cGxlPFRQYXJhbWV0ZXJzPj4odmFsdWUpIH0gOiB7IGlzc3VlcyB9O1xuICB9LCBvcHRpb25zPy52ZW5kb3IpO1xufVxuXG4vKipcbiAqIEJ1aWxkcyBhIHNjaGVtYSBvdmVyIG9uZSB2YWx1ZSBmcm9tIGEgdHlwZSBndWFyZDogdGhlIG91dHB1dCBzY2hlbWEgb2YgYSBtZXRob2QgY29udHJhY3QsIHR5cGljYWxseS5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSB0aGUgZ3VhcmQgbmFycm93cyB0by5cbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZ3VhcmQsIHdoYXQgaXQgZXhwZWN0cywgYW5kIG9wdGlvbmFsbHkgdGhlIHNjaGVtYSdzIHZlbmRvci5cbiAqIEByZXR1cm5zIFRoZSBzY2hlbWEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVUeXBlR3VhcmRTY2hlbWE8VD4ocGFyYW1zOiBDcmVhdGVUeXBlR3VhcmRTY2hlbWFQYXJhbXM8VD4pOiBTdGFuZGFyZFNjaGVtYVYxPHVua25vd24sIFQ+IHtcbiAgcmV0dXJuIGNyZWF0ZVNjaGVtYShcbiAgICAodmFsdWU6IHVua25vd24pOiBTdGFuZGFyZFNjaGVtYVYxLlJlc3VsdDxUPiA9PiBwYXJhbXMudHlwZUd1YXJkKHZhbHVlKSA/IHsgdmFsdWUgfSA6IHsgaXNzdWVzOiBbeyBtZXNzYWdlOiBgRXhwZWN0ZWQgJHtwYXJhbXMuZXhwZWN0ZWR9LmAgfV0gfSxcbiAgICBwYXJhbXMudmVuZG9yXG4gICk7XG59XG5cbi8qKlxuICogU3RhdGVzIGEgY29udHJhY3QgYWdhaW5zdCBhbiBBUEkgdHlwZSwgc28gZXZlcnkgZW50cnkgaXMgY2hlY2tlZCBhZ2FpbnN0IGl0cyBtZXRob2QgYW5kIHRoZSBzY2hlbWEgYnVpbGRlcnNcbiAqIGluc2lkZSBpdCBpbmZlciB0aGVpciB0eXBlcyBmcm9tIHRoZSBtZXRob2QgcmF0aGVyIHRoYW4gZnJvbSBhIHJlc3RhdGVkIHR1cGxlLiBJdCByZXR1cm5zIHRoZSBjb250cmFjdCBhcyBpcy5cbiAqXG4gKiBAdHlwZVBhcmFtIFRBcGkgLSBUaGUgQVBJIHRoZSBjb250cmFjdCBkZXNjcmliZXMuXG4gKiBAcGFyYW0gY29udHJhY3QgLSBUaGUgY29udHJhY3QuXG4gKiBAcmV0dXJucyBUaGUgc2FtZSBjb250cmFjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZUFwaUNvbnRyYWN0PFRBcGkgZXh0ZW5kcyBvYmplY3Q+KGNvbnRyYWN0OiBUeXBlZEFwaUNvbnRyYWN0PE5vSW5mZXI8VEFwaT4+KTogVHlwZWRBcGlDb250cmFjdDxUQXBpPiB7XG4gIHJldHVybiBjb250cmFjdDtcbn1cblxuLyoqXG4gKiBXaWRlbnMgYSBndWFyZCB0byBhbHNvIGFjY2VwdCBgbnVsbGAuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgdGhlIGd1YXJkIG5hcnJvd3MgdG8uXG4gKiBAcGFyYW0gZ3VhcmQgLSBUaGUgZ3VhcmQgdG8gd2lkZW4uXG4gKiBAcmV0dXJucyBBIGd1YXJkIGFjY2VwdGluZyB3aGF0IGBndWFyZGAgYWNjZXB0cywgb3IgYG51bGxgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbnVsbGFibGVHdWFyZDxUPihndWFyZDogRXhwZWN0ZWRUeXBlR3VhcmQ8VD4pOiBFeHBlY3RlZFR5cGVHdWFyZDxudWxsIHwgVD4ge1xuICByZXR1cm4ge1xuICAgIGV4cGVjdGVkOiBgJHtndWFyZC5leHBlY3RlZH0gb3IgbnVsbGAsXG4gICAgdHlwZUd1YXJkOiAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBudWxsIHwgVCA9PiB2YWx1ZSA9PT0gbnVsbCB8fCBndWFyZC50eXBlR3VhcmQodmFsdWUpXG4gIH07XG59XG5cbi8qKlxuICogV2lkZW5zIGEgZ3VhcmQgdG8gYWxzbyBhY2NlcHQgYHVuZGVmaW5lZGAsIHdoaWNoIGlzIHdoYXQgYW4gb3B0aW9uYWwgcGFyYW1ldGVyIHJlY2VpdmVzIHdoZW4gaXQgaXMgbGVmdCBvdXQuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgdGhlIGd1YXJkIG5hcnJvd3MgdG8uXG4gKiBAcGFyYW0gZ3VhcmQgLSBUaGUgZ3VhcmQgdG8gd2lkZW4uXG4gKiBAcmV0dXJucyBBIGd1YXJkIGFjY2VwdGluZyB3aGF0IGBndWFyZGAgYWNjZXB0cywgb3IgYHVuZGVmaW5lZGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvcHRpb25hbEd1YXJkPFQ+KGd1YXJkOiBFeHBlY3RlZFR5cGVHdWFyZDxUPik6IEV4cGVjdGVkVHlwZUd1YXJkPFQgfCB1bmRlZmluZWQ+IHtcbiAgcmV0dXJuIHtcbiAgICBleHBlY3RlZDogYCR7Z3VhcmQuZXhwZWN0ZWR9IG9yIHVuZGVmaW5lZGAsXG4gICAgdHlwZUd1YXJkOiAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBUIHwgdW5kZWZpbmVkID0+IHZhbHVlID09PSB1bmRlZmluZWQgfHwgZ3VhcmQudHlwZUd1YXJkKHZhbHVlKVxuICB9O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVTY2hlbWE8VD4odmFsaWRhdGU6ICh2YWx1ZTogdW5rbm93bikgPT4gU3RhbmRhcmRTY2hlbWFWMS5SZXN1bHQ8VD4sIHZlbmRvcjogc3RyaW5nIHwgdW5kZWZpbmVkKTogU3RhbmRhcmRTY2hlbWFWMTx1bmtub3duLCBUPiB7XG4gIHJldHVybiB7XG4gICAgJ35zdGFuZGFyZCc6IHtcbiAgICAgIHZhbGlkYXRlLFxuICAgICAgdmVuZG9yOiB2ZW5kb3IgPz8gTElCUkFSWV9OQU1FLFxuICAgICAgdmVyc2lvbjogMVxuICAgIH1cbiAgfTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWlCQSxxQkFBNkI7QUFDN0IsMEJBQXVCO0FBQ3ZCLHlCQU1PO0FBc0hBLE1BQU0sZ0JBQTRDLEVBQUUsVUFBVSxhQUFhLFdBQVcsNkJBQVU7QUFLaEcsTUFBTSxlQUEwQyxFQUFFLFVBQVUsWUFBWSxXQUFXLDRCQUFTO0FBSzVGLE1BQU0sZUFBMEMsRUFBRSxVQUFVLFlBQVksV0FBVyw0QkFBUztBQUs1RixNQUFNLHFCQUFrRCxFQUFFLFVBQVUsdUJBQXVCLFdBQVcsaUNBQWM7QUFLcEgsTUFBTSxrQkFBZ0QsRUFBRSxVQUFVLGFBQWEsV0FBVywrQkFBWTtBQWF0RyxTQUFTLHNCQUNkLFlBQ0EsU0FDc0Q7QUFDdEQsUUFBTSxvQkFBZ0IsNEJBQThDLFVBQVU7QUFDOUUsU0FBTyxhQUFhLENBQUMsVUFBdUU7QUFDMUYsUUFBSSxDQUFDLE1BQU0sUUFBUSxLQUFLLEdBQUc7QUFDekIsYUFBTyxFQUFFLFFBQVEsQ0FBQyxFQUFFLFNBQVMsNkJBQTZCLENBQUMsRUFBRTtBQUFBLElBQy9EO0FBRUEsUUFBSSxNQUFNLFNBQVMsY0FBYyxRQUFRO0FBQ3ZDLGFBQU8sRUFBRSxRQUFRLENBQUMsRUFBRSxTQUFTLG9CQUFvQixPQUFPLGNBQWMsTUFBTSxDQUFDLHFCQUFxQixPQUFPLE1BQU0sTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFO0FBQUEsSUFDL0g7QUFFQSxVQUFNLFNBQVMsY0FBYyxRQUFRLENBQUMsV0FBVyxVQUFvQyxVQUFVLFVBQVUsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLFNBQVMsWUFBWSxVQUFVLFFBQVEsS0FBSyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztBQUM3TCxXQUFPLE9BQU8sV0FBVyxJQUFJLEVBQUUsV0FBTyw0QkFBa0MsS0FBSyxFQUFFLElBQUksRUFBRSxPQUFPO0FBQUEsRUFDOUYsR0FBRyxTQUFTLE1BQU07QUFDcEI7QUFTTyxTQUFTLHNCQUF5QixRQUFzRTtBQUM3RyxTQUFPO0FBQUEsSUFDTCxDQUFDLFVBQStDLE9BQU8sVUFBVSxLQUFLLElBQUksRUFBRSxNQUFNLElBQUksRUFBRSxRQUFRLENBQUMsRUFBRSxTQUFTLFlBQVksT0FBTyxRQUFRLElBQUksQ0FBQyxFQUFFO0FBQUEsSUFDOUksT0FBTztBQUFBLEVBQ1Q7QUFDRjtBQVVPLFNBQVMsa0JBQXVDLFVBQW1FO0FBQ3hILFNBQU87QUFDVDtBQVNPLFNBQVMsY0FBaUIsT0FBMEQ7QUFDekYsU0FBTztBQUFBLElBQ0wsVUFBVSxHQUFHLE1BQU0sUUFBUTtBQUFBLElBQzNCLFdBQVcsQ0FBQyxVQUFzQyxVQUFVLFFBQVEsTUFBTSxVQUFVLEtBQUs7QUFBQSxFQUMzRjtBQUNGO0FBU08sU0FBUyxjQUFpQixPQUErRDtBQUM5RixTQUFPO0FBQUEsSUFDTCxVQUFVLEdBQUcsTUFBTSxRQUFRO0FBQUEsSUFDM0IsV0FBVyxDQUFDLFVBQTJDLFVBQVUsVUFBYSxNQUFNLFVBQVUsS0FBSztBQUFBLEVBQ3JHO0FBQ0Y7QUFFQSxTQUFTLGFBQWdCLFVBQTBELFFBQTBEO0FBQzNJLFNBQU87QUFBQSxJQUNMLGFBQWE7QUFBQSxNQUNYO0FBQUEsTUFDQSxRQUFRLFVBQVU7QUFBQSxNQUNsQixTQUFTO0FBQUEsSUFDWDtBQUFBLEVBQ0Y7QUFDRjsiLAogICJuYW1lcyI6IFtdCn0K
148
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2FwaS1jb250cmFjdC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFRoZSBjb250cmFjdCBvZiBhbiBBUEkgb25lIG1vZHVsZSBleHBvc2VzIHRvIGFub3RoZXI6IHdoaWNoIG1ldGhvZHMgaXQgcHJvbWlzZXMsIGFuZCBhXG4gKiB7QGxpbmsgaHR0cHM6Ly9zdGFuZGFyZHNjaGVtYS5kZXYgfCBTdGFuZGFyZCBTY2hlbWF9IG92ZXIgZWFjaCBtZXRob2QncyBhcmd1bWVudHMgYW5kIHJldHVybiB2YWx1ZS5cbiAqXG4gKiBUaGUgc2NoZW1hcyBhcmUgcGxhaW4gb2JqZWN0cyBvdmVyIHBsYWluIGZ1bmN0aW9ucywgd2hpY2ggYSB0eXBlIGd1YXJkIGFscmVhZHkgaXMsIHNvIGEgY29udHJhY3QgY2FuIGNyb3NzIGFcbiAqIGJvdW5kYXJ5IGJldHdlZW4gdHdvIGNvcGllcyBvZiBhIGxpYnJhcnkgYW5kIHN0aWxsIGJlIHJ1biBieSB3aGljaGV2ZXIgY29weSByZWFkcyBpdC4gVGhlIGJ1aWxkZXJzIGhlcmUgdHVyblxuICogdGhlIGd1YXJkcyBhIG1vZHVsZSBhbHJlYWR5IGhhcyBpbnRvIHRoZSB0d28gc2hhcGVzIGEgbWV0aG9kIGNvbnRyYWN0IG5lZWRzOiBvbmUgdmFsdWUgKGFuIG91dHB1dCkgYW5kIG9uZVxuICogYXJndW1lbnQgbGlzdCAoYW4gaW5wdXQpLiB6b2QgLyB2YWxpYm90IC8gYXJrdHlwZSBzY2hlbWFzIHBsdWcgaW50byB0aGUgc2FtZSBzbG90cyB1bmNoYW5nZWQ7IHRoaXMgbW9kdWxlIGp1c3RcbiAqIGRvZXMgbm90IG1ha2UgZXZlcnkgcHJvdmlkZXIgYnVuZGxlIG9uZSB0byBkZXNjcmliZSB0d28gYXJndW1lbnRzLlxuICpcbiAqIFJ1bm5pbmcgdGhlIHNjaGVtYXMgaXMgbGVmdCB0byB3aG9ldmVyIG93bnMgdGhlIGNhbGwgcGF0aCwgc2luY2UgdGhhdCBpcyB3aGVyZSBhbiBpc3N1ZSBjYW4gYmUgcmVwb3J0ZWQuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBTdGFuZGFyZFNjaGVtYVYxIH0gZnJvbSAnQHN0YW5kYXJkLXNjaGVtYS9zcGVjJztcblxuaW1wb3J0IHR5cGUge1xuICBHdWFyZGVkVHlwZSxcbiAgTGl0ZXJhbCxcbiAgVHlwZUd1YXJkXG59IGZyb20gJy4vdHlwZS1ndWFyZHMudHMnO1xuXG5pbXBvcnQgeyBMSUJSQVJZX05BTUUgfSBmcm9tICcuL2xpYnJhcnkudHMnO1xuaW1wb3J0IHsgY2FzdFRvIH0gZnJvbSAnLi9vYmplY3QtdXRpbHMudHMnO1xuaW1wb3J0IHtcbiAgYXJyYXlUeXBlR3VhcmQsXG4gIGluc3RhbmNlT2ZUeXBlR3VhcmQsXG4gIGlzQm9vbGVhbixcbiAgaXNOdW1iZXIsXG4gIGlzU3RyaW5nLFxuICBpc1N0cmluZ0FycmF5LFxuICBpc1VuZGVmaW5lZCxcbiAgbGl0ZXJhbFR5cGVHdWFyZCxcbiAgdW5pb25UeXBlR3VhcmRcbn0gZnJvbSAnLi90eXBlLWd1YXJkcy50cyc7XG5cbi8qKlxuICogVGhlIGNvbnRyYWN0IGFuIEFQSSBkZWNsYXJlczogZXZlcnkga2V5IGlzIGEgbWV0aG9kIHRoZSBBUEkgcHJvbWlzZXMgdG8gZXhwb3NlLCBhbmQgaXRzIHZhbHVlIG9wdGlvbmFsbHlcbiAqIGNhcnJpZXMgdGhlIHBheWxvYWQgc2NoZW1hcyBmb3IgdGhhdCBtZXRob2QuXG4gKlxuICogVHlwZWQgb3ZlciB0aGUgQVBJIHdoZW4gb25lIGlzIG5hbWVkOiBgQXBpQ29udHJhY3Q8TXlBcGk+YCBoYXMgZXhhY3RseSBvbmUgZW50cnkgcGVyIGZ1bmN0aW9uIG1lbWJlciBvZlxuICogYE15QXBpYCAoYSBtaXNzaW5nIG1ldGhvZCwgYW4gZXh0cmEgb25lIG9yIGEgbWlzc3BlbGxlZCBvbmUgZG9lcyBub3QgY29tcGlsZSksIGFuZCBlYWNoIGVudHJ5J3Mgc2NoZW1hcyBtdXN0XG4gKiBwcm9kdWNlIHRoYXQgbWV0aG9kJ3MgcGFyYW1ldGVycyBhbmQgYXdhaXRlZCByZXR1cm4gdmFsdWUuIFdpdGhvdXQgYSB0eXBlIGFyZ3VtZW50LCBvciBmb3IgYG9iamVjdGAsIGl0IGlzIHRoZVxuICogbG9vc2UgcmVjb3JkIGEgcmVhZGVyIHRoYXQga25vd3Mgbm90aGluZyBhYm91dCB0aGUgQVBJIHNlZXMuXG4gKlxuICogQHR5cGVQYXJhbSBUQXBpIC0gVGhlIEFQSSB0aGUgY29udHJhY3QgZGVzY3JpYmVzLiBgb2JqZWN0YCwgdGhlIGRlZmF1bHQsIG1lYW5zIFwibm90IHR5cGVkXCIuXG4gKi9cbmV4cG9ydCB0eXBlIEFwaUNvbnRyYWN0PFRBcGkgZXh0ZW5kcyBvYmplY3QgPSBvYmplY3Q+ID0gb2JqZWN0IGV4dGVuZHMgVEFwaSA/IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIEFwaU1ldGhvZENvbnRyYWN0Pj5cbiAgOiBUeXBlZEFwaUNvbnRyYWN0PFRBcGk+O1xuXG4vKipcbiAqIFRoZSBzY2hlbWEgYnVpbGRlcnMgb2YgdGhpcyBtb2R1bGUgd2l0aCB0aGUgU3RhbmRhcmQgU2NoZW1hIGB2ZW5kb3JgIGFscmVhZHkgYm91bmQsIGFzXG4gKiB7QGxpbmsgY3JlYXRlQXBpQ29udHJhY3RTY2hlbWFCdWlsZGVyc30gcmV0dXJucyB0aGVtLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwaUNvbnRyYWN0U2NoZW1hQnVpbGRlcnMge1xuICAvKipcbiAgICoge0BsaW5rIGNyZWF0ZUFyZ3VtZW50c1NjaGVtYX0sIHJlcG9ydGluZyB0aGUgYm91bmQgdmVuZG9yLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIFRQYXJhbWV0ZXJzIC0gVGhlIG1ldGhvZCdzIHBhcmFtZXRlcnMsIGluZmVycmVkIGZyb20gdGhlIGd1YXJkcyBvciBmcm9tIHRoZSBjb250cmFjdCBlbnRyeS5cbiAgICogQHBhcmFtIHBhcmFtZXRlcnMgLSBPbmUgZ3VhcmQgcGVyIHBhcmFtZXRlciwgaW4gb3JkZXIuXG4gICAqIEByZXR1cm5zIFRoZSBzY2hlbWEuXG4gICAqL1xuICByZWFkb25seSBjcmVhdGVBcmd1bWVudHNTY2hlbWE6IDxjb25zdCBUUGFyYW1ldGVycyBleHRlbmRzIHJlYWRvbmx5IHVua25vd25bXT4oXG4gICAgcGFyYW1ldGVyczogQXJndW1lbnRUeXBlR3VhcmRzPFRQYXJhbWV0ZXJzPlxuICApID0+IFN0YW5kYXJkU2NoZW1hVjE8dW5rbm93biwgTXV0YWJsZVR1cGxlPFRQYXJhbWV0ZXJzPj47XG5cbiAgLyoqXG4gICAqIHtAbGluayBjcmVhdGVUeXBlR3VhcmRTY2hlbWF9LCByZXBvcnRpbmcgdGhlIGJvdW5kIHZlbmRvci5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgdGhlIGd1YXJkIG5hcnJvd3MgdG8uXG4gICAqIEBwYXJhbSBndWFyZCAtIFRoZSBndWFyZCBhbmQgd2hhdCBpdCBleHBlY3RzLlxuICAgKiBAcmV0dXJucyBUaGUgc2NoZW1hLlxuICAgKi9cbiAgcmVhZG9ubHkgY3JlYXRlVHlwZUd1YXJkU2NoZW1hOiA8VD4oZ3VhcmQ6IEV4cGVjdGVkVHlwZUd1YXJkPFQ+KSA9PiBTdGFuZGFyZFNjaGVtYVYxPHVua25vd24sIFQ+O1xufVxuXG4vKipcbiAqIFRoZSBwYXlsb2FkIHNjaGVtYXMgZm9yIGEgc2luZ2xlIEFQSSBtZXRob2QuIEJvdGggaGFsdmVzIGFyZSBvcHRpb25hbDogYSBtZXRob2QgbWF5IGRlY2xhcmUgb25seSBpdHMgaW5wdXQsXG4gKiBvbmx5IGl0cyBvdXRwdXQsIG5laXRoZXIgKHRoZSBlbnRyeSB0aGVuIGp1c3QgZGVjbGFyZXMgdGhhdCB0aGUgbWV0aG9kIG11c3QgZXhpc3QpLCBvciBib3RoLlxuICpcbiAqIEB0eXBlUGFyYW0gVFBhcmFtZXRlcnMgLSBUaGUgbWV0aG9kJ3MgcGFyYW1ldGVycywgYXMgYSB0dXBsZSwgd2hpY2ggdGhlIGlucHV0IHNjaGVtYSBtdXN0IHByb2R1Y2UuXG4gKiBAdHlwZVBhcmFtIFRSZXR1cm5WYWx1ZSAtIFRoZSBtZXRob2QncyByZXR1cm4gdmFsdWUsIGF3YWl0ZWQsIHdoaWNoIHRoZSBvdXRwdXQgc2NoZW1hIG11c3QgcHJvZHVjZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcGlNZXRob2RDb250cmFjdDxUUGFyYW1ldGVycyA9IHVua25vd24sIFRSZXR1cm5WYWx1ZSA9IHVua25vd24+IHtcbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGUgbWV0aG9kJ3MgYXJndW1lbnRzLCBhcyBhbiBhcnJheS5cbiAgICovXG4gIHJlYWRvbmx5IGlucHV0PzogU3RhbmRhcmRTY2hlbWFWMTx1bmtub3duLCBUUGFyYW1ldGVycz47XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGUgbWV0aG9kJ3MgcmV0dXJuIHZhbHVlLCBvciwgd2hlbiB0aGUgbWV0aG9kIHJldHVybnMgYSB0aGVuYWJsZSwgdGhlIHZhbHVlIGl0IHJlc29sdmVzIHRvLlxuICAgKi9cbiAgcmVhZG9ubHkgb3V0cHV0PzogU3RhbmRhcmRTY2hlbWFWMTx1bmtub3duLCBUUmV0dXJuVmFsdWU+O1xufVxuXG4vKipcbiAqIFRoZSBuYW1lcyBvZiB0aGUgZnVuY3Rpb24gbWVtYmVycyBvZiBhbiBBUEksIHdoaWNoIGFyZSBleGFjdGx5IHRoZSBrZXlzIGEgdHlwZWQge0BsaW5rIEFwaUNvbnRyYWN0fSBoYXMuXG4gKlxuICogQHR5cGVQYXJhbSBUQXBpIC0gVGhlIEFQSS5cbiAqL1xuZXhwb3J0IHR5cGUgQXBpTWV0aG9kTmFtZTxUQXBpIGV4dGVuZHMgb2JqZWN0PiA9IGtleW9mIEFwaU1ldGhvZHM8VEFwaT4gJiBzdHJpbmc7XG5cbi8qKlxuICogVGhlIGZ1bmN0aW9uIG1lbWJlcnMgb2YgYW4gQVBJLlxuICpcbiAqIEB0eXBlUGFyYW0gVEFwaSAtIFRoZSBBUEkuXG4gKi9cbmV4cG9ydCB0eXBlIEFwaU1ldGhvZHM8VEFwaSBleHRlbmRzIG9iamVjdD4gPSB7XG4gIFtUS2V5IGluIGtleW9mIFRBcGkgYXMgVEFwaVtUS2V5XSBleHRlbmRzICguLi5hcmd1bWVudHNfOiBuZXZlcikgPT4gdW5rbm93biA/IFRLZXkgOiBuZXZlcl06IFRBcGlbVEtleV07XG59O1xuXG4vKipcbiAqIE9uZSB0eXBlIGd1YXJkIHBlciBwYXJhbWV0ZXIgb2YgYSBtZXRob2QsIGluIG9yZGVyLlxuICpcbiAqIEB0eXBlUGFyYW0gVFBhcmFtZXRlcnMgLSBUaGUgbWV0aG9kJ3MgcGFyYW1ldGVycy5cbiAqL1xuZXhwb3J0IHR5cGUgQXJndW1lbnRUeXBlR3VhcmRzPFRQYXJhbWV0ZXJzIGV4dGVuZHMgcmVhZG9ubHkgdW5rbm93bltdPiA9IHtcbiAgcmVhZG9ubHkgW1RJbmRleCBpbiBrZXlvZiBUUGFyYW1ldGVyc106IEV4cGVjdGVkVHlwZUd1YXJkPFRQYXJhbWV0ZXJzW1RJbmRleF0+O1xufTtcbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGNyZWF0ZUFyZ3VtZW50c1NjaGVtYX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlQXJndW1lbnRzU2NoZW1hT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgU3RhbmRhcmQgU2NoZW1hIGB2ZW5kb3JgIHRoZSBzY2hlbWEgcmVwb3J0cy4gRGVmYXVsdHMgdG8gdGhpcyBsaWJyYXJ5J3MgbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IHZlbmRvcj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgY3JlYXRlVHlwZUd1YXJkU2NoZW1hfTogdGhlIGd1YXJkLCB3aGF0IGl0IGV4cGVjdHMsIGFuZCBvcHRpb25hbGx5IHRoZSBzY2hlbWEncyB2ZW5kb3IuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgdGhlIGd1YXJkIG5hcnJvd3MgdG8uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlVHlwZUd1YXJkU2NoZW1hUGFyYW1zPFQ+IGV4dGVuZHMgRXhwZWN0ZWRUeXBlR3VhcmQ8VD4ge1xuICAvKipcbiAgICogVGhlIFN0YW5kYXJkIFNjaGVtYSBgdmVuZG9yYCB0aGUgc2NoZW1hIHJlcG9ydHMuIERlZmF1bHRzIHRvIHRoaXMgbGlicmFyeSdzIG5hbWUuXG4gICAqL1xuICByZWFkb25seSB2ZW5kb3I/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogT25lIHZhbHVlIGEgc2NoZW1hIGFjY2VwdHMsIGRlc2NyaWJlZCBieSBhIHR5cGUgZ3VhcmQgYW5kIGJ5IHdoYXQgaXQgZXhwZWN0cywgZm9yIHRoZSBpc3N1ZSBtZXNzYWdlLlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIHRoZSBndWFyZCBuYXJyb3dzIHRvLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEV4cGVjdGVkVHlwZUd1YXJkPFQ+IHtcbiAgLyoqXG4gICAqIFdoYXQgdGhlIHZhbHVlIHNob3VsZCBoYXZlIGJlZW4sIHBocmFzZWQgdG8gZm9sbG93IFwiRXhwZWN0ZWRcIiwgZS5nLiBgJ2Egc3RyaW5nJ2AuXG4gICAqL1xuICByZWFkb25seSBleHBlY3RlZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBEZWNpZGVzIHdoZXRoZXIgdGhlIHZhbHVlIGlzIGFjY2VwdGFibGUuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICogQHJldHVybnMgV2hldGhlciB0aGUgdmFsdWUgaXMgYSBgVGAuXG4gICAqL1xuICByZWFkb25seSB0eXBlR3VhcmQ6ICh2YWx1ZTogdW5rbm93bikgPT4gdmFsdWUgaXMgVDtcbn1cblxuLyoqXG4gKiBUaGUge0BsaW5rIEFwaUNvbnRyYWN0fSBvZiBhIG5hbWVkIEFQSTogb25lIGVudHJ5IHBlciBmdW5jdGlvbiBtZW1iZXIsIGVhY2ggdHlwZWQgYWdhaW5zdCB0aGF0IG1lbWJlci4gQm90aFxuICogc2NoZW1hcyBhcmUgUkVRVUlSRUQgaGVyZSwgc28gYSB0eXBlZCBjb250cmFjdCBpcyBhIGZ1bGwgZGVzY3JpcHRpb24gb2YgZXZlcnkgc2lnbmF0dXJlIGFuZCBhIGB7fWAgZW50cnkgZG9lc1xuICogbm90IGNvbXBpbGUuIE9ubHkgdGhlIGxvb3NlIGZvcm0gbGVhdmVzIHRoZW0gb3B0aW9uYWwuXG4gKlxuICogQHR5cGVQYXJhbSBUQXBpIC0gVGhlIEFQSSB0aGUgY29udHJhY3QgZGVzY3JpYmVzLlxuICovXG5leHBvcnQgdHlwZSBUeXBlZEFwaUNvbnRyYWN0PFRBcGkgZXh0ZW5kcyBvYmplY3Q+ID0ge1xuICByZWFkb25seSBbVEtleSBpbiBBcGlNZXRob2ROYW1lPFRBcGk+XS0/OiBUQXBpW1RLZXldIGV4dGVuZHMgKC4uLmFyZ3VtZW50c186IGluZmVyIFRQYXJhbWV0ZXJzKSA9PiBpbmZlciBUUmV0dXJuVmFsdWUgPyBSZXF1aXJlZDxBcGlNZXRob2RDb250cmFjdDxUUGFyYW1ldGVycywgQXdhaXRlZDxUUmV0dXJuVmFsdWU+Pj5cbiAgICA6IG5ldmVyO1xufTtcblxudHlwZSBNdXRhYmxlVHVwbGU8VFR1cGxlIGV4dGVuZHMgcmVhZG9ubHkgdW5rbm93bltdPiA9IHsgLXJlYWRvbmx5IFtUSW5kZXggaW4ga2V5b2YgVFR1cGxlXTogVFR1cGxlW1RJbmRleF0gfTtcblxuLyoqXG4gKiBBY2NlcHRzIGEgYm9vbGVhbi5cbiAqL1xuZXhwb3J0IGNvbnN0IEJPT0xFQU5fR1VBUkQ6IEV4cGVjdGVkVHlwZUd1YXJkPGJvb2xlYW4+ID0geyBleHBlY3RlZDogJ2EgYm9vbGVhbicsIHR5cGVHdWFyZDogaXNCb29sZWFuIH07XG5cbi8qKlxuICogQWNjZXB0cyBhIG51bWJlci5cbiAqL1xuZXhwb3J0IGNvbnN0IE5VTUJFUl9HVUFSRDogRXhwZWN0ZWRUeXBlR3VhcmQ8bnVtYmVyPiA9IHsgZXhwZWN0ZWQ6ICdhIG51bWJlcicsIHR5cGVHdWFyZDogaXNOdW1iZXIgfTtcblxuLyoqXG4gKiBBY2NlcHRzIGEgc3RyaW5nLiBTcHJlYWQgaXQgdG8gc2F5IHdoYXQgdGhlIHN0cmluZyBpczogYHsgLi4uU1RSSU5HX0dVQVJELCBleHBlY3RlZDogJ2EgcGF0aCcgfWAuXG4gKi9cbmV4cG9ydCBjb25zdCBTVFJJTkdfR1VBUkQ6IEV4cGVjdGVkVHlwZUd1YXJkPHN0cmluZz4gPSB7IGV4cGVjdGVkOiAnYSBzdHJpbmcnLCB0eXBlR3VhcmQ6IGlzU3RyaW5nIH07XG5cbi8qKlxuICogQWNjZXB0cyBhbiBhcnJheSBvZiBzdHJpbmdzLlxuICovXG5leHBvcnQgY29uc3QgU1RSSU5HX0FSUkFZX0dVQVJEOiBFeHBlY3RlZFR5cGVHdWFyZDxzdHJpbmdbXT4gPSB7IGV4cGVjdGVkOiAnYW4gYXJyYXkgb2Ygc3RyaW5ncycsIHR5cGVHdWFyZDogaXNTdHJpbmdBcnJheSB9O1xuXG4vKipcbiAqIEFjY2VwdHMgYHVuZGVmaW5lZGAsIHdoaWNoIGlzIHRoZSBvdXRwdXQgb2YgYSBtZXRob2QgcmV0dXJuaW5nIGB2b2lkYCBvciBgUHJvbWlzZTx2b2lkPmAuXG4gKi9cbmV4cG9ydCBjb25zdCBVTkRFRklORURfR1VBUkQ6IEV4cGVjdGVkVHlwZUd1YXJkPHVuZGVmaW5lZD4gPSB7IGV4cGVjdGVkOiAndW5kZWZpbmVkJywgdHlwZUd1YXJkOiBpc1VuZGVmaW5lZCB9O1xuXG4vKipcbiAqIFdpZGVucyBhIGd1YXJkIHRvIGFuIGFycmF5IHdob3NlIGV2ZXJ5IGl0ZW0gYGl0ZW1HdWFyZGAgYWNjZXB0cy5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSBvZiBhbiBpdGVtLlxuICogQHBhcmFtIGl0ZW1HdWFyZCAtIFRoZSBndWFyZCBmb3Igb25lIGl0ZW0uXG4gKiBAcmV0dXJucyBUaGUgZ3VhcmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcnJheUd1YXJkPFQ+KGl0ZW1HdWFyZDogRXhwZWN0ZWRUeXBlR3VhcmQ8VD4pOiBFeHBlY3RlZFR5cGVHdWFyZDxUW10+IHtcbiAgcmV0dXJuIGNyZWF0ZUV4cGVjdGVkVHlwZUd1YXJkKGBhbiBhcnJheSB3aG9zZSBldmVyeSBpdGVtIGlzICR7aXRlbUd1YXJkLmV4cGVjdGVkfWAsIGFycmF5VHlwZUd1YXJkKGl0ZW1HdWFyZC50eXBlR3VhcmQpKTtcbn1cblxuLyoqXG4gKiBCaW5kcyB0aGUgU3RhbmRhcmQgU2NoZW1hIGB2ZW5kb3JgIG9uY2UsIHNvIGEgY29udHJhY3QgZG9lcyBub3QgcGFzcyBpdCB0byBldmVyeSBzY2hlbWEgYnVpbGRlci4gRGVzdHJ1Y3R1cmUgdGhlXG4gKiByZXN1bHQgdW5kZXIgdGhlIGJ1aWxkZXJzJyBvd24gbmFtZXMgYW5kIHRoZSBjYWxscyByZWFkIGV4YWN0bHkgYXMgdGhlIHVuYm91bmQgb25lcyBkbzpcbiAqXG4gKiBgYGB0c1xuICogY29uc3QgeyBjcmVhdGVBcmd1bWVudHNTY2hlbWEsIGNyZWF0ZVR5cGVHdWFyZFNjaGVtYSB9ID0gY3JlYXRlQXBpQ29udHJhY3RTY2hlbWFCdWlsZGVycygnbXktcGx1Z2luJyk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gdmVuZG9yIC0gVGhlIHZlbmRvciBldmVyeSBzY2hlbWEgcmVwb3J0cy5cbiAqIEByZXR1cm5zIFRoZSBib3VuZCBidWlsZGVycy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFwaUNvbnRyYWN0U2NoZW1hQnVpbGRlcnModmVuZG9yOiBzdHJpbmcpOiBBcGlDb250cmFjdFNjaGVtYUJ1aWxkZXJzIHtcbiAgcmV0dXJuIHtcbiAgICBjcmVhdGVBcmd1bWVudHNTY2hlbWE6IDxjb25zdCBUUGFyYW1ldGVycyBleHRlbmRzIHJlYWRvbmx5IHVua25vd25bXT4ocGFyYW1ldGVyczogQXJndW1lbnRUeXBlR3VhcmRzPFRQYXJhbWV0ZXJzPikgPT4gY3JlYXRlQXJndW1lbnRzU2NoZW1hKHBhcmFtZXRlcnMsIHsgdmVuZG9yIH0pLFxuICAgIGNyZWF0ZVR5cGVHdWFyZFNjaGVtYTogPFQ+KGd1YXJkOiBFeHBlY3RlZFR5cGVHdWFyZDxUPikgPT4gY3JlYXRlVHlwZUd1YXJkU2NoZW1hKHsgLi4uZ3VhcmQsIHZlbmRvciB9KVxuICB9O1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgaW5wdXQgc2NoZW1hIG9mIGEgbWV0aG9kIGNvbnRyYWN0OiBhIHNjaGVtYSBvdmVyIHRoZSBtZXRob2QncyBBUkdVTUVOVCBMSVNULCBvbmUgdHlwZSBndWFyZCBwZXJcbiAqIHBhcmFtZXRlci4gQW4gYXJndW1lbnQgdGhhdCBmYWlscyBpdHMgZ3VhcmQgaXMgcmVwb3J0ZWQgd2l0aCBpdHMgaW5kZXggYXMgdGhlIGlzc3VlIHBhdGgsIGFuZCBhbiBhcmd1bWVudCBsaXN0XG4gKiBsb25nZXIgdGhhbiB0aGUgcGFyYW1ldGVyIGxpc3QgaXMgcmVmdXNlZC4gQSBtaXNzaW5nIGFyZ3VtZW50IHJlYWNoZXMgaXRzIGd1YXJkIGFzIGB1bmRlZmluZWRgLCBzbyBhbiBvcHRpb25hbFxuICogcGFyYW1ldGVyJ3MgZ3VhcmQgYWNjZXB0cyBgdW5kZWZpbmVkYCAoc2VlIHtAbGluayBvcHRpb25hbEd1YXJkfSkuXG4gKlxuICogQHR5cGVQYXJhbSBUUGFyYW1ldGVycyAtIFRoZSBtZXRob2QncyBwYXJhbWV0ZXJzLCBpbmZlcnJlZCBmcm9tIHRoZSBndWFyZHMgb3IgZnJvbSB0aGUgY29udHJhY3QgZW50cnkuXG4gKiBAcGFyYW0gcGFyYW1ldGVycyAtIE9uZSBndWFyZCBwZXIgcGFyYW1ldGVyLCBpbiBvcmRlci5cbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIHRoZSBzY2hlbWEuXG4gKiBAcmV0dXJucyBUaGUgc2NoZW1hLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQXJndW1lbnRzU2NoZW1hPGNvbnN0IFRQYXJhbWV0ZXJzIGV4dGVuZHMgcmVhZG9ubHkgdW5rbm93bltdPihcbiAgcGFyYW1ldGVyczogQXJndW1lbnRUeXBlR3VhcmRzPFRQYXJhbWV0ZXJzPixcbiAgb3B0aW9ucz86IENyZWF0ZUFyZ3VtZW50c1NjaGVtYU9wdGlvbnNcbik6IFN0YW5kYXJkU2NoZW1hVjE8dW5rbm93biwgTXV0YWJsZVR1cGxlPFRQYXJhbWV0ZXJzPj4ge1xuICBjb25zdCBwYXJhbWV0ZXJMaXN0ID0gY2FzdFRvPHJlYWRvbmx5IEV4cGVjdGVkVHlwZUd1YXJkPHVua25vd24+W10+KHBhcmFtZXRlcnMpO1xuICByZXR1cm4gY3JlYXRlU2NoZW1hKCh2YWx1ZTogdW5rbm93bik6IFN0YW5kYXJkU2NoZW1hVjEuUmVzdWx0PE11dGFibGVUdXBsZTxUUGFyYW1ldGVycz4+ID0+IHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICByZXR1cm4geyBpc3N1ZXM6IFt7IG1lc3NhZ2U6ICdFeHBlY3RlZCBhbiBhcmd1bWVudCBsaXN0LicgfV0gfTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUubGVuZ3RoID4gcGFyYW1ldGVyTGlzdC5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB7IGlzc3VlczogW3sgbWVzc2FnZTogYEV4cGVjdGVkIGF0IG1vc3QgJHtTdHJpbmcocGFyYW1ldGVyTGlzdC5sZW5ndGgpfSBhcmd1bWVudChzKSwgZ290ICR7U3RyaW5nKHZhbHVlLmxlbmd0aCl9LmAgfV0gfTtcbiAgICB9XG5cbiAgICBjb25zdCBpc3N1ZXMgPSBwYXJhbWV0ZXJMaXN0LmZsYXRNYXAoKHBhcmFtZXRlciwgaW5kZXgpOiBTdGFuZGFyZFNjaGVtYVYxLklzc3VlW10gPT4gcGFyYW1ldGVyLnR5cGVHdWFyZCh2YWx1ZVtpbmRleF0pID8gW10gOiBbeyBtZXNzYWdlOiBgRXhwZWN0ZWQgJHtwYXJhbWV0ZXIuZXhwZWN0ZWR9LmAsIHBhdGg6IFtpbmRleF0gfV0pO1xuICAgIHJldHVybiBpc3N1ZXMubGVuZ3RoID09PSAwID8geyB2YWx1ZTogY2FzdFRvPE11dGFibGVUdXBsZTxUUGFyYW1ldGVycz4+KHZhbHVlKSB9IDogeyBpc3N1ZXMgfTtcbiAgfSwgb3B0aW9ucz8udmVuZG9yKTtcbn1cblxuLyoqXG4gKiBQYWlycyBhIHR5cGUgZ3VhcmQgd2l0aCB3aGF0IGl0IGV4cGVjdHMuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgdGhlIGd1YXJkIG5hcnJvd3MgdG8uXG4gKiBAcGFyYW0gZXhwZWN0ZWQgLSBXaGF0IHRoZSB2YWx1ZSBzaG91bGQgaGF2ZSBiZWVuLCBwaHJhc2VkIHRvIGZvbGxvdyBcIkV4cGVjdGVkXCIsIGUuZy4gYCdhIHN0cmluZydgLlxuICogQHBhcmFtIHR5cGVHdWFyZCAtIFRoZSBndWFyZC5cbiAqIEByZXR1cm5zIFRoZSBndWFyZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUV4cGVjdGVkVHlwZUd1YXJkPFQ+KGV4cGVjdGVkOiBzdHJpbmcsIHR5cGVHdWFyZDogVHlwZUd1YXJkPFQ+KTogRXhwZWN0ZWRUeXBlR3VhcmQ8VD4ge1xuICByZXR1cm4geyBleHBlY3RlZCwgdHlwZUd1YXJkIH07XG59XG5cbi8qKlxuICogQnVpbGRzIGEgc2NoZW1hIG92ZXIgb25lIHZhbHVlIGZyb20gYSB0eXBlIGd1YXJkOiB0aGUgb3V0cHV0IHNjaGVtYSBvZiBhIG1ldGhvZCBjb250cmFjdCwgdHlwaWNhbGx5LlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIHRoZSBndWFyZCBuYXJyb3dzIHRvLlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBndWFyZCwgd2hhdCBpdCBleHBlY3RzLCBhbmQgb3B0aW9uYWxseSB0aGUgc2NoZW1hJ3MgdmVuZG9yLlxuICogQHJldHVybnMgVGhlIHNjaGVtYS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVR5cGVHdWFyZFNjaGVtYTxUPihwYXJhbXM6IENyZWF0ZVR5cGVHdWFyZFNjaGVtYVBhcmFtczxUPik6IFN0YW5kYXJkU2NoZW1hVjE8dW5rbm93biwgVD4ge1xuICByZXR1cm4gY3JlYXRlU2NoZW1hKFxuICAgICh2YWx1ZTogdW5rbm93bik6IFN0YW5kYXJkU2NoZW1hVjEuUmVzdWx0PFQ+ID0+IHBhcmFtcy50eXBlR3VhcmQodmFsdWUpID8geyB2YWx1ZSB9IDogeyBpc3N1ZXM6IFt7IG1lc3NhZ2U6IGBFeHBlY3RlZCAke3BhcmFtcy5leHBlY3RlZH0uYCB9XSB9LFxuICAgIHBhcmFtcy52ZW5kb3JcbiAgKTtcbn1cblxuLyoqXG4gKiBTdGF0ZXMgYSBjb250cmFjdCBhZ2FpbnN0IGFuIEFQSSB0eXBlLCBzbyBldmVyeSBlbnRyeSBpcyBjaGVja2VkIGFnYWluc3QgaXRzIG1ldGhvZCBhbmQgdGhlIHNjaGVtYSBidWlsZGVyc1xuICogaW5zaWRlIGl0IGluZmVyIHRoZWlyIHR5cGVzIGZyb20gdGhlIG1ldGhvZCByYXRoZXIgdGhhbiBmcm9tIGEgcmVzdGF0ZWQgdHVwbGUuIEl0IHJldHVybnMgdGhlIGNvbnRyYWN0IGFzIGlzLlxuICpcbiAqIEB0eXBlUGFyYW0gVEFwaSAtIFRoZSBBUEkgdGhlIGNvbnRyYWN0IGRlc2NyaWJlcy5cbiAqIEBwYXJhbSBjb250cmFjdCAtIFRoZSBjb250cmFjdC5cbiAqIEByZXR1cm5zIFRoZSBzYW1lIGNvbnRyYWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lQXBpQ29udHJhY3Q8VEFwaSBleHRlbmRzIG9iamVjdD4oY29udHJhY3Q6IFR5cGVkQXBpQ29udHJhY3Q8Tm9JbmZlcjxUQXBpPj4pOiBUeXBlZEFwaUNvbnRyYWN0PFRBcGk+IHtcbiAgcmV0dXJuIGNvbnRyYWN0O1xufVxuXG4vKipcbiAqIEJ1aWxkcyBhIGd1YXJkIGFjY2VwdGluZyBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzLCBvciBvZiBhIGNsYXNzIGRlcml2ZWQgZnJvbSBpdCwgZXhwZWN0aW5nIGBhbiBpbnN0YW5jZSBvZmAgdGhlXG4gKiBjbGFzcydzIG5hbWUuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgYW4gaW5zdGFuY2UuXG4gKiBAcGFyYW0gY29uc3RydWN0b3IgLSBUaGUgY2xhc3MuXG4gKiBAcmV0dXJucyBUaGUgZ3VhcmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnN0YW5jZU9mR3VhcmQ8VD4oY29uc3RydWN0b3I6IGFic3RyYWN0IG5ldyAoLi4uYXJndW1lbnRzXzogbmV2ZXJbXSkgPT4gVCk6IEV4cGVjdGVkVHlwZUd1YXJkPFQ+IHtcbiAgcmV0dXJuIGNyZWF0ZUV4cGVjdGVkVHlwZUd1YXJkKGBhbiBpbnN0YW5jZSBvZiAke2NvbnN0cnVjdG9yLm5hbWV9YCwgaW5zdGFuY2VPZlR5cGVHdWFyZChjb25zdHJ1Y3RvcikpO1xufVxuXG4vKipcbiAqIEJ1aWxkcyBhIGd1YXJkIGFjY2VwdGluZyBleGFjdGx5IHRoZSBrZXlzIG9mIGEgcmVjb3JkLCBleHBlY3RpbmcgYG9uZSBvZmAgdGhlbS4gVHlwaW5nIHRoZSByZWNvcmQgb3ZlciBhIHVuaW9uXG4gKiBtYWtlcyBhIG1lbWJlciBsYXRlciBhZGRlZCB0byB0aGUgdW5pb24gZmFpbCB0byBjb21waWxlIHVudGlsIGl0IGlzIGxpc3RlZC5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgYWNjZXB0ZWQgc3RyaW5ncy5cbiAqIEBwYXJhbSBsaXRlcmFscyAtIEEgcmVjb3JkIHdob3NlIGtleXMgYXJlIHRoZSBhY2NlcHRlZCBzdHJpbmdzLlxuICogQHJldHVybnMgVGhlIGd1YXJkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbGl0ZXJhbEd1YXJkPFQgZXh0ZW5kcyBzdHJpbmc+KGxpdGVyYWxzOiBSZWFkb25seTxSZWNvcmQ8VCwgdHJ1ZT4+KTogRXhwZWN0ZWRUeXBlR3VhcmQ8VD47XG4vKipcbiAqIEJ1aWxkcyBhIGd1YXJkIGFjY2VwdGluZyBleGFjdGx5IHRoZSBsaXN0ZWQgdmFsdWVzLCBleHBlY3RpbmcgYG9uZSBvZmAgdGhlbS5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgYWNjZXB0ZWQgdmFsdWVzLlxuICogQHBhcmFtIGxpdGVyYWxzIC0gVGhlIGFjY2VwdGVkIHZhbHVlcy5cbiAqIEByZXR1cm5zIFRoZSBndWFyZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpdGVyYWxHdWFyZDxUIGV4dGVuZHMgTGl0ZXJhbD4obGl0ZXJhbHM6IHJlYWRvbmx5IFRbXSk6IEV4cGVjdGVkVHlwZUd1YXJkPFQ+O1xuLyoqXG4gKiBCdWlsZHMgYSBndWFyZCBhY2NlcHRpbmcgZXhhY3RseSB0aGUgbGlzdGVkIHZhbHVlcy5cbiAqXG4gKiBAcGFyYW0gbGl0ZXJhbHMgLSBUaGUgYWNjZXB0ZWQgdmFsdWVzLCBhcyBhIGxpc3Qgb3IgYXMgdGhlIGtleXMgb2YgYSByZWNvcmQuXG4gKiBAcmV0dXJucyBUaGUgZ3VhcmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsaXRlcmFsR3VhcmQobGl0ZXJhbHM6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHRydWU+PiB8IHJlYWRvbmx5IExpdGVyYWxbXSk6IEV4cGVjdGVkVHlwZUd1YXJkPExpdGVyYWw+IHtcbiAgY29uc3QgbGl0ZXJhbExpc3Q6IHJlYWRvbmx5IExpdGVyYWxbXSA9IGlzUmVhZG9ubHlBcnJheShsaXRlcmFscykgPyBsaXRlcmFscyA6IE9iamVjdC5rZXlzKGxpdGVyYWxzKTtcbiAgcmV0dXJuIGNyZWF0ZUV4cGVjdGVkVHlwZUd1YXJkKGBvbmUgb2YgJHtsaXRlcmFsTGlzdC5tYXAoKGxpdGVyYWwpID0+IGZvcm1hdExpdGVyYWwobGl0ZXJhbCkpLmpvaW4oJywgJyl9YCwgbGl0ZXJhbFR5cGVHdWFyZChsaXRlcmFsTGlzdCkpO1xufVxuXG4vKipcbiAqIFdpZGVucyBhIGd1YXJkIHRvIGFsc28gYWNjZXB0IGBudWxsYC5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSB0aGUgZ3VhcmQgbmFycm93cyB0by5cbiAqIEBwYXJhbSBndWFyZCAtIFRoZSBndWFyZCB0byB3aWRlbi5cbiAqIEByZXR1cm5zIEEgZ3VhcmQgYWNjZXB0aW5nIHdoYXQgYGd1YXJkYCBhY2NlcHRzLCBvciBgbnVsbGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBudWxsYWJsZUd1YXJkPFQ+KGd1YXJkOiBFeHBlY3RlZFR5cGVHdWFyZDxUPik6IEV4cGVjdGVkVHlwZUd1YXJkPG51bGwgfCBUPiB7XG4gIHJldHVybiB7XG4gICAgZXhwZWN0ZWQ6IGAke2d1YXJkLmV4cGVjdGVkfSBvciBudWxsYCxcbiAgICB0eXBlR3VhcmQ6ICh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIG51bGwgfCBUID0+IHZhbHVlID09PSBudWxsIHx8IGd1YXJkLnR5cGVHdWFyZCh2YWx1ZSlcbiAgfTtcbn1cblxuLyoqXG4gKiBXaWRlbnMgYSBndWFyZCB0byBhbHNvIGFjY2VwdCBgdW5kZWZpbmVkYCwgd2hpY2ggaXMgd2hhdCBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgcmVjZWl2ZXMgd2hlbiBpdCBpcyBsZWZ0IG91dC5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSB0aGUgZ3VhcmQgbmFycm93cyB0by5cbiAqIEBwYXJhbSBndWFyZCAtIFRoZSBndWFyZCB0byB3aWRlbi5cbiAqIEByZXR1cm5zIEEgZ3VhcmQgYWNjZXB0aW5nIHdoYXQgYGd1YXJkYCBhY2NlcHRzLCBvciBgdW5kZWZpbmVkYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9wdGlvbmFsR3VhcmQ8VD4oZ3VhcmQ6IEV4cGVjdGVkVHlwZUd1YXJkPFQ+KTogRXhwZWN0ZWRUeXBlR3VhcmQ8VCB8IHVuZGVmaW5lZD4ge1xuICByZXR1cm4ge1xuICAgIGV4cGVjdGVkOiBgJHtndWFyZC5leHBlY3RlZH0gb3IgdW5kZWZpbmVkYCxcbiAgICB0eXBlR3VhcmQ6ICh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFQgfCB1bmRlZmluZWQgPT4gdmFsdWUgPT09IHVuZGVmaW5lZCB8fCBndWFyZC50eXBlR3VhcmQodmFsdWUpXG4gIH07XG59XG5cbi8qKlxuICogQnVpbGRzIGEgZ3VhcmQgYWNjZXB0aW5nIHdoYXQgYW55IG9mIHRoZSBnaXZlbiBndWFyZHMgYWNjZXB0cywgZXhwZWN0aW5nIHRoZWlyIGBleHBlY3RlZGAgdGV4dHMgam9pbmVkIGJ5IGBvcmAuXG4gKlxuICogQHR5cGVQYXJhbSBUR3VhcmRzIC0gVGhlIGd1YXJkcy5cbiAqIEBwYXJhbSBndWFyZHMgLSBUaGUgZ3VhcmRzLCB0cmllZCBpbiBvcmRlci5cbiAqIEByZXR1cm5zIFRoZSBndWFyZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVuaW9uR3VhcmQ8Y29uc3QgVEd1YXJkcyBleHRlbmRzIHJlYWRvbmx5IEV4cGVjdGVkVHlwZUd1YXJkPHVua25vd24+W10+KFxuICAuLi5ndWFyZHM6IFRHdWFyZHNcbik6IEV4cGVjdGVkVHlwZUd1YXJkPEd1YXJkZWRUeXBlPFRHdWFyZHNbbnVtYmVyXVsndHlwZUd1YXJkJ10+PiB7XG4gIHJldHVybiBjcmVhdGVFeHBlY3RlZFR5cGVHdWFyZChcbiAgICBndWFyZHMubWFwKChndWFyZCkgPT4gZ3VhcmQuZXhwZWN0ZWQpLmpvaW4oJyBvciAnKSxcbiAgICB1bmlvblR5cGVHdWFyZCguLi5ndWFyZHMubWFwKChndWFyZCkgPT4gZ3VhcmQudHlwZUd1YXJkKSlcbiAgKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlU2NoZW1hPFQ+KHZhbGlkYXRlOiAodmFsdWU6IHVua25vd24pID0+IFN0YW5kYXJkU2NoZW1hVjEuUmVzdWx0PFQ+LCB2ZW5kb3I6IHN0cmluZyB8IHVuZGVmaW5lZCk6IFN0YW5kYXJkU2NoZW1hVjE8dW5rbm93biwgVD4ge1xuICByZXR1cm4ge1xuICAgICd+c3RhbmRhcmQnOiB7XG4gICAgICB2YWxpZGF0ZSxcbiAgICAgIHZlbmRvcjogdmVuZG9yID8/IExJQlJBUllfTkFNRSxcbiAgICAgIHZlcnNpb246IDFcbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIGZvcm1hdExpdGVyYWwobGl0ZXJhbDogTGl0ZXJhbCk6IHN0cmluZyB7XG4gIGlmIChpc1N0cmluZyhsaXRlcmFsKSkge1xuICAgIHJldHVybiBgJyR7bGl0ZXJhbH0nYDtcbiAgfVxuXG4gIHJldHVybiB0eXBlb2YgbGl0ZXJhbCA9PT0gJ2JpZ2ludCcgPyBgJHtTdHJpbmcobGl0ZXJhbCl9bmAgOiBTdHJpbmcobGl0ZXJhbCk7XG59XG5cbmZ1bmN0aW9uIGlzUmVhZG9ubHlBcnJheSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIHJlYWRvbmx5IHVua25vd25bXSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FB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
@@ -14,6 +14,7 @@
14
14
  * Running the schemas is left to whoever owns the call path, since that is where an issue can be reported.
15
15
  */
16
16
  import type { StandardSchemaV1 } from '@standard-schema/spec' with { 'resolution-mode': 'import' };
17
+ import type { GuardedType, Literal, TypeGuard } from './type-guards.cjs';
17
18
  /**
18
19
  * The contract an API declares: every key is a method the API promises to expose, and its value optionally
19
20
  * carries the payload schemas for that method.
@@ -26,6 +27,28 @@ import type { StandardSchemaV1 } from '@standard-schema/spec' with { 'resolution
26
27
  * @typeParam TApi - The API the contract describes. `object`, the default, means "not typed".
27
28
  */
28
29
  export type ApiContract<TApi extends object = object> = object extends TApi ? Readonly<Record<string, ApiMethodContract>> : TypedApiContract<TApi>;
30
+ /**
31
+ * The schema builders of this module with the Standard Schema `vendor` already bound, as
32
+ * {@link createApiContractSchemaBuilders} returns them.
33
+ */
34
+ export interface ApiContractSchemaBuilders {
35
+ /**
36
+ * {@link createArgumentsSchema}, reporting the bound vendor.
37
+ *
38
+ * @typeParam TParameters - The method's parameters, inferred from the guards or from the contract entry.
39
+ * @param parameters - One guard per parameter, in order.
40
+ * @returns The schema.
41
+ */
42
+ readonly createArgumentsSchema: <const TParameters extends readonly unknown[]>(parameters: ArgumentTypeGuards<TParameters>) => StandardSchemaV1<unknown, MutableTuple<TParameters>>;
43
+ /**
44
+ * {@link createTypeGuardSchema}, reporting the bound vendor.
45
+ *
46
+ * @typeParam T - The type the guard narrows to.
47
+ * @param guard - The guard and what it expects.
48
+ * @returns The schema.
49
+ */
50
+ readonly createTypeGuardSchema: <T>(guard: ExpectedTypeGuard<T>) => StandardSchemaV1<unknown, T>;
51
+ }
29
52
  /**
30
53
  * The payload schemas for a single API method. Both halves are optional: a method may declare only its input,
31
54
  * only its output, neither (the entry then just declares that the method must exist), or both.
@@ -136,6 +159,26 @@ export declare const STRING_ARRAY_GUARD: ExpectedTypeGuard<string[]>;
136
159
  * Accepts `undefined`, which is the output of a method returning `void` or `Promise<void>`.
137
160
  */
138
161
  export declare const UNDEFINED_GUARD: ExpectedTypeGuard<undefined>;
162
+ /**
163
+ * Widens a guard to an array whose every item `itemGuard` accepts.
164
+ *
165
+ * @typeParam T - The type of an item.
166
+ * @param itemGuard - The guard for one item.
167
+ * @returns The guard.
168
+ */
169
+ export declare function arrayGuard<T>(itemGuard: ExpectedTypeGuard<T>): ExpectedTypeGuard<T[]>;
170
+ /**
171
+ * Binds the Standard Schema `vendor` once, so a contract does not pass it to every schema builder. Destructure the
172
+ * result under the builders' own names and the calls read exactly as the unbound ones do:
173
+ *
174
+ * ```ts
175
+ * const { createArgumentsSchema, createTypeGuardSchema } = createApiContractSchemaBuilders('my-plugin');
176
+ * ```
177
+ *
178
+ * @param vendor - The vendor every schema reports.
179
+ * @returns The bound builders.
180
+ */
181
+ export declare function createApiContractSchemaBuilders(vendor: string): ApiContractSchemaBuilders;
139
182
  /**
140
183
  * Builds the input schema of a method contract: a schema over the method's ARGUMENT LIST, one type guard per
141
184
  * parameter. An argument that fails its guard is reported with its index as the issue path, and an argument list
@@ -148,6 +191,15 @@ export declare const UNDEFINED_GUARD: ExpectedTypeGuard<undefined>;
148
191
  * @returns The schema.
149
192
  */
150
193
  export declare function createArgumentsSchema<const TParameters extends readonly unknown[]>(parameters: ArgumentTypeGuards<TParameters>, options?: CreateArgumentsSchemaOptions): StandardSchemaV1<unknown, MutableTuple<TParameters>>;
194
+ /**
195
+ * Pairs a type guard with what it expects.
196
+ *
197
+ * @typeParam T - The type the guard narrows to.
198
+ * @param expected - What the value should have been, phrased to follow "Expected", e.g. `'a string'`.
199
+ * @param typeGuard - The guard.
200
+ * @returns The guard.
201
+ */
202
+ export declare function createExpectedTypeGuard<T>(expected: string, typeGuard: TypeGuard<T>): ExpectedTypeGuard<T>;
151
203
  /**
152
204
  * Builds a schema over one value from a type guard: the output schema of a method contract, typically.
153
205
  *
@@ -165,6 +217,32 @@ export declare function createTypeGuardSchema<T>(params: CreateTypeGuardSchemaPa
165
217
  * @returns The same contract.
166
218
  */
167
219
  export declare function defineApiContract<TApi extends object>(contract: TypedApiContract<NoInfer<TApi>>): TypedApiContract<TApi>;
220
+ /**
221
+ * Builds a guard accepting an instance of a class, or of a class derived from it, expecting `an instance of` the
222
+ * class's name.
223
+ *
224
+ * @typeParam T - The type of an instance.
225
+ * @param constructor - The class.
226
+ * @returns The guard.
227
+ */
228
+ export declare function instanceOfGuard<T>(constructor: abstract new (...arguments_: never[]) => T): ExpectedTypeGuard<T>;
229
+ /**
230
+ * Builds a guard accepting exactly the keys of a record, expecting `one of` them. Typing the record over a union
231
+ * makes a member later added to the union fail to compile until it is listed.
232
+ *
233
+ * @typeParam T - The accepted strings.
234
+ * @param literals - A record whose keys are the accepted strings.
235
+ * @returns The guard.
236
+ */
237
+ export declare function literalGuard<T extends string>(literals: Readonly<Record<T, true>>): ExpectedTypeGuard<T>;
238
+ /**
239
+ * Builds a guard accepting exactly the listed values, expecting `one of` them.
240
+ *
241
+ * @typeParam T - The accepted values.
242
+ * @param literals - The accepted values.
243
+ * @returns The guard.
244
+ */
245
+ export declare function literalGuard<T extends Literal>(literals: readonly T[]): ExpectedTypeGuard<T>;
168
246
  /**
169
247
  * Widens a guard to also accept `null`.
170
248
  *
@@ -181,4 +259,12 @@ export declare function nullableGuard<T>(guard: ExpectedTypeGuard<T>): ExpectedT
181
259
  * @returns A guard accepting what `guard` accepts, or `undefined`.
182
260
  */
183
261
  export declare function optionalGuard<T>(guard: ExpectedTypeGuard<T>): ExpectedTypeGuard<T | undefined>;
262
+ /**
263
+ * Builds a guard accepting what any of the given guards accepts, expecting their `expected` texts joined by `or`.
264
+ *
265
+ * @typeParam TGuards - The guards.
266
+ * @param guards - The guards, tried in order.
267
+ * @returns The guard.
268
+ */
269
+ export declare function unionGuard<const TGuards extends readonly ExpectedTypeGuard<unknown>[]>(...guards: TGuards): ExpectedTypeGuard<GuardedType<TGuards[number]['typeGuard']>>;
184
270
  export {};