@workflow/builders 4.1.0 → 4.1.2

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.
Files changed (54) hide show
  1. package/dist/apply-swc-transform.d.ts +7 -2
  2. package/dist/apply-swc-transform.d.ts.map +1 -1
  3. package/dist/apply-swc-transform.js +10 -4
  4. package/dist/base-builder-logging.test.d.ts +2 -0
  5. package/dist/base-builder-logging.test.d.ts.map +1 -0
  6. package/dist/base-builder-logging.test.js +99 -0
  7. package/dist/base-builder.d.ts +37 -14
  8. package/dist/base-builder.d.ts.map +1 -1
  9. package/dist/base-builder.js +301 -60
  10. package/dist/config-helpers.d.ts +2 -0
  11. package/dist/config-helpers.d.ts.map +1 -1
  12. package/dist/config-helpers.js +62 -1
  13. package/dist/config-helpers.test.d.ts +2 -0
  14. package/dist/config-helpers.test.d.ts.map +1 -0
  15. package/dist/config-helpers.test.js +17 -0
  16. package/dist/constants.d.ts +2 -0
  17. package/dist/constants.d.ts.map +1 -1
  18. package/dist/constants.js +18 -5
  19. package/dist/constants.test.js +7 -1
  20. package/dist/fast-discovery.d.ts +14 -0
  21. package/dist/fast-discovery.d.ts.map +1 -0
  22. package/dist/fast-discovery.js +649 -0
  23. package/dist/fast-discovery.test.d.ts +2 -0
  24. package/dist/fast-discovery.test.d.ts.map +1 -0
  25. package/dist/fast-discovery.test.js +376 -0
  26. package/dist/get-input-files.test.js +34 -2
  27. package/dist/index.d.ts +2 -2
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +2 -2
  30. package/dist/module-specifier.d.ts +13 -0
  31. package/dist/module-specifier.d.ts.map +1 -1
  32. package/dist/module-specifier.js +20 -1
  33. package/dist/standalone.d.ts.map +1 -1
  34. package/dist/standalone.js +4 -4
  35. package/dist/step-source-registration.test.d.ts +2 -0
  36. package/dist/step-source-registration.test.d.ts.map +1 -0
  37. package/dist/step-source-registration.test.js +82 -0
  38. package/dist/swc-esbuild-plugin.d.ts +1 -0
  39. package/dist/swc-esbuild-plugin.d.ts.map +1 -1
  40. package/dist/swc-esbuild-plugin.js +5 -3
  41. package/dist/swc-esbuild-plugin.test.js +25 -3
  42. package/dist/transform-utils.d.ts.map +1 -1
  43. package/dist/transform-utils.js +45 -6
  44. package/dist/transform-utils.test.js +92 -1
  45. package/dist/types.d.ts +9 -2
  46. package/dist/types.d.ts.map +1 -1
  47. package/dist/types.js +1 -1
  48. package/dist/vercel-build-output-api.d.ts.map +1 -1
  49. package/dist/vercel-build-output-api.js +8 -8
  50. package/dist/workflows-extractor.js +8 -3
  51. package/dist/workflows-extractor.test.d.ts +2 -0
  52. package/dist/workflows-extractor.test.d.ts.map +1 -0
  53. package/dist/workflows-extractor.test.js +70 -0
  54. package/package.json +5 -5
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=fast-discovery.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fast-discovery.test.d.ts","sourceRoot":"","sources":["../src/fast-discovery.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,376 @@
1
+ import { mkdirSync, mkdtempSync, realpathSync, rmSync, writeFileSync, } from 'node:fs';
2
+ import { tmpdir } from 'node:os';
3
+ import { dirname, join } from 'node:path';
4
+ import { afterEach, beforeEach, describe, expect, it } from 'vitest';
5
+ import { BaseBuilder } from './base-builder.js';
6
+ import { importParents, parentHasChild, } from './discover-entries-esbuild-plugin.js';
7
+ class TestBuilder extends BaseBuilder {
8
+ async build() {
9
+ // no-op
10
+ }
11
+ discoverEntriesPublic(inputs, outdir, tsconfigPath) {
12
+ return this.discoverEntries(inputs, outdir, tsconfigPath);
13
+ }
14
+ createRouteImportSpecifierPublic(file, routeDir) {
15
+ return this.createRouteImportSpecifier(file, routeDir);
16
+ }
17
+ }
18
+ const realTmpdir = realpathSync(tmpdir());
19
+ function normalize(path) {
20
+ return path.replace(/\\/g, '/');
21
+ }
22
+ function writeFile(path, contents) {
23
+ mkdirSync(dirname(path), { recursive: true });
24
+ writeFileSync(path, contents, 'utf-8');
25
+ }
26
+ function createBuilder(workingDir) {
27
+ const config = {
28
+ buildTarget: 'standalone',
29
+ workingDir,
30
+ dirs: ['.'],
31
+ stepsBundlePath: join(workingDir, 'steps.js'),
32
+ workflowsBundlePath: join(workingDir, 'workflows.js'),
33
+ webhookBundlePath: join(workingDir, 'webhook.js'),
34
+ };
35
+ return new TestBuilder(config);
36
+ }
37
+ describe('fast workflow discovery', () => {
38
+ let testRoot;
39
+ beforeEach(() => {
40
+ testRoot = mkdtempSync(join(realTmpdir, 'workflow-fast-discovery-'));
41
+ importParents.clear();
42
+ });
43
+ afterEach(() => {
44
+ importParents.clear();
45
+ rmSync(testRoot, { recursive: true, force: true });
46
+ });
47
+ it('discovers transitive relative step imports and tracks the parent chain', async () => {
48
+ const entryFile = join(testRoot, 'src', 'entry.ts');
49
+ const workflowFile = join(testRoot, 'src', 'workflow.ts');
50
+ const stepFile = join(testRoot, 'src', 'step.ts');
51
+ writeFile(entryFile, `import './workflow';\n`);
52
+ writeFile(workflowFile, `import { doStep } from './step';\nvoid doStep;\n`);
53
+ writeFile(stepFile, `export async function doStep() {
54
+ 'use step';
55
+ return 1;
56
+ }
57
+ `);
58
+ const discovered = await createBuilder(testRoot).discoverEntriesPublic([entryFile], join(testRoot, 'out'));
59
+ expect(discovered.discoveredSteps).toEqual(new Set([normalize(stepFile)]));
60
+ expect(parentHasChild(normalize(entryFile), normalize(stepFile))).toBe(true);
61
+ });
62
+ it('discovers relative JS imports whose basename includes .step', async () => {
63
+ const entryFile = join(testRoot, 'src', 'entry.ts');
64
+ const workflowFile = join(testRoot, 'src', 'hello.step.js');
65
+ writeFile(entryFile, `import './hello.step';\n`);
66
+ writeFile(workflowFile, `export async function run() {
67
+ 'use workflow';
68
+ return 'ok';
69
+ }
70
+ `);
71
+ const discovered = await createBuilder(testRoot).discoverEntriesPublic([entryFile], join(testRoot, 'out'));
72
+ expect(discovered.discoveredWorkflows).toEqual(new Set([normalize(workflowFile)]));
73
+ expect(parentHasChild(normalize(entryFile), normalize(workflowFile))).toBe(true);
74
+ });
75
+ it('discovers workflow files reached through an imported package re-export', async () => {
76
+ const entryFile = join(testRoot, 'src', 'entry.ts');
77
+ const packageRoot = join(testRoot, 'node_modules', 'workflow-pkg');
78
+ const packageIndex = join(packageRoot, 'index.js');
79
+ const packageWorkflow = join(packageRoot, 'workflow.js');
80
+ writeFile(entryFile, `import { run } from 'workflow-pkg';\nvoid run;\n`);
81
+ writeFile(join(packageRoot, 'package.json'), JSON.stringify({
82
+ name: 'workflow-pkg',
83
+ version: '1.0.0',
84
+ main: 'index.js',
85
+ dependencies: {
86
+ workflow: '^1.0.0',
87
+ },
88
+ }));
89
+ writeFile(packageIndex, `export { run } from './workflow.js';\n`);
90
+ writeFile(packageWorkflow, `export async function run() {
91
+ "use workflow";
92
+ return "ok";
93
+ }
94
+ `);
95
+ const discovered = await createBuilder(testRoot).discoverEntriesPublic([entryFile], join(testRoot, 'out'));
96
+ expect(discovered.discoveredWorkflows).toEqual(new Set([normalize(packageWorkflow)]));
97
+ expect(parentHasChild(normalize(packageIndex), normalize(packageWorkflow))).toBe(true);
98
+ });
99
+ it('uses the workflow package export condition when discovering SDK stdlib steps', async () => {
100
+ const entryFile = join(testRoot, 'src', 'entry.ts');
101
+ const workflowPackageRoot = join(testRoot, 'node_modules', 'workflow');
102
+ const workflowEntry = join(workflowPackageRoot, 'workflow.js');
103
+ const workflowRequireEntry = join(workflowPackageRoot, 'typescript-plugin.cjs');
104
+ const stdlibFile = join(workflowPackageRoot, 'stdlib.js');
105
+ writeFile(entryFile, `import { fetch } from 'workflow';
106
+
107
+ export async function run() {
108
+ 'use workflow';
109
+ return fetch('https://example.com');
110
+ }
111
+ `);
112
+ writeFile(join(workflowPackageRoot, 'package.json'), JSON.stringify({
113
+ name: 'workflow',
114
+ version: '1.0.0',
115
+ exports: {
116
+ '.': {
117
+ workflow: './workflow.js',
118
+ require: './typescript-plugin.cjs',
119
+ default: './index.js',
120
+ },
121
+ },
122
+ }));
123
+ writeFile(workflowEntry, `export * from './stdlib.js';
124
+ `);
125
+ writeFile(workflowRequireEntry, `module.exports = {};
126
+ `);
127
+ writeFile(stdlibFile, `export async function fetch(...args) {
128
+ 'use step';
129
+ return globalThis.fetch(...args);
130
+ }
131
+ `);
132
+ const discovered = await createBuilder(testRoot).discoverEntriesPublic([entryFile], join(testRoot, 'out'));
133
+ expect(discovered.discoveredSteps).toEqual(new Set([normalize(stdlibFile)]));
134
+ expect(parentHasChild(normalize(workflowEntry), normalize(stdlibFile))).toBe(true);
135
+ });
136
+ it('discovers files reached through tsconfig path aliases', async () => {
137
+ const entryFile = join(testRoot, 'src', 'entry.ts');
138
+ const registryFile = join(testRoot, 'src', '_workflows.ts');
139
+ const workflowFile = join(testRoot, 'src', 'workflows', 'workflow.ts');
140
+ const tsconfigFile = join(testRoot, 'tsconfig.json');
141
+ writeFile(tsconfigFile, JSON.stringify({
142
+ compilerOptions: {
143
+ paths: {
144
+ '@/*': ['./src/*'],
145
+ },
146
+ },
147
+ }));
148
+ writeFile(entryFile, `import { allWorkflows } from '@/_workflows';\n`);
149
+ writeFile(registryFile, `import * as workflow from './workflows/workflow';
150
+ export const allWorkflows = { workflow };
151
+ `);
152
+ writeFile(workflowFile, `export async function run() {
153
+ 'use workflow';
154
+ return 'ok';
155
+ }
156
+ `);
157
+ const discovered = await createBuilder(testRoot).discoverEntriesPublic([entryFile], join(testRoot, 'out'), tsconfigFile);
158
+ expect(discovered.discoveredWorkflows).toEqual(new Set([normalize(workflowFile)]));
159
+ expect(parentHasChild(normalize(entryFile), normalize(workflowFile))).toBe(true);
160
+ });
161
+ it('discovers dotted files reached through tsconfig path aliases', async () => {
162
+ const entryFile = join(testRoot, 'src', 'entry.ts');
163
+ const registryFile = join(testRoot, 'src', 'workflows', 'hello.index.ts');
164
+ const workflowFile = join(testRoot, 'src', 'workflows', 'hello.ts');
165
+ const tsconfigFile = join(testRoot, 'tsconfig.json');
166
+ writeFile(tsconfigFile, JSON.stringify({
167
+ compilerOptions: {
168
+ paths: {
169
+ '@/*': ['./src/*'],
170
+ },
171
+ },
172
+ }));
173
+ writeFile(entryFile, `import { helloWorkflow } from '@/workflows/hello.index';\n`);
174
+ writeFile(registryFile, `export { helloWorkflow } from './hello';\n`);
175
+ writeFile(workflowFile, `export async function helloWorkflow() {
176
+ 'use workflow';
177
+ return 'ok';
178
+ }
179
+ `);
180
+ const discovered = await createBuilder(testRoot).discoverEntriesPublic([entryFile], join(testRoot, 'out'), tsconfigFile);
181
+ expect(discovered.discoveredWorkflows).toEqual(new Set([normalize(workflowFile)]));
182
+ });
183
+ it('ignores non-source files reached through tsconfig path aliases', async () => {
184
+ const entryFile = join(testRoot, 'src', 'entry.ts');
185
+ const assetFile = join(testRoot, 'src', 'styles', 'app.css');
186
+ const tsconfigFile = join(testRoot, 'tsconfig.json');
187
+ writeFile(tsconfigFile, JSON.stringify({
188
+ compilerOptions: {
189
+ paths: {
190
+ '@/*': ['./src/*'],
191
+ },
192
+ },
193
+ }));
194
+ writeFile(entryFile, `import '@/styles/app.css';\n`);
195
+ writeFile(assetFile, `'use workflow';\n`);
196
+ const discovered = await createBuilder(testRoot).discoverEntriesPublic([entryFile], join(testRoot, 'out'), tsconfigFile);
197
+ expect(discovered.discoveredWorkflows).toEqual(new Set());
198
+ });
199
+ it('discovers path aliases inherited through tsconfig extends', async () => {
200
+ const entryFile = join(testRoot, 'src', 'entry.ts');
201
+ const workflowFile = join(testRoot, 'src', 'workflows', 'workflow.ts');
202
+ const baseTsconfigFile = join(testRoot, 'tsconfig.base.json');
203
+ const tsconfigFile = join(testRoot, 'tsconfig.json');
204
+ writeFile(baseTsconfigFile, JSON.stringify({
205
+ compilerOptions: {
206
+ baseUrl: '.',
207
+ paths: {
208
+ '@base/*': ['./src/*'],
209
+ },
210
+ },
211
+ }));
212
+ writeFile(tsconfigFile, JSON.stringify({
213
+ extends: './tsconfig.base.json',
214
+ }));
215
+ writeFile(entryFile, `import { run } from '@base/workflows/workflow';\n`);
216
+ writeFile(workflowFile, `export async function run() {
217
+ 'use workflow';
218
+ return 'ok';
219
+ }
220
+ `);
221
+ const discovered = await createBuilder(testRoot).discoverEntriesPublic([entryFile], join(testRoot, 'out'), tsconfigFile);
222
+ expect(discovered.discoveredWorkflows).toEqual(new Set([normalize(workflowFile)]));
223
+ });
224
+ it('discovers path aliases with multiple wildcards', async () => {
225
+ const entryFile = join(testRoot, 'src', 'entry.ts');
226
+ const workflowFile = join(testRoot, 'src', 'features', 'billing', 'flows', 'charge.ts');
227
+ const tsconfigFile = join(testRoot, 'tsconfig.json');
228
+ writeFile(tsconfigFile, JSON.stringify({
229
+ compilerOptions: {
230
+ paths: {
231
+ '@feature/*/workflow/*': ['./src/features/*/flows/*'],
232
+ },
233
+ },
234
+ }));
235
+ writeFile(entryFile, `import { charge } from '@feature/billing/workflow/charge';\n`);
236
+ writeFile(workflowFile, `export async function charge() {
237
+ 'use workflow';
238
+ return 'ok';
239
+ }
240
+ `);
241
+ const discovered = await createBuilder(testRoot).discoverEntriesPublic([entryFile], join(testRoot, 'out'), tsconfigFile);
242
+ expect(discovered.discoveredWorkflows).toEqual(new Set([normalize(workflowFile)]));
243
+ });
244
+ it('uses nearest nested jsconfig aliases in monorepo packages', async () => {
245
+ const rootTsconfigFile = join(testRoot, 'tsconfig.json');
246
+ const packageRoot = join(testRoot, 'packages', 'app');
247
+ const entryFile = join(packageRoot, 'src', 'entry.js');
248
+ const workflowFile = join(packageRoot, 'src', 'workflow.js');
249
+ writeFile(rootTsconfigFile, JSON.stringify({
250
+ compilerOptions: {
251
+ paths: {
252
+ '@root/*': ['./root/*'],
253
+ },
254
+ },
255
+ }));
256
+ writeFile(join(packageRoot, 'jsconfig.json'), JSON.stringify({
257
+ compilerOptions: {
258
+ paths: {
259
+ '#/*': ['./src/*'],
260
+ },
261
+ },
262
+ }));
263
+ writeFile(entryFile, `import { run } from '#/workflow';\n`);
264
+ writeFile(workflowFile, `export async function run() {
265
+ "use workflow";
266
+ return "ok";
267
+ }
268
+ `);
269
+ const discovered = await createBuilder(testRoot).discoverEntriesPublic([entryFile], join(testRoot, 'out'));
270
+ expect(discovered.discoveredWorkflows).toEqual(new Set([normalize(workflowFile)]));
271
+ });
272
+ it('only treats serde files as registration candidates when they define static serde methods', async () => {
273
+ const entryFile = join(testRoot, 'src', 'entry.ts');
274
+ const reducerFile = join(testRoot, 'src', 'reducer.ts');
275
+ const serdeFile = join(testRoot, 'src', 'serde.ts');
276
+ writeFile(entryFile, `import './reducer';
277
+ import './serde';
278
+ `);
279
+ writeFile(reducerFile, `import { WORKFLOW_SERIALIZE } from '@workflow/serde';
280
+
281
+ export function reducer(value: unknown) {
282
+ return value?.constructor?.[WORKFLOW_SERIALIZE];
283
+ }
284
+ `);
285
+ writeFile(serdeFile, `import { WORKFLOW_SERIALIZE as WS } from '@workflow/serde';
286
+
287
+ export class Value {
288
+ static classId = 'Value';
289
+ static [WS](value: Value) {
290
+ return value;
291
+ }
292
+ }
293
+ `);
294
+ const discovered = await createBuilder(testRoot).discoverEntriesPublic([entryFile], join(testRoot, 'out'));
295
+ expect(discovered.discoveredSerdeFiles).toEqual(new Set([normalize(serdeFile)]));
296
+ });
297
+ it('categorizes step, workflow, and serde usage independently', async () => {
298
+ const entryFile = join(testRoot, 'src', 'entry.ts');
299
+ const stepFile = join(testRoot, 'src', 'step.ts');
300
+ const workflowFile = join(testRoot, 'src', 'workflow.ts');
301
+ const serdeFile = join(testRoot, 'src', 'serde.ts');
302
+ writeFile(entryFile, `import './step';
303
+ import './workflow';
304
+ import './serde';
305
+ `);
306
+ writeFile(stepFile, `export async function runStep() {
307
+ 'use step';
308
+ return 'ok';
309
+ }
310
+ `);
311
+ writeFile(workflowFile, `export async function runWorkflow() {
312
+ 'use workflow';
313
+ return 'ok';
314
+ }
315
+ `);
316
+ writeFile(serdeFile, `export class Value {
317
+ static classId = 'Value';
318
+ static [Symbol.for('workflow-serialize')](value: Value) {
319
+ return value;
320
+ }
321
+ }
322
+ `);
323
+ const discovered = await createBuilder(testRoot).discoverEntriesPublic([entryFile], join(testRoot, 'out'));
324
+ expect(discovered.discoveredSteps).toEqual(new Set([normalize(stepFile)]));
325
+ expect(discovered.discoveredWorkflows).toEqual(new Set([normalize(workflowFile)]));
326
+ expect(discovered.discoveredSerdeFiles).toEqual(new Set([normalize(serdeFile)]));
327
+ });
328
+ it('ignores serde examples that only appear inside comments', async () => {
329
+ const entryFile = join(testRoot, 'src', 'entry.ts');
330
+ const docsFile = join(testRoot, 'src', 'docs.ts');
331
+ writeFile(entryFile, `import './docs';\n`);
332
+ writeFile(docsFile, `/**
333
+ * import { WORKFLOW_SERIALIZE } from '@workflow/serde';
334
+ *
335
+ * class Example {
336
+ * static [WORKFLOW_SERIALIZE](value) {
337
+ * return value;
338
+ * }
339
+ * }
340
+ */
341
+ export const WORKFLOW_SERIALIZE = Symbol.for('workflow-serialize');
342
+ `);
343
+ const discovered = await createBuilder(testRoot).discoverEntriesPublic([entryFile], join(testRoot, 'out'));
344
+ expect(discovered.discoveredSerdeFiles).toEqual(new Set());
345
+ });
346
+ it('relativizes nested package step registration imports', () => {
347
+ const routeDir = join(testRoot, 'app', '.well-known', 'workflow', 'v1');
348
+ const directPackageFile = join(testRoot, 'node_modules', 'direct-pkg', 'step.js');
349
+ const nestedPackageFile = join(testRoot, 'node_modules', 'parent-pkg', 'node_modules', 'nested-pkg', 'step.js');
350
+ writeFile(join(testRoot, 'package.json'), JSON.stringify({
351
+ dependencies: {
352
+ 'direct-pkg': '1.0.0',
353
+ },
354
+ }));
355
+ writeFile(join(testRoot, 'node_modules', 'direct-pkg', 'package.json'), JSON.stringify({
356
+ name: 'direct-pkg',
357
+ version: '1.0.0',
358
+ exports: {
359
+ './step': './step.js',
360
+ },
361
+ }));
362
+ writeFile(directPackageFile, `export const step = true;\n`);
363
+ writeFile(join(testRoot, 'node_modules', 'parent-pkg', 'node_modules', 'nested-pkg', 'package.json'), JSON.stringify({
364
+ name: 'nested-pkg',
365
+ version: '1.0.0',
366
+ exports: {
367
+ './step': './step.js',
368
+ },
369
+ }));
370
+ writeFile(nestedPackageFile, `export const step = true;\n`);
371
+ const builder = createBuilder(testRoot);
372
+ expect(builder.createRouteImportSpecifierPublic(directPackageFile, routeDir)).toBe('direct-pkg/step');
373
+ expect(builder.createRouteImportSpecifierPublic(nestedPackageFile, routeDir)).toBe('../../../../node_modules/parent-pkg/node_modules/nested-pkg/step.js');
374
+ });
375
+ });
376
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFzdC1kaXNjb3ZlcnkudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9mYXN0LWRpc2NvdmVyeS50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsV0FBVyxFQUNYLFlBQVksRUFDWixNQUFNLEVBQ04sYUFBYSxHQUNkLE1BQU0sU0FBUyxDQUFDO0FBQ2pCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDakMsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDMUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDckUsT0FBTyxFQUFFLFdBQVcsRUFBMEIsTUFBTSxtQkFBbUIsQ0FBQztBQUN4RSxPQUFPLEVBQ0wsYUFBYSxFQUNiLGNBQWMsR0FDZixNQUFNLHNDQUFzQyxDQUFDO0FBRzlDLE1BQU0sV0FBWSxTQUFRLFdBQVc7SUFDbkMsS0FBSyxDQUFDLEtBQUs7UUFDVCxRQUFRO0lBQ1YsQ0FBQztJQUVNLHFCQUFxQixDQUMxQixNQUFnQixFQUNoQixNQUFjLEVBQ2QsWUFBcUI7UUFFckIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUVNLGdDQUFnQyxDQUNyQyxJQUFZLEVBQ1osUUFBZ0I7UUFFaEIsT0FBTyxJQUFJLENBQUMsMEJBQTBCLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3pELENBQUM7Q0FDRjtBQUVELE1BQU0sVUFBVSxHQUFHLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0FBRTFDLFNBQVMsU0FBUyxDQUFDLElBQVk7SUFDN0IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENB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QUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQzFCLE1BQU0sQ0FDSixPQUFPLENBQUMsZ0NBQWdDLENBQUMsaUJBQWlCLEVBQUUsUUFBUSxDQUFDLENBQ3RFLENBQUMsSUFBSSxDQUNKLHFFQUFxRSxDQUN0RSxDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIG1rZGlyU3luYyxcbiAgbWtkdGVtcFN5bmMsXG4gIHJlYWxwYXRoU3luYyxcbiAgcm1TeW5jLFxuICB3cml0ZUZpbGVTeW5jLFxufSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHsgZGlybmFtZSwgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyBhZnRlckVhY2gsIGJlZm9yZUVhY2gsIGRlc2NyaWJlLCBleHBlY3QsIGl0IH0gZnJvbSAndml0ZXN0JztcbmltcG9ydCB7IEJhc2VCdWlsZGVyLCB0eXBlIERpc2NvdmVyZWRFbnRyaWVzIH0gZnJvbSAnLi9iYXNlLWJ1aWxkZXIuanMnO1xuaW1wb3J0IHtcbiAgaW1wb3J0UGFyZW50cyxcbiAgcGFyZW50SGFzQ2hpbGQsXG59IGZyb20gJy4vZGlzY292ZXItZW50cmllcy1lc2J1aWxkLXBsdWdpbi5qcyc7XG5pbXBvcnQgdHlwZSB7IFN0YW5kYWxvbmVDb25maWcgfSBmcm9tICcuL3R5cGVzLmpzJztcblxuY2xhc3MgVGVzdEJ1aWxkZXIgZXh0ZW5kcyBCYXNlQnVpbGRlciB7XG4gIGFzeW5jIGJ1aWxkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIG5vLW9wXG4gIH1cblxuICBwdWJsaWMgZGlzY292ZXJFbnRyaWVzUHVibGljKFxuICAgIGlucHV0czogc3RyaW5nW10sXG4gICAgb3V0ZGlyOiBzdHJpbmcsXG4gICAgdHNjb25maWdQYXRoPzogc3RyaW5nXG4gICk6IFByb21pc2U8RGlzY292ZXJlZEVudHJpZXM+IHtcbiAgICByZXR1cm4gdGhpcy5kaXNjb3ZlckVudHJpZXMoaW5wdXRzLCBvdXRkaXIsIHRzY29uZmlnUGF0aCk7XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlUm91dGVJbXBvcnRTcGVjaWZpZXJQdWJsaWMoXG4gICAgZmlsZTogc3RyaW5nLFxuICAgIHJvdXRlRGlyOiBzdHJpbmdcbiAgKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVSb3V0ZUltcG9ydFNwZWNpZmllcihmaWxlLCByb3V0ZURpcik7XG4gIH1cbn1cblxuY29uc3QgcmVhbFRtcGRpciA9IHJlYWxwYXRoU3luYyh0bXBkaXIoKSk7XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZShwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcGF0aC5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG59XG5cbmZ1bmN0aW9uIHdyaXRlRmlsZShwYXRoOiBzdHJpbmcsIGNvbnRlbnRzOiBzdHJpbmcpOiB2b2lkIHtcbiAgbWtkaXJTeW5jKGRpcm5hbWUocGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICB3cml0ZUZpbGVTeW5jKHBhdGgsIGNvbnRlbnRzLCAndXRmLTgnKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQnVpbGRlcih3b3JraW5nRGlyOiBzdHJpbmcpOiBUZXN0QnVpbGRlciB7XG4gIGNvbnN0IGNvbmZpZzogU3RhbmRhbG9uZUNvbmZpZyA9IHtcbiAgICBidWlsZFRhcmdldDogJ3N0YW5kYWxvbmUnLFxuICAgIHdvcmtpbmdEaXIsXG4gICAgZGlyczogWycuJ10sXG4gICAgc3RlcHNCdW5kbGVQYXRoOiBqb2luKHdvcmtpbmdEaXIsICdzdGVwcy5qcycpLFxuICAgIHdvcmtmbG93c0J1bmRsZVBhdGg6IGpvaW4od29ya2luZ0RpciwgJ3dvcmtmbG93cy5qcycpLFxuICAgIHdlYmhvb2tCdW5kbGVQYXRoOiBqb2luKHdvcmtpbmdEaXIsICd3ZWJob29rLmpzJyksXG4gIH07XG4gIHJldHVybiBuZXcgVGVzdEJ1aWxkZXIoY29uZmlnKTtcbn1cblxuZGVzY3JpYmUoJ2Zhc3Qgd29ya2Zsb3cgZGlzY292ZXJ5JywgKCkgPT4ge1xuICBsZXQgdGVzdFJvb3Q6IHN0cmluZztcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICB0ZXN0Um9vdCA9IG1rZHRlbXBTeW5jKGpvaW4ocmVhbFRtcGRpciwgJ3dvcmtmbG93LWZhc3QtZGlzY292ZXJ5LScpKTtcbiAgICBpbXBvcnRQYXJlbnRzLmNsZWFyKCk7XG4gIH0pO1xuXG4gIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgaW1wb3J0UGFyZW50cy5jbGVhcigpO1xuICAgIHJtU3luYyh0ZXN0Um9vdCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICB9KTtcblxuICBpdCgnZGlzY292ZXJzIHRyYW5zaXRpdmUgcmVsYXRpdmUgc3RlcCBpbXBvcnRzIGFuZCB0cmFja3MgdGhlIHBhcmVudCBjaGFpbicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBlbnRyeUZpbGUgPSBqb2luKHRlc3RSb290LCAnc3JjJywgJ2VudHJ5LnRzJyk7XG4gICAgY29uc3Qgd29ya2Zsb3dGaWxlID0gam9pbih0ZXN0Um9vdCwgJ3NyYycsICd3b3JrZmxvdy50cycpO1xuICAgIGNvbnN0IHN0ZXBGaWxlID0gam9pbih0ZXN0Um9vdCwgJ3NyYycsICdzdGVwLnRzJyk7XG5cbiAgICB3cml0ZUZpbGUoZW50cnlGaWxlLCBgaW1wb3J0ICcuL3dvcmtmbG93JztcXG5gKTtcbiAgICB3cml0ZUZpbGUod29ya2Zsb3dGaWxlLCBgaW1wb3J0IHsgZG9TdGVwIH0gZnJvbSAnLi9zdGVwJztcXG52b2lkIGRvU3RlcDtcXG5gKTtcbiAgICB3cml0ZUZpbGUoXG4gICAgICBzdGVwRmlsZSxcbiAgICAgIGBleHBvcnQgYXN5bmMgZnVuY3Rpb24gZG9TdGVwKCkge1xuICAndXNlIHN0ZXAnO1xuICByZXR1cm4gMTtcbn1cbmBcbiAgICApO1xuXG4gICAgY29uc3QgZGlzY292ZXJlZCA9IGF3YWl0IGNyZWF0ZUJ1aWxkZXIodGVzdFJvb3QpLmRpc2NvdmVyRW50cmllc1B1YmxpYyhcbiAgICAgIFtlbnRyeUZpbGVdLFxuICAgICAgam9pbih0ZXN0Um9vdCwgJ291dCcpXG4gICAgKTtcblxuICAgIGV4cGVjdChkaXNjb3ZlcmVkLmRpc2NvdmVyZWRTdGVwcykudG9FcXVhbChuZXcgU2V0KFtub3JtYWxpemUoc3RlcEZpbGUpXSkpO1xuICAgIGV4cGVjdChwYXJlbnRIYXNDaGlsZChub3JtYWxpemUoZW50cnlGaWxlKSwgbm9ybWFsaXplKHN0ZXBGaWxlKSkpLnRvQmUoXG4gICAgICB0cnVlXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoJ2Rpc2NvdmVycyByZWxhdGl2ZSBKUyBpbXBvcnRzIHdob3NlIGJhc2VuYW1lIGluY2x1ZGVzIC5zdGVwJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGVudHJ5RmlsZSA9IGpvaW4odGVzdFJvb3QsICdzcmMnLCAnZW50cnkudHMnKTtcbiAgICBjb25zdCB3b3JrZmxvd0ZpbGUgPSBqb2luKHRlc3RSb290LCAnc3JjJywgJ2hlbGxvLnN0ZXAuanMnKTtcblxuICAgIHdyaXRlRmlsZShlbnRyeUZpbGUsIGBpbXBvcnQgJy4vaGVsbG8uc3RlcCc7XFxuYCk7XG4gICAgd3JpdGVGaWxlKFxuICAgICAgd29ya2Zsb3dGaWxlLFxuICAgICAgYGV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW4oKSB7XG4gICd1c2Ugd29ya2Zsb3cnO1xuICByZXR1cm4gJ29rJztcbn1cbmBcbiAgICApO1xuXG4gICAgY29uc3QgZGlzY292ZXJlZCA9IGF3YWl0IGNyZWF0ZUJ1aWxkZXIodGVzdFJvb3QpLmRpc2NvdmVyRW50cmllc1B1YmxpYyhcbiAgICAgIFtlbnRyeUZpbGVdLFxuICAgICAgam9pbih0ZXN0Um9vdCwgJ291dCcpXG4gICAgKTtcblxuICAgIGV4cGVjdChkaXNjb3ZlcmVkLmRpc2NvdmVyZWRXb3JrZmxvd3MpLnRvRXF1YWwoXG4gICAgICBuZXcgU2V0KFtub3JtYWxpemUod29ya2Zsb3dGaWxlKV0pXG4gICAgKTtcbiAgICBleHBlY3QocGFyZW50SGFzQ2hpbGQobm9ybWFsaXplKGVudHJ5RmlsZSksIG5vcm1hbGl6ZSh3b3JrZmxvd0ZpbGUpKSkudG9CZShcbiAgICAgIHRydWVcbiAgICApO1xuICB9KTtcblxuICBpdCgnZGlzY292ZXJzIHdvcmtmbG93IGZpbGVzIHJlYWNoZWQgdGhyb3VnaCBhbiBpbXBvcnRlZCBwYWNrYWdlIHJlLWV4cG9ydCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBlbnRyeUZpbGUgPSBqb2luKHRlc3RSb290LCAnc3JjJywgJ2VudHJ5LnRzJyk7XG4gICAgY29uc3QgcGFja2FnZVJvb3QgPSBqb2luKHRlc3RSb290LCAnbm9kZV9tb2R1bGVzJywgJ3dvcmtmbG93LXBrZycpO1xuICAgIGNvbnN0IHBhY2thZ2VJbmRleCA9IGpvaW4ocGFja2FnZVJvb3QsICdpbmRleC5qcycpO1xuICAgIGNvbnN0IHBhY2thZ2VXb3JrZmxvdyA9IGpvaW4ocGFja2FnZVJvb3QsICd3b3JrZmxvdy5qcycpO1xuXG4gICAgd3JpdGVGaWxlKGVudHJ5RmlsZSwgYGltcG9ydCB7IHJ1biB9IGZyb20gJ3dvcmtmbG93LXBrZyc7XFxudm9pZCBydW47XFxuYCk7XG4gICAgd3JpdGVGaWxlKFxuICAgICAgam9pbihwYWNrYWdlUm9vdCwgJ3BhY2thZ2UuanNvbicpLFxuICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBuYW1lOiAnd29ya2Zsb3ctcGtnJyxcbiAgICAgICAgdmVyc2lvbjogJzEuMC4wJyxcbiAgICAgICAgbWFpbjogJ2luZGV4LmpzJyxcbiAgICAgICAgZGVwZW5kZW5jaWVzOiB7XG4gICAgICAgICAgd29ya2Zsb3c6ICdeMS4wLjAnLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICApO1xuICAgIHdyaXRlRmlsZShwYWNrYWdlSW5kZXgsIGBleHBvcnQgeyBydW4gfSBmcm9tICcuL3dvcmtmbG93LmpzJztcXG5gKTtcbiAgICB3cml0ZUZpbGUoXG4gICAgICBwYWNrYWdlV29ya2Zsb3csXG4gICAgICBgZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bigpIHtcbiAgXCJ1c2Ugd29ya2Zsb3dcIjtcbiAgcmV0dXJuIFwib2tcIjtcbn1cbmBcbiAgICApO1xuXG4gICAgY29uc3QgZGlzY292ZXJlZCA9IGF3YWl0IGNyZWF0ZUJ1aWxkZXIodGVzdFJvb3QpLmRpc2NvdmVyRW50cmllc1B1YmxpYyhcbiAgICAgIFtlbnRyeUZpbGVdLFxuICAgICAgam9pbih0ZXN0Um9vdCwgJ291dCcpXG4gICAgKTtcblxuICAgIGV4cGVjdChkaXNjb3ZlcmVkLmRpc2NvdmVyZWRXb3JrZmxvd3MpLnRvRXF1YWwoXG4gICAgICBuZXcgU2V0KFtub3JtYWxpemUocGFja2FnZVdvcmtmbG93KV0pXG4gICAgKTtcbiAgICBleHBlY3QoXG4gICAgICBwYXJlbnRIYXNDaGlsZChub3JtYWxpemUocGFja2FnZUluZGV4KSwgbm9ybWFsaXplKHBhY2thZ2VXb3JrZmxvdykpXG4gICAgKS50b0JlKHRydWUpO1xuICB9KTtcblxuICBpdCgndXNlcyB0aGUgd29ya2Zsb3cgcGFja2FnZSBleHBvcnQgY29uZGl0aW9uIHdoZW4gZGlzY292ZXJpbmcgU0RLIHN0ZGxpYiBzdGVwcycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBlbnRyeUZpbGUgPSBqb2luKHRlc3RSb290LCAnc3JjJywgJ2VudHJ5LnRzJyk7XG4gICAgY29uc3Qgd29ya2Zsb3dQYWNrYWdlUm9vdCA9IGpvaW4odGVzdFJvb3QsICdub2RlX21vZHVsZXMnLCAnd29ya2Zsb3cnKTtcbiAgICBjb25zdCB3b3JrZmxvd0VudHJ5ID0gam9pbih3b3JrZmxvd1BhY2thZ2VSb290LCAnd29ya2Zsb3cuanMnKTtcbiAgICBjb25zdCB3b3JrZmxvd1JlcXVpcmVFbnRyeSA9IGpvaW4oXG4gICAgICB3b3JrZmxvd1BhY2thZ2VSb290LFxuICAgICAgJ3R5cGVzY3JpcHQtcGx1Z2luLmNqcydcbiAgICApO1xuICAgIGNvbnN0IHN0ZGxpYkZpbGUgPSBqb2luKHdvcmtmbG93UGFja2FnZVJvb3QsICdzdGRsaWIuanMnKTtcblxuICAgIHdyaXRlRmlsZShcbiAgICAgIGVudHJ5RmlsZSxcbiAgICAgIGBpbXBvcnQgeyBmZXRjaCB9IGZyb20gJ3dvcmtmbG93JztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bigpIHtcbiAgJ3VzZSB3b3JrZmxvdyc7XG4gIHJldHVybiBmZXRjaCgnaHR0cHM6Ly9leGFtcGxlLmNvbScpO1xufVxuYFxuICAgICk7XG4gICAgd3JpdGVGaWxlKFxuICAgICAgam9pbih3b3JrZmxvd1BhY2thZ2VSb290LCAncGFja2FnZS5qc29uJyksXG4gICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIG5hbWU6ICd3b3JrZmxvdycsXG4gICAgICAgIHZlcnNpb246ICcxLjAuMCcsXG4gICAgICAgIGV4cG9ydHM6IHtcbiAgICAgICAgICAnLic6IHtcbiAgICAgICAgICAgIHdvcmtmbG93OiAnLi93b3JrZmxvdy5qcycsXG4gICAgICAgICAgICByZXF1aXJlOiAnLi90eXBlc2NyaXB0LXBsdWdpbi5janMnLFxuICAgICAgICAgICAgZGVmYXVsdDogJy4vaW5kZXguanMnLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICk7XG4gICAgd3JpdGVGaWxlKFxuICAgICAgd29ya2Zsb3dFbnRyeSxcbiAgICAgIGBleHBvcnQgKiBmcm9tICcuL3N0ZGxpYi5qcyc7XG5gXG4gICAgKTtcbiAgICB3cml0ZUZpbGUoXG4gICAgICB3b3JrZmxvd1JlcXVpcmVFbnRyeSxcbiAgICAgIGBtb2R1bGUuZXhwb3J0cyA9IHt9O1xuYFxuICAgICk7XG4gICAgd3JpdGVGaWxlKFxuICAgICAgc3RkbGliRmlsZSxcbiAgICAgIGBleHBvcnQgYXN5bmMgZnVuY3Rpb24gZmV0Y2goLi4uYXJncykge1xuICAndXNlIHN0ZXAnO1xuICByZXR1cm4gZ2xvYmFsVGhpcy5mZXRjaCguLi5hcmdzKTtcbn1cbmBcbiAgICApO1xuXG4gICAgY29uc3QgZGlzY292ZXJlZCA9IGF3YWl0IGNyZWF0ZUJ1aWxkZXIodGVzdFJvb3QpLmRpc2NvdmVyRW50cmllc1B1YmxpYyhcbiAgICAgIFtlbnRyeUZpbGVdLFxuICAgICAgam9pbih0ZXN0Um9vdCwgJ291dCcpXG4gICAgKTtcblxuICAgIGV4cGVjdChkaXNjb3ZlcmVkLmRpc2NvdmVyZWRTdGVwcykudG9FcXVhbChcbiAgICAgIG5ldyBTZXQoW25vcm1hbGl6ZShzdGRsaWJGaWxlKV0pXG4gICAgKTtcbiAgICBleHBlY3QoXG4gICAgICBwYXJlbnRIYXNDaGlsZChub3JtYWxpemUod29ya2Zsb3dFbnRyeSksIG5vcm1hbGl6ZShzdGRsaWJGaWxlKSlcbiAgICApLnRvQmUodHJ1ZSk7XG4gIH0pO1xuXG4gIGl0KCdkaXNjb3ZlcnMgZmlsZXMgcmVhY2hlZCB0aHJvdWdoIHRzY29uZmlnIHBhdGggYWxpYXNlcycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBlbnRyeUZpbGUgPSBqb2luKHRlc3RSb290LCAnc3JjJywgJ2VudHJ5LnRzJyk7XG4gICAgY29uc3QgcmVnaXN0cnlGaWxlID0gam9pbih0ZXN0Um9vdCwgJ3NyYycsICdfd29ya2Zsb3dzLnRzJyk7XG4gICAgY29uc3Qgd29ya2Zsb3dGaWxlID0gam9pbih0ZXN0Um9vdCwgJ3NyYycsICd3b3JrZmxvd3MnLCAnd29ya2Zsb3cudHMnKTtcbiAgICBjb25zdCB0c2NvbmZpZ0ZpbGUgPSBqb2luKHRlc3RSb290LCAndHNjb25maWcuanNvbicpO1xuXG4gICAgd3JpdGVGaWxlKFxuICAgICAgdHNjb25maWdGaWxlLFxuICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBjb21waWxlck9wdGlvbnM6IHtcbiAgICAgICAgICBwYXRoczoge1xuICAgICAgICAgICAgJ0AvKic6IFsnLi9zcmMvKiddLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICk7XG4gICAgd3JpdGVGaWxlKGVudHJ5RmlsZSwgYGltcG9ydCB7IGFsbFdvcmtmbG93cyB9IGZyb20gJ0AvX3dvcmtmbG93cyc7XFxuYCk7XG4gICAgd3JpdGVGaWxlKFxuICAgICAgcmVnaXN0cnlGaWxlLFxuICAgICAgYGltcG9ydCAqIGFzIHdvcmtmbG93IGZyb20gJy4vd29ya2Zsb3dzL3dvcmtmbG93JztcbmV4cG9ydCBjb25zdCBhbGxXb3JrZmxvd3MgPSB7IHdvcmtmbG93IH07XG5gXG4gICAgKTtcbiAgICB3cml0ZUZpbGUoXG4gICAgICB3b3JrZmxvd0ZpbGUsXG4gICAgICBgZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bigpIHtcbiAgJ3VzZSB3b3JrZmxvdyc7XG4gIHJldHVybiAnb2snO1xufVxuYFxuICAgICk7XG5cbiAgICBjb25zdCBkaXNjb3ZlcmVkID0gYXdhaXQgY3JlYXRlQnVpbGRlcih0ZXN0Um9vdCkuZGlzY292ZXJFbnRyaWVzUHVibGljKFxuICAgICAgW2VudHJ5RmlsZV0sXG4gICAgICBqb2luKHRlc3RSb290LCAnb3V0JyksXG4gICAgICB0c2NvbmZpZ0ZpbGVcbiAgICApO1xuXG4gICAgZXhwZWN0KGRpc2NvdmVyZWQuZGlzY292ZXJlZFdvcmtmbG93cykudG9FcXVhbChcbiAgICAgIG5ldyBTZXQoW25vcm1hbGl6ZSh3b3JrZmxvd0ZpbGUpXSlcbiAgICApO1xuICAgIGV4cGVjdChwYXJlbnRIYXNDaGlsZChub3JtYWxpemUoZW50cnlGaWxlKSwgbm9ybWFsaXplKHdvcmtmbG93RmlsZSkpKS50b0JlKFxuICAgICAgdHJ1ZVxuICAgICk7XG4gIH0pO1xuXG4gIGl0KCdkaXNjb3ZlcnMgZG90dGVkIGZpbGVzIHJlYWNoZWQgdGhyb3VnaCB0c2NvbmZpZyBwYXRoIGFsaWFzZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZW50cnlGaWxlID0gam9pbih0ZXN0Um9vdCwgJ3NyYycsICdlbnRyeS50cycpO1xuICAgIGNvbnN0IHJlZ2lzdHJ5RmlsZSA9IGpvaW4odGVzdFJvb3QsICdzcmMnLCAnd29ya2Zsb3dzJywgJ2hlbGxvLmluZGV4LnRzJyk7XG4gICAgY29uc3Qgd29ya2Zsb3dGaWxlID0gam9pbih0ZXN0Um9vdCwgJ3NyYycsICd3b3JrZmxvd3MnLCAnaGVsbG8udHMnKTtcbiAgICBjb25zdCB0c2NvbmZpZ0ZpbGUgPSBqb2luKHRlc3RSb290LCAndHNjb25maWcuanNvbicpO1xuXG4gICAgd3JpdGVGaWxlKFxuICAgICAgdHNjb25maWdGaWxlLFxuICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBjb21waWxlck9wdGlvbnM6IHtcbiAgICAgICAgICBwYXRoczoge1xuICAgICAgICAgICAgJ0AvKic6IFsnLi9zcmMvKiddLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICk7XG4gICAgd3JpdGVGaWxlKFxuICAgICAgZW50cnlGaWxlLFxuICAgICAgYGltcG9ydCB7IGhlbGxvV29ya2Zsb3cgfSBmcm9tICdAL3dvcmtmbG93cy9oZWxsby5pbmRleCc7XFxuYFxuICAgICk7XG4gICAgd3JpdGVGaWxlKHJlZ2lzdHJ5RmlsZSwgYGV4cG9ydCB7IGhlbGxvV29ya2Zsb3cgfSBmcm9tICcuL2hlbGxvJztcXG5gKTtcbiAgICB3cml0ZUZpbGUoXG4gICAgICB3b3JrZmxvd0ZpbGUsXG4gICAgICBgZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhlbGxvV29ya2Zsb3coKSB7XG4gICd1c2Ugd29ya2Zsb3cnO1xuICByZXR1cm4gJ29rJztcbn1cbmBcbiAgICApO1xuXG4gICAgY29uc3QgZGlzY292ZXJlZCA9IGF3YWl0IGNyZWF0ZUJ1aWxkZXIodGVzdFJvb3QpLmRpc2NvdmVyRW50cmllc1B1YmxpYyhcbiAgICAgIFtlbnRyeUZpbGVdLFxuICAgICAgam9pbih0ZXN0Um9vdCwgJ291dCcpLFxuICAgICAgdHNjb25maWdGaWxlXG4gICAgKTtcblxuICAgIGV4cGVjdChkaXNjb3ZlcmVkLmRpc2NvdmVyZWRXb3JrZmxvd3MpLnRvRXF1YWwoXG4gICAgICBuZXcgU2V0KFtub3JtYWxpemUod29ya2Zsb3dGaWxlKV0pXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoJ2lnbm9yZXMgbm9uLXNvdXJjZSBmaWxlcyByZWFjaGVkIHRocm91Z2ggdHNjb25maWcgcGF0aCBhbGlhc2VzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGVudHJ5RmlsZSA9IGpvaW4odGVzdFJvb3QsICdzcmMnLCAnZW50cnkudHMnKTtcbiAgICBjb25zdCBhc3NldEZpbGUgPSBqb2luKHRlc3RSb290LCAnc3JjJywgJ3N0eWxlcycsICdhcHAuY3NzJyk7XG4gICAgY29uc3QgdHNjb25maWdGaWxlID0gam9pbih0ZXN0Um9vdCwgJ3RzY29uZmlnLmpzb24nKTtcblxuICAgIHdyaXRlRmlsZShcbiAgICAgIHRzY29uZmlnRmlsZSxcbiAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgY29tcGlsZXJPcHRpb25zOiB7XG4gICAgICAgICAgcGF0aHM6IHtcbiAgICAgICAgICAgICdALyonOiBbJy4vc3JjLyonXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICApO1xuICAgIHdyaXRlRmlsZShlbnRyeUZpbGUsIGBpbXBvcnQgJ0Avc3R5bGVzL2FwcC5jc3MnO1xcbmApO1xuICAgIHdyaXRlRmlsZShhc3NldEZpbGUsIGAndXNlIHdvcmtmbG93JztcXG5gKTtcblxuICAgIGNvbnN0IGRpc2NvdmVyZWQgPSBhd2FpdCBjcmVhdGVCdWlsZGVyKHRlc3RSb290KS5kaXNjb3ZlckVudHJpZXNQdWJsaWMoXG4gICAgICBbZW50cnlGaWxlXSxcbiAgICAgIGpvaW4odGVzdFJvb3QsICdvdXQnKSxcbiAgICAgIHRzY29uZmlnRmlsZVxuICAgICk7XG5cbiAgICBleHBlY3QoZGlzY292ZXJlZC5kaXNjb3ZlcmVkV29ya2Zsb3dzKS50b0VxdWFsKG5ldyBTZXQoKSk7XG4gIH0pO1xuXG4gIGl0KCdkaXNjb3ZlcnMgcGF0aCBhbGlhc2VzIGluaGVyaXRlZCB0aHJvdWdoIHRzY29uZmlnIGV4dGVuZHMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZW50cnlGaWxlID0gam9pbih0ZXN0Um9vdCwgJ3NyYycsICdlbnRyeS50cycpO1xuICAgIGNvbnN0IHdvcmtmbG93RmlsZSA9IGpvaW4odGVzdFJvb3QsICdzcmMnLCAnd29ya2Zsb3dzJywgJ3dvcmtmbG93LnRzJyk7XG4gICAgY29uc3QgYmFzZVRzY29uZmlnRmlsZSA9IGpvaW4odGVzdFJvb3QsICd0c2NvbmZpZy5iYXNlLmpzb24nKTtcbiAgICBjb25zdCB0c2NvbmZpZ0ZpbGUgPSBqb2luKHRlc3RSb290LCAndHNjb25maWcuanNvbicpO1xuXG4gICAgd3JpdGVGaWxlKFxuICAgICAgYmFzZVRzY29uZmlnRmlsZSxcbiAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgY29tcGlsZXJPcHRpb25zOiB7XG4gICAgICAgICAgYmFzZVVybDogJy4nLFxuICAgICAgICAgIHBhdGhzOiB7XG4gICAgICAgICAgICAnQGJhc2UvKic6IFsnLi9zcmMvKiddLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICk7XG4gICAgd3JpdGVGaWxlKFxuICAgICAgdHNjb25maWdGaWxlLFxuICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBleHRlbmRzOiAnLi90c2NvbmZpZy5iYXNlLmpzb24nLFxuICAgICAgfSlcbiAgICApO1xuICAgIHdyaXRlRmlsZShlbnRyeUZpbGUsIGBpbXBvcnQgeyBydW4gfSBmcm9tICdAYmFzZS93b3JrZmxvd3Mvd29ya2Zsb3cnO1xcbmApO1xuICAgIHdyaXRlRmlsZShcbiAgICAgIHdvcmtmbG93RmlsZSxcbiAgICAgIGBleHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuKCkge1xuICAndXNlIHdvcmtmbG93JztcbiAgcmV0dXJuICdvayc7XG59XG5gXG4gICAgKTtcblxuICAgIGNvbnN0IGRpc2NvdmVyZWQgPSBhd2FpdCBjcmVhdGVCdWlsZGVyKHRlc3RSb290KS5kaXNjb3ZlckVudHJpZXNQdWJsaWMoXG4gICAgICBbZW50cnlGaWxlXSxcbiAgICAgIGpvaW4odGVzdFJvb3QsICdvdXQnKSxcbiAgICAgIHRzY29uZmlnRmlsZVxuICAgICk7XG5cbiAgICBleHBlY3QoZGlzY292ZXJlZC5kaXNjb3ZlcmVkV29ya2Zsb3dzKS50b0VxdWFsKFxuICAgICAgbmV3IFNldChbbm9ybWFsaXplKHdvcmtmbG93RmlsZSldKVxuICAgICk7XG4gIH0pO1xuXG4gIGl0KCdkaXNjb3ZlcnMgcGF0aCBhbGlhc2VzIHdpdGggbXVsdGlwbGUgd2lsZGNhcmRzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGVudHJ5RmlsZSA9IGpvaW4odGVzdFJvb3QsICdzcmMnLCAnZW50cnkudHMnKTtcbiAgICBjb25zdCB3b3JrZmxvd0ZpbGUgPSBqb2luKFxuICAgICAgdGVzdFJvb3QsXG4gICAgICAnc3JjJyxcbiAgICAgICdmZWF0dXJlcycsXG4gICAgICAnYmlsbGluZycsXG4gICAgICAnZmxvd3MnLFxuICAgICAgJ2NoYXJnZS50cydcbiAgICApO1xuICAgIGNvbnN0IHRzY29uZmlnRmlsZSA9IGpvaW4odGVzdFJvb3QsICd0c2NvbmZpZy5qc29uJyk7XG5cbiAgICB3cml0ZUZpbGUoXG4gICAgICB0c2NvbmZpZ0ZpbGUsXG4gICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIGNvbXBpbGVyT3B0aW9uczoge1xuICAgICAgICAgIHBhdGhzOiB7XG4gICAgICAgICAgICAnQGZlYXR1cmUvKi93b3JrZmxvdy8qJzogWycuL3NyYy9mZWF0dXJlcy8qL2Zsb3dzLyonXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICApO1xuICAgIHdyaXRlRmlsZShcbiAgICAgIGVudHJ5RmlsZSxcbiAgICAgIGBpbXBvcnQgeyBjaGFyZ2UgfSBmcm9tICdAZmVhdHVyZS9iaWxsaW5nL3dvcmtmbG93L2NoYXJnZSc7XFxuYFxuICAgICk7XG4gICAgd3JpdGVGaWxlKFxuICAgICAgd29ya2Zsb3dGaWxlLFxuICAgICAgYGV4cG9ydCBhc3luYyBmdW5jdGlvbiBjaGFyZ2UoKSB7XG4gICd1c2Ugd29ya2Zsb3cnO1xuICByZXR1cm4gJ29rJztcbn1cbmBcbiAgICApO1xuXG4gICAgY29uc3QgZGlzY292ZXJlZCA9IGF3YWl0IGNyZWF0ZUJ1aWxkZXIodGVzdFJvb3QpLmRpc2NvdmVyRW50cmllc1B1YmxpYyhcbiAgICAgIFtlbnRyeUZpbGVdLFxuICAgICAgam9pbih0ZXN0Um9vdCwgJ291dCcpLFxuICAgICAgdHNjb25maWdGaWxlXG4gICAgKTtcblxuICAgIGV4cGVjdChkaXNjb3ZlcmVkLmRpc2NvdmVyZWRXb3JrZmxvd3MpLnRvRXF1YWwoXG4gICAgICBuZXcgU2V0KFtub3JtYWxpemUod29ya2Zsb3dGaWxlKV0pXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoJ3VzZXMgbmVhcmVzdCBuZXN0ZWQganNjb25maWcgYWxpYXNlcyBpbiBtb25vcmVwbyBwYWNrYWdlcycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByb290VHNjb25maWdGaWxlID0gam9pbih0ZXN0Um9vdCwgJ3RzY29uZmlnLmpzb24nKTtcbiAgICBjb25zdCBwYWNrYWdlUm9vdCA9IGpvaW4odGVzdFJvb3QsICdwYWNrYWdlcycsICdhcHAnKTtcbiAgICBjb25zdCBlbnRyeUZpbGUgPSBqb2luKHBhY2thZ2VSb290LCAnc3JjJywgJ2VudHJ5LmpzJyk7XG4gICAgY29uc3Qgd29ya2Zsb3dGaWxlID0gam9pbihwYWNrYWdlUm9vdCwgJ3NyYycsICd3b3JrZmxvdy5qcycpO1xuXG4gICAgd3JpdGVGaWxlKFxuICAgICAgcm9vdFRzY29uZmlnRmlsZSxcbiAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgY29tcGlsZXJPcHRpb25zOiB7XG4gICAgICAgICAgcGF0aHM6IHtcbiAgICAgICAgICAgICdAcm9vdC8qJzogWycuL3Jvb3QvKiddLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICk7XG4gICAgd3JpdGVGaWxlKFxuICAgICAgam9pbihwYWNrYWdlUm9vdCwgJ2pzY29uZmlnLmpzb24nKSxcbiAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgY29tcGlsZXJPcHRpb25zOiB7XG4gICAgICAgICAgcGF0aHM6IHtcbiAgICAgICAgICAgICcjLyonOiBbJy4vc3JjLyonXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICApO1xuICAgIHdyaXRlRmlsZShlbnRyeUZpbGUsIGBpbXBvcnQgeyBydW4gfSBmcm9tICcjL3dvcmtmbG93JztcXG5gKTtcbiAgICB3cml0ZUZpbGUoXG4gICAgICB3b3JrZmxvd0ZpbGUsXG4gICAgICBgZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bigpIHtcbiAgXCJ1c2Ugd29ya2Zsb3dcIjtcbiAgcmV0dXJuIFwib2tcIjtcbn1cbmBcbiAgICApO1xuXG4gICAgY29uc3QgZGlzY292ZXJlZCA9IGF3YWl0IGNyZWF0ZUJ1aWxkZXIodGVzdFJvb3QpLmRpc2NvdmVyRW50cmllc1B1YmxpYyhcbiAgICAgIFtlbnRyeUZpbGVdLFxuICAgICAgam9pbih0ZXN0Um9vdCwgJ291dCcpXG4gICAgKTtcblxuICAgIGV4cGVjdChkaXNjb3ZlcmVkLmRpc2NvdmVyZWRXb3JrZmxvd3MpLnRvRXF1YWwoXG4gICAgICBuZXcgU2V0KFtub3JtYWxpemUod29ya2Zsb3dGaWxlKV0pXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoJ29ubHkgdHJlYXRzIHNlcmRlIGZpbGVzIGFzIHJlZ2lzdHJhdGlvbiBjYW5kaWRhdGVzIHdoZW4gdGhleSBkZWZpbmUgc3RhdGljIHNlcmRlIG1ldGhvZHMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZW50cnlGaWxlID0gam9pbih0ZXN0Um9vdCwgJ3NyYycsICdlbnRyeS50cycpO1xuICAgIGNvbnN0IHJlZHVjZXJGaWxlID0gam9pbih0ZXN0Um9vdCwgJ3NyYycsICdyZWR1Y2VyLnRzJyk7XG4gICAgY29uc3Qgc2VyZGVGaWxlID0gam9pbih0ZXN0Um9vdCwgJ3NyYycsICdzZXJkZS50cycpO1xuXG4gICAgd3JpdGVGaWxlKFxuICAgICAgZW50cnlGaWxlLFxuICAgICAgYGltcG9ydCAnLi9yZWR1Y2VyJztcbmltcG9ydCAnLi9zZXJkZSc7XG5gXG4gICAgKTtcbiAgICB3cml0ZUZpbGUoXG4gICAgICByZWR1Y2VyRmlsZSxcbiAgICAgIGBpbXBvcnQgeyBXT1JLRkxPV19TRVJJQUxJWkUgfSBmcm9tICdAd29ya2Zsb3cvc2VyZGUnO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVkdWNlcih2YWx1ZTogdW5rbm93bikge1xuICByZXR1cm4gdmFsdWU/LmNvbnN0cnVjdG9yPy5bV09SS0ZMT1dfU0VSSUFMSVpFXTtcbn1cbmBcbiAgICApO1xuICAgIHdyaXRlRmlsZShcbiAgICAgIHNlcmRlRmlsZSxcbiAgICAgIGBpbXBvcnQgeyBXT1JLRkxPV19TRVJJQUxJWkUgYXMgV1MgfSBmcm9tICdAd29ya2Zsb3cvc2VyZGUnO1xuXG5leHBvcnQgY2xhc3MgVmFsdWUge1xuICBzdGF0aWMgY2xhc3NJZCA9ICdWYWx1ZSc7XG4gIHN0YXRpYyBbV1NdKHZhbHVlOiBWYWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufVxuYFxuICAgICk7XG5cbiAgICBjb25zdCBkaXNjb3ZlcmVkID0gYXdhaXQgY3JlYXRlQnVpbGRlcih0ZXN0Um9vdCkuZGlzY292ZXJFbnRyaWVzUHVibGljKFxuICAgICAgW2VudHJ5RmlsZV0sXG4gICAgICBqb2luKHRlc3RSb290LCAnb3V0JylcbiAgICApO1xuXG4gICAgZXhwZWN0KGRpc2NvdmVyZWQuZGlzY292ZXJlZFNlcmRlRmlsZXMpLnRvRXF1YWwoXG4gICAgICBuZXcgU2V0KFtub3JtYWxpemUoc2VyZGVGaWxlKV0pXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoJ2NhdGVnb3JpemVzIHN0ZXAsIHdvcmtmbG93LCBhbmQgc2VyZGUgdXNhZ2UgaW5kZXBlbmRlbnRseScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBlbnRyeUZpbGUgPSBqb2luKHRlc3RSb290LCAnc3JjJywgJ2VudHJ5LnRzJyk7XG4gICAgY29uc3Qgc3RlcEZpbGUgPSBqb2luKHRlc3RSb290LCAnc3JjJywgJ3N0ZXAudHMnKTtcbiAgICBjb25zdCB3b3JrZmxvd0ZpbGUgPSBqb2luKHRlc3RSb290LCAnc3JjJywgJ3dvcmtmbG93LnRzJyk7XG4gICAgY29uc3Qgc2VyZGVGaWxlID0gam9pbih0ZXN0Um9vdCwgJ3NyYycsICdzZXJkZS50cycpO1xuXG4gICAgd3JpdGVGaWxlKFxuICAgICAgZW50cnlGaWxlLFxuICAgICAgYGltcG9ydCAnLi9zdGVwJztcbmltcG9ydCAnLi93b3JrZmxvdyc7XG5pbXBvcnQgJy4vc2VyZGUnO1xuYFxuICAgICk7XG4gICAgd3JpdGVGaWxlKFxuICAgICAgc3RlcEZpbGUsXG4gICAgICBgZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1blN0ZXAoKSB7XG4gICd1c2Ugc3RlcCc7XG4gIHJldHVybiAnb2snO1xufVxuYFxuICAgICk7XG4gICAgd3JpdGVGaWxlKFxuICAgICAgd29ya2Zsb3dGaWxlLFxuICAgICAgYGV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5Xb3JrZmxvdygpIHtcbiAgJ3VzZSB3b3JrZmxvdyc7XG4gIHJldHVybiAnb2snO1xufVxuYFxuICAgICk7XG4gICAgd3JpdGVGaWxlKFxuICAgICAgc2VyZGVGaWxlLFxuICAgICAgYGV4cG9ydCBjbGFzcyBWYWx1ZSB7XG4gIHN0YXRpYyBjbGFzc0lkID0gJ1ZhbHVlJztcbiAgc3RhdGljIFtTeW1ib2wuZm9yKCd3b3JrZmxvdy1zZXJpYWxpemUnKV0odmFsdWU6IFZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG5gXG4gICAgKTtcblxuICAgIGNvbnN0IGRpc2NvdmVyZWQgPSBhd2FpdCBjcmVhdGVCdWlsZGVyKHRlc3RSb290KS5kaXNjb3ZlckVudHJpZXNQdWJsaWMoXG4gICAgICBbZW50cnlGaWxlXSxcbiAgICAgIGpvaW4odGVzdFJvb3QsICdvdXQnKVxuICAgICk7XG5cbiAgICBleHBlY3QoZGlzY292ZXJlZC5kaXNjb3ZlcmVkU3RlcHMpLnRvRXF1YWwobmV3IFNldChbbm9ybWFsaXplKHN0ZXBGaWxlKV0pKTtcbiAgICBleHBlY3QoZGlzY292ZXJlZC5kaXNjb3ZlcmVkV29ya2Zsb3dzKS50b0VxdWFsKFxuICAgICAgbmV3IFNldChbbm9ybWFsaXplKHdvcmtmbG93RmlsZSldKVxuICAgICk7XG4gICAgZXhwZWN0KGRpc2NvdmVyZWQuZGlzY292ZXJlZFNlcmRlRmlsZXMpLnRvRXF1YWwoXG4gICAgICBuZXcgU2V0KFtub3JtYWxpemUoc2VyZGVGaWxlKV0pXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoJ2lnbm9yZXMgc2VyZGUgZXhhbXBsZXMgdGhhdCBvbmx5IGFwcGVhciBpbnNpZGUgY29tbWVudHMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZW50cnlGaWxlID0gam9pbih0ZXN0Um9vdCwgJ3NyYycsICdlbnRyeS50cycpO1xuICAgIGNvbnN0IGRvY3NGaWxlID0gam9pbih0ZXN0Um9vdCwgJ3NyYycsICdkb2NzLnRzJyk7XG5cbiAgICB3cml0ZUZpbGUoZW50cnlGaWxlLCBgaW1wb3J0ICcuL2RvY3MnO1xcbmApO1xuICAgIHdyaXRlRmlsZShcbiAgICAgIGRvY3NGaWxlLFxuICAgICAgYC8qKlxuICogaW1wb3J0IHsgV09SS0ZMT1dfU0VSSUFMSVpFIH0gZnJvbSAnQHdvcmtmbG93L3NlcmRlJztcbiAqXG4gKiBjbGFzcyBFeGFtcGxlIHtcbiAqICAgc3RhdGljIFtXT1JLRkxPV19TRVJJQUxJWkVdKHZhbHVlKSB7XG4gKiAgICAgcmV0dXJuIHZhbHVlO1xuICogICB9XG4gKiB9XG4gKi9cbmV4cG9ydCBjb25zdCBXT1JLRkxPV19TRVJJQUxJWkUgPSBTeW1ib2wuZm9yKCd3b3JrZmxvdy1zZXJpYWxpemUnKTtcbmBcbiAgICApO1xuXG4gICAgY29uc3QgZGlzY292ZXJlZCA9IGF3YWl0IGNyZWF0ZUJ1aWxkZXIodGVzdFJvb3QpLmRpc2NvdmVyRW50cmllc1B1YmxpYyhcbiAgICAgIFtlbnRyeUZpbGVdLFxuICAgICAgam9pbih0ZXN0Um9vdCwgJ291dCcpXG4gICAgKTtcblxuICAgIGV4cGVjdChkaXNjb3ZlcmVkLmRpc2NvdmVyZWRTZXJkZUZpbGVzKS50b0VxdWFsKG5ldyBTZXQoKSk7XG4gIH0pO1xuXG4gIGl0KCdyZWxhdGl2aXplcyBuZXN0ZWQgcGFja2FnZSBzdGVwIHJlZ2lzdHJhdGlvbiBpbXBvcnRzJywgKCkgPT4ge1xuICAgIGNvbnN0IHJvdXRlRGlyID0gam9pbih0ZXN0Um9vdCwgJ2FwcCcsICcud2VsbC1rbm93bicsICd3b3JrZmxvdycsICd2MScpO1xuICAgIGNvbnN0IGRpcmVjdFBhY2thZ2VGaWxlID0gam9pbihcbiAgICAgIHRlc3RSb290LFxuICAgICAgJ25vZGVfbW9kdWxlcycsXG4gICAgICAnZGlyZWN0LXBrZycsXG4gICAgICAnc3RlcC5qcydcbiAgICApO1xuICAgIGNvbnN0IG5lc3RlZFBhY2thZ2VGaWxlID0gam9pbihcbiAgICAgIHRlc3RSb290LFxuICAgICAgJ25vZGVfbW9kdWxlcycsXG4gICAgICAncGFyZW50LXBrZycsXG4gICAgICAnbm9kZV9tb2R1bGVzJyxcbiAgICAgICduZXN0ZWQtcGtnJyxcbiAgICAgICdzdGVwLmpzJ1xuICAgICk7XG5cbiAgICB3cml0ZUZpbGUoXG4gICAgICBqb2luKHRlc3RSb290LCAncGFja2FnZS5qc29uJyksXG4gICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIGRlcGVuZGVuY2llczoge1xuICAgICAgICAgICdkaXJlY3QtcGtnJzogJzEuMC4wJyxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgKTtcbiAgICB3cml0ZUZpbGUoXG4gICAgICBqb2luKHRlc3RSb290LCAnbm9kZV9tb2R1bGVzJywgJ2RpcmVjdC1wa2cnLCAncGFja2FnZS5qc29uJyksXG4gICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIG5hbWU6ICdkaXJlY3QtcGtnJyxcbiAgICAgICAgdmVyc2lvbjogJzEuMC4wJyxcbiAgICAgICAgZXhwb3J0czoge1xuICAgICAgICAgICcuL3N0ZXAnOiAnLi9zdGVwLmpzJyxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgKTtcbiAgICB3cml0ZUZpbGUoZGlyZWN0UGFja2FnZUZpbGUsIGBleHBvcnQgY29uc3Qgc3RlcCA9IHRydWU7XFxuYCk7XG4gICAgd3JpdGVGaWxlKFxuICAgICAgam9pbihcbiAgICAgICAgdGVzdFJvb3QsXG4gICAgICAgICdub2RlX21vZHVsZXMnLFxuICAgICAgICAncGFyZW50LXBrZycsXG4gICAgICAgICdub2RlX21vZHVsZXMnLFxuICAgICAgICAnbmVzdGVkLXBrZycsXG4gICAgICAgICdwYWNrYWdlLmpzb24nXG4gICAgICApLFxuICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBuYW1lOiAnbmVzdGVkLXBrZycsXG4gICAgICAgIHZlcnNpb246ICcxLjAuMCcsXG4gICAgICAgIGV4cG9ydHM6IHtcbiAgICAgICAgICAnLi9zdGVwJzogJy4vc3RlcC5qcycsXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICk7XG4gICAgd3JpdGVGaWxlKG5lc3RlZFBhY2thZ2VGaWxlLCBgZXhwb3J0IGNvbnN0IHN0ZXAgPSB0cnVlO1xcbmApO1xuXG4gICAgY29uc3QgYnVpbGRlciA9IGNyZWF0ZUJ1aWxkZXIodGVzdFJvb3QpO1xuICAgIGV4cGVjdChcbiAgICAgIGJ1aWxkZXIuY3JlYXRlUm91dGVJbXBvcnRTcGVjaWZpZXJQdWJsaWMoZGlyZWN0UGFja2FnZUZpbGUsIHJvdXRlRGlyKVxuICAgICkudG9CZSgnZGlyZWN0LXBrZy9zdGVwJyk7XG4gICAgZXhwZWN0KFxuICAgICAgYnVpbGRlci5jcmVhdGVSb3V0ZUltcG9ydFNwZWNpZmllclB1YmxpYyhuZXN0ZWRQYWNrYWdlRmlsZSwgcm91dGVEaXIpXG4gICAgKS50b0JlKFxuICAgICAgJy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9wYXJlbnQtcGtnL25vZGVfbW9kdWxlcy9uZXN0ZWQtcGtnL3N0ZXAuanMnXG4gICAgKTtcbiAgfSk7XG59KTtcbiJdfQ==
@@ -1,4 +1,4 @@
1
- import { mkdirSync, mkdtempSync, realpathSync, rmSync, writeFileSync, } from 'node:fs';
1
+ import { mkdirSync, mkdtempSync, readFileSync, realpathSync, rmSync, writeFileSync, } from 'node:fs';
2
2
  import { tmpdir } from 'node:os';
3
3
  import { dirname, join } from 'node:path';
4
4
  import { afterEach, beforeEach, describe, expect, it } from 'vitest';
@@ -14,6 +14,9 @@ class TestBuilder extends BaseBuilder {
14
14
  getInputFiles() {
15
15
  return super.getInputFiles();
16
16
  }
17
+ ensureSwcIgnored() {
18
+ return super.ensureSwcIgnored();
19
+ }
17
20
  }
18
21
  // Resolve symlinks in tmpdir to avoid macOS /var -> /private/var issues
19
22
  const realTmpdir = realpathSync(tmpdir());
@@ -80,6 +83,7 @@ describe('getInputFiles', () => {
80
83
  writeFile(srcDir, '.workflow-data/state.ts');
81
84
  writeFile(srcDir, '.workflow-vitest/workflows.mjs');
82
85
  writeFile(srcDir, '.well-known/workflow/route.ts');
86
+ writeFile(srcDir, '.swc/cache/plugin-output.ts');
83
87
  writeFile(srcDir, '.turbo/cache/build.ts');
84
88
  writeFile(srcDir, '.cache/babel/plugin.js');
85
89
  writeFile(srcDir, '.yarn/releases/yarn.cjs');
@@ -97,6 +101,7 @@ describe('getInputFiles', () => {
97
101
  expect(files).not.toContain(normalize(join(srcDir, '.workflow-data/state.ts')));
98
102
  expect(files).not.toContain(normalize(join(srcDir, '.workflow-vitest/workflows.mjs')));
99
103
  expect(files).not.toContain(normalize(join(srcDir, '.well-known/workflow/route.ts')));
104
+ expect(files).not.toContain(normalize(join(srcDir, '.swc/cache/plugin-output.ts')));
100
105
  expect(files).not.toContain(normalize(join(srcDir, '.turbo/cache/build.ts')));
101
106
  expect(files).not.toContain(normalize(join(srcDir, '.cache/babel/plugin.js')));
102
107
  expect(files).not.toContain(normalize(join(srcDir, '.yarn/releases/yarn.cjs')));
@@ -118,4 +123,31 @@ describe('getInputFiles', () => {
118
123
  expect(files).toContain(normalize(join(srcDir, '.api/config.cjs')));
119
124
  });
120
125
  });
121
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LWlucHV0LWZpbGVzLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZ2V0LWlucHV0LWZpbGVzLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxXQUFXLEVBQ1gsWUFBWSxFQUNaLE1BQU0sRUFDTixhQUFhLEdBQ2QsTUFBTSxTQUFTLENBQUM7QUFDakIsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNqQyxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUMxQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUNyRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFHaEQ7O0dBRUc7QUFDSCxNQUFNLFdBQVksU0FBUSxXQUFXO0lBQ25DLEtBQUssQ0FBQyxLQUFLO1FBQ1QsUUFBUTtJQUNWLENBQUM7SUFFRCxtQkFBbUI7SUFDWixhQUFhO1FBQ2xCLE9BQU8sS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQy9CLENBQUM7Q0FDRjtBQUVELHdFQUF3RTtBQUN4RSxNQUFNLFVBQVUsR0FBRyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztBQUUxQzs7OztHQUlHO0FBQ0gsU0FBUyxTQUFTLENBQUMsQ0FBUztJQUMxQixPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQy9CLENBQUM7QUFFRCxTQUFTLFNBQVMsQ0FBQyxHQUFXLEVBQUUsWUFBb0IsRUFBRSxPQUFPLEdBQUcsRUFBRTtJQUNoRSxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ3pDLFNBQVMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUs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LFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNyQyxTQUFTLENBQUMsTUFBTSxFQUFFLGdCQUFnQixDQUFDLENBQUM7UUFDcEMsU0FBUyxDQUFDLE1BQU0sRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO1FBQ3RDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFDbkMsU0FBUyxDQUFDLE1BQU0sRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1FBRXJDLE1BQU0sT0FBTyxHQUFHLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ2pELE1BQU0sS0FBSyxHQUFHLENBQUMsTUFBTSxPQUFPLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFN0QsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEUsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIG1rZGlyU3luYyxcbiAgbWtkdGVtcFN5bmMsXG4gIHJlYWxwYXRoU3luYyxcbiAgcm1TeW5jLFxuICB3cml0ZUZpbGVTeW5jLFxufSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHsgZGlybmFtZSwgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyBhZnRlckVhY2gsIGJlZm9yZUVhY2gsIGRlc2NyaWJlLCBleHBlY3QsIGl0IH0gZnJvbSAndml0ZXN0JztcbmltcG9ydCB7IEJhc2VCdWlsZGVyIH0gZnJvbSAnLi9iYXNlLWJ1aWxkZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBTdGFuZGFsb25lQ29uZmlnIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbi8qKlxuICogTWluaW1hbCBzdWJjbGFzcyB0byBleHBvc2UgdGhlIHByb3RlY3RlZCBgZ2V0SW5wdXRGaWxlcygpYCBmb3IgdGVzdGluZy5cbiAqL1xuY2xhc3MgVGVzdEJ1aWxkZXIgZXh0ZW5kcyBCYXNlQnVpbGRlciB7XG4gIGFzeW5jIGJ1aWxkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIG5vLW9wXG4gIH1cblxuICAvLyBFeHBvc2UgZm9yIHRlc3RzXG4gIHB1YmxpYyBnZXRJbnB1dEZpbGVzKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICByZXR1cm4gc3VwZXIuZ2V0SW5wdXRGaWxlcygpO1xuICB9XG59XG5cbi8vIFJlc29sdmUgc3ltbGlua3MgaW4gdG1wZGlyIHRvIGF2b2lkIG1hY09TIC92YXIgLT4gL3ByaXZhdGUvdmFyIGlzc3Vlc1xuY29uc3QgcmVhbFRtcGRpciA9IHJlYWxwYXRoU3luYyh0bXBkaXIoKSk7XG5cbi8qKlxuICogTm9ybWFsaXplIGEgcGF0aCB0byBmb3J3YXJkIHNsYXNoZXMgZm9yIGNyb3NzLXBsYXRmb3JtIGNvbXBhcmlzb24uXG4gKiB0aW55Z2xvYmJ5IGFsd2F5cyByZXR1cm5zIGZvcndhcmQtc2xhc2ggcGF0aHMsIGV2ZW4gb24gV2luZG93cyxcbiAqIHdoaWxlIE5vZGUncyBgcGF0aC5qb2luKClgIHVzZXMgYmFja3NsYXNoZXMgb24gV2luZG93cy5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplKHA6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBwLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcbn1cblxuZnVuY3Rpb24gd3JpdGVGaWxlKGRpcjogc3RyaW5nLCByZWxhdGl2ZVBhdGg6IHN0cmluZywgY29udGVudCA9ICcnKTogc3RyaW5nIHtcbiAgY29uc3QgZnVsbFBhdGggPSBqb2luKGRpciwgcmVsYXRpdmVQYXRoKTtcbiAgbWtkaXJTeW5jKGRpcm5hbWUoZnVsbFBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgd3JpdGVGaWxlU3luYyhmdWxsUGF0aCwgY29udGVudCwgJ3V0Zi04Jyk7XG4gIHJldHVybiBmdWxsUGF0aDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQnVpbGRlcih3b3JraW5nRGlyOiBzdHJpbmcsIGRpcnM6IHN0cmluZ1tdKTogVGVzdEJ1aWxkZXIge1xuICBjb25zdCBjb25maWc6IFN0YW5kYWxvbmVDb25maWcgPSB7XG4gICAgYnVpbGRUYXJnZXQ6ICdzdGFuZGFsb25lJyxcbiAgICB3b3JraW5nRGlyLFxuICAgIGRpcnMsXG4gICAgc3RlcHNCdW5kbGVQYXRoOiBqb2luKHdvcmtpbmdEaXIsICdzdGVwcy5qcycpLFxuICAgIHdvcmtmbG93c0J1bmRsZVBhdGg6IGpvaW4od29ya2luZ0RpciwgJ3dvcmtmbG93cy5qcycpLFxuICAgIHdlYmhvb2tCdW5kbGVQYXRoOiBqb2luKHdvcmtpbmdEaXIsICd3ZWJob29rLmpzJyksXG4gIH07XG4gIHJldHVybiBuZXcgVGVzdEJ1aWxkZXIoY29uZmlnKTtcbn1cblxuZGVzY3JpYmUoJ2dldElucHV0RmlsZXMnLCAoKSA9PiB7XG4gIGxldCB0ZXN0Um9vdDogc3RyaW5nO1xuXG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIHRlc3RSb290ID0gbWtkdGVtcFN5bmMoam9pbihyZWFsVG1wZGlyLCAnZ2V0LWlucHV0LWZpbGVzLScpKTtcbiAgfSk7XG5cbiAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICBybVN5bmModGVzdFJvb3QsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgfSk7XG5cbiAgaXQoJ2Rpc2NvdmVycyBmaWxlcyBpbnNpZGUgZG90LXByZWZpeGVkIGRpcmVjdG9yaWVzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHNyY0RpciA9IGpvaW4odGVzdFJvb3QsICdzcmMnKTtcbiAgICB3cml0ZUZpbGUoc3JjRGlyLCAnLmhpZGRlbi9zdGVwLnRzJywgXCIndXNlIHN0ZXAnO1wiKTtcbiAgICB3cml0ZUZpbGUoc3JjRGlyLCAnLmNvbmZpZy93b3JrZmxvdy50cycsIFwiJ3VzZSB3b3JrZmxvdyc7XCIpO1xuICAgIHdyaXRlRmlsZShzcmNEaXIsICdyZWd1bGFyL3N0ZXAudHMnLCBcIid1c2Ugc3RlcCc7XCIpO1xuXG4gICAgY29uc3QgYnVpbGRlciA9IGNyZWF0ZUJ1aWxkZXIodGVzdFJvb3QsIFsnc3JjJ10pO1xuICAgIGNvbnN0IGZpbGVzID0gKGF3YWl0IGJ1aWxkZXIuZ2V0SW5wdXRGaWxlcygpKS5tYXAobm9ybWFsaXplKTtcblxuICAgIGV4cGVjdChmaWxlcykudG9Db250YWluKG5vcm1hbGl6ZShqb2luKHNyY0RpciwgJy5oaWRkZW4vc3RlcC50cycpKSk7XG4gICAgZXhwZWN0KGZpbGVzKS50b0NvbnRhaW4obm9ybWFsaXplKGpvaW4oc3JjRGlyLCAnLmNvbmZpZy93b3JrZmxvdy50cycpKSk7XG4gICAgZXhwZWN0KGZpbGVzKS50b0NvbnRhaW4obm9ybWFsaXplKGpvaW4oc3JjRGlyLCAncmVndWxhci9zdGVwLnRzJykpKTtcbiAgfSk7XG5cbiAgaXQoJ2Rpc2NvdmVycyBkb3QtcHJlZml4ZWQgZmlsZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgc3JjRGlyID0gam9pbih0ZXN0Um9vdCwgJ3NyYycpO1xuICAgIHdyaXRlRmlsZShzcmNEaXIsICcuaGlkZGVuLXN0ZXAudHMnLCBcIid1c2Ugc3RlcCc7XCIpO1xuICAgIHdyaXRlRmlsZShzcmNEaXIsICd2aXNpYmxlLXN0ZXAudHMnLCBcIid1c2Ugc3RlcCc7XCIpO1xuXG4gICAgY29uc3QgYnVpbGRlciA9IGNyZWF0ZUJ1aWxkZXIodGVzdFJvb3QsIFsnc3JjJ10pO1xuICAgIGNvbnN0IGZpbGVzID0gKGF3YWl0IGJ1aWxkZXIuZ2V0SW5wdXRGaWxlcygpKS5tYXAobm9ybWFsaXplKTtcblxuICAgIGV4cGVjdChmaWxlcykudG9Db250YWluKG5vcm1hbGl6ZShqb2luKHNyY0RpciwgJy5oaWRkZW4tc3RlcC50cycpKSk7XG4gICAgZXhwZWN0KGZpbGVzKS50b0NvbnRhaW4obm9ybWFsaXplKGpvaW4oc3JjRGlyLCAndmlzaWJsZS1zdGVwLnRzJykpKTtcbiAgfSk7XG5cbiAgaXQoJ3N0aWxsIGV4Y2x1ZGVzIGV4cGxpY2l0bHkgaWdub3JlZCBkb3QtZGlyZWN0b3JpZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgc3JjRGlyID0gam9pbih0ZXN0Um9vdCwgJ3NyYycpO1xuICAgIHdyaXRlRmlsZShzcmNEaXIsICcuZ2l0L2hvb2tzL3ByZS1jb21taXQudHMnKTtcbiAgICB3cml0ZUZpbGUoc3JjRGlyLCAnLm5leHQvc2VydmVyL3BhZ2UudHMnKTtcbiAgICB3cml0ZUZpbGUoc3JjRGlyLCAnLm51eHQvd29ya2Zsb3cvc3RlcHMubWpzJyk7XG4gICAgd3JpdGVGaWxlKHNyY0RpciwgJy52ZXJjZWwvb3V0cHV0L3N0ZXAudHMnKTtcbiAgICB3cml0ZUZpbGUoc3JjRGlyLCAnLnN2ZWx0ZS1raXQvb3V0cHV0L3N0ZXAudHMnKTtcbiAgICB3cml0ZUZpbGUoc3JjRGlyLCAnLndvcmtmbG93LWRhdGEvc3RhdGUudHMnKTtcbiAgICB3cml0ZUZpbGUoc3JjRGlyLCAnLndvcmtmbG93LXZpdGVzdC93b3JrZmxvd3MubWpzJyk7XG4gICAgd3JpdGVGaWxlKHNyY0RpciwgJy53ZWxsLWtub3duL3dvcmtmbG93L3JvdXRlLnRzJyk7XG4gICAgd3JpdGVGaWxlKHNyY0RpciwgJy50dXJiby9jYWNoZS9idWlsZC50cycpO1xuICAgIHdyaXRlRmlsZShzcmNEaXIsICcuY2FjaGUvYmFiZWwvcGx1Z2luLmpzJyk7XG4gICAgd3JpdGVGaWxlKHNyY0RpciwgJy55YXJuL3JlbGVhc2VzL3lhcm4uY2pzJyk7XG4gICAgd3JpdGVGaWxlKHNyY0RpciwgJy5wbnBtLXN0b3JlL3YzL2ZpbGVzLnRzJyk7XG4gICAgd3JpdGVGaWxlKHNyY0RpciwgJ25vZGVfbW9kdWxlcy9wa2cvaW5kZXgudHMnKTtcbiAgICAvLyBUaGlzIG9uZSBzaG91bGQgc3RpbGwgYmUgZm91bmRcbiAgICB3cml0ZUZpbGUoc3JjRGlyLCAnLmN1c3RvbS9zdGVwLnRzJywgXCIndXNlIHN0ZXAnO1wiKTtcblxuICAgIGNvbnN0IGJ1aWxkZXIgPSBjcmVhdGVCdWlsZGVyKHRlc3RSb290LCBbJ3NyYyddKTtcbiAgICBjb25zdCBmaWxlcyA9IChhd2FpdCBidWlsZGVyLmdldElucHV0RmlsZXMoKSkubWFwKG5vcm1hbGl6ZSk7XG5cbiAgICBleHBlY3QoZmlsZXMpLm5vdC50b0NvbnRhaW4oXG4gICAgICBub3JtYWxpemUoam9pbihzcmNEaXIsICcuZ2l0L2hvb2tzL3ByZS1jb21taXQudHMnKSlcbiAgICApO1xuICAgIGV4cGVjdChmaWxlcykubm90LnRvQ29udGFpbihcbiAgICAgIG5vcm1hbGl6ZShqb2luKHNyY0RpciwgJy5uZXh0L3NlcnZlci9wYWdlLnRzJykpXG4gICAgKTtcbiAgICBleHBlY3QoZmlsZXMpLm5vdC50b0NvbnRhaW4oXG4gICAgICBub3JtYWxpemUoam9pbihzcmNEaXIsICcubnV4dC93b3JrZmxvdy9zdGVwcy5tanMnKSlcbiAgICApO1xuICAgIGV4cGVjdChmaWxlcykubm90LnRvQ29udGFpbihcbiAgICAgIG5vcm1hbGl6ZShqb2luKHNyY0RpciwgJy52ZXJjZWwvb3V0cHV0L3N0ZXAudHMnKSlcbiAgICApO1xuICAgIGV4cGVjdChmaWxlcykubm90LnRvQ29udGFpbihcbiAgICAgIG5vcm1hbGl6ZShqb2luKHNyY0RpciwgJy5zdmVsdGUta2l0L291dHB1dC9zdGVwLnRzJykpXG4gICAgKTtcbiAgICBleHBlY3QoZmlsZXMpLm5vdC50b0NvbnRhaW4oXG4gICAgICBub3JtYWxpemUoam9pbihzcmNEaXIsICcud29ya2Zsb3ctZGF0YS9zdGF0ZS50cycpKVxuICAgICk7XG4gICAgZXhwZWN0KGZpbGVzKS5ub3QudG9Db250YWluKFxuICAgICAgbm9ybWFsaXplKGpvaW4oc3JjRGlyLCAnLndvcmtmbG93LXZpdGVzdC93b3JrZmxvd3MubWpzJykpXG4gICAgKTtcbiAgICBleHBlY3QoZmlsZXMpLm5vdC50b0NvbnRhaW4oXG4gICAgICBub3JtYWxpemUoam9pbihzcmNEaXIsICcud2VsbC1rbm93bi93b3JrZmxvdy9yb3V0ZS50cycpKVxuICAgICk7XG4gICAgZXhwZWN0KGZpbGVzKS5ub3QudG9Db250YWluKFxuICAgICAgbm9ybWFsaXplKGpvaW4oc3JjRGlyLCAnLnR1cmJvL2NhY2hlL2J1aWxkLnRzJykpXG4gICAgKTtcbiAgICBleHBlY3QoZmlsZXMpLm5vdC50b0NvbnRhaW4oXG4gICAgICBub3JtYWxpemUoam9pbihzcmNEaXIsICcuY2FjaGUvYmFiZWwvcGx1Z2luLmpzJykpXG4gICAgKTtcbiAgICBleHBlY3QoZmlsZXMpLm5vdC50b0NvbnRhaW4oXG4gICAgICBub3JtYWxpemUoam9pbihzcmNEaXIsICcueWFybi9yZWxlYXNlcy95YXJuLmNqcycpKVxuICAgICk7XG4gICAgZXhwZWN0KGZpbGVzKS5ub3QudG9Db250YWluKFxuICAgICAgbm9ybWFsaXplKGpvaW4oc3JjRGlyLCAnLnBucG0tc3RvcmUvdjMvZmlsZXMudHMnKSlcbiAgICApO1xuICAgIGV4cGVjdChmaWxlcykubm90LnRvQ29udGFpbihcbiAgICAgIG5vcm1hbGl6ZShqb2luKHNyY0RpciwgJ25vZGVfbW9kdWxlcy9wa2cvaW5kZXgudHMnKSlcbiAgICApO1xuICAgIGV4cGVjdChmaWxlcykudG9Db250YWluKG5vcm1hbGl6ZShqb2luKHNyY0RpciwgJy5jdXN0b20vc3RlcC50cycpKSk7XG4gIH0pO1xuXG4gIGl0KCdkaXNjb3ZlcnMgZmlsZXMgd2l0aCB2YXJpb3VzIHN1cHBvcnRlZCBleHRlbnNpb25zIGluIGRvdC1kaXJlY3RvcmllcycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBzcmNEaXIgPSBqb2luKHRlc3RSb290LCAnc3JjJyk7XG4gICAgd3JpdGVGaWxlKHNyY0RpciwgJy5hcGkvcm91dGUudHN4Jyk7XG4gICAgd3JpdGVGaWxlKHNyY0RpciwgJy5hcGkvaGFuZGxlci5tdHMnKTtcbiAgICB3cml0ZUZpbGUoc3JjRGlyLCAnLmFwaS91dGlscy5qcycpO1xuICAgIHdyaXRlRmlsZShzcmNEaXIsICcuYXBpL2NvbmZpZy5janMnKTtcblxuICAgIGNvbnN0IGJ1aWxkZXIgPSBjcmVhdGVCdWlsZGVyKHRlc3RSb290LCBbJ3NyYyddKTtcbiAgICBjb25zdCBmaWxlcyA9IChhd2FpdCBidWlsZGVyLmdldElucHV0RmlsZXMoKSkubWFwKG5vcm1hbGl6ZSk7XG5cbiAgICBleHBlY3QoZmlsZXMpLnRvQ29udGFpbihub3JtYWxpemUoam9pbihzcmNEaXIsICcuYXBpL3JvdXRlLnRzeCcpKSk7XG4gICAgZXhwZWN0KGZpbGVzKS50b0NvbnRhaW4obm9ybWFsaXplKGpvaW4oc3JjRGlyLCAnLmFwaS9oYW5kbGVyLm10cycpKSk7XG4gICAgZXhwZWN0KGZpbGVzKS50b0NvbnRhaW4obm9ybWFsaXplKGpvaW4oc3JjRGlyLCAnLmFwaS91dGlscy5qcycpKSk7XG4gICAgZXhwZWN0KGZpbGVzKS50b0NvbnRhaW4obm9ybWFsaXplKGpvaW4oc3JjRGlyLCAnLmFwaS9jb25maWcuY2pzJykpKTtcbiAgfSk7XG59KTtcbiJdfQ==
126
+ describe('ensureSwcIgnored', () => {
127
+ let testRoot;
128
+ beforeEach(() => {
129
+ testRoot = mkdtempSync(join(realTmpdir, 'swc-gitignore-'));
130
+ });
131
+ afterEach(() => {
132
+ rmSync(testRoot, { recursive: true, force: true });
133
+ });
134
+ it('adds .swc to the project .gitignore once', async () => {
135
+ writeFile(testRoot, '.gitignore', 'node_modules\n');
136
+ const builder = createBuilder(testRoot, ['src']);
137
+ await builder.ensureSwcIgnored();
138
+ await builder.ensureSwcIgnored();
139
+ const gitignore = readFileSync(join(testRoot, '.gitignore'), 'utf-8');
140
+ const swcEntries = gitignore
141
+ .split(/\r?\n/)
142
+ .filter((line) => line.trim() === '/.swc');
143
+ expect(gitignore).toBe('node_modules\n/.swc\n');
144
+ expect(swcEntries).toHaveLength(1);
145
+ });
146
+ it('preserves existing .swc gitignore variants', async () => {
147
+ writeFile(testRoot, '.gitignore', 'node_modules\n.swc/\n');
148
+ const builder = createBuilder(testRoot, ['src']);
149
+ await builder.ensureSwcIgnored();
150
+ expect(readFileSync(join(testRoot, '.gitignore'), 'utf-8')).toBe('node_modules\n.swc/\n');
151
+ });
152
+ });
153
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LWlucHV0LWZpbGVzLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZ2V0LWlucHV0LWZpbGVzLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxXQUFXLEVBQ1gsWUFBWSxFQUNaLFlBQVksRUFDWixNQUFNLEVBQ04sYUFBYSxHQUNkLE1BQU0sU0FBUyxDQUFDO0FBQ2pCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDakMsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDMUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDckUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBR2hEOztHQUVHO0FBQ0gsTUFBTSxXQUFZLFNBQVEsV0FBVztJQUNuQyxLQUFLLENBQUMsS0FBSztRQUNULFFBQVE7SUFDVixDQUFDO0lBRUQsbUJBQW1CO0lBQ1osYUFBYTtRQUNsQixPQUFPLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRU0sZ0JBQWdCO1FBQ3JCLE9BQU8sS0FBSyxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDbEMsQ0FBQztDQUNGO0FBRUQsd0VBQXdFO0FBQ3hFLE1BQU0sVUFBVSxHQUFHLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0FBRTFDOzs7O0dBSUc7QUFDSCxTQUFTLFNBQVMsQ0FBQyxDQUFTO0lBQzFCLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDL0IsQ0FBQztBQUVELFNBQVMsU0FBUyxDQUFDLEdBQVcsRUFBRSxZQUFvQixFQUFFLE9BQU8sR0FBRyxFQUFFO0lBQ2hFLE1BQU0sUUFBUSxHQUFHLElBQUks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QUFDLENBQUM7UUFDaEQsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyQyxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyw0Q0FBNEMsRUFBRSxLQUFLLElBQUksRUFBRTtRQUMxRCxTQUFTLENBQUMsUUFBUSxFQUFFLFlBQVksRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO1FBRTNELE1BQU0sT0FBTyxHQUFHLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBRWpELE1BQU0sT0FBTyxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFFakMsTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUM5RCx1QkFBdUIsQ0FDeEIsQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBta2RpclN5bmMsXG4gIG1rZHRlbXBTeW5jLFxuICByZWFkRmlsZVN5bmMsXG4gIHJlYWxwYXRoU3luYyxcbiAgcm1TeW5jLFxuICB3cml0ZUZpbGVTeW5jLFxufSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHsgZGlybmFtZSwgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyBhZnRlckVhY2gsIGJlZm9yZUVhY2gsIGRlc2NyaWJlLCBleHBlY3QsIGl0IH0gZnJvbSAndml0ZXN0JztcbmltcG9ydCB7IEJhc2VCdWlsZGVyIH0gZnJvbSAnLi9iYXNlLWJ1aWxkZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBTdGFuZGFsb25lQ29uZmlnIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbi8qKlxuICogTWluaW1hbCBzdWJjbGFzcyB0byBleHBvc2UgdGhlIHByb3RlY3RlZCBgZ2V0SW5wdXRGaWxlcygpYCBmb3IgdGVzdGluZy5cbiAqL1xuY2xhc3MgVGVzdEJ1aWxkZXIgZXh0ZW5kcyBCYXNlQnVpbGRlciB7XG4gIGFzeW5jIGJ1aWxkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIG5vLW9wXG4gIH1cblxuICAvLyBFeHBvc2UgZm9yIHRlc3RzXG4gIHB1YmxpYyBnZXRJbnB1dEZpbGVzKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICByZXR1cm4gc3VwZXIuZ2V0SW5wdXRGaWxlcygpO1xuICB9XG5cbiAgcHVibGljIGVuc3VyZVN3Y0lnbm9yZWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHN1cGVyLmVuc3VyZVN3Y0lnbm9yZWQoKTtcbiAgfVxufVxuXG4vLyBSZXNvbHZlIHN5bWxpbmtzIGluIHRtcGRpciB0byBhdm9pZCBtYWNPUyAvdmFyIC0+IC9wcml2YXRlL3ZhciBpc3N1ZXNcbmNvbnN0IHJlYWxUbXBkaXIgPSByZWFscGF0aFN5bmModG1wZGlyKCkpO1xuXG4vKipcbiAqIE5vcm1hbGl6ZSBhIHBhdGggdG8gZm9yd2FyZCBzbGFzaGVzIGZvciBjcm9zcy1wbGF0Zm9ybSBjb21wYXJpc29uLlxuICogdGlueWdsb2JieSBhbHdheXMgcmV0dXJucyBmb3J3YXJkLXNsYXNoIHBhdGhzLCBldmVuIG9uIFdpbmRvd3MsXG4gKiB3aGlsZSBOb2RlJ3MgYHBhdGguam9pbigpYCB1c2VzIGJhY2tzbGFzaGVzIG9uIFdpbmRvd3MuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZShwOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcC5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG59XG5cbmZ1bmN0aW9uIHdyaXRlRmlsZShkaXI6IHN0cmluZywgcmVsYXRpdmVQYXRoOiBzdHJpbmcsIGNvbnRlbnQgPSAnJyk6IHN0cmluZyB7XG4gIGNvbnN0IGZ1bGxQYXRoID0gam9pbihkaXIsIHJlbGF0aXZlUGF0aCk7XG4gIG1rZGlyU3luYyhkaXJuYW1lKGZ1bGxQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIHdyaXRlRmlsZVN5bmMoZnVsbFBhdGgsIGNvbnRlbnQsICd1dGYtOCcpO1xuICByZXR1cm4gZnVsbFBhdGg7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUJ1aWxkZXIod29ya2luZ0Rpcjogc3RyaW5nLCBkaXJzOiBzdHJpbmdbXSk6IFRlc3RCdWlsZGVyIHtcbiAgY29uc3QgY29uZmlnOiBTdGFuZGFsb25lQ29uZmlnID0ge1xuICAgIGJ1aWxkVGFyZ2V0OiAnc3RhbmRhbG9uZScsXG4gICAgd29ya2luZ0RpcixcbiAgICBkaXJzLFxuICAgIHN0ZXBzQnVuZGxlUGF0aDogam9pbih3b3JraW5nRGlyLCAnc3RlcHMuanMnKSxcbiAgICB3b3JrZmxvd3NCdW5kbGVQYXRoOiBqb2luKHdvcmtpbmdEaXIsICd3b3JrZmxvd3MuanMnKSxcbiAgICB3ZWJob29rQnVuZGxlUGF0aDogam9pbih3b3JraW5nRGlyLCAnd2ViaG9vay5qcycpLFxuICB9O1xuICByZXR1cm4gbmV3IFRlc3RCdWlsZGVyKGNvbmZpZyk7XG59XG5cbmRlc2NyaWJlKCdnZXRJbnB1dEZpbGVzJywgKCkgPT4ge1xuICBsZXQgdGVzdFJvb3Q6IHN0cmluZztcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICB0ZXN0Um9vdCA9IG1rZHRlbXBTeW5jKGpvaW4ocmVhbFRtcGRpciwgJ2dldC1pbnB1dC1maWxlcy0nKSk7XG4gIH0pO1xuXG4gIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgcm1TeW5jKHRlc3RSb290LCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gIH0pO1xuXG4gIGl0KCdkaXNjb3ZlcnMgZmlsZXMgaW5zaWRlIGRvdC1wcmVmaXhlZCBkaXJlY3RvcmllcycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBzcmNEaXIgPSBqb2luKHRlc3RSb290LCAnc3JjJyk7XG4gICAgd3JpdGVGaWxlKHNyY0RpciwgJy5oaWRkZW4vc3RlcC50cycsIFwiJ3VzZSBzdGVwJztcIik7XG4gICAgd3JpdGVGaWxlKHNyY0RpciwgJy5jb25maWcvd29ya2Zsb3cudHMnLCBcIid1c2Ugd29ya2Zsb3cnO1wiKTtcbiAgICB3cml0ZUZpbGUoc3JjRGlyLCAncmVndWxhci9zdGVwLnRzJywgXCIndXNlIHN0ZXAnO1wiKTtcblxuICAgIGNvbnN0IGJ1aWxkZXIgPSBjcmVhdGVCdWlsZGVyKHRlc3RSb290LCBbJ3NyYyddKTtcbiAgICBjb25zdCBmaWxlcyA9IChhd2FpdCBidWlsZGVyLmdldElucHV0RmlsZXMoKSkubWFwKG5vcm1hbGl6ZSk7XG5cbiAgICBleHBlY3QoZmlsZXMpLnRvQ29udGFpbihub3JtYWxpemUoam9pbihzcmNEaXIsICcuaGlkZGVuL3N0ZXAudHMnKSkpO1xuICAgIGV4cGVjdChmaWxlcykudG9Db250YWluKG5vcm1hbGl6ZShqb2luKHNyY0RpciwgJy5jb25maWcvd29ya2Zsb3cudHMnKSkpO1xuICAgIGV4cGVjdChmaWxlcykudG9Db250YWluKG5vcm1hbGl6ZShqb2luKHNyY0RpciwgJ3JlZ3VsYXIvc3RlcC50cycpKSk7XG4gIH0pO1xuXG4gIGl0KCdkaXNjb3ZlcnMgZG90LXByZWZpeGVkIGZpbGVzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHNyY0RpciA9IGpvaW4odGVzdFJvb3QsICdzcmMnKTtcbiAgICB3cml0ZUZpbGUoc3JjRGlyLCAnLmhpZGRlbi1zdGVwLnRzJywgXCIndXNlIHN0ZXAnO1wiKTtcbiAgICB3cml0ZUZpbGUoc3JjRGlyLCAndmlzaWJsZS1zdGVwLnRzJywgXCIndXNlIHN0ZXAnO1wiKTtcblxuICAgIGNvbnN0IGJ1aWxkZXIgPSBjcmVhdGVCdWlsZGVyKHRlc3RSb290LCBbJ3NyYyddKTtcbiAgICBjb25zdCBmaWxlcyA9IChhd2FpdCBidWlsZGVyLmdldElucHV0RmlsZXMoKSkubWFwKG5vcm1hbGl6ZSk7XG5cbiAgICBleHBlY3QoZmlsZXMpLnRvQ29udGFpbihub3JtYWxpemUoam9pbihzcmNEaXIsICcuaGlkZGVuLXN0ZXAudHMnKSkpO1xuICAgIGV4cGVjdChmaWxlcykudG9Db250YWluKG5vcm1hbGl6ZShqb2luKHNyY0RpciwgJ3Zpc2libGUtc3RlcC50cycpKSk7XG4gIH0pO1xuXG4gIGl0KCdzdGlsbCBleGNsdWRlcyBleHBsaWNpdGx5IGlnbm9yZWQgZG90LWRpcmVjdG9yaWVzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHNyY0RpciA9IGpvaW4odGVzdFJvb3QsICdzcmMnKTtcbiAgICB3cml0ZUZpbGUoc3JjRGlyLCAnLmdpdC9ob29rcy9wcmUtY29tbWl0LnRzJyk7XG4gICAgd3JpdGVGaWxlKHNyY0RpciwgJy5uZXh0L3NlcnZlci9wYWdlLnRzJyk7XG4gICAgd3JpdGVGaWxlKHNyY0RpciwgJy5udXh0L3dvcmtmbG93L3N0ZXBzLm1qcycpO1xuICAgIHdyaXRlRmlsZShzcmNEaXIsICcudmVyY2VsL291dHB1dC9zdGVwLnRzJyk7XG4gICAgd3JpdGVGaWxlKHNyY0RpciwgJy5zdmVsdGUta2l0L291dHB1dC9zdGVwLnRzJyk7XG4gICAgd3JpdGVGaWxlKHNyY0RpciwgJy53b3JrZmxvdy1kYXRhL3N0YXRlLnRzJyk7XG4gICAgd3JpdGVGaWxlKHNyY0RpciwgJy53b3JrZmxvdy12aXRlc3Qvd29ya2Zsb3dzLm1qcycpO1xuICAgIHdyaXRlRmlsZShzcmNEaXIsICcud2VsbC1rbm93bi93b3JrZmxvdy9yb3V0ZS50cycpO1xuICAgIHdyaXRlRmlsZShzcmNEaXIsICcuc3djL2NhY2hlL3BsdWdpbi1vdXRwdXQudHMnKTtcbiAgICB3cml0ZUZpbGUoc3JjRGlyLCAnLnR1cmJvL2NhY2hlL2J1aWxkLnRzJyk7XG4gICAgd3JpdGVGaWxlKHNyY0RpciwgJy5jYWNoZS9iYWJlbC9wbHVnaW4uanMnKTtcbiAgICB3cml0ZUZpbGUoc3JjRGlyLCAnLnlhcm4vcmVsZWFzZXMveWFybi5janMnKTtcbiAgICB3cml0ZUZpbGUoc3JjRGlyLCAnLnBucG0tc3RvcmUvdjMvZmlsZXMudHMnKTtcbiAgICB3cml0ZUZpbGUoc3JjRGlyLCAnbm9kZV9tb2R1bGVzL3BrZy9pbmRleC50cycpO1xuICAgIC8vIFRoaXMgb25lIHNob3VsZCBzdGlsbCBiZSBmb3VuZFxuICAgIHdyaXRlRmlsZShzcmNEaXIsICcuY3VzdG9tL3N0ZXAudHMnLCBcIid1c2Ugc3RlcCc7XCIpO1xuXG4gICAgY29uc3QgYnVpbGRlciA9IGNyZWF0ZUJ1aWxkZXIodGVzdFJvb3QsIFsnc3JjJ10pO1xuICAgIGNvbnN0IGZpbGVzID0gKGF3YWl0IGJ1aWxkZXIuZ2V0SW5wdXRGaWxlcygpKS5tYXAobm9ybWFsaXplKTtcblxuICAgIGV4cGVjdChmaWxlcykubm90LnRvQ29udGFpbihcbiAgICAgIG5vcm1hbGl6ZShqb2luKHNyY0RpciwgJy5naXQvaG9va3MvcHJlLWNvbW1pdC50cycpKVxuICAgICk7XG4gICAgZXhwZWN0KGZpbGVzKS5ub3QudG9Db250YWluKFxuICAgICAgbm9ybWFsaXplKGpvaW4oc3JjRGlyLCAnLm5leHQvc2VydmVyL3BhZ2UudHMnKSlcbiAgICApO1xuICAgIGV4cGVjdChmaWxlcykubm90LnRvQ29udGFpbihcbiAgICAgIG5vcm1hbGl6ZShqb2luKHNyY0RpciwgJy5udXh0L3dvcmtmbG93L3N0ZXBzLm1qcycpKVxuICAgICk7XG4gICAgZXhwZWN0KGZpbGVzKS5ub3QudG9Db250YWluKFxuICAgICAgbm9ybWFsaXplKGpvaW4oc3JjRGlyLCAnLnZlcmNlbC9vdXRwdXQvc3RlcC50cycpKVxuICAgICk7XG4gICAgZXhwZWN0KGZpbGVzKS5ub3QudG9Db250YWluKFxuICAgICAgbm9ybWFsaXplKGpvaW4oc3JjRGlyLCAnLnN2ZWx0ZS1raXQvb3V0cHV0L3N0ZXAudHMnKSlcbiAgICApO1xuICAgIGV4cGVjdChmaWxlcykubm90LnRvQ29udGFpbihcbiAgICAgIG5vcm1hbGl6ZShqb2luKHNyY0RpciwgJy53b3JrZmxvdy1kYXRhL3N0YXRlLnRzJykpXG4gICAgKTtcbiAgICBleHBlY3QoZmlsZXMpLm5vdC50b0NvbnRhaW4oXG4gICAgICBub3JtYWxpemUoam9pbihzcmNEaXIsICcud29ya2Zsb3ctdml0ZXN0L3dvcmtmbG93cy5tanMnKSlcbiAgICApO1xuICAgIGV4cGVjdChmaWxlcykubm90LnRvQ29udGFpbihcbiAgICAgIG5vcm1hbGl6ZShqb2luKHNyY0RpciwgJy53ZWxsLWtub3duL3dvcmtmbG93L3JvdXRlLnRzJykpXG4gICAgKTtcbiAgICBleHBlY3QoZmlsZXMpLm5vdC50b0NvbnRhaW4oXG4gICAgICBub3JtYWxpemUoam9pbihzcmNEaXIsICcuc3djL2NhY2hlL3BsdWdpbi1vdXRwdXQudHMnKSlcbiAgICApO1xuICAgIGV4cGVjdChmaWxlcykubm90LnRvQ29udGFpbihcbiAgICAgIG5vcm1hbGl6ZShqb2luKHNyY0RpciwgJy50dXJiby9jYWNoZS9idWlsZC50cycpKVxuICAgICk7XG4gICAgZXhwZWN0KGZpbGVzKS5ub3QudG9Db250YWluKFxuICAgICAgbm9ybWFsaXplKGpvaW4oc3JjRGlyLCAnLmNhY2hlL2JhYmVsL3BsdWdpbi5qcycpKVxuICAgICk7XG4gICAgZXhwZWN0KGZpbGVzKS5ub3QudG9Db250YWluKFxuICAgICAgbm9ybWFsaXplKGpvaW4oc3JjRGlyLCAnLnlhcm4vcmVsZWFzZXMveWFybi5janMnKSlcbiAgICApO1xuICAgIGV4cGVjdChmaWxlcykubm90LnRvQ29udGFpbihcbiAgICAgIG5vcm1hbGl6ZShqb2luKHNyY0RpciwgJy5wbnBtLXN0b3JlL3YzL2ZpbGVzLnRzJykpXG4gICAgKTtcbiAgICBleHBlY3QoZmlsZXMpLm5vdC50b0NvbnRhaW4oXG4gICAgICBub3JtYWxpemUoam9pbihzcmNEaXIsICdub2RlX21vZHVsZXMvcGtnL2luZGV4LnRzJykpXG4gICAgKTtcbiAgICBleHBlY3QoZmlsZXMpLnRvQ29udGFpbihub3JtYWxpemUoam9pbihzcmNEaXIsICcuY3VzdG9tL3N0ZXAudHMnKSkpO1xuICB9KTtcblxuICBpdCgnZGlzY292ZXJzIGZpbGVzIHdpdGggdmFyaW91cyBzdXBwb3J0ZWQgZXh0ZW5zaW9ucyBpbiBkb3QtZGlyZWN0b3JpZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgc3JjRGlyID0gam9pbih0ZXN0Um9vdCwgJ3NyYycpO1xuICAgIHdyaXRlRmlsZShzcmNEaXIsICcuYXBpL3JvdXRlLnRzeCcpO1xuICAgIHdyaXRlRmlsZShzcmNEaXIsICcuYXBpL2hhbmRsZXIubXRzJyk7XG4gICAgd3JpdGVGaWxlKHNyY0RpciwgJy5hcGkvdXRpbHMuanMnKTtcbiAgICB3cml0ZUZpbGUoc3JjRGlyLCAnLmFwaS9jb25maWcuY2pzJyk7XG5cbiAgICBjb25zdCBidWlsZGVyID0gY3JlYXRlQnVpbGRlcih0ZXN0Um9vdCwgWydzcmMnXSk7XG4gICAgY29uc3QgZmlsZXMgPSAoYXdhaXQgYnVpbGRlci5nZXRJbnB1dEZpbGVzKCkpLm1hcChub3JtYWxpemUpO1xuXG4gICAgZXhwZWN0KGZpbGVzKS50b0NvbnRhaW4obm9ybWFsaXplKGpvaW4oc3JjRGlyLCAnLmFwaS9yb3V0ZS50c3gnKSkpO1xuICAgIGV4cGVjdChmaWxlcykudG9Db250YWluKG5vcm1hbGl6ZShqb2luKHNyY0RpciwgJy5hcGkvaGFuZGxlci5tdHMnKSkpO1xuICAgIGV4cGVjdChmaWxlcykudG9Db250YWluKG5vcm1hbGl6ZShqb2luKHNyY0RpciwgJy5hcGkvdXRpbHMuanMnKSkpO1xuICAgIGV4cGVjdChmaWxlcykudG9Db250YWluKG5vcm1hbGl6ZShqb2luKHNyY0RpciwgJy5hcGkvY29uZmlnLmNqcycpKSk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdlbnN1cmVTd2NJZ25vcmVkJywgKCkgPT4ge1xuICBsZXQgdGVzdFJvb3Q6IHN0cmluZztcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICB0ZXN0Um9vdCA9IG1rZHRlbXBTeW5jKGpvaW4ocmVhbFRtcGRpciwgJ3N3Yy1naXRpZ25vcmUtJykpO1xuICB9KTtcblxuICBhZnRlckVhY2goKCkgPT4ge1xuICAgIHJtU3luYyh0ZXN0Um9vdCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICB9KTtcblxuICBpdCgnYWRkcyAuc3djIHRvIHRoZSBwcm9qZWN0IC5naXRpZ25vcmUgb25jZScsIGFzeW5jICgpID0+IHtcbiAgICB3cml0ZUZpbGUodGVzdFJvb3QsICcuZ2l0aWdub3JlJywgJ25vZGVfbW9kdWxlc1xcbicpO1xuXG4gICAgY29uc3QgYnVpbGRlciA9IGNyZWF0ZUJ1aWxkZXIodGVzdFJvb3QsIFsnc3JjJ10pO1xuXG4gICAgYXdhaXQgYnVpbGRlci5lbnN1cmVTd2NJZ25vcmVkKCk7XG4gICAgYXdhaXQgYnVpbGRlci5lbnN1cmVTd2NJZ25vcmVkKCk7XG5cbiAgICBjb25zdCBnaXRpZ25vcmUgPSByZWFkRmlsZVN5bmMoam9pbih0ZXN0Um9vdCwgJy5naXRpZ25vcmUnKSwgJ3V0Zi04Jyk7XG4gICAgY29uc3Qgc3djRW50cmllcyA9IGdpdGlnbm9yZVxuICAgICAgLnNwbGl0KC9cXHI/XFxuLylcbiAgICAgIC5maWx0ZXIoKGxpbmUpID0+IGxpbmUudHJpbSgpID09PSAnLy5zd2MnKTtcblxuICAgIGV4cGVjdChnaXRpZ25vcmUpLnRvQmUoJ25vZGVfbW9kdWxlc1xcbi8uc3djXFxuJyk7XG4gICAgZXhwZWN0KHN3Y0VudHJpZXMpLnRvSGF2ZUxlbmd0aCgxKTtcbiAgfSk7XG5cbiAgaXQoJ3ByZXNlcnZlcyBleGlzdGluZyAuc3djIGdpdGlnbm9yZSB2YXJpYW50cycsIGFzeW5jICgpID0+IHtcbiAgICB3cml0ZUZpbGUodGVzdFJvb3QsICcuZ2l0aWdub3JlJywgJ25vZGVfbW9kdWxlc1xcbi5zd2MvXFxuJyk7XG5cbiAgICBjb25zdCBidWlsZGVyID0gY3JlYXRlQnVpbGRlcih0ZXN0Um9vdCwgWydzcmMnXSk7XG5cbiAgICBhd2FpdCBidWlsZGVyLmVuc3VyZVN3Y0lnbm9yZWQoKTtcblxuICAgIGV4cGVjdChyZWFkRmlsZVN5bmMoam9pbih0ZXN0Um9vdCwgJy5naXRpZ25vcmUnKSwgJ3V0Zi04JykpLnRvQmUoXG4gICAgICAnbm9kZV9tb2R1bGVzXFxuLnN3Yy9cXG4nXG4gICAgKTtcbiAgfSk7XG59KTtcbiJdfQ==
package/dist/index.d.ts CHANGED
@@ -1,8 +1,8 @@
1
1
  export type { WorkflowManifest } from './apply-swc-transform.js';
2
2
  export { applySwcTransform } from './apply-swc-transform.js';
3
- export { BaseBuilder } from './base-builder.js';
3
+ export { BaseBuilder, type DiscoveredEntries } from './base-builder.js';
4
4
  export { createBuildQueue } from './build-queue.js';
5
- export { createBaseBuilderConfig, type DecoratorOptions, type DecoratorOptionsWithConfigPath, getDecoratorOptionsForDirectory, getDecoratorOptionsForDirectoryWithConfigPath, } from './config-helpers.js';
5
+ export { createBaseBuilderConfig, type DecoratorOptions, type DecoratorOptionsWithConfigPath, getDecoratorOptionsForDirectory, getDecoratorOptionsForDirectoryWithConfigPath, resolveConfiguredProjectRoot, resolveProjectRoot, } from './config-helpers.js';
6
6
  export { createStepQueueTrigger, createWorkflowEntrypointOptionsCode, createWorkflowQueueTrigger, STEP_QUEUE_TRIGGER, WORKFLOW_QUEUE_TRIGGER, } from './constants.js';
7
7
  export { createDiscoverEntriesPlugin } from './discover-entries-esbuild-plugin.js';
8
8
  export { clearModuleSpecifierCache, getImportPath, type ImportPathResult, type ModuleSpecifierResult, resolveModuleSpecifier, } from './module-specifier.js';