@workflow/builders 5.0.0-beta.3 → 5.0.0-beta.31

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 (134) 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 +127 -13
  8. package/dist/base-builder.d.ts.map +1 -1
  9. package/dist/base-builder.js +812 -102
  10. package/dist/build-queue.js +1 -1
  11. package/dist/config-helpers.d.ts +4 -1
  12. package/dist/config-helpers.d.ts.map +1 -1
  13. package/dist/config-helpers.js +63 -1
  14. package/dist/config-helpers.test.d.ts +2 -0
  15. package/dist/config-helpers.test.d.ts.map +1 -0
  16. package/dist/config-helpers.test.js +17 -0
  17. package/dist/constants.d.ts +31 -5
  18. package/dist/constants.d.ts.map +1 -1
  19. package/dist/constants.js +71 -19
  20. package/dist/constants.test.d.ts +2 -0
  21. package/dist/constants.test.d.ts.map +1 -0
  22. package/dist/constants.test.js +40 -0
  23. package/dist/discover-entries-esbuild-plugin.d.ts +3 -1
  24. package/dist/discover-entries-esbuild-plugin.d.ts.map +1 -1
  25. package/dist/discover-entries-esbuild-plugin.js +24 -4
  26. package/dist/discover-entries-esbuild-plugin.test.js +1 -1
  27. package/dist/esbuild-tsconfig.js +1 -1
  28. package/dist/esbuild-tsconfig.test.js +1 -1
  29. package/dist/external-package-warning.test.d.ts +2 -0
  30. package/dist/external-package-warning.test.d.ts.map +1 -0
  31. package/dist/external-package-warning.test.js +219 -0
  32. package/dist/fast-discovery.d.ts +20 -0
  33. package/dist/fast-discovery.d.ts.map +1 -0
  34. package/dist/fast-discovery.js +774 -0
  35. package/dist/fast-discovery.test.d.ts +2 -0
  36. package/dist/fast-discovery.test.d.ts.map +1 -0
  37. package/dist/fast-discovery.test.js +336 -0
  38. package/dist/get-input-files.test.js +34 -2
  39. package/dist/index.d.ts +8 -3
  40. package/dist/index.d.ts.map +1 -1
  41. package/dist/index.js +9 -4
  42. package/dist/module-specifier.d.ts +20 -2
  43. package/dist/module-specifier.d.ts.map +1 -1
  44. package/dist/module-specifier.js +92 -17
  45. package/dist/module-specifier.test.js +45 -3
  46. package/dist/node-compat-banner.d.ts +15 -0
  47. package/dist/node-compat-banner.d.ts.map +1 -0
  48. package/dist/node-compat-banner.js +15 -0
  49. package/dist/node-module-esbuild-plugin.d.ts.map +1 -1
  50. package/dist/node-module-esbuild-plugin.js +73 -23
  51. package/dist/node-module-esbuild-plugin.test.js +97 -1
  52. package/dist/optional-otel-api.d.ts +14 -0
  53. package/dist/optional-otel-api.d.ts.map +1 -0
  54. package/dist/optional-otel-api.js +14 -0
  55. package/dist/optional-pg-native-alias.d.ts +2 -0
  56. package/dist/optional-pg-native-alias.d.ts.map +1 -0
  57. package/dist/optional-pg-native-alias.js +3 -0
  58. package/dist/optional-pg-native.d.ts +3 -0
  59. package/dist/optional-pg-native.d.ts.map +1 -0
  60. package/dist/optional-pg-native.js +3 -0
  61. package/dist/optional-typescript-alias.d.ts +2 -0
  62. package/dist/optional-typescript-alias.d.ts.map +1 -0
  63. package/dist/optional-typescript-alias.js +3 -0
  64. package/dist/optional-typescript.d.ts +3 -0
  65. package/dist/optional-typescript.d.ts.map +1 -0
  66. package/dist/optional-typescript.js +9 -0
  67. package/dist/pseudo-package-esbuild-plugin.js +1 -1
  68. package/dist/pseudo-package-esbuild-plugin.test.js +1 -1
  69. package/dist/request-converter.js +1 -1
  70. package/dist/resolve-sourcemap.test.d.ts +2 -0
  71. package/dist/resolve-sourcemap.test.d.ts.map +1 -0
  72. package/dist/resolve-sourcemap.test.js +194 -0
  73. package/dist/serde-checker.js +1 -1
  74. package/dist/standalone.d.ts +0 -3
  75. package/dist/standalone.d.ts.map +1 -1
  76. package/dist/standalone.js +12 -41
  77. package/dist/step-source-registration.test.d.ts +2 -0
  78. package/dist/step-source-registration.test.d.ts.map +1 -0
  79. package/dist/step-source-registration.test.js +82 -0
  80. package/dist/swc-esbuild-plugin.d.ts +10 -0
  81. package/dist/swc-esbuild-plugin.d.ts.map +1 -1
  82. package/dist/swc-esbuild-plugin.js +116 -14
  83. package/dist/swc-esbuild-plugin.test.js +370 -6
  84. package/dist/transform-utils.d.ts.map +1 -1
  85. package/dist/transform-utils.js +45 -6
  86. package/dist/transform-utils.test.js +78 -6
  87. package/dist/types.d.ts +38 -2
  88. package/dist/types.d.ts.map +1 -1
  89. package/dist/types.js +1 -1
  90. package/dist/vercel-build-output-api.d.ts +0 -2
  91. package/dist/vercel-build-output-api.d.ts.map +1 -1
  92. package/dist/vercel-build-output-api.js +31 -59
  93. package/dist/workflow-alias.js +1 -1
  94. package/dist/workflow-alias.test.js +1 -1
  95. package/dist/workflows-extractor.js +8 -3
  96. package/dist/workflows-extractor.test.d.ts +2 -0
  97. package/dist/workflows-extractor.test.d.ts.map +1 -0
  98. package/dist/workflows-extractor.test.js +70 -0
  99. package/dist/world-target.d.ts +20 -0
  100. package/dist/world-target.d.ts.map +1 -0
  101. package/dist/world-target.js +74 -0
  102. package/dist/world-target.test.d.ts +2 -0
  103. package/dist/world-target.test.d.ts.map +1 -0
  104. package/dist/world-target.test.js +106 -0
  105. package/package.json +9 -7
  106. package/dist/apply-swc-transform.js.map +0 -1
  107. package/dist/base-builder.js.map +0 -1
  108. package/dist/build-queue.js.map +0 -1
  109. package/dist/config-helpers.js.map +0 -1
  110. package/dist/constants.js.map +0 -1
  111. package/dist/discover-entries-esbuild-plugin.js.map +0 -1
  112. package/dist/discover-entries-esbuild-plugin.test.js.map +0 -1
  113. package/dist/esbuild-tsconfig.js.map +0 -1
  114. package/dist/esbuild-tsconfig.test.js.map +0 -1
  115. package/dist/get-input-files.test.js.map +0 -1
  116. package/dist/index.js.map +0 -1
  117. package/dist/module-specifier.js.map +0 -1
  118. package/dist/module-specifier.test.js.map +0 -1
  119. package/dist/node-module-esbuild-plugin.js.map +0 -1
  120. package/dist/node-module-esbuild-plugin.test.js.map +0 -1
  121. package/dist/pseudo-package-esbuild-plugin.js.map +0 -1
  122. package/dist/pseudo-package-esbuild-plugin.test.js.map +0 -1
  123. package/dist/request-converter.js.map +0 -1
  124. package/dist/serde-checker.js.map +0 -1
  125. package/dist/standalone.js.map +0 -1
  126. package/dist/swc-esbuild-plugin.js.map +0 -1
  127. package/dist/swc-esbuild-plugin.test.js.map +0 -1
  128. package/dist/transform-utils.js.map +0 -1
  129. package/dist/transform-utils.test.js.map +0 -1
  130. package/dist/types.js.map +0 -1
  131. package/dist/vercel-build-output-api.js.map +0 -1
  132. package/dist/workflow-alias.js.map +0 -1
  133. package/dist/workflow-alias.test.js.map +0 -1
  134. package/dist/workflows-extractor.js.map +0 -1
@@ -0,0 +1,219 @@
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, vi } from 'vitest';
5
+ import { BaseBuilder } from './base-builder.js';
6
+ /**
7
+ * Minimal subclass to expose the protected `discoverEntries()` for testing.
8
+ */
9
+ class TestBuilder extends BaseBuilder {
10
+ async build() {
11
+ // no-op
12
+ }
13
+ // Expose for tests
14
+ discoverEntriesPublic(inputs, outdir) {
15
+ return this.discoverEntries(inputs, outdir);
16
+ }
17
+ }
18
+ // Resolve symlinks in tmpdir to avoid macOS /var -> /private/var issues
19
+ const realTmpdir = realpathSync(tmpdir());
20
+ function writeFile(path, contents) {
21
+ mkdirSync(dirname(path), { recursive: true });
22
+ writeFileSync(path, contents, 'utf-8');
23
+ }
24
+ function createBuilder(workingDir, externalPackages) {
25
+ const config = {
26
+ buildTarget: 'standalone',
27
+ workingDir,
28
+ dirs: ['.'],
29
+ externalPackages,
30
+ stepsBundlePath: join(workingDir, 'steps.js'),
31
+ workflowsBundlePath: join(workingDir, 'workflows.js'),
32
+ webhookBundlePath: join(workingDir, 'webhook.js'),
33
+ };
34
+ return new TestBuilder(config);
35
+ }
36
+ describe('warnAboutExternalWorkflowPackages', () => {
37
+ let testRoot;
38
+ let warnSpy;
39
+ beforeEach(() => {
40
+ testRoot = mkdtempSync(join(realTmpdir, 'workflow-external-pkg-warning-'));
41
+ warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => { });
42
+ });
43
+ afterEach(() => {
44
+ warnSpy.mockRestore();
45
+ rmSync(testRoot, { recursive: true, force: true });
46
+ });
47
+ it('warns when an external package depends on @workflow/serde', async () => {
48
+ // Create a mock project with a node_modules package
49
+ const projectDir = join(testRoot, 'project');
50
+ // Create a minimal entry file for the project
51
+ writeFile(join(projectDir, 'index.ts'), 'export const x = 1;');
52
+ // Create the external package with @workflow/serde dependency
53
+ writeFile(join(projectDir, 'node_modules', 'my-serde-pkg', 'package.json'), JSON.stringify({
54
+ name: 'my-serde-pkg',
55
+ version: '1.0.0',
56
+ main: 'index.js',
57
+ dependencies: {
58
+ '@workflow/serde': '^1.0.0',
59
+ },
60
+ }));
61
+ writeFile(join(projectDir, 'node_modules', 'my-serde-pkg', 'index.js'), 'export class Foo {}');
62
+ const builder = createBuilder(projectDir, ['my-serde-pkg']);
63
+ await builder.discoverEntriesPublic([join(projectDir, 'index.ts')], join(projectDir, 'out'));
64
+ expect(warnSpy).toHaveBeenCalled();
65
+ const warnMessage = warnSpy.mock.calls[0]?.[0];
66
+ expect(warnMessage).toContain('my-serde-pkg');
67
+ expect(warnMessage).toContain('serverExternalPackages');
68
+ expect(warnMessage).toContain('serialization classes');
69
+ });
70
+ it('warns when an external package source contains serde symbols', async () => {
71
+ const projectDir = join(testRoot, 'project');
72
+ writeFile(join(projectDir, 'index.ts'), 'export const x = 1;');
73
+ // Package without @workflow/serde dep but with Symbol.for patterns in source
74
+ writeFile(join(projectDir, 'node_modules', 'my-symbol-pkg', 'package.json'), JSON.stringify({
75
+ name: 'my-symbol-pkg',
76
+ version: '1.0.0',
77
+ main: 'index.js',
78
+ }));
79
+ writeFile(join(projectDir, 'node_modules', 'my-symbol-pkg', 'index.js'), `export class Bar {
80
+ static [Symbol.for('workflow-serialize')](instance) { return {}; }
81
+ static [Symbol.for('workflow-deserialize')](data) { return new Bar(); }
82
+ }`);
83
+ const builder = createBuilder(projectDir, ['my-symbol-pkg']);
84
+ await builder.discoverEntriesPublic([join(projectDir, 'index.ts')], join(projectDir, 'out'));
85
+ expect(warnSpy).toHaveBeenCalled();
86
+ const warnMessage = warnSpy.mock.calls[0]?.[0];
87
+ expect(warnMessage).toContain('my-symbol-pkg');
88
+ expect(warnMessage).toContain('serialization classes');
89
+ });
90
+ it('warns when an external package contains "use step" directives', async () => {
91
+ const projectDir = join(testRoot, 'project');
92
+ writeFile(join(projectDir, 'index.ts'), 'export const x = 1;');
93
+ writeFile(join(projectDir, 'node_modules', 'my-step-pkg', 'package.json'), JSON.stringify({
94
+ name: 'my-step-pkg',
95
+ version: '1.0.0',
96
+ main: 'index.js',
97
+ }));
98
+ writeFile(join(projectDir, 'node_modules', 'my-step-pkg', 'index.js'), `export async function doWork() {
99
+ "use step";
100
+ return 42;
101
+ }`);
102
+ const builder = createBuilder(projectDir, ['my-step-pkg']);
103
+ await builder.discoverEntriesPublic([join(projectDir, 'index.ts')], join(projectDir, 'out'));
104
+ expect(warnSpy).toHaveBeenCalled();
105
+ const warnMessage = warnSpy.mock.calls[0]?.[0];
106
+ expect(warnMessage).toContain('my-step-pkg');
107
+ expect(warnMessage).toContain('"use step" functions');
108
+ });
109
+ it('warns when an external package contains "use workflow" directives', async () => {
110
+ const projectDir = join(testRoot, 'project');
111
+ writeFile(join(projectDir, 'index.ts'), 'export const x = 1;');
112
+ writeFile(join(projectDir, 'node_modules', 'my-workflow-pkg', 'package.json'), JSON.stringify({
113
+ name: 'my-workflow-pkg',
114
+ version: '1.0.0',
115
+ main: 'index.js',
116
+ }));
117
+ writeFile(join(projectDir, 'node_modules', 'my-workflow-pkg', 'index.js'), `export async function runJob() {
118
+ "use workflow";
119
+ return "done";
120
+ }`);
121
+ const builder = createBuilder(projectDir, ['my-workflow-pkg']);
122
+ await builder.discoverEntriesPublic([join(projectDir, 'index.ts')], join(projectDir, 'out'));
123
+ expect(warnSpy).toHaveBeenCalled();
124
+ const warnMessage = warnSpy.mock.calls[0]?.[0];
125
+ expect(warnMessage).toContain('my-workflow-pkg');
126
+ expect(warnMessage).toContain('"use workflow" functions');
127
+ });
128
+ it('does not warn for packages without workflow patterns', async () => {
129
+ const projectDir = join(testRoot, 'project');
130
+ writeFile(join(projectDir, 'index.ts'), 'export const x = 1;');
131
+ writeFile(join(projectDir, 'node_modules', 'plain-pkg', 'package.json'), JSON.stringify({
132
+ name: 'plain-pkg',
133
+ version: '1.0.0',
134
+ main: 'index.js',
135
+ }));
136
+ writeFile(join(projectDir, 'node_modules', 'plain-pkg', 'index.js'), 'export const hello = "world";');
137
+ const builder = createBuilder(projectDir, ['plain-pkg']);
138
+ await builder.discoverEntriesPublic([join(projectDir, 'index.ts')], join(projectDir, 'out'));
139
+ expect(warnSpy).not.toHaveBeenCalled();
140
+ });
141
+ it('does not warn for pseudo-packages (server-only, client-only)', async () => {
142
+ const projectDir = join(testRoot, 'project');
143
+ writeFile(join(projectDir, 'index.ts'), 'export const x = 1;');
144
+ const builder = createBuilder(projectDir, ['server-only', 'client-only']);
145
+ await builder.discoverEntriesPublic([join(projectDir, 'index.ts')], join(projectDir, 'out'));
146
+ expect(warnSpy).not.toHaveBeenCalled();
147
+ });
148
+ it('does not warn when externalPackages is empty', async () => {
149
+ const projectDir = join(testRoot, 'project');
150
+ writeFile(join(projectDir, 'index.ts'), 'export const x = 1;');
151
+ const builder = createBuilder(projectDir, []);
152
+ await builder.discoverEntriesPublic([join(projectDir, 'index.ts')], join(projectDir, 'out'));
153
+ expect(warnSpy).not.toHaveBeenCalled();
154
+ });
155
+ it('warns only once per package across multiple discoverEntries calls', async () => {
156
+ const projectDir = join(testRoot, 'project');
157
+ writeFile(join(projectDir, 'index.ts'), 'export const x = 1;');
158
+ writeFile(join(projectDir, 'other.ts'), 'export const y = 2;');
159
+ writeFile(join(projectDir, 'node_modules', 'my-serde-pkg', 'package.json'), JSON.stringify({
160
+ name: 'my-serde-pkg',
161
+ version: '1.0.0',
162
+ main: 'index.js',
163
+ dependencies: { '@workflow/serde': '^1.0.0' },
164
+ }));
165
+ writeFile(join(projectDir, 'node_modules', 'my-serde-pkg', 'index.js'), 'export class Foo {}');
166
+ const builder = createBuilder(projectDir, ['my-serde-pkg']);
167
+ // Call discoverEntries twice with different inputs
168
+ await builder.discoverEntriesPublic([join(projectDir, 'index.ts')], join(projectDir, 'out'));
169
+ await builder.discoverEntriesPublic([join(projectDir, 'other.ts')], join(projectDir, 'out2'));
170
+ // Should only warn once
171
+ const warnCalls = warnSpy.mock.calls.filter((call) => call[0].includes('my-serde-pkg'));
172
+ expect(warnCalls).toHaveLength(1);
173
+ });
174
+ it('lists multiple detected issues in the warning message', async () => {
175
+ const projectDir = join(testRoot, 'project');
176
+ writeFile(join(projectDir, 'index.ts'), 'export const x = 1;');
177
+ writeFile(join(projectDir, 'node_modules', 'multi-pkg', 'package.json'), JSON.stringify({
178
+ name: 'multi-pkg',
179
+ version: '1.0.0',
180
+ main: 'index.js',
181
+ dependencies: { '@workflow/serde': '^1.0.0' },
182
+ }));
183
+ writeFile(join(projectDir, 'node_modules', 'multi-pkg', 'index.js'), `export async function doWork() {
184
+ "use step";
185
+ return 42;
186
+ }
187
+ export class Foo {
188
+ static [Symbol.for('workflow-serialize')](instance) { return {}; }
189
+ static [Symbol.for('workflow-deserialize')](data) { return new Foo(); }
190
+ }`);
191
+ const builder = createBuilder(projectDir, ['multi-pkg']);
192
+ await builder.discoverEntriesPublic([join(projectDir, 'index.ts')], join(projectDir, 'out'));
193
+ expect(warnSpy).toHaveBeenCalled();
194
+ const warnMessage = warnSpy.mock.calls[0]?.[0];
195
+ expect(warnMessage).toContain('"use step" functions');
196
+ expect(warnMessage).toContain('serialization classes');
197
+ });
198
+ it('warns via entry-file detection when package.json has no serde dep', async () => {
199
+ const projectDir = join(testRoot, 'project');
200
+ writeFile(join(projectDir, 'index.ts'), 'export const x = 1;');
201
+ // Package without @workflow/serde in deps, but entry has "use step"
202
+ writeFile(join(projectDir, 'node_modules', 'no-serde-dep-pkg', 'package.json'), JSON.stringify({
203
+ name: 'no-serde-dep-pkg',
204
+ version: '1.0.0',
205
+ main: 'index.js',
206
+ }));
207
+ writeFile(join(projectDir, 'node_modules', 'no-serde-dep-pkg', 'index.js'), `export async function doWork() {
208
+ "use step";
209
+ return 42;
210
+ }`);
211
+ const builder = createBuilder(projectDir, ['no-serde-dep-pkg']);
212
+ await builder.discoverEntriesPublic([join(projectDir, 'index.ts')], join(projectDir, 'out'));
213
+ expect(warnSpy).toHaveBeenCalled();
214
+ const warnMessage = warnSpy.mock.calls[0]?.[0];
215
+ expect(warnMessage).toContain('no-serde-dep-pkg');
216
+ expect(warnMessage).toContain('"use step" functions');
217
+ });
218
+ });
219
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXh0ZXJuYWwtcGFja2FnZS13YXJuaW5nLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZXh0ZXJuYWwtcGFja2FnZS13YXJuaW5nLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxXQUFXLEVBQ1gsWUFBWSxFQUNaLE1BQU0sRUFDTixhQUFhLEdBQ2QsTUFBTSxTQUFTLENBQUM7QUFDakIsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNqQyxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUMxQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDekUsT0FBTyxFQUFFLFdBQVcsRUFBMEIsTUFBTSxtQkFBbUIsQ0FBQztBQUd4RTs7R0FFRztBQUNILE1BQU0sV0FBWSxTQUFRLFdBQVc7SUFDbkMsS0FBSyxDQUFDLEtBQUs7UUFDVCxRQUFRO0lBQ1YsQ0FBQztJQUVELG1CQUFtQjtJQUNaLHFCQUFxQixDQUMxQixNQUFnQixFQUNoQixNQUFjO1FBRWQsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztJQUM5QyxDQUFDO0NBQ0Y7QUFFRCx3RUFBd0U7QUFDeEUsTUFBTSxVQUFVLEdBQUcsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7QUFFMUMsU0FBUyxTQUFTLENBQUMsSUFBWSxFQUFFLFFBQWdCO0lBQy9DLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUM5QyxhQUFhLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUN6QyxDQUFDO0FBRUQsU0FBUyxh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bnQiOlsiaW1wb3J0IHtcbiAgbWtkaXJTeW5jLFxuICBta2R0ZW1wU3luYyxcbiAgcmVhbHBhdGhTeW5jLFxuICBybVN5bmMsXG4gIHdyaXRlRmlsZVN5bmMsXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgdG1wZGlyIH0gZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgeyBkaXJuYW1lLCBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IGFmdGVyRWFjaCwgYmVmb3JlRWFjaCwgZGVzY3JpYmUsIGV4cGVjdCwgaXQsIHZpIH0gZnJvbSAndml0ZXN0JztcbmltcG9ydCB7IEJhc2VCdWlsZGVyLCB0eXBlIERpc2NvdmVyZWRFbnRyaWVzIH0gZnJvbSAnLi9iYXNlLWJ1aWxkZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBTdGFuZGFsb25lQ29uZmlnIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbi8qKlxuICogTWluaW1hbCBzdWJjbGFzcyB0byBleHBvc2UgdGhlIHByb3RlY3RlZCBgZGlzY292ZXJFbnRyaWVzKClgIGZvciB0ZXN0aW5nLlxuICovXG5jbGFzcyBUZXN0QnVpbGRlciBleHRlbmRzIEJhc2VCdWlsZGVyIHtcbiAgYXN5bmMgYnVpbGQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gbm8tb3BcbiAgfVxuXG4gIC8vIEV4cG9zZSBmb3IgdGVzdHNcbiAgcHVibGljIGRpc2NvdmVyRW50cmllc1B1YmxpYyhcbiAgICBpbnB1dHM6IHN0cmluZ1tdLFxuICAgIG91dGRpcjogc3RyaW5nXG4gICk6IFByb21pc2U8RGlzY292ZXJlZEVudHJpZXM+IHtcbiAgICByZXR1cm4gdGhpcy5kaXNjb3ZlckVudHJpZXMoaW5wdXRzLCBvdXRkaXIpO1xuICB9XG59XG5cbi8vIFJlc29sdmUgc3ltbGlua3MgaW4gdG1wZGlyIHRvIGF2b2lkIG1hY09TIC92YXIgLT4gL3ByaXZhdGUvdmFyIGlzc3Vlc1xuY29uc3QgcmVhbFRtcGRpciA9IHJlYWxwYXRoU3luYyh0bXBkaXIoKSk7XG5cbmZ1bmN0aW9uIHdyaXRlRmlsZShwYXRoOiBzdHJpbmcsIGNvbnRlbnRzOiBzdHJpbmcpOiB2b2lkIHtcbiAgbWtkaXJTeW5jKGRpcm5hbWUocGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICB3cml0ZUZpbGVTeW5jKHBhdGgsIGNvbnRlbnRzLCAndXRmLTgnKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQnVpbGRlcihcbiAgd29ya2luZ0Rpcjogc3RyaW5nLFxuICBleHRlcm5hbFBhY2thZ2VzOiBzdHJpbmdbXVxuKTogVGVzdEJ1aWxkZXIge1xuICBjb25zdCBjb25maWc6IFN0YW5kYWxvbmVDb25maWcgPSB7XG4gICAgYnVpbGRUYXJnZXQ6ICdzdGFuZGFsb25lJyxcbiAgICB3b3JraW5nRGlyLFxuICAgIGRpcnM6IFsnLiddLFxuICAgIGV4dGVybmFsUGFja2FnZXMsXG4gICAgc3RlcHNCdW5kbGVQYXRoOiBqb2luKHdvcmtpbmdEaXIsICdzdGVwcy5qcycpLFxuICAgIHdvcmtmbG93c0J1bmRsZVBhdGg6IGpvaW4od29ya2luZ0RpciwgJ3dvcmtmbG93cy5qcycpLFxuICAgIHdlYmhvb2tCdW5kbGVQYXRoOiBqb2luKHdvcmtpbmdEaXIsICd3ZWJob29rLmpzJyksXG4gIH07XG4gIHJldHVybiBuZXcgVGVzdEJ1aWxkZXIoY29uZmlnKTtcbn1cblxuZGVzY3JpYmUoJ3dhcm5BYm91dEV4dGVybmFsV29ya2Zsb3dQYWNrYWdlcycsICgpID0+IHtcbiAgbGV0IHRlc3RSb290OiBzdHJpbmc7XG4gIGxldCB3YXJuU3B5OiBSZXR1cm5UeXBlPHR5cGVvZiB2aS5zcHlPbj47XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgdGVzdFJvb3QgPSBta2R0ZW1wU3luYyhqb2luKHJlYWxUbXBkaXIsICd3b3JrZmxvdy1leHRlcm5hbC1wa2ctd2FybmluZy0nKSk7XG4gICAgd2FyblNweSA9IHZpLnNweU9uKGNvbnNvbGUsICd3YXJuJykubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHt9KTtcbiAgfSk7XG5cbiAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICB3YXJuU3B5Lm1vY2tSZXN0b3JlKCk7XG4gICAgcm1TeW5jKHRlc3RSb290LCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gIH0pO1xuXG4gIGl0KCd3YXJucyB3aGVuIGFuIGV4dGVybmFsIHBhY2thZ2UgZGVwZW5kcyBvbiBAd29ya2Zsb3cvc2VyZGUnLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gQ3JlYXRlIGEgbW9jayBwcm9qZWN0IHdpdGggYSBub2RlX21vZHVsZXMgcGFja2FnZVxuICAgIGNvbnN0IHByb2plY3REaXIgPSBqb2luKHRlc3RSb290LCAncHJvamVjdCcpO1xuXG4gICAgLy8gQ3JlYXRlIGEgbWluaW1hbCBlbnRyeSBmaWxlIGZvciB0aGUgcHJvamVjdFxuICAgIHdyaXRlRmlsZShqb2luKHByb2plY3REaXIsICdpbmRleC50cycpLCAnZXhwb3J0IGNvbnN0IHggPSAxOycpO1xuXG4gICAgLy8gQ3JlYXRlIHRoZSBleHRlcm5hbCBwYWNrYWdlIHdpdGggQHdvcmtmbG93L3NlcmRlIGRlcGVuZGVuY3lcbiAgICB3cml0ZUZpbGUoXG4gICAgICBqb2luKHByb2plY3REaXIsICdub2RlX21vZHVsZXMnLCAnbXktc2VyZGUtcGtnJywgJ3BhY2thZ2UuanNvbicpLFxuICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBuYW1lOiAnbXktc2VyZGUtcGtnJyxcbiAgICAgICAgdmVyc2lvbjogJzEuMC4wJyxcbiAgICAgICAgbWFpbjogJ2luZGV4LmpzJyxcbiAgICAgICAgZGVwZW5kZW5jaWVzOiB7XG4gICAgICAgICAgJ0B3b3JrZmxvdy9zZXJkZSc6ICdeMS4wLjAnLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICApO1xuICAgIHdyaXRlRmlsZShcbiAgICAgIGpvaW4ocHJvamVjdERpciwgJ25vZGVfbW9kdWxlcycsICdteS1zZXJkZS1wa2cnLCAnaW5kZXguanMnKSxcbiAgICAgICdleHBvcnQgY2xhc3MgRm9vIHt9J1xuICAgICk7XG5cbiAgICBjb25zdCBidWlsZGVyID0gY3JlYXRlQnVpbGRlcihwcm9qZWN0RGlyLCBbJ215LXNlcmRlLXBrZyddKTtcbiAgICBhd2FpdCBidWlsZGVyLmRpc2NvdmVyRW50cmllc1B1YmxpYyhcbiAgICAgIFtqb2luKHByb2plY3REaXIsICdpbmRleC50cycpXSxcbiAgICAgIGpvaW4ocHJvamVjdERpciwgJ291dCcpXG4gICAgKTtcblxuICAgIGV4cGVjdCh3YXJuU3B5KS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgY29uc3Qgd2Fybk1lc3NhZ2UgPSB3YXJuU3B5Lm1vY2suY2FsbHNbMF0/LlswXSBhcyBzdHJpbmc7XG4gICAgZXhwZWN0KHdhcm5NZXNzYWdlKS50b0NvbnRhaW4oJ215LXNlcmRlLXBrZycpO1xuICAgIGV4cGVjdCh3YXJuTWVzc2FnZSkudG9Db250YWluKCdzZXJ2ZXJFeHRlcm5hbFBhY2thZ2VzJyk7XG4gICAgZXhwZWN0KHdhcm5NZXNzYWdlKS50b0NvbnRhaW4oJ3NlcmlhbGl6YXRpb24gY2xhc3NlcycpO1xuICB9KTtcblxuICBpdCgnd2FybnMgd2hlbiBhbiBleHRlcm5hbCBwYWNrYWdlIHNvdXJjZSBjb250YWlucyBzZXJkZSBzeW1ib2xzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHByb2plY3REaXIgPSBqb2luKHRlc3RSb290LCAncHJvamVjdCcpO1xuXG4gICAgd3JpdGVGaWxlKGpvaW4ocHJvamVjdERpciwgJ2luZGV4LnRzJyksICdleHBvcnQgY29uc3QgeCA9IDE7Jyk7XG5cbiAgICAvLyBQYWNrYWdlIHdpdGhvdXQgQHdvcmtmbG93L3NlcmRlIGRlcCBidXQgd2l0aCBTeW1ib2wuZm9yIHBhdHRlcm5zIGluIHNvdXJjZVxuICAgIHdyaXRlRmlsZShcbiAgICAgIGpvaW4ocHJvamVjdERpciwgJ25vZGVfbW9kdWxlcycsICdteS1zeW1ib2wtcGtnJywgJ3BhY2thZ2UuanNvbicpLFxuICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBuYW1lOiAnbXktc3ltYm9sLXBrZycsXG4gICAgICAgIHZlcnNpb246ICcxLjAuMCcsXG4gICAgICAgIG1haW46ICdpbmRleC5qcycsXG4gICAgICB9KVxuICAgICk7XG4gICAgd3JpdGVGaWxlKFxuICAgICAgam9pbihwcm9qZWN0RGlyLCAnbm9kZV9tb2R1bGVzJywgJ215LXN5bWJvbC1wa2cnLCAnaW5kZXguanMnKSxcbiAgICAgIGBleHBvcnQgY2xhc3MgQmFyIHtcbiAgc3RhdGljIFtTeW1ib2wuZm9yKCd3b3JrZmxvdy1zZXJpYWxpemUnKV0oaW5zdGFuY2UpIHsgcmV0dXJuIHt9OyB9XG4gIHN0YXRpYyBbU3ltYm9sLmZvcignd29ya2Zsb3ctZGVzZXJpYWxpemUnKV0oZGF0YSkgeyByZXR1cm4gbmV3IEJhcigpOyB9XG59YFxuICAgICk7XG5cbiAgICBjb25zdCBidWlsZGVyID0gY3JlYXRlQnVpbGRlcihwcm9qZWN0RGlyLCBbJ215LXN5bWJvbC1wa2cnXSk7XG4gICAgYXdhaXQgYnVpbGRlci5kaXNjb3ZlckVudHJpZXNQdWJsaWMoXG4gICAgICBbam9pbihwcm9qZWN0RGlyLCAnaW5kZXgudHMnKV0sXG4gICAgICBqb2luKHByb2plY3REaXIsICdvdXQnKVxuICAgICk7XG5cbiAgICBleHBlY3Qod2FyblNweSkudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIGNvbnN0IHdhcm5NZXNzYWdlID0gd2FyblNweS5tb2NrLmNhbGxzWzBdPy5bMF0gYXMgc3RyaW5nO1xuICAgIGV4cGVjdCh3YXJuTWVzc2FnZSkudG9Db250YWluKCdteS1zeW1ib2wtcGtnJyk7XG4gICAgZXhwZWN0KHdhcm5NZXNzYWdlKS50b0NvbnRhaW4oJ3NlcmlhbGl6YXRpb24gY2xhc3NlcycpO1xuICB9KTtcblxuICBpdCgnd2FybnMgd2hlbiBhbiBleHRlcm5hbCBwYWNrYWdlIGNvbnRhaW5zIFwidXNlIHN0ZXBcIiBkaXJlY3RpdmVzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHByb2plY3REaXIgPSBqb2luKHRlc3RSb290LCAncHJvamVjdCcpO1xuXG4gICAgd3JpdGVGaWxlKGpvaW4ocHJvamVjdERpciwgJ2luZGV4LnRzJyksICdleHBvcnQgY29uc3QgeCA9IDE7Jyk7XG5cbiAgICB3cml0ZUZpbGUoXG4gICAgICBqb2luKHByb2plY3REaXIsICdub2RlX21vZHVsZXMnLCAnbXktc3RlcC1wa2cnLCAncGFja2FnZS5qc29uJyksXG4gICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIG5hbWU6ICdteS1zdGVwLXBrZycsXG4gICAgICAgIHZlcnNpb246ICcxLjAuMCcsXG4gICAgICAgIG1haW46ICdpbmRleC5qcycsXG4gICAgICB9KVxuICAgICk7XG4gICAgd3JpdGVGaWxlKFxuICAgICAgam9pbihwcm9qZWN0RGlyLCAnbm9kZV9tb2R1bGVzJywgJ215LXN0ZXAtcGtnJywgJ2luZGV4LmpzJyksXG4gICAgICBgZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRvV29yaygpIHtcbiAgXCJ1c2Ugc3RlcFwiO1xuICByZXR1cm4gNDI7XG59YFxuICAgICk7XG5cbiAgICBjb25zdCBidWlsZGVyID0gY3JlYXRlQnVpbGRlcihwcm9qZWN0RGlyLCBbJ215LXN0ZXAtcGtnJ10pO1xuICAgIGF3YWl0IGJ1aWxkZXIuZGlzY292ZXJFbnRyaWVzUHVibGljKFxuICAgICAgW2pvaW4ocHJvamVjdERpciwgJ2luZGV4LnRzJyldLFxuICAgICAgam9pbihwcm9qZWN0RGlyLCAnb3V0JylcbiAgICApO1xuXG4gICAgZXhwZWN0KHdhcm5TcHkpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICBjb25zdCB3YXJuTWVzc2FnZSA9IHdhcm5TcHkubW9jay5jYWxsc1swXT8uWzBdIGFzIHN0cmluZztcbiAgICBleHBlY3Qod2Fybk1lc3NhZ2UpLnRvQ29udGFpbignbXktc3RlcC1wa2cnKTtcbiAgICBleHBlY3Qod2Fybk1lc3NhZ2UpLnRvQ29udGFpbignXCJ1c2Ugc3RlcFwiIGZ1bmN0aW9ucycpO1xuICB9KTtcblxuICBpdCgnd2FybnMgd2hlbiBhbiBleHRlcm5hbCBwYWNrYWdlIGNvbnRhaW5zIFwidXNlIHdvcmtmbG93XCIgZGlyZWN0aXZlcycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBwcm9qZWN0RGlyID0gam9pbih0ZXN0Um9vdCwgJ3Byb2plY3QnKTtcblxuICAgIHdyaXRlRmlsZShqb2luKHByb2plY3REaXIsICdpbmRleC50cycpLCAnZXhwb3J0IGNvbnN0IHggPSAxOycpO1xuXG4gICAgd3JpdGVGaWxlKFxuICAgICAgam9pbihwcm9qZWN0RGlyLCAnbm9kZV9tb2R1bGVzJywgJ215LXdvcmtmbG93LXBrZycsICdwYWNrYWdlLmpzb24nKSxcbiAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgbmFtZTogJ215LXdvcmtmbG93LXBrZycsXG4gICAgICAgIHZlcnNpb246ICcxLjAuMCcsXG4gICAgICAgIG1haW46ICdpbmRleC5qcycsXG4gICAgICB9KVxuICAgICk7XG4gICAgd3JpdGVGaWxlKFxuICAgICAgam9pbihwcm9qZWN0RGlyLCAnbm9kZV9tb2R1bGVzJywgJ215LXdvcmtmbG93LXBrZycsICdpbmRleC5qcycpLFxuICAgICAgYGV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5Kb2IoKSB7XG4gIFwidXNlIHdvcmtmbG93XCI7XG4gIHJldHVybiBcImRvbmVcIjtcbn1gXG4gICAgKTtcblxuICAgIGNvbnN0IGJ1aWxkZXIgPSBjcmVhdGVCdWlsZGVyKHByb2plY3REaXIsIFsnbXktd29ya2Zsb3ctcGtnJ10pO1xuICAgIGF3YWl0IGJ1aWxkZXIuZGlzY292ZXJFbnRyaWVzUHVibGljKFxuICAgICAgW2pvaW4ocHJvamVjdERpciwgJ2luZGV4LnRzJyldLFxuICAgICAgam9pbihwcm9qZWN0RGlyLCAnb3V0JylcbiAgICApO1xuXG4gICAgZXhwZWN0KHdhcm5TcHkpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICBjb25zdCB3YXJuTWVzc2FnZSA9IHdhcm5TcHkubW9jay5jYWxsc1swXT8uWzBdIGFzIHN0cmluZztcbiAgICBleHBlY3Qod2Fybk1lc3NhZ2UpLnRvQ29udGFpbignbXktd29ya2Zsb3ctcGtnJyk7XG4gICAgZXhwZWN0KHdhcm5NZXNzYWdlKS50b0NvbnRhaW4oJ1widXNlIHdvcmtmbG93XCIgZnVuY3Rpb25zJyk7XG4gIH0pO1xuXG4gIGl0KCdkb2VzIG5vdCB3YXJuIGZvciBwYWNrYWdlcyB3aXRob3V0IHdvcmtmbG93IHBhdHRlcm5zJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHByb2plY3REaXIgPSBqb2luKHRlc3RSb290LCAncHJvamVjdCcpO1xuXG4gICAgd3JpdGVGaWxlKGpvaW4ocHJvamVjdERpciwgJ2luZGV4LnRzJyksICdleHBvcnQgY29uc3QgeCA9IDE7Jyk7XG5cbiAgICB3cml0ZUZpbGUoXG4gICAgICBqb2luKHByb2plY3REaXIsICdub2RlX21vZHVsZXMnLCAncGxhaW4tcGtnJywgJ3BhY2thZ2UuanNvbicpLFxuICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBuYW1lOiAncGxhaW4tcGtnJyxcbiAgICAgICAgdmVyc2lvbjogJzEuMC4wJyxcbiAgICAgICAgbWFpbjogJ2luZGV4LmpzJyxcbiAgICAgIH0pXG4gICAgKTtcbiAgICB3cml0ZUZpbGUoXG4gICAgICBqb2luKHByb2plY3REaXIsICdub2RlX21vZHVsZXMnLCAncGxhaW4tcGtnJywgJ2luZGV4LmpzJyksXG4gICAgICAnZXhwb3J0IGNvbnN0IGhlbGxvID0gXCJ3b3JsZFwiOydcbiAgICApO1xuXG4gICAgY29uc3QgYnVpbGRlciA9IGNyZWF0ZUJ1aWxkZXIocHJvamVjdERpciwgWydwbGFpbi1wa2cnXSk7XG4gICAgYXdhaXQgYnVpbGRlci5kaXNjb3ZlckVudHJpZXNQdWJsaWMoXG4gICAgICBbam9pbihwcm9qZWN0RGlyLCAnaW5kZXgudHMnKV0sXG4gICAgICBqb2luKHByb2plY3REaXIsICdvdXQnKVxuICAgICk7XG5cbiAgICBleHBlY3Qod2FyblNweSkubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgfSk7XG5cbiAgaXQoJ2RvZXMgbm90IHdhcm4gZm9yIHBzZXVkby1wYWNrYWdlcyAoc2VydmVyLW9ubHksIGNsaWVudC1vbmx5KScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBwcm9qZWN0RGlyID0gam9pbih0ZXN0Um9vdCwgJ3Byb2plY3QnKTtcblxuICAgIHdyaXRlRmlsZShqb2luKHByb2plY3REaXIsICdpbmRleC50cycpLCAnZXhwb3J0IGNvbnN0IHggPSAxOycpO1xuXG4gICAgY29uc3QgYnVpbGRlciA9IGNyZWF0ZUJ1aWxkZXIocHJvamVjdERpciwgWydzZXJ2ZXItb25seScsICdjbGllbnQtb25seSddKTtcbiAgICBhd2FpdCBidWlsZGVyLmRpc2NvdmVyRW50cmllc1B1YmxpYyhcbiAgICAgIFtqb2luKHByb2plY3REaXIsICdpbmRleC50cycpXSxcbiAgICAgIGpvaW4ocHJvamVjdERpciwgJ291dCcpXG4gICAgKTtcblxuICAgIGV4cGVjdCh3YXJuU3B5KS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICB9KTtcblxuICBpdCgnZG9lcyBub3Qgd2FybiB3aGVuIGV4dGVybmFsUGFja2FnZXMgaXMgZW1wdHknLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcHJvamVjdERpciA9IGpvaW4odGVzdFJvb3QsICdwcm9qZWN0Jyk7XG5cbiAgICB3cml0ZUZpbGUoam9pbihwcm9qZWN0RGlyLCAnaW5kZXgudHMnKSwgJ2V4cG9ydCBjb25zdCB4ID0gMTsnKTtcblxuICAgIGNvbnN0IGJ1aWxkZXIgPSBjcmVhdGVCdWlsZGVyKHByb2plY3REaXIsIFtdKTtcbiAgICBhd2FpdCBidWlsZGVyLmRpc2NvdmVyRW50cmllc1B1YmxpYyhcbiAgICAgIFtqb2luKHByb2plY3REaXIsICdpbmRleC50cycpXSxcbiAgICAgIGpvaW4ocHJvamVjdERpciwgJ291dCcpXG4gICAgKTtcblxuICAgIGV4cGVjdCh3YXJuU3B5KS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICB9KTtcblxuICBpdCgnd2FybnMgb25seSBvbmNlIHBlciBwYWNrYWdlIGFjcm9zcyBtdWx0aXBsZSBkaXNjb3ZlckVudHJpZXMgY2FsbHMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcHJvamVjdERpciA9IGpvaW4odGVzdFJvb3QsICdwcm9qZWN0Jyk7XG5cbiAgICB3cml0ZUZpbGUoam9pbihwcm9qZWN0RGlyLCAnaW5kZXgudHMnKSwgJ2V4cG9ydCBjb25zdCB4ID0gMTsnKTtcbiAgICB3cml0ZUZpbGUoam9pbihwcm9qZWN0RGlyLCAnb3RoZXIudHMnKSwgJ2V4cG9ydCBjb25zdCB5ID0gMjsnKTtcblxuICAgIHdyaXRlRmlsZShcbiAgICAgIGpvaW4ocHJvamVjdERpciwgJ25vZGVfbW9kdWxlcycsICdteS1zZXJkZS1wa2cnLCAncGFja2FnZS5qc29uJyksXG4gICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIG5hbWU6ICdteS1zZXJkZS1wa2cnLFxuICAgICAgICB2ZXJzaW9uOiAnMS4wLjAnLFxuICAgICAgICBtYWluOiAnaW5kZXguanMnLFxuICAgICAgICBkZXBlbmRlbmNpZXM6IHsgJ0B3b3JrZmxvdy9zZXJkZSc6ICdeMS4wLjAnIH0sXG4gICAgICB9KVxuICAgICk7XG4gICAgd3JpdGVGaWxlKFxuICAgICAgam9pbihwcm9qZWN0RGlyLCAnbm9kZV9tb2R1bGVzJywgJ215LXNlcmRlLXBrZycsICdpbmRleC5qcycpLFxuICAgICAgJ2V4cG9ydCBjbGFzcyBGb28ge30nXG4gICAgKTtcblxuICAgIGNvbnN0IGJ1aWxkZXIgPSBjcmVhdGVCdWlsZGVyKHByb2plY3REaXIsIFsnbXktc2VyZGUtcGtnJ10pO1xuXG4gICAgLy8gQ2FsbCBkaXNjb3ZlckVudHJpZXMgdHdpY2Ugd2l0aCBkaWZmZXJlbnQgaW5wdXRzXG4gICAgYXdhaXQgYnVpbGRlci5kaXNjb3ZlckVudHJpZXNQdWJsaWMoXG4gICAgICBbam9pbihwcm9qZWN0RGlyLCAnaW5kZXgudHMnKV0sXG4gICAgICBqb2luKHByb2plY3REaXIsICdvdXQnKVxuICAgICk7XG4gICAgYXdhaXQgYnVpbGRlci5kaXNjb3ZlckVudHJpZXNQdWJsaWMoXG4gICAgICBbam9pbihwcm9qZWN0RGlyLCAnb3RoZXIudHMnKV0sXG4gICAgICBqb2luKHByb2plY3REaXIsICdvdXQyJylcbiAgICApO1xuXG4gICAgLy8gU2hvdWxkIG9ubHkgd2FybiBvbmNlXG4gICAgY29uc3Qgd2FybkNhbGxzID0gd2FyblNweS5tb2NrLmNhbGxzLmZpbHRlcigoY2FsbDogdW5rbm93bltdKSA9PlxuICAgICAgKGNhbGxbMF0gYXMgc3RyaW5nKS5pbmNsdWRlcygnbXktc2VyZGUtcGtnJylcbiAgICApO1xuICAgIGV4cGVjdCh3YXJuQ2FsbHMpLnRvSGF2ZUxlbmd0aCgxKTtcbiAgfSk7XG5cbiAgaXQoJ2xpc3RzIG11bHRpcGxlIGRldGVjdGVkIGlzc3VlcyBpbiB0aGUgd2FybmluZyBtZXNzYWdlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHByb2plY3REaXIgPSBqb2luKHRlc3RSb290LCAncHJvamVjdCcpO1xuXG4gICAgd3JpdGVGaWxlKGpvaW4ocHJvamVjdERpciwgJ2luZGV4LnRzJyksICdleHBvcnQgY29uc3QgeCA9IDE7Jyk7XG5cbiAgICB3cml0ZUZpbGUoXG4gICAgICBqb2luKHByb2plY3REaXIsICdub2RlX21vZHVsZXMnLCAnbXVsdGktcGtnJywgJ3BhY2thZ2UuanNvbicpLFxuICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBuYW1lOiAnbXVsdGktcGtnJyxcbiAgICAgICAgdmVyc2lvbjogJzEuMC4wJyxcbiAgICAgICAgbWFpbjogJ2luZGV4LmpzJyxcbiAgICAgICAgZGVwZW5kZW5jaWVzOiB7ICdAd29ya2Zsb3cvc2VyZGUnOiAnXjEuMC4wJyB9LFxuICAgICAgfSlcbiAgICApO1xuICAgIHdyaXRlRmlsZShcbiAgICAgIGpvaW4ocHJvamVjdERpciwgJ25vZGVfbW9kdWxlcycsICdtdWx0aS1wa2cnLCAnaW5kZXguanMnKSxcbiAgICAgIGBleHBvcnQgYXN5bmMgZnVuY3Rpb24gZG9Xb3JrKCkge1xuICBcInVzZSBzdGVwXCI7XG4gIHJldHVybiA0Mjtcbn1cbmV4cG9ydCBjbGFzcyBGb28ge1xuICBzdGF0aWMgW1N5bWJvbC5mb3IoJ3dvcmtmbG93LXNlcmlhbGl6ZScpXShpbnN0YW5jZSkgeyByZXR1cm4ge307IH1cbiAgc3RhdGljIFtTeW1ib2wuZm9yKCd3b3JrZmxvdy1kZXNlcmlhbGl6ZScpXShkYXRhKSB7IHJldHVybiBuZXcgRm9vKCk7IH1cbn1gXG4gICAgKTtcblxuICAgIGNvbnN0IGJ1aWxkZXIgPSBjcmVhdGVCdWlsZGVyKHByb2plY3REaXIsIFsnbXVsdGktcGtnJ10pO1xuICAgIGF3YWl0IGJ1aWxkZXIuZGlzY292ZXJFbnRyaWVzUHVibGljKFxuICAgICAgW2pvaW4ocHJvamVjdERpciwgJ2luZGV4LnRzJyldLFxuICAgICAgam9pbihwcm9qZWN0RGlyLCAnb3V0JylcbiAgICApO1xuXG4gICAgZXhwZWN0KHdhcm5TcHkpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICBjb25zdCB3YXJuTWVzc2FnZSA9IHdhcm5TcHkubW9jay5jYWxsc1swXT8uWzBdIGFzIHN0cmluZztcbiAgICBleHBlY3Qod2Fybk1lc3NhZ2UpLnRvQ29udGFpbignXCJ1c2Ugc3RlcFwiIGZ1bmN0aW9ucycpO1xuICAgIGV4cGVjdCh3YXJuTWVzc2FnZSkudG9Db250YWluKCdzZXJpYWxpemF0aW9uIGNsYXNzZXMnKTtcbiAgfSk7XG5cbiAgaXQoJ3dhcm5zIHZpYSBlbnRyeS1maWxlIGRldGVjdGlvbiB3aGVuIHBhY2thZ2UuanNvbiBoYXMgbm8gc2VyZGUgZGVwJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHByb2plY3REaXIgPSBqb2luKHRlc3RSb290LCAncHJvamVjdCcpO1xuXG4gICAgd3JpdGVGaWxlKGpvaW4ocHJvamVjdERpciwgJ2luZGV4LnRzJyksICdleHBvcnQgY29uc3QgeCA9IDE7Jyk7XG5cbiAgICAvLyBQYWNrYWdlIHdpdGhvdXQgQHdvcmtmbG93L3NlcmRlIGluIGRlcHMsIGJ1dCBlbnRyeSBoYXMgXCJ1c2Ugc3RlcFwiXG4gICAgd3JpdGVGaWxlKFxuICAgICAgam9pbihwcm9qZWN0RGlyLCAnbm9kZV9tb2R1bGVzJywgJ25vLXNlcmRlLWRlcC1wa2cnLCAncGFja2FnZS5qc29uJyksXG4gICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIG5hbWU6ICduby1zZXJkZS1kZXAtcGtnJyxcbiAgICAgICAgdmVyc2lvbjogJzEuMC4wJyxcbiAgICAgICAgbWFpbjogJ2luZGV4LmpzJyxcbiAgICAgIH0pXG4gICAgKTtcbiAgICB3cml0ZUZpbGUoXG4gICAgICBqb2luKHByb2plY3REaXIsICdub2RlX21vZHVsZXMnLCAnbm8tc2VyZGUtZGVwLXBrZycsICdpbmRleC5qcycpLFxuICAgICAgYGV4cG9ydCBhc3luYyBmdW5jdGlvbiBkb1dvcmsoKSB7XG4gIFwidXNlIHN0ZXBcIjtcbiAgcmV0dXJuIDQyO1xufWBcbiAgICApO1xuXG4gICAgY29uc3QgYnVpbGRlciA9IGNyZWF0ZUJ1aWxkZXIocHJvamVjdERpciwgWyduby1zZXJkZS1kZXAtcGtnJ10pO1xuICAgIGF3YWl0IGJ1aWxkZXIuZGlzY292ZXJFbnRyaWVzUHVibGljKFxuICAgICAgW2pvaW4ocHJvamVjdERpciwgJ2luZGV4LnRzJyldLFxuICAgICAgam9pbihwcm9qZWN0RGlyLCAnb3V0JylcbiAgICApO1xuXG4gICAgZXhwZWN0KHdhcm5TcHkpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICBjb25zdCB3YXJuTWVzc2FnZSA9IHdhcm5TcHkubW9jay5jYWxsc1swXT8uWzBdIGFzIHN0cmluZztcbiAgICBleHBlY3Qod2Fybk1lc3NhZ2UpLnRvQ29udGFpbignbm8tc2VyZGUtZGVwLXBrZycpO1xuICAgIGV4cGVjdCh3YXJuTWVzc2FnZSkudG9Db250YWluKCdcInVzZSBzdGVwXCIgZnVuY3Rpb25zJyk7XG4gIH0pO1xufSk7XG4iXX0=
@@ -0,0 +1,20 @@
1
+ export interface DiscoveredEntries {
2
+ discoveredSteps: Set<string>;
3
+ discoveredWorkflows: Set<string>;
4
+ discoveredSerdeFiles: Set<string>;
5
+ /**
6
+ * All JS/TS files visited while walking the workflow import graph.
7
+ * Watch-mode integrations use this to distinguish relevant HMR changes from
8
+ * unrelated application file edits.
9
+ */
10
+ discoveredFiles?: Set<string>;
11
+ }
12
+ interface FastDiscoverEntriesOptions {
13
+ entryPoints: string[];
14
+ state: DiscoveredEntries;
15
+ defaultTsconfigPath: string | undefined;
16
+ workingDir: string;
17
+ }
18
+ export declare function fastDiscoverEntries({ entryPoints, state, defaultTsconfigPath, workingDir, }: FastDiscoverEntriesOptions): Promise<void>;
19
+ export {};
20
+ //# sourceMappingURL=fast-discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fast-discovery.d.ts","sourceRoot":"","sources":["../src/fast-discovery.ts"],"names":[],"mappings":"AA+CA,MAAM,WAAW,iBAAiB;IAChC,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7B,mBAAmB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACjC,oBAAoB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAClC;;;;OAIG;IACH,eAAe,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC/B;AAED,UAAU,0BAA0B;IAClC,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,KAAK,EAAE,iBAAiB,CAAC;IACzB,mBAAmB,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC,UAAU,EAAE,MAAM,CAAC;CACpB;AA+kBD,wBAAsB,mBAAmB,CAAC,EACxC,WAAW,EACX,KAAK,EACL,mBAAmB,EACnB,UAAU,GACX,EAAE,0BAA0B,GAAG,OAAO,CAAC,IAAI,CAAC,CA6X5C"}