@workflow/builders 5.0.0-beta.3 → 5.0.0-beta.30
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/dist/apply-swc-transform.d.ts +7 -2
- package/dist/apply-swc-transform.d.ts.map +1 -1
- package/dist/apply-swc-transform.js +10 -4
- package/dist/base-builder-logging.test.d.ts +2 -0
- package/dist/base-builder-logging.test.d.ts.map +1 -0
- package/dist/base-builder-logging.test.js +99 -0
- package/dist/base-builder.d.ts +127 -13
- package/dist/base-builder.d.ts.map +1 -1
- package/dist/base-builder.js +812 -102
- package/dist/build-queue.js +1 -1
- package/dist/config-helpers.d.ts +4 -1
- package/dist/config-helpers.d.ts.map +1 -1
- package/dist/config-helpers.js +63 -1
- package/dist/config-helpers.test.d.ts +2 -0
- package/dist/config-helpers.test.d.ts.map +1 -0
- package/dist/config-helpers.test.js +17 -0
- package/dist/constants.d.ts +31 -5
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +71 -19
- package/dist/constants.test.d.ts +2 -0
- package/dist/constants.test.d.ts.map +1 -0
- package/dist/constants.test.js +40 -0
- package/dist/discover-entries-esbuild-plugin.d.ts +3 -1
- package/dist/discover-entries-esbuild-plugin.d.ts.map +1 -1
- package/dist/discover-entries-esbuild-plugin.js +24 -4
- package/dist/discover-entries-esbuild-plugin.test.js +1 -1
- package/dist/esbuild-tsconfig.js +1 -1
- package/dist/esbuild-tsconfig.test.js +1 -1
- package/dist/external-package-warning.test.d.ts +2 -0
- package/dist/external-package-warning.test.d.ts.map +1 -0
- package/dist/external-package-warning.test.js +219 -0
- package/dist/fast-discovery.d.ts +20 -0
- package/dist/fast-discovery.d.ts.map +1 -0
- package/dist/fast-discovery.js +774 -0
- package/dist/fast-discovery.test.d.ts +2 -0
- package/dist/fast-discovery.test.d.ts.map +1 -0
- package/dist/fast-discovery.test.js +336 -0
- package/dist/get-input-files.test.js +34 -2
- package/dist/index.d.ts +8 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -4
- package/dist/module-specifier.d.ts +20 -2
- package/dist/module-specifier.d.ts.map +1 -1
- package/dist/module-specifier.js +92 -17
- package/dist/module-specifier.test.js +45 -3
- package/dist/node-compat-banner.d.ts +15 -0
- package/dist/node-compat-banner.d.ts.map +1 -0
- package/dist/node-compat-banner.js +15 -0
- package/dist/node-module-esbuild-plugin.d.ts.map +1 -1
- package/dist/node-module-esbuild-plugin.js +73 -23
- package/dist/node-module-esbuild-plugin.test.js +97 -1
- package/dist/optional-otel-api.d.ts +14 -0
- package/dist/optional-otel-api.d.ts.map +1 -0
- package/dist/optional-otel-api.js +14 -0
- package/dist/optional-pg-native-alias.d.ts +2 -0
- package/dist/optional-pg-native-alias.d.ts.map +1 -0
- package/dist/optional-pg-native-alias.js +3 -0
- package/dist/optional-pg-native.d.ts +3 -0
- package/dist/optional-pg-native.d.ts.map +1 -0
- package/dist/optional-pg-native.js +3 -0
- package/dist/optional-typescript-alias.d.ts +2 -0
- package/dist/optional-typescript-alias.d.ts.map +1 -0
- package/dist/optional-typescript-alias.js +3 -0
- package/dist/optional-typescript.d.ts +3 -0
- package/dist/optional-typescript.d.ts.map +1 -0
- package/dist/optional-typescript.js +9 -0
- package/dist/pseudo-package-esbuild-plugin.js +1 -1
- package/dist/pseudo-package-esbuild-plugin.test.js +1 -1
- package/dist/request-converter.js +1 -1
- package/dist/resolve-sourcemap.test.d.ts +2 -0
- package/dist/resolve-sourcemap.test.d.ts.map +1 -0
- package/dist/resolve-sourcemap.test.js +194 -0
- package/dist/serde-checker.js +1 -1
- package/dist/standalone.d.ts +0 -3
- package/dist/standalone.d.ts.map +1 -1
- package/dist/standalone.js +12 -41
- package/dist/step-source-registration.test.d.ts +2 -0
- package/dist/step-source-registration.test.d.ts.map +1 -0
- package/dist/step-source-registration.test.js +82 -0
- package/dist/swc-esbuild-plugin.d.ts +10 -0
- package/dist/swc-esbuild-plugin.d.ts.map +1 -1
- package/dist/swc-esbuild-plugin.js +116 -14
- package/dist/swc-esbuild-plugin.test.js +370 -6
- package/dist/transform-utils.d.ts.map +1 -1
- package/dist/transform-utils.js +45 -6
- package/dist/transform-utils.test.js +78 -6
- package/dist/types.d.ts +38 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -1
- package/dist/vercel-build-output-api.d.ts +0 -2
- package/dist/vercel-build-output-api.d.ts.map +1 -1
- package/dist/vercel-build-output-api.js +31 -59
- package/dist/workflow-alias.js +1 -1
- package/dist/workflow-alias.test.js +1 -1
- package/dist/workflows-extractor.js +8 -3
- package/dist/workflows-extractor.test.d.ts +2 -0
- package/dist/workflows-extractor.test.d.ts.map +1 -0
- package/dist/workflows-extractor.test.js +70 -0
- package/dist/world-target.d.ts +20 -0
- package/dist/world-target.d.ts.map +1 -0
- package/dist/world-target.js +74 -0
- package/dist/world-target.test.d.ts +2 -0
- package/dist/world-target.test.d.ts.map +1 -0
- package/dist/world-target.test.js +106 -0
- package/package.json +9 -7
- package/dist/apply-swc-transform.js.map +0 -1
- package/dist/base-builder.js.map +0 -1
- package/dist/build-queue.js.map +0 -1
- package/dist/config-helpers.js.map +0 -1
- package/dist/constants.js.map +0 -1
- package/dist/discover-entries-esbuild-plugin.js.map +0 -1
- package/dist/discover-entries-esbuild-plugin.test.js.map +0 -1
- package/dist/esbuild-tsconfig.js.map +0 -1
- package/dist/esbuild-tsconfig.test.js.map +0 -1
- package/dist/get-input-files.test.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/module-specifier.js.map +0 -1
- package/dist/module-specifier.test.js.map +0 -1
- package/dist/node-module-esbuild-plugin.js.map +0 -1
- package/dist/node-module-esbuild-plugin.test.js.map +0 -1
- package/dist/pseudo-package-esbuild-plugin.js.map +0 -1
- package/dist/pseudo-package-esbuild-plugin.test.js.map +0 -1
- package/dist/request-converter.js.map +0 -1
- package/dist/serde-checker.js.map +0 -1
- package/dist/standalone.js.map +0 -1
- package/dist/swc-esbuild-plugin.js.map +0 -1
- package/dist/swc-esbuild-plugin.test.js.map +0 -1
- package/dist/transform-utils.js.map +0 -1
- package/dist/transform-utils.test.js.map +0 -1
- package/dist/types.js.map +0 -1
- package/dist/vercel-build-output-api.js.map +0 -1
- package/dist/workflow-alias.js.map +0 -1
- package/dist/workflow-alias.test.js.map +0 -1
- package/dist/workflows-extractor.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fast-discovery.test.d.ts","sourceRoot":"","sources":["../src/fast-discovery.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,336 @@
|
|
|
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('discovers files reached through tsconfig path aliases', async () => {
|
|
100
|
+
const entryFile = join(testRoot, 'src', 'entry.ts');
|
|
101
|
+
const registryFile = join(testRoot, 'src', '_workflows.ts');
|
|
102
|
+
const workflowFile = join(testRoot, 'src', 'workflows', 'workflow.ts');
|
|
103
|
+
const tsconfigFile = join(testRoot, 'tsconfig.json');
|
|
104
|
+
writeFile(tsconfigFile, JSON.stringify({
|
|
105
|
+
compilerOptions: {
|
|
106
|
+
paths: {
|
|
107
|
+
'@/*': ['./src/*'],
|
|
108
|
+
},
|
|
109
|
+
},
|
|
110
|
+
}));
|
|
111
|
+
writeFile(entryFile, `import { allWorkflows } from '@/_workflows';\n`);
|
|
112
|
+
writeFile(registryFile, `import * as workflow from './workflows/workflow';
|
|
113
|
+
export const allWorkflows = { workflow };
|
|
114
|
+
`);
|
|
115
|
+
writeFile(workflowFile, `export async function run() {
|
|
116
|
+
'use workflow';
|
|
117
|
+
return 'ok';
|
|
118
|
+
}
|
|
119
|
+
`);
|
|
120
|
+
const discovered = await createBuilder(testRoot).discoverEntriesPublic([entryFile], join(testRoot, 'out'), tsconfigFile);
|
|
121
|
+
expect(discovered.discoveredWorkflows).toEqual(new Set([normalize(workflowFile)]));
|
|
122
|
+
expect(parentHasChild(normalize(entryFile), normalize(workflowFile))).toBe(true);
|
|
123
|
+
});
|
|
124
|
+
it('discovers path aliases inherited through tsconfig extends', async () => {
|
|
125
|
+
const entryFile = join(testRoot, 'src', 'entry.ts');
|
|
126
|
+
const workflowFile = join(testRoot, 'src', 'workflows', 'workflow.ts');
|
|
127
|
+
const baseTsconfigFile = join(testRoot, 'tsconfig.base.json');
|
|
128
|
+
const tsconfigFile = join(testRoot, 'tsconfig.json');
|
|
129
|
+
writeFile(baseTsconfigFile, JSON.stringify({
|
|
130
|
+
compilerOptions: {
|
|
131
|
+
baseUrl: '.',
|
|
132
|
+
paths: {
|
|
133
|
+
'@base/*': ['./src/*'],
|
|
134
|
+
},
|
|
135
|
+
},
|
|
136
|
+
}));
|
|
137
|
+
writeFile(tsconfigFile, JSON.stringify({
|
|
138
|
+
extends: './tsconfig.base.json',
|
|
139
|
+
}));
|
|
140
|
+
writeFile(entryFile, `import { run } from '@base/workflows/workflow';\n`);
|
|
141
|
+
writeFile(workflowFile, `export async function run() {
|
|
142
|
+
'use workflow';
|
|
143
|
+
return 'ok';
|
|
144
|
+
}
|
|
145
|
+
`);
|
|
146
|
+
const discovered = await createBuilder(testRoot).discoverEntriesPublic([entryFile], join(testRoot, 'out'), tsconfigFile);
|
|
147
|
+
expect(discovered.discoveredWorkflows).toEqual(new Set([normalize(workflowFile)]));
|
|
148
|
+
});
|
|
149
|
+
it('discovers path aliases with multiple wildcards', async () => {
|
|
150
|
+
const entryFile = join(testRoot, 'src', 'entry.ts');
|
|
151
|
+
const workflowFile = join(testRoot, 'src', 'features', 'billing', 'flows', 'charge.ts');
|
|
152
|
+
const tsconfigFile = join(testRoot, 'tsconfig.json');
|
|
153
|
+
writeFile(tsconfigFile, JSON.stringify({
|
|
154
|
+
compilerOptions: {
|
|
155
|
+
paths: {
|
|
156
|
+
'@feature/*/workflow/*': ['./src/features/*/flows/*'],
|
|
157
|
+
},
|
|
158
|
+
},
|
|
159
|
+
}));
|
|
160
|
+
writeFile(entryFile, `import { charge } from '@feature/billing/workflow/charge';\n`);
|
|
161
|
+
writeFile(workflowFile, `export async function charge() {
|
|
162
|
+
'use workflow';
|
|
163
|
+
return 'ok';
|
|
164
|
+
}
|
|
165
|
+
`);
|
|
166
|
+
const discovered = await createBuilder(testRoot).discoverEntriesPublic([entryFile], join(testRoot, 'out'), tsconfigFile);
|
|
167
|
+
expect(discovered.discoveredWorkflows).toEqual(new Set([normalize(workflowFile)]));
|
|
168
|
+
});
|
|
169
|
+
it('ignores imports that only appear inside comments', async () => {
|
|
170
|
+
const entryFile = join(testRoot, 'src', 'entry.ts');
|
|
171
|
+
const registryFile = join(testRoot, 'src', '_workflows.ts');
|
|
172
|
+
const workflowFile = join(testRoot, 'src', 'workflows', 'simple.ts');
|
|
173
|
+
writeFile(entryFile, `import './_workflows';\n`);
|
|
174
|
+
writeFile(registryFile, `// import * as simple from './workflows/simple';
|
|
175
|
+
|
|
176
|
+
export const allWorkflows = {
|
|
177
|
+
'workflows/simple.ts': simple,
|
|
178
|
+
} as const;
|
|
179
|
+
`);
|
|
180
|
+
writeFile(workflowFile, `export async function simple() {
|
|
181
|
+
'use workflow';
|
|
182
|
+
}
|
|
183
|
+
`);
|
|
184
|
+
const discovered = await createBuilder(testRoot).discoverEntriesPublic([entryFile], join(testRoot, 'out'));
|
|
185
|
+
expect(discovered.discoveredWorkflows).toEqual(new Set());
|
|
186
|
+
expect(discovered.discoveredFiles).toEqual(new Set([normalize(entryFile), normalize(registryFile)]));
|
|
187
|
+
});
|
|
188
|
+
it('does not treat regex literals as comments', async () => {
|
|
189
|
+
const entryFile = join(testRoot, 'src', 'entry.ts');
|
|
190
|
+
const registryFile = join(testRoot, 'src', '_workflows.ts');
|
|
191
|
+
const workflowFile = join(testRoot, 'src', 'workflows', 'simple.ts');
|
|
192
|
+
writeFile(entryFile, `import './_workflows';\n`);
|
|
193
|
+
writeFile(registryFile, `const commentStartChars = /[/*]/;
|
|
194
|
+
const protocol = /https?:\\/\\//;
|
|
195
|
+
import './workflows/simple';
|
|
196
|
+
`);
|
|
197
|
+
writeFile(workflowFile, `export async function simple() {
|
|
198
|
+
'use workflow';
|
|
199
|
+
}
|
|
200
|
+
`);
|
|
201
|
+
const discovered = await createBuilder(testRoot).discoverEntriesPublic([entryFile], join(testRoot, 'out'));
|
|
202
|
+
expect(discovered.discoveredWorkflows).toEqual(new Set([normalize(workflowFile)]));
|
|
203
|
+
});
|
|
204
|
+
it('uses nearest nested jsconfig aliases in monorepo packages', async () => {
|
|
205
|
+
const rootTsconfigFile = join(testRoot, 'tsconfig.json');
|
|
206
|
+
const packageRoot = join(testRoot, 'packages', 'app');
|
|
207
|
+
const entryFile = join(packageRoot, 'src', 'entry.js');
|
|
208
|
+
const workflowFile = join(packageRoot, 'src', 'workflow.js');
|
|
209
|
+
writeFile(rootTsconfigFile, JSON.stringify({
|
|
210
|
+
compilerOptions: {
|
|
211
|
+
paths: {
|
|
212
|
+
'@root/*': ['./root/*'],
|
|
213
|
+
},
|
|
214
|
+
},
|
|
215
|
+
}));
|
|
216
|
+
writeFile(join(packageRoot, 'jsconfig.json'), JSON.stringify({
|
|
217
|
+
compilerOptions: {
|
|
218
|
+
paths: {
|
|
219
|
+
'#/*': ['./src/*'],
|
|
220
|
+
},
|
|
221
|
+
},
|
|
222
|
+
}));
|
|
223
|
+
writeFile(entryFile, `import { run } from '#/workflow';\n`);
|
|
224
|
+
writeFile(workflowFile, `export async function run() {
|
|
225
|
+
"use workflow";
|
|
226
|
+
return "ok";
|
|
227
|
+
}
|
|
228
|
+
`);
|
|
229
|
+
const discovered = await createBuilder(testRoot).discoverEntriesPublic([entryFile], join(testRoot, 'out'));
|
|
230
|
+
expect(discovered.discoveredWorkflows).toEqual(new Set([normalize(workflowFile)]));
|
|
231
|
+
});
|
|
232
|
+
it('only treats serde files as registration candidates when they define static serde methods', async () => {
|
|
233
|
+
const entryFile = join(testRoot, 'src', 'entry.ts');
|
|
234
|
+
const reducerFile = join(testRoot, 'src', 'reducer.ts');
|
|
235
|
+
const serdeFile = join(testRoot, 'src', 'serde.ts');
|
|
236
|
+
writeFile(entryFile, `import './reducer';
|
|
237
|
+
import './serde';
|
|
238
|
+
`);
|
|
239
|
+
writeFile(reducerFile, `import { WORKFLOW_SERIALIZE } from '@workflow/serde';
|
|
240
|
+
|
|
241
|
+
export function reducer(value: unknown) {
|
|
242
|
+
return value?.constructor?.[WORKFLOW_SERIALIZE];
|
|
243
|
+
}
|
|
244
|
+
`);
|
|
245
|
+
writeFile(serdeFile, `import { WORKFLOW_SERIALIZE as WS } from '@workflow/serde';
|
|
246
|
+
|
|
247
|
+
export class Value {
|
|
248
|
+
static classId = 'Value';
|
|
249
|
+
static [WS](value: Value) {
|
|
250
|
+
return value;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
`);
|
|
254
|
+
const discovered = await createBuilder(testRoot).discoverEntriesPublic([entryFile], join(testRoot, 'out'));
|
|
255
|
+
expect(discovered.discoveredSerdeFiles).toEqual(new Set([normalize(serdeFile)]));
|
|
256
|
+
});
|
|
257
|
+
it('categorizes step, workflow, and serde usage independently', async () => {
|
|
258
|
+
const entryFile = join(testRoot, 'src', 'entry.ts');
|
|
259
|
+
const stepFile = join(testRoot, 'src', 'step.ts');
|
|
260
|
+
const workflowFile = join(testRoot, 'src', 'workflow.ts');
|
|
261
|
+
const serdeFile = join(testRoot, 'src', 'serde.ts');
|
|
262
|
+
writeFile(entryFile, `import './step';
|
|
263
|
+
import './workflow';
|
|
264
|
+
import './serde';
|
|
265
|
+
`);
|
|
266
|
+
writeFile(stepFile, `export async function runStep() {
|
|
267
|
+
'use step';
|
|
268
|
+
return 'ok';
|
|
269
|
+
}
|
|
270
|
+
`);
|
|
271
|
+
writeFile(workflowFile, `export async function runWorkflow() {
|
|
272
|
+
'use workflow';
|
|
273
|
+
return 'ok';
|
|
274
|
+
}
|
|
275
|
+
`);
|
|
276
|
+
writeFile(serdeFile, `export class Value {
|
|
277
|
+
static classId = 'Value';
|
|
278
|
+
static [Symbol.for('workflow-serialize')](value: Value) {
|
|
279
|
+
return value;
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
`);
|
|
283
|
+
const discovered = await createBuilder(testRoot).discoverEntriesPublic([entryFile], join(testRoot, 'out'));
|
|
284
|
+
expect(discovered.discoveredSteps).toEqual(new Set([normalize(stepFile)]));
|
|
285
|
+
expect(discovered.discoveredWorkflows).toEqual(new Set([normalize(workflowFile)]));
|
|
286
|
+
expect(discovered.discoveredSerdeFiles).toEqual(new Set([normalize(serdeFile)]));
|
|
287
|
+
});
|
|
288
|
+
it('ignores serde examples that only appear inside comments', async () => {
|
|
289
|
+
const entryFile = join(testRoot, 'src', 'entry.ts');
|
|
290
|
+
const docsFile = join(testRoot, 'src', 'docs.ts');
|
|
291
|
+
writeFile(entryFile, `import './docs';\n`);
|
|
292
|
+
writeFile(docsFile, `/**
|
|
293
|
+
* import { WORKFLOW_SERIALIZE } from '@workflow/serde';
|
|
294
|
+
*
|
|
295
|
+
* class Example {
|
|
296
|
+
* static [WORKFLOW_SERIALIZE](value) {
|
|
297
|
+
* return value;
|
|
298
|
+
* }
|
|
299
|
+
* }
|
|
300
|
+
*/
|
|
301
|
+
export const WORKFLOW_SERIALIZE = Symbol.for('workflow-serialize');
|
|
302
|
+
`);
|
|
303
|
+
const discovered = await createBuilder(testRoot).discoverEntriesPublic([entryFile], join(testRoot, 'out'));
|
|
304
|
+
expect(discovered.discoveredSerdeFiles).toEqual(new Set());
|
|
305
|
+
});
|
|
306
|
+
it('relativizes nested package step registration imports', () => {
|
|
307
|
+
const routeDir = join(testRoot, 'app', '.well-known', 'workflow', 'v1');
|
|
308
|
+
const directPackageFile = join(testRoot, 'node_modules', 'direct-pkg', 'step.js');
|
|
309
|
+
const nestedPackageFile = join(testRoot, 'node_modules', 'parent-pkg', 'node_modules', 'nested-pkg', 'step.js');
|
|
310
|
+
writeFile(join(testRoot, 'package.json'), JSON.stringify({
|
|
311
|
+
dependencies: {
|
|
312
|
+
'direct-pkg': '1.0.0',
|
|
313
|
+
},
|
|
314
|
+
}));
|
|
315
|
+
writeFile(join(testRoot, 'node_modules', 'direct-pkg', 'package.json'), JSON.stringify({
|
|
316
|
+
name: 'direct-pkg',
|
|
317
|
+
version: '1.0.0',
|
|
318
|
+
exports: {
|
|
319
|
+
'./step': './step.js',
|
|
320
|
+
},
|
|
321
|
+
}));
|
|
322
|
+
writeFile(directPackageFile, `export const step = true;\n`);
|
|
323
|
+
writeFile(join(testRoot, 'node_modules', 'parent-pkg', 'node_modules', 'nested-pkg', 'package.json'), JSON.stringify({
|
|
324
|
+
name: 'nested-pkg',
|
|
325
|
+
version: '1.0.0',
|
|
326
|
+
exports: {
|
|
327
|
+
'./step': './step.js',
|
|
328
|
+
},
|
|
329
|
+
}));
|
|
330
|
+
writeFile(nestedPackageFile, `export const step = true;\n`);
|
|
331
|
+
const builder = createBuilder(testRoot);
|
|
332
|
+
expect(builder.createRouteImportSpecifierPublic(directPackageFile, routeDir)).toBe('direct-pkg/step');
|
|
333
|
+
expect(builder.createRouteImportSpecifierPublic(nestedPackageFile, routeDir)).toBe('../../../../node_modules/parent-pkg/node_modules/nested-pkg/step.js');
|
|
334
|
+
});
|
|
335
|
+
});
|
|
336
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFzdC1kaXNjb3ZlcnkudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9mYXN0LWRpc2NvdmVyeS50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsV0FBVyxFQUNYLFlBQVksRUFDWixNQUFNLEVBQ04sYUFBYSxHQUNkLE1BQU0sU0FBUyxDQUFDO0FBQ2pCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDakMsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDMUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDckUsT0FBTyxFQUFFLFdBQVcsRUFBMEIsTUFBTSxtQkFBbUIsQ0FBQztBQUN4RSxPQUFPLEVBQ0wsYUFBYSxFQUNiLGNBQWMsR0FDZixNQUFNLHNDQUFzQyxDQUFDO0FBRzlDLE1BQU0sV0FBWSxTQUFRLFdBQVc7SUFDbkMsS0FBSyxDQUFDLEtBQUs7UUFDVCxRQUFRO0lBQ1YsQ0FBQztJQUVNLHFCQUFxQixDQUMxQixNQUFnQixFQUNoQixNQUFjLEVBQ2QsWUFBcUI7UUFFckIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUVNLGdDQUFnQyxDQUNyQyxJQUFZLEVBQ1osUUFBZ0I7UUFFaEIsT0FBTyxJQUFJLENBQUMsMEJBQTBCLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3pELENBQUM7Q0FDRjtBQUVELE1BQU0sVUFBVSxHQUFHLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0FBRTFDLFNBQVMsU0FBUyxDQUFDLElBQVk7SUFDN0IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENB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QU87WUFDaEIsT0FBTyxFQUFFO2dCQUNQLFFBQVEsRUFBRSxXQUFXO2FBQ3RCO1NBQ0YsQ0FBQyxDQUNILENBQUM7UUFDRixTQUFTLENBQUMsaUJBQWlCLEVBQUUsNkJBQTZCLENBQUMsQ0FBQztRQUM1RCxTQUFTLENBQ1AsSUFBSSxDQUNGLFFBQVEsRUFDUixjQUFjLEVBQ2QsWUFBWSxFQUNaLGNBQWMsRUFDZCxZQUFZLEVBQ1osY0FBYyxDQUNmLEVBQ0QsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUNiLElBQUksRUFBRSxZQUFZO1lBQ2xCLE9BQU8sRUFBRSxPQUFPO1lBQ2hCLE9BQU8sRUFBRTtnQkFDUCxRQUFRLEVBQUUsV0FBVzthQUN0QjtTQUNGLENBQUMsQ0FDSCxDQUFDO1FBQ0YsU0FBUyxDQUFDLGlCQUFpQixFQUFFLDZCQUE2QixDQUFDLENBQUM7UUFFNUQsTUFBTSxPQUFPLEdBQUcsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3hDLE1BQU0sQ0FDSixPQUFPLENBQUMsZ0NBQWdDLENBQUMsaUJBQWlCLEVBQUUsUUFBUSxDQUFDLENBQ3RFLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDMUIsTUFBTSxDQUNKLE9BQU8sQ0FBQyxnQ0FBZ0MsQ0FBQyxpQkFBaUIsRUFBRSxRQUFRLENBQUMsQ0FDdEUsQ0FBQyxJQUFJLENBQ0oscUVBQXFFLENBQ3RFLENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgbWtkaXJTeW5jLFxuICBta2R0ZW1wU3luYyxcbiAgcmVhbHBhdGhTeW5jLFxuICBybVN5bmMsXG4gIHdyaXRlRmlsZVN5bmMsXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgdG1wZGlyIH0gZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgeyBkaXJuYW1lLCBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IGFmdGVyRWFjaCwgYmVmb3JlRWFjaCwgZGVzY3JpYmUsIGV4cGVjdCwgaXQgfSBmcm9tICd2aXRlc3QnO1xuaW1wb3J0IHsgQmFzZUJ1aWxkZXIsIHR5cGUgRGlzY292ZXJlZEVudHJpZXMgfSBmcm9tICcuL2Jhc2UtYnVpbGRlci5qcyc7XG5pbXBvcnQge1xuICBpbXBvcnRQYXJlbnRzLFxuICBwYXJlbnRIYXNDaGlsZCxcbn0gZnJvbSAnLi9kaXNjb3Zlci1lbnRyaWVzLWVzYnVpbGQtcGx1Z2luLmpzJztcbmltcG9ydCB0eXBlIHsgU3RhbmRhbG9uZUNvbmZpZyB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG5jbGFzcyBUZXN0QnVpbGRlciBleHRlbmRzIEJhc2VCdWlsZGVyIHtcbiAgYXN5bmMgYnVpbGQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gbm8tb3BcbiAgfVxuXG4gIHB1YmxpYyBkaXNjb3ZlckVudHJpZXNQdWJsaWMoXG4gICAgaW5wdXRzOiBzdHJpbmdbXSxcbiAgICBvdXRkaXI6IHN0cmluZyxcbiAgICB0c2NvbmZpZ1BhdGg/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxEaXNjb3ZlcmVkRW50cmllcz4ge1xuICAgIHJldHVybiB0aGlzLmRpc2NvdmVyRW50cmllcyhpbnB1dHMsIG91dGRpciwgdHNjb25maWdQYXRoKTtcbiAgfVxuXG4gIHB1YmxpYyBjcmVhdGVSb3V0ZUltcG9ydFNwZWNpZmllclB1YmxpYyhcbiAgICBmaWxlOiBzdHJpbmcsXG4gICAgcm91dGVEaXI6IHN0cmluZ1xuICApOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZVJvdXRlSW1wb3J0U3BlY2lmaWVyKGZpbGUsIHJvdXRlRGlyKTtcbiAgfVxufVxuXG5jb25zdCByZWFsVG1wZGlyID0gcmVhbHBhdGhTeW5jKHRtcGRpcigpKTtcblxuZnVuY3Rpb24gbm9ybWFsaXplKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBwYXRoLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcbn1cblxuZnVuY3Rpb24gd3JpdGVGaWxlKHBhdGg6IHN0cmluZywgY29udGVudHM6IHN0cmluZyk6IHZvaWQge1xuICBta2RpclN5bmMoZGlybmFtZShwYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIHdyaXRlRmlsZVN5bmMocGF0aCwgY29udGVudHMsICd1dGYtOCcpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVCdWlsZGVyKHdvcmtpbmdEaXI6IHN0cmluZyk6IFRlc3RCdWlsZGVyIHtcbiAgY29uc3QgY29uZmlnOiBTdGFuZGFsb25lQ29uZmlnID0ge1xuICAgIGJ1aWxkVGFyZ2V0OiAnc3RhbmRhbG9uZScsXG4gICAgd29ya2luZ0RpcixcbiAgICBkaXJzOiBbJy4nXSxcbiAgICBzdGVwc0J1bmRsZVBhdGg6IGpvaW4od29ya2luZ0RpciwgJ3N0ZXBzLmpzJyksXG4gICAgd29ya2Zsb3dzQnVuZGxlUGF0aDogam9pbih3b3JraW5nRGlyLCAnd29ya2Zsb3dzLmpzJyksXG4gICAgd2ViaG9va0J1bmRsZVBhdGg6IGpvaW4od29ya2luZ0RpciwgJ3dlYmhvb2suanMnKSxcbiAgfTtcbiAgcmV0dXJuIG5ldyBUZXN0QnVpbGRlcihjb25maWcpO1xufVxuXG5kZXNjcmliZSgnZmFzdCB3b3JrZmxvdyBkaXNjb3ZlcnknLCAoKSA9PiB7XG4gIGxldCB0ZXN0Um9vdDogc3RyaW5nO1xuXG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIHRlc3RSb290ID0gbWtkdGVtcFN5bmMoam9pbihyZWFsVG1wZGlyLCAnd29ya2Zsb3ctZmFzdC1kaXNjb3ZlcnktJykpO1xuICAgIGltcG9ydFBhcmVudHMuY2xlYXIoKTtcbiAgfSk7XG5cbiAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICBpbXBvcnRQYXJlbnRzLmNsZWFyKCk7XG4gICAgcm1TeW5jKHRlc3RSb290LCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gIH0pO1xuXG4gIGl0KCdkaXNjb3ZlcnMgdHJhbnNpdGl2ZSByZWxhdGl2ZSBzdGVwIGltcG9ydHMgYW5kIHRyYWNrcyB0aGUgcGFyZW50IGNoYWluJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGVudHJ5RmlsZSA9IGpvaW4odGVzdFJvb3QsICdzcmMnLCAnZW50cnkudHMnKTtcbiAgICBjb25zdCB3b3JrZmxvd0ZpbGUgPSBqb2luKHRlc3RSb290LCAnc3JjJywgJ3dvcmtmbG93LnRzJyk7XG4gICAgY29uc3Qgc3RlcEZpbGUgPSBqb2luKHRlc3RSb290LCAnc3JjJywgJ3N0ZXAudHMnKTtcblxuICAgIHdyaXRlRmlsZShlbnRyeUZpbGUsIGBpbXBvcnQgJy4vd29ya2Zsb3cnO1xcbmApO1xuICAgIHdyaXRlRmlsZSh3b3JrZmxvd0ZpbGUsIGBpbXBvcnQgeyBkb1N0ZXAgfSBmcm9tICcuL3N0ZXAnO1xcbnZvaWQgZG9TdGVwO1xcbmApO1xuICAgIHdyaXRlRmlsZShcbiAgICAgIHN0ZXBGaWxlLFxuICAgICAgYGV4cG9ydCBhc3luYyBmdW5jdGlvbiBkb1N0ZXAoKSB7XG4gICd1c2Ugc3RlcCc7XG4gIHJldHVybiAxO1xufVxuYFxuICAgICk7XG5cbiAgICBjb25zdCBkaXNjb3ZlcmVkID0gYXdhaXQgY3JlYXRlQnVpbGRlcih0ZXN0Um9vdCkuZGlzY292ZXJFbnRyaWVzUHVibGljKFxuICAgICAgW2VudHJ5RmlsZV0sXG4gICAgICBqb2luKHRlc3RSb290LCAnb3V0JylcbiAgICApO1xuXG4gICAgZXhwZWN0KGRpc2NvdmVyZWQuZGlzY292ZXJlZFN0ZXBzKS50b0VxdWFsKG5ldyBTZXQoW25vcm1hbGl6ZShzdGVwRmlsZSldKSk7XG4gICAgZXhwZWN0KHBhcmVudEhhc0NoaWxkKG5vcm1hbGl6ZShlbnRyeUZpbGUpLCBub3JtYWxpemUoc3RlcEZpbGUpKSkudG9CZShcbiAgICAgIHRydWVcbiAgICApO1xuICB9KTtcblxuICBpdCgnZGlzY292ZXJzIHJlbGF0aXZlIEpTIGltcG9ydHMgd2hvc2UgYmFzZW5hbWUgaW5jbHVkZXMgLnN0ZXAnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZW50cnlGaWxlID0gam9pbih0ZXN0Um9vdCwgJ3NyYycsICdlbnRyeS50cycpO1xuICAgIGNvbnN0IHdvcmtmbG93RmlsZSA9IGpvaW4odGVzdFJvb3QsICdzcmMnLCAnaGVsbG8uc3RlcC5qcycpO1xuXG4gICAgd3JpdGVGaWxlKGVudHJ5RmlsZSwgYGltcG9ydCAnLi9oZWxsby5zdGVwJztcXG5gKTtcbiAgICB3cml0ZUZpbGUoXG4gICAgICB3b3JrZmxvd0ZpbGUsXG4gICAgICBgZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bigpIHtcbiAgJ3VzZSB3b3JrZmxvdyc7XG4gIHJldHVybiAnb2snO1xufVxuYFxuICAgICk7XG5cbiAgICBjb25zdCBkaXNjb3ZlcmVkID0gYXdhaXQgY3JlYXRlQnVpbGRlcih0ZXN0Um9vdCkuZGlzY292ZXJFbnRyaWVzUHVibGljKFxuICAgICAgW2VudHJ5RmlsZV0sXG4gICAgICBqb2luKHRlc3RSb290LCAnb3V0JylcbiAgICApO1xuXG4gICAgZXhwZWN0KGRpc2NvdmVyZWQuZGlzY292ZXJlZFdvcmtmbG93cykudG9FcXVhbChcbiAgICAgIG5ldyBTZXQoW25vcm1hbGl6ZSh3b3JrZmxvd0ZpbGUpXSlcbiAgICApO1xuICAgIGV4cGVjdChwYXJlbnRIYXNDaGlsZChub3JtYWxpemUoZW50cnlGaWxlKSwgbm9ybWFsaXplKHdvcmtmbG93RmlsZSkpKS50b0JlKFxuICAgICAgdHJ1ZVxuICAgICk7XG4gIH0pO1xuXG4gIGl0KCdkaXNjb3ZlcnMgd29ya2Zsb3cgZmlsZXMgcmVhY2hlZCB0aHJvdWdoIGFuIGltcG9ydGVkIHBhY2thZ2UgcmUtZXhwb3J0JywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGVudHJ5RmlsZSA9IGpvaW4odGVzdFJvb3QsICdzcmMnLCAnZW50cnkudHMnKTtcbiAgICBjb25zdCBwYWNrYWdlUm9vdCA9IGpvaW4odGVzdFJvb3QsICdub2RlX21vZHVsZXMnLCAnd29ya2Zsb3ctcGtnJyk7XG4gICAgY29uc3QgcGFja2FnZUluZGV4ID0gam9pbihwYWNrYWdlUm9vdCwgJ2luZGV4LmpzJyk7XG4gICAgY29uc3QgcGFja2FnZVdvcmtmbG93ID0gam9pbihwYWNrYWdlUm9vdCwgJ3dvcmtmbG93LmpzJyk7XG5cbiAgICB3cml0ZUZpbGUoZW50cnlGaWxlLCBgaW1wb3J0IHsgcnVuIH0gZnJvbSAnd29ya2Zsb3ctcGtnJztcXG52b2lkIHJ1bjtcXG5gKTtcbiAgICB3cml0ZUZpbGUoXG4gICAgICBqb2luKHBhY2thZ2VSb290LCAncGFja2FnZS5qc29uJyksXG4gICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIG5hbWU6ICd3b3JrZmxvdy1wa2cnLFxuICAgICAgICB2ZXJzaW9uOiAnMS4wLjAnLFxuICAgICAgICBtYWluOiAnaW5kZXguanMnLFxuICAgICAgICBkZXBlbmRlbmNpZXM6IHtcbiAgICAgICAgICB3b3JrZmxvdzogJ14xLjAuMCcsXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICk7XG4gICAgd3JpdGVGaWxlKHBhY2thZ2VJbmRleCwgYGV4cG9ydCB7IHJ1biB9IGZyb20gJy4vd29ya2Zsb3cuanMnO1xcbmApO1xuICAgIHdyaXRlRmlsZShcbiAgICAgIHBhY2thZ2VXb3JrZmxvdyxcbiAgICAgIGBleHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuKCkge1xuICBcInVzZSB3b3JrZmxvd1wiO1xuICByZXR1cm4gXCJva1wiO1xufVxuYFxuICAgICk7XG5cbiAgICBjb25zdCBkaXNjb3ZlcmVkID0gYXdhaXQgY3JlYXRlQnVpbGRlcih0ZXN0Um9vdCkuZGlzY292ZXJFbnRyaWVzUHVibGljKFxuICAgICAgW2VudHJ5RmlsZV0sXG4gICAgICBqb2luKHRlc3RSb290LCAnb3V0JylcbiAgICApO1xuXG4gICAgZXhwZWN0KGRpc2NvdmVyZWQuZGlzY292ZXJlZFdvcmtmbG93cykudG9FcXVhbChcbiAgICAgIG5ldyBTZXQoW25vcm1hbGl6ZShwYWNrYWdlV29ya2Zsb3cpXSlcbiAgICApO1xuICAgIGV4cGVjdChcbiAgICAgIHBhcmVudEhhc0NoaWxkKG5vcm1hbGl6ZShwYWNrYWdlSW5kZXgpLCBub3JtYWxpemUocGFja2FnZVdvcmtmbG93KSlcbiAgICApLnRvQmUodHJ1ZSk7XG4gIH0pO1xuXG4gIGl0KCdkaXNjb3ZlcnMgZmlsZXMgcmVhY2hlZCB0aHJvdWdoIHRzY29uZmlnIHBhdGggYWxpYXNlcycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBlbnRyeUZpbGUgPSBqb2luKHRlc3RSb290LCAnc3JjJywgJ2VudHJ5LnRzJyk7XG4gICAgY29uc3QgcmVnaXN0cnlGaWxlID0gam9pbih0ZXN0Um9vdCwgJ3NyYycsICdfd29ya2Zsb3dzLnRzJyk7XG4gICAgY29uc3Qgd29ya2Zsb3dGaWxlID0gam9pbih0ZXN0Um9vdCwgJ3NyYycsICd3b3JrZmxvd3MnLCAnd29ya2Zsb3cudHMnKTtcbiAgICBjb25zdCB0c2NvbmZpZ0ZpbGUgPSBqb2luKHRlc3RSb290LCAndHNjb25maWcuanNvbicpO1xuXG4gICAgd3JpdGVGaWxlKFxuICAgICAgdHNjb25maWdGaWxlLFxuICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBjb21waWxlck9wdGlvbnM6IHtcbiAgICAgICAgICBwYXRoczoge1xuICAgICAgICAgICAgJ0AvKic6IFsnLi9zcmMvKiddLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICk7XG4gICAgd3JpdGVGaWxlKGVudHJ5RmlsZSwgYGltcG9ydCB7IGFsbFdvcmtmbG93cyB9IGZyb20gJ0AvX3dvcmtmbG93cyc7XFxuYCk7XG4gICAgd3JpdGVGaWxlKFxuICAgICAgcmVnaXN0cnlGaWxlLFxuICAgICAgYGltcG9ydCAqIGFzIHdvcmtmbG93IGZyb20gJy4vd29ya2Zsb3dzL3dvcmtmbG93JztcbmV4cG9ydCBjb25zdCBhbGxXb3JrZmxvd3MgPSB7IHdvcmtmbG93IH07XG5gXG4gICAgKTtcbiAgICB3cml0ZUZpbGUoXG4gICAgICB3b3JrZmxvd0ZpbGUsXG4gICAgICBgZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bigpIHtcbiAgJ3VzZSB3b3JrZmxvdyc7XG4gIHJldHVybiAnb2snO1xufVxuYFxuICAgICk7XG5cbiAgICBjb25zdCBkaXNjb3ZlcmVkID0gYXdhaXQgY3JlYXRlQnVpbGRlcih0ZXN0Um9vdCkuZGlzY292ZXJFbnRyaWVzUHVibGljKFxuICAgICAgW2VudHJ5RmlsZV0sXG4gICAgICBqb2luKHRlc3RSb290LCAnb3V0JyksXG4gICAgICB0c2NvbmZpZ0ZpbGVcbiAgICApO1xuXG4gICAgZXhwZWN0KGRpc2NvdmVyZWQuZGlzY292ZXJlZFdvcmtmbG93cykudG9FcXVhbChcbiAgICAgIG5ldyBTZXQoW25vcm1hbGl6ZSh3b3JrZmxvd0ZpbGUpXSlcbiAgICApO1xuICAgIGV4cGVjdChwYXJlbnRIYXNDaGlsZChub3JtYWxpemUoZW50cnlGaWxlKSwgbm9ybWFsaXplKHdvcmtmbG93RmlsZSkpKS50b0JlKFxuICAgICAgdHJ1ZVxuICAgICk7XG4gIH0pO1xuXG4gIGl0KCdkaXNjb3ZlcnMgcGF0aCBhbGlhc2VzIGluaGVyaXRlZCB0aHJvdWdoIHRzY29uZmlnIGV4dGVuZHMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZW50cnlGaWxlID0gam9pbih0ZXN0Um9vdCwgJ3NyYycsICdlbnRyeS50cycpO1xuICAgIGNvbnN0IHdvcmtmbG93RmlsZSA9IGpvaW4odGVzdFJvb3QsICdzcmMnLCAnd29ya2Zsb3dzJywgJ3dvcmtmbG93LnRzJyk7XG4gICAgY29uc3QgYmFzZVRzY29uZmlnRmlsZSA9IGpvaW4odGVzdFJvb3QsICd0c2NvbmZpZy5iYXNlLmpzb24nKTtcbiAgICBjb25zdCB0c2NvbmZpZ0ZpbGUgPSBqb2luKHRlc3RSb290LCAndHNjb25maWcuanNvbicpO1xuXG4gICAgd3JpdGVGaWxlKFxuICAgICAgYmFzZVRzY29uZmlnRmlsZSxcbiAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgY29tcGlsZXJPcHRpb25zOiB7XG4gICAgICAgICAgYmFzZVVybDogJy4nLFxuICAgICAgICAgIHBhdGhzOiB7XG4gICAgICAgICAgICAnQGJhc2UvKic6IFsnLi9zcmMvKiddLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICk7XG4gICAgd3JpdGVGaWxlKFxuICAgICAgdHNjb25maWdGaWxlLFxuICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBleHRlbmRzOiAnLi90c2NvbmZpZy5iYXNlLmpzb24nLFxuICAgICAgfSlcbiAgICApO1xuICAgIHdyaXRlRmlsZShlbnRyeUZpbGUsIGBpbXBvcnQgeyBydW4gfSBmcm9tICdAYmFzZS93b3JrZmxvd3Mvd29ya2Zsb3cnO1xcbmApO1xuICAgIHdyaXRlRmlsZShcbiAgICAgIHdvcmtmbG93RmlsZSxcbiAgICAgIGBleHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuKCkge1xuICAndXNlIHdvcmtmbG93JztcbiAgcmV0dXJuICdvayc7XG59XG5gXG4gICAgKTtcblxuICAgIGNvbnN0IGRpc2NvdmVyZWQgPSBhd2FpdCBjcmVhdGVCdWlsZGVyKHRlc3RSb290KS5kaXNjb3ZlckVudHJpZXNQdWJsaWMoXG4gICAgICBbZW50cnlGaWxlXSxcbiAgICAgIGpvaW4odGVzdFJvb3QsICdvdXQnKSxcbiAgICAgIHRzY29uZmlnRmlsZVxuICAgICk7XG5cbiAgICBleHBlY3QoZGlzY292ZXJlZC5kaXNjb3ZlcmVkV29ya2Zsb3dzKS50b0VxdWFsKFxuICAgICAgbmV3IFNldChbbm9ybWFsaXplKHdvcmtmbG93RmlsZSldKVxuICAgICk7XG4gIH0pO1xuXG4gIGl0KCdkaXNjb3ZlcnMgcGF0aCBhbGlhc2VzIHdpdGggbXVsdGlwbGUgd2lsZGNhcmRzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGVudHJ5RmlsZSA9IGpvaW4odGVzdFJvb3QsICdzcmMnLCAnZW50cnkudHMnKTtcbiAgICBjb25zdCB3b3JrZmxvd0ZpbGUgPSBqb2luKFxuICAgICAgdGVzdFJvb3QsXG4gICAgICAnc3JjJyxcbiAgICAgICdmZWF0dXJlcycsXG4gICAgICAnYmlsbGluZycsXG4gICAgICAnZmxvd3MnLFxuICAgICAgJ2NoYXJnZS50cydcbiAgICApO1xuICAgIGNvbnN0IHRzY29uZmlnRmlsZSA9IGpvaW4odGVzdFJvb3QsICd0c2NvbmZpZy5qc29uJyk7XG5cbiAgICB3cml0ZUZpbGUoXG4gICAgICB0c2NvbmZpZ0ZpbGUsXG4gICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIGNvbXBpbGVyT3B0aW9uczoge1xuICAgICAgICAgIHBhdGhzOiB7XG4gICAgICAgICAgICAnQGZlYXR1cmUvKi93b3JrZmxvdy8qJzogWycuL3NyYy9mZWF0dXJlcy8qL2Zsb3dzLyonXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICApO1xuICAgIHdyaXRlRmlsZShcbiAgICAgIGVudHJ5RmlsZSxcbiAgICAgIGBpbXBvcnQgeyBjaGFyZ2UgfSBmcm9tICdAZmVhdHVyZS9iaWxsaW5nL3dvcmtmbG93L2NoYXJnZSc7XFxuYFxuICAgICk7XG4gICAgd3JpdGVGaWxlKFxuICAgICAgd29ya2Zsb3dGaWxlLFxuICAgICAgYGV4cG9ydCBhc3luYyBmdW5jdGlvbiBjaGFyZ2UoKSB7XG4gICd1c2Ugd29ya2Zsb3cnO1xuICByZXR1cm4gJ29rJztcbn1cbmBcbiAgICApO1xuXG4gICAgY29uc3QgZGlzY292ZXJlZCA9IGF3YWl0IGNyZWF0ZUJ1aWxkZXIodGVzdFJvb3QpLmRpc2NvdmVyRW50cmllc1B1YmxpYyhcbiAgICAgIFtlbnRyeUZpbGVdLFxuICAgICAgam9pbih0ZXN0Um9vdCwgJ291dCcpLFxuICAgICAgdHNjb25maWdGaWxlXG4gICAgKTtcblxuICAgIGV4cGVjdChkaXNjb3ZlcmVkLmRpc2NvdmVyZWRXb3JrZmxvd3MpLnRvRXF1YWwoXG4gICAgICBuZXcgU2V0KFtub3JtYWxpemUod29ya2Zsb3dGaWxlKV0pXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoJ2lnbm9yZXMgaW1wb3J0cyB0aGF0IG9ubHkgYXBwZWFyIGluc2lkZSBjb21tZW50cycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBlbnRyeUZpbGUgPSBqb2luKHRlc3RSb290LCAnc3JjJywgJ2VudHJ5LnRzJyk7XG4gICAgY29uc3QgcmVnaXN0cnlGaWxlID0gam9pbih0ZXN0Um9vdCwgJ3NyYycsICdfd29ya2Zsb3dzLnRzJyk7XG4gICAgY29uc3Qgd29ya2Zsb3dGaWxlID0gam9pbih0ZXN0Um9vdCwgJ3NyYycsICd3b3JrZmxvd3MnLCAnc2ltcGxlLnRzJyk7XG5cbiAgICB3cml0ZUZpbGUoZW50cnlGaWxlLCBgaW1wb3J0ICcuL193b3JrZmxvd3MnO1xcbmApO1xuICAgIHdyaXRlRmlsZShcbiAgICAgIHJlZ2lzdHJ5RmlsZSxcbiAgICAgIGAvLyBpbXBvcnQgKiBhcyBzaW1wbGUgZnJvbSAnLi93b3JrZmxvd3Mvc2ltcGxlJztcblxuZXhwb3J0IGNvbnN0IGFsbFdvcmtmbG93cyA9IHtcbiAgJ3dvcmtmbG93cy9zaW1wbGUudHMnOiBzaW1wbGUsXG59IGFzIGNvbnN0O1xuYFxuICAgICk7XG4gICAgd3JpdGVGaWxlKFxuICAgICAgd29ya2Zsb3dGaWxlLFxuICAgICAgYGV4cG9ydCBhc3luYyBmdW5jdGlvbiBzaW1wbGUoKSB7XG4gICd1c2Ugd29ya2Zsb3cnO1xufVxuYFxuICAgICk7XG5cbiAgICBjb25zdCBkaXNjb3ZlcmVkID0gYXdhaXQgY3JlYXRlQnVpbGRlcih0ZXN0Um9vdCkuZGlzY292ZXJFbnRyaWVzUHVibGljKFxuICAgICAgW2VudHJ5RmlsZV0sXG4gICAgICBqb2luKHRlc3RSb290LCAnb3V0JylcbiAgICApO1xuXG4gICAgZXhwZWN0KGRpc2NvdmVyZWQuZGlzY292ZXJlZFdvcmtmbG93cykudG9FcXVhbChuZXcgU2V0KCkpO1xuICAgIGV4cGVjdChkaXNjb3ZlcmVkLmRpc2NvdmVyZWRGaWxlcykudG9FcXVhbChcbiAgICAgIG5ldyBTZXQoW25vcm1hbGl6ZShlbnRyeUZpbGUpLCBub3JtYWxpemUocmVnaXN0cnlGaWxlKV0pXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoJ2RvZXMgbm90IHRyZWF0IHJlZ2V4IGxpdGVyYWxzIGFzIGNvbW1lbnRzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGVudHJ5RmlsZSA9IGpvaW4odGVzdFJvb3QsICdzcmMnLCAnZW50cnkudHMnKTtcbiAgICBjb25zdCByZWdpc3RyeUZpbGUgPSBqb2luKHRlc3RSb290LCAnc3JjJywgJ193b3JrZmxvd3MudHMnKTtcbiAgICBjb25zdCB3b3JrZmxvd0ZpbGUgPSBqb2luKHRlc3RSb290LCAnc3JjJywgJ3dvcmtmbG93cycsICdzaW1wbGUudHMnKTtcblxuICAgIHdyaXRlRmlsZShlbnRyeUZpbGUsIGBpbXBvcnQgJy4vX3dvcmtmbG93cyc7XFxuYCk7XG4gICAgd3JpdGVGaWxlKFxuICAgICAgcmVnaXN0cnlGaWxlLFxuICAgICAgYGNvbnN0IGNvbW1lbnRTdGFydENoYXJzID0gL1svKl0vO1xuY29uc3QgcHJvdG9jb2wgPSAvaHR0cHM/OlxcXFwvXFxcXC8vO1xuaW1wb3J0ICcuL3dvcmtmbG93cy9zaW1wbGUnO1xuYFxuICAgICk7XG4gICAgd3JpdGVGaWxlKFxuICAgICAgd29ya2Zsb3dGaWxlLFxuICAgICAgYGV4cG9ydCBhc3luYyBmdW5jdGlvbiBzaW1wbGUoKSB7XG4gICd1c2Ugd29ya2Zsb3cnO1xufVxuYFxuICAgICk7XG5cbiAgICBjb25zdCBkaXNjb3ZlcmVkID0gYXdhaXQgY3JlYXRlQnVpbGRlcih0ZXN0Um9vdCkuZGlzY292ZXJFbnRyaWVzUHVibGljKFxuICAgICAgW2VudHJ5RmlsZV0sXG4gICAgICBqb2luKHRlc3RSb290LCAnb3V0JylcbiAgICApO1xuXG4gICAgZXhwZWN0KGRpc2NvdmVyZWQuZGlzY292ZXJlZFdvcmtmbG93cykudG9FcXVhbChcbiAgICAgIG5ldyBTZXQoW25vcm1hbGl6ZSh3b3JrZmxvd0ZpbGUpXSlcbiAgICApO1xuICB9KTtcblxuICBpdCgndXNlcyBuZWFyZXN0IG5lc3RlZCBqc2NvbmZpZyBhbGlhc2VzIGluIG1vbm9yZXBvIHBhY2thZ2VzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJvb3RUc2NvbmZpZ0ZpbGUgPSBqb2luKHRlc3RSb290LCAndHNjb25maWcuanNvbicpO1xuICAgIGNvbnN0IHBhY2thZ2VSb290ID0gam9pbih0ZXN0Um9vdCwgJ3BhY2thZ2VzJywgJ2FwcCcpO1xuICAgIGNvbnN0IGVudHJ5RmlsZSA9IGpvaW4ocGFja2FnZVJvb3QsICdzcmMnLCAnZW50cnkuanMnKTtcbiAgICBjb25zdCB3b3JrZmxvd0ZpbGUgPSBqb2luKHBhY2thZ2VSb290LCAnc3JjJywgJ3dvcmtmbG93LmpzJyk7XG5cbiAgICB3cml0ZUZpbGUoXG4gICAgICByb290VHNjb25maWdGaWxlLFxuICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBjb21waWxlck9wdGlvbnM6IHtcbiAgICAgICAgICBwYXRoczoge1xuICAgICAgICAgICAgJ0Byb290LyonOiBbJy4vcm9vdC8qJ10sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgKTtcbiAgICB3cml0ZUZpbGUoXG4gICAgICBqb2luKHBhY2thZ2VSb290LCAnanNjb25maWcuanNvbicpLFxuICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBjb21waWxlck9wdGlvbnM6IHtcbiAgICAgICAgICBwYXRoczoge1xuICAgICAgICAgICAgJyMvKic6IFsnLi9zcmMvKiddLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICk7XG4gICAgd3JpdGVGaWxlKGVudHJ5RmlsZSwgYGltcG9ydCB7IHJ1biB9IGZyb20gJyMvd29ya2Zsb3cnO1xcbmApO1xuICAgIHdyaXRlRmlsZShcbiAgICAgIHdvcmtmbG93RmlsZSxcbiAgICAgIGBleHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuKCkge1xuICBcInVzZSB3b3JrZmxvd1wiO1xuICByZXR1cm4gXCJva1wiO1xufVxuYFxuICAgICk7XG5cbiAgICBjb25zdCBkaXNjb3ZlcmVkID0gYXdhaXQgY3JlYXRlQnVpbGRlcih0ZXN0Um9vdCkuZGlzY292ZXJFbnRyaWVzUHVibGljKFxuICAgICAgW2VudHJ5RmlsZV0sXG4gICAgICBqb2luKHRlc3RSb290LCAnb3V0JylcbiAgICApO1xuXG4gICAgZXhwZWN0KGRpc2NvdmVyZWQuZGlzY292ZXJlZFdvcmtmbG93cykudG9FcXVhbChcbiAgICAgIG5ldyBTZXQoW25vcm1hbGl6ZSh3b3JrZmxvd0ZpbGUpXSlcbiAgICApO1xuICB9KTtcblxuICBpdCgnb25seSB0cmVhdHMgc2VyZGUgZmlsZXMgYXMgcmVnaXN0cmF0aW9uIGNhbmRpZGF0ZXMgd2hlbiB0aGV5IGRlZmluZSBzdGF0aWMgc2VyZGUgbWV0aG9kcycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBlbnRyeUZpbGUgPSBqb2luKHRlc3RSb290LCAnc3JjJywgJ2VudHJ5LnRzJyk7XG4gICAgY29uc3QgcmVkdWNlckZpbGUgPSBqb2luKHRlc3RSb290LCAnc3JjJywgJ3JlZHVjZXIudHMnKTtcbiAgICBjb25zdCBzZXJkZUZpbGUgPSBqb2luKHRlc3RSb290LCAnc3JjJywgJ3NlcmRlLnRzJyk7XG5cbiAgICB3cml0ZUZpbGUoXG4gICAgICBlbnRyeUZpbGUsXG4gICAgICBgaW1wb3J0ICcuL3JlZHVjZXInO1xuaW1wb3J0ICcuL3NlcmRlJztcbmBcbiAgICApO1xuICAgIHdyaXRlRmlsZShcbiAgICAgIHJlZHVjZXJGaWxlLFxuICAgICAgYGltcG9ydCB7IFdPUktGTE9XX1NFUklBTElaRSB9IGZyb20gJ0B3b3JrZmxvdy9zZXJkZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiByZWR1Y2VyKHZhbHVlOiB1bmtub3duKSB7XG4gIHJldHVybiB2YWx1ZT8uY29uc3RydWN0b3I/LltXT1JLRkxPV19TRVJJQUxJWkVdO1xufVxuYFxuICAgICk7XG4gICAgd3JpdGVGaWxlKFxuICAgICAgc2VyZGVGaWxlLFxuICAgICAgYGltcG9ydCB7IFdPUktGTE9XX1NFUklBTElaRSBhcyBXUyB9IGZyb20gJ0B3b3JrZmxvdy9zZXJkZSc7XG5cbmV4cG9ydCBjbGFzcyBWYWx1ZSB7XG4gIHN0YXRpYyBjbGFzc0lkID0gJ1ZhbHVlJztcbiAgc3RhdGljIFtXU10odmFsdWU6IFZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG5gXG4gICAgKTtcblxuICAgIGNvbnN0IGRpc2NvdmVyZWQgPSBhd2FpdCBjcmVhdGVCdWlsZGVyKHRlc3RSb290KS5kaXNjb3ZlckVudHJpZXNQdWJsaWMoXG4gICAgICBbZW50cnlGaWxlXSxcbiAgICAgIGpvaW4odGVzdFJvb3QsICdvdXQnKVxuICAgICk7XG5cbiAgICBleHBlY3QoZGlzY292ZXJlZC5kaXNjb3ZlcmVkU2VyZGVGaWxlcykudG9FcXVhbChcbiAgICAgIG5ldyBTZXQoW25vcm1hbGl6ZShzZXJkZUZpbGUpXSlcbiAgICApO1xuICB9KTtcblxuICBpdCgnY2F0ZWdvcml6ZXMgc3RlcCwgd29ya2Zsb3csIGFuZCBzZXJkZSB1c2FnZSBpbmRlcGVuZGVudGx5JywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGVudHJ5RmlsZSA9IGpvaW4odGVzdFJvb3QsICdzcmMnLCAnZW50cnkudHMnKTtcbiAgICBjb25zdCBzdGVwRmlsZSA9IGpvaW4odGVzdFJvb3QsICdzcmMnLCAnc3RlcC50cycpO1xuICAgIGNvbnN0IHdvcmtmbG93RmlsZSA9IGpvaW4odGVzdFJvb3QsICdzcmMnLCAnd29ya2Zsb3cudHMnKTtcbiAgICBjb25zdCBzZXJkZUZpbGUgPSBqb2luKHRlc3RSb290LCAnc3JjJywgJ3NlcmRlLnRzJyk7XG5cbiAgICB3cml0ZUZpbGUoXG4gICAgICBlbnRyeUZpbGUsXG4gICAgICBgaW1wb3J0ICcuL3N0ZXAnO1xuaW1wb3J0ICcuL3dvcmtmbG93JztcbmltcG9ydCAnLi9zZXJkZSc7XG5gXG4gICAgKTtcbiAgICB3cml0ZUZpbGUoXG4gICAgICBzdGVwRmlsZSxcbiAgICAgIGBleHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuU3RlcCgpIHtcbiAgJ3VzZSBzdGVwJztcbiAgcmV0dXJuICdvayc7XG59XG5gXG4gICAgKTtcbiAgICB3cml0ZUZpbGUoXG4gICAgICB3b3JrZmxvd0ZpbGUsXG4gICAgICBgZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bldvcmtmbG93KCkge1xuICAndXNlIHdvcmtmbG93JztcbiAgcmV0dXJuICdvayc7XG59XG5gXG4gICAgKTtcbiAgICB3cml0ZUZpbGUoXG4gICAgICBzZXJkZUZpbGUsXG4gICAgICBgZXhwb3J0IGNsYXNzIFZhbHVlIHtcbiAgc3RhdGljIGNsYXNzSWQgPSAnVmFsdWUnO1xuICBzdGF0aWMgW1N5bWJvbC5mb3IoJ3dvcmtmbG93LXNlcmlhbGl6ZScpXSh2YWx1ZTogVmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cbmBcbiAgICApO1xuXG4gICAgY29uc3QgZGlzY292ZXJlZCA9IGF3YWl0IGNyZWF0ZUJ1aWxkZXIodGVzdFJvb3QpLmRpc2NvdmVyRW50cmllc1B1YmxpYyhcbiAgICAgIFtlbnRyeUZpbGVdLFxuICAgICAgam9pbih0ZXN0Um9vdCwgJ291dCcpXG4gICAgKTtcblxuICAgIGV4cGVjdChkaXNjb3ZlcmVkLmRpc2NvdmVyZWRTdGVwcykudG9FcXVhbChuZXcgU2V0KFtub3JtYWxpemUoc3RlcEZpbGUpXSkpO1xuICAgIGV4cGVjdChkaXNjb3ZlcmVkLmRpc2NvdmVyZWRXb3JrZmxvd3MpLnRvRXF1YWwoXG4gICAgICBuZXcgU2V0KFtub3JtYWxpemUod29ya2Zsb3dGaWxlKV0pXG4gICAgKTtcbiAgICBleHBlY3QoZGlzY292ZXJlZC5kaXNjb3ZlcmVkU2VyZGVGaWxlcykudG9FcXVhbChcbiAgICAgIG5ldyBTZXQoW25vcm1hbGl6ZShzZXJkZUZpbGUpXSlcbiAgICApO1xuICB9KTtcblxuICBpdCgnaWdub3JlcyBzZXJkZSBleGFtcGxlcyB0aGF0IG9ubHkgYXBwZWFyIGluc2lkZSBjb21tZW50cycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBlbnRyeUZpbGUgPSBqb2luKHRlc3RSb290LCAnc3JjJywgJ2VudHJ5LnRzJyk7XG4gICAgY29uc3QgZG9jc0ZpbGUgPSBqb2luKHRlc3RSb290LCAnc3JjJywgJ2RvY3MudHMnKTtcblxuICAgIHdyaXRlRmlsZShlbnRyeUZpbGUsIGBpbXBvcnQgJy4vZG9jcyc7XFxuYCk7XG4gICAgd3JpdGVGaWxlKFxuICAgICAgZG9jc0ZpbGUsXG4gICAgICBgLyoqXG4gKiBpbXBvcnQgeyBXT1JLRkxPV19TRVJJQUxJWkUgfSBmcm9tICdAd29ya2Zsb3cvc2VyZGUnO1xuICpcbiAqIGNsYXNzIEV4YW1wbGUge1xuICogICBzdGF0aWMgW1dPUktGTE9XX1NFUklBTElaRV0odmFsdWUpIHtcbiAqICAgICByZXR1cm4gdmFsdWU7XG4gKiAgIH1cbiAqIH1cbiAqL1xuZXhwb3J0IGNvbnN0IFdPUktGTE9XX1NFUklBTElaRSA9IFN5bWJvbC5mb3IoJ3dvcmtmbG93LXNlcmlhbGl6ZScpO1xuYFxuICAgICk7XG5cbiAgICBjb25zdCBkaXNjb3ZlcmVkID0gYXdhaXQgY3JlYXRlQnVpbGRlcih0ZXN0Um9vdCkuZGlzY292ZXJFbnRyaWVzUHVibGljKFxuICAgICAgW2VudHJ5RmlsZV0sXG4gICAgICBqb2luKHRlc3RSb290LCAnb3V0JylcbiAgICApO1xuXG4gICAgZXhwZWN0KGRpc2NvdmVyZWQuZGlzY292ZXJlZFNlcmRlRmlsZXMpLnRvRXF1YWwobmV3IFNldCgpKTtcbiAgfSk7XG5cbiAgaXQoJ3JlbGF0aXZpemVzIG5lc3RlZCBwYWNrYWdlIHN0ZXAgcmVnaXN0cmF0aW9uIGltcG9ydHMnLCAoKSA9PiB7XG4gICAgY29uc3Qgcm91dGVEaXIgPSBqb2luKHRlc3RSb290LCAnYXBwJywgJy53ZWxsLWtub3duJywgJ3dvcmtmbG93JywgJ3YxJyk7XG4gICAgY29uc3QgZGlyZWN0UGFja2FnZUZpbGUgPSBqb2luKFxuICAgICAgdGVzdFJvb3QsXG4gICAgICAnbm9kZV9tb2R1bGVzJyxcbiAgICAgICdkaXJlY3QtcGtnJyxcbiAgICAgICdzdGVwLmpzJ1xuICAgICk7XG4gICAgY29uc3QgbmVzdGVkUGFja2FnZUZpbGUgPSBqb2luKFxuICAgICAgdGVzdFJvb3QsXG4gICAgICAnbm9kZV9tb2R1bGVzJyxcbiAgICAgICdwYXJlbnQtcGtnJyxcbiAgICAgICdub2RlX21vZHVsZXMnLFxuICAgICAgJ25lc3RlZC1wa2cnLFxuICAgICAgJ3N0ZXAuanMnXG4gICAgKTtcblxuICAgIHdyaXRlRmlsZShcbiAgICAgIGpvaW4odGVzdFJvb3QsICdwYWNrYWdlLmpzb24nKSxcbiAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgZGVwZW5kZW5jaWVzOiB7XG4gICAgICAgICAgJ2RpcmVjdC1wa2cnOiAnMS4wLjAnLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICApO1xuICAgIHdyaXRlRmlsZShcbiAgICAgIGpvaW4odGVzdFJvb3QsICdub2RlX21vZHVsZXMnLCAnZGlyZWN0LXBrZycsICdwYWNrYWdlLmpzb24nKSxcbiAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgbmFtZTogJ2RpcmVjdC1wa2cnLFxuICAgICAgICB2ZXJzaW9uOiAnMS4wLjAnLFxuICAgICAgICBleHBvcnRzOiB7XG4gICAgICAgICAgJy4vc3RlcCc6ICcuL3N0ZXAuanMnLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICApO1xuICAgIHdyaXRlRmlsZShkaXJlY3RQYWNrYWdlRmlsZSwgYGV4cG9ydCBjb25zdCBzdGVwID0gdHJ1ZTtcXG5gKTtcbiAgICB3cml0ZUZpbGUoXG4gICAgICBqb2luKFxuICAgICAgICB0ZXN0Um9vdCxcbiAgICAgICAgJ25vZGVfbW9kdWxlcycsXG4gICAgICAgICdwYXJlbnQtcGtnJyxcbiAgICAgICAgJ25vZGVfbW9kdWxlcycsXG4gICAgICAgICduZXN0ZWQtcGtnJyxcbiAgICAgICAgJ3BhY2thZ2UuanNvbidcbiAgICAgICksXG4gICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIG5hbWU6ICduZXN0ZWQtcGtnJyxcbiAgICAgICAgdmVyc2lvbjogJzEuMC4wJyxcbiAgICAgICAgZXhwb3J0czoge1xuICAgICAgICAgICcuL3N0ZXAnOiAnLi9zdGVwLmpzJyxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgKTtcbiAgICB3cml0ZUZpbGUobmVzdGVkUGFja2FnZUZpbGUsIGBleHBvcnQgY29uc3Qgc3RlcCA9IHRydWU7XFxuYCk7XG5cbiAgICBjb25zdCBidWlsZGVyID0gY3JlYXRlQnVpbGRlcih0ZXN0Um9vdCk7XG4gICAgZXhwZWN0KFxuICAgICAgYnVpbGRlci5jcmVhdGVSb3V0ZUltcG9ydFNwZWNpZmllclB1YmxpYyhkaXJlY3RQYWNrYWdlRmlsZSwgcm91dGVEaXIpXG4gICAgKS50b0JlKCdkaXJlY3QtcGtnL3N0ZXAnKTtcbiAgICBleHBlY3QoXG4gICAgICBidWlsZGVyLmNyZWF0ZVJvdXRlSW1wb3J0U3BlY2lmaWVyUHVibGljKG5lc3RlZFBhY2thZ2VGaWxlLCByb3V0ZURpcilcbiAgICApLnRvQmUoXG4gICAgICAnLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3BhcmVudC1wa2cvbm9kZV9tb2R1bGVzL25lc3RlZC1wa2cvc3RlcC5qcydcbiAgICApO1xuICB9KTtcbn0pO1xuIl19
|
|
@@ -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';
|
|
@@ -17,6 +17,9 @@ class TestBuilder extends BaseBuilder {
|
|
|
17
17
|
getDiagnosticsManifestPath() {
|
|
18
18
|
return super.getDiagnosticsManifestPath();
|
|
19
19
|
}
|
|
20
|
+
ensureSwcIgnored() {
|
|
21
|
+
return super.ensureSwcIgnored();
|
|
22
|
+
}
|
|
20
23
|
}
|
|
21
24
|
// Resolve symlinks in tmpdir to avoid macOS /var -> /private/var issues
|
|
22
25
|
const realTmpdir = realpathSync(tmpdir());
|
|
@@ -84,6 +87,7 @@ describe('getInputFiles', () => {
|
|
|
84
87
|
writeFile(srcDir, '.workflow-data/state.ts');
|
|
85
88
|
writeFile(srcDir, '.workflow-vitest/workflows.mjs');
|
|
86
89
|
writeFile(srcDir, '.well-known/workflow/route.ts');
|
|
90
|
+
writeFile(srcDir, '.swc/cache/plugin-output.ts');
|
|
87
91
|
writeFile(srcDir, '.turbo/cache/build.ts');
|
|
88
92
|
writeFile(srcDir, '.cache/babel/plugin.js');
|
|
89
93
|
writeFile(srcDir, '.yarn/releases/yarn.cjs');
|
|
@@ -101,6 +105,7 @@ describe('getInputFiles', () => {
|
|
|
101
105
|
expect(files).not.toContain(normalize(join(srcDir, '.workflow-data/state.ts')));
|
|
102
106
|
expect(files).not.toContain(normalize(join(srcDir, '.workflow-vitest/workflows.mjs')));
|
|
103
107
|
expect(files).not.toContain(normalize(join(srcDir, '.well-known/workflow/route.ts')));
|
|
108
|
+
expect(files).not.toContain(normalize(join(srcDir, '.swc/cache/plugin-output.ts')));
|
|
104
109
|
expect(files).not.toContain(normalize(join(srcDir, '.turbo/cache/build.ts')));
|
|
105
110
|
expect(files).not.toContain(normalize(join(srcDir, '.cache/babel/plugin.js')));
|
|
106
111
|
expect(files).not.toContain(normalize(join(srcDir, '.yarn/releases/yarn.cjs')));
|
|
@@ -122,6 +127,33 @@ describe('getInputFiles', () => {
|
|
|
122
127
|
expect(files).toContain(normalize(join(srcDir, '.api/config.cjs')));
|
|
123
128
|
});
|
|
124
129
|
});
|
|
130
|
+
describe('ensureSwcIgnored', () => {
|
|
131
|
+
let testRoot;
|
|
132
|
+
beforeEach(() => {
|
|
133
|
+
testRoot = mkdtempSync(join(realTmpdir, 'swc-gitignore-'));
|
|
134
|
+
});
|
|
135
|
+
afterEach(() => {
|
|
136
|
+
rmSync(testRoot, { recursive: true, force: true });
|
|
137
|
+
});
|
|
138
|
+
it('adds .swc to the project .gitignore once', async () => {
|
|
139
|
+
writeFile(testRoot, '.gitignore', 'node_modules\n');
|
|
140
|
+
const builder = createBuilder(testRoot, ['src']);
|
|
141
|
+
await builder.ensureSwcIgnored();
|
|
142
|
+
await builder.ensureSwcIgnored();
|
|
143
|
+
const gitignore = readFileSync(join(testRoot, '.gitignore'), 'utf-8');
|
|
144
|
+
const swcEntries = gitignore
|
|
145
|
+
.split(/\r?\n/)
|
|
146
|
+
.filter((line) => line.trim() === '/.swc');
|
|
147
|
+
expect(gitignore).toBe('node_modules\n/.swc\n');
|
|
148
|
+
expect(swcEntries).toHaveLength(1);
|
|
149
|
+
});
|
|
150
|
+
it('preserves existing .swc gitignore variants', async () => {
|
|
151
|
+
writeFile(testRoot, '.gitignore', 'node_modules\n.swc/\n');
|
|
152
|
+
const builder = createBuilder(testRoot, ['src']);
|
|
153
|
+
await builder.ensureSwcIgnored();
|
|
154
|
+
expect(readFileSync(join(testRoot, '.gitignore'), 'utf-8')).toBe('node_modules\n.swc/\n');
|
|
155
|
+
});
|
|
156
|
+
});
|
|
125
157
|
describe('getDiagnosticsManifestPath', () => {
|
|
126
158
|
let testRoot;
|
|
127
159
|
beforeEach(() => {
|
|
@@ -165,4 +197,4 @@ describe('getDiagnosticsManifestPath', () => {
|
|
|
165
197
|
expect(builder.getDiagnosticsManifestPath()).toBe(join(testRoot, '.vercel/output/diagnostics/workflows-manifest.json'));
|
|
166
198
|
});
|
|
167
199
|
});
|
|
168
|
-
//# sourceMappingURL=get-input-files.test.js.map
|
|
200
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LWlucHV0LWZpbGVzLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZ2V0LWlucHV0LWZpbGVzLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxXQUFXLEVBQ1gsWUFBWSxFQUNaLFlBQVksRUFDWixNQUFNLEVBQ04sYUFBYSxHQUNkLE1BQU0sU0FBUyxDQUFDO0FBQ2pCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDakMsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDMUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDckUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBR2hEOztHQUVHO0FBQ0gsTUFBTSxXQUFZLFNBQVEsV0FBVztJQUNuQyxLQUFLLENBQUMsS0FBSztRQUNULFFBQVE7SUFDVixDQUFDO0lBRUQsbUJBQW1CO0lBQ1osYUFBYTtRQUNsQixPQUFPLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRU0sMEJBQTBCO1FBQy9CLE9BQU8sS0FBSyxDQUFDLDBCQUEwQixFQUFFLENBQUM7SUFDNUMsQ0FBQztJQUVNLGdCQUFnQjtRQUNyQixPQUFPLEtBQUssQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQ2xDLENBQUM7Q0FDRjtBQUVELHdFQUF3RTtBQUN4RSxNQUFNLFVBQVUsR0FBRyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztBQUUxQzs7OztHQUlHO0FBQ0gsU0FBUyxTQUFTLENBQUMsQ0FBUztJQUMxQixPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQy9CLENBQUM7QUFFRCxTQUFTLFNBQVMsQ0FBQyxHQUFXLEVBQUUsWUFBb0IsRUFBRSxPQUFPLEdBQUcsRUFBRTtJQUNoRSxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ3pDLFNBQVMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNsRCxhQUFhLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMxQyxPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDO0FBRUQsU0FBUyxhQUFhLENBQ3BCLFVBQWtCLEVBQ2xCLElBQWMsRUFDZCxrQkFBNkMsRUFBRTtJQUUvQyxNQUFNLE1BQU0sR0FBcUI7UUFDL0IsV0FBVyxFQUFFLFlBQVk7UUFDekIsVUFBVTtRQUNWLElBQUk7UUFDSixlQUFlLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUM7UUFDN0MsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxjQUFjLENBQUM7UUFDckQsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxZQUFZLENBQUM7UUFDakQsR0FBRyxlQUFlO0tBQ25CLENBQUM7SUFDRixPQUFPLElBQUksV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ2pDLENBQUM7QUFFRCxRQUFRLENBQUMsZUFBZSxFQUFFLEdBQUcsRUFBRTtJQUM3QixJQUFJLFFBQWdCLENBQUM7SUFFckIsVUFBVSxDQUFDLEdBQUcsRUFBRTtRQUNkLFFBQVEsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDLENBQUM7SUFDL0QsQ0FBQyxDQUFDLENBQUM7SUFFSCxTQUFTLENBQUMsR0FBRyxFQUFFO1FBQ2IsTUFBTSxDQUFDLFFBQVEsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDckQsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsaURBQWlELEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDL0QsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNyQyxTQUFTLENBQUMsTUFBTSxFQUFFLGlCQUFpQixFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQ3BELFNBQVMsQ0FBQyxNQUFNLEVBQUUscUJBQXFCLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztRQUM1RCxTQUFTLENBQUMsTUFBTSxFQUFFLGlCQUFpQixFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBRXBELE1BQU0sT0FBTyxHQUFHLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ2pELE1BQU0sS0FBSyxHQUFHLENBQUMsTUFBTSxPQUFPLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFN0QsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEUsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsOEJBQThCLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDNUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNyQyxTQUFTLENBQUMsTUFBTSxFQUFFLGlCQUFpQixFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQ3BELFNBQVMsQ0FBQyxNQUFNLEVBQUUsaUJBQWlCLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFFcEQsTUFBTSxPQUFPLEdBQUcsYUFBYSxDQUFDLFFBQVEsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDakQsTUFBTSxLQUFLLEdBQUcsQ0FBQyxNQUFNLE9BQU8sQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUU3RCxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEUsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsbURBQW1ELEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDakUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNyQyxTQUFTLENBQUMsTUFBTSxFQUFFLDBCQUEwQixDQUFDLENBQUM7UUFDOUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxzQkFBc0IsQ0FBQyxDQUFDO1FBQzFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsMEJBQTBCLENBQUMsQ0FBQztRQUM5QyxTQUFTLENBQUMsTUFBTSxFQUFFLHdCQUF3QixDQUFDLENBQUM7UUFDNUMsU0FBUyxDQUFDLE1BQU0sRUFBRSw0QkFBNEIsQ0FBQyxDQUFDO1FBQ2hELFNBQVMsQ0FBQyxNQUFNLEVBQUUseUJBQXlCLENBQUMsQ0FBQztRQUM3QyxTQUFTLENBQUMsTUFBTSxFQUFFLGdDQUFnQyxDQUFDLENBQUM7UUFDcEQsU0FBUyxDQUFDLE1BQU0sRUFBRSwrQkFBK0IsQ0FBQyxDQUFDO1FBQ25ELFNBQVMsQ0FBQyxNQUFNLEVBQUUsNkJBQTZCLENBQUMsQ0FBQztRQUNqRCxTQUFTLENBQUMsTUFBTSxFQUFFLHVCQUF1QixDQUFDLENBQUM7UUFDM0MsU0FBUyxDQUFDLE1BQU0sRUFBRSx3QkFBd0IsQ0FBQyxDQUFDO1FBQzVDLFNBQVMsQ0FBQyxNQUFNLEVBQUUseUJBQXlCLENBQUMsQ0FBQztRQUM3QyxTQUFTLENBQUMsTUFBTSxFQUFFLHlCQUF5QixDQUFDLENBQUM7UUFDN0MsU0FBUyxDQUFDLE1BQU0sRUFBRSwyQkFBMkIsQ0FBQyxDQUFDO1FBQy9DLGlDQUFpQztRQUNqQyxTQUFTLENBQUMsTUFBTSxFQUFFLGlCQUFpQixFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBRXBELE1BQU0sT0FBTyxHQUFHLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ2pELE1BQU0sS0FBSyxHQUFHLENBQUMsTUFBTSxPQUFPLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFN0QsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQ3pCLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLDBCQUEwQixDQUFDLENBQUMsQ0FDcEQsQ0FBQztRQUNGLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUN6QixTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxzQkFBc0IsQ0FBQyxDQUFDLENBQ2hELENBQUM7UUFDRixNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FDekIsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsMEJBQTBCLENBQUMsQ0FBQyxDQUNwRCxDQUFDO1FBQ0YsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQ3pCLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLHdCQUF3QixDQUFDLENBQUMsQ0FDbEQsQ0FBQztRQUNGLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUN6QixTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSw0QkFBNEIsQ0FBQyxDQUFDLENBQ3RELENBQUM7UUFDRixNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FDekIsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUseUJBQXlCLENBQUMsQ0FBQyxDQUNuRCxDQUFDO1FBQ0YsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQ3pCLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLGdDQUFnQyxDQUFDLENBQUMsQ0FDMUQsQ0FBQztRQUNGLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUN6QixTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSwrQkFBK0IsQ0FBQyxDQUFDLENBQ3pELENBQUM7UUFDRixNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FDekIsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsNkJBQTZCLENBQUMsQ0FBQyxDQUN2RCxDQUFDO1FBQ0YsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQ3pCLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLHVCQUF1QixDQUFDLENBQUMsQ0FDakQsQ0FBQztRQUNGLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUN6QixTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSx3QkFBd0IsQ0FBQyxDQUFDLENBQ2xELENBQUM7UUFDRixNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FDekIsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUseUJBQXlCLENBQUMsQ0FBQyxDQUNuRCxDQUFDO1FBQ0YsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQ3pCLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLHlCQUF5QixDQUFDLENBQUMsQ0FDbkQsQ0FBQztRQUNGLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUN6QixTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSwyQkFBMkIsQ0FBQyxDQUFDLENBQ3JELENBQUM7UUFDRixNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3RFLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLHNFQUFzRSxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ3BGLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDckMsU0FBUyxDQUFDLE1BQU0sRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3BDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztRQUN0QyxTQUFTLENBQUMsTUFBTSxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBQ25DLFNBQVMsQ0FBQyxNQUFNLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztRQUVyQyxNQUFNLE9BQU8sR0FBRyxhQUFhLENBQUMsUUFBUSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNqRCxNQUFNLEtBQUssR0FBRyxDQUFDLE1BQU0sT0FBTyxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRTdELE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3RFLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUM7QUFFSCxRQUFRLENBQUMsa0JBQWtCLEVBQUUsR0FBRyxFQUFFO0lBQ2hDLElBQUksUUFBZ0IsQ0FBQztJQUVyQixVQUFVLENBQUMsR0FBRyxFQUFFO1FBQ2QsUUFBUSxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLGdCQUFnQixDQUFDLENBQUMsQ0FBQztJQUM3RCxDQUFDLENBQUMsQ0FBQztJQUVILFNBQVMsQ0FBQyxHQUFHLEVBQUU7UUFDYixNQUFNLENBQUMsUUFBUSxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNyRCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQywwQ0FBMEMsRUFBRSxLQUFLLElBQUksRUFBRTtRQUN4RCxTQUFTLENBQUMsUUFBUSxFQUFFLFlBQVksRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1FBRXBELE1BQU0sT0FBTyxHQUFHLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBRWpELE1BQU0sT0FBTyxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDakMsTUFBTSxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUVqQyxNQUFNLFNBQVMsR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxZQUFZLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN0RSxNQUFNLFVBQVUsR0FBRyxTQUFTO2FBQ3pCLEtBQUssQ0FBQyxPQUFPLENBQUM7YUFDZCxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxPQUFPLENBQUMsQ0FBQztRQUU3QyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLENBQUM7UUFDaEQsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyQyxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyw0Q0FBNEMsRUFBRSxLQUFLLElBQUksRUFBRTtRQUMxRCxTQUFTLENBQUMsUUFBUSxFQUFFLFlBQVksRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO1FBRTNELE1BQU0sT0FBTyxHQUFHLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBRWpELE1BQU0sT0FBTyxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFFakMsTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUM5RCx1QkFBdUIsQ0FDeEIsQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUM7QUFFSCxRQUFRLENBQUMsNEJBQTRCLEVBQUUsR0FBRyxFQUFFO0lBQzFDLElBQUksUUFBZ0IsQ0FBQztJQUVyQixVQUFVLENBQUMsR0FBRyxFQUFFO1FBQ2QsUUFBUSxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLG1CQUFtQixDQUFDLENBQUMsQ0FBQztJQUNoRSxDQUFDLENBQUMsQ0FBQztJQUVILFNBQVMsQ0FBQyxHQUFHLEVBQUU7UUFDYixNQUFNLENBQUMsUUFBUSxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNyRCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxpREFBaUQsRUFBRSxHQUFHLEVBQUU7UUFDekQsTUFBTSxPQUFPLEdBQUcsYUFBYSxDQUFDLFFBQVEsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQy9DLGNBQWMsRUFBRSxtQkFBbUI7U0FDcEMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxDQUFDLE9BQU8sQ0FBQywwQkFBMEIsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUMvQyxJQUFJLENBQUMsUUFBUSxFQUFFLDJDQUEyQyxDQUFDLENBQzVELENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxpRUFBaUUsRUFBRSxHQUFHLEVBQUU7UUFDekUsTUFBTSxtQkFBbUIsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDO1FBQzlELE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLEdBQUcsUUFBUSxDQUFDO1FBQzdDLElBQUksQ0FBQztZQUNILE1BQU0sT0FBTyxHQUFHLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBRWpELE1BQU0sQ0FBQyxPQUFPLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQy9ELENBQUM7Z0JBQVMsQ0FBQztZQUNULElBQUksbUJBQW1CLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ3RDLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQztZQUMzQyxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsR0FBRyxtQkFBbUIsQ0FBQztZQUMxRCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLGdFQUFnRSxFQUFFLEdBQUcsRUFBRTtRQUN4RSxNQUFNLE1BQU0sR0FBNEI7WUFDdEMsV0FBVyxFQUFFLHlCQUF5QjtZQUN0QyxVQUFVLEVBQUUsUUFBUTtZQUNwQixJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDYixlQUFlLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUM7WUFDM0MsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxjQUFjLENBQUM7WUFDbkQsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxZQUFZLENBQUM7U0FDaEQsQ0FBQztRQUNGLE1BQU0sT0FBTyxHQUFHLElBQUksV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRXhDLE1BQU0sQ0FBQyxPQUFPLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FDL0MsSUFBSSxDQUFDLFFBQVEsRUFBRSxvREFBb0QsQ0FBQyxDQUNyRSxDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIG1rZGlyU3luYyxcbiAgbWtkdGVtcFN5bmMsXG4gIHJlYWRGaWxlU3luYyxcbiAgcmVhbHBhdGhTeW5jLFxuICBybVN5bmMsXG4gIHdyaXRlRmlsZVN5bmMsXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgdG1wZGlyIH0gZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgeyBkaXJuYW1lLCBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IGFmdGVyRWFjaCwgYmVmb3JlRWFjaCwgZGVzY3JpYmUsIGV4cGVjdCwgaXQgfSBmcm9tICd2aXRlc3QnO1xuaW1wb3J0IHsgQmFzZUJ1aWxkZXIgfSBmcm9tICcuL2Jhc2UtYnVpbGRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFN0YW5kYWxvbmVDb25maWcsIFZlcmNlbEJ1aWxkT3V0cHV0Q29uZmlnIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbi8qKlxuICogTWluaW1hbCBzdWJjbGFzcyB0byBleHBvc2UgdGhlIHByb3RlY3RlZCBgZ2V0SW5wdXRGaWxlcygpYCBmb3IgdGVzdGluZy5cbiAqL1xuY2xhc3MgVGVzdEJ1aWxkZXIgZXh0ZW5kcyBCYXNlQnVpbGRlciB7XG4gIGFzeW5jIGJ1aWxkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIG5vLW9wXG4gIH1cblxuICAvLyBFeHBvc2UgZm9yIHRlc3RzXG4gIHB1YmxpYyBnZXRJbnB1dEZpbGVzKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICByZXR1cm4gc3VwZXIuZ2V0SW5wdXRGaWxlcygpO1xuICB9XG5cbiAgcHVibGljIGdldERpYWdub3N0aWNzTWFuaWZlc3RQYXRoKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHN1cGVyLmdldERpYWdub3N0aWNzTWFuaWZlc3RQYXRoKCk7XG4gIH1cblxuICBwdWJsaWMgZW5zdXJlU3djSWdub3JlZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gc3VwZXIuZW5zdXJlU3djSWdub3JlZCgpO1xuICB9XG59XG5cbi8vIFJlc29sdmUgc3ltbGlua3MgaW4gdG1wZGlyIHRvIGF2b2lkIG1hY09TIC92YXIgLT4gL3ByaXZhdGUvdmFyIGlzc3Vlc1xuY29uc3QgcmVhbFRtcGRpciA9IHJlYWxwYXRoU3luYyh0bXBkaXIoKSk7XG5cbi8qKlxuICogTm9ybWFsaXplIGEgcGF0aCB0byBmb3J3YXJkIHNsYXNoZXMgZm9yIGNyb3NzLXBsYXRmb3JtIGNvbXBhcmlzb24uXG4gKiB0aW55Z2xvYmJ5IGFsd2F5cyByZXR1cm5zIGZvcndhcmQtc2xhc2ggcGF0aHMsIGV2ZW4gb24gV2luZG93cyxcbiAqIHdoaWxlIE5vZGUncyBgcGF0aC5qb2luKClgIHVzZXMgYmFja3NsYXNoZXMgb24gV2luZG93cy5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplKHA6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBwLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcbn1cblxuZnVuY3Rpb24gd3JpdGVGaWxlKGRpcjogc3RyaW5nLCByZWxhdGl2ZVBhdGg6IHN0cmluZywgY29udGVudCA9ICcnKTogc3RyaW5nIHtcbiAgY29uc3QgZnVsbFBhdGggPSBqb2luKGRpciwgcmVsYXRpdmVQYXRoKTtcbiAgbWtkaXJTeW5jKGRpcm5hbWUoZnVsbFBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgd3JpdGVGaWxlU3luYyhmdWxsUGF0aCwgY29udGVudCwgJ3V0Zi04Jyk7XG4gIHJldHVybiBmdWxsUGF0aDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQnVpbGRlcihcbiAgd29ya2luZ0Rpcjogc3RyaW5nLFxuICBkaXJzOiBzdHJpbmdbXSxcbiAgY29uZmlnT3ZlcnJpZGVzOiBQYXJ0aWFsPFN0YW5kYWxvbmVDb25maWc+ID0ge31cbik6IFRlc3RCdWlsZGVyIHtcbiAgY29uc3QgY29uZmlnOiBTdGFuZGFsb25lQ29uZmlnID0ge1xuICAgIGJ1aWxkVGFyZ2V0OiAnc3RhbmRhbG9uZScsXG4gICAgd29ya2luZ0RpcixcbiAgICBkaXJzLFxuICAgIHN0ZXBzQnVuZGxlUGF0aDogam9pbih3b3JraW5nRGlyLCAnc3RlcHMuanMnKSxcbiAgICB3b3JrZmxvd3NCdW5kbGVQYXRoOiBqb2luKHdvcmtpbmdEaXIsICd3b3JrZmxvd3MuanMnKSxcbiAgICB3ZWJob29rQnVuZGxlUGF0aDogam9pbih3b3JraW5nRGlyLCAnd2ViaG9vay5qcycpLFxuICAgIC4uLmNvbmZpZ092ZXJyaWRlcyxcbiAgfTtcbiAgcmV0dXJuIG5ldyBUZXN0QnVpbGRlcihjb25maWcpO1xufVxuXG5kZXNjcmliZSgnZ2V0SW5wdXRGaWxlcycsICgpID0+IHtcbiAgbGV0IHRlc3RSb290OiBzdHJpbmc7XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgdGVzdFJvb3QgPSBta2R0ZW1wU3luYyhqb2luKHJlYWxUbXBkaXIsICdnZXQtaW5wdXQtZmlsZXMtJykpO1xuICB9KTtcblxuICBhZnRlckVhY2goKCkgPT4ge1xuICAgIHJtU3luYyh0ZXN0Um9vdCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICB9KTtcblxuICBpdCgnZGlzY292ZXJzIGZpbGVzIGluc2lkZSBkb3QtcHJlZml4ZWQgZGlyZWN0b3JpZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgc3JjRGlyID0gam9pbih0ZXN0Um9vdCwgJ3NyYycpO1xuICAgIHdyaXRlRmlsZShzcmNEaXIsICcuaGlkZGVuL3N0ZXAudHMnLCBcIid1c2Ugc3RlcCc7XCIpO1xuICAgIHdyaXRlRmlsZShzcmNEaXIsICcuY29uZmlnL3dvcmtmbG93LnRzJywgXCIndXNlIHdvcmtmbG93JztcIik7XG4gICAgd3JpdGVGaWxlKHNyY0RpciwgJ3JlZ3VsYXIvc3RlcC50cycsIFwiJ3VzZSBzdGVwJztcIik7XG5cbiAgICBjb25zdCBidWlsZGVyID0gY3JlYXRlQnVpbGRlcih0ZXN0Um9vdCwgWydzcmMnXSk7XG4gICAgY29uc3QgZmlsZXMgPSAoYXdhaXQgYnVpbGRlci5nZXRJbnB1dEZpbGVzKCkpLm1hcChub3JtYWxpemUpO1xuXG4gICAgZXhwZWN0KGZpbGVzKS50b0NvbnRhaW4obm9ybWFsaXplKGpvaW4oc3JjRGlyLCAnLmhpZGRlbi9zdGVwLnRzJykpKTtcbiAgICBleHBlY3QoZmlsZXMpLnRvQ29udGFpbihub3JtYWxpemUoam9pbihzcmNEaXIsICcuY29uZmlnL3dvcmtmbG93LnRzJykpKTtcbiAgICBleHBlY3QoZmlsZXMpLnRvQ29udGFpbihub3JtYWxpemUoam9pbihzcmNEaXIsICdyZWd1bGFyL3N0ZXAudHMnKSkpO1xuICB9KTtcblxuICBpdCgnZGlzY292ZXJzIGRvdC1wcmVmaXhlZCBmaWxlcycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBzcmNEaXIgPSBqb2luKHRlc3RSb290LCAnc3JjJyk7XG4gICAgd3JpdGVGaWxlKHNyY0RpciwgJy5oaWRkZW4tc3RlcC50cycsIFwiJ3VzZSBzdGVwJztcIik7XG4gICAgd3JpdGVGaWxlKHNyY0RpciwgJ3Zpc2libGUtc3RlcC50cycsIFwiJ3VzZSBzdGVwJztcIik7XG5cbiAgICBjb25zdCBidWlsZGVyID0gY3JlYXRlQnVpbGRlcih0ZXN0Um9vdCwgWydzcmMnXSk7XG4gICAgY29uc3QgZmlsZXMgPSAoYXdhaXQgYnVpbGRlci5nZXRJbnB1dEZpbGVzKCkpLm1hcChub3JtYWxpemUpO1xuXG4gICAgZXhwZWN0KGZpbGVzKS50b0NvbnRhaW4obm9ybWFsaXplKGpvaW4oc3JjRGlyLCAnLmhpZGRlbi1zdGVwLnRzJykpKTtcbiAgICBleHBlY3QoZmlsZXMpLnRvQ29udGFpbihub3JtYWxpemUoam9pbihzcmNEaXIsICd2aXNpYmxlLXN0ZXAudHMnKSkpO1xuICB9KTtcblxuICBpdCgnc3RpbGwgZXhjbHVkZXMgZXhwbGljaXRseSBpZ25vcmVkIGRvdC1kaXJlY3RvcmllcycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBzcmNEaXIgPSBqb2luKHRlc3RSb290LCAnc3JjJyk7XG4gICAgd3JpdGVGaWxlKHNyY0RpciwgJy5naXQvaG9va3MvcHJlLWNvbW1pdC50cycpO1xuICAgIHdyaXRlRmlsZShzcmNEaXIsICcubmV4dC9zZXJ2ZXIvcGFnZS50cycpO1xuICAgIHdyaXRlRmlsZShzcmNEaXIsICcubnV4dC93b3JrZmxvdy9zdGVwcy5tanMnKTtcbiAgICB3cml0ZUZpbGUoc3JjRGlyLCAnLnZlcmNlbC9vdXRwdXQvc3RlcC50cycpO1xuICAgIHdyaXRlRmlsZShzcmNEaXIsICcuc3ZlbHRlLWtpdC9vdXRwdXQvc3RlcC50cycpO1xuICAgIHdyaXRlRmlsZShzcmNEaXIsICcud29ya2Zsb3ctZGF0YS9zdGF0ZS50cycpO1xuICAgIHdyaXRlRmlsZShzcmNEaXIsICcud29ya2Zsb3ctdml0ZXN0L3dvcmtmbG93cy5tanMnKTtcbiAgICB3cml0ZUZpbGUoc3JjRGlyLCAnLndlbGwta25vd24vd29ya2Zsb3cvcm91dGUudHMnKTtcbiAgICB3cml0ZUZpbGUoc3JjRGlyLCAnLnN3Yy9jYWNoZS9wbHVnaW4tb3V0cHV0LnRzJyk7XG4gICAgd3JpdGVGaWxlKHNyY0RpciwgJy50dXJiby9jYWNoZS9idWlsZC50cycpO1xuICAgIHdyaXRlRmlsZShzcmNEaXIsICcuY2FjaGUvYmFiZWwvcGx1Z2luLmpzJyk7XG4gICAgd3JpdGVGaWxlKHNyY0RpciwgJy55YXJuL3JlbGVhc2VzL3lhcm4uY2pzJyk7XG4gICAgd3JpdGVGaWxlKHNyY0RpciwgJy5wbnBtLXN0b3JlL3YzL2ZpbGVzLnRzJyk7XG4gICAgd3JpdGVGaWxlKHNyY0RpciwgJ25vZGVfbW9kdWxlcy9wa2cvaW5kZXgudHMnKTtcbiAgICAvLyBUaGlzIG9uZSBzaG91bGQgc3RpbGwgYmUgZm91bmRcbiAgICB3cml0ZUZpbGUoc3JjRGlyLCAnLmN1c3RvbS9zdGVwLnRzJywgXCIndXNlIHN0ZXAnO1wiKTtcblxuICAgIGNvbnN0IGJ1aWxkZXIgPSBjcmVhdGVCdWlsZGVyKHRlc3RSb290LCBbJ3NyYyddKTtcbiAgICBjb25zdCBmaWxlcyA9IChhd2FpdCBidWlsZGVyLmdldElucHV0RmlsZXMoKSkubWFwKG5vcm1hbGl6ZSk7XG5cbiAgICBleHBlY3QoZmlsZXMpLm5vdC50b0NvbnRhaW4oXG4gICAgICBub3JtYWxpemUoam9pbihzcmNEaXIsICcuZ2l0L2hvb2tzL3ByZS1jb21taXQudHMnKSlcbiAgICApO1xuICAgIGV4cGVjdChmaWxlcykubm90LnRvQ29udGFpbihcbiAgICAgIG5vcm1hbGl6ZShqb2luKHNyY0RpciwgJy5uZXh0L3NlcnZlci9wYWdlLnRzJykpXG4gICAgKTtcbiAgICBleHBlY3QoZmlsZXMpLm5vdC50b0NvbnRhaW4oXG4gICAgICBub3JtYWxpemUoam9pbihzcmNEaXIsICcubnV4dC93b3JrZmxvdy9zdGVwcy5tanMnKSlcbiAgICApO1xuICAgIGV4cGVjdChmaWxlcykubm90LnRvQ29udGFpbihcbiAgICAgIG5vcm1hbGl6ZShqb2luKHNyY0RpciwgJy52ZXJjZWwvb3V0cHV0L3N0ZXAudHMnKSlcbiAgICApO1xuICAgIGV4cGVjdChmaWxlcykubm90LnRvQ29udGFpbihcbiAgICAgIG5vcm1hbGl6ZShqb2luKHNyY0RpciwgJy5zdmVsdGUta2l0L291dHB1dC9zdGVwLnRzJykpXG4gICAgKTtcbiAgICBleHBlY3QoZmlsZXMpLm5vdC50b0NvbnRhaW4oXG4gICAgICBub3JtYWxpemUoam9pbihzcmNEaXIsICcud29ya2Zsb3ctZGF0YS9zdGF0ZS50cycpKVxuICAgICk7XG4gICAgZXhwZWN0KGZpbGVzKS5ub3QudG9Db250YWluKFxuICAgICAgbm9ybWFsaXplKGpvaW4oc3JjRGlyLCAnLndvcmtmbG93LXZpdGVzdC93b3JrZmxvd3MubWpzJykpXG4gICAgKTtcbiAgICBleHBlY3QoZmlsZXMpLm5vdC50b0NvbnRhaW4oXG4gICAgICBub3JtYWxpemUoam9pbihzcmNEaXIsICcud2VsbC1rbm93bi93b3JrZmxvdy9yb3V0ZS50cycpKVxuICAgICk7XG4gICAgZXhwZWN0KGZpbGVzKS5ub3QudG9Db250YWluKFxuICAgICAgbm9ybWFsaXplKGpvaW4oc3JjRGlyLCAnLnN3Yy9jYWNoZS9wbHVnaW4tb3V0cHV0LnRzJykpXG4gICAgKTtcbiAgICBleHBlY3QoZmlsZXMpLm5vdC50b0NvbnRhaW4oXG4gICAgICBub3JtYWxpemUoam9pbihzcmNEaXIsICcudHVyYm8vY2FjaGUvYnVpbGQudHMnKSlcbiAgICApO1xuICAgIGV4cGVjdChmaWxlcykubm90LnRvQ29udGFpbihcbiAgICAgIG5vcm1hbGl6ZShqb2luKHNyY0RpciwgJy5jYWNoZS9iYWJlbC9wbHVnaW4uanMnKSlcbiAgICApO1xuICAgIGV4cGVjdChmaWxlcykubm90LnRvQ29udGFpbihcbiAgICAgIG5vcm1hbGl6ZShqb2luKHNyY0RpciwgJy55YXJuL3JlbGVhc2VzL3lhcm4uY2pzJykpXG4gICAgKTtcbiAgICBleHBlY3QoZmlsZXMpLm5vdC50b0NvbnRhaW4oXG4gICAgICBub3JtYWxpemUoam9pbihzcmNEaXIsICcucG5wbS1zdG9yZS92My9maWxlcy50cycpKVxuICAgICk7XG4gICAgZXhwZWN0KGZpbGVzKS5ub3QudG9Db250YWluKFxuICAgICAgbm9ybWFsaXplKGpvaW4oc3JjRGlyLCAnbm9kZV9tb2R1bGVzL3BrZy9pbmRleC50cycpKVxuICAgICk7XG4gICAgZXhwZWN0KGZpbGVzKS50b0NvbnRhaW4obm9ybWFsaXplKGpvaW4oc3JjRGlyLCAnLmN1c3RvbS9zdGVwLnRzJykpKTtcbiAgfSk7XG5cbiAgaXQoJ2Rpc2NvdmVycyBmaWxlcyB3aXRoIHZhcmlvdXMgc3VwcG9ydGVkIGV4dGVuc2lvbnMgaW4gZG90LWRpcmVjdG9yaWVzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHNyY0RpciA9IGpvaW4odGVzdFJvb3QsICdzcmMnKTtcbiAgICB3cml0ZUZpbGUoc3JjRGlyLCAnLmFwaS9yb3V0ZS50c3gnKTtcbiAgICB3cml0ZUZpbGUoc3JjRGlyLCAnLmFwaS9oYW5kbGVyLm10cycpO1xuICAgIHdyaXRlRmlsZShzcmNEaXIsICcuYXBpL3V0aWxzLmpzJyk7XG4gICAgd3JpdGVGaWxlKHNyY0RpciwgJy5hcGkvY29uZmlnLmNqcycpO1xuXG4gICAgY29uc3QgYnVpbGRlciA9IGNyZWF0ZUJ1aWxkZXIodGVzdFJvb3QsIFsnc3JjJ10pO1xuICAgIGNvbnN0IGZpbGVzID0gKGF3YWl0IGJ1aWxkZXIuZ2V0SW5wdXRGaWxlcygpKS5tYXAobm9ybWFsaXplKTtcblxuICAgIGV4cGVjdChmaWxlcykudG9Db250YWluKG5vcm1hbGl6ZShqb2luKHNyY0RpciwgJy5hcGkvcm91dGUudHN4JykpKTtcbiAgICBleHBlY3QoZmlsZXMpLnRvQ29udGFpbihub3JtYWxpemUoam9pbihzcmNEaXIsICcuYXBpL2hhbmRsZXIubXRzJykpKTtcbiAgICBleHBlY3QoZmlsZXMpLnRvQ29udGFpbihub3JtYWxpemUoam9pbihzcmNEaXIsICcuYXBpL3V0aWxzLmpzJykpKTtcbiAgICBleHBlY3QoZmlsZXMpLnRvQ29udGFpbihub3JtYWxpemUoam9pbihzcmNEaXIsICcuYXBpL2NvbmZpZy5janMnKSkpO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnZW5zdXJlU3djSWdub3JlZCcsICgpID0+IHtcbiAgbGV0IHRlc3RSb290OiBzdHJpbmc7XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgdGVzdFJvb3QgPSBta2R0ZW1wU3luYyhqb2luKHJlYWxUbXBkaXIsICdzd2MtZ2l0aWdub3JlLScpKTtcbiAgfSk7XG5cbiAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICBybVN5bmModGVzdFJvb3QsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgfSk7XG5cbiAgaXQoJ2FkZHMgLnN3YyB0byB0aGUgcHJvamVjdCAuZ2l0aWdub3JlIG9uY2UnLCBhc3luYyAoKSA9PiB7XG4gICAgd3JpdGVGaWxlKHRlc3RSb290LCAnLmdpdGlnbm9yZScsICdub2RlX21vZHVsZXNcXG4nKTtcblxuICAgIGNvbnN0IGJ1aWxkZXIgPSBjcmVhdGVCdWlsZGVyKHRlc3RSb290LCBbJ3NyYyddKTtcblxuICAgIGF3YWl0IGJ1aWxkZXIuZW5zdXJlU3djSWdub3JlZCgpO1xuICAgIGF3YWl0IGJ1aWxkZXIuZW5zdXJlU3djSWdub3JlZCgpO1xuXG4gICAgY29uc3QgZ2l0aWdub3JlID0gcmVhZEZpbGVTeW5jKGpvaW4odGVzdFJvb3QsICcuZ2l0aWdub3JlJyksICd1dGYtOCcpO1xuICAgIGNvbnN0IHN3Y0VudHJpZXMgPSBnaXRpZ25vcmVcbiAgICAgIC5zcGxpdCgvXFxyP1xcbi8pXG4gICAgICAuZmlsdGVyKChsaW5lKSA9PiBsaW5lLnRyaW0oKSA9PT0gJy8uc3djJyk7XG5cbiAgICBleHBlY3QoZ2l0aWdub3JlKS50b0JlKCdub2RlX21vZHVsZXNcXG4vLnN3Y1xcbicpO1xuICAgIGV4cGVjdChzd2NFbnRyaWVzKS50b0hhdmVMZW5ndGgoMSk7XG4gIH0pO1xuXG4gIGl0KCdwcmVzZXJ2ZXMgZXhpc3RpbmcgLnN3YyBnaXRpZ25vcmUgdmFyaWFudHMnLCBhc3luYyAoKSA9PiB7XG4gICAgd3JpdGVGaWxlKHRlc3RSb290LCAnLmdpdGlnbm9yZScsICdub2RlX21vZHVsZXNcXG4uc3djL1xcbicpO1xuXG4gICAgY29uc3QgYnVpbGRlciA9IGNyZWF0ZUJ1aWxkZXIodGVzdFJvb3QsIFsnc3JjJ10pO1xuXG4gICAgYXdhaXQgYnVpbGRlci5lbnN1cmVTd2NJZ25vcmVkKCk7XG5cbiAgICBleHBlY3QocmVhZEZpbGVTeW5jKGpvaW4odGVzdFJvb3QsICcuZ2l0aWdub3JlJyksICd1dGYtOCcpKS50b0JlKFxuICAgICAgJ25vZGVfbW9kdWxlc1xcbi5zd2MvXFxuJ1xuICAgICk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdnZXREaWFnbm9zdGljc01hbmlmZXN0UGF0aCcsICgpID0+IHtcbiAgbGV0IHRlc3RSb290OiBzdHJpbmc7XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgdGVzdFJvb3QgPSBta2R0ZW1wU3luYyhqb2luKHJlYWxUbXBkaXIsICdkaWFnbm9zdGljcy1wYXRoLScpKTtcbiAgfSk7XG5cbiAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICBybVN5bmModGVzdFJvb3QsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgfSk7XG5cbiAgaXQoJ3VzZXMgYW4gZXhwbGljaXQgZGlhZ25vc3RpY3NEaXIgd2hlbiBjb25maWd1cmVkJywgKCkgPT4ge1xuICAgIGNvbnN0IGJ1aWxkZXIgPSBjcmVhdGVCdWlsZGVyKHRlc3RSb290LCBbJ3NyYyddLCB7XG4gICAgICBkaWFnbm9zdGljc0RpcjogJy5uZXh0L2RpYWdub3N0aWNzJyxcbiAgICB9KTtcblxuICAgIGV4cGVjdChidWlsZGVyLmdldERpYWdub3N0aWNzTWFuaWZlc3RQYXRoKCkpLnRvQmUoXG4gICAgICBqb2luKHRlc3RSb290LCAnLm5leHQvZGlhZ25vc3RpY3Mvd29ya2Zsb3dzLW1hbmlmZXN0Lmpzb24nKVxuICAgICk7XG4gIH0pO1xuXG4gIGl0KCdkb2VzIG5vdCBlbWl0IFZlcmNlbCBkaWFnbm9zdGljcyBmb3Igbm9uLVZlcmNlbCBidWlsZGVyIHRhcmdldHMnLCAoKSA9PiB7XG4gICAgY29uc3QgcHJldmlvdXNUYXJnZXRXb3JsZCA9IHByb2Nlc3MuZW52LldPUktGTE9XX1RBUkdFVF9XT1JMRDtcbiAgICBwcm9jZXNzLmVudi5XT1JLRkxPV19UQVJHRVRfV09STEQgPSAndmVyY2VsJztcbiAgICB0cnkge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGNyZWF0ZUJ1aWxkZXIodGVzdFJvb3QsIFsnc3JjJ10pO1xuXG4gICAgICBleHBlY3QoYnVpbGRlci5nZXREaWFnbm9zdGljc01hbmlmZXN0UGF0aCgpKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChwcmV2aW91c1RhcmdldFdvcmxkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZGVsZXRlIHByb2Nlc3MuZW52LldPUktGTE9XX1RBUkdFVF9XT1JMRDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHByb2Nlc3MuZW52LldPUktGTE9XX1RBUkdFVF9XT1JMRCA9IHByZXZpb3VzVGFyZ2V0V29ybGQ7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICBpdCgnZmFsbHMgYmFjayB0byBWZXJjZWwgb3V0cHV0IGRpYWdub3N0aWNzIGZvciB0aGUgVmVyY2VsIGJ1aWxkZXInLCAoKSA9PiB7XG4gICAgY29uc3QgY29uZmlnOiBWZXJjZWxCdWlsZE91dHB1dENvbmZpZyA9IHtcbiAgICAgIGJ1aWxkVGFyZ2V0OiAndmVyY2VsLWJ1aWxkLW91dHB1dC1hcGknLFxuICAgICAgd29ya2luZ0RpcjogdGVzdFJvb3QsXG4gICAgICBkaXJzOiBbJ3NyYyddLFxuICAgICAgc3RlcHNCdW5kbGVQYXRoOiBqb2luKHRlc3RSb290LCAnc3RlcHMuanMnKSxcbiAgICAgIHdvcmtmbG93c0J1bmRsZVBhdGg6IGpvaW4odGVzdFJvb3QsICd3b3JrZmxvd3MuanMnKSxcbiAgICAgIHdlYmhvb2tCdW5kbGVQYXRoOiBqb2luKHRlc3RSb290LCAnd2ViaG9vay5qcycpLFxuICAgIH07XG4gICAgY29uc3QgYnVpbGRlciA9IG5ldyBUZXN0QnVpbGRlcihjb25maWcpO1xuXG4gICAgZXhwZWN0KGJ1aWxkZXIuZ2V0RGlhZ25vc3RpY3NNYW5pZmVzdFBhdGgoKSkudG9CZShcbiAgICAgIGpvaW4odGVzdFJvb3QsICcudmVyY2VsL291dHB1dC9kaWFnbm9zdGljcy93b3JrZmxvd3MtbWFuaWZlc3QuanNvbicpXG4gICAgKTtcbiAgfSk7XG59KTtcbiJdfQ==
|
package/dist/index.d.ts
CHANGED
|
@@ -2,11 +2,15 @@ export type { WorkflowManifest } from './apply-swc-transform.js';
|
|
|
2
2
|
export { applySwcTransform } from './apply-swc-transform.js';
|
|
3
3
|
export { BaseBuilder } 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';
|
|
6
|
-
export {
|
|
7
|
-
export { createDiscoverEntriesPlugin } from './discover-entries-esbuild-plugin.js';
|
|
5
|
+
export { createBaseBuilderConfig, type DecoratorOptions, type DecoratorOptionsWithConfigPath, getDecoratorOptionsForDirectory, getDecoratorOptionsForDirectoryWithConfigPath, resolveConfiguredProjectRoot, resolveProjectRoot, } from './config-helpers.js';
|
|
6
|
+
export { createWorkflowEntrypointOptionsCode, createWorkflowQueueTrigger, WORKFLOW_QUEUE_TRIGGER, } from './constants.js';
|
|
7
|
+
export { createDiscoverEntriesPlugin, parentHasChild, } from './discover-entries-esbuild-plugin.js';
|
|
8
8
|
export { clearModuleSpecifierCache, getImportPath, type ImportPathResult, type ModuleSpecifierResult, resolveModuleSpecifier, } from './module-specifier.js';
|
|
9
|
+
export { WORKFLOW_NODE_COMPAT_BANNER, WORKFLOW_NODE_FILENAME_BANNER, } from './node-compat-banner.js';
|
|
9
10
|
export { createNodeModuleErrorPlugin } from './node-module-esbuild-plugin.js';
|
|
11
|
+
export { WORKFLOW_OPTIONAL_OTEL_API_MODULE } from './optional-otel-api.js';
|
|
12
|
+
export { WORKFLOW_OPTIONAL_PG_NATIVE_ALIAS } from './optional-pg-native-alias.js';
|
|
13
|
+
export { WORKFLOW_OPTIONAL_TYPESCRIPT_ALIAS } from './optional-typescript-alias.js';
|
|
10
14
|
export { createPseudoPackagePlugin, PSEUDO_PACKAGES, } from './pseudo-package-esbuild-plugin.js';
|
|
11
15
|
export { NORMALIZE_REQUEST_CODE } from './request-converter.js';
|
|
12
16
|
export { analyzeSerdeCompliance, extractClassEntries, type SerdeCheckResult, type SerdeClassCheckResult, } from './serde-checker.js';
|
|
@@ -17,4 +21,5 @@ export type { AstroConfig, BuildTarget, NextConfig, StandaloneConfig, SvelteKitC
|
|
|
17
21
|
export { isValidBuildTarget, validBuildTargets } from './types.js';
|
|
18
22
|
export { VercelBuildOutputAPIBuilder } from './vercel-build-output-api.js';
|
|
19
23
|
export { resolveWorkflowAliasRelativePath } from './workflow-alias.js';
|
|
24
|
+
export { createWorkflowWorldTargetEsbuildPlugin, ensureWorkflowTargetWorldEnv, getWorldImport, isWorkflowTargetWorldPath, normalizeWorkflowTargetWorldImport, resolveWorkflowCoreRuntimeAlias, resolveWorkflowTargetWorldAlias, WORKFLOW_CORE_RUNTIME_MODULE, WORKFLOW_WORLD_TARGET_MODULE, type WorkflowWorldTargetEnvironment, } from './world-target.js';
|
|
20
25
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EACL,uBAAuB,EACvB,KAAK,gBAAgB,EACrB,KAAK,8BAA8B,EACnC,+BAA+B,EAC/B,6CAA6C,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EACL,uBAAuB,EACvB,KAAK,gBAAgB,EACrB,KAAK,8BAA8B,EACnC,+BAA+B,EAC/B,6CAA6C,EAC7C,4BAA4B,EAC5B,kBAAkB,GACnB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,mCAAmC,EACnC,0BAA0B,EAC1B,sBAAsB,GACvB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,2BAA2B,EAC3B,cAAc,GACf,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EACL,yBAAyB,EACzB,aAAa,EACb,KAAK,gBAAgB,EACrB,KAAK,qBAAqB,EAC1B,sBAAsB,GACvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,2BAA2B,EAC3B,6BAA6B,GAC9B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,2BAA2B,EAAE,MAAM,iCAAiC,CAAC;AAC9E,OAAO,EAAE,iCAAiC,EAAE,MAAM,wBAAwB,CAAC;AAC3E,OAAO,EAAE,iCAAiC,EAAE,MAAM,+BAA+B,CAAC;AAClF,OAAO,EAAE,kCAAkC,EAAE,MAAM,gCAAgC,CAAC;AACpF,OAAO,EACL,yBAAyB,EACzB,eAAe,GAChB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EACL,sBAAsB,EACtB,mBAAmB,EACnB,KAAK,gBAAgB,EACrB,KAAK,qBAAqB,GAC3B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EACL,sBAAsB,EACtB,4BAA4B,EAC5B,uBAAuB,EACvB,mBAAmB,EACnB,uBAAuB,EACvB,cAAc,EACd,kBAAkB,EAClB,KAAK,oBAAoB,EACzB,0BAA0B,EAC1B,0BAA0B,GAC3B,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EACV,WAAW,EACX,WAAW,EACX,UAAU,EACV,gBAAgB,EAChB,eAAe,EACf,uBAAuB,EACvB,cAAc,GACf,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACnE,OAAO,EAAE,2BAA2B,EAAE,MAAM,8BAA8B,CAAC;AAC3E,OAAO,EAAE,gCAAgC,EAAE,MAAM,qBAAqB,CAAC;AACvE,OAAO,EACL,sCAAsC,EACtC,4BAA4B,EAC5B,cAAc,EACd,yBAAyB,EACzB,kCAAkC,EAClC,+BAA+B,EAC/B,+BAA+B,EAC/B,4BAA4B,EAC5B,4BAA4B,EAC5B,KAAK,8BAA8B,GACpC,MAAM,mBAAmB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
export { applySwcTransform } from './apply-swc-transform.js';
|
|
2
2
|
export { BaseBuilder } from './base-builder.js';
|
|
3
3
|
export { createBuildQueue } from './build-queue.js';
|
|
4
|
-
export { createBaseBuilderConfig, getDecoratorOptionsForDirectory, getDecoratorOptionsForDirectoryWithConfigPath, } from './config-helpers.js';
|
|
5
|
-
export {
|
|
6
|
-
export { createDiscoverEntriesPlugin } from './discover-entries-esbuild-plugin.js';
|
|
4
|
+
export { createBaseBuilderConfig, getDecoratorOptionsForDirectory, getDecoratorOptionsForDirectoryWithConfigPath, resolveConfiguredProjectRoot, resolveProjectRoot, } from './config-helpers.js';
|
|
5
|
+
export { createWorkflowEntrypointOptionsCode, createWorkflowQueueTrigger, WORKFLOW_QUEUE_TRIGGER, } from './constants.js';
|
|
6
|
+
export { createDiscoverEntriesPlugin, parentHasChild, } from './discover-entries-esbuild-plugin.js';
|
|
7
7
|
export { clearModuleSpecifierCache, getImportPath, resolveModuleSpecifier, } from './module-specifier.js';
|
|
8
|
+
export { WORKFLOW_NODE_COMPAT_BANNER, WORKFLOW_NODE_FILENAME_BANNER, } from './node-compat-banner.js';
|
|
8
9
|
export { createNodeModuleErrorPlugin } from './node-module-esbuild-plugin.js';
|
|
10
|
+
export { WORKFLOW_OPTIONAL_OTEL_API_MODULE } from './optional-otel-api.js';
|
|
11
|
+
export { WORKFLOW_OPTIONAL_PG_NATIVE_ALIAS } from './optional-pg-native-alias.js';
|
|
12
|
+
export { WORKFLOW_OPTIONAL_TYPESCRIPT_ALIAS } from './optional-typescript-alias.js';
|
|
9
13
|
export { createPseudoPackagePlugin, PSEUDO_PACKAGES, } from './pseudo-package-esbuild-plugin.js';
|
|
10
14
|
export { NORMALIZE_REQUEST_CODE } from './request-converter.js';
|
|
11
15
|
export { analyzeSerdeCompliance, extractClassEntries, } from './serde-checker.js';
|
|
@@ -15,4 +19,5 @@ export { detectWorkflowPatterns, generatedWorkflowPathPattern, isGeneratedWorkfl
|
|
|
15
19
|
export { isValidBuildTarget, validBuildTargets } from './types.js';
|
|
16
20
|
export { VercelBuildOutputAPIBuilder } from './vercel-build-output-api.js';
|
|
17
21
|
export { resolveWorkflowAliasRelativePath } from './workflow-alias.js';
|
|
18
|
-
|
|
22
|
+
export { createWorkflowWorldTargetEsbuildPlugin, ensureWorkflowTargetWorldEnv, getWorldImport, isWorkflowTargetWorldPath, normalizeWorkflowTargetWorldImport, resolveWorkflowCoreRuntimeAlias, resolveWorkflowTargetWorldAlias, WORKFLOW_CORE_RUNTIME_MODULE, WORKFLOW_WORLD_TARGET_MODULE, } from './world-target.js';
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3BELE9BQU8sRUFDTCx1QkFBdUIsRUFHdkIsK0JBQStCLEVBQy9CLDZDQUE2QyxFQUM3Qyw0QkFBNEIsRUFDNUIsa0JBQWtCLEdBQ25CLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUNMLG1DQUFtQyxFQUNuQywwQkFBMEIsRUFDMUIsc0JBQXNCLEdBQ3ZCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUNMLDJCQUEyQixFQUMzQixjQUFjLEdBQ2YsTUFBTSxzQ0FBc0MsQ0FBQztBQUM5QyxPQUFPLEVBQ0wseUJBQXlCLEVBQ3pCLGFBQWEsRUFHYixzQkFBc0IsR0FDdkIsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQixPQUFPLEVBQ0wsMkJBQTJCLEVBQzNCLDZCQUE2QixHQUM5QixNQUFNLHlCQUF5QixDQUFDO0FBQ2pDLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzlFLE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzNFLE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ2xGLE9BQU8sRUFBRSxrQ0FBa0MsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3BGLE9BQU8sRUFDTCx5QkFBeUIsRUFDekIsZUFBZSxHQUNoQixNQUFNLG9DQUFvQyxDQUFDO0FBQzVDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2hFLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsbUJBQW1CLEdBR3BCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzFELE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsNEJBQTRCLEVBQzVCLHVCQUF1QixFQUN2QixtQkFBbUIsRUFDbkIsdUJBQXVCLEVBQ3ZCLGNBQWMsRUFDZCxrQkFBa0IsRUFFbEIsMEJBQTBCLEVBQzFCLDBCQUEwQixHQUMzQixNQUFNLHNCQUFzQixDQUFDO0FBVTlCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNuRSxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMzRSxPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RSxPQUFPLEVBQ0wsc0NBQXNDLEVBQ3RDLDRCQUE0QixFQUM1QixjQUFjLEVBQ2QseUJBQXlCLEVBQ3pCLGtDQUFrQyxFQUNsQywrQkFBK0IsRUFDL0IsK0JBQStCLEVBQy9CLDRCQUE0QixFQUM1Qiw0QkFBNEIsR0FFN0IsTUFBTSxtQkFBbUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIHsgV29ya2Zsb3dNYW5pZmVzdCB9IGZyb20gJy4vYXBwbHktc3djLXRyYW5zZm9ybS5qcyc7XG5leHBvcnQgeyBhcHBseVN3Y1RyYW5zZm9ybSB9IGZyb20gJy4vYXBwbHktc3djLXRyYW5zZm9ybS5qcyc7XG5leHBvcnQgeyBCYXNlQnVpbGRlciB9IGZyb20gJy4vYmFzZS1idWlsZGVyLmpzJztcbmV4cG9ydCB7IGNyZWF0ZUJ1aWxkUXVldWUgfSBmcm9tICcuL2J1aWxkLXF1ZXVlLmpzJztcbmV4cG9ydCB7XG4gIGNyZWF0ZUJhc2VCdWlsZGVyQ29uZmlnLFxuICB0eXBlIERlY29yYXRvck9wdGlvbnMsXG4gIHR5cGUgRGVjb3JhdG9yT3B0aW9uc1dpdGhDb25maWdQYXRoLFxuICBnZXREZWNvcmF0b3JPcHRpb25zRm9yRGlyZWN0b3J5LFxuICBnZXREZWNvcmF0b3JPcHRpb25zRm9yRGlyZWN0b3J5V2l0aENvbmZpZ1BhdGgsXG4gIHJlc29sdmVDb25maWd1cmVkUHJvamVjdFJvb3QsXG4gIHJlc29sdmVQcm9qZWN0Um9vdCxcbn0gZnJvbSAnLi9jb25maWctaGVscGVycy5qcyc7XG5leHBvcnQge1xuICBjcmVhdGVXb3JrZmxvd0VudHJ5cG9pbnRPcHRpb25zQ29kZSxcbiAgY3JlYXRlV29ya2Zsb3dRdWV1ZVRyaWdnZXIsXG4gIFdPUktGTE9XX1FVRVVFX1RSSUdHRVIsXG59IGZyb20gJy4vY29uc3RhbnRzLmpzJztcbmV4cG9ydCB7XG4gIGNyZWF0ZURpc2NvdmVyRW50cmllc1BsdWdpbixcbiAgcGFyZW50SGFzQ2hpbGQsXG59IGZyb20gJy4vZGlzY292ZXItZW50cmllcy1lc2J1aWxkLXBsdWdpbi5qcyc7XG5leHBvcnQge1xuICBjbGVhck1vZHVsZVNwZWNpZmllckNhY2hlLFxuICBnZXRJbXBvcnRQYXRoLFxuICB0eXBlIEltcG9ydFBhdGhSZXN1bHQsXG4gIHR5cGUgTW9kdWxlU3BlY2lmaWVyUmVzdWx0LFxuICByZXNvbHZlTW9kdWxlU3BlY2lmaWVyLFxufSBmcm9tICcuL21vZHVsZS1zcGVjaWZpZXIuanMnO1xuZXhwb3J0IHtcbiAgV09SS0ZMT1dfTk9ERV9DT01QQVRfQkFOTkVSLFxuICBXT1JLRkxPV19OT0RFX0ZJTEVOQU1FX0JBTk5FUixcbn0gZnJvbSAnLi9ub2RlLWNvbXBhdC1iYW5uZXIuanMnO1xuZXhwb3J0IHsgY3JlYXRlTm9kZU1vZHVsZUVycm9yUGx1Z2luIH0gZnJvbSAnLi9ub2RlLW1vZHVsZS1lc2J1aWxkLXBsdWdpbi5qcyc7XG5leHBvcnQgeyBXT1JLRkxPV19PUFRJT05BTF9PVEVMX0FQSV9NT0RVTEUgfSBmcm9tICcuL29wdGlvbmFsLW90ZWwtYXBpLmpzJztcbmV4cG9ydCB7IFdPUktGTE9XX09QVElPTkFMX1BHX05BVElWRV9BTElBUyB9IGZyb20gJy4vb3B0aW9uYWwtcGctbmF0aXZlLWFsaWFzLmpzJztcbmV4cG9ydCB7IFdPUktGTE9XX09QVElPTkFMX1RZUEVTQ1JJUFRfQUxJQVMgfSBmcm9tICcuL29wdGlvbmFsLXR5cGVzY3JpcHQtYWxpYXMuanMnO1xuZXhwb3J0IHtcbiAgY3JlYXRlUHNldWRvUGFja2FnZVBsdWdpbixcbiAgUFNFVURPX1BBQ0tBR0VTLFxufSBmcm9tICcuL3BzZXVkby1wYWNrYWdlLWVzYnVpbGQtcGx1Z2luLmpzJztcbmV4cG9ydCB7IE5PUk1BTElaRV9SRVFVRVNUX0NPREUgfSBmcm9tICcuL3JlcXVlc3QtY29udmVydGVyLmpzJztcbmV4cG9ydCB7XG4gIGFuYWx5emVTZXJkZUNvbXBsaWFuY2UsXG4gIGV4dHJhY3RDbGFzc0VudHJpZXMsXG4gIHR5cGUgU2VyZGVDaGVja1Jlc3VsdCxcbiAgdHlwZSBTZXJkZUNsYXNzQ2hlY2tSZXN1bHQsXG59IGZyb20gJy4vc2VyZGUtY2hlY2tlci5qcyc7XG5leHBvcnQgeyBTdGFuZGFsb25lQnVpbGRlciB9IGZyb20gJy4vc3RhbmRhbG9uZS5qcyc7XG5leHBvcnQgeyBjcmVhdGVTd2NQbHVnaW4gfSBmcm9tICcuL3N3Yy1lc2J1aWxkLXBsdWdpbi5qcyc7XG5leHBvcnQge1xuICBkZXRlY3RXb3JrZmxvd1BhdHRlcm5zLFxuICBnZW5lcmF0ZWRXb3JrZmxvd1BhdGhQYXR0ZXJuLFxuICBpc0dlbmVyYXRlZFdvcmtmbG93RmlsZSxcbiAgc2hvdWxkVHJhbnNmb3JtRmlsZSxcbiAgdHVyYm9wYWNrQ29udGVudFBhdHRlcm4sXG4gIHVzZVN0ZXBQYXR0ZXJuLFxuICB1c2VXb3JrZmxvd1BhdHRlcm4sXG4gIHR5cGUgV29ya2Zsb3dQYXR0ZXJuTWF0Y2gsXG4gIHdvcmtmbG93U2VyZGVJbXBvcnRQYXR0ZXJuLFxuICB3b3JrZmxvd1NlcmRlU3ltYm9sUGF0dGVybixcbn0gZnJvbSAnLi90cmFuc2Zvcm0tdXRpbHMuanMnO1xuZXhwb3J0IHR5cGUge1xuICBBc3Ryb0NvbmZpZyxcbiAgQnVpbGRUYXJnZXQsXG4gIE5leHRDb25maWcsXG4gIFN0YW5kYWxvbmVDb25maWcsXG4gIFN2ZWx0ZUtpdENvbmZpZyxcbiAgVmVyY2VsQnVpbGRPdXRwdXRDb25maWcsXG4gIFdvcmtmbG93Q29uZmlnLFxufSBmcm9tICcuL3R5cGVzLmpzJztcbmV4cG9ydCB7IGlzVmFsaWRCdWlsZFRhcmdldCwgdmFsaWRCdWlsZFRhcmdldHMgfSBmcm9tICcuL3R5cGVzLmpzJztcbmV4cG9ydCB7IFZlcmNlbEJ1aWxkT3V0cHV0QVBJQnVpbGRlciB9IGZyb20gJy4vdmVyY2VsLWJ1aWxkLW91dHB1dC1hcGkuanMnO1xuZXhwb3J0IHsgcmVzb2x2ZVdvcmtmbG93QWxpYXNSZWxhdGl2ZVBhdGggfSBmcm9tICcuL3dvcmtmbG93LWFsaWFzLmpzJztcbmV4cG9ydCB7XG4gIGNyZWF0ZVdvcmtmbG93V29ybGRUYXJnZXRFc2J1aWxkUGx1Z2luLFxuICBlbnN1cmVXb3JrZmxvd1RhcmdldFdvcmxkRW52LFxuICBnZXRXb3JsZEltcG9ydCxcbiAgaXNXb3JrZmxvd1RhcmdldFdvcmxkUGF0aCxcbiAgbm9ybWFsaXplV29ya2Zsb3dUYXJnZXRXb3JsZEltcG9ydCxcbiAgcmVzb2x2ZVdvcmtmbG93Q29yZVJ1bnRpbWVBbGlhcyxcbiAgcmVzb2x2ZVdvcmtmbG93VGFyZ2V0V29ybGRBbGlhcyxcbiAgV09SS0ZMT1dfQ09SRV9SVU5USU1FX01PRFVMRSxcbiAgV09SS0ZMT1dfV09STERfVEFSR0VUX01PRFVMRSxcbiAgdHlwZSBXb3JrZmxvd1dvcmxkVGFyZ2V0RW52aXJvbm1lbnQsXG59IGZyb20gJy4vd29ybGQtdGFyZ2V0LmpzJztcbiJdfQ==
|