expand-my-type 0.6.9 → 0.8.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
@@ -18,8 +18,7 @@ expanded form as a string. That can be useful for code-generation, testing, and
18
18
  debugging complex type errors.
19
19
 
20
20
  Under the hood, it uses the [TypeScript Compiler API][ts-compiler-api] to expand
21
- the type expression and optionally formats the output using
22
- [Prettier][prettier].
21
+ the type expression and optionally formats the output using Biome.
23
22
 
24
23
  ## CLI
25
24
 
@@ -137,6 +136,39 @@ the following ways:
137
136
  /* { a: string; b: number } */
138
137
  ```
139
138
 
139
+ Advanced users can pass Biome configuration directly:
140
+
141
+ ```typescript
142
+ import { expandMyType } from "expand-my-type";
143
+
144
+ const expandedType = await expandMyType({
145
+ typeExpression: "SomeType",
146
+ sourceFileName: "./example.ts",
147
+ prettify: {
148
+ biomeOptions: {
149
+ formatter: {
150
+ indentStyle: "space",
151
+ lineWidth: 120,
152
+ },
153
+ javascript: {
154
+ formatter: {
155
+ semicolons: "always",
156
+ },
157
+ },
158
+ },
159
+ },
160
+ });
161
+ ```
162
+
163
+ For local development in this repository, use Bun:
164
+
165
+ ```sh
166
+ bun install
167
+ bun run check
168
+ bun run build
169
+ bun run deps:update
170
+ ```
171
+
140
172
  ## How It Works
141
173
 
142
174
  Expand My Type uses the following utility types to expand the type expression:
@@ -169,5 +201,4 @@ This approach comes with some limitations. Most notably, expanding a type that
169
201
  leads to an infinite recursion might throw an error (when prettify option is
170
202
  enabled), return a truncated output, or return any.
171
203
 
172
- [prettier]: https://prettier.io
173
204
  [ts-compiler-api]: https://github.com/microsoft/TypeScript/wiki/Using-the-Compiler-API
@@ -0,0 +1,16 @@
1
+ import ts from "typescript";
2
+ type ExtractFunctions<T, K extends keyof T = keyof T> = {
3
+ [P in K]: Extract<T[P], (...args: never[]) => unknown>;
4
+ };
5
+ export type CompilerHostFunctionOverrides = Partial<ExtractFunctions<ts.CompilerHost>>;
6
+ /**
7
+ * Creates a custom compiler host that augments the specified source file for expanding a type expression.
8
+ *
9
+ * @param sourceFileName Name of the source file to augment.
10
+ * @param codeToAdd Type expression.
11
+ * @param compilerOptions TypeScript compiler options.
12
+ * @param compilerHostFunctionOverrides A record of functions to override in the compiler host. Useful for mocking.
13
+ * @returns A custom compiler host that returns an augmented source file that can be used to expand the type expression.
14
+ */
15
+ export declare const createAugmenterCompilerHost: (sourceFileName: string, codeToAdd: string, compilerOptions?: ts.CompilerOptions, compilerHostFunctionOverrides?: CompilerHostFunctionOverrides) => ts.CompilerHost;
16
+ export {};
package/dist/cli.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/cli.js CHANGED
@@ -1,19 +1,27 @@
1
1
  #!/usr/bin/env node
2
2
 
3
+ // src/index.ts
4
+ import path from "node:path";
5
+ import ts2 from "typescript";
6
+
3
7
  // src/augmenter-compiler-host.ts
4
8
  import ts from "typescript";
5
- var createAugmenterCompilerHost = (sourceFileName2, codeToAdd, compilerOptions, compilerHostFunctionOverrides) => {
9
+ var createAugmenterCompilerHost = (sourceFileName, codeToAdd, compilerOptions, compilerHostFunctionOverrides) => {
6
10
  const customCompilerHost = ts.createCompilerHost(compilerOptions ?? {}, true);
7
- for (const key of Object.keys(compilerHostFunctionOverrides ?? {})) {
8
- customCompilerHost[key] = compilerHostFunctionOverrides[key];
11
+ const overrides = compilerHostFunctionOverrides ?? {};
12
+ for (const key of Object.keys(overrides)) {
13
+ const override = overrides[key];
14
+ if (override) {
15
+ customCompilerHost[key] = override;
16
+ }
9
17
  }
10
18
  const originalReadFile = customCompilerHost.readFile;
11
19
  customCompilerHost.readFile = (fileName) => {
12
20
  const contents = originalReadFile(fileName);
13
- if (contents === void 0) {
21
+ if (contents === undefined) {
14
22
  return contents;
15
23
  }
16
- if (fileName !== sourceFileName2) {
24
+ if (fileName !== sourceFileName) {
17
25
  return contents;
18
26
  }
19
27
  return `${codeToAdd}
@@ -23,11 +31,26 @@ ${contents}`;
23
31
  };
24
32
 
25
33
  // src/code-generator.ts
26
- import { format } from "prettier";
34
+ import { Biome } from "@biomejs/js-api/nodejs";
27
35
  var identifierPrefix = "__EXPAND_MY_TYPE__";
28
- var createExpandCodeBlock = (typeExpression2) => {
36
+ var virtualFormatFileName = "expand-my-type.ts";
37
+ var biome = new Biome;
38
+ var { projectKey } = biome.openProject();
39
+ var defaultBiomeConfiguration = {
40
+ formatter: {
41
+ enabled: true,
42
+ indentStyle: "space"
43
+ },
44
+ javascript: {
45
+ formatter: {
46
+ quoteStyle: "double",
47
+ semicolons: "asNeeded"
48
+ }
49
+ }
50
+ };
51
+ var createExpandCodeBlock = (typeExpression) => {
29
52
  return `type ${identifierPrefix}Result = ${identifierPrefix}Expand<${identifierPrefix}Expression>;
30
- type ${identifierPrefix}Expression = ${typeExpression2};
53
+ type ${identifierPrefix}Expression = ${typeExpression};
31
54
 
32
55
  type ${identifierPrefix}Expand<T> =
33
56
  T extends (...args: infer A) => infer R ? (...args: ${identifierPrefix}Expand<A>) => ${identifierPrefix}Expand<R>
@@ -41,23 +64,42 @@ var createExpandCodeBlock = (typeExpression2) => {
41
64
  type ${identifierPrefix}AppendUnderscore<T extends string> = \`\${T}_\` extends string ? \`\${T}_\` : never;
42
65
  type ${identifierPrefix}RemoveUnderscore<T extends string> = T extends \`\${infer U}_\` ? U : never;`;
43
66
  };
44
- var formatTypeExpression = async (code, prettierOptions) => {
45
- return (await format(
46
- `type ${identifierPrefix} = ${code}`,
47
- prettierOptions ?? {
48
- parser: "typescript",
49
- semi: false
67
+ var formatTypeExpression = async (code, biomeConfiguration) => {
68
+ const input = `type ${identifierPrefix} = ${code}`;
69
+ const javascriptFormatter = {
70
+ ...defaultBiomeConfiguration.javascript?.formatter,
71
+ ...biomeConfiguration?.javascript?.formatter
72
+ };
73
+ biome.applyConfiguration(projectKey, {
74
+ ...defaultBiomeConfiguration,
75
+ ...biomeConfiguration,
76
+ formatter: {
77
+ ...defaultBiomeConfiguration.formatter,
78
+ ...biomeConfiguration?.formatter
79
+ },
80
+ javascript: {
81
+ ...defaultBiomeConfiguration.javascript,
82
+ ...biomeConfiguration?.javascript,
83
+ formatter: javascriptFormatter
50
84
  }
51
- )).trim().substring(`type ${identifierPrefix} = `.length);
85
+ });
86
+ const result = biome.formatContent(projectKey, input, {
87
+ filePath: virtualFormatFileName
88
+ });
89
+ if (result.diagnostics.length > 0) {
90
+ throw new Error(biome.printDiagnostics(result.diagnostics, {
91
+ filePath: virtualFormatFileName,
92
+ fileSource: input
93
+ }));
94
+ }
95
+ return result.content.trim().substring(`type ${identifierPrefix} = `.length);
52
96
  };
53
97
 
54
98
  // src/index.ts
55
- import path from "path";
56
- import ts2 from "typescript";
57
99
  var findResultIdentifierNode = (node) => {
58
- if (node.getChildCount() == 0) {
100
+ if (node.getChildCount() === 0) {
59
101
  if (!ts2.isIdentifier(node)) {
60
- return void 0;
102
+ return;
61
103
  }
62
104
  return node;
63
105
  }
@@ -96,17 +138,8 @@ async function expandMyType(options) {
96
138
  if (!tsCompilerOptions.strictNullChecks) {
97
139
  throw new Error("strictNullChecks must be enabled!");
98
140
  }
99
- const compilerHost = createAugmenterCompilerHost(
100
- resolvedSourceFileName,
101
- createExpandCodeBlock(options.typeExpression),
102
- tsCompilerOptions,
103
- options.compilerHostFunctionOverrides
104
- );
105
- const program = ts2.createProgram(
106
- [resolvedSourceFileName],
107
- tsCompilerOptions,
108
- compilerHost
109
- );
141
+ const compilerHost = createAugmenterCompilerHost(resolvedSourceFileName, createExpandCodeBlock(options.typeExpression), tsCompilerOptions, options.compilerHostFunctionOverrides);
142
+ const program = ts2.createProgram([resolvedSourceFileName], tsCompilerOptions, compilerHost);
110
143
  const sourceFile = program.getSourceFile(resolvedSourceFileName);
111
144
  if (!sourceFile) {
112
145
  throw new Error("Source file not found!");
@@ -116,52 +149,48 @@ async function expandMyType(options) {
116
149
  throw new Error("No node found!");
117
150
  }
118
151
  const typeChecker = program.getTypeChecker();
119
- const expandedTypeString = typeChecker.typeToString(
120
- typeChecker.getTypeAtLocation(resultIdentifierNode),
121
- void 0,
122
- ts2.TypeFormatFlags.NodeBuilderFlagsMask
123
- );
124
- if (options.prettify && options.prettify.enabled === false) {
152
+ const expandedTypeString = typeChecker.typeToString(typeChecker.getTypeAtLocation(resultIdentifierNode), undefined, ts2.TypeFormatFlags.NodeBuilderFlagsMask);
153
+ if (options.prettify?.enabled === false) {
125
154
  return expandedTypeString;
126
155
  }
127
- return formatTypeExpression(expandedTypeString, options.prettify?.options);
156
+ return formatTypeExpression(expandedTypeString, options.prettify?.biomeOptions);
128
157
  }
129
158
 
130
159
  // src/cli.ts
131
- import { parseArgs } from "util";
160
+ import { parseArgs } from "node:util";
132
161
  import ts3 from "typescript";
133
162
  var tryParse = (options) => {
134
- let result2;
163
+ let result;
135
164
  try {
136
- result2 = parseArgs({
165
+ result = parseArgs({
137
166
  options,
138
167
  tokens: true,
139
168
  allowPositionals: true
140
169
  });
141
- } catch (error2) {
170
+ } catch (error) {
142
171
  return {
143
- error: error2,
172
+ error: error instanceof Error ? error : new Error(String(error)),
144
173
  values: {},
145
174
  positionals: []
146
175
  };
147
176
  }
148
- const { tokens, values: values2, positionals: positionals2 } = result2;
177
+ const { tokens, values, positionals } = result;
149
178
  for (const token of tokens ?? []) {
150
179
  if (token.kind === "option-terminator" || token.kind === "positional") {
151
180
  continue;
152
181
  }
153
182
  if (token.name.startsWith("no-")) {
154
183
  const positiveName = token.name.slice("no-".length);
155
- values2[positiveName] = false;
156
- delete values2[token.name];
184
+ values[positiveName] = false;
185
+ delete values[token.name];
157
186
  } else {
158
- values2[token.name] = token.value ?? true;
187
+ values[token.name] = token.value ?? true;
159
188
  }
160
189
  }
161
190
  return {
162
- error: void 0,
163
- values: values2,
164
- positionals: positionals2
191
+ error: undefined,
192
+ values,
193
+ positionals
165
194
  };
166
195
  };
167
196
  var { error, values, positionals } = tryParse({
@@ -192,29 +221,27 @@ var usagePrompt = [
192
221
  " expand-my-type [options] <source-file> <expression>",
193
222
  "",
194
223
  "Options:",
195
- " -h, --help Show this help message",
196
- " -p, --prettify Prettify the output (default)",
197
- " -P, --no-prettify Do not prettify the output",
198
- " -c, --tsconfig <file> Use the specified tsconfig.json file"
199
- ].join("\n");
200
- if (positionals.length !== 2) {
201
- console.error(usagePrompt);
202
- process.exit(1);
203
- }
224
+ " -h, --help\t\t\tShow this help message",
225
+ " -p, --prettify\t\tPrettify the output (default)",
226
+ " -P, --no-prettify\t\tDo not prettify the output",
227
+ " -c, --tsconfig <file>\t\tUse the specified tsconfig.json file"
228
+ ].join(`
229
+ `);
204
230
  if (values.help) {
205
231
  console.error(usagePrompt);
206
232
  process.exit(0);
207
233
  }
234
+ if (positionals.length !== 2) {
235
+ console.error(usagePrompt);
236
+ process.exit(1);
237
+ }
208
238
  var [sourceFileName, typeExpression] = positionals;
209
- var { prettify, tsconfig: tsConfigFileName } = values;
239
+ var prettify = values.prettify ?? true;
240
+ var tsConfigFileName = values.tsconfig;
210
241
  var tsParsedCommandLine;
211
242
  if (tsConfigFileName) {
212
243
  const configFile = ts3.readConfigFile(tsConfigFileName, ts3.sys.readFile);
213
- const compilerOptions = ts3.parseJsonConfigFileContent(
214
- configFile.config,
215
- ts3.sys,
216
- "./"
217
- );
244
+ const compilerOptions = ts3.parseJsonConfigFileContent(configFile.config, ts3.sys, "./");
218
245
  tsParsedCommandLine = compilerOptions;
219
246
  }
220
247
  var result = await expandMyType({
@@ -226,4 +253,6 @@ var result = await expandMyType({
226
253
  tsCompilerOptions: tsParsedCommandLine?.options
227
254
  });
228
255
  console.log(result);
229
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2F1Z21lbnRlci1jb21waWxlci1ob3N0LnRzIiwgIi4uL3NyYy9jb2RlLWdlbmVyYXRvci50cyIsICIuLi9zcmMvaW5kZXgudHMiLCAiLi4vc3JjL2NsaS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHRzIGZyb20gXCJ0eXBlc2NyaXB0XCI7XG5cbnR5cGUgRXh0cmFjdEZ1bmN0aW9uczxULCBLIGV4dGVuZHMga2V5b2YgVCA9IGtleW9mIFQ+ID0ge1xuICBbUCBpbiBLXTogVFtQXSBleHRlbmRzICguLi5hcmdzOiBhbnlbXSkgPT4gYW55ID8gVFtQXSA6IG5ldmVyO1xufTtcbmV4cG9ydCB0eXBlIENvbXBpbGVySG9zdEZ1bmN0aW9uT3ZlcnJpZGVzID0gUGFydGlhbDxcbiAgRXh0cmFjdEZ1bmN0aW9uczx0cy5Db21waWxlckhvc3Q+XG4+O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBjdXN0b20gY29tcGlsZXIgaG9zdCB0aGF0IGF1Z21lbnRzIHRoZSBzcGVjaWZpZWQgc291cmNlIGZpbGUgZm9yIGV4cGFuZGluZyBhIHR5cGUgZXhwcmVzc2lvbi5cbiAqXG4gKiBAcGFyYW0gc291cmNlRmlsZU5hbWUgTmFtZSBvZiB0aGUgc291cmNlIGZpbGUgdG8gYXVnbWVudC5cbiAqIEBwYXJhbSBjb2RlVG9BZGQgVHlwZSBleHByZXNzaW9uLlxuICogQHBhcmFtIGNvbXBpbGVyT3B0aW9ucyBUeXBlU2NyaXB0IGNvbXBpbGVyIG9wdGlvbnMuXG4gKiBAcGFyYW0gY29tcGlsZXJIb3N0RnVuY3Rpb25PdmVycmlkZXMgQSByZWNvcmQgb2YgZnVuY3Rpb25zIHRvIG92ZXJyaWRlIGluIHRoZSBjb21waWxlciBob3N0LiBVc2VmdWwgZm9yIG1vY2tpbmcuXG4gKiBAcmV0dXJucyBBIGN1c3RvbSBjb21waWxlciBob3N0IHRoYXQgcmV0dXJucyBhbiBhdWdtZW50ZWQgc291cmNlIGZpbGUgdGhhdCBjYW4gYmUgdXNlZCB0byBleHBhbmQgdGhlIHR5cGUgZXhwcmVzc2lvbi5cbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZUF1Z21lbnRlckNvbXBpbGVySG9zdCA9IChcbiAgc291cmNlRmlsZU5hbWU6IHN0cmluZyxcbiAgY29kZVRvQWRkOiBzdHJpbmcsXG4gIGNvbXBpbGVyT3B0aW9ucz86IHRzLkNvbXBpbGVyT3B0aW9ucyxcbiAgY29tcGlsZXJIb3N0RnVuY3Rpb25PdmVycmlkZXM/OiBDb21waWxlckhvc3RGdW5jdGlvbk92ZXJyaWRlcyxcbikgPT4ge1xuICBjb25zdCBjdXN0b21Db21waWxlckhvc3QgPSB0cy5jcmVhdGVDb21waWxlckhvc3QoY29tcGlsZXJPcHRpb25zID8/IHt9LCB0cnVlKTtcbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoY29tcGlsZXJIb3N0RnVuY3Rpb25PdmVycmlkZXMgPz8ge30pKSB7XG4gICAgY3VzdG9tQ29tcGlsZXJIb3N0W2tleV0gPSBjb21waWxlckhvc3RGdW5jdGlvbk92ZXJyaWRlcyFba2V5XTtcbiAgfVxuXG4gIGNvbnN0IG9yaWdpbmFsUmVhZEZpbGUgPSBjdXN0b21Db21waWxlckhvc3QucmVhZEZpbGU7XG5cbiAgY3VzdG9tQ29tcGlsZXJIb3N0LnJlYWRGaWxlID0gKGZpbGVOYW1lKSA9PiB7XG4gICAgY29uc3QgY29udGVudHMgPSBvcmlnaW5hbFJlYWRGaWxlKGZpbGVOYW1lKTtcblxuICAgIGlmIChjb250ZW50cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gY29udGVudHM7XG4gICAgfVxuXG4gICAgaWYgKGZpbGVOYW1lICE9PSBzb3VyY2VGaWxlTmFtZSkge1xuICAgICAgcmV0dXJuIGNvbnRlbnRzO1xuICAgIH1cblxuICAgIHJldHVybiBgJHtjb2RlVG9BZGR9XFxuJHtjb250ZW50c31gO1xuICB9O1xuXG4gIHJldHVybiBjdXN0b21Db21waWxlckhvc3Q7XG59O1xuIiwgImltcG9ydCB0eXBlIHsgT3B0aW9ucyBhcyBQcmV0dGllck9wdGlvbnMgfSBmcm9tIFwicHJldHRpZXJcIjtcbmltcG9ydCB7IGZvcm1hdCB9IGZyb20gXCJwcmV0dGllclwiO1xuXG5jb25zdCBpZGVudGlmaWVyUHJlZml4ID0gXCJfX0VYUEFORF9NWV9UWVBFX19cIjtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUV4cGFuZENvZGVCbG9jayA9ICh0eXBlRXhwcmVzc2lvbjogc3RyaW5nKSA9PiB7XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9ibG9iL21haW4vdGVzdHMvY2FzZXMvY29tcGlsZXIvY29tcHV0ZWRUeXBlc0tleW9mTm9JbmRleFNpZ25hdHVyZVR5cGUudHNcbiAgcmV0dXJuIGB0eXBlICR7aWRlbnRpZmllclByZWZpeH1SZXN1bHQgPSAke2lkZW50aWZpZXJQcmVmaXh9RXhwYW5kPCR7aWRlbnRpZmllclByZWZpeH1FeHByZXNzaW9uPjtcbiAgICB0eXBlICR7aWRlbnRpZmllclByZWZpeH1FeHByZXNzaW9uID0gJHt0eXBlRXhwcmVzc2lvbn07XG5cbiAgICB0eXBlICR7aWRlbnRpZmllclByZWZpeH1FeHBhbmQ8VD4gPSBcbiAgICAgICAgVCBleHRlbmRzICguLi5hcmdzOiBpbmZlciBBKSA9PiBpbmZlciBSID8gKC4uLmFyZ3M6ICR7aWRlbnRpZmllclByZWZpeH1FeHBhbmQ8QT4pID0+ICR7aWRlbnRpZmllclByZWZpeH1FeHBhbmQ8Uj5cbiAgICAgIDogVCBleHRlbmRzIFByb21pc2U8aW5mZXIgVT4gPyBQcm9taXNlPCR7aWRlbnRpZmllclByZWZpeH1FeHBhbmRUeXBlQXJndW1lbnQ8VT4+XG4gICAgICA6IHsgW0sgaW4ga2V5b2YgVF06IFRbS10gZXh0ZW5kcyBzdHJpbmcgPyAke2lkZW50aWZpZXJQcmVmaXh9RXhwYW5kU3RyaW5nPFRbS10+IDogJHtpZGVudGlmaWVyUHJlZml4fUV4cGFuZDxUW0tdPjsgfSAmIHt9O1xuXG4gICAgdHlwZSAke2lkZW50aWZpZXJQcmVmaXh9RXhwYW5kVHlwZUFyZ3VtZW50PFQ+ID0gW1QgJiB7fV0gZXh0ZW5kcyBbbmV2ZXJdID8gVCA6IFQgJiB7fSBleHRlbmRzIHZvaWQgPyBUIDogJHtpZGVudGlmaWVyUHJlZml4fUV4cGFuZDxUICYge30+O1xuXG4gICAgLy8gRm9yY2VzIGEgdW5pb24gb2Ygc3RyaW5nIGxpdGVyYWwgdHlwZXMgdG8gYmUgZXhwYW5kZWRcbiAgICB0eXBlICR7aWRlbnRpZmllclByZWZpeH1FeHBhbmRTdHJpbmc8VCBleHRlbmRzIHN0cmluZz4gPSAke2lkZW50aWZpZXJQcmVmaXh9UmVtb3ZlVW5kZXJzY29yZTwke2lkZW50aWZpZXJQcmVmaXh9QXBwZW5kVW5kZXJzY29yZTxUPj47XG4gICAgdHlwZSAke2lkZW50aWZpZXJQcmVmaXh9QXBwZW5kVW5kZXJzY29yZTxUIGV4dGVuZHMgc3RyaW5nPiA9IFxcYFxcJHtUfV9cXGAgZXh0ZW5kcyBzdHJpbmcgPyBcXGBcXCR7VH1fXFxgIDogbmV2ZXI7XG4gICAgdHlwZSAke2lkZW50aWZpZXJQcmVmaXh9UmVtb3ZlVW5kZXJzY29yZTxUIGV4dGVuZHMgc3RyaW5nPiA9IFQgZXh0ZW5kcyBcXGBcXCR7aW5mZXIgVX1fXFxgID8gVSA6IG5ldmVyO2A7XG59O1xuXG5leHBvcnQgY29uc3QgZm9ybWF0VHlwZUV4cHJlc3Npb24gPSBhc3luYyAoXG4gIGNvZGU6IHN0cmluZyxcbiAgcHJldHRpZXJPcHRpb25zPzogUHJldHRpZXJPcHRpb25zLFxuKSA9PiB7XG4gIHJldHVybiAoXG4gICAgYXdhaXQgZm9ybWF0KFxuICAgICAgYHR5cGUgJHtpZGVudGlmaWVyUHJlZml4fSA9ICR7Y29kZX1gLFxuICAgICAgcHJldHRpZXJPcHRpb25zID8/IHtcbiAgICAgICAgcGFyc2VyOiBcInR5cGVzY3JpcHRcIixcbiAgICAgICAgc2VtaTogZmFsc2UsXG4gICAgICB9LFxuICAgIClcbiAgKVxuICAgIC50cmltKClcbiAgICAuc3Vic3RyaW5nKGB0eXBlICR7aWRlbnRpZmllclByZWZpeH0gPSBgLmxlbmd0aCk7XG59O1xuIiwgImltcG9ydCB7IGNyZWF0ZUF1Z21lbnRlckNvbXBpbGVySG9zdCB9IGZyb20gXCIuL2F1Z21lbnRlci1jb21waWxlci1ob3N0LnRzXCI7XG5pbXBvcnQgeyB0eXBlIENvbXBpbGVySG9zdEZ1bmN0aW9uT3ZlcnJpZGVzIH0gZnJvbSBcIi4vYXVnbWVudGVyLWNvbXBpbGVyLWhvc3QudHNcIjtcbmltcG9ydCB7XG4gIGNyZWF0ZUV4cGFuZENvZGVCbG9jayxcbiAgZm9ybWF0VHlwZUV4cHJlc3Npb24sXG59IGZyb20gXCIuL2NvZGUtZ2VuZXJhdG9yLnRzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgdHlwZSB7IE9wdGlvbnMgYXMgUHJldHRpZXJPcHRpb25zIH0gZnJvbSBcInByZXR0aWVyXCI7XG5pbXBvcnQgdHMgZnJvbSBcInR5cGVzY3JpcHRcIjtcblxuLyoqXG4gKiBGaW5kcyB0aGUgcmVzdWx0IHR5cGUgaWRlbnRpZmllciBub2RlLlxuICpcbiAqIEBwYXJhbSBub2RlIE5vZGUgaW4gd2hpY2ggdHlwZSB0eXBlIHNob3VsZCBiZSBzZWFyY2hlZC5cbiAqIEByZXR1cm5zIFRoZSByZXN1bHQgdHlwZSBpZGVudGlmaWVyIG5vZGUuXG4gKi9cbmNvbnN0IGZpbmRSZXN1bHRJZGVudGlmaWVyTm9kZSA9IChub2RlOiB0cy5Ob2RlKTogdHMuTm9kZSB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmIChub2RlLmdldENoaWxkQ291bnQoKSA9PSAwKSB7XG4gICAgaWYgKCF0cy5pc0lkZW50aWZpZXIobm9kZSkpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gU2luY2Ugd2UgcHV0IHRoZSBfXzxJREVOVElGSUVSPl9fIHR5cGUgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGVcbiAgICAvLyBmaWxlLCB3ZSBjYW4gcmV0dXJuIHRoZSBmaXJzdCBpZGVudGlmaWVyIHdlIGZpbmQuXG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cblxuICByZXR1cm4gdHMuZm9yRWFjaENoaWxkKG5vZGUsIGZpbmRSZXN1bHRJZGVudGlmaWVyTm9kZSk7XG59O1xuXG5leHBvcnQgdHlwZSBFeHBhbmRUeXBlT3B0aW9uc0Jhc2UgPSB7XG4gIC8qKlxuICAgKiBUaGUgdHlwZSBleHByZXNzaW9uIHRvIGV4cGFuZC5cbiAgICogQGV4YW1wbGUgXCJSZXR1cm5UeXBlPHR5cGVvZiBteUZ1bmN0aW9uPlwiXG4gICAqL1xuICB0eXBlRXhwcmVzc2lvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUeXBlU2NyaXB0IGNvbXBpbGVyIG9wdGlvbnMuXG4gICAqL1xuICB0c0NvbXBpbGVyT3B0aW9ucz86IHRzLkNvbXBpbGVyT3B0aW9ucztcblxuICAvKipcbiAgICogUHJldHRpZXIgb3B0aW9ucy5cbiAgICovXG4gIHByZXR0aWZ5Pzoge1xuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdG8gcHJldHRpZnkgdGhlIG91dHB1dC5cbiAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICovXG4gICAgZW5hYmxlZD86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogUHJldHRpZXIgb3B0aW9ucy4gRG9uJ3QgZm9yZ2V0IHRvIHNldCB0aGUgcGFyc2VyIHRvIFwidHlwZXNjcmlwdFwiLlxuICAgICAqIEBkZWZhdWx0IHsgcGFyc2VyOiBcInR5cGVzY3JpcHRcIiwgc2VtaTogZmFsc2UgfVxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBQcmV0dGllck9wdGlvbnM7XG4gIH07XG5cbiAgLyoqXG4gICAqIEEgcmVjb3JkIG9mIGZ1bmN0aW9ucyB0byBvdmVycmlkZSBpbiB0aGUgY29tcGlsZXIgaG9zdC4gVXNlZnVsIGZvciBtb2NraW5nXG4gICAqL1xuICBjb21waWxlckhvc3RGdW5jdGlvbk92ZXJyaWRlcz86IENvbXBpbGVySG9zdEZ1bmN0aW9uT3ZlcnJpZGVzO1xufTtcbmV4cG9ydCB0eXBlIEV4cGFuZFR5cGVGcm9tU291cmNlRmlsZU9wdGlvbnMgPSBFeHBhbmRUeXBlT3B0aW9uc0Jhc2UgJiB7XG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSBzb3VyY2UgZmlsZSB0byBldmFsdWF0ZSB0aGUgdHlwZSBleHByZXNzaW9uIGluLlxuICAgKi9cbiAgc291cmNlRmlsZU5hbWU6IHN0cmluZztcbn07XG5leHBvcnQgdHlwZSBFeHBhbmRUeXBlRnJvbVNvdXJjZVRleHRPcHRpb25zID0gRXhwYW5kVHlwZU9wdGlvbnNCYXNlICYge1xuICAvKipcbiAgICogVHlwZVNjcmlwdCBzb3VyY2UgdGV4dCB0byBldmFsdWF0ZSB0aGUgdHlwZSBleHByZXNzaW9uIGluLlxuICAgKi9cbiAgc291cmNlVGV4dDogc3RyaW5nO1xufTtcbmV4cG9ydCB0eXBlIEV4cGFuZE15VHlwZU9wdGlvbnMgPVxuICB8IEV4cGFuZFR5cGVGcm9tU291cmNlRmlsZU9wdGlvbnNcbiAgfCBFeHBhbmRUeXBlRnJvbVNvdXJjZVRleHRPcHRpb25zO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhwYW5kTXlUeXBlKFxuICBvcHRpb25zOiBFeHBhbmRUeXBlRnJvbVNvdXJjZVRleHRPcHRpb25zLFxuKTogUHJvbWlzZTxzdHJpbmc+O1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4cGFuZE15VHlwZShcbiAgb3B0aW9uczogRXhwYW5kVHlwZUZyb21Tb3VyY2VGaWxlT3B0aW9ucyxcbik6IFByb21pc2U8c3RyaW5nPjtcblxuLyoqXG4gKiBFeHBhbmRzIGEgVHlwZVNjcmlwdCB0eXBlIGV4cHJlc3Npb24uXG4gKlxuICogQHBhcmFtIG9wdGlvbnNcbiAqIEByZXR1cm5zIFRoZSBleHBhbmRlZCB0eXBlIGV4cHJlc3Npb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleHBhbmRNeVR5cGUob3B0aW9uczogRXhwYW5kTXlUeXBlT3B0aW9ucykge1xuICBpZiAob3B0aW9ucy50eXBlRXhwcmVzc2lvbi50cmltKCkgPT09IFwiXCIpIHtcbiAgICByZXR1cm4gXCJuZXZlclwiO1xuICB9XG5cbiAgaWYgKFwic291cmNlVGV4dFwiIGluIG9wdGlvbnMpIHtcbiAgICBjb25zdCBkdW1teUZpbGVOYW1lID0gXCJleHBhbmQtbXktdHlwZS1kdW1teS50c1wiO1xuXG4gICAgcmV0dXJuIGV4cGFuZE15VHlwZSh7XG4gICAgICBzb3VyY2VGaWxlTmFtZTogZHVtbXlGaWxlTmFtZSxcbiAgICAgIHR5cGVFeHByZXNzaW9uOiBvcHRpb25zLnR5cGVFeHByZXNzaW9uLFxuICAgICAgY29tcGlsZXJIb3N0RnVuY3Rpb25PdmVycmlkZXM6IHtcbiAgICAgICAgcmVhZEZpbGUoZmlsZU5hbWU6IHN0cmluZykge1xuICAgICAgICAgIGlmIChwYXRoLmJhc2VuYW1lKGZpbGVOYW1lKSA9PT0gZHVtbXlGaWxlTmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuc291cmNlVGV4dDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdHMuc3lzLnJlYWRGaWxlKGZpbGVOYW1lKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB0c0NvbXBpbGVyT3B0aW9uczogb3B0aW9ucy50c0NvbXBpbGVyT3B0aW9ucyxcbiAgICAgIHByZXR0aWZ5OiBvcHRpb25zLnByZXR0aWZ5LFxuICAgIH0pO1xuICB9XG5cbiAgY29uc3QgcmVzb2x2ZWRTb3VyY2VGaWxlTmFtZSA9IHBhdGgucmVzb2x2ZShvcHRpb25zLnNvdXJjZUZpbGVOYW1lKTtcblxuICBjb25zdCB0c0NvbXBpbGVyT3B0aW9ucyA9IG9wdGlvbnMudHNDb21waWxlck9wdGlvbnMgPz8ge1xuICAgIG5vRW1pdDogdHJ1ZSxcblxuICAgIHN0cmljdE51bGxDaGVja3M6IHRydWUsXG4gICAgYWxsb3dTeW50aGV0aWNEZWZhdWx0SW1wb3J0czogdHJ1ZSxcbiAgICBhbGxvd0FyYml0cmFyeUV4dGVuc2lvbnM6IHRydWUsXG4gICAgYWxsb3dJbXBvcnRpbmdUc0V4dGVuc2lvbnM6IHRydWUsXG4gICAgYWxsb3dKczogdHJ1ZSxcbiAgfTtcblxuICBpZiAoIXRzQ29tcGlsZXJPcHRpb25zLnN0cmljdE51bGxDaGVja3MpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJzdHJpY3ROdWxsQ2hlY2tzIG11c3QgYmUgZW5hYmxlZCFcIik7XG4gIH1cblxuICBjb25zdCBjb21waWxlckhvc3QgPSBjcmVhdGVBdWdtZW50ZXJDb21waWxlckhvc3QoXG4gICAgcmVzb2x2ZWRTb3VyY2VGaWxlTmFtZSxcbiAgICBjcmVhdGVFeHBhbmRDb2RlQmxvY2sob3B0aW9ucy50eXBlRXhwcmVzc2lvbiksXG4gICAgdHNDb21waWxlck9wdGlvbnMsXG4gICAgb3B0aW9ucy5jb21waWxlckhvc3RGdW5jdGlvbk92ZXJyaWRlcyxcbiAgKTtcblxuICBjb25zdCBwcm9ncmFtID0gdHMuY3JlYXRlUHJvZ3JhbShcbiAgICBbcmVzb2x2ZWRTb3VyY2VGaWxlTmFtZV0sXG4gICAgdHNDb21waWxlck9wdGlvbnMsXG4gICAgY29tcGlsZXJIb3N0LFxuICApO1xuXG4gIGNvbnN0IHNvdXJjZUZpbGUgPSBwcm9ncmFtLmdldFNvdXJjZUZpbGUocmVzb2x2ZWRTb3VyY2VGaWxlTmFtZSk7XG4gIGlmICghc291cmNlRmlsZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlNvdXJjZSBmaWxlIG5vdCBmb3VuZCFcIik7XG4gIH1cblxuICBjb25zdCByZXN1bHRJZGVudGlmaWVyTm9kZSA9IGZpbmRSZXN1bHRJZGVudGlmaWVyTm9kZShzb3VyY2VGaWxlKTtcbiAgaWYgKCFyZXN1bHRJZGVudGlmaWVyTm9kZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIk5vIG5vZGUgZm91bmQhXCIpO1xuICB9XG5cbiAgY29uc3QgdHlwZUNoZWNrZXIgPSBwcm9ncmFtLmdldFR5cGVDaGVja2VyKCk7XG4gIGNvbnN0IGV4cGFuZGVkVHlwZVN0cmluZyA9IHR5cGVDaGVja2VyLnR5cGVUb1N0cmluZyhcbiAgICB0eXBlQ2hlY2tlci5nZXRUeXBlQXRMb2NhdGlvbihyZXN1bHRJZGVudGlmaWVyTm9kZSksXG4gICAgdW5kZWZpbmVkLFxuICAgIHRzLlR5cGVGb3JtYXRGbGFncy5Ob2RlQnVpbGRlckZsYWdzTWFzayxcbiAgKTtcblxuICBpZiAob3B0aW9ucy5wcmV0dGlmeSAmJiBvcHRpb25zLnByZXR0aWZ5LmVuYWJsZWQgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIGV4cGFuZGVkVHlwZVN0cmluZztcbiAgfVxuXG4gIHJldHVybiBmb3JtYXRUeXBlRXhwcmVzc2lvbihleHBhbmRlZFR5cGVTdHJpbmcsIG9wdGlvbnMucHJldHRpZnk/Lm9wdGlvbnMpO1xufVxuIiwgIiMhL3Vzci9iaW4vZW52IG5vZGVcbmltcG9ydCB7IGV4cGFuZE15VHlwZSB9IGZyb20gXCIuL2luZGV4LnRzXCI7XG5pbXBvcnQgeyBwYXJzZUFyZ3MsIHR5cGUgUGFyc2VBcmdzQ29uZmlnIH0gZnJvbSBcIm5vZGU6dXRpbFwiO1xuaW1wb3J0IHRzIGZyb20gXCJ0eXBlc2NyaXB0XCI7XG5cbnR5cGUgVmFsdWVzID0ge1xuICBoZWxwPzogYm9vbGVhbjtcbiAgcHJldHRpZnk6IGJvb2xlYW47XG4gIHRzY29uZmlnPzogc3RyaW5nO1xufTtcblxuY29uc3QgdHJ5UGFyc2UgPSA8XG4gIFZhbHVlcyBleHRlbmRzIFJlY29yZDxcbiAgICBzdHJpbmcsXG4gICAgc3RyaW5nIHwgYm9vbGVhbiB8IEFycmF5PHN0cmluZyB8IGJvb2xlYW4+IHwgdW5kZWZpbmVkXG4gID4sXG4gIE9wdGlvbnMgZXh0ZW5kcyBQYXJzZUFyZ3NDb25maWdbXCJvcHRpb25zXCJdID0gUGFyc2VBcmdzQ29uZmlnW1wib3B0aW9uc1wiXSxcbj4oXG4gIG9wdGlvbnM6IE9wdGlvbnMsXG4pOiB7IGVycm9yPzogRXJyb3I7IHZhbHVlczogVmFsdWVzOyBwb3NpdGlvbmFsczogc3RyaW5nW10gfSA9PiB7XG4gIGxldCByZXN1bHQ6IFJldHVyblR5cGU8dHlwZW9mIHBhcnNlQXJncz47XG4gIHRyeSB7XG4gICAgcmVzdWx0ID0gcGFyc2VBcmdzKHtcbiAgICAgIG9wdGlvbnMsXG4gICAgICB0b2tlbnM6IHRydWUsXG4gICAgICBhbGxvd1Bvc2l0aW9uYWxzOiB0cnVlLFxuICAgIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiB7XG4gICAgICBlcnJvcixcbiAgICAgIHZhbHVlczoge30gYXMgVmFsdWVzLFxuICAgICAgcG9zaXRpb25hbHM6IFtdLFxuICAgIH07XG4gIH1cblxuICBjb25zdCB7IHRva2VucywgdmFsdWVzLCBwb3NpdGlvbmFscyB9ID0gcmVzdWx0O1xuXG4gIC8vIFJlcHJvY2VzcyB0aGUgb3B0aW9uIHRva2VucyBhbmQgb3ZlcndyaXRlIHRoZSByZXR1cm5lZCB2YWx1ZXMuXG4gIGZvciAoY29uc3QgdG9rZW4gb2YgdG9rZW5zID8/IFtdKSB7XG4gICAgaWYgKHRva2VuLmtpbmQgPT09IFwib3B0aW9uLXRlcm1pbmF0b3JcIiB8fCB0b2tlbi5raW5kID09PSBcInBvc2l0aW9uYWxcIikge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHRva2VuLm5hbWUuc3RhcnRzV2l0aChcIm5vLVwiKSkge1xuICAgICAgLy8gU3RvcmUgZm9vOmZhbHNlIGZvciAtLW5vLWZvb1xuICAgICAgY29uc3QgcG9zaXRpdmVOYW1lID0gdG9rZW4ubmFtZS5zbGljZShcIm5vLVwiLmxlbmd0aCk7XG4gICAgICB2YWx1ZXNbcG9zaXRpdmVOYW1lXSA9IGZhbHNlO1xuICAgICAgZGVsZXRlIHZhbHVlc1t0b2tlbi5uYW1lXTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmVzYXZlIHZhbHVlIHNvIGxhc3Qgb25lIHdpbnMgaWYgYm90aCAtLWZvbyBhbmQgLS1uby1mb28uXG4gICAgICB2YWx1ZXNbdG9rZW4ubmFtZV0gPSB0b2tlbi52YWx1ZSA/PyB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZXJyb3I6IHVuZGVmaW5lZCxcbiAgICB2YWx1ZXM6IHZhbHVlcyBhcyBWYWx1ZXMsXG4gICAgcG9zaXRpb25hbHMsXG4gIH07XG59O1xuXG5jb25zdCB7IGVycm9yLCB2YWx1ZXMsIHBvc2l0aW9uYWxzIH0gPSB0cnlQYXJzZTxWYWx1ZXM+KHtcbiAgaGVscDoge1xuICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgIHNob3J0OiBcImhcIixcbiAgfSxcbiAgcHJldHRpZnk6IHtcbiAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICBzaG9ydDogXCJwXCIsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgfSxcbiAgXCJuby1wcmV0dGlmeVwiOiB7XG4gICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgc2hvcnQ6IFwiUFwiLFxuICB9LFxuICB0c2NvbmZpZzoge1xuICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgc2hvcnQ6IFwiY1wiLFxuICB9LFxufSk7XG5cbmlmIChlcnJvcikge1xuICBjb25zb2xlLmVycm9yKGVycm9yLm1lc3NhZ2UpO1xuICBwcm9jZXNzLmV4aXQoMSk7XG59XG5cbmNvbnN0IHVzYWdlUHJvbXB0ID0gW1xuICBcIlVzYWdlOlwiLFxuICBcIiAgZXhwYW5kLW15LXR5cGUgW29wdGlvbnNdIDxzb3VyY2UtZmlsZT4gPGV4cHJlc3Npb24+XCIsXG4gIFwiXCIsXG4gIFwiT3B0aW9uczpcIixcbiAgXCIgIC1oLCAtLWhlbHBcXHRcXHRcXHRTaG93IHRoaXMgaGVscCBtZXNzYWdlXCIsXG4gIFwiICAtcCwgLS1wcmV0dGlmeVxcdFxcdFByZXR0aWZ5IHRoZSBvdXRwdXQgKGRlZmF1bHQpXCIsXG4gIFwiICAtUCwgLS1uby1wcmV0dGlmeVxcdFxcdERvIG5vdCBwcmV0dGlmeSB0aGUgb3V0cHV0XCIsXG4gIFwiICAtYywgLS10c2NvbmZpZyA8ZmlsZT5cXHRcXHRVc2UgdGhlIHNwZWNpZmllZCB0c2NvbmZpZy5qc29uIGZpbGVcIixcbl0uam9pbihcIlxcblwiKTtcblxuaWYgKHBvc2l0aW9uYWxzLmxlbmd0aCAhPT0gMikge1xuICBjb25zb2xlLmVycm9yKHVzYWdlUHJvbXB0KTtcbiAgcHJvY2Vzcy5leGl0KDEpO1xufVxuXG5pZiAodmFsdWVzLmhlbHApIHtcbiAgY29uc29sZS5lcnJvcih1c2FnZVByb21wdCk7XG4gIHByb2Nlc3MuZXhpdCgwKTtcbn1cblxuY29uc3QgW3NvdXJjZUZpbGVOYW1lLCB0eXBlRXhwcmVzc2lvbl0gPSBwb3NpdGlvbmFscztcbmNvbnN0IHsgcHJldHRpZnksIHRzY29uZmlnOiB0c0NvbmZpZ0ZpbGVOYW1lIH0gPSB2YWx1ZXM7XG5cbmxldCB0c1BhcnNlZENvbW1hbmRMaW5lOiB0cy5QYXJzZWRDb21tYW5kTGluZSB8IHVuZGVmaW5lZDtcblxuaWYgKHRzQ29uZmlnRmlsZU5hbWUpIHtcbiAgY29uc3QgY29uZmlnRmlsZSA9IHRzLnJlYWRDb25maWdGaWxlKHRzQ29uZmlnRmlsZU5hbWUsIHRzLnN5cy5yZWFkRmlsZSk7XG4gIGNvbnN0IGNvbXBpbGVyT3B0aW9ucyA9IHRzLnBhcnNlSnNvbkNvbmZpZ0ZpbGVDb250ZW50KFxuICAgIGNvbmZpZ0ZpbGUuY29uZmlnLFxuICAgIHRzLnN5cyxcbiAgICBcIi4vXCIsXG4gICk7XG5cbiAgdHNQYXJzZWRDb21tYW5kTGluZSA9IGNvbXBpbGVyT3B0aW9ucztcbn1cblxuY29uc3QgcmVzdWx0ID0gYXdhaXQgZXhwYW5kTXlUeXBlKHtcbiAgc291cmNlRmlsZU5hbWUsXG4gIHR5cGVFeHByZXNzaW9uLFxuICBwcmV0dGlmeToge1xuICAgIGVuYWJsZWQ6IHByZXR0aWZ5LFxuICB9LFxuICB0c0NvbXBpbGVyT3B0aW9uczogdHNQYXJzZWRDb21tYW5kTGluZT8ub3B0aW9ucyxcbn0pO1xuXG5jb25zb2xlLmxvZyhyZXN1bHQpO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7O0FBQUEsT0FBTyxRQUFRO0FBa0JSLElBQU0sOEJBQThCLENBQ3pDQSxpQkFDQSxXQUNBLGlCQUNBLGtDQUNHO0FBQ0gsUUFBTSxxQkFBcUIsR0FBRyxtQkFBbUIsbUJBQW1CLENBQUMsR0FBRyxJQUFJO0FBQzVFLGFBQVcsT0FBTyxPQUFPLEtBQUssaUNBQWlDLENBQUMsQ0FBQyxHQUFHO0FBQ2xFLHVCQUFt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Z0JBQWdCLGNBQWMsSUFBSTtBQUN6QyxJQUFNLEVBQUUsVUFBVSxVQUFVLGlCQUFpQixJQUFJO0FBRWpELElBQUk7QUFFSixJQUFJLGtCQUFrQjtBQUNwQixRQUFNLGFBQWFKLElBQUcsZUFBZSxrQkFBa0JBLElBQUcsSUFBSSxRQUFRO0FBQ3RFLFFBQU0sa0JBQWtCQSxJQUFHO0FBQUEsSUFDekIsV0FBVztBQUFBLElBQ1hBLElBQUc7QUFBQSxJQUNIO0FBQUEsRUFDRjtBQUVBLHdCQUFzQjtBQUN4QjtBQUVBLElBQU0sU0FBUyxNQUFNLGFBQWE7QUFBQSxFQUNoQztBQUFBLEVBQ0E7QUFBQSxFQUNBLFVBQVU7QUFBQSxJQUNSLFNBQVM7QUFBQSxFQUNYO0FBQUEsRUFDQSxtQkFBbUIscUJBQXFCO0FBQzFDLENBQUM7QUFFRCxRQUFRLElBQUksTUFBTTsiLAogICJuYW1lcyI6IFsic291cmNlRmlsZU5hbWUiLCAidHlwZUV4cHJlc3Npb24iLCAidHMiLCAidHMiLCAicmVzdWx0IiwgImVycm9yIiwgInZhbHVlcyIsICJwb3NpdGlvbmFscyJdCn0K
256
+
257
+ //# debugId=D978D5D6AFCBBE8D64756E2164756E21
258
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIiwgIi4uL3NyYy9hdWdtZW50ZXItY29tcGlsZXItaG9zdC50cyIsICIuLi9zcmMvY29kZS1nZW5lcmF0b3IudHMiLCAiLi4vc3JjL2NsaS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICJpbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgdHlwZSB7IENvbmZpZ3VyYXRpb24gYXMgQmlvbWVDb25maWd1cmF0aW9uIH0gZnJvbSBcIkBiaW9tZWpzL3dhc20tbm9kZWpzXCI7XG5pbXBvcnQgdHMgZnJvbSBcInR5cGVzY3JpcHRcIjtcbmltcG9ydCB7XG4gIHR5cGUgQ29tcGlsZXJIb3N0RnVuY3Rpb25PdmVycmlkZXMsXG4gIGNyZWF0ZUF1Z21lbnRlckNvbXBpbGVySG9zdCxcbn0gZnJvbSBcIi4vYXVnbWVudGVyLWNvbXBpbGVyLWhvc3QuanNcIjtcbmltcG9ydCB7XG4gIGNyZWF0ZUV4cGFuZENvZGVCbG9jayxcbiAgZm9ybWF0VHlwZUV4cHJlc3Npb24sXG59IGZyb20gXCIuL2NvZGUtZ2VuZXJhdG9yLmpzXCI7XG5cbi8qKlxuICogRmluZHMgdGhlIHJlc3VsdCB0eXBlIGlkZW50aWZpZXIgbm9kZS5cbiAqXG4gKiBAcGFyYW0gbm9kZSBOb2RlIGluIHdoaWNoIHR5cGUgdHlwZSBzaG91bGQgYmUgc2VhcmNoZWQuXG4gKiBAcmV0dXJucyBUaGUgcmVzdWx0IHR5cGUgaWRlbnRpZmllciBub2RlLlxuICovXG5jb25zdCBmaW5kUmVzdWx0SWRlbnRpZmllck5vZGUgPSAobm9kZTogdHMuTm9kZSk6IHRzLk5vZGUgfCB1bmRlZmluZWQgPT4ge1xuICBpZiAobm9kZS5nZXRDaGlsZENvdW50KCkgPT09IDApIHtcbiAgICBpZiAoIXRzLmlzSWRlbnRpZmllcihub2RlKSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBTaW5jZSB3ZSBwdXQgdGhlIF9fPElERU5USUZJRVI+X18gdHlwZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZVxuICAgIC8vIGZpbGUsIHdlIGNhbiByZXR1cm4gdGhlIGZpcnN0IGlkZW50aWZpZXIgd2UgZmluZC5cbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuXG4gIHJldHVybiB0cy5mb3JFYWNoQ2hpbGQobm9kZSwgZmluZFJlc3VsdElkZW50aWZpZXJOb2RlKTtcbn07XG5cbmV4cG9ydCB0eXBlIEV4cGFuZFR5cGVPcHRpb25zQmFzZSA9IHtcbiAgLyoqXG4gICAqIFRoZSB0eXBlIGV4cHJlc3Npb24gdG8gZXhwYW5kLlxuICAgKiBAZXhhbXBsZSBcIlJldHVyblR5cGU8dHlwZW9mIG15RnVuY3Rpb24+XCJcbiAgICovXG4gIHR5cGVFeHByZXNzaW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFR5cGVTY3JpcHQgY29tcGlsZXIgb3B0aW9ucy5cbiAgICovXG4gIHRzQ29tcGlsZXJPcHRpb25zPzogdHMuQ29tcGlsZXJPcHRpb25zO1xuXG4gIC8qKlxuICAgKiBQcmV0dGlmeSBvcHRpb25zLlxuICAgKi9cbiAgcHJldHRpZnk/OiB7XG4gICAgLyoqXG4gICAgICogV2hldGhlciB0byBwcmV0dGlmeSB0aGUgb3V0cHV0LlxuICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgKi9cbiAgICBlbmFibGVkPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBCaW9tZSBmb3JtYXR0aW5nIGNvbmZpZ3VyYXRpb24uXG4gICAgICovXG4gICAgYmlvbWVPcHRpb25zPzogQmlvbWVDb25maWd1cmF0aW9uO1xuICB9O1xuXG4gIC8qKlxuICAgKiBBIHJlY29yZCBvZiBmdW5jdGlvbnMgdG8gb3ZlcnJpZGUgaW4gdGhlIGNvbXBpbGVyIGhvc3QuIFVzZWZ1bCBmb3IgbW9ja2luZ1xuICAgKi9cbiAgY29tcGlsZXJIb3N0RnVuY3Rpb25PdmVycmlkZXM/OiBDb21waWxlckhvc3RGdW5jdGlvbk92ZXJyaWRlcztcbn07XG5leHBvcnQgdHlwZSBFeHBhbmRUeXBlRnJvbVNvdXJjZUZpbGVPcHRpb25zID0gRXhwYW5kVHlwZU9wdGlvbnNCYXNlICYge1xuICAvKipcbiAgICogTmFtZSBvZiB0aGUgc291cmNlIGZpbGUgdG8gZXZhbHVhdGUgdGhlIHR5cGUgZXhwcmVzc2lvbiBpbi5cbiAgICovXG4gIHNvdXJjZUZpbGVOYW1lOiBzdHJpbmc7XG59O1xuZXhwb3J0IHR5cGUgRXhwYW5kVHlwZUZyb21Tb3VyY2VUZXh0T3B0aW9ucyA9IEV4cGFuZFR5cGVPcHRpb25zQmFzZSAmIHtcbiAgLyoqXG4gICAqIFR5cGVTY3JpcHQgc291cmNlIHRleHQgdG8gZXZhbHVhdGUgdGhlIHR5cGUgZXhwcmVzc2lvbiBpbi5cbiAgICovXG4gIHNvdXJjZVRleHQ6IHN0cmluZztcbn07XG5leHBvcnQgdHlwZSBFeHBhbmRNeVR5cGVPcHRpb25zID1cbiAgfCBFeHBhbmRUeXBlRnJvbVNvdXJjZUZpbGVPcHRpb25zXG4gIHwgRXhwYW5kVHlwZUZyb21Tb3VyY2VUZXh0T3B0aW9ucztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4cGFuZE15VHlwZShcbiAgb3B0aW9uczogRXhwYW5kVHlwZUZyb21Tb3VyY2VUZXh0T3B0aW9ucyxcbik6IFByb21pc2U8c3RyaW5nPjtcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleHBhbmRNeVR5cGUoXG4gIG9wdGlvbnM6IEV4cGFuZFR5cGVGcm9tU291cmNlRmlsZU9wdGlvbnMsXG4pOiBQcm9taXNlPHN0cmluZz47XG5cbi8qKlxuICogRXhwYW5kcyBhIFR5cGVTY3JpcHQgdHlwZSBleHByZXNzaW9uLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zXG4gKiBAcmV0dXJucyBUaGUgZXhwYW5kZWQgdHlwZSBleHByZXNzaW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhwYW5kTXlUeXBlKG9wdGlvbnM6IEV4cGFuZE15VHlwZU9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMudHlwZUV4cHJlc3Npb24udHJpbSgpID09PSBcIlwiKSB7XG4gICAgcmV0dXJuIFwibmV2ZXJcIjtcbiAgfVxuXG4gIGlmIChcInNvdXJjZVRleHRcIiBpbiBvcHRpb25zKSB7XG4gICAgY29uc3QgZHVtbXlGaWxlTmFtZSA9IFwiZXhwYW5kLW15LXR5cGUtZHVtbXkudHNcIjtcblxuICAgIHJldHVybiBleHBhbmRNeVR5cGUoe1xuICAgICAgc291cmNlRmlsZU5hbWU6IGR1bW15RmlsZU5hbWUsXG4gICAgICB0eXBlRXhwcmVzc2lvbjogb3B0aW9ucy50eXBlRXhwcmVzc2lvbixcbiAgICAgIGNvbXBpbGVySG9zdEZ1bmN0aW9uT3ZlcnJpZGVzOiB7XG4gICAgICAgIHJlYWRGaWxlKGZpbGVOYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgICBpZiAocGF0aC5iYXNlbmFtZShmaWxlTmFtZSkgPT09IGR1bW15RmlsZU5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBvcHRpb25zLnNvdXJjZVRleHQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHRzLnN5cy5yZWFkRmlsZShmaWxlTmFtZSk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgdHNDb21waWxlck9wdGlvbnM6IG9wdGlvbnMudHNDb21waWxlck9wdGlvbnMsXG4gICAgICBwcmV0dGlmeTogb3B0aW9ucy5wcmV0dGlmeSxcbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0IHJlc29sdmVkU291cmNlRmlsZU5hbWUgPSBwYXRoLnJlc29sdmUob3B0aW9ucy5zb3VyY2VGaWxlTmFtZSk7XG5cbiAgY29uc3QgdHNDb21waWxlck9wdGlvbnMgPSBvcHRpb25zLnRzQ29tcGlsZXJPcHRpb25zID8/IHtcbiAgICBub0VtaXQ6IHRydWUsXG5cbiAgICBzdHJpY3ROdWxsQ2hlY2tzOiB0cnVlLFxuICAgIGFsbG93U3ludGhldGljRGVmYXVsdEltcG9ydHM6IHRydWUsXG4gICAgYWxsb3dBcmJpdHJhcnlFeHRlbnNpb25zOiB0cnVlLFxuICAgIGFsbG93SW1wb3J0aW5nVHNFeHRlbnNpb25zOiB0cnVlLFxuICAgIGFsbG93SnM6IHRydWUsXG4gIH07XG5cbiAgaWYgKCF0c0NvbXBpbGVyT3B0aW9ucy5zdHJpY3ROdWxsQ2hlY2tzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwic3RyaWN0TnVsbENoZWNrcyBtdXN0IGJlIGVuYWJsZWQhXCIpO1xuICB9XG5cbiAgY29uc3QgY29tcGlsZXJIb3N0ID0gY3JlYXRlQXVnbWVudGVyQ29tcGlsZXJIb3N0KFxuICAgIHJlc29sdmVkU291cmNlRmlsZU5hbWUsXG4gICAgY3JlYXRlRXhwYW5kQ29kZUJsb2NrKG9wdGlvbnMudHlwZUV4cHJlc3Npb24pLFxuICAgIHRzQ29tcGlsZXJPcHRpb25zLFxuICAgIG9wdGlvbnMuY29tcGlsZXJIb3N0RnVuY3Rpb25PdmVycmlkZXMsXG4gICk7XG5cbiAgY29uc3QgcHJvZ3JhbSA9IHRzLmNyZWF0ZVByb2dyYW0oXG4gICAgW3Jlc29sdmVkU291cmNlRmlsZU5hbWVdLFxuICAgIHRzQ29tcGlsZXJPcHRpb25zLFxuICAgIGNvbXBpbGVySG9zdCxcbiAgKTtcblxuICBjb25zdCBzb3VyY2VGaWxlID0gcHJvZ3JhbS5nZXRTb3VyY2VGaWxlKHJlc29sdmVkU291cmNlRmlsZU5hbWUpO1xuICBpZiAoIXNvdXJjZUZpbGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJTb3VyY2UgZmlsZSBub3QgZm91bmQhXCIpO1xuICB9XG5cbiAgY29uc3QgcmVzdWx0SWRlbnRpZmllck5vZGUgPSBmaW5kUmVzdWx0SWRlbnRpZmllck5vZGUoc291cmNlRmlsZSk7XG4gIGlmICghcmVzdWx0SWRlbnRpZmllck5vZGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBub2RlIGZvdW5kIVwiKTtcbiAgfVxuXG4gIGNvbnN0IHR5cGVDaGVja2VyID0gcHJvZ3JhbS5nZXRUeXBlQ2hlY2tlcigpO1xuICBjb25zdCBleHBhbmRlZFR5cGVTdHJpbmcgPSB0eXBlQ2hlY2tlci50eXBlVG9TdHJpbmcoXG4gICAgdHlwZUNoZWNrZXIuZ2V0VHlwZUF0TG9jYXRpb24ocmVzdWx0SWRlbnRpZmllck5vZGUpLFxuICAgIHVuZGVmaW5lZCxcbiAgICB0cy5UeXBlRm9ybWF0RmxhZ3MuTm9kZUJ1aWxkZXJGbGFnc01hc2ssXG4gICk7XG5cbiAgaWYgKG9wdGlvbnMucHJldHRpZnk/LmVuYWJsZWQgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIGV4cGFuZGVkVHlwZVN0cmluZztcbiAgfVxuXG4gIHJldHVybiBmb3JtYXRUeXBlRXhwcmVzc2lvbihcbiAgICBleHBhbmRlZFR5cGVTdHJpbmcsXG4gICAgb3B0aW9ucy5wcmV0dGlmeT8uYmlvbWVPcHRpb25zLFxuICApO1xufVxuIiwKICAgICJpbXBvcnQgdHMgZnJvbSBcInR5cGVzY3JpcHRcIjtcblxudHlwZSBFeHRyYWN0RnVuY3Rpb25zPFQsIEsgZXh0ZW5kcyBrZXlvZiBUID0ga2V5b2YgVD4gPSB7XG4gIFtQIGluIEtdOiBFeHRyYWN0PFRbUF0sICguLi5hcmdzOiBuZXZlcltdKSA9PiB1bmtub3duPjtcbn07XG5leHBvcnQgdHlwZSBDb21waWxlckhvc3RGdW5jdGlvbk92ZXJyaWRlcyA9IFBhcnRpYWw8XG4gIEV4dHJhY3RGdW5jdGlvbnM8dHMuQ29tcGlsZXJIb3N0PlxuPjtcblxuLyoqXG4gKiBDcmVhdGVzIGEgY3VzdG9tIGNvbXBpbGVyIGhvc3QgdGhhdCBhdWdtZW50cyB0aGUgc3BlY2lmaWVkIHNvdXJjZSBmaWxlIGZvciBleHBhbmRpbmcgYSB0eXBlIGV4cHJlc3Npb24uXG4gKlxuICogQHBhcmFtIHNvdXJjZUZpbGVOYW1lIE5hbWUgb2YgdGhlIHNvdXJjZSBmaWxlIHRvIGF1Z21lbnQuXG4gKiBAcGFyYW0gY29kZVRvQWRkIFR5cGUgZXhwcmVzc2lvbi5cbiAqIEBwYXJhbSBjb21waWxlck9wdGlvbnMgVHlwZVNjcmlwdCBjb21waWxlciBvcHRpb25zLlxuICogQHBhcmFtIGNvbXBpbGVySG9zdEZ1bmN0aW9uT3ZlcnJpZGVzIEEgcmVjb3JkIG9mIGZ1bmN0aW9ucyB0byBvdmVycmlkZSBpbiB0aGUgY29tcGlsZXIgaG9zdC4gVXNlZnVsIGZvciBtb2NraW5nLlxuICogQHJldHVybnMgQSBjdXN0b20gY29tcGlsZXIgaG9zdCB0aGF0IHJldHVybnMgYW4gYXVnbWVudGVkIHNvdXJjZSBmaWxlIHRoYXQgY2FuIGJlIHVzZWQgdG8gZXhwYW5kIHRoZSB0eXBlIGV4cHJlc3Npb24uXG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVBdWdtZW50ZXJDb21waWxlckhvc3QgPSAoXG4gIHNvdXJjZUZpbGVOYW1lOiBzdHJpbmcsXG4gIGNvZGVUb0FkZDogc3RyaW5nLFxuICBjb21waWxlck9wdGlvbnM/OiB0cy5Db21waWxlck9wdGlvbnMsXG4gIGNvbXBpbGVySG9zdEZ1bmN0aW9uT3ZlcnJpZGVzPzogQ29tcGlsZXJIb3N0RnVuY3Rpb25PdmVycmlkZXMsXG4pID0+IHtcbiAgY29uc3QgY3VzdG9tQ29tcGlsZXJIb3N0ID0gdHMuY3JlYXRlQ29tcGlsZXJIb3N0KGNvbXBpbGVyT3B0aW9ucyA/PyB7fSwgdHJ1ZSk7XG4gIGNvbnN0IG92ZXJyaWRlcyA9IGNvbXBpbGVySG9zdEZ1bmN0aW9uT3ZlcnJpZGVzID8/IHt9O1xuXG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKG92ZXJyaWRlcykgYXMgQXJyYXk8XG4gICAga2V5b2YgQ29tcGlsZXJIb3N0RnVuY3Rpb25PdmVycmlkZXNcbiAgPikge1xuICAgIGNvbnN0IG92ZXJyaWRlID0gb3ZlcnJpZGVzW2tleV07XG5cbiAgICBpZiAob3ZlcnJpZGUpIHtcbiAgICAgIChjdXN0b21Db21waWxlckhvc3QgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSA9XG4gICAgICAgIG92ZXJyaWRlO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IG9yaWdpbmFsUmVhZEZpbGUgPSBjdXN0b21Db21waWxlckhvc3QucmVhZEZpbGU7XG5cbiAgY3VzdG9tQ29tcGlsZXJIb3N0LnJlYWRGaWxlID0gKGZpbGVOYW1lKSA9PiB7XG4gICAgY29uc3QgY29udGVudHMgPSBvcmlnaW5hbFJlYWRGaWxlKGZpbGVOYW1lKTtcblxuICAgIGlmIChjb250ZW50cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gY29udGVudHM7XG4gICAgfVxuXG4gICAgaWYgKGZpbGVOYW1lICE9PSBzb3VyY2VGaWxlTmFtZSkge1xuICAgICAgcmV0dXJuIGNvbnRlbnRzO1xuICAgIH1cblxuICAgIHJldHVybiBgJHtjb2RlVG9BZGR9XFxuJHtjb250ZW50c31gO1xuICB9O1xuXG4gIHJldHVybiBjdXN0b21Db21waWxlckhvc3Q7XG59O1xuIiwKICAgICJpbXBvcnQgeyBCaW9tZSB9IGZyb20gXCJAYmlvbWVqcy9qcy1hcGkvbm9kZWpzXCI7XG5pbXBvcnQgdHlwZSB7IENvbmZpZ3VyYXRpb24gYXMgQmlvbWVDb25maWd1cmF0aW9uIH0gZnJvbSBcIkBiaW9tZWpzL3dhc20tbm9kZWpzXCI7XG5cbmNvbnN0IGlkZW50aWZpZXJQcmVmaXggPSBcIl9fRVhQQU5EX01ZX1RZUEVfX1wiO1xuY29uc3QgdmlydHVhbEZvcm1hdEZpbGVOYW1lID0gXCJleHBhbmQtbXktdHlwZS50c1wiO1xuY29uc3QgYmlvbWUgPSBuZXcgQmlvbWUoKTtcbmNvbnN0IHsgcHJvamVjdEtleSB9ID0gYmlvbWUub3BlblByb2plY3QoKTtcblxuY29uc3QgZGVmYXVsdEJpb21lQ29uZmlndXJhdGlvbjogQmlvbWVDb25maWd1cmF0aW9uID0ge1xuICBmb3JtYXR0ZXI6IHtcbiAgICBlbmFibGVkOiB0cnVlLFxuICAgIGluZGVudFN0eWxlOiBcInNwYWNlXCIsXG4gIH0sXG4gIGphdmFzY3JpcHQ6IHtcbiAgICBmb3JtYXR0ZXI6IHtcbiAgICAgIHF1b3RlU3R5bGU6IFwiZG91YmxlXCIsXG4gICAgICBzZW1pY29sb25zOiBcImFzTmVlZGVkXCIsXG4gICAgfSxcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVFeHBhbmRDb2RlQmxvY2sgPSAodHlwZUV4cHJlc3Npb246IHN0cmluZykgPT4ge1xuICAvLyBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvYmxvYi9tYWluL3Rlc3RzL2Nhc2VzL2NvbXBpbGVyL2NvbXB1dGVkVHlwZXNLZXlvZk5vSW5kZXhTaWduYXR1cmVUeXBlLnRzXG4gIHJldHVybiBgdHlwZSAke2lkZW50aWZpZXJQcmVmaXh9UmVzdWx0ID0gJHtpZGVudGlmaWVyUHJlZml4fUV4cGFuZDwke2lkZW50aWZpZXJQcmVmaXh9RXhwcmVzc2lvbj47XG4gICAgdHlwZSAke2lkZW50aWZpZXJQcmVmaXh9RXhwcmVzc2lvbiA9ICR7dHlwZUV4cHJlc3Npb259O1xuXG4gICAgdHlwZSAke2lkZW50aWZpZXJQcmVmaXh9RXhwYW5kPFQ+ID0gXG4gICAgICAgIFQgZXh0ZW5kcyAoLi4uYXJnczogaW5mZXIgQSkgPT4gaW5mZXIgUiA/ICguLi5hcmdzOiAke2lkZW50aWZpZXJQcmVmaXh9RXhwYW5kPEE+KSA9PiAke2lkZW50aWZpZXJQcmVmaXh9RXhwYW5kPFI+XG4gICAgICA6IFQgZXh0ZW5kcyBQcm9taXNlPGluZmVyIFU+ID8gUHJvbWlzZTwke2lkZW50aWZpZXJQcmVmaXh9RXhwYW5kVHlwZUFyZ3VtZW50PFU+PlxuICAgICAgOiB7IFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgc3RyaW5nID8gJHtpZGVudGlmaWVyUHJlZml4fUV4cGFuZFN0cmluZzxUW0tdPiA6ICR7aWRlbnRpZmllclByZWZpeH1FeHBhbmQ8VFtLXT47IH0gJiB7fTtcblxuICAgIHR5cGUgJHtpZGVudGlmaWVyUHJlZml4fUV4cGFuZFR5cGVBcmd1bWVudDxUPiA9IFtUICYge31dIGV4dGVuZHMgW25ldmVyXSA/IFQgOiBUICYge30gZXh0ZW5kcyB2b2lkID8gVCA6ICR7aWRlbnRpZmllclByZWZpeH1FeHBhbmQ8VCAmIHt9PjtcblxuICAgIC8vIEZvcmNlcyBhIHVuaW9uIG9mIHN0cmluZyBsaXRlcmFsIHR5cGVzIHRvIGJlIGV4cGFuZGVkXG4gICAgdHlwZSAke2lkZW50aWZpZXJQcmVmaXh9RXhwYW5kU3RyaW5nPFQgZXh0ZW5kcyBzdHJpbmc+ID0gJHtpZGVudGlmaWVyUHJlZml4fVJlbW92ZVVuZGVyc2NvcmU8JHtpZGVudGlmaWVyUHJlZml4fUFwcGVuZFVuZGVyc2NvcmU8VD4+O1xuICAgIHR5cGUgJHtpZGVudGlmaWVyUHJlZml4fUFwcGVuZFVuZGVyc2NvcmU8VCBleHRlbmRzIHN0cmluZz4gPSBcXGBcXCR7VH1fXFxgIGV4dGVuZHMgc3RyaW5nID8gXFxgXFwke1R9X1xcYCA6IG5ldmVyO1xuICAgIHR5cGUgJHtpZGVudGlmaWVyUHJlZml4fVJlbW92ZVVuZGVyc2NvcmU8VCBleHRlbmRzIHN0cmluZz4gPSBUIGV4dGVuZHMgXFxgXFwke2luZmVyIFV9X1xcYCA/IFUgOiBuZXZlcjtgO1xufTtcblxuZXhwb3J0IGNvbnN0IGZvcm1hdFR5cGVFeHByZXNzaW9uID0gYXN5bmMgKFxuICBjb2RlOiBzdHJpbmcsXG4gIGJpb21lQ29uZmlndXJhdGlvbj86IEJpb21lQ29uZmlndXJhdGlvbixcbikgPT4ge1xuICBjb25zdCBpbnB1dCA9IGB0eXBlICR7aWRlbnRpZmllclByZWZpeH0gPSAke2NvZGV9YDtcbiAgY29uc3QgamF2YXNjcmlwdEZvcm1hdHRlciA9IHtcbiAgICAuLi5kZWZhdWx0QmlvbWVDb25maWd1cmF0aW9uLmphdmFzY3JpcHQ/LmZvcm1hdHRlcixcbiAgICAuLi5iaW9tZUNvbmZpZ3VyYXRpb24/LmphdmFzY3JpcHQ/LmZvcm1hdHRlcixcbiAgfTtcblxuICBiaW9tZS5hcHBseUNvbmZpZ3VyYXRpb24ocHJvamVjdEtleSwge1xuICAgIC4uLmRlZmF1bHRCaW9tZUNvbmZpZ3VyYXRpb24sXG4gICAgLi4uYmlvbWVDb25maWd1cmF0aW9uLFxuICAgIGZvcm1hdHRlcjoge1xuICAgICAgLi4uZGVmYXVsdEJpb21lQ29uZmlndXJhdGlvbi5mb3JtYXR0ZXIsXG4gICAgICAuLi5iaW9tZUNvbmZpZ3VyYXRpb24/LmZvcm1hdHRlcixcbiAgICB9LFxuICAgIGphdmFzY3JpcHQ6IHtcbiAgICAgIC4uLmRlZmF1bHRCaW9tZUNvbmZpZ3VyYXRpb24uamF2YXNjcmlwdCxcbiAgICAgIC4uLmJpb21lQ29uZmlndXJhdGlvbj8uamF2YXNjcmlwdCxcbiAgICAgIGZvcm1hdHRlcjogamF2YXNjcmlwdEZvcm1hdHRlcixcbiAgICB9LFxuICB9KTtcblxuICBjb25zdCByZXN1bHQgPSBiaW9tZS5mb3JtYXRDb250ZW50KHByb2plY3RLZXksIGlucHV0LCB7XG4gICAgZmlsZVBhdGg6IHZpcnR1YWxGb3JtYXRGaWxlTmFtZSxcbiAgfSk7XG5cbiAgaWYgKHJlc3VsdC5kaWFnbm9zdGljcy5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYmlvbWUucHJpbnREaWFnbm9zdGljcyhyZXN1bHQuZGlhZ25vc3RpY3MsIHtcbiAgICAgICAgZmlsZVBhdGg6IHZpcnR1YWxGb3JtYXRGaWxlTmFtZSxcbiAgICAgICAgZmlsZVNvdXJjZTogaW5wdXQsXG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdC5jb250ZW50LnRyaW0oKS5zdWJzdHJpbmcoYHR5cGUgJHtpZGVudGlmaWVyUHJlZml4fSA9IGAubGVuZ3RoKTtcbn07XG4iLAogICAgIiMhL3Vzci9iaW4vZW52IG5vZGVcbmltcG9ydCB7IHR5cGUgUGFyc2VBcmdzQ29uZmlnLCBwYXJzZUFyZ3MgfSBmcm9tIFwibm9kZTp1dGlsXCI7XG5pbXBvcnQgdHMgZnJvbSBcInR5cGVzY3JpcHRcIjtcbmltcG9ydCB7IGV4cGFuZE15VHlwZSB9IGZyb20gXCIuL2luZGV4LmpzXCI7XG5cbnR5cGUgVmFsdWVzID0ge1xuICBoZWxwPzogYm9vbGVhbjtcbiAgcHJldHRpZnk/OiBib29sZWFuO1xuICBcIm5vLXByZXR0aWZ5XCI/OiBib29sZWFuO1xuICB0c2NvbmZpZz86IHN0cmluZztcbn07XG5cbmNvbnN0IHRyeVBhcnNlID0gPFxuICBWYWx1ZXMgZXh0ZW5kcyBSZWNvcmQ8XG4gICAgc3RyaW5nLFxuICAgIHN0cmluZyB8IGJvb2xlYW4gfCBBcnJheTxzdHJpbmcgfCBib29sZWFuPiB8IHVuZGVmaW5lZFxuICA+LFxuICBPcHRpb25zIGV4dGVuZHMgUGFyc2VBcmdzQ29uZmlnW1wib3B0aW9uc1wiXSA9IFBhcnNlQXJnc0NvbmZpZ1tcIm9wdGlvbnNcIl0sXG4+KFxuICBvcHRpb25zOiBPcHRpb25zLFxuKTogeyBlcnJvcj86IEVycm9yOyB2YWx1ZXM6IFZhbHVlczsgcG9zaXRpb25hbHM6IHN0cmluZ1tdIH0gPT4ge1xuICBsZXQgcmVzdWx0OiBSZXR1cm5UeXBlPHR5cGVvZiBwYXJzZUFyZ3M+O1xuICB0cnkge1xuICAgIHJlc3VsdCA9IHBhcnNlQXJncyh7XG4gICAgICBvcHRpb25zLFxuICAgICAgdG9rZW5zOiB0cnVlLFxuICAgICAgYWxsb3dQb3NpdGlvbmFsczogdHJ1ZSxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKSxcbiAgICAgIHZhbHVlczoge30gYXMgVmFsdWVzLFxuICAgICAgcG9zaXRpb25hbHM6IFtdLFxuICAgIH07XG4gIH1cblxuICBjb25zdCB7IHRva2VucywgdmFsdWVzLCBwb3NpdGlvbmFscyB9ID0gcmVzdWx0O1xuXG4gIC8vIFJlcHJvY2VzcyB0aGUgb3B0aW9uIHRva2VucyBhbmQgb3ZlcndyaXRlIHRoZSByZXR1cm5lZCB2YWx1ZXMuXG4gIGZvciAoY29uc3QgdG9rZW4gb2YgdG9rZW5zID8/IFtdKSB7XG4gICAgaWYgKHRva2VuLmtpbmQgPT09IFwib3B0aW9uLXRlcm1pbmF0b3JcIiB8fCB0b2tlbi5raW5kID09PSBcInBvc2l0aW9uYWxcIikge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHRva2VuLm5hbWUuc3RhcnRzV2l0aChcIm5vLVwiKSkge1xuICAgICAgLy8gU3RvcmUgZm9vOmZhbHNlIGZvciAtLW5vLWZvb1xuICAgICAgY29uc3QgcG9zaXRpdmVOYW1lID0gdG9rZW4ubmFtZS5zbGljZShcIm5vLVwiLmxlbmd0aCk7XG4gICAgICB2YWx1ZXNbcG9zaXRpdmVOYW1lXSA9IGZhbHNlO1xuICAgICAgZGVsZXRlIHZhbHVlc1t0b2tlbi5uYW1lXTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmVzYXZlIHZhbHVlIHNvIGxhc3Qgb25lIHdpbnMgaWYgYm90aCAtLWZvbyBhbmQgLS1uby1mb28uXG4gICAgICB2YWx1ZXNbdG9rZW4ubmFtZV0gPSB0b2tlbi52YWx1ZSA/PyB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZXJyb3I6IHVuZGVmaW5lZCxcbiAgICB2YWx1ZXM6IHZhbHVlcyBhcyBWYWx1ZXMsXG4gICAgcG9zaXRpb25hbHMsXG4gIH07XG59O1xuXG5jb25zdCB7IGVycm9yLCB2YWx1ZXMsIHBvc2l0aW9uYWxzIH0gPSB0cnlQYXJzZTxWYWx1ZXM+KHtcbiAgaGVscDoge1xuICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgIHNob3J0OiBcImhcIixcbiAgfSxcbiAgcHJldHRpZnk6IHtcbiAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICBzaG9ydDogXCJwXCIsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgfSxcbiAgXCJuby1wcmV0dGlmeVwiOiB7XG4gICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgc2hvcnQ6IFwiUFwiLFxuICB9LFxuICB0c2NvbmZpZzoge1xuICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgc2hvcnQ6IFwiY1wiLFxuICB9LFxufSk7XG5cbmlmIChlcnJvcikge1xuICBjb25zb2xlLmVycm9yKGVycm9yLm1lc3NhZ2UpO1xuICBwcm9jZXNzLmV4aXQoMSk7XG59XG5cbmNvbnN0IHVzYWdlUHJvbXB0ID0gW1xuICBcIlVzYWdlOlwiLFxuICBcIiAgZXhwYW5kLW15LXR5cGUgW29wdGlvbnNdIDxzb3VyY2UtZmlsZT4gPGV4cHJlc3Npb24+XCIsXG4gIFwiXCIsXG4gIFwiT3B0aW9uczpcIixcbiAgXCIgIC1oLCAtLWhlbHBcXHRcXHRcXHRTaG93IHRoaXMgaGVscCBtZXNzYWdlXCIsXG4gIFwiICAtcCwgLS1wcmV0dGlmeVxcdFxcdFByZXR0aWZ5IHRoZSBvdXRwdXQgKGRlZmF1bHQpXCIsXG4gIFwiICAtUCwgLS1uby1wcmV0dGlmeVxcdFxcdERvIG5vdCBwcmV0dGlmeSB0aGUgb3V0cHV0XCIsXG4gIFwiICAtYywgLS10c2NvbmZpZyA8ZmlsZT5cXHRcXHRVc2UgdGhlIHNwZWNpZmllZCB0c2NvbmZpZy5qc29uIGZpbGVcIixcbl0uam9pbihcIlxcblwiKTtcblxuaWYgKHZhbHVlcy5oZWxwKSB7XG4gIGNvbnNvbGUuZXJyb3IodXNhZ2VQcm9tcHQpO1xuICBwcm9jZXNzLmV4aXQoMCk7XG59XG5cbmlmIChwb3NpdGlvbmFscy5sZW5ndGggIT09IDIpIHtcbiAgY29uc29sZS5lcnJvcih1c2FnZVByb21wdCk7XG4gIHByb2Nlc3MuZXhpdCgxKTtcbn1cblxuY29uc3QgW3NvdXJjZUZpbGVOYW1lLCB0eXBlRXhwcmVzc2lvbl0gPSBwb3NpdGlvbmFscztcbmNvbnN0IHByZXR0aWZ5ID0gdmFsdWVzLnByZXR0aWZ5ID8/IHRydWU7XG5jb25zdCB0c0NvbmZpZ0ZpbGVOYW1lID0gdmFsdWVzLnRzY29uZmlnO1xuXG5sZXQgdHNQYXJzZWRDb21tYW5kTGluZTogdHMuUGFyc2VkQ29tbWFuZExpbmUgfCB1bmRlZmluZWQ7XG5cbmlmICh0c0NvbmZpZ0ZpbGVOYW1lKSB7XG4gIGNvbnN0IGNvbmZpZ0ZpbGUgPSB0cy5yZWFkQ29uZmlnRmlsZSh0c0NvbmZpZ0ZpbGVOYW1lLCB0cy5zeXMucmVhZEZpbGUpO1xuICBjb25zdCBjb21waWxlck9wdGlvbnMgPSB0cy5wYXJzZUpzb25Db25maWdGaWxlQ29udGVudChcbiAgICBjb25maWdGaWxlLmNvbmZpZyxcbiAgICB0cy5zeXMsXG4gICAgXCIuL1wiLFxuICApO1xuXG4gIHRzUGFyc2VkQ29tbWFuZExpbmUgPSBjb21waWxlck9wdGlvbnM7XG59XG5cbmNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4cGFuZE15VHlwZSh7XG4gIHNvdXJjZUZpbGVOYW1lLFxuICB0eXBlRXhwcmVzc2lvbixcbiAgcHJldHRpZnk6IHtcbiAgICBlbmFibGVkOiBwcmV0dGlmeSxcbiAgfSxcbiAgdHNDb21waWxlck9wdGlvbnM6IHRzUGFyc2VkQ29tbWFuZExpbmU/Lm9wdGlvbnMsXG59KTtcblxuY29uc29sZS5sb2cocmVzdWx0KTtcbiIKICBdLAogICJtYXBwaW5ncyI6ICI7OztBQUFBO0FBRUE7OztBQ0ZBO0FBa0JPLElBQU0sOEJBQThCLENBQ3pDLGdCQUNBLFdBQ0EsaUJBQ0Esa0NBQ0c7QUFBQSxFQUNILE1BQU0scUJBQXFCLEdBQUcsbUJBQW1CLG1CQUFtQixDQUFDLEdBQUcsSUFBSTtBQUFBLEVBQzVFLE1BQU0sWUFBWSxpQ0FBaUMsQ0FBQztBQUFBLEVBRXBELFdBQVcsT0FBTyxPQUFPLEtBQUssU0FBUyxHQUVwQztBQUFBLElBQ0QsTUFBTSxXQUFXLFVBQVU7QUFBQSxJQUUzQixJQUFJLFVBQVU7QUFBQSxNQUNYLG1CQUEwRCxPQUN6RDtBQUFBLElBQ0o7QUFBQSxFQUNGO0FBQUEsRUFFQSxNQUFNLG1CQUFtQixtQkFBbUI7QUFBQSxFQUU1QyxtQkFBbUIsV0FBVyxDQUFDLGFBQWE7QUFBQSxJQUMxQyxNQUFNLFdBQVcsaUJBQWlCLFFBQVE7QUFBQSxJQUUxQyxJQUFJLGFBQWEsV0FBVztBQUFBLE1BQzFCLE9BQU87QUFBQSxJQUNUO0FBQUEsSUFFQSxJQUFJLGFBQWEsZ0JBQWdCO0FBQUEsTUFDL0IsT0FBTztBQUFBLElBQ1Q7QUFBQSxJQUVBLE9BQU8sR0FBRztBQUFBLEVBQWM7QUFBQTtBQUFBLEVBRzFCLE9BQU87QUFBQTs7O0FDdERUO0FBR0EsSUFBTSxtQkFBbUI7QUFDekIsSUFBTSx3QkFBd0I7QUFDOUIsSUFBTSxRQUFRLElBQUk7QUFDbEIsTUFB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QTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUNGLEVBQUUsS0FBSztBQUFBLENBQUk7QUFFWCxJQUFJLE9BQU8sTUFBTTtBQUFBLEVBQ2YsUUFBUSxNQUFNLFdBQVc7QUFBQSxFQUN6QixRQUFRLEtBQUssQ0FBQztBQUNoQjtBQUVBLElBQUksWUFBWSxXQUFXLEdBQUc7QUFBQSxFQUM1QixRQUFRLE1BQU0sV0FBVztBQUFBLEVBQ3pCLFFBQVEsS0FBSyxDQUFDO0FBQ2hCO0FBRUEsS0FBTyxnQkFBZ0Isa0JBQWtCO0FBQ3pDLElBQU0sV0FBVyxPQUFPLFlBQVk7QUFDcEMsSUFBTSxtQkFBbUIsT0FBTztBQUVoQyxJQUFJO0FBRUosSUFBSSxrQkFBa0I7QUFBQSxFQUNwQixNQUFNLGFBQWEsSUFBRyxlQUFlLGtCQUFrQixJQUFHLElBQUksUUFBUTtBQUFBLEVBQ3RFLE1BQU0sa0JBQWtCLElBQUcsMkJBQ3pCLFdBQVcsUUFDWCxJQUFHLEtBQ0gsSUFDRjtBQUFBLEVBRUEsc0JBQXNCO0FBQ3hCO0FBRUEsSUFBTSxTQUFTLE1BQU0sYUFBYTtBQUFBLEVBQ2hDO0FBQUEsRUFDQTtBQUFBLEVBQ0EsVUFBVTtBQUFBLElBQ1IsU0FBUztBQUFBLEVBQ1g7QUFBQSxFQUNBLG1CQUFtQixxQkFBcUI7QUFDMUMsQ0FBQztBQUVELFFBQVEsSUFBSSxNQUFNOyIsCiAgImRlYnVnSWQiOiAiRDk3OEQ1RDZBRkNCQkU4RDY0NzU2RTIxNjQ3NTZFMjEiLAogICJuYW1lcyI6IFtdCn0=
@@ -0,0 +1,3 @@
1
+ import type { Configuration as BiomeConfiguration } from "@biomejs/wasm-nodejs";
2
+ export declare const createExpandCodeBlock: (typeExpression: string) => string;
3
+ export declare const formatTypeExpression: (code: string, biomeConfiguration?: BiomeConfiguration) => Promise<string>;
package/dist/index.cjs CHANGED
@@ -1,49 +1,89 @@
1
1
  var __create = Object.create;
2
+ var __getProtoOf = Object.getPrototypeOf;
2
3
  var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
4
  var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __getProtoOf = Object.getPrototypeOf;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
6
  var __hasOwnProp = Object.prototype.hasOwnProperty;
7
- var __export = (target, all) => {
8
- for (var name in all)
9
- __defProp(target, name, { get: all[name], enumerable: true });
7
+ function __accessProp(key) {
8
+ return this[key];
9
+ }
10
+ var __toESMCache_node;
11
+ var __toESMCache_esm;
12
+ var __toESM = (mod, isNodeMode, target) => {
13
+ var canCache = mod != null && typeof mod === "object";
14
+ if (canCache) {
15
+ var cache = isNodeMode ? __toESMCache_node ??= new WeakMap : __toESMCache_esm ??= new WeakMap;
16
+ var cached = cache.get(mod);
17
+ if (cached)
18
+ return cached;
19
+ }
20
+ target = mod != null ? __create(__getProtoOf(mod)) : {};
21
+ const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
22
+ for (let key of __getOwnPropNames(mod))
23
+ if (!__hasOwnProp.call(to, key))
24
+ __defProp(to, key, {
25
+ get: __accessProp.bind(mod, key),
26
+ enumerable: true
27
+ });
28
+ if (canCache)
29
+ cache.set(mod, to);
30
+ return to;
10
31
  };
11
- var __copyProps = (to, from, except, desc) => {
32
+ var __toCommonJS = (from) => {
33
+ var entry = (__moduleCache ??= new WeakMap).get(from), desc;
34
+ if (entry)
35
+ return entry;
36
+ entry = __defProp({}, "__esModule", { value: true });
12
37
  if (from && typeof from === "object" || typeof from === "function") {
13
- for (let key of __getOwnPropNames(from))
14
- if (!__hasOwnProp.call(to, key) && key !== except)
15
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
38
+ for (var key of __getOwnPropNames(from))
39
+ if (!__hasOwnProp.call(entry, key))
40
+ __defProp(entry, key, {
41
+ get: __accessProp.bind(from, key),
42
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
43
+ });
16
44
  }
17
- return to;
45
+ __moduleCache.set(from, entry);
46
+ return entry;
47
+ };
48
+ var __moduleCache;
49
+ var __returnValue = (v) => v;
50
+ function __exportSetter(name, newValue) {
51
+ this[name] = __returnValue.bind(null, newValue);
52
+ }
53
+ var __export = (target, all) => {
54
+ for (var name in all)
55
+ __defProp(target, name, {
56
+ get: all[name],
57
+ enumerable: true,
58
+ configurable: true,
59
+ set: __exportSetter.bind(all, name)
60
+ });
18
61
  };
19
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
20
- // If the importer is in node compatibility mode or this is not an ESM
21
- // file that has been converted to a CommonJS file using a Babel-
22
- // compatible transform (i.e. "__esModule" has not been set), then set
23
- // "default" to the CommonJS "module.exports" for node compatibility.
24
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
25
- mod
26
- ));
27
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
28
62
 
29
63
  // src/index.ts
30
- var index_exports = {};
31
- __export(index_exports, {
64
+ var exports_src = {};
65
+ __export(exports_src, {
32
66
  expandMyType: () => expandMyType
33
67
  });
34
- module.exports = __toCommonJS(index_exports);
68
+ module.exports = __toCommonJS(exports_src);
69
+ var import_node_path = __toESM(require("node:path"));
70
+ var import_typescript2 = __toESM(require("typescript"));
35
71
 
36
72
  // src/augmenter-compiler-host.ts
37
- var import_typescript = __toESM(require("typescript"), 1);
73
+ var import_typescript = __toESM(require("typescript"));
38
74
  var createAugmenterCompilerHost = (sourceFileName, codeToAdd, compilerOptions, compilerHostFunctionOverrides) => {
39
75
  const customCompilerHost = import_typescript.default.createCompilerHost(compilerOptions ?? {}, true);
40
- for (const key of Object.keys(compilerHostFunctionOverrides ?? {})) {
41
- customCompilerHost[key] = compilerHostFunctionOverrides[key];
76
+ const overrides = compilerHostFunctionOverrides ?? {};
77
+ for (const key of Object.keys(overrides)) {
78
+ const override = overrides[key];
79
+ if (override) {
80
+ customCompilerHost[key] = override;
81
+ }
42
82
  }
43
83
  const originalReadFile = customCompilerHost.readFile;
44
84
  customCompilerHost.readFile = (fileName) => {
45
85
  const contents = originalReadFile(fileName);
46
- if (contents === void 0) {
86
+ if (contents === undefined) {
47
87
  return contents;
48
88
  }
49
89
  if (fileName !== sourceFileName) {
@@ -56,8 +96,23 @@ ${contents}`;
56
96
  };
57
97
 
58
98
  // src/code-generator.ts
59
- var import_prettier = require("prettier");
99
+ var import_nodejs = require("@biomejs/js-api/nodejs");
60
100
  var identifierPrefix = "__EXPAND_MY_TYPE__";
101
+ var virtualFormatFileName = "expand-my-type.ts";
102
+ var biome = new import_nodejs.Biome;
103
+ var { projectKey } = biome.openProject();
104
+ var defaultBiomeConfiguration = {
105
+ formatter: {
106
+ enabled: true,
107
+ indentStyle: "space"
108
+ },
109
+ javascript: {
110
+ formatter: {
111
+ quoteStyle: "double",
112
+ semicolons: "asNeeded"
113
+ }
114
+ }
115
+ };
61
116
  var createExpandCodeBlock = (typeExpression) => {
62
117
  return `type ${identifierPrefix}Result = ${identifierPrefix}Expand<${identifierPrefix}Expression>;
63
118
  type ${identifierPrefix}Expression = ${typeExpression};
@@ -74,23 +129,42 @@ var createExpandCodeBlock = (typeExpression) => {
74
129
  type ${identifierPrefix}AppendUnderscore<T extends string> = \`\${T}_\` extends string ? \`\${T}_\` : never;
75
130
  type ${identifierPrefix}RemoveUnderscore<T extends string> = T extends \`\${infer U}_\` ? U : never;`;
76
131
  };
77
- var formatTypeExpression = async (code, prettierOptions) => {
78
- return (await (0, import_prettier.format)(
79
- `type ${identifierPrefix} = ${code}`,
80
- prettierOptions ?? {
81
- parser: "typescript",
82
- semi: false
132
+ var formatTypeExpression = async (code, biomeConfiguration) => {
133
+ const input = `type ${identifierPrefix} = ${code}`;
134
+ const javascriptFormatter = {
135
+ ...defaultBiomeConfiguration.javascript?.formatter,
136
+ ...biomeConfiguration?.javascript?.formatter
137
+ };
138
+ biome.applyConfiguration(projectKey, {
139
+ ...defaultBiomeConfiguration,
140
+ ...biomeConfiguration,
141
+ formatter: {
142
+ ...defaultBiomeConfiguration.formatter,
143
+ ...biomeConfiguration?.formatter
144
+ },
145
+ javascript: {
146
+ ...defaultBiomeConfiguration.javascript,
147
+ ...biomeConfiguration?.javascript,
148
+ formatter: javascriptFormatter
83
149
  }
84
- )).trim().substring(`type ${identifierPrefix} = `.length);
150
+ });
151
+ const result = biome.formatContent(projectKey, input, {
152
+ filePath: virtualFormatFileName
153
+ });
154
+ if (result.diagnostics.length > 0) {
155
+ throw new Error(biome.printDiagnostics(result.diagnostics, {
156
+ filePath: virtualFormatFileName,
157
+ fileSource: input
158
+ }));
159
+ }
160
+ return result.content.trim().substring(`type ${identifierPrefix} = `.length);
85
161
  };
86
162
 
87
163
  // src/index.ts
88
- var import_node_path = __toESM(require("path"), 1);
89
- var import_typescript2 = __toESM(require("typescript"), 1);
90
164
  var findResultIdentifierNode = (node) => {
91
- if (node.getChildCount() == 0) {
165
+ if (node.getChildCount() === 0) {
92
166
  if (!import_typescript2.default.isIdentifier(node)) {
93
- return void 0;
167
+ return;
94
168
  }
95
169
  return node;
96
170
  }
@@ -129,17 +203,8 @@ async function expandMyType(options) {
129
203
  if (!tsCompilerOptions.strictNullChecks) {
130
204
  throw new Error("strictNullChecks must be enabled!");
131
205
  }
132
- const compilerHost = createAugmenterCompilerHost(
133
- resolvedSourceFileName,
134
- createExpandCodeBlock(options.typeExpression),
135
- tsCompilerOptions,
136
- options.compilerHostFunctionOverrides
137
- );
138
- const program = import_typescript2.default.createProgram(
139
- [resolvedSourceFileName],
140
- tsCompilerOptions,
141
- compilerHost
142
- );
206
+ const compilerHost = createAugmenterCompilerHost(resolvedSourceFileName, createExpandCodeBlock(options.typeExpression), tsCompilerOptions, options.compilerHostFunctionOverrides);
207
+ const program = import_typescript2.default.createProgram([resolvedSourceFileName], tsCompilerOptions, compilerHost);
143
208
  const sourceFile = program.getSourceFile(resolvedSourceFileName);
144
209
  if (!sourceFile) {
145
210
  throw new Error("Source file not found!");
@@ -149,18 +214,12 @@ async function expandMyType(options) {
149
214
  throw new Error("No node found!");
150
215
  }
151
216
  const typeChecker = program.getTypeChecker();
152
- const expandedTypeString = typeChecker.typeToString(
153
- typeChecker.getTypeAtLocation(resultIdentifierNode),
154
- void 0,
155
- import_typescript2.default.TypeFormatFlags.NodeBuilderFlagsMask
156
- );
157
- if (options.prettify && options.prettify.enabled === false) {
217
+ const expandedTypeString = typeChecker.typeToString(typeChecker.getTypeAtLocation(resultIdentifierNode), undefined, import_typescript2.default.TypeFormatFlags.NodeBuilderFlagsMask);
218
+ if (options.prettify?.enabled === false) {
158
219
  return expandedTypeString;
159
220
  }
160
- return formatTypeExpression(expandedTypeString, options.prettify?.options);
221
+ return formatTypeExpression(expandedTypeString, options.prettify?.biomeOptions);
161
222
  }
162
- // Annotate the CommonJS export names for ESM import in node:
163
- 0 && (module.exports = {
164
- expandMyType
165
- });
166
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIiwgIi4uL3NyYy9hdWdtZW50ZXItY29tcGlsZXItaG9zdC50cyIsICIuLi9zcmMvY29kZS1nZW5lcmF0b3IudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IGNyZWF0ZUF1Z21lbnRlckNvbXBpbGVySG9zdCB9IGZyb20gXCIuL2F1Z21lbnRlci1jb21waWxlci1ob3N0LnRzXCI7XG5pbXBvcnQgeyB0eXBlIENvbXBpbGVySG9zdEZ1bmN0aW9uT3ZlcnJpZGVzIH0gZnJvbSBcIi4vYXVnbWVudGVyLWNvbXBpbGVyLWhvc3QudHNcIjtcbmltcG9ydCB7XG4gIGNyZWF0ZUV4cGFuZENvZGVCbG9jayxcbiAgZm9ybWF0VHlwZUV4cHJlc3Npb24sXG59IGZyb20gXCIuL2NvZGUtZ2VuZXJhdG9yLnRzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgdHlwZSB7IE9wdGlvbnMgYXMgUHJldHRpZXJPcHRpb25zIH0gZnJvbSBcInByZXR0aWVyXCI7XG5pbXBvcnQgdHMgZnJvbSBcInR5cGVzY3JpcHRcIjtcblxuLyoqXG4gKiBGaW5kcyB0aGUgcmVzdWx0IHR5cGUgaWRlbnRpZmllciBub2RlLlxuICpcbiAqIEBwYXJhbSBub2RlIE5vZGUgaW4gd2hpY2ggdHlwZSB0eXBlIHNob3VsZCBiZSBzZWFyY2hlZC5cbiAqIEByZXR1cm5zIFRoZSByZXN1bHQgdHlwZSBpZGVudGlmaWVyIG5vZGUuXG4gKi9cbmNvbnN0IGZpbmRSZXN1bHRJZGVudGlmaWVyTm9kZSA9IChub2RlOiB0cy5Ob2RlKTogdHMuTm9kZSB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmIChub2RlLmdldENoaWxkQ291bnQoKSA9PSAwKSB7XG4gICAgaWYgKCF0cy5pc0lkZW50aWZpZXIobm9kZSkpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gU2luY2Ugd2UgcHV0IHRoZSBfXzxJREVOVElGSUVSPl9fIHR5cGUgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGVcbiAgICAvLyBmaWxlLCB3ZSBjYW4gcmV0dXJuIHRoZSBmaXJzdCBpZGVudGlmaWVyIHdlIGZpbmQuXG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cblxuICByZXR1cm4gdHMuZm9yRWFjaENoaWxkKG5vZGUsIGZpbmRSZXN1bHRJZGVudGlmaWVyTm9kZSk7XG59O1xuXG5leHBvcnQgdHlwZSBFeHBhbmRUeXBlT3B0aW9uc0Jhc2UgPSB7XG4gIC8qKlxuICAgKiBUaGUgdHlwZSBleHByZXNzaW9uIHRvIGV4cGFuZC5cbiAgICogQGV4YW1wbGUgXCJSZXR1cm5UeXBlPHR5cGVvZiBteUZ1bmN0aW9uPlwiXG4gICAqL1xuICB0eXBlRXhwcmVzc2lvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUeXBlU2NyaXB0IGNvbXBpbGVyIG9wdGlvbnMuXG4gICAqL1xuICB0c0NvbXBpbGVyT3B0aW9ucz86IHRzLkNvbXBpbGVyT3B0aW9ucztcblxuICAvKipcbiAgICogUHJldHRpZXIgb3B0aW9ucy5cbiAgICovXG4gIHByZXR0aWZ5Pzoge1xuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdG8gcHJldHRpZnkgdGhlIG91dHB1dC5cbiAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICovXG4gICAgZW5hYmxlZD86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogUHJldHRpZXIgb3B0aW9ucy4gRG9uJ3QgZm9yZ2V0IHRvIHNldCB0aGUgcGFyc2VyIHRvIFwidHlwZXNjcmlwdFwiLlxuICAgICAqIEBkZWZhdWx0IHsgcGFyc2VyOiBcInR5cGVzY3JpcHRcIiwgc2VtaTogZmFsc2UgfVxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBQcmV0dGllck9wdGlvbnM7XG4gIH07XG5cbiAgLyoqXG4gICAqIEEgcmVjb3JkIG9mIGZ1bmN0aW9ucyB0byBvdmVycmlkZSBpbiB0aGUgY29tcGlsZXIgaG9zdC4gVXNlZnVsIGZvciBtb2NraW5nXG4gICAqL1xuICBjb21waWxlckhvc3RGdW5jdGlvbk92ZXJyaWRlcz86IENvbXBpbGVySG9zdEZ1bmN0aW9uT3ZlcnJpZGVzO1xufTtcbmV4cG9ydCB0eXBlIEV4cGFuZFR5cGVGcm9tU291cmNlRmlsZU9wdGlvbnMgPSBFeHBhbmRUeXBlT3B0aW9uc0Jhc2UgJiB7XG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSBzb3VyY2UgZmlsZSB0byBldmFsdWF0ZSB0aGUgdHlwZSBleHByZXNzaW9uIGluLlxuICAgKi9cbiAgc291cmNlRmlsZU5hbWU6IHN0cmluZztcbn07XG5leHBvcnQgdHlwZSBFeHBhbmRUeXBlRnJvbVNvdXJjZVRleHRPcHRpb25zID0gRXhwYW5kVHlwZU9wdGlvbnNCYXNlICYge1xuICAvKipcbiAgICogVHlwZVNjcmlwdCBzb3VyY2UgdGV4dCB0byBldmFsdWF0ZSB0aGUgdHlwZSBleHByZXNzaW9uIGluLlxuICAgKi9cbiAgc291cmNlVGV4dDogc3RyaW5nO1xufTtcbmV4cG9ydCB0eXBlIEV4cGFuZE15VHlwZU9wdGlvbnMgPVxuICB8IEV4cGFuZFR5cGVGcm9tU291cmNlRmlsZU9wdGlvbnNcbiAgfCBFeHBhbmRUeXBlRnJvbVNvdXJjZVRleHRPcHRpb25zO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhwYW5kTXlUeXBlKFxuICBvcHRpb25zOiBFeHBhbmRUeXBlRnJvbVNvdXJjZVRleHRPcHRpb25zLFxuKTogUHJvbWlzZTxzdHJpbmc+O1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4cGFuZE15VHlwZShcbiAgb3B0aW9uczogRXhwYW5kVHlwZUZyb21Tb3VyY2VGaWxlT3B0aW9ucyxcbik6IFByb21pc2U8c3RyaW5nPjtcblxuLyoqXG4gKiBFeHBhbmRzIGEgVHlwZVNjcmlwdCB0eXBlIGV4cHJlc3Npb24uXG4gKlxuICogQHBhcmFtIG9wdGlvbnNcbiAqIEByZXR1cm5zIFRoZSBleHBhbmRlZCB0eXBlIGV4cHJlc3Npb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleHBhbmRNeVR5cGUob3B0aW9uczogRXhwYW5kTXlUeXBlT3B0aW9ucykge1xuICBpZiAob3B0aW9ucy50eXBlRXhwcmVzc2lvbi50cmltKCkgPT09IFwiXCIpIHtcbiAgICByZXR1cm4gXCJuZXZlclwiO1xuICB9XG5cbiAgaWYgKFwic291cmNlVGV4dFwiIGluIG9wdGlvbnMpIHtcbiAgICBjb25zdCBkdW1teUZpbGVOYW1lID0gXCJleHBhbmQtbXktdHlwZS1kdW1teS50c1wiO1xuXG4gICAgcmV0dXJuIGV4cGFuZE15VHlwZSh7XG4gICAgICBzb3VyY2VGaWxlTmFtZTogZHVtbXlGaWxlTmFtZSxcbiAgICAgIHR5cGVFeHByZXNzaW9uOiBvcHRpb25zLnR5cGVFeHByZXNzaW9uLFxuICAgICAgY29tcGlsZXJIb3N0RnVuY3Rpb25PdmVycmlkZXM6IHtcbiAgICAgICAgcmVhZEZpbGUoZmlsZU5hbWU6IHN0cmluZykge1xuICAgICAgICAgIGlmIChwYXRoLmJhc2VuYW1lKGZpbGVOYW1lKSA9PT0gZHVtbXlGaWxlTmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuc291cmNlVGV4dDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdHMuc3lzLnJlYWRGaWxlKGZpbGVOYW1lKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB0c0NvbXBpbGVyT3B0aW9uczogb3B0aW9ucy50c0NvbXBpbGVyT3B0aW9ucyxcbiAgICAgIHByZXR0aWZ5OiBvcHRpb25zLnByZXR0aWZ5LFxuICAgIH0pO1xuICB9XG5cbiAgY29uc3QgcmVzb2x2ZWRTb3VyY2VGaWxlTmFtZSA9IHBhdGgucmVzb2x2ZShvcHRpb25zLnNvdXJjZUZpbGVOYW1lKTtcblxuICBjb25zdCB0c0NvbXBpbGVyT3B0aW9ucyA9IG9wdGlvbnMudHNDb21waWxlck9wdGlvbnMgPz8ge1xuICAgIG5vRW1pdDogdHJ1ZSxcblxuICAgIHN0cmljdE51bGxDaGVja3M6IHRydWUsXG4gICAgYWxsb3dTeW50aGV0aWNEZWZhdWx0SW1wb3J0czogdHJ1ZSxcbiAgICBhbGxvd0FyYml0cmFyeUV4dGVuc2lvbnM6IHRydWUsXG4gICAgYWxsb3dJbXBvcnRpbmdUc0V4dGVuc2lvbnM6IHRydWUsXG4gICAgYWxsb3dKczogdHJ1ZSxcbiAgfTtcblxuICBpZiAoIXRzQ29tcGlsZXJPcHRpb25zLnN0cmljdE51bGxDaGVja3MpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJzdHJpY3ROdWxsQ2hlY2tzIG11c3QgYmUgZW5hYmxlZCFcIik7XG4gIH1cblxuICBjb25zdCBjb21waWxlckhvc3QgPSBjcmVhdGVBdWdtZW50ZXJDb21waWxlckhvc3QoXG4gICAgcmVzb2x2ZWRTb3VyY2VGaWxlTmFtZSxcbiAgICBjcmVhdGVFeHBhbmRDb2RlQmxvY2sob3B0aW9ucy50eXBlRXhwcmVzc2lvbiksXG4gICAgdHNDb21waWxlck9wdGlvbnMsXG4gICAgb3B0aW9ucy5jb21waWxlckhvc3RGdW5jdGlvbk92ZXJyaWRlcyxcbiAgKTtcblxuICBjb25zdCBwcm9ncmFtID0gdHMuY3JlYXRlUHJvZ3JhbShcbiAgICBbcmVzb2x2ZWRTb3VyY2VGaWxlTmFtZV0sXG4gICAgdHNDb21waWxlck9wdGlvbnMsXG4gICAgY29tcGlsZXJIb3N0LFxuICApO1xuXG4gIGNvbnN0IHNvdXJjZUZpbGUgPSBwcm9ncmFtLmdldFNvdXJjZUZpbGUocmVzb2x2ZWRTb3VyY2VGaWxlTmFtZSk7XG4gIGlmICghc291cmNlRmlsZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlNvdXJjZSBmaWxlIG5vdCBmb3VuZCFcIik7XG4gIH1cblxuICBjb25zdCByZXN1bHRJZGVudGlmaWVyTm9kZSA9IGZpbmRSZXN1bHRJZGVudGlmaWVyTm9kZShzb3VyY2VGaWxlKTtcbiAgaWYgKCFyZXN1bHRJZGVudGlmaWVyTm9kZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIk5vIG5vZGUgZm91bmQhXCIpO1xuICB9XG5cbiAgY29uc3QgdHlwZUNoZWNrZXIgPSBwcm9ncmFtLmdldFR5cGVDaGVja2VyKCk7XG4gIGNvbnN0IGV4cGFuZGVkVHlwZVN0cmluZyA9IHR5cGVDaGVja2VyLnR5cGVUb1N0cmluZyhcbiAgICB0eXBlQ2hlY2tlci5nZXRUeXBlQXRMb2NhdGlvbihyZXN1bHRJZGVudGlmaWVyTm9kZSksXG4gICAgdW5kZWZpbmVkLFxuICAgIHRzLlR5cGVGb3JtYXRGbGFncy5Ob2RlQnVpbGRlckZsYWdzTWFzayxcbiAgKTtcblxuICBpZiAob3B0aW9ucy5wcmV0dGlmeSAmJiBvcHRpb25zLnByZXR0aWZ5LmVuYWJsZWQgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIGV4cGFuZGVkVHlwZVN0cmluZztcbiAgfVxuXG4gIHJldHVybiBmb3JtYXRUeXBlRXhwcmVzc2lvbihleHBhbmRlZFR5cGVTdHJpbmcsIG9wdGlvbnMucHJldHRpZnk/Lm9wdGlvbnMpO1xufVxuIiwgImltcG9ydCB0cyBmcm9tIFwidHlwZXNjcmlwdFwiO1xuXG50eXBlIEV4dHJhY3RGdW5jdGlvbnM8VCwgSyBleHRlbmRzIGtleW9mIFQgPSBrZXlvZiBUPiA9IHtcbiAgW1AgaW4gS106IFRbUF0gZXh0ZW5kcyAoLi4uYXJnczogYW55W10pID0+IGFueSA/IFRbUF0gOiBuZXZlcjtcbn07XG5leHBvcnQgdHlwZSBDb21waWxlckhvc3RGdW5jdGlvbk92ZXJyaWRlcyA9IFBhcnRpYWw8XG4gIEV4dHJhY3RGdW5jdGlvbnM8dHMuQ29tcGlsZXJIb3N0PlxuPjtcblxuLyoqXG4gKiBDcmVhdGVzIGEgY3VzdG9tIGNvbXBpbGVyIGhvc3QgdGhhdCBhdWdtZW50cyB0aGUgc3BlY2lmaWVkIHNvdXJjZSBmaWxlIGZvciBleHBhbmRpbmcgYSB0eXBlIGV4cHJlc3Npb24uXG4gKlxuICogQHBhcmFtIHNvdXJjZUZpbGVOYW1lIE5hbWUgb2YgdGhlIHNvdXJjZSBmaWxlIHRvIGF1Z21lbnQuXG4gKiBAcGFyYW0gY29kZVRvQWRkIFR5cGUgZXhwcmVzc2lvbi5cbiAqIEBwYXJhbSBjb21waWxlck9wdGlvbnMgVHlwZVNjcmlwdCBjb21waWxlciBvcHRpb25zLlxuICogQHBhcmFtIGNvbXBpbGVySG9zdEZ1bmN0aW9uT3ZlcnJpZGVzIEEgcmVjb3JkIG9mIGZ1bmN0aW9ucyB0byBvdmVycmlkZSBpbiB0aGUgY29tcGlsZXIgaG9zdC4gVXNlZnVsIGZvciBtb2NraW5nLlxuICogQHJldHVybnMgQSBjdXN0b20gY29tcGlsZXIgaG9zdCB0aGF0IHJldHVybnMgYW4gYXVnbWVudGVkIHNvdXJjZSBmaWxlIHRoYXQgY2FuIGJlIHVzZWQgdG8gZXhwYW5kIHRoZSB0eXBlIGV4cHJlc3Npb24uXG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVBdWdtZW50ZXJDb21waWxlckhvc3QgPSAoXG4gIHNvdXJjZUZpbGVOYW1lOiBzdHJpbmcsXG4gIGNvZGVUb0FkZDogc3RyaW5nLFxuICBjb21waWxlck9wdGlvbnM/OiB0cy5Db21waWxlck9wdGlvbnMsXG4gIGNvbXBpbGVySG9zdEZ1bmN0aW9uT3ZlcnJpZGVzPzogQ29tcGlsZXJIb3N0RnVuY3Rpb25PdmVycmlkZXMsXG4pID0+IHtcbiAgY29uc3QgY3VzdG9tQ29tcGlsZXJIb3N0ID0gdHMuY3JlYXRlQ29tcGlsZXJIb3N0KGNvbXBpbGVyT3B0aW9ucyA/PyB7fSwgdHJ1ZSk7XG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGNvbXBpbGVySG9zdEZ1bmN0aW9uT3ZlcnJpZGVzID8/IHt9KSkge1xuICAgIGN1c3RvbUNvbXBpbGVySG9zdFtrZXldID0gY29tcGlsZXJIb3N0RnVuY3Rpb25PdmVycmlkZXMhW2tleV07XG4gIH1cblxuICBjb25zdCBvcmlnaW5hbFJlYWRGaWxlID0gY3VzdG9tQ29tcGlsZXJIb3N0LnJlYWRGaWxlO1xuXG4gIGN1c3RvbUNvbXBpbGVySG9zdC5yZWFkRmlsZSA9IChmaWxlTmFtZSkgPT4ge1xuICAgIGNvbnN0IGNvbnRlbnRzID0gb3JpZ2luYWxSZWFkRmlsZShmaWxlTmFtZSk7XG5cbiAgICBpZiAoY29udGVudHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGNvbnRlbnRzO1xuICAgIH1cblxuICAgIGlmIChmaWxlTmFtZSAhPT0gc291cmNlRmlsZU5hbWUpIHtcbiAgICAgIHJldHVybiBjb250ZW50cztcbiAgICB9XG5cbiAgICByZXR1cm4gYCR7Y29kZVRvQWRkfVxcbiR7Y29udGVudHN9YDtcbiAgfTtcblxuICByZXR1cm4gY3VzdG9tQ29tcGlsZXJIb3N0O1xufTtcbiIsICJpbXBvcnQgdHlwZSB7IE9wdGlvbnMgYXMgUHJldHRpZXJPcHRpb25zIH0gZnJvbSBcInByZXR0aWVyXCI7XG5pbXBvcnQgeyBmb3JtYXQgfSBmcm9tIFwicHJldHRpZXJcIjtcblxuY29uc3QgaWRlbnRpZmllclByZWZpeCA9IFwiX19FWFBBTkRfTVlfVFlQRV9fXCI7XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVFeHBhbmRDb2RlQmxvY2sgPSAodHlwZUV4cHJlc3Npb246IHN0cmluZykgPT4ge1xuICAvLyBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvYmxvYi9tYWluL3Rlc3RzL2Nhc2VzL2NvbXBpbGVyL2NvbXB1dGVkVHlwZXNLZXlvZk5vSW5kZXhTaWduYXR1cmVUeXBlLnRzXG4gIHJldHVybiBgdHlwZSAke2lkZW50aWZpZXJQcmVmaXh9UmVzdWx0ID0gJHtpZGVudGlmaWVyUHJlZml4fUV4cGFuZDwke2lkZW50aWZpZXJQcmVmaXh9RXhwcmVzc2lvbj47XG4gICAgdHlwZSAke2lkZW50aWZpZXJQcmVmaXh9RXhwcmVzc2lvbiA9ICR7dHlwZUV4cHJlc3Npb259O1xuXG4gICAgdHlwZSAke2lkZW50aWZpZXJQcmVmaXh9RXhwYW5kPFQ+ID0gXG4gICAgICAgIFQgZXh0ZW5kcyAoLi4uYXJnczogaW5mZXIgQSkgPT4gaW5mZXIgUiA/ICguLi5hcmdzOiAke2lkZW50aWZpZXJQcmVmaXh9RXhwYW5kPEE+KSA9PiAke2lkZW50aWZpZXJQcmVmaXh9RXhwYW5kPFI+XG4gICAgICA6IFQgZXh0ZW5kcyBQcm9taXNlPGluZmVyIFU+ID8gUHJvbWlzZTwke2lkZW50aWZpZXJQcmVmaXh9RXhwYW5kVHlwZUFyZ3VtZW50PFU+PlxuICAgICAgOiB7IFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgc3RyaW5nID8gJHtpZGVudGlmaWVyUHJlZml4fUV4cGFuZFN0cmluZzxUW0tdPiA6ICR7aWRlbnRpZmllclByZWZpeH1FeHBhbmQ8VFtLXT47IH0gJiB7fTtcblxuICAgIHR5cGUgJHtpZGVudGlmaWVyUHJlZml4fUV4cGFuZFR5cGVBcmd1bWVudDxUPiA9IFtUICYge31dIGV4dGVuZHMgW25ldmVyXSA/IFQgOiBUICYge30gZXh0ZW5kcyB2b2lkID8gVCA6ICR7aWRlbnRpZmllclByZWZpeH1FeHBhbmQ8VCAmIHt9PjtcblxuICAgIC8vIEZvcmNlcyBhIHVuaW9uIG9mIHN0cmluZyBsaXRlcmFsIHR5cGVzIHRvIGJlIGV4cGFuZGVkXG4gICAgdHlwZSAke2lkZW50aWZpZXJQcmVmaXh9RXhwYW5kU3RyaW5nPFQgZXh0ZW5kcyBzdHJpbmc+ID0gJHtpZGVudGlmaWVyUHJlZml4fVJlbW92ZVVuZGVyc2NvcmU8JHtpZGVudGlmaWVyUHJlZml4fUFwcGVuZFVuZGVyc2NvcmU8VD4+O1xuICAgIHR5cGUgJHtpZGVudGlmaWVyUHJlZml4fUFwcGVuZFVuZGVyc2NvcmU8VCBleHRlbmRzIHN0cmluZz4gPSBcXGBcXCR7VH1fXFxgIGV4dGVuZHMgc3RyaW5nID8gXFxgXFwke1R9X1xcYCA6IG5ldmVyO1xuICAgIHR5cGUgJHtpZGVudGlmaWVyUHJlZml4fVJlbW92ZVVuZGVyc2NvcmU8VCBleHRlbmRzIHN0cmluZz4gPSBUIGV4dGVuZHMgXFxgXFwke2luZmVyIFV9X1xcYCA/IFUgOiBuZXZlcjtgO1xufTtcblxuZXhwb3J0IGNvbnN0IGZvcm1hdFR5cGVFeHByZXNzaW9uID0gYXN5bmMgKFxuICBjb2RlOiBzdHJpbmcsXG4gIHByZXR0aWVyT3B0aW9ucz86IFByZXR0aWVyT3B0aW9ucyxcbikgPT4ge1xuICByZXR1cm4gKFxuICAgIGF3YWl0IGZvcm1hdChcbiAgICAgIGB0eXBlICR7aWRlbnRpZmllclByZWZpeH0gPSAke2NvZGV9YCxcbiAgICAgIHByZXR0aWVyT3B0aW9ucyA/PyB7XG4gICAgICAgIHBhcnNlcjogXCJ0eXBlc2NyaXB0XCIsXG4gICAgICAgIHNlbWk6IGZhbHNlLFxuICAgICAgfSxcbiAgICApXG4gIClcbiAgICAudHJpbSgpXG4gICAgLnN1YnN0cmluZyhgdHlwZSAke2lkZW50aWZpZXJQcmVmaXh9ID0gYC5sZW5ndGgpO1xufTtcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7O0FDQUEsd0JBQWU7QUFrQlIsSUFBTSw4QkFBOEIsQ0FDekMsZ0JBQ0EsV0FDQSxpQkFDQSxrQ0FDRztBQUNILFFBQU0scUJBQXFCLGtCQUFBQSxRQUFHLG1CQUFtQixtQkFBbUIsQ0FBQyxHQUFHLElBQUk7QUFDNUUsYUFBVyxPQUFPLE9BQU8sS0FBSyxpQ0FBaUMsQ0FBQyxDQUFDLEdBQUc7QUFDbEUsdUJBQW1CLEdBQUcsSUFBSSw4QkFBK0IsR0FBRztBQUFBLEVBQzlEO0FBRUEsUUFBTSxtQkFBbUIsbUJBQW1CO0FBRTVDLHFCQUFtQixXQUFXLENBQUMsYUFBYTtBQUMxQyxVQUFNLFdBQVcsaUJBQWlCLFFBQVE7QUFFMUMsUUFBSSxhQUFhLFFBQVc7QUFDMUIsYUFBTztBQUFBLElBQ1Q7QUFFQSxRQUFJLGFBQWEsZ0JBQWdCO0FBQy9CLGFBQU87QUFBQSxJQUNUO0FBRUEsV0FBTyxHQUFHLFNBQVM7QUFBQSxFQUFLLFFBQVE7QUFBQSxFQUNsQztBQUVBLFNBQU87QUFDVDs7O0FDN0NBLHNCQUF1QjtBQUV2QixJQUFNLG1CQUFtQjtBQUVsQixJQUFNLHdCQUF3QixDQUFDLG1CQUEyQjtBQUUvRCxTQUFPLFFBQVEsZ0JBQWdCLFlBQVksZ0JBQWdCLFVBQVUsZ0JBQWdCO0FBQUEsV0FDNUUsZ0JBQWdCLGdCQUFnQixjQUFjO0FBQUE7QUFBQSxXQUU5QyxnQkFBZ0I7QUFB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
223
+
224
+ //# debugId=914AF96172681B5164756E2164756E21
225
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2luZGV4LnRzIiwgInNyYy9hdWdtZW50ZXItY29tcGlsZXItaG9zdC50cyIsICJzcmMvY29kZS1nZW5lcmF0b3IudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHR5cGUgeyBDb25maWd1cmF0aW9uIGFzIEJpb21lQ29uZmlndXJhdGlvbiB9IGZyb20gXCJAYmlvbWVqcy93YXNtLW5vZGVqc1wiO1xuaW1wb3J0IHRzIGZyb20gXCJ0eXBlc2NyaXB0XCI7XG5pbXBvcnQge1xuICB0eXBlIENvbXBpbGVySG9zdEZ1bmN0aW9uT3ZlcnJpZGVzLFxuICBjcmVhdGVBdWdtZW50ZXJDb21waWxlckhvc3QsXG59IGZyb20gXCIuL2F1Z21lbnRlci1jb21waWxlci1ob3N0LmpzXCI7XG5pbXBvcnQge1xuICBjcmVhdGVFeHBhbmRDb2RlQmxvY2ssXG4gIGZvcm1hdFR5cGVFeHByZXNzaW9uLFxufSBmcm9tIFwiLi9jb2RlLWdlbmVyYXRvci5qc1wiO1xuXG4vKipcbiAqIEZpbmRzIHRoZSByZXN1bHQgdHlwZSBpZGVudGlmaWVyIG5vZGUuXG4gKlxuICogQHBhcmFtIG5vZGUgTm9kZSBpbiB3aGljaCB0eXBlIHR5cGUgc2hvdWxkIGJlIHNlYXJjaGVkLlxuICogQHJldHVybnMgVGhlIHJlc3VsdCB0eXBlIGlkZW50aWZpZXIgbm9kZS5cbiAqL1xuY29uc3QgZmluZFJlc3VsdElkZW50aWZpZXJOb2RlID0gKG5vZGU6IHRzLk5vZGUpOiB0cy5Ob2RlIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKG5vZGUuZ2V0Q2hpbGRDb3VudCgpID09PSAwKSB7XG4gICAgaWYgKCF0cy5pc0lkZW50aWZpZXIobm9kZSkpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gU2luY2Ugd2UgcHV0IHRoZSBfXzxJREVOVElGSUVSPl9fIHR5cGUgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGVcbiAgICAvLyBmaWxlLCB3ZSBjYW4gcmV0dXJuIHRoZSBmaXJzdCBpZGVudGlmaWVyIHdlIGZpbmQuXG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cblxuICByZXR1cm4gdHMuZm9yRWFjaENoaWxkKG5vZGUsIGZpbmRSZXN1bHRJZGVudGlmaWVyTm9kZSk7XG59O1xuXG5leHBvcnQgdHlwZSBFeHBhbmRUeXBlT3B0aW9uc0Jhc2UgPSB7XG4gIC8qKlxuICAgKiBUaGUgdHlwZSBleHByZXNzaW9uIHRvIGV4cGFuZC5cbiAgICogQGV4YW1wbGUgXCJSZXR1cm5UeXBlPHR5cGVvZiBteUZ1bmN0aW9uPlwiXG4gICAqL1xuICB0eXBlRXhwcmVzc2lvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUeXBlU2NyaXB0IGNvbXBpbGVyIG9wdGlvbnMuXG4gICAqL1xuICB0c0NvbXBpbGVyT3B0aW9ucz86IHRzLkNvbXBpbGVyT3B0aW9ucztcblxuICAvKipcbiAgICogUHJldHRpZnkgb3B0aW9ucy5cbiAgICovXG4gIHByZXR0aWZ5Pzoge1xuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdG8gcHJldHRpZnkgdGhlIG91dHB1dC5cbiAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICovXG4gICAgZW5hYmxlZD86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQmlvbWUgZm9ybWF0dGluZyBjb25maWd1cmF0aW9uLlxuICAgICAqL1xuICAgIGJpb21lT3B0aW9ucz86IEJpb21lQ29uZmlndXJhdGlvbjtcbiAgfTtcblxuICAvKipcbiAgICogQSByZWNvcmQgb2YgZnVuY3Rpb25zIHRvIG92ZXJyaWRlIGluIHRoZSBjb21waWxlciBob3N0LiBVc2VmdWwgZm9yIG1vY2tpbmdcbiAgICovXG4gIGNvbXBpbGVySG9zdEZ1bmN0aW9uT3ZlcnJpZGVzPzogQ29tcGlsZXJIb3N0RnVuY3Rpb25PdmVycmlkZXM7XG59O1xuZXhwb3J0IHR5cGUgRXhwYW5kVHlwZUZyb21Tb3VyY2VGaWxlT3B0aW9ucyA9IEV4cGFuZFR5cGVPcHRpb25zQmFzZSAmIHtcbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHNvdXJjZSBmaWxlIHRvIGV2YWx1YXRlIHRoZSB0eXBlIGV4cHJlc3Npb24gaW4uXG4gICAqL1xuICBzb3VyY2VGaWxlTmFtZTogc3RyaW5nO1xufTtcbmV4cG9ydCB0eXBlIEV4cGFuZFR5cGVGcm9tU291cmNlVGV4dE9wdGlvbnMgPSBFeHBhbmRUeXBlT3B0aW9uc0Jhc2UgJiB7XG4gIC8qKlxuICAgKiBUeXBlU2NyaXB0IHNvdXJjZSB0ZXh0IHRvIGV2YWx1YXRlIHRoZSB0eXBlIGV4cHJlc3Npb24gaW4uXG4gICAqL1xuICBzb3VyY2VUZXh0OiBzdHJpbmc7XG59O1xuZXhwb3J0IHR5cGUgRXhwYW5kTXlUeXBlT3B0aW9ucyA9XG4gIHwgRXhwYW5kVHlwZUZyb21Tb3VyY2VGaWxlT3B0aW9uc1xuICB8IEV4cGFuZFR5cGVGcm9tU291cmNlVGV4dE9wdGlvbnM7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleHBhbmRNeVR5cGUoXG4gIG9wdGlvbnM6IEV4cGFuZFR5cGVGcm9tU291cmNlVGV4dE9wdGlvbnMsXG4pOiBQcm9taXNlPHN0cmluZz47XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhwYW5kTXlUeXBlKFxuICBvcHRpb25zOiBFeHBhbmRUeXBlRnJvbVNvdXJjZUZpbGVPcHRpb25zLFxuKTogUHJvbWlzZTxzdHJpbmc+O1xuXG4vKipcbiAqIEV4cGFuZHMgYSBUeXBlU2NyaXB0IHR5cGUgZXhwcmVzc2lvbi5cbiAqXG4gKiBAcGFyYW0gb3B0aW9uc1xuICogQHJldHVybnMgVGhlIGV4cGFuZGVkIHR5cGUgZXhwcmVzc2lvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4cGFuZE15VHlwZShvcHRpb25zOiBFeHBhbmRNeVR5cGVPcHRpb25zKSB7XG4gIGlmIChvcHRpb25zLnR5cGVFeHByZXNzaW9uLnRyaW0oKSA9PT0gXCJcIikge1xuICAgIHJldHVybiBcIm5ldmVyXCI7XG4gIH1cblxuICBpZiAoXCJzb3VyY2VUZXh0XCIgaW4gb3B0aW9ucykge1xuICAgIGNvbnN0IGR1bW15RmlsZU5hbWUgPSBcImV4cGFuZC1teS10eXBlLWR1bW15LnRzXCI7XG5cbiAgICByZXR1cm4gZXhwYW5kTXlUeXBlKHtcbiAgICAgIHNvdXJjZUZpbGVOYW1lOiBkdW1teUZpbGVOYW1lLFxuICAgICAgdHlwZUV4cHJlc3Npb246IG9wdGlvbnMudHlwZUV4cHJlc3Npb24sXG4gICAgICBjb21waWxlckhvc3RGdW5jdGlvbk92ZXJyaWRlczoge1xuICAgICAgICByZWFkRmlsZShmaWxlTmFtZTogc3RyaW5nKSB7XG4gICAgICAgICAgaWYgKHBhdGguYmFzZW5hbWUoZmlsZU5hbWUpID09PSBkdW1teUZpbGVOYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5zb3VyY2VUZXh0O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB0cy5zeXMucmVhZEZpbGUoZmlsZU5hbWUpO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHRzQ29tcGlsZXJPcHRpb25zOiBvcHRpb25zLnRzQ29tcGlsZXJPcHRpb25zLFxuICAgICAgcHJldHRpZnk6IG9wdGlvbnMucHJldHRpZnksXG4gICAgfSk7XG4gIH1cblxuICBjb25zdCByZXNvbHZlZFNvdXJjZUZpbGVOYW1lID0gcGF0aC5yZXNvbHZlKG9wdGlvbnMuc291cmNlRmlsZU5hbWUpO1xuXG4gIGNvbnN0IHRzQ29tcGlsZXJPcHRpb25zID0gb3B0aW9ucy50c0NvbXBpbGVyT3B0aW9ucyA/PyB7XG4gICAgbm9FbWl0OiB0cnVlLFxuXG4gICAgc3RyaWN0TnVsbENoZWNrczogdHJ1ZSxcbiAgICBhbGxvd1N5bnRoZXRpY0RlZmF1bHRJbXBvcnRzOiB0cnVlLFxuICAgIGFsbG93QXJiaXRyYXJ5RXh0ZW5zaW9uczogdHJ1ZSxcbiAgICBhbGxvd0ltcG9ydGluZ1RzRXh0ZW5zaW9uczogdHJ1ZSxcbiAgICBhbGxvd0pzOiB0cnVlLFxuICB9O1xuXG4gIGlmICghdHNDb21waWxlck9wdGlvbnMuc3RyaWN0TnVsbENoZWNrcykge1xuICAgIHRocm93IG5ldyBFcnJvcihcInN0cmljdE51bGxDaGVja3MgbXVzdCBiZSBlbmFibGVkIVwiKTtcbiAgfVxuXG4gIGNvbnN0IGNvbXBpbGVySG9zdCA9IGNyZWF0ZUF1Z21lbnRlckNvbXBpbGVySG9zdChcbiAgICByZXNvbHZlZFNvdXJjZUZpbGVOYW1lLFxuICAgIGNyZWF0ZUV4cGFuZENvZGVCbG9jayhvcHRpb25zLnR5cGVFeHByZXNzaW9uKSxcbiAgICB0c0NvbXBpbGVyT3B0aW9ucyxcbiAgICBvcHRpb25zLmNvbXBpbGVySG9zdEZ1bmN0aW9uT3ZlcnJpZGVzLFxuICApO1xuXG4gIGNvbnN0IHByb2dyYW0gPSB0cy5jcmVhdGVQcm9ncmFtKFxuICAgIFtyZXNvbHZlZFNvdXJjZUZpbGVOYW1lXSxcbiAgICB0c0NvbXBpbGVyT3B0aW9ucyxcbiAgICBjb21waWxlckhvc3QsXG4gICk7XG5cbiAgY29uc3Qgc291cmNlRmlsZSA9IHByb2dyYW0uZ2V0U291cmNlRmlsZShyZXNvbHZlZFNvdXJjZUZpbGVOYW1lKTtcbiAgaWYgKCFzb3VyY2VGaWxlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiU291cmNlIGZpbGUgbm90IGZvdW5kIVwiKTtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdElkZW50aWZpZXJOb2RlID0gZmluZFJlc3VsdElkZW50aWZpZXJOb2RlKHNvdXJjZUZpbGUpO1xuICBpZiAoIXJlc3VsdElkZW50aWZpZXJOb2RlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gbm9kZSBmb3VuZCFcIik7XG4gIH1cblxuICBjb25zdCB0eXBlQ2hlY2tlciA9IHByb2dyYW0uZ2V0VHlwZUNoZWNrZXIoKTtcbiAgY29uc3QgZXhwYW5kZWRUeXBlU3RyaW5nID0gdHlwZUNoZWNrZXIudHlwZVRvU3RyaW5nKFxuICAgIHR5cGVDaGVja2VyLmdldFR5cGVBdExvY2F0aW9uKHJlc3VsdElkZW50aWZpZXJOb2RlKSxcbiAgICB1bmRlZmluZWQsXG4gICAgdHMuVHlwZUZvcm1hdEZsYWdzLk5vZGVCdWlsZGVyRmxhZ3NNYXNrLFxuICApO1xuXG4gIGlmIChvcHRpb25zLnByZXR0aWZ5Py5lbmFibGVkID09PSBmYWxzZSkge1xuICAgIHJldHVybiBleHBhbmRlZFR5cGVTdHJpbmc7XG4gIH1cblxuICByZXR1cm4gZm9ybWF0VHlwZUV4cHJlc3Npb24oXG4gICAgZXhwYW5kZWRUeXBlU3RyaW5nLFxuICAgIG9wdGlvbnMucHJldHRpZnk/LmJpb21lT3B0aW9ucyxcbiAgKTtcbn1cbiIsCiAgICAiaW1wb3J0IHRzIGZyb20gXCJ0eXBlc2NyaXB0XCI7XG5cbnR5cGUgRXh0cmFjdEZ1bmN0aW9uczxULCBLIGV4dGVuZHMga2V5b2YgVCA9IGtleW9mIFQ+ID0ge1xuICBbUCBpbiBLXTogRXh0cmFjdDxUW1BdLCAoLi4uYXJnczogbmV2ZXJbXSkgPT4gdW5rbm93bj47XG59O1xuZXhwb3J0IHR5cGUgQ29tcGlsZXJIb3N0RnVuY3Rpb25PdmVycmlkZXMgPSBQYXJ0aWFsPFxuICBFeHRyYWN0RnVuY3Rpb25zPHRzLkNvbXBpbGVySG9zdD5cbj47XG5cbi8qKlxuICogQ3JlYXRlcyBhIGN1c3RvbSBjb21waWxlciBob3N0IHRoYXQgYXVnbWVudHMgdGhlIHNwZWNpZmllZCBzb3VyY2UgZmlsZSBmb3IgZXhwYW5kaW5nIGEgdHlwZSBleHByZXNzaW9uLlxuICpcbiAqIEBwYXJhbSBzb3VyY2VGaWxlTmFtZSBOYW1lIG9mIHRoZSBzb3VyY2UgZmlsZSB0byBhdWdtZW50LlxuICogQHBhcmFtIGNvZGVUb0FkZCBUeXBlIGV4cHJlc3Npb24uXG4gKiBAcGFyYW0gY29tcGlsZXJPcHRpb25zIFR5cGVTY3JpcHQgY29tcGlsZXIgb3B0aW9ucy5cbiAqIEBwYXJhbSBjb21waWxlckhvc3RGdW5jdGlvbk92ZXJyaWRlcyBBIHJlY29yZCBvZiBmdW5jdGlvbnMgdG8gb3ZlcnJpZGUgaW4gdGhlIGNvbXBpbGVyIGhvc3QuIFVzZWZ1bCBmb3IgbW9ja2luZy5cbiAqIEByZXR1cm5zIEEgY3VzdG9tIGNvbXBpbGVyIGhvc3QgdGhhdCByZXR1cm5zIGFuIGF1Z21lbnRlZCBzb3VyY2UgZmlsZSB0aGF0IGNhbiBiZSB1c2VkIHRvIGV4cGFuZCB0aGUgdHlwZSBleHByZXNzaW9uLlxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlQXVnbWVudGVyQ29tcGlsZXJIb3N0ID0gKFxuICBzb3VyY2VGaWxlTmFtZTogc3RyaW5nLFxuICBjb2RlVG9BZGQ6IHN0cmluZyxcbiAgY29tcGlsZXJPcHRpb25zPzogdHMuQ29tcGlsZXJPcHRpb25zLFxuICBjb21waWxlckhvc3RGdW5jdGlvbk92ZXJyaWRlcz86IENvbXBpbGVySG9zdEZ1bmN0aW9uT3ZlcnJpZGVzLFxuKSA9PiB7XG4gIGNvbnN0IGN1c3RvbUNvbXBpbGVySG9zdCA9IHRzLmNyZWF0ZUNvbXBpbGVySG9zdChjb21waWxlck9wdGlvbnMgPz8ge30sIHRydWUpO1xuICBjb25zdCBvdmVycmlkZXMgPSBjb21waWxlckhvc3RGdW5jdGlvbk92ZXJyaWRlcyA/PyB7fTtcblxuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhvdmVycmlkZXMpIGFzIEFycmF5PFxuICAgIGtleW9mIENvbXBpbGVySG9zdEZ1bmN0aW9uT3ZlcnJpZGVzXG4gID4pIHtcbiAgICBjb25zdCBvdmVycmlkZSA9IG92ZXJyaWRlc1trZXldO1xuXG4gICAgaWYgKG92ZXJyaWRlKSB7XG4gICAgICAoY3VzdG9tQ29tcGlsZXJIb3N0IGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0gPVxuICAgICAgICBvdmVycmlkZTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBvcmlnaW5hbFJlYWRGaWxlID0gY3VzdG9tQ29tcGlsZXJIb3N0LnJlYWRGaWxlO1xuXG4gIGN1c3RvbUNvbXBpbGVySG9zdC5yZWFkRmlsZSA9IChmaWxlTmFtZSkgPT4ge1xuICAgIGNvbnN0IGNvbnRlbnRzID0gb3JpZ2luYWxSZWFkRmlsZShmaWxlTmFtZSk7XG5cbiAgICBpZiAoY29udGVudHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGNvbnRlbnRzO1xuICAgIH1cblxuICAgIGlmIChmaWxlTmFtZSAhPT0gc291cmNlRmlsZU5hbWUpIHtcbiAgICAgIHJldHVybiBjb250ZW50cztcbiAgICB9XG5cbiAgICByZXR1cm4gYCR7Y29kZVRvQWRkfVxcbiR7Y29udGVudHN9YDtcbiAgfTtcblxuICByZXR1cm4gY3VzdG9tQ29tcGlsZXJIb3N0O1xufTtcbiIsCiAgICAiaW1wb3J0IHsgQmlvbWUgfSBmcm9tIFwiQGJpb21lanMvanMtYXBpL25vZGVqc1wiO1xuaW1wb3J0IHR5cGUgeyBDb25maWd1cmF0aW9uIGFzIEJpb21lQ29uZmlndXJhdGlvbiB9IGZyb20gXCJAYmlvbWVqcy93YXNtLW5vZGVqc1wiO1xuXG5jb25zdCBpZGVudGlmaWVyUHJlZml4ID0gXCJfX0VYUEFORF9NWV9UWVBFX19cIjtcbmNvbnN0IHZpcnR1YWxGb3JtYXRGaWxlTmFtZSA9IFwiZXhwYW5kLW15LXR5cGUudHNcIjtcbmNvbnN0IGJpb21lID0gbmV3IEJpb21lKCk7XG5jb25zdCB7IHByb2plY3RLZXkgfSA9IGJpb21lLm9wZW5Qcm9qZWN0KCk7XG5cbmNvbnN0IGRlZmF1bHRCaW9tZUNvbmZpZ3VyYXRpb246IEJpb21lQ29uZmlndXJhdGlvbiA9IHtcbiAgZm9ybWF0dGVyOiB7XG4gICAgZW5hYmxlZDogdHJ1ZSxcbiAgICBpbmRlbnRTdHlsZTogXCJzcGFjZVwiLFxuICB9LFxuICBqYXZhc2NyaXB0OiB7XG4gICAgZm9ybWF0dGVyOiB7XG4gICAgICBxdW90ZVN0eWxlOiBcImRvdWJsZVwiLFxuICAgICAgc2VtaWNvbG9uczogXCJhc05lZWRlZFwiLFxuICAgIH0sXG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlRXhwYW5kQ29kZUJsb2NrID0gKHR5cGVFeHByZXNzaW9uOiBzdHJpbmcpID0+IHtcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2Jsb2IvbWFpbi90ZXN0cy9jYXNlcy9jb21waWxlci9jb21wdXRlZFR5cGVzS2V5b2ZOb0luZGV4U2lnbmF0dXJlVHlwZS50c1xuICByZXR1cm4gYHR5cGUgJHtpZGVudGlmaWVyUHJlZml4fVJlc3VsdCA9ICR7aWRlbnRpZmllclByZWZpeH1FeHBhbmQ8JHtpZGVudGlmaWVyUHJlZml4fUV4cHJlc3Npb24+O1xuICAgIHR5cGUgJHtpZGVudGlmaWVyUHJlZml4fUV4cHJlc3Npb24gPSAke3R5cGVFeHByZXNzaW9ufTtcblxuICAgIHR5cGUgJHtpZGVudGlmaWVyUHJlZml4fUV4cGFuZDxUPiA9IFxuICAgICAgICBUIGV4dGVuZHMgKC4uLmFyZ3M6IGluZmVyIEEpID0+IGluZmVyIFIgPyAoLi4uYXJnczogJHtpZGVudGlmaWVyUHJlZml4fUV4cGFuZDxBPikgPT4gJHtpZGVudGlmaWVyUHJlZml4fUV4cGFuZDxSPlxuICAgICAgOiBUIGV4dGVuZHMgUHJvbWlzZTxpbmZlciBVPiA/IFByb21pc2U8JHtpZGVudGlmaWVyUHJlZml4fUV4cGFuZFR5cGVBcmd1bWVudDxVPj5cbiAgICAgIDogeyBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzIHN0cmluZyA/ICR7aWRlbnRpZmllclByZWZpeH1FeHBhbmRTdHJpbmc8VFtLXT4gOiAke2lkZW50aWZpZXJQcmVmaXh9RXhwYW5kPFRbS10+OyB9ICYge307XG5cbiAgICB0eXBlICR7aWRlbnRpZmllclByZWZpeH1FeHBhbmRUeXBlQXJndW1lbnQ8VD4gPSBbVCAmIHt9XSBleHRlbmRzIFtuZXZlcl0gPyBUIDogVCAmIHt9IGV4dGVuZHMgdm9pZCA/IFQgOiAke2lkZW50aWZpZXJQcmVmaXh9RXhwYW5kPFQgJiB7fT47XG5cbiAgICAvLyBGb3JjZXMgYSB1bmlvbiBvZiBzdHJpbmcgbGl0ZXJhbCB0eXBlcyB0byBiZSBleHBhbmRlZFxuICAgIHR5cGUgJHtpZGVudGlmaWVyUHJlZml4fUV4cGFuZFN0cmluZzxUIGV4dGVuZHMgc3RyaW5nPiA9ICR7aWRlbnRpZmllclByZWZpeH1SZW1vdmVVbmRlcnNjb3JlPCR7aWRlbnRpZmllclByZWZpeH1BcHBlbmRVbmRlcnNjb3JlPFQ+PjtcbiAgICB0eXBlICR7aWRlbnRpZmllclByZWZpeH1BcHBlbmRVbmRlcnNjb3JlPFQgZXh0ZW5kcyBzdHJpbmc+ID0gXFxgXFwke1R9X1xcYCBleHRlbmRzIHN0cmluZyA/IFxcYFxcJHtUfV9cXGAgOiBuZXZlcjtcbiAgICB0eXBlICR7aWRlbnRpZmllclByZWZpeH1SZW1vdmVVbmRlcnNjb3JlPFQgZXh0ZW5kcyBzdHJpbmc+ID0gVCBleHRlbmRzIFxcYFxcJHtpbmZlciBVfV9cXGAgPyBVIDogbmV2ZXI7YDtcbn07XG5cbmV4cG9ydCBjb25zdCBmb3JtYXRUeXBlRXhwcmVzc2lvbiA9IGFzeW5jIChcbiAgY29kZTogc3RyaW5nLFxuICBiaW9tZUNvbmZpZ3VyYXRpb24/OiBCaW9tZUNvbmZpZ3VyYXRpb24sXG4pID0+IHtcbiAgY29uc3QgaW5wdXQgPSBgdHlwZSAke2lkZW50aWZpZXJQcmVmaXh9ID0gJHtjb2RlfWA7XG4gIGNvbnN0IGphdmFzY3JpcHRGb3JtYXR0ZXIgPSB7XG4gICAgLi4uZGVmYXVsdEJpb21lQ29uZmlndXJhdGlvbi5qYXZhc2NyaXB0Py5mb3JtYXR0ZXIsXG4gICAgLi4uYmlvbWVDb25maWd1cmF0aW9uPy5qYXZhc2NyaXB0Py5mb3JtYXR0ZXIsXG4gIH07XG5cbiAgYmlvbWUuYXBwbHlDb25maWd1cmF0aW9uKHByb2plY3RLZXksIHtcbiAgICAuLi5kZWZhdWx0QmlvbWVDb25maWd1cmF0aW9uLFxuICAgIC4uLmJpb21lQ29uZmlndXJhdGlvbixcbiAgICBmb3JtYXR0ZXI6IHtcbiAgICAgIC4uLmRlZmF1bHRCaW9tZUNvbmZpZ3VyYXRpb24uZm9ybWF0dGVyLFxuICAgICAgLi4uYmlvbWVDb25maWd1cmF0aW9uPy5mb3JtYXR0ZXIsXG4gICAgfSxcbiAgICBqYXZhc2NyaXB0OiB7XG4gICAgICAuLi5kZWZhdWx0QmlvbWVDb25maWd1cmF0aW9uLmphdmFzY3JpcHQsXG4gICAgICAuLi5iaW9tZUNvbmZpZ3VyYXRpb24/LmphdmFzY3JpcHQsXG4gICAgICBmb3JtYXR0ZXI6IGphdmFzY3JpcHRGb3JtYXR0ZXIsXG4gICAgfSxcbiAgfSk7XG5cbiAgY29uc3QgcmVzdWx0ID0gYmlvbWUuZm9ybWF0Q29udGVudChwcm9qZWN0S2V5LCBpbnB1dCwge1xuICAgIGZpbGVQYXRoOiB2aXJ0dWFsRm9ybWF0RmlsZU5hbWUsXG4gIH0pO1xuXG4gIGlmIChyZXN1bHQuZGlhZ25vc3RpY3MubGVuZ3RoID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGJpb21lLnByaW50RGlhZ25vc3RpY3MocmVzdWx0LmRpYWdub3N0aWNzLCB7XG4gICAgICAgIGZpbGVQYXRoOiB2aXJ0dWFsRm9ybWF0RmlsZU5hbWUsXG4gICAgICAgIGZpbGVTb3VyY2U6IGlucHV0LFxuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQuY29udGVudC50cmltKCkuc3Vic3RyaW5nKGB0eXBlICR7aWRlbnRpZmllclByZWZpeH0gPSBgLmxlbmd0aCk7XG59O1xuIgogIF0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBaUIsSUFBakI7QUFFZSxJQUFmOzs7QUNGZSxJQUFmO0FBa0JPLElBQU0sOEJBQThCLENBQ3pDLGdCQUNBLFdBQ0EsaUJBQ0Esa0NBQ0c7QUFBQSxFQUNILE1BQU0scUJBQXFCLDBCQUFHLG1CQUFtQixtQkFBbUIsQ0FBQyxHQUFHLElBQUk7QUFBQSxFQUM1RSxNQUFNLFlBQVksaUNBQWlDLENBQUM7QUFBQSxFQUVwRCxXQUFXLE9BQU8sT0FBTyxLQUFLLFNBQVMsR0FFcEM7QUFBQSxJQUNELE1BQU0sV0FBVyxVQUFVO0FBQUEsSUFFM0IsSUFBSSxVQUFVO0FB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LGdCQUFnQixRQUFRO0FBQUEsTUFDeEIsK0JBQStCO0FBQUEsUUFDN0IsUUFBUSxDQUFDLFVBQWtCO0FBQUEsVUFDekIsSUFBSSx5QkFBSyxTQUFTLFFBQVEsTUFBTSxlQUFlO0FBQUEsWUFDN0MsT0FBTyxRQUFRO0FBQUEsVUFDakI7QUFBQSxVQUVBLE9BQU8sMkJBQUcsSUFBSSxTQUFTLFFBQVE7QUFBQTtBQUFBLE1BRW5DO0FBQUEsTUFDQSxtQkFBbUIsUUFBUTtBQUFBLE1BQzNCLFVBQVUsUUFBUTtBQUFBLElBQ3BCLENBQUM7QUFBQSxFQUNIO0FBQUEsRUFFQSxNQUFNLHlCQUF5Qix5QkFBSyxRQUFRLFFBQVEsY0FBYztBQUFBLEVBRWxFLE1BQU0sb0JBQW9CLFFBQVEscUJBQXFCO0FBQUEsSUFDckQsUUFBUTtBQUFBLElBRVIsa0JBQWtCO0FBQUEsSUFDbEIsOEJBQThCO0FBQUEsSUFDOUIsMEJBQTBCO0FBQUEsSUFDMUIsNEJBQTRCO0FBQUEsSUFDNUIsU0FBUztBQUFBLEVBQ1g7QUFBQSxFQUVBLElBQUksQ0FBQyxrQkFBa0Isa0JBQWtCO0FBQUEsSUFDdkMsTUFBTSxJQUFJLE1BQU0sbUNBQW1DO0FBQUEsRUFDckQ7QUFBQSxFQUVBLE1BQU0sZUFBZSw0QkFDbkIsd0JBQ0Esc0JBQXNCLFFBQVEsY0FBYyxHQUM1QyxtQkFDQSxRQUFRLDZCQUNWO0FBQUEsRUFFQSxNQUFNLFVBQVUsMkJBQUcsY0FDakIsQ0FBQyxzQkFBc0IsR0FDdkIsbUJBQ0EsWUFDRjtBQUFBLEVBRUEsTUFBTSxhQUFhLFFBQVEsY0FBYyxzQkFBc0I7QUFBQSxFQUMvRCxJQUFJLENBQUMsWUFBWTtBQUFBLElBQ2YsTUFBTSxJQUFJLE1BQU0sd0JBQXdCO0FBQUEsRUFDMUM7QUFBQSxFQUVBLE1BQU0sdUJBQXVCLHlCQUF5QixVQUFVO0FBQUEsRUFDaEUsSUFBSSxDQUFDLHNCQUFzQjtBQUFBLElBQ3pCLE1BQU0sSUFBSSxNQUFNLGdCQUFnQjtBQUFBLEVBQ2xDO0FBQUEsRUFFQSxNQUFNLGNBQWMsUUFBUSxlQUFlO0FBQUEsRUFDM0MsTUFBTSxxQkFBcUIsWUFBWSxhQUNyQyxZQUFZLGtCQUFrQixvQkFBb0IsR0FDbEQsV0FDQSwyQkFBRyxnQkFBZ0Isb0JBQ3JCO0FBQUEsRUFFQSxJQUFJLFFBQVEsVUFBVSxZQUFZLE9BQU87QUFBQSxJQUN2QyxPQUFPO0FBQUEsRUFDVDtBQUFBLEVBRUEsT0FBTyxxQkFDTCxvQkFDQSxRQUFRLFVBQVUsWUFDcEI7QUFBQTsiLAogICJkZWJ1Z0lkIjogIjkxNEFGOTYxNzI2ODFCNTE2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9
package/dist/index.d.ts CHANGED
@@ -1,12 +1,7 @@
1
- import ts from 'typescript';
2
- import { Options } from 'prettier';
3
-
4
- type ExtractFunctions<T, K extends keyof T = keyof T> = {
5
- [P in K]: T[P] extends (...args: any[]) => any ? T[P] : never;
6
- };
7
- type CompilerHostFunctionOverrides = Partial<ExtractFunctions<ts.CompilerHost>>;
8
-
9
- type ExpandTypeOptionsBase = {
1
+ import type { Configuration as BiomeConfiguration } from "@biomejs/wasm-nodejs";
2
+ import ts from "typescript";
3
+ import { type CompilerHostFunctionOverrides } from "./augmenter-compiler-host.js";
4
+ export type ExpandTypeOptionsBase = {
10
5
  /**
11
6
  * The type expression to expand.
12
7
  * @example "ReturnType<typeof myFunction>"
@@ -17,7 +12,7 @@ type ExpandTypeOptionsBase = {
17
12
  */
18
13
  tsCompilerOptions?: ts.CompilerOptions;
19
14
  /**
20
- * Prettier options.
15
+ * Prettify options.
21
16
  */
22
17
  prettify?: {
23
18
  /**
@@ -26,30 +21,27 @@ type ExpandTypeOptionsBase = {
26
21
  */
27
22
  enabled?: boolean;
28
23
  /**
29
- * Prettier options. Don't forget to set the parser to "typescript".
30
- * @default { parser: "typescript", semi: false }
24
+ * Biome formatting configuration.
31
25
  */
32
- options?: Options;
26
+ biomeOptions?: BiomeConfiguration;
33
27
  };
34
28
  /**
35
29
  * A record of functions to override in the compiler host. Useful for mocking
36
30
  */
37
31
  compilerHostFunctionOverrides?: CompilerHostFunctionOverrides;
38
32
  };
39
- type ExpandTypeFromSourceFileOptions = ExpandTypeOptionsBase & {
33
+ export type ExpandTypeFromSourceFileOptions = ExpandTypeOptionsBase & {
40
34
  /**
41
35
  * Name of the source file to evaluate the type expression in.
42
36
  */
43
37
  sourceFileName: string;
44
38
  };
45
- type ExpandTypeFromSourceTextOptions = ExpandTypeOptionsBase & {
39
+ export type ExpandTypeFromSourceTextOptions = ExpandTypeOptionsBase & {
46
40
  /**
47
41
  * TypeScript source text to evaluate the type expression in.
48
42
  */
49
43
  sourceText: string;
50
44
  };
51
- type ExpandMyTypeOptions = ExpandTypeFromSourceFileOptions | ExpandTypeFromSourceTextOptions;
52
- declare function expandMyType(options: ExpandTypeFromSourceTextOptions): Promise<string>;
53
- declare function expandMyType(options: ExpandTypeFromSourceFileOptions): Promise<string>;
54
-
55
- export { type ExpandMyTypeOptions, type ExpandTypeFromSourceFileOptions, type ExpandTypeFromSourceTextOptions, type ExpandTypeOptionsBase, expandMyType };
45
+ export type ExpandMyTypeOptions = ExpandTypeFromSourceFileOptions | ExpandTypeFromSourceTextOptions;
46
+ export declare function expandMyType(options: ExpandTypeFromSourceTextOptions): Promise<string>;
47
+ export declare function expandMyType(options: ExpandTypeFromSourceFileOptions): Promise<string>;
package/dist/index.js CHANGED
@@ -1,14 +1,22 @@
1
+ // src/index.ts
2
+ import path from "node:path";
3
+ import ts2 from "typescript";
4
+
1
5
  // src/augmenter-compiler-host.ts
2
6
  import ts from "typescript";
3
7
  var createAugmenterCompilerHost = (sourceFileName, codeToAdd, compilerOptions, compilerHostFunctionOverrides) => {
4
8
  const customCompilerHost = ts.createCompilerHost(compilerOptions ?? {}, true);
5
- for (const key of Object.keys(compilerHostFunctionOverrides ?? {})) {
6
- customCompilerHost[key] = compilerHostFunctionOverrides[key];
9
+ const overrides = compilerHostFunctionOverrides ?? {};
10
+ for (const key of Object.keys(overrides)) {
11
+ const override = overrides[key];
12
+ if (override) {
13
+ customCompilerHost[key] = override;
14
+ }
7
15
  }
8
16
  const originalReadFile = customCompilerHost.readFile;
9
17
  customCompilerHost.readFile = (fileName) => {
10
18
  const contents = originalReadFile(fileName);
11
- if (contents === void 0) {
19
+ if (contents === undefined) {
12
20
  return contents;
13
21
  }
14
22
  if (fileName !== sourceFileName) {
@@ -21,8 +29,23 @@ ${contents}`;
21
29
  };
22
30
 
23
31
  // src/code-generator.ts
24
- import { format } from "prettier";
32
+ import { Biome } from "@biomejs/js-api/nodejs";
25
33
  var identifierPrefix = "__EXPAND_MY_TYPE__";
34
+ var virtualFormatFileName = "expand-my-type.ts";
35
+ var biome = new Biome;
36
+ var { projectKey } = biome.openProject();
37
+ var defaultBiomeConfiguration = {
38
+ formatter: {
39
+ enabled: true,
40
+ indentStyle: "space"
41
+ },
42
+ javascript: {
43
+ formatter: {
44
+ quoteStyle: "double",
45
+ semicolons: "asNeeded"
46
+ }
47
+ }
48
+ };
26
49
  var createExpandCodeBlock = (typeExpression) => {
27
50
  return `type ${identifierPrefix}Result = ${identifierPrefix}Expand<${identifierPrefix}Expression>;
28
51
  type ${identifierPrefix}Expression = ${typeExpression};
@@ -39,23 +62,42 @@ var createExpandCodeBlock = (typeExpression) => {
39
62
  type ${identifierPrefix}AppendUnderscore<T extends string> = \`\${T}_\` extends string ? \`\${T}_\` : never;
40
63
  type ${identifierPrefix}RemoveUnderscore<T extends string> = T extends \`\${infer U}_\` ? U : never;`;
41
64
  };
42
- var formatTypeExpression = async (code, prettierOptions) => {
43
- return (await format(
44
- `type ${identifierPrefix} = ${code}`,
45
- prettierOptions ?? {
46
- parser: "typescript",
47
- semi: false
65
+ var formatTypeExpression = async (code, biomeConfiguration) => {
66
+ const input = `type ${identifierPrefix} = ${code}`;
67
+ const javascriptFormatter = {
68
+ ...defaultBiomeConfiguration.javascript?.formatter,
69
+ ...biomeConfiguration?.javascript?.formatter
70
+ };
71
+ biome.applyConfiguration(projectKey, {
72
+ ...defaultBiomeConfiguration,
73
+ ...biomeConfiguration,
74
+ formatter: {
75
+ ...defaultBiomeConfiguration.formatter,
76
+ ...biomeConfiguration?.formatter
77
+ },
78
+ javascript: {
79
+ ...defaultBiomeConfiguration.javascript,
80
+ ...biomeConfiguration?.javascript,
81
+ formatter: javascriptFormatter
48
82
  }
49
- )).trim().substring(`type ${identifierPrefix} = `.length);
83
+ });
84
+ const result = biome.formatContent(projectKey, input, {
85
+ filePath: virtualFormatFileName
86
+ });
87
+ if (result.diagnostics.length > 0) {
88
+ throw new Error(biome.printDiagnostics(result.diagnostics, {
89
+ filePath: virtualFormatFileName,
90
+ fileSource: input
91
+ }));
92
+ }
93
+ return result.content.trim().substring(`type ${identifierPrefix} = `.length);
50
94
  };
51
95
 
52
96
  // src/index.ts
53
- import path from "path";
54
- import ts2 from "typescript";
55
97
  var findResultIdentifierNode = (node) => {
56
- if (node.getChildCount() == 0) {
98
+ if (node.getChildCount() === 0) {
57
99
  if (!ts2.isIdentifier(node)) {
58
- return void 0;
100
+ return;
59
101
  }
60
102
  return node;
61
103
  }
@@ -94,17 +136,8 @@ async function expandMyType(options) {
94
136
  if (!tsCompilerOptions.strictNullChecks) {
95
137
  throw new Error("strictNullChecks must be enabled!");
96
138
  }
97
- const compilerHost = createAugmenterCompilerHost(
98
- resolvedSourceFileName,
99
- createExpandCodeBlock(options.typeExpression),
100
- tsCompilerOptions,
101
- options.compilerHostFunctionOverrides
102
- );
103
- const program = ts2.createProgram(
104
- [resolvedSourceFileName],
105
- tsCompilerOptions,
106
- compilerHost
107
- );
139
+ const compilerHost = createAugmenterCompilerHost(resolvedSourceFileName, createExpandCodeBlock(options.typeExpression), tsCompilerOptions, options.compilerHostFunctionOverrides);
140
+ const program = ts2.createProgram([resolvedSourceFileName], tsCompilerOptions, compilerHost);
108
141
  const sourceFile = program.getSourceFile(resolvedSourceFileName);
109
142
  if (!sourceFile) {
110
143
  throw new Error("Source file not found!");
@@ -114,17 +147,15 @@ async function expandMyType(options) {
114
147
  throw new Error("No node found!");
115
148
  }
116
149
  const typeChecker = program.getTypeChecker();
117
- const expandedTypeString = typeChecker.typeToString(
118
- typeChecker.getTypeAtLocation(resultIdentifierNode),
119
- void 0,
120
- ts2.TypeFormatFlags.NodeBuilderFlagsMask
121
- );
122
- if (options.prettify && options.prettify.enabled === false) {
150
+ const expandedTypeString = typeChecker.typeToString(typeChecker.getTypeAtLocation(resultIdentifierNode), undefined, ts2.TypeFormatFlags.NodeBuilderFlagsMask);
151
+ if (options.prettify?.enabled === false) {
123
152
  return expandedTypeString;
124
153
  }
125
- return formatTypeExpression(expandedTypeString, options.prettify?.options);
154
+ return formatTypeExpression(expandedTypeString, options.prettify?.biomeOptions);
126
155
  }
127
156
  export {
128
157
  expandMyType
129
158
  };
130
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2F1Z21lbnRlci1jb21waWxlci1ob3N0LnRzIiwgIi4uL3NyYy9jb2RlLWdlbmVyYXRvci50cyIsICIuLi9zcmMvaW5kZXgudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB0cyBmcm9tIFwidHlwZXNjcmlwdFwiO1xuXG50eXBlIEV4dHJhY3RGdW5jdGlvbnM8VCwgSyBleHRlbmRzIGtleW9mIFQgPSBrZXlvZiBUPiA9IHtcbiAgW1AgaW4gS106IFRbUF0gZXh0ZW5kcyAoLi4uYXJnczogYW55W10pID0+IGFueSA/IFRbUF0gOiBuZXZlcjtcbn07XG5leHBvcnQgdHlwZSBDb21waWxlckhvc3RGdW5jdGlvbk92ZXJyaWRlcyA9IFBhcnRpYWw8XG4gIEV4dHJhY3RGdW5jdGlvbnM8dHMuQ29tcGlsZXJIb3N0PlxuPjtcblxuLyoqXG4gKiBDcmVhdGVzIGEgY3VzdG9tIGNvbXBpbGVyIGhvc3QgdGhhdCBhdWdtZW50cyB0aGUgc3BlY2lmaWVkIHNvdXJjZSBmaWxlIGZvciBleHBhbmRpbmcgYSB0eXBlIGV4cHJlc3Npb24uXG4gKlxuICogQHBhcmFtIHNvdXJjZUZpbGVOYW1lIE5hbWUgb2YgdGhlIHNvdXJjZSBmaWxlIHRvIGF1Z21lbnQuXG4gKiBAcGFyYW0gY29kZVRvQWRkIFR5cGUgZXhwcmVzc2lvbi5cbiAqIEBwYXJhbSBjb21waWxlck9wdGlvbnMgVHlwZVNjcmlwdCBjb21waWxlciBvcHRpb25zLlxuICogQHBhcmFtIGNvbXBpbGVySG9zdEZ1bmN0aW9uT3ZlcnJpZGVzIEEgcmVjb3JkIG9mIGZ1bmN0aW9ucyB0byBvdmVycmlkZSBpbiB0aGUgY29tcGlsZXIgaG9zdC4gVXNlZnVsIGZvciBtb2NraW5nLlxuICogQHJldHVybnMgQSBjdXN0b20gY29tcGlsZXIgaG9zdCB0aGF0IHJldHVybnMgYW4gYXVnbWVudGVkIHNvdXJjZSBmaWxlIHRoYXQgY2FuIGJlIHVzZWQgdG8gZXhwYW5kIHRoZSB0eXBlIGV4cHJlc3Npb24uXG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVBdWdtZW50ZXJDb21waWxlckhvc3QgPSAoXG4gIHNvdXJjZUZpbGVOYW1lOiBzdHJpbmcsXG4gIGNvZGVUb0FkZDogc3RyaW5nLFxuICBjb21waWxlck9wdGlvbnM/OiB0cy5Db21waWxlck9wdGlvbnMsXG4gIGNvbXBpbGVySG9zdEZ1bmN0aW9uT3ZlcnJpZGVzPzogQ29tcGlsZXJIb3N0RnVuY3Rpb25PdmVycmlkZXMsXG4pID0+IHtcbiAgY29uc3QgY3VzdG9tQ29tcGlsZXJIb3N0ID0gdHMuY3JlYXRlQ29tcGlsZXJIb3N0KGNvbXBpbGVyT3B0aW9ucyA/PyB7fSwgdHJ1ZSk7XG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGNvbXBpbGVySG9zdEZ1bmN0aW9uT3ZlcnJpZGVzID8/IHt9KSkge1xuICAgIGN1c3RvbUNvbXBpbGVySG9zdFtrZXldID0gY29tcGlsZXJIb3N0RnVuY3Rpb25PdmVycmlkZXMhW2tleV07XG4gIH1cblxuICBjb25zdCBvcmlnaW5hbFJlYWRGaWxlID0gY3VzdG9tQ29tcGlsZXJIb3N0LnJlYWRGaWxlO1xuXG4gIGN1c3RvbUNvbXBpbGVySG9zdC5yZWFkRmlsZSA9IChmaWxlTmFtZSkgPT4ge1xuICAgIGNvbnN0IGNvbnRlbnRzID0gb3JpZ2luYWxSZWFkRmlsZShmaWxlTmFtZSk7XG5cbiAgICBpZiAoY29udGVudHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGNvbnRlbnRzO1xuICAgIH1cblxuICAgIGlmIChmaWxlTmFtZSAhPT0gc291cmNlRmlsZU5hbWUpIHtcbiAgICAgIHJldHVybiBjb250ZW50cztcbiAgICB9XG5cbiAgICByZXR1cm4gYCR7Y29kZVRvQWRkfVxcbiR7Y29udGVudHN9YDtcbiAgfTtcblxuICByZXR1cm4gY3VzdG9tQ29tcGlsZXJIb3N0O1xufTtcbiIsICJpbXBvcnQgdHlwZSB7IE9wdGlvbnMgYXMgUHJldHRpZXJPcHRpb25zIH0gZnJvbSBcInByZXR0aWVyXCI7XG5pbXBvcnQgeyBmb3JtYXQgfSBmcm9tIFwicHJldHRpZXJcIjtcblxuY29uc3QgaWRlbnRpZmllclByZWZpeCA9IFwiX19FWFBBTkRfTVlfVFlQRV9fXCI7XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVFeHBhbmRDb2RlQmxvY2sgPSAodHlwZUV4cHJlc3Npb246IHN0cmluZykgPT4ge1xuICAvLyBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvYmxvYi9tYWluL3Rlc3RzL2Nhc2VzL2NvbXBpbGVyL2NvbXB1dGVkVHlwZXNLZXlvZk5vSW5kZXhTaWduYXR1cmVUeXBlLnRzXG4gIHJldHVybiBgdHlwZSAke2lkZW50aWZpZXJQcmVmaXh9UmVzdWx0ID0gJHtpZGVudGlmaWVyUHJlZml4fUV4cGFuZDwke2lkZW50aWZpZXJQcmVmaXh9RXhwcmVzc2lvbj47XG4gICAgdHlwZSAke2lkZW50aWZpZXJQcmVmaXh9RXhwcmVzc2lvbiA9ICR7dHlwZUV4cHJlc3Npb259O1xuXG4gICAgdHlwZSAke2lkZW50aWZpZXJQcmVmaXh9RXhwYW5kPFQ+ID0gXG4gICAgICAgIFQgZXh0ZW5kcyAoLi4uYXJnczogaW5mZXIgQSkgPT4gaW5mZXIgUiA/ICguLi5hcmdzOiAke2lkZW50aWZpZXJQcmVmaXh9RXhwYW5kPEE+KSA9PiAke2lkZW50aWZpZXJQcmVmaXh9RXhwYW5kPFI+XG4gICAgICA6IFQgZXh0ZW5kcyBQcm9taXNlPGluZmVyIFU+ID8gUHJvbWlzZTwke2lkZW50aWZpZXJQcmVmaXh9RXhwYW5kVHlwZUFyZ3VtZW50PFU+PlxuICAgICAgOiB7IFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgc3RyaW5nID8gJHtpZGVudGlmaWVyUHJlZml4fUV4cGFuZFN0cmluZzxUW0tdPiA6ICR7aWRlbnRpZmllclByZWZpeH1FeHBhbmQ8VFtLXT47IH0gJiB7fTtcblxuICAgIHR5cGUgJHtpZGVudGlmaWVyUHJlZml4fUV4cGFuZFR5cGVBcmd1bWVudDxUPiA9IFtUICYge31dIGV4dGVuZHMgW25ldmVyXSA/IFQgOiBUICYge30gZXh0ZW5kcyB2b2lkID8gVCA6ICR7aWRlbnRpZmllclByZWZpeH1FeHBhbmQ8VCAmIHt9PjtcblxuICAgIC8vIEZvcmNlcyBhIHVuaW9uIG9mIHN0cmluZyBsaXRlcmFsIHR5cGVzIHRvIGJlIGV4cGFuZGVkXG4gICAgdHlwZSAke2lkZW50aWZpZXJQcmVmaXh9RXhwYW5kU3RyaW5nPFQgZXh0ZW5kcyBzdHJpbmc+ID0gJHtpZGVudGlmaWVyUHJlZml4fVJlbW92ZVVuZGVyc2NvcmU8JHtpZGVudGlmaWVyUHJlZml4fUFwcGVuZFVuZGVyc2NvcmU8VD4+O1xuICAgIHR5cGUgJHtpZGVudGlmaWVyUHJlZml4fUFwcGVuZFVuZGVyc2NvcmU8VCBleHRlbmRzIHN0cmluZz4gPSBcXGBcXCR7VH1fXFxgIGV4dGVuZHMgc3RyaW5nID8gXFxgXFwke1R9X1xcYCA6IG5ldmVyO1xuICAgIHR5cGUgJHtpZGVudGlmaWVyUHJlZml4fVJlbW92ZVVuZGVyc2NvcmU8VCBleHRlbmRzIHN0cmluZz4gPSBUIGV4dGVuZHMgXFxgXFwke2luZmVyIFV9X1xcYCA/IFUgOiBuZXZlcjtgO1xufTtcblxuZXhwb3J0IGNvbnN0IGZvcm1hdFR5cGVFeHByZXNzaW9uID0gYXN5bmMgKFxuICBjb2RlOiBzdHJpbmcsXG4gIHByZXR0aWVyT3B0aW9ucz86IFByZXR0aWVyT3B0aW9ucyxcbikgPT4ge1xuICByZXR1cm4gKFxuICAgIGF3YWl0IGZvcm1hdChcbiAgICAgIGB0eXBlICR7aWRlbnRpZmllclByZWZpeH0gPSAke2NvZGV9YCxcbiAgICAgIHByZXR0aWVyT3B0aW9ucyA/PyB7XG4gICAgICAgIHBhcnNlcjogXCJ0eXBlc2NyaXB0XCIsXG4gICAgICAgIHNlbWk6IGZhbHNlLFxuICAgICAgfSxcbiAgICApXG4gIClcbiAgICAudHJpbSgpXG4gICAgLnN1YnN0cmluZyhgdHlwZSAke2lkZW50aWZpZXJQcmVmaXh9ID0gYC5sZW5ndGgpO1xufTtcbiIsICJpbXBvcnQgeyBjcmVhdGVBdWdtZW50ZXJDb21waWxlckhvc3QgfSBmcm9tIFwiLi9hdWdtZW50ZXItY29tcGlsZXItaG9zdC50c1wiO1xuaW1wb3J0IHsgdHlwZSBDb21waWxlckhvc3RGdW5jdGlvbk92ZXJyaWRlcyB9IGZyb20gXCIuL2F1Z21lbnRlci1jb21waWxlci1ob3N0LnRzXCI7XG5pbXBvcnQge1xuICBjcmVhdGVFeHBhbmRDb2RlQmxvY2ssXG4gIGZvcm1hdFR5cGVFeHByZXNzaW9uLFxufSBmcm9tIFwiLi9jb2RlLWdlbmVyYXRvci50c1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHR5cGUgeyBPcHRpb25zIGFzIFByZXR0aWVyT3B0aW9ucyB9IGZyb20gXCJwcmV0dGllclwiO1xuaW1wb3J0IHRzIGZyb20gXCJ0eXBlc2NyaXB0XCI7XG5cbi8qKlxuICogRmluZHMgdGhlIHJlc3VsdCB0eXBlIGlkZW50aWZpZXIgbm9kZS5cbiAqXG4gKiBAcGFyYW0gbm9kZSBOb2RlIGluIHdoaWNoIHR5cGUgdHlwZSBzaG91bGQgYmUgc2VhcmNoZWQuXG4gKiBAcmV0dXJucyBUaGUgcmVzdWx0IHR5cGUgaWRlbnRpZmllciBub2RlLlxuICovXG5jb25zdCBmaW5kUmVzdWx0SWRlbnRpZmllck5vZGUgPSAobm9kZTogdHMuTm9kZSk6IHRzLk5vZGUgfCB1bmRlZmluZWQgPT4ge1xuICBpZiAobm9kZS5nZXRDaGlsZENvdW50KCkgPT0gMCkge1xuICAgIGlmICghdHMuaXNJZGVudGlmaWVyKG5vZGUpKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8vIFNpbmNlIHdlIHB1dCB0aGUgX188SURFTlRJRklFUj5fXyB0eXBlIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlXG4gICAgLy8gZmlsZSwgd2UgY2FuIHJldHVybiB0aGUgZmlyc3QgaWRlbnRpZmllciB3ZSBmaW5kLlxuICAgIHJldHVybiBub2RlO1xuICB9XG5cbiAgcmV0dXJuIHRzLmZvckVhY2hDaGlsZChub2RlLCBmaW5kUmVzdWx0SWRlbnRpZmllck5vZGUpO1xufTtcblxuZXhwb3J0IHR5cGUgRXhwYW5kVHlwZU9wdGlvbnNCYXNlID0ge1xuICAvKipcbiAgICogVGhlIHR5cGUgZXhwcmVzc2lvbiB0byBleHBhbmQuXG4gICAqIEBleGFtcGxlIFwiUmV0dXJuVHlwZTx0eXBlb2YgbXlGdW5jdGlvbj5cIlxuICAgKi9cbiAgdHlwZUV4cHJlc3Npb246IHN0cmluZztcblxuICAvKipcbiAgICogVHlwZVNjcmlwdCBjb21waWxlciBvcHRpb25zLlxuICAgKi9cbiAgdHNDb21waWxlck9wdGlvbnM/OiB0cy5Db21waWxlck9wdGlvbnM7XG5cbiAgLyoqXG4gICAqIFByZXR0aWVyIG9wdGlvbnMuXG4gICAqL1xuICBwcmV0dGlmeT86IHtcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRvIHByZXR0aWZ5IHRoZSBvdXRwdXQuXG4gICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAqL1xuICAgIGVuYWJsZWQ/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFByZXR0aWVyIG9wdGlvbnMuIERvbid0IGZvcmdldCB0byBzZXQgdGhlIHBhcnNlciB0byBcInR5cGVzY3JpcHRcIi5cbiAgICAgKiBAZGVmYXVsdCB7IHBhcnNlcjogXCJ0eXBlc2NyaXB0XCIsIHNlbWk6IGZhbHNlIH1cbiAgICAgKi9cbiAgICBvcHRpb25zPzogUHJldHRpZXJPcHRpb25zO1xuICB9O1xuXG4gIC8qKlxuICAgKiBBIHJlY29yZCBvZiBmdW5jdGlvbnMgdG8gb3ZlcnJpZGUgaW4gdGhlIGNvbXBpbGVyIGhvc3QuIFVzZWZ1bCBmb3IgbW9ja2luZ1xuICAgKi9cbiAgY29tcGlsZXJIb3N0RnVuY3Rpb25PdmVycmlkZXM/OiBDb21waWxlckhvc3RGdW5jdGlvbk92ZXJyaWRlcztcbn07XG5leHBvcnQgdHlwZSBFeHBhbmRUeXBlRnJvbVNvdXJjZUZpbGVPcHRpb25zID0gRXhwYW5kVHlwZU9wdGlvbnNCYXNlICYge1xuICAvKipcbiAgICogTmFtZSBvZiB0aGUgc291cmNlIGZpbGUgdG8gZXZhbHVhdGUgdGhlIHR5cGUgZXhwcmVzc2lvbiBpbi5cbiAgICovXG4gIHNvdXJjZUZpbGVOYW1lOiBzdHJpbmc7XG59O1xuZXhwb3J0IHR5cGUgRXhwYW5kVHlwZUZyb21Tb3VyY2VUZXh0T3B0aW9ucyA9IEV4cGFuZFR5cGVPcHRpb25zQmFzZSAmIHtcbiAgLyoqXG4gICAqIFR5cGVTY3JpcHQgc291cmNlIHRleHQgdG8gZXZhbHVhdGUgdGhlIHR5cGUgZXhwcmVzc2lvbiBpbi5cbiAgICovXG4gIHNvdXJjZVRleHQ6IHN0cmluZztcbn07XG5leHBvcnQgdHlwZSBFeHBhbmRNeVR5cGVPcHRpb25zID1cbiAgfCBFeHBhbmRUeXBlRnJvbVNvdXJjZUZpbGVPcHRpb25zXG4gIHwgRXhwYW5kVHlwZUZyb21Tb3VyY2VUZXh0T3B0aW9ucztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4cGFuZE15VHlwZShcbiAgb3B0aW9uczogRXhwYW5kVHlwZUZyb21Tb3VyY2VUZXh0T3B0aW9ucyxcbik6IFByb21pc2U8c3RyaW5nPjtcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleHBhbmRNeVR5cGUoXG4gIG9wdGlvbnM6IEV4cGFuZFR5cGVGcm9tU291cmNlRmlsZU9wdGlvbnMsXG4pOiBQcm9taXNlPHN0cmluZz47XG5cbi8qKlxuICogRXhwYW5kcyBhIFR5cGVTY3JpcHQgdHlwZSBleHByZXNzaW9uLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zXG4gKiBAcmV0dXJucyBUaGUgZXhwYW5kZWQgdHlwZSBleHByZXNzaW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhwYW5kTXlUeXBlKG9wdGlvbnM6IEV4cGFuZE15VHlwZU9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMudHlwZUV4cHJlc3Npb24udHJpbSgpID09PSBcIlwiKSB7XG4gICAgcmV0dXJuIFwibmV2ZXJcIjtcbiAgfVxuXG4gIGlmIChcInNvdXJjZVRleHRcIiBpbiBvcHRpb25zKSB7XG4gICAgY29uc3QgZHVtbXlGaWxlTmFtZSA9IFwiZXhwYW5kLW15LXR5cGUtZHVtbXkudHNcIjtcblxuICAgIHJldHVybiBleHBhbmRNeVR5cGUoe1xuICAgICAgc291cmNlRmlsZU5hbWU6IGR1bW15RmlsZU5hbWUsXG4gICAgICB0eXBlRXhwcmVzc2lvbjogb3B0aW9ucy50eXBlRXhwcmVzc2lvbixcbiAgICAgIGNvbXBpbGVySG9zdEZ1bmN0aW9uT3ZlcnJpZGVzOiB7XG4gICAgICAgIHJlYWRGaWxlKGZpbGVOYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgICBpZiAocGF0aC5iYXNlbmFtZShmaWxlTmFtZSkgPT09IGR1bW15RmlsZU5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBvcHRpb25zLnNvdXJjZVRleHQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHRzLnN5cy5yZWFkRmlsZShmaWxlTmFtZSk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgdHNDb21waWxlck9wdGlvbnM6IG9wdGlvbnMudHNDb21waWxlck9wdGlvbnMsXG4gICAgICBwcmV0dGlmeTogb3B0aW9ucy5wcmV0dGlmeSxcbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0IHJlc29sdmVkU291cmNlRmlsZU5hbWUgPSBwYXRoLnJlc29sdmUob3B0aW9ucy5zb3VyY2VGaWxlTmFtZSk7XG5cbiAgY29uc3QgdHNDb21waWxlck9wdGlvbnMgPSBvcHRpb25zLnRzQ29tcGlsZXJPcHRpb25zID8/IHtcbiAgICBub0VtaXQ6IHRydWUsXG5cbiAgICBzdHJpY3ROdWxsQ2hlY2tzOiB0cnVlLFxuICAgIGFsbG93U3ludGhldGljRGVmYXVsdEltcG9ydHM6IHRydWUsXG4gICAgYWxsb3dBcmJpdHJhcnlFeHRlbnNpb25zOiB0cnVlLFxuICAgIGFsbG93SW1wb3J0aW5nVHNFeHRlbnNpb25zOiB0cnVlLFxuICAgIGFsbG93SnM6IHRydWUsXG4gIH07XG5cbiAgaWYgKCF0c0NvbXBpbGVyT3B0aW9ucy5zdHJpY3ROdWxsQ2hlY2tzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwic3RyaWN0TnVsbENoZWNrcyBtdXN0IGJlIGVuYWJsZWQhXCIpO1xuICB9XG5cbiAgY29uc3QgY29tcGlsZXJIb3N0ID0gY3JlYXRlQXVnbWVudGVyQ29tcGlsZXJIb3N0KFxuICAgIHJlc29sdmVkU291cmNlRmlsZU5hbWUsXG4gICAgY3JlYXRlRXhwYW5kQ29kZUJsb2NrKG9wdGlvbnMudHlwZUV4cHJlc3Npb24pLFxuICAgIHRzQ29tcGlsZXJPcHRpb25zLFxuICAgIG9wdGlvbnMuY29tcGlsZXJIb3N0RnVuY3Rpb25PdmVycmlkZXMsXG4gICk7XG5cbiAgY29uc3QgcHJvZ3JhbSA9IHRzLmNyZWF0ZVByb2dyYW0oXG4gICAgW3Jlc29sdmVkU291cmNlRmlsZU5hbWVdLFxuICAgIHRzQ29tcGlsZXJPcHRpb25zLFxuICAgIGNvbXBpbGVySG9zdCxcbiAgKTtcblxuICBjb25zdCBzb3VyY2VGaWxlID0gcHJvZ3JhbS5nZXRTb3VyY2VGaWxlKHJlc29sdmVkU291cmNlRmlsZU5hbWUpO1xuICBpZiAoIXNvdXJjZUZpbGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJTb3VyY2UgZmlsZSBub3QgZm91bmQhXCIpO1xuICB9XG5cbiAgY29uc3QgcmVzdWx0SWRlbnRpZmllck5vZGUgPSBmaW5kUmVzdWx0SWRlbnRpZmllck5vZGUoc291cmNlRmlsZSk7XG4gIGlmICghcmVzdWx0SWRlbnRpZmllck5vZGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBub2RlIGZvdW5kIVwiKTtcbiAgfVxuXG4gIGNvbnN0IHR5cGVDaGVja2VyID0gcHJvZ3JhbS5nZXRUeXBlQ2hlY2tlcigpO1xuICBjb25zdCBleHBhbmRlZFR5cGVTdHJpbmcgPSB0eXBlQ2hlY2tlci50eXBlVG9TdHJpbmcoXG4gICAgdHlwZUNoZWNrZXIuZ2V0VHlwZUF0TG9jYXRpb24ocmVzdWx0SWRlbnRpZmllck5vZGUpLFxuICAgIHVuZGVmaW5lZCxcbiAgICB0cy5UeXBlRm9ybWF0RmxhZ3MuTm9kZUJ1aWxkZXJGbGFnc01hc2ssXG4gICk7XG5cbiAgaWYgKG9wdGlvbnMucHJldHRpZnkgJiYgb3B0aW9ucy5wcmV0dGlmeS5lbmFibGVkID09PSBmYWxzZSkge1xuICAgIHJldHVybiBleHBhbmRlZFR5cGVTdHJpbmc7XG4gIH1cblxuICByZXR1cm4gZm9ybWF0VHlwZUV4cHJlc3Npb24oZXhwYW5kZWRUeXBlU3RyaW5nLCBvcHRpb25zLnByZXR0aWZ5Py5vcHRpb25zKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7QUFBQSxPQUFPLFFBQVE7QUFrQlIsSUFBTSw4QkFBOEIsQ0FDekMsZ0JBQ0EsV0FDQSxpQkFDQSxrQ0FDRztBQUNILFFBQU0scUJBQXFCLEdBQUcsbUJBQW1CLG1CQUFtQixDQUFDLEdBQUcsSUFBSTtBQUM1RSxhQUFXLE9BQU8sT0FBTyxLQUFLLGlDQUFpQyxDQUFDLENBQUMsR0FBRztBQUNsRSx1QkFBbUIsR0FBRyxJQUFJLDhCQUErQixHQUFHO0FBQUEsRUFDOUQ7QUFFQSxRQUFNLG1CQUFtQixtQkFBbUI7QUFFNUMscUJBQW1CLFdBQVcsQ0FBQyxhQUFhO0FBQzFDLFVBQU0sV0FBVyxpQkFBaUIsUUFBUTtBQUUxQyxRQUFJLGFBQWEsUUFBVztBQUMxQixhQUFPO0FBQUEsSUFDVDtBQUVBLFFBQUksYUFBYSxnQkFBZ0I7QUFDL0IsYUFBTztBQUFBLElBQ1Q7QUFFQSxXQUFPLEdBQUcsU0FBUztBQUFBLEVBQUssUUFBUTtBQUFBLEVBQ2xDO0FBRUEsU0FBTztBQUNUOzs7QUM3Q0EsU0FBUyxjQUFjO0FBRXZCLElBQU0sbUJBQW1CO0FBRWxCLElBQU0sd0JBQXdCLENBQUMsbUJBQTJCO0FBRS9ELFNBQU8sUUFBUSxnQkFBZ0IsWUFBWSxnQkFBZ0IsVUFBVSxnQkFBZ0I7QUFBQSxXQUM1RSxnQkFBZ0IsZ0JBQWdCLGNBQWM7QUFBQTtBQUFBLFdBRTlDLGdCQUFnQjtBQUFBLDhEQUNtQyxnQkFBZ0IsaUJBQWlCLGdCQUFnQjtBQUFBLCtDQUNoRSxnQkFBZ0I7QUFBQSxr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
159
+
160
+ //# debugId=A899C07794769D2464756E2164756E21
161
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIiwgIi4uL3NyYy9hdWdtZW50ZXItY29tcGlsZXItaG9zdC50cyIsICIuLi9zcmMvY29kZS1nZW5lcmF0b3IudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHR5cGUgeyBDb25maWd1cmF0aW9uIGFzIEJpb21lQ29uZmlndXJhdGlvbiB9IGZyb20gXCJAYmlvbWVqcy93YXNtLW5vZGVqc1wiO1xuaW1wb3J0IHRzIGZyb20gXCJ0eXBlc2NyaXB0XCI7XG5pbXBvcnQge1xuICB0eXBlIENvbXBpbGVySG9zdEZ1bmN0aW9uT3ZlcnJpZGVzLFxuICBjcmVhdGVBdWdtZW50ZXJDb21waWxlckhvc3QsXG59IGZyb20gXCIuL2F1Z21lbnRlci1jb21waWxlci1ob3N0LmpzXCI7XG5pbXBvcnQge1xuICBjcmVhdGVFeHBhbmRDb2RlQmxvY2ssXG4gIGZvcm1hdFR5cGVFeHByZXNzaW9uLFxufSBmcm9tIFwiLi9jb2RlLWdlbmVyYXRvci5qc1wiO1xuXG4vKipcbiAqIEZpbmRzIHRoZSByZXN1bHQgdHlwZSBpZGVudGlmaWVyIG5vZGUuXG4gKlxuICogQHBhcmFtIG5vZGUgTm9kZSBpbiB3aGljaCB0eXBlIHR5cGUgc2hvdWxkIGJlIHNlYXJjaGVkLlxuICogQHJldHVybnMgVGhlIHJlc3VsdCB0eXBlIGlkZW50aWZpZXIgbm9kZS5cbiAqL1xuY29uc3QgZmluZFJlc3VsdElkZW50aWZpZXJOb2RlID0gKG5vZGU6IHRzLk5vZGUpOiB0cy5Ob2RlIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKG5vZGUuZ2V0Q2hpbGRDb3VudCgpID09PSAwKSB7XG4gICAgaWYgKCF0cy5pc0lkZW50aWZpZXIobm9kZSkpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gU2luY2Ugd2UgcHV0IHRoZSBfXzxJREVOVElGSUVSPl9fIHR5cGUgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGVcbiAgICAvLyBmaWxlLCB3ZSBjYW4gcmV0dXJuIHRoZSBmaXJzdCBpZGVudGlmaWVyIHdlIGZpbmQuXG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cblxuICByZXR1cm4gdHMuZm9yRWFjaENoaWxkKG5vZGUsIGZpbmRSZXN1bHRJZGVudGlmaWVyTm9kZSk7XG59O1xuXG5leHBvcnQgdHlwZSBFeHBhbmRUeXBlT3B0aW9uc0Jhc2UgPSB7XG4gIC8qKlxuICAgKiBUaGUgdHlwZSBleHByZXNzaW9uIHRvIGV4cGFuZC5cbiAgICogQGV4YW1wbGUgXCJSZXR1cm5UeXBlPHR5cGVvZiBteUZ1bmN0aW9uPlwiXG4gICAqL1xuICB0eXBlRXhwcmVzc2lvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUeXBlU2NyaXB0IGNvbXBpbGVyIG9wdGlvbnMuXG4gICAqL1xuICB0c0NvbXBpbGVyT3B0aW9ucz86IHRzLkNvbXBpbGVyT3B0aW9ucztcblxuICAvKipcbiAgICogUHJldHRpZnkgb3B0aW9ucy5cbiAgICovXG4gIHByZXR0aWZ5Pzoge1xuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdG8gcHJldHRpZnkgdGhlIG91dHB1dC5cbiAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICovXG4gICAgZW5hYmxlZD86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQmlvbWUgZm9ybWF0dGluZyBjb25maWd1cmF0aW9uLlxuICAgICAqL1xuICAgIGJpb21lT3B0aW9ucz86IEJpb21lQ29uZmlndXJhdGlvbjtcbiAgfTtcblxuICAvKipcbiAgICogQSByZWNvcmQgb2YgZnVuY3Rpb25zIHRvIG92ZXJyaWRlIGluIHRoZSBjb21waWxlciBob3N0LiBVc2VmdWwgZm9yIG1vY2tpbmdcbiAgICovXG4gIGNvbXBpbGVySG9zdEZ1bmN0aW9uT3ZlcnJpZGVzPzogQ29tcGlsZXJIb3N0RnVuY3Rpb25PdmVycmlkZXM7XG59O1xuZXhwb3J0IHR5cGUgRXhwYW5kVHlwZUZyb21Tb3VyY2VGaWxlT3B0aW9ucyA9IEV4cGFuZFR5cGVPcHRpb25zQmFzZSAmIHtcbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHNvdXJjZSBmaWxlIHRvIGV2YWx1YXRlIHRoZSB0eXBlIGV4cHJlc3Npb24gaW4uXG4gICAqL1xuICBzb3VyY2VGaWxlTmFtZTogc3RyaW5nO1xufTtcbmV4cG9ydCB0eXBlIEV4cGFuZFR5cGVGcm9tU291cmNlVGV4dE9wdGlvbnMgPSBFeHBhbmRUeXBlT3B0aW9uc0Jhc2UgJiB7XG4gIC8qKlxuICAgKiBUeXBlU2NyaXB0IHNvdXJjZSB0ZXh0IHRvIGV2YWx1YXRlIHRoZSB0eXBlIGV4cHJlc3Npb24gaW4uXG4gICAqL1xuICBzb3VyY2VUZXh0OiBzdHJpbmc7XG59O1xuZXhwb3J0IHR5cGUgRXhwYW5kTXlUeXBlT3B0aW9ucyA9XG4gIHwgRXhwYW5kVHlwZUZyb21Tb3VyY2VGaWxlT3B0aW9uc1xuICB8IEV4cGFuZFR5cGVGcm9tU291cmNlVGV4dE9wdGlvbnM7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleHBhbmRNeVR5cGUoXG4gIG9wdGlvbnM6IEV4cGFuZFR5cGVGcm9tU291cmNlVGV4dE9wdGlvbnMsXG4pOiBQcm9taXNlPHN0cmluZz47XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhwYW5kTXlUeXBlKFxuICBvcHRpb25zOiBFeHBhbmRUeXBlRnJvbVNvdXJjZUZpbGVPcHRpb25zLFxuKTogUHJvbWlzZTxzdHJpbmc+O1xuXG4vKipcbiAqIEV4cGFuZHMgYSBUeXBlU2NyaXB0IHR5cGUgZXhwcmVzc2lvbi5cbiAqXG4gKiBAcGFyYW0gb3B0aW9uc1xuICogQHJldHVybnMgVGhlIGV4cGFuZGVkIHR5cGUgZXhwcmVzc2lvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4cGFuZE15VHlwZShvcHRpb25zOiBFeHBhbmRNeVR5cGVPcHRpb25zKSB7XG4gIGlmIChvcHRpb25zLnR5cGVFeHByZXNzaW9uLnRyaW0oKSA9PT0gXCJcIikge1xuICAgIHJldHVybiBcIm5ldmVyXCI7XG4gIH1cblxuICBpZiAoXCJzb3VyY2VUZXh0XCIgaW4gb3B0aW9ucykge1xuICAgIGNvbnN0IGR1bW15RmlsZU5hbWUgPSBcImV4cGFuZC1teS10eXBlLWR1bW15LnRzXCI7XG5cbiAgICByZXR1cm4gZXhwYW5kTXlUeXBlKHtcbiAgICAgIHNvdXJjZUZpbGVOYW1lOiBkdW1teUZpbGVOYW1lLFxuICAgICAgdHlwZUV4cHJlc3Npb246IG9wdGlvbnMudHlwZUV4cHJlc3Npb24sXG4gICAgICBjb21waWxlckhvc3RGdW5jdGlvbk92ZXJyaWRlczoge1xuICAgICAgICByZWFkRmlsZShmaWxlTmFtZTogc3RyaW5nKSB7XG4gICAgICAgICAgaWYgKHBhdGguYmFzZW5hbWUoZmlsZU5hbWUpID09PSBkdW1teUZpbGVOYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5zb3VyY2VUZXh0O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB0cy5zeXMucmVhZEZpbGUoZmlsZU5hbWUpO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHRzQ29tcGlsZXJPcHRpb25zOiBvcHRpb25zLnRzQ29tcGlsZXJPcHRpb25zLFxuICAgICAgcHJldHRpZnk6IG9wdGlvbnMucHJldHRpZnksXG4gICAgfSk7XG4gIH1cblxuICBjb25zdCByZXNvbHZlZFNvdXJjZUZpbGVOYW1lID0gcGF0aC5yZXNvbHZlKG9wdGlvbnMuc291cmNlRmlsZU5hbWUpO1xuXG4gIGNvbnN0IHRzQ29tcGlsZXJPcHRpb25zID0gb3B0aW9ucy50c0NvbXBpbGVyT3B0aW9ucyA/PyB7XG4gICAgbm9FbWl0OiB0cnVlLFxuXG4gICAgc3RyaWN0TnVsbENoZWNrczogdHJ1ZSxcbiAgICBhbGxvd1N5bnRoZXRpY0RlZmF1bHRJbXBvcnRzOiB0cnVlLFxuICAgIGFsbG93QXJiaXRyYXJ5RXh0ZW5zaW9uczogdHJ1ZSxcbiAgICBhbGxvd0ltcG9ydGluZ1RzRXh0ZW5zaW9uczogdHJ1ZSxcbiAgICBhbGxvd0pzOiB0cnVlLFxuICB9O1xuXG4gIGlmICghdHNDb21waWxlck9wdGlvbnMuc3RyaWN0TnVsbENoZWNrcykge1xuICAgIHRocm93IG5ldyBFcnJvcihcInN0cmljdE51bGxDaGVja3MgbXVzdCBiZSBlbmFibGVkIVwiKTtcbiAgfVxuXG4gIGNvbnN0IGNvbXBpbGVySG9zdCA9IGNyZWF0ZUF1Z21lbnRlckNvbXBpbGVySG9zdChcbiAgICByZXNvbHZlZFNvdXJjZUZpbGVOYW1lLFxuICAgIGNyZWF0ZUV4cGFuZENvZGVCbG9jayhvcHRpb25zLnR5cGVFeHByZXNzaW9uKSxcbiAgICB0c0NvbXBpbGVyT3B0aW9ucyxcbiAgICBvcHRpb25zLmNvbXBpbGVySG9zdEZ1bmN0aW9uT3ZlcnJpZGVzLFxuICApO1xuXG4gIGNvbnN0IHByb2dyYW0gPSB0cy5jcmVhdGVQcm9ncmFtKFxuICAgIFtyZXNvbHZlZFNvdXJjZUZpbGVOYW1lXSxcbiAgICB0c0NvbXBpbGVyT3B0aW9ucyxcbiAgICBjb21waWxlckhvc3QsXG4gICk7XG5cbiAgY29uc3Qgc291cmNlRmlsZSA9IHByb2dyYW0uZ2V0U291cmNlRmlsZShyZXNvbHZlZFNvdXJjZUZpbGVOYW1lKTtcbiAgaWYgKCFzb3VyY2VGaWxlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiU291cmNlIGZpbGUgbm90IGZvdW5kIVwiKTtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdElkZW50aWZpZXJOb2RlID0gZmluZFJlc3VsdElkZW50aWZpZXJOb2RlKHNvdXJjZUZpbGUpO1xuICBpZiAoIXJlc3VsdElkZW50aWZpZXJOb2RlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gbm9kZSBmb3VuZCFcIik7XG4gIH1cblxuICBjb25zdCB0eXBlQ2hlY2tlciA9IHByb2dyYW0uZ2V0VHlwZUNoZWNrZXIoKTtcbiAgY29uc3QgZXhwYW5kZWRUeXBlU3RyaW5nID0gdHlwZUNoZWNrZXIudHlwZVRvU3RyaW5nKFxuICAgIHR5cGVDaGVja2VyLmdldFR5cGVBdExvY2F0aW9uKHJlc3VsdElkZW50aWZpZXJOb2RlKSxcbiAgICB1bmRlZmluZWQsXG4gICAgdHMuVHlwZUZvcm1hdEZsYWdzLk5vZGVCdWlsZGVyRmxhZ3NNYXNrLFxuICApO1xuXG4gIGlmIChvcHRpb25zLnByZXR0aWZ5Py5lbmFibGVkID09PSBmYWxzZSkge1xuICAgIHJldHVybiBleHBhbmRlZFR5cGVTdHJpbmc7XG4gIH1cblxuICByZXR1cm4gZm9ybWF0VHlwZUV4cHJlc3Npb24oXG4gICAgZXhwYW5kZWRUeXBlU3RyaW5nLFxuICAgIG9wdGlvbnMucHJldHRpZnk/LmJpb21lT3B0aW9ucyxcbiAgKTtcbn1cbiIsCiAgICAiaW1wb3J0IHRzIGZyb20gXCJ0eXBlc2NyaXB0XCI7XG5cbnR5cGUgRXh0cmFjdEZ1bmN0aW9uczxULCBLIGV4dGVuZHMga2V5b2YgVCA9IGtleW9mIFQ+ID0ge1xuICBbUCBpbiBLXTogRXh0cmFjdDxUW1BdLCAoLi4uYXJnczogbmV2ZXJbXSkgPT4gdW5rbm93bj47XG59O1xuZXhwb3J0IHR5cGUgQ29tcGlsZXJIb3N0RnVuY3Rpb25PdmVycmlkZXMgPSBQYXJ0aWFsPFxuICBFeHRyYWN0RnVuY3Rpb25zPHRzLkNvbXBpbGVySG9zdD5cbj47XG5cbi8qKlxuICogQ3JlYXRlcyBhIGN1c3RvbSBjb21waWxlciBob3N0IHRoYXQgYXVnbWVudHMgdGhlIHNwZWNpZmllZCBzb3VyY2UgZmlsZSBmb3IgZXhwYW5kaW5nIGEgdHlwZSBleHByZXNzaW9uLlxuICpcbiAqIEBwYXJhbSBzb3VyY2VGaWxlTmFtZSBOYW1lIG9mIHRoZSBzb3VyY2UgZmlsZSB0byBhdWdtZW50LlxuICogQHBhcmFtIGNvZGVUb0FkZCBUeXBlIGV4cHJlc3Npb24uXG4gKiBAcGFyYW0gY29tcGlsZXJPcHRpb25zIFR5cGVTY3JpcHQgY29tcGlsZXIgb3B0aW9ucy5cbiAqIEBwYXJhbSBjb21waWxlckhvc3RGdW5jdGlvbk92ZXJyaWRlcyBBIHJlY29yZCBvZiBmdW5jdGlvbnMgdG8gb3ZlcnJpZGUgaW4gdGhlIGNvbXBpbGVyIGhvc3QuIFVzZWZ1bCBmb3IgbW9ja2luZy5cbiAqIEByZXR1cm5zIEEgY3VzdG9tIGNvbXBpbGVyIGhvc3QgdGhhdCByZXR1cm5zIGFuIGF1Z21lbnRlZCBzb3VyY2UgZmlsZSB0aGF0IGNhbiBiZSB1c2VkIHRvIGV4cGFuZCB0aGUgdHlwZSBleHByZXNzaW9uLlxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlQXVnbWVudGVyQ29tcGlsZXJIb3N0ID0gKFxuICBzb3VyY2VGaWxlTmFtZTogc3RyaW5nLFxuICBjb2RlVG9BZGQ6IHN0cmluZyxcbiAgY29tcGlsZXJPcHRpb25zPzogdHMuQ29tcGlsZXJPcHRpb25zLFxuICBjb21waWxlckhvc3RGdW5jdGlvbk92ZXJyaWRlcz86IENvbXBpbGVySG9zdEZ1bmN0aW9uT3ZlcnJpZGVzLFxuKSA9PiB7XG4gIGNvbnN0IGN1c3RvbUNvbXBpbGVySG9zdCA9IHRzLmNyZWF0ZUNvbXBpbGVySG9zdChjb21waWxlck9wdGlvbnMgPz8ge30sIHRydWUpO1xuICBjb25zdCBvdmVycmlkZXMgPSBjb21waWxlckhvc3RGdW5jdGlvbk92ZXJyaWRlcyA/PyB7fTtcblxuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhvdmVycmlkZXMpIGFzIEFycmF5PFxuICAgIGtleW9mIENvbXBpbGVySG9zdEZ1bmN0aW9uT3ZlcnJpZGVzXG4gID4pIHtcbiAgICBjb25zdCBvdmVycmlkZSA9IG92ZXJyaWRlc1trZXldO1xuXG4gICAgaWYgKG92ZXJyaWRlKSB7XG4gICAgICAoY3VzdG9tQ29tcGlsZXJIb3N0IGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0gPVxuICAgICAgICBvdmVycmlkZTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBvcmlnaW5hbFJlYWRGaWxlID0gY3VzdG9tQ29tcGlsZXJIb3N0LnJlYWRGaWxlO1xuXG4gIGN1c3RvbUNvbXBpbGVySG9zdC5yZWFkRmlsZSA9IChmaWxlTmFtZSkgPT4ge1xuICAgIGNvbnN0IGNvbnRlbnRzID0gb3JpZ2luYWxSZWFkRmlsZShmaWxlTmFtZSk7XG5cbiAgICBpZiAoY29udGVudHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGNvbnRlbnRzO1xuICAgIH1cblxuICAgIGlmIChmaWxlTmFtZSAhPT0gc291cmNlRmlsZU5hbWUpIHtcbiAgICAgIHJldHVybiBjb250ZW50cztcbiAgICB9XG5cbiAgICByZXR1cm4gYCR7Y29kZVRvQWRkfVxcbiR7Y29udGVudHN9YDtcbiAgfTtcblxuICByZXR1cm4gY3VzdG9tQ29tcGlsZXJIb3N0O1xufTtcbiIsCiAgICAiaW1wb3J0IHsgQmlvbWUgfSBmcm9tIFwiQGJpb21lanMvanMtYXBpL25vZGVqc1wiO1xuaW1wb3J0IHR5cGUgeyBDb25maWd1cmF0aW9uIGFzIEJpb21lQ29uZmlndXJhdGlvbiB9IGZyb20gXCJAYmlvbWVqcy93YXNtLW5vZGVqc1wiO1xuXG5jb25zdCBpZGVudGlmaWVyUHJlZml4ID0gXCJfX0VYUEFORF9NWV9UWVBFX19cIjtcbmNvbnN0IHZpcnR1YWxGb3JtYXRGaWxlTmFtZSA9IFwiZXhwYW5kLW15LXR5cGUudHNcIjtcbmNvbnN0IGJpb21lID0gbmV3IEJpb21lKCk7XG5jb25zdCB7IHByb2plY3RLZXkgfSA9IGJpb21lLm9wZW5Qcm9qZWN0KCk7XG5cbmNvbnN0IGRlZmF1bHRCaW9tZUNvbmZpZ3VyYXRpb246IEJpb21lQ29uZmlndXJhdGlvbiA9IHtcbiAgZm9ybWF0dGVyOiB7XG4gICAgZW5hYmxlZDogdHJ1ZSxcbiAgICBpbmRlbnRTdHlsZTogXCJzcGFjZVwiLFxuICB9LFxuICBqYXZhc2NyaXB0OiB7XG4gICAgZm9ybWF0dGVyOiB7XG4gICAgICBxdW90ZVN0eWxlOiBcImRvdWJsZVwiLFxuICAgICAgc2VtaWNvbG9uczogXCJhc05lZWRlZFwiLFxuICAgIH0sXG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlRXhwYW5kQ29kZUJsb2NrID0gKHR5cGVFeHByZXNzaW9uOiBzdHJpbmcpID0+IHtcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2Jsb2IvbWFpbi90ZXN0cy9jYXNlcy9jb21waWxlci9jb21wdXRlZFR5cGVzS2V5b2ZOb0luZGV4U2lnbmF0dXJlVHlwZS50c1xuICByZXR1cm4gYHR5cGUgJHtpZGVudGlmaWVyUHJlZml4fVJlc3VsdCA9ICR7aWRlbnRpZmllclByZWZpeH1FeHBhbmQ8JHtpZGVudGlmaWVyUHJlZml4fUV4cHJlc3Npb24+O1xuICAgIHR5cGUgJHtpZGVudGlmaWVyUHJlZml4fUV4cHJlc3Npb24gPSAke3R5cGVFeHByZXNzaW9ufTtcblxuICAgIHR5cGUgJHtpZGVudGlmaWVyUHJlZml4fUV4cGFuZDxUPiA9IFxuICAgICAgICBUIGV4dGVuZHMgKC4uLmFyZ3M6IGluZmVyIEEpID0+IGluZmVyIFIgPyAoLi4uYXJnczogJHtpZGVudGlmaWVyUHJlZml4fUV4cGFuZDxBPikgPT4gJHtpZGVudGlmaWVyUHJlZml4fUV4cGFuZDxSPlxuICAgICAgOiBUIGV4dGVuZHMgUHJvbWlzZTxpbmZlciBVPiA/IFByb21pc2U8JHtpZGVudGlmaWVyUHJlZml4fUV4cGFuZFR5cGVBcmd1bWVudDxVPj5cbiAgICAgIDogeyBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzIHN0cmluZyA/ICR7aWRlbnRpZmllclByZWZpeH1FeHBhbmRTdHJpbmc8VFtLXT4gOiAke2lkZW50aWZpZXJQcmVmaXh9RXhwYW5kPFRbS10+OyB9ICYge307XG5cbiAgICB0eXBlICR7aWRlbnRpZmllclByZWZpeH1FeHBhbmRUeXBlQXJndW1lbnQ8VD4gPSBbVCAmIHt9XSBleHRlbmRzIFtuZXZlcl0gPyBUIDogVCAmIHt9IGV4dGVuZHMgdm9pZCA/IFQgOiAke2lkZW50aWZpZXJQcmVmaXh9RXhwYW5kPFQgJiB7fT47XG5cbiAgICAvLyBGb3JjZXMgYSB1bmlvbiBvZiBzdHJpbmcgbGl0ZXJhbCB0eXBlcyB0byBiZSBleHBhbmRlZFxuICAgIHR5cGUgJHtpZGVudGlmaWVyUHJlZml4fUV4cGFuZFN0cmluZzxUIGV4dGVuZHMgc3RyaW5nPiA9ICR7aWRlbnRpZmllclByZWZpeH1SZW1vdmVVbmRlcnNjb3JlPCR7aWRlbnRpZmllclByZWZpeH1BcHBlbmRVbmRlcnNjb3JlPFQ+PjtcbiAgICB0eXBlICR7aWRlbnRpZmllclByZWZpeH1BcHBlbmRVbmRlcnNjb3JlPFQgZXh0ZW5kcyBzdHJpbmc+ID0gXFxgXFwke1R9X1xcYCBleHRlbmRzIHN0cmluZyA/IFxcYFxcJHtUfV9cXGAgOiBuZXZlcjtcbiAgICB0eXBlICR7aWRlbnRpZmllclByZWZpeH1SZW1vdmVVbmRlcnNjb3JlPFQgZXh0ZW5kcyBzdHJpbmc+ID0gVCBleHRlbmRzIFxcYFxcJHtpbmZlciBVfV9cXGAgPyBVIDogbmV2ZXI7YDtcbn07XG5cbmV4cG9ydCBjb25zdCBmb3JtYXRUeXBlRXhwcmVzc2lvbiA9IGFzeW5jIChcbiAgY29kZTogc3RyaW5nLFxuICBiaW9tZUNvbmZpZ3VyYXRpb24/OiBCaW9tZUNvbmZpZ3VyYXRpb24sXG4pID0+IHtcbiAgY29uc3QgaW5wdXQgPSBgdHlwZSAke2lkZW50aWZpZXJQcmVmaXh9ID0gJHtjb2RlfWA7XG4gIGNvbnN0IGphdmFzY3JpcHRGb3JtYXR0ZXIgPSB7XG4gICAgLi4uZGVmYXVsdEJpb21lQ29uZmlndXJhdGlvbi5qYXZhc2NyaXB0Py5mb3JtYXR0ZXIsXG4gICAgLi4uYmlvbWVDb25maWd1cmF0aW9uPy5qYXZhc2NyaXB0Py5mb3JtYXR0ZXIsXG4gIH07XG5cbiAgYmlvbWUuYXBwbHlDb25maWd1cmF0aW9uKHByb2plY3RLZXksIHtcbiAgICAuLi5kZWZhdWx0QmlvbWVDb25maWd1cmF0aW9uLFxuICAgIC4uLmJpb21lQ29uZmlndXJhdGlvbixcbiAgICBmb3JtYXR0ZXI6IHtcbiAgICAgIC4uLmRlZmF1bHRCaW9tZUNvbmZpZ3VyYXRpb24uZm9ybWF0dGVyLFxuICAgICAgLi4uYmlvbWVDb25maWd1cmF0aW9uPy5mb3JtYXR0ZXIsXG4gICAgfSxcbiAgICBqYXZhc2NyaXB0OiB7XG4gICAgICAuLi5kZWZhdWx0QmlvbWVDb25maWd1cmF0aW9uLmphdmFzY3JpcHQsXG4gICAgICAuLi5iaW9tZUNvbmZpZ3VyYXRpb24/LmphdmFzY3JpcHQsXG4gICAgICBmb3JtYXR0ZXI6IGphdmFzY3JpcHRGb3JtYXR0ZXIsXG4gICAgfSxcbiAgfSk7XG5cbiAgY29uc3QgcmVzdWx0ID0gYmlvbWUuZm9ybWF0Q29udGVudChwcm9qZWN0S2V5LCBpbnB1dCwge1xuICAgIGZpbGVQYXRoOiB2aXJ0dWFsRm9ybWF0RmlsZU5hbWUsXG4gIH0pO1xuXG4gIGlmIChyZXN1bHQuZGlhZ25vc3RpY3MubGVuZ3RoID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGJpb21lLnByaW50RGlhZ25vc3RpY3MocmVzdWx0LmRpYWdub3N0aWNzLCB7XG4gICAgICAgIGZpbGVQYXRoOiB2aXJ0dWFsRm9ybWF0RmlsZU5hbWUsXG4gICAgICAgIGZpbGVTb3VyY2U6IGlucHV0LFxuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQuY29udGVudC50cmltKCkuc3Vic3RyaW5nKGB0eXBlICR7aWRlbnRpZmllclByZWZpeH0gPSBgLmxlbmd0aCk7XG59O1xuIgogIF0sCiAgIm1hcHBpbmdzIjogIjtBQUFBO0FBRUE7OztBQ0ZBO0FBa0JPLElBQU0sOEJBQThCLENBQ3pDLGdCQUNBLFdBQ0EsaUJBQ0Esa0NBQ0c7QUFBQSxFQUNILE1BQU0scUJBQXFCLEdBQUcsbUJBQW1CLG1CQUFtQixDQUFDLEdBQUcsSUFBSTtBQUFBLEVBQzVFLE1BQU0sWUFBWSxpQ0FBaUMsQ0FBQztBQUFBLEVBRXBELFdBQVcsT0FBTyxPQUFPLEtBQUssU0FBUyxHQUVwQztBQUFBLElBQ0QsTUFBTSxXQUFXLFVBQVU7QUFBQSxJQUUzQixJQUFJLFVBQVU7QUFBQSxNQUNYLG1CQUEwRCxPQUN6RDtBQUFBLElBQ0o7QUFBQSxFQUNGO0FBQUEsRUFFQSxNQUFNLG1CQUFtQixtQkFBbUI7QUFBQSxF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UUFBUSxNQUFNLGVBQWU7QUFBQSxZQUM3QyxPQUFPLFFBQVE7QUFBQSxVQUNqQjtBQUFBLFVBRUEsT0FBTyxJQUFHLElBQUksU0FBUyxRQUFRO0FBQUE7QUFBQSxNQUVuQztBQUFBLE1BQ0EsbUJBQW1CLFFBQVE7QUFBQSxNQUMzQixVQUFVLFFBQVE7QUFBQSxJQUNwQixDQUFDO0FBQUEsRUFDSDtBQUFBLEVBRUEsTUFBTSx5QkFBeUIsS0FBSyxRQUFRLFFBQVEsY0FBYztBQUFBLEVBRWxFLE1BQU0sb0JBQW9CLFFBQVEscUJBQXFCO0FBQUEsSUFDckQsUUFBUTtBQUFBLElBRVIsa0JBQWtCO0FBQUEsSUFDbEIsOEJBQThCO0FBQUEsSUFDOUIsMEJBQTBCO0FBQUEsSUFDMUIsNEJBQTRCO0FBQUEsSUFDNUIsU0FBUztBQUFBLEVBQ1g7QUFBQSxFQUVBLElBQUksQ0FBQyxrQkFBa0Isa0JBQWtCO0FBQUEsSUFDdkMsTUFBTSxJQUFJLE1BQU0sbUNBQW1DO0FBQUEsRUFDckQ7QUFBQSxFQUVBLE1BQU0sZUFBZSw0QkFDbkIsd0JBQ0Esc0JBQXNCLFFBQVEsY0FBYyxHQUM1QyxtQkFDQSxRQUFRLDZCQUNWO0FBQUEsRUFFQSxNQUFNLFVBQVUsSUFBRyxjQUNqQixDQUFDLHNCQUFzQixHQUN2QixtQkFDQSxZQUNGO0FBQUEsRUFFQSxNQUFNLGFBQWEsUUFBUSxjQUFjLHNCQUFzQjtBQUFBLEVBQy9ELElBQUksQ0FBQyxZQUFZO0FBQUEsSUFDZixNQUFNLElBQUksTUFBTSx3QkFBd0I7QUFBQSxFQUMxQztBQUFBLEVBRUEsTUFBTSx1QkFBdUIseUJBQXlCLFVBQVU7QUFBQSxFQUNoRSxJQUFJLENBQUMsc0JBQXNCO0FBQUEsSUFDekIsTUFBTSxJQUFJLE1BQU0sZ0JBQWdCO0FBQUEsRUFDbEM7QUFBQSxFQUVBLE1BQU0sY0FBYyxRQUFRLGVBQWU7QUFBQSxFQUMzQyxNQUFNLHFCQUFxQixZQUFZLGFBQ3JDLFlBQVksa0JBQWtCLG9CQUFvQixHQUNsRCxXQUNBLElBQUcsZ0JBQWdCLG9CQUNyQjtBQUFBLEVBRUEsSUFBSSxRQUFRLFVBQVUsWUFBWSxPQUFPO0FBQUEsSUFDdkMsT0FBTztBQUFBLEVBQ1Q7QUFBQSxFQUVBLE9BQU8scUJBQ0wsb0JBQ0EsUUFBUSxVQUFVLFlBQ3BCO0FBQUE7IiwKICAiZGVidWdJZCI6ICJBODk5QzA3Nzk0NzY5RDI0NjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "expand-my-type",
3
- "version": "0.6.9",
3
+ "version": "0.8.0",
4
4
  "description": "Expand TypeScript type expressions programmatically",
5
5
  "keywords": [
6
6
  "expand",
@@ -20,14 +20,9 @@
20
20
  "type": "module",
21
21
  "exports": {
22
22
  ".": {
23
- "require": {
24
- "types": "./dist/index.d.cts",
25
- "default": "./dist/index.cjs"
26
- },
27
- "import": {
28
- "types": "./dist/index.d.ts",
29
- "default": "./dist/index.js"
30
- }
23
+ "types": "./dist/index.d.ts",
24
+ "require": "./dist/index.cjs",
25
+ "import": "./dist/index.js"
31
26
  }
32
27
  },
33
28
  "main": "dist/index.cjs",
@@ -36,30 +31,29 @@
36
31
  "expand-my-type": "./dist/cli.js"
37
32
  },
38
33
  "files": [
39
- "dist/index.cjs",
40
- "dist/index.d.cts",
41
- "dist/index.d.ts",
42
- "dist/index.js",
43
- "dist/cli.js"
34
+ "dist"
44
35
  ],
45
36
  "scripts": {
46
- "bundle-cli": "tsup ./src/cli.ts --format esm --sourcemap inline --silent",
47
- "bundle-lib": "tsup ./src/index.ts --format cjs,esm --dts --clean --sourcemap inline --silent",
48
- "format": "prettier --write .",
49
- "prepare": "npm run bundle-lib && npm run bundle-cli",
50
- "pretest": "tsc",
51
- "test": "tsx --test --test-reporter spec ./src/index.test.ts"
37
+ "build": "bun run clean && bun run build:esm && bun run build:cjs && bun run build:types",
38
+ "build:cjs": "bun build ./src/index.ts --target node --format cjs --packages external --outfile ./dist/index.cjs --sourcemap=inline",
39
+ "build:esm": "bun build ./src/index.ts ./src/cli.ts --target node --format esm --packages external --outdir ./dist --root ./src --sourcemap=inline",
40
+ "build:types": "tsc -p tsconfig.build.json",
41
+ "check": "bun run lint && bun run typecheck && bun run test",
42
+ "fix": "biome check --write .",
43
+ "clean": "rm -rf dist",
44
+ "deps:update": "bun update --latest",
45
+ "format": "bun run fix",
46
+ "lint": "bunx @biomejs/biome check .",
47
+ "test": "bun test ./src/index.test.ts",
48
+ "typecheck": "tsc --noEmit"
52
49
  },
53
50
  "dependencies": {
54
- "prettier": "^3.8.1",
55
- "typescript": "^5.9.3"
51
+ "@biomejs/js-api": "^4.0.0",
52
+ "@biomejs/wasm-nodejs": "^2.4.11",
53
+ "typescript": "^6.0.2"
56
54
  },
57
55
  "devDependencies": {
58
- "@trivago/prettier-plugin-sort-imports": "^6.0.2",
59
- "@types/node": "^22.19.11",
60
- "npm-check-updates": "^17.1.18",
61
- "prettier-plugin-packagejson": "^2.5.22",
62
- "tsup": "^8.5.1",
63
- "tsx": "^4.21.0"
56
+ "@biomejs/biome": "2.4.11",
57
+ "@types/node": "^25.5.2"
64
58
  }
65
59
  }
package/dist/index.d.cts DELETED
@@ -1,55 +0,0 @@
1
- import ts from 'typescript';
2
- import { Options } from 'prettier';
3
-
4
- type ExtractFunctions<T, K extends keyof T = keyof T> = {
5
- [P in K]: T[P] extends (...args: any[]) => any ? T[P] : never;
6
- };
7
- type CompilerHostFunctionOverrides = Partial<ExtractFunctions<ts.CompilerHost>>;
8
-
9
- type ExpandTypeOptionsBase = {
10
- /**
11
- * The type expression to expand.
12
- * @example "ReturnType<typeof myFunction>"
13
- */
14
- typeExpression: string;
15
- /**
16
- * TypeScript compiler options.
17
- */
18
- tsCompilerOptions?: ts.CompilerOptions;
19
- /**
20
- * Prettier options.
21
- */
22
- prettify?: {
23
- /**
24
- * Whether to prettify the output.
25
- * @default true
26
- */
27
- enabled?: boolean;
28
- /**
29
- * Prettier options. Don't forget to set the parser to "typescript".
30
- * @default { parser: "typescript", semi: false }
31
- */
32
- options?: Options;
33
- };
34
- /**
35
- * A record of functions to override in the compiler host. Useful for mocking
36
- */
37
- compilerHostFunctionOverrides?: CompilerHostFunctionOverrides;
38
- };
39
- type ExpandTypeFromSourceFileOptions = ExpandTypeOptionsBase & {
40
- /**
41
- * Name of the source file to evaluate the type expression in.
42
- */
43
- sourceFileName: string;
44
- };
45
- type ExpandTypeFromSourceTextOptions = ExpandTypeOptionsBase & {
46
- /**
47
- * TypeScript source text to evaluate the type expression in.
48
- */
49
- sourceText: string;
50
- };
51
- type ExpandMyTypeOptions = ExpandTypeFromSourceFileOptions | ExpandTypeFromSourceTextOptions;
52
- declare function expandMyType(options: ExpandTypeFromSourceTextOptions): Promise<string>;
53
- declare function expandMyType(options: ExpandTypeFromSourceFileOptions): Promise<string>;
54
-
55
- export { type ExpandMyTypeOptions, type ExpandTypeFromSourceFileOptions, type ExpandTypeFromSourceTextOptions, type ExpandTypeOptionsBase, expandMyType };