@workflow/builders 5.0.0-beta.42 → 5.0.0-beta.44

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.
@@ -0,0 +1,186 @@
1
+ import { chmodSync, mkdtempSync, readdirSync, readFileSync, realpathSync, rmSync, statSync, writeFileSync, } from 'node:fs';
2
+ import { tmpdir } from 'node:os';
3
+ import { join } from 'node:path';
4
+ import { afterEach, beforeEach, describe, expect, it } from 'vitest';
5
+ import { BaseBuilder } from './base-builder.js';
6
+ import { hasSameContent, writeFileIfChanged } from './write-if-changed.js';
7
+ // Resolve symlinks in tmpdir to avoid macOS /var -> /private/var issues
8
+ const realTmpdir = realpathSync(tmpdir());
9
+ /** Minimal subclass exposing the protected `writeGeneratedFile()`. */
10
+ class TestBuilder extends BaseBuilder {
11
+ async build() {
12
+ // no-op
13
+ }
14
+ writeGeneratedFile(targetPath, content) {
15
+ return super.writeGeneratedFile(targetPath, content);
16
+ }
17
+ }
18
+ /**
19
+ * Stands in for a target whose consumers use the mtime of a generated file as
20
+ * a change signal, such as the Nitro dev handler.
21
+ */
22
+ class OptedOutBuilder extends TestBuilder {
23
+ get skipsUnchangedGeneratedWrites() {
24
+ return false;
25
+ }
26
+ }
27
+ function makeConfig(workingDir) {
28
+ return {
29
+ buildTarget: 'standalone',
30
+ workingDir,
31
+ dirs: [workingDir],
32
+ stepsBundlePath: join(workingDir, 'steps.js'),
33
+ workflowsBundlePath: join(workingDir, 'workflows.js'),
34
+ webhookBundlePath: join(workingDir, 'webhook.js'),
35
+ };
36
+ }
37
+ function createBuilder(workingDir) {
38
+ return new TestBuilder(makeConfig(workingDir));
39
+ }
40
+ function createOptedOutBuilder(workingDir) {
41
+ return new OptedOutBuilder(makeConfig(workingDir));
42
+ }
43
+ /**
44
+ * mtime resolution varies by filesystem, so compare the full stat identity
45
+ * (mtime in ns plus inode) rather than trusting a millisecond timestamp.
46
+ * `writeGeneratedFile` renames over the target, which changes the inode even
47
+ * when the mtime happens to land in the same tick.
48
+ */
49
+ function fileIdentity(path) {
50
+ const s = statSync(path, { bigint: true });
51
+ return `${s.mtimeNs}:${s.ino}`;
52
+ }
53
+ let testRoot;
54
+ beforeEach(() => {
55
+ testRoot = mkdtempSync(join(realTmpdir, 'write-if-changed-'));
56
+ });
57
+ afterEach(() => {
58
+ rmSync(testRoot, { recursive: true, force: true });
59
+ });
60
+ describe('hasSameContent', () => {
61
+ it('is false when the file does not exist', async () => {
62
+ await expect(hasSameContent(join(testRoot, 'missing.js'), 'hello')).resolves.toBe(false);
63
+ });
64
+ it('is true for byte-identical content', async () => {
65
+ const target = join(testRoot, 'a.js');
66
+ writeFileSync(target, 'export const a = 1;\n');
67
+ await expect(hasSameContent(target, 'export const a = 1;\n')).resolves.toBe(true);
68
+ });
69
+ it('is false when content differs at the same byte length', async () => {
70
+ const target = join(testRoot, 'a.js');
71
+ writeFileSync(target, 'aaaa');
72
+ await expect(hasSameContent(target, 'aaab')).resolves.toBe(false);
73
+ });
74
+ it('is false when only the length differs', async () => {
75
+ const target = join(testRoot, 'a.js');
76
+ writeFileSync(target, 'aaaa');
77
+ await expect(hasSameContent(target, 'aaaaa')).resolves.toBe(false);
78
+ });
79
+ it('compares utf-8 byte length, not code units', async () => {
80
+ const target = join(testRoot, 'a.js');
81
+ writeFileSync(target, '// é\u{1f600}\n', 'utf-8');
82
+ await expect(hasSameContent(target, '// é\u{1f600}\n')).resolves.toBe(true);
83
+ });
84
+ it('is false for byte-different content that decodes to the same string', async () => {
85
+ // An unpaired surrogate and U+FFFD both decode to the replacement
86
+ // character, so a utf-8 string comparison would call these equal.
87
+ const target = join(testRoot, 'a.js');
88
+ writeFileSync(target, Buffer.from([0x61, 0xf0, 0x90, 0x80]));
89
+ await expect(hasSameContent(target, Buffer.from([0x61, 0xef, 0xbf, 0xbd]).toString())).resolves.toBe(false);
90
+ });
91
+ it('is false when the path is a directory', async () => {
92
+ // Match the directory's own reported size so the check cannot pass by
93
+ // short-circuiting on length before it ever tries to read.
94
+ const sameSizeAsDir = 'x'.repeat(statSync(testRoot).size);
95
+ await expect(hasSameContent(testRoot, sameSizeAsDir)).resolves.toBe(false);
96
+ });
97
+ it('is false when the file cannot be read', async () => {
98
+ const target = join(testRoot, 'locked.js');
99
+ writeFileSync(target, 'secret');
100
+ chmodSync(target, 0o000);
101
+ try {
102
+ // Root ignores the mode bits, so only assert when the read really fails.
103
+ let readable = true;
104
+ try {
105
+ readFileSync(target, 'utf8');
106
+ }
107
+ catch {
108
+ readable = false;
109
+ }
110
+ if (readable) {
111
+ return;
112
+ }
113
+ await expect(hasSameContent(target, 'secret')).resolves.toBe(false);
114
+ }
115
+ finally {
116
+ chmodSync(target, 0o600);
117
+ }
118
+ });
119
+ });
120
+ describe('writeFileIfChanged', () => {
121
+ it('creates the file when it does not exist', async () => {
122
+ const target = join(testRoot, 'a.js');
123
+ await expect(writeFileIfChanged(target, 'hello')).resolves.toBe(true);
124
+ expect(readFileSync(target, 'utf8')).toBe('hello');
125
+ });
126
+ it('does not touch the file when content is unchanged', async () => {
127
+ const target = join(testRoot, 'a.js');
128
+ await writeFileIfChanged(target, 'hello');
129
+ const before = fileIdentity(target);
130
+ await expect(writeFileIfChanged(target, 'hello')).resolves.toBe(false);
131
+ expect(fileIdentity(target)).toBe(before);
132
+ });
133
+ it('rewrites the file when content changes', async () => {
134
+ const target = join(testRoot, 'a.js');
135
+ await writeFileIfChanged(target, 'hello');
136
+ await expect(writeFileIfChanged(target, 'goodbye')).resolves.toBe(true);
137
+ expect(readFileSync(target, 'utf8')).toBe('goodbye');
138
+ });
139
+ });
140
+ describe('writeGeneratedFile', () => {
141
+ // Regression test for the dev watcher thrash: the generated routes live
142
+ // inside the app directory the dev server watches, so a rewrite with
143
+ // identical bytes still invalidates the bundler and forces a recompile.
144
+ it('leaves the file untouched when the generated output is unchanged', async () => {
145
+ const builder = createBuilder(testRoot);
146
+ const target = join(testRoot, 'route.js');
147
+ await builder.writeGeneratedFile(target, 'export const GET = () => {};');
148
+ const before = fileIdentity(target);
149
+ await builder.writeGeneratedFile(target, 'export const GET = () => {};');
150
+ expect(fileIdentity(target)).toBe(before);
151
+ });
152
+ it('leaves no temp files behind when the write is skipped', async () => {
153
+ const builder = createBuilder(testRoot);
154
+ const target = join(testRoot, 'route.js');
155
+ await builder.writeGeneratedFile(target, 'same');
156
+ await builder.writeGeneratedFile(target, 'same');
157
+ expect(readdirSync(testRoot).filter((f) => f.endsWith('.tmp'))).toEqual([]);
158
+ });
159
+ it('still writes when the generated output changes', async () => {
160
+ const builder = createBuilder(testRoot);
161
+ const target = join(testRoot, 'route.js');
162
+ await builder.writeGeneratedFile(target, 'v1');
163
+ await builder.writeGeneratedFile(target, 'v2');
164
+ expect(readFileSync(target, 'utf8')).toBe('v2');
165
+ });
166
+ it('creates the file on first write', async () => {
167
+ const builder = createBuilder(testRoot);
168
+ const target = join(testRoot, 'route.js');
169
+ await builder.writeGeneratedFile(target, 'first');
170
+ expect(readFileSync(target, 'utf8')).toBe('first');
171
+ });
172
+ // The Nitro dev handler cache-busts its import of `steps.mjs` off the mtime
173
+ // of `workflows.mjs`, so that target opts out: skipping the redundant write
174
+ // would freeze the version key and serve stale step code. See
175
+ // `packages/nitro/src/builders.ts`.
176
+ it('still rewrites unchanged output when the target opts out', async () => {
177
+ const builder = createOptedOutBuilder(testRoot);
178
+ const target = join(testRoot, 'workflows.mjs');
179
+ await builder.writeGeneratedFile(target, 'export const a = 1;');
180
+ const before = fileIdentity(target);
181
+ await builder.writeGeneratedFile(target, 'export const a = 1;');
182
+ expect(fileIdentity(target)).not.toBe(before);
183
+ expect(readFileSync(target, 'utf8')).toBe('export const a = 1;');
184
+ });
185
+ });
186
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3JpdGUtaWYtY2hhbmdlZC50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3dyaXRlLWlmLWNoYW5nZWQudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFdBQVcsRUFDWCxXQUFXLEVBQ1gsWUFBWSxFQUNaLFlBQVksRUFDWixNQUFNLEVBQ04sUUFBUSxFQUNSLGFBQWEsR0FDZCxNQUFNLFNBQVMsQ0FBQztBQUNqQixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ2pDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDckUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRWhELE9BQU8sRUFBRSxjQUFjLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUUzRSx3RUFBd0U7QUFDeEUsTUFBTSxVQUFVLEdBQUcsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7QUFFMUMsc0VBQXNFO0FBQ3RFLE1BQU0sV0FBWSxTQUFRLFdBQVc7SUFDbkMsS0FBSyxDQUFDLEtBQUs7UUFDVCxRQUFRO0lBQ1YsQ0FBQztJQUVNLGtCQUFrQixDQUN2QixVQUFrQixFQUNsQixPQUFlO1FBRWYsT0FBTyxLQUFLLENBQUMsa0JBQWtCLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZELENBQUM7Q0FDRjtBQUVEOzs7R0FHRztBQUNILE1BQU0sZUFBZ0IsU0FBUSxXQUFXO0lBQ3ZDLElBQXVCLDZCQUE2QjtRQUNsRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7Q0FDRjtBQUVELFNBQVMsVUFBVSxDQUFDLFVBQWtCO0lBQ3BDLE9BQU87UUFDTCxXQUFXLEVBQUUsWUFBWTtRQUN6QixVQUFVO1FBQ1YsSUFBSSxFQUFFLENBQUMsVUFBVSxDQUFDO1FBQ2xCLGVBQWUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQztRQUM3QyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLGNBQWMsQ0FBQztRQUNyRCxpQkFBaUIsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLFlBQVksQ0FBQztLQUNsRCxDQUFDO0FBQ0osQ0FBQztBQUVELFNBQVMsYUFBYSxDQUFDLFVBQWtCO0lBQ3ZDLE9BQU8sSUFBSSxXQUFXLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7QUFDakQsQ0FBQztBQUVELFNBQVMscUJBQXFCLENBQUMsVUFBa0I7SUFDL0MsT0FBTyxJQUFJLGVBQWUsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztBQUNyRCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLFlBQVksQ0FBQyxJQUFZO0lBQ2hDLE1BQU0sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUMzQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDakMsQ0FBQztBQUVELElBQUksUUFBZ0IsQ0FBQztBQUVyQixVQUFVLENBQUMsR0FBRyxFQUFFO0lBQ2QsUUFBUSxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLG1CQUFtQixDQUFDLENBQUMsQ0FBQztBQUNoRSxDQUFDLENBQUMsQ0FBQztBQUVILFNBQVMsQ0FBQyxHQUFHLEVBQUU7SUFDYixNQUFNLENBQUMsUUFBUSxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUNyRCxDQUFDLENBQUMsQ0FBQztBQUVILFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLEVBQUU7SUFDOUIsRUFBRSxDQUFDLHVDQUF1QyxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ3JELE1BQU0sTUFBTSxDQUNWLGNBQWMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUN0RCxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDekIsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsb0NBQW9DLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDbEQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN0QyxhQUFhLENBQUMsTUFBTSxFQUFFLHVCQUF1QixDQUFDLENBQUM7UUFFL0MsTUFBTSxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FDekUsSUFBSSxDQUNMLENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyx1REFBdUQsRUFBRSxLQUFLLElBQUksRUFBRTtRQUNyRSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3RDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFOUIsTUFBTSxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDcEUsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsdUNBQXVDLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDckQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN0QyxhQUFhLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRTlCLE1BQU0sTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3JFLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLDRDQUE0QyxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQzFELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDdEMsYUFBYSxDQUFDLE1BQU0sRUFBRSxpQkFBaUIsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUVsRCxNQUFNLE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzlFLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLHFFQUFxRSxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ25GLGtFQUFrRTtRQUNsRSxrRUFBa0U7UUFDbEUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN0QyxhQUFhLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFN0QsTUFBTSxNQUFNLENBQ1YsY0FBYyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUN6RSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDekIsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsdUNBQXVDLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDckQsc0VBQXNFO1FBQ3RFLDJEQUEyRDtRQUMzRCxNQUFNLGFBQWEsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUUxRCxNQUFNLE1BQU0sQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM3RSxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyx1Q0FBdUMsRUFBRSxLQUFLLElBQUksRUFBRTtRQUNyRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQzNDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDaEMsU0FBUyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUV6QixJQUFJLENBQUM7WUFDSCx5RUFBeUU7WUFDekUsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDO1lBQ3BCLElBQUksQ0FBQztnQkFDSCxZQUFZLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQy9CLENBQUM7WUFBQyxNQUFNLENBQUM7Z0JBQ1AsUUFBUSxHQUFHLEtBQUssQ0FBQztZQUNuQixDQUFDO1lBQ0QsSUFBSSxRQUFRLEVBQUUsQ0FBQztnQkFDYixPQUFPO1lBQ1QsQ0FBQztZQUNELE1BQU0sTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RFLENBQUM7Z0JBQVMsQ0FBQztZQUNULFNBQVMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDM0IsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUM7QUFFSCxRQUFRLENBQUMsb0JBQW9CLEVBQUUsR0FBRyxFQUFFO0lBQ2xDLEVBQUUsQ0FBQyx5Q0FBeUMsRUFBRSxLQUFLLElBQUksRUFBRTtRQUN2RCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRXRDLE1BQU0sTUFBTSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEUsTUFBTSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDckQsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsbURBQW1ELEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDakUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN0QyxNQUFNLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUMxQyxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFcEMsTUFBTSxNQUFNLENBQUMsa0JBQWtCLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUV2RSxNQUFNLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzVDLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLHdDQUF3QyxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ3RELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDdEMsTUFBTSxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFFMUMsTUFBTSxNQUFNLENBQUMsa0JBQWtCLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4RSxNQUFNLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN2RCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDO0FBRUgsUUFBUSxDQUFDLG9CQUFvQixFQUFFLEdBQUcsRUFBRTtJQUNsQyx3RUFBd0U7SUFDeEUscUVBQXFFO0lBQ3JFLHdFQUF3RTtJQUN4RSxFQUFFLENBQUMsa0VBQWtFLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDaEYsTUFBTSxPQUFPLEdBQUcsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3hDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFFMUMsTUFBTSxPQUFPLENBQUMsa0JBQWtCLENBQUMsTUFBTSxFQUFFLDhCQUE4QixDQUFDLENBQUM7UUFDekUsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRXBDLE1BQU0sT0FBTyxDQUFDLGtCQUFrQixDQUFDLE1BQU0sRUFBRSw4QkFBOEIsQ0FBQyxDQUFDO1FBRXpFLE1BQU0sQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDNUMsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsdURBQXVELEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDckUsTUFBTSxPQUFPLEdBQUcsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3hDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFFMUMsTUFBTSxPQUFPLENBQUMsa0JBQWtCLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ2pELE1BQU0sT0FBTyxDQUFDLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUVqRCxNQUFNLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzlFLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLGdEQUFnRCxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQzlELE1BQU0sT0FBTyxHQUFHLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN4QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBRTFDLE1BQU0sT0FBTyxDQUFDLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMvQyxNQUFNLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFL0MsTUFBTSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbEQsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsaUNBQWlDLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDL0MsTUFBTSxPQUFPLEdBQUcsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3hDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFFMUMsTUFBTSxPQUFPLENBQUMsa0JBQWtCLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRWxELE1BQU0sQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3JELENBQUMsQ0FBQyxDQUFDO0lBRUgsNEVBQTRFO0lBQzVFLDRFQUE0RTtJQUM1RSw4REFBOEQ7SUFDOUQsb0NBQW9DO0lBQ3BDLEVBQUUsQ0FBQywwREFBMEQsRUFBRSxLQUFLLElBQUksRUFBRTtRQUN4RSxNQUFNLE9BQU8sR0FBRyxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNoRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBRS9DLE1BQU0sT0FBTyxDQUFDLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO1FBQ2hFLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUVwQyxNQUFNLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUscUJBQXFCLENBQUMsQ0FBQztRQUVoRSxNQUFNLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM5QyxNQUFNLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0lBQ25FLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBjaG1vZFN5bmMsXG4gIG1rZHRlbXBTeW5jLFxuICByZWFkZGlyU3luYyxcbiAgcmVhZEZpbGVTeW5jLFxuICByZWFscGF0aFN5bmMsXG4gIHJtU3luYyxcbiAgc3RhdFN5bmMsXG4gIHdyaXRlRmlsZVN5bmMsXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgdG1wZGlyIH0gZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IGFmdGVyRWFjaCwgYmVmb3JlRWFjaCwgZGVzY3JpYmUsIGV4cGVjdCwgaXQgfSBmcm9tICd2aXRlc3QnO1xuaW1wb3J0IHsgQmFzZUJ1aWxkZXIgfSBmcm9tICcuL2Jhc2UtYnVpbGRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFN0YW5kYWxvbmVDb25maWcgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IGhhc1NhbWVDb250ZW50LCB3cml0ZUZpbGVJZkNoYW5nZWQgfSBmcm9tICcuL3dyaXRlLWlmLWNoYW5nZWQuanMnO1xuXG4vLyBSZXNvbHZlIHN5bWxpbmtzIGluIHRtcGRpciB0byBhdm9pZCBtYWNPUyAvdmFyIC0+IC9wcml2YXRlL3ZhciBpc3N1ZXNcbmNvbnN0IHJlYWxUbXBkaXIgPSByZWFscGF0aFN5bmModG1wZGlyKCkpO1xuXG4vKiogTWluaW1hbCBzdWJjbGFzcyBleHBvc2luZyB0aGUgcHJvdGVjdGVkIGB3cml0ZUdlbmVyYXRlZEZpbGUoKWAuICovXG5jbGFzcyBUZXN0QnVpbGRlciBleHRlbmRzIEJhc2VCdWlsZGVyIHtcbiAgYXN5bmMgYnVpbGQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gbm8tb3BcbiAgfVxuXG4gIHB1YmxpYyB3cml0ZUdlbmVyYXRlZEZpbGUoXG4gICAgdGFyZ2V0UGF0aDogc3RyaW5nLFxuICAgIGNvbnRlbnQ6IHN0cmluZ1xuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gc3VwZXIud3JpdGVHZW5lcmF0ZWRGaWxlKHRhcmdldFBhdGgsIGNvbnRlbnQpO1xuICB9XG59XG5cbi8qKlxuICogU3RhbmRzIGluIGZvciBhIHRhcmdldCB3aG9zZSBjb25zdW1lcnMgdXNlIHRoZSBtdGltZSBvZiBhIGdlbmVyYXRlZCBmaWxlIGFzXG4gKiBhIGNoYW5nZSBzaWduYWwsIHN1Y2ggYXMgdGhlIE5pdHJvIGRldiBoYW5kbGVyLlxuICovXG5jbGFzcyBPcHRlZE91dEJ1aWxkZXIgZXh0ZW5kcyBUZXN0QnVpbGRlciB7XG4gIHByb3RlY3RlZCBvdmVycmlkZSBnZXQgc2tpcHNVbmNoYW5nZWRHZW5lcmF0ZWRXcml0ZXMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1ha2VDb25maWcod29ya2luZ0Rpcjogc3RyaW5nKTogU3RhbmRhbG9uZUNvbmZpZyB7XG4gIHJldHVybiB7XG4gICAgYnVpbGRUYXJnZXQ6ICdzdGFuZGFsb25lJyxcbiAgICB3b3JraW5nRGlyLFxuICAgIGRpcnM6IFt3b3JraW5nRGlyXSxcbiAgICBzdGVwc0J1bmRsZVBhdGg6IGpvaW4od29ya2luZ0RpciwgJ3N0ZXBzLmpzJyksXG4gICAgd29ya2Zsb3dzQnVuZGxlUGF0aDogam9pbih3b3JraW5nRGlyLCAnd29ya2Zsb3dzLmpzJyksXG4gICAgd2ViaG9va0J1bmRsZVBhdGg6IGpvaW4od29ya2luZ0RpciwgJ3dlYmhvb2suanMnKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQnVpbGRlcih3b3JraW5nRGlyOiBzdHJpbmcpOiBUZXN0QnVpbGRlciB7XG4gIHJldHVybiBuZXcgVGVzdEJ1aWxkZXIobWFrZUNvbmZpZyh3b3JraW5nRGlyKSk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZU9wdGVkT3V0QnVpbGRlcih3b3JraW5nRGlyOiBzdHJpbmcpOiBPcHRlZE91dEJ1aWxkZXIge1xuICByZXR1cm4gbmV3IE9wdGVkT3V0QnVpbGRlcihtYWtlQ29uZmlnKHdvcmtpbmdEaXIpKTtcbn1cblxuLyoqXG4gKiBtdGltZSByZXNvbHV0aW9uIHZhcmllcyBieSBmaWxlc3lzdGVtLCBzbyBjb21wYXJlIHRoZSBmdWxsIHN0YXQgaWRlbnRpdHlcbiAqIChtdGltZSBpbiBucyBwbHVzIGlub2RlKSByYXRoZXIgdGhhbiB0cnVzdGluZyBhIG1pbGxpc2Vjb25kIHRpbWVzdGFtcC5cbiAqIGB3cml0ZUdlbmVyYXRlZEZpbGVgIHJlbmFtZXMgb3ZlciB0aGUgdGFyZ2V0LCB3aGljaCBjaGFuZ2VzIHRoZSBpbm9kZSBldmVuXG4gKiB3aGVuIHRoZSBtdGltZSBoYXBwZW5zIHRvIGxhbmQgaW4gdGhlIHNhbWUgdGljay5cbiAqL1xuZnVuY3Rpb24gZmlsZUlkZW50aXR5KHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHMgPSBzdGF0U3luYyhwYXRoLCB7IGJpZ2ludDogdHJ1ZSB9KTtcbiAgcmV0dXJuIGAke3MubXRpbWVOc306JHtzLmlub31gO1xufVxuXG5sZXQgdGVzdFJvb3Q6IHN0cmluZztcblxuYmVmb3JlRWFjaCgoKSA9PiB7XG4gIHRlc3RSb290ID0gbWtkdGVtcFN5bmMoam9pbihyZWFsVG1wZGlyLCAnd3JpdGUtaWYtY2hhbmdlZC0nKSk7XG59KTtcblxuYWZ0ZXJFYWNoKCgpID0+IHtcbiAgcm1TeW5jKHRlc3RSb290LCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG59KTtcblxuZGVzY3JpYmUoJ2hhc1NhbWVDb250ZW50JywgKCkgPT4ge1xuICBpdCgnaXMgZmFsc2Ugd2hlbiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCcsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBleHBlY3QoXG4gICAgICBoYXNTYW1lQ29udGVudChqb2luKHRlc3RSb290LCAnbWlzc2luZy5qcycpLCAnaGVsbG8nKVxuICAgICkucmVzb2x2ZXMudG9CZShmYWxzZSk7XG4gIH0pO1xuXG4gIGl0KCdpcyB0cnVlIGZvciBieXRlLWlkZW50aWNhbCBjb250ZW50JywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHRhcmdldCA9IGpvaW4odGVzdFJvb3QsICdhLmpzJyk7XG4gICAgd3JpdGVGaWxlU3luYyh0YXJnZXQsICdleHBvcnQgY29uc3QgYSA9IDE7XFxuJyk7XG5cbiAgICBhd2FpdCBleHBlY3QoaGFzU2FtZUNvbnRlbnQodGFyZ2V0LCAnZXhwb3J0IGNvbnN0IGEgPSAxO1xcbicpKS5yZXNvbHZlcy50b0JlKFxuICAgICAgdHJ1ZVxuICAgICk7XG4gIH0pO1xuXG4gIGl0KCdpcyBmYWxzZSB3aGVuIGNvbnRlbnQgZGlmZmVycyBhdCB0aGUgc2FtZSBieXRlIGxlbmd0aCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0YXJnZXQgPSBqb2luKHRlc3RSb290LCAnYS5qcycpO1xuICAgIHdyaXRlRmlsZVN5bmModGFyZ2V0LCAnYWFhYScpO1xuXG4gICAgYXdhaXQgZXhwZWN0KGhhc1NhbWVDb250ZW50KHRhcmdldCwgJ2FhYWInKSkucmVzb2x2ZXMudG9CZShmYWxzZSk7XG4gIH0pO1xuXG4gIGl0KCdpcyBmYWxzZSB3aGVuIG9ubHkgdGhlIGxlbmd0aCBkaWZmZXJzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHRhcmdldCA9IGpvaW4odGVzdFJvb3QsICdhLmpzJyk7XG4gICAgd3JpdGVGaWxlU3luYyh0YXJnZXQsICdhYWFhJyk7XG5cbiAgICBhd2FpdCBleHBlY3QoaGFzU2FtZUNvbnRlbnQodGFyZ2V0LCAnYWFhYWEnKSkucmVzb2x2ZXMudG9CZShmYWxzZSk7XG4gIH0pO1xuXG4gIGl0KCdjb21wYXJlcyB1dGYtOCBieXRlIGxlbmd0aCwgbm90IGNvZGUgdW5pdHMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGFyZ2V0ID0gam9pbih0ZXN0Um9vdCwgJ2EuanMnKTtcbiAgICB3cml0ZUZpbGVTeW5jKHRhcmdldCwgJy8vIMOpXFx1ezFmNjAwfVxcbicsICd1dGYtOCcpO1xuXG4gICAgYXdhaXQgZXhwZWN0KGhhc1NhbWVDb250ZW50KHRhcmdldCwgJy8vIMOpXFx1ezFmNjAwfVxcbicpKS5yZXNvbHZlcy50b0JlKHRydWUpO1xuICB9KTtcblxuICBpdCgnaXMgZmFsc2UgZm9yIGJ5dGUtZGlmZmVyZW50IGNvbnRlbnQgdGhhdCBkZWNvZGVzIHRvIHRoZSBzYW1lIHN0cmluZycsIGFzeW5jICgpID0+IHtcbiAgICAvLyBBbiB1bnBhaXJlZCBzdXJyb2dhdGUgYW5kIFUrRkZGRCBib3RoIGRlY29kZSB0byB0aGUgcmVwbGFjZW1lbnRcbiAgICAvLyBjaGFyYWN0ZXIsIHNvIGEgdXRmLTggc3RyaW5nIGNvbXBhcmlzb24gd291bGQgY2FsbCB0aGVzZSBlcXVhbC5cbiAgICBjb25zdCB0YXJnZXQgPSBqb2luKHRlc3RSb290LCAnYS5qcycpO1xuICAgIHdyaXRlRmlsZVN5bmModGFyZ2V0LCBCdWZmZXIuZnJvbShbMHg2MSwgMHhmMCwgMHg5MCwgMHg4MF0pKTtcblxuICAgIGF3YWl0IGV4cGVjdChcbiAgICAgIGhhc1NhbWVDb250ZW50KHRhcmdldCwgQnVmZmVyLmZyb20oWzB4NjEsIDB4ZWYsIDB4YmYsIDB4YmRdKS50b1N0cmluZygpKVxuICAgICkucmVzb2x2ZXMudG9CZShmYWxzZSk7XG4gIH0pO1xuXG4gIGl0KCdpcyBmYWxzZSB3aGVuIHRoZSBwYXRoIGlzIGEgZGlyZWN0b3J5JywgYXN5bmMgKCkgPT4ge1xuICAgIC8vIE1hdGNoIHRoZSBkaXJlY3RvcnkncyBvd24gcmVwb3J0ZWQgc2l6ZSBzbyB0aGUgY2hlY2sgY2Fubm90IHBhc3MgYnlcbiAgICAvLyBzaG9ydC1jaXJjdWl0aW5nIG9uIGxlbmd0aCBiZWZvcmUgaXQgZXZlciB0cmllcyB0byByZWFkLlxuICAgIGNvbnN0IHNhbWVTaXplQXNEaXIgPSAneCcucmVwZWF0KHN0YXRTeW5jKHRlc3RSb290KS5zaXplKTtcblxuICAgIGF3YWl0IGV4cGVjdChoYXNTYW1lQ29udGVudCh0ZXN0Um9vdCwgc2FtZVNpemVBc0RpcikpLnJlc29sdmVzLnRvQmUoZmFsc2UpO1xuICB9KTtcblxuICBpdCgnaXMgZmFsc2Ugd2hlbiB0aGUgZmlsZSBjYW5ub3QgYmUgcmVhZCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0YXJnZXQgPSBqb2luKHRlc3RSb290LCAnbG9ja2VkLmpzJyk7XG4gICAgd3JpdGVGaWxlU3luYyh0YXJnZXQsICdzZWNyZXQnKTtcbiAgICBjaG1vZFN5bmModGFyZ2V0LCAwbzAwMCk7XG5cbiAgICB0cnkge1xuICAgICAgLy8gUm9vdCBpZ25vcmVzIHRoZSBtb2RlIGJpdHMsIHNvIG9ubHkgYXNzZXJ0IHdoZW4gdGhlIHJlYWQgcmVhbGx5IGZhaWxzLlxuICAgICAgbGV0IHJlYWRhYmxlID0gdHJ1ZTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlYWRGaWxlU3luYyh0YXJnZXQsICd1dGY4Jyk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmVhZGFibGUgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChyZWFkYWJsZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBhd2FpdCBleHBlY3QoaGFzU2FtZUNvbnRlbnQodGFyZ2V0LCAnc2VjcmV0JykpLnJlc29sdmVzLnRvQmUoZmFsc2UpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBjaG1vZFN5bmModGFyZ2V0LCAwbzYwMCk7XG4gICAgfVxuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnd3JpdGVGaWxlSWZDaGFuZ2VkJywgKCkgPT4ge1xuICBpdCgnY3JlYXRlcyB0aGUgZmlsZSB3aGVuIGl0IGRvZXMgbm90IGV4aXN0JywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHRhcmdldCA9IGpvaW4odGVzdFJvb3QsICdhLmpzJyk7XG5cbiAgICBhd2FpdCBleHBlY3Qod3JpdGVGaWxlSWZDaGFuZ2VkKHRhcmdldCwgJ2hlbGxvJykpLnJlc29sdmVzLnRvQmUodHJ1ZSk7XG4gICAgZXhwZWN0KHJlYWRGaWxlU3luYyh0YXJnZXQsICd1dGY4JykpLnRvQmUoJ2hlbGxvJyk7XG4gIH0pO1xuXG4gIGl0KCdkb2VzIG5vdCB0b3VjaCB0aGUgZmlsZSB3aGVuIGNvbnRlbnQgaXMgdW5jaGFuZ2VkJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHRhcmdldCA9IGpvaW4odGVzdFJvb3QsICdhLmpzJyk7XG4gICAgYXdhaXQgd3JpdGVGaWxlSWZDaGFuZ2VkKHRhcmdldCwgJ2hlbGxvJyk7XG4gICAgY29uc3QgYmVmb3JlID0gZmlsZUlkZW50aXR5KHRhcmdldCk7XG5cbiAgICBhd2FpdCBleHBlY3Qod3JpdGVGaWxlSWZDaGFuZ2VkKHRhcmdldCwgJ2hlbGxvJykpLnJlc29sdmVzLnRvQmUoZmFsc2UpO1xuXG4gICAgZXhwZWN0KGZpbGVJZGVudGl0eSh0YXJnZXQpKS50b0JlKGJlZm9yZSk7XG4gIH0pO1xuXG4gIGl0KCdyZXdyaXRlcyB0aGUgZmlsZSB3aGVuIGNvbnRlbnQgY2hhbmdlcycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0YXJnZXQgPSBqb2luKHRlc3RSb290LCAnYS5qcycpO1xuICAgIGF3YWl0IHdyaXRlRmlsZUlmQ2hhbmdlZCh0YXJnZXQsICdoZWxsbycpO1xuXG4gICAgYXdhaXQgZXhwZWN0KHdyaXRlRmlsZUlmQ2hhbmdlZCh0YXJnZXQsICdnb29kYnllJykpLnJlc29sdmVzLnRvQmUodHJ1ZSk7XG4gICAgZXhwZWN0KHJlYWRGaWxlU3luYyh0YXJnZXQsICd1dGY4JykpLnRvQmUoJ2dvb2RieWUnKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ3dyaXRlR2VuZXJhdGVkRmlsZScsICgpID0+IHtcbiAgLy8gUmVncmVzc2lvbiB0ZXN0IGZvciB0aGUgZGV2IHdhdGNoZXIgdGhyYXNoOiB0aGUgZ2VuZXJhdGVkIHJvdXRlcyBsaXZlXG4gIC8vIGluc2lkZSB0aGUgYXBwIGRpcmVjdG9yeSB0aGUgZGV2IHNlcnZlciB3YXRjaGVzLCBzbyBhIHJld3JpdGUgd2l0aFxuICAvLyBpZGVudGljYWwgYnl0ZXMgc3RpbGwgaW52YWxpZGF0ZXMgdGhlIGJ1bmRsZXIgYW5kIGZvcmNlcyBhIHJlY29tcGlsZS5cbiAgaXQoJ2xlYXZlcyB0aGUgZmlsZSB1bnRvdWNoZWQgd2hlbiB0aGUgZ2VuZXJhdGVkIG91dHB1dCBpcyB1bmNoYW5nZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYnVpbGRlciA9IGNyZWF0ZUJ1aWxkZXIodGVzdFJvb3QpO1xuICAgIGNvbnN0IHRhcmdldCA9IGpvaW4odGVzdFJvb3QsICdyb3V0ZS5qcycpO1xuXG4gICAgYXdhaXQgYnVpbGRlci53cml0ZUdlbmVyYXRlZEZpbGUodGFyZ2V0LCAnZXhwb3J0IGNvbnN0IEdFVCA9ICgpID0+IHt9OycpO1xuICAgIGNvbnN0IGJlZm9yZSA9IGZpbGVJZGVudGl0eSh0YXJnZXQpO1xuXG4gICAgYXdhaXQgYnVpbGRlci53cml0ZUdlbmVyYXRlZEZpbGUodGFyZ2V0LCAnZXhwb3J0IGNvbnN0IEdFVCA9ICgpID0+IHt9OycpO1xuXG4gICAgZXhwZWN0KGZpbGVJZGVudGl0eSh0YXJnZXQpKS50b0JlKGJlZm9yZSk7XG4gIH0pO1xuXG4gIGl0KCdsZWF2ZXMgbm8gdGVtcCBmaWxlcyBiZWhpbmQgd2hlbiB0aGUgd3JpdGUgaXMgc2tpcHBlZCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBidWlsZGVyID0gY3JlYXRlQnVpbGRlcih0ZXN0Um9vdCk7XG4gICAgY29uc3QgdGFyZ2V0ID0gam9pbih0ZXN0Um9vdCwgJ3JvdXRlLmpzJyk7XG5cbiAgICBhd2FpdCBidWlsZGVyLndyaXRlR2VuZXJhdGVkRmlsZSh0YXJnZXQsICdzYW1lJyk7XG4gICAgYXdhaXQgYnVpbGRlci53cml0ZUdlbmVyYXRlZEZpbGUodGFyZ2V0LCAnc2FtZScpO1xuXG4gICAgZXhwZWN0KHJlYWRkaXJTeW5jKHRlc3RSb290KS5maWx0ZXIoKGYpID0+IGYuZW5kc1dpdGgoJy50bXAnKSkpLnRvRXF1YWwoW10pO1xuICB9KTtcblxuICBpdCgnc3RpbGwgd3JpdGVzIHdoZW4gdGhlIGdlbmVyYXRlZCBvdXRwdXQgY2hhbmdlcycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBidWlsZGVyID0gY3JlYXRlQnVpbGRlcih0ZXN0Um9vdCk7XG4gICAgY29uc3QgdGFyZ2V0ID0gam9pbih0ZXN0Um9vdCwgJ3JvdXRlLmpzJyk7XG5cbiAgICBhd2FpdCBidWlsZGVyLndyaXRlR2VuZXJhdGVkRmlsZSh0YXJnZXQsICd2MScpO1xuICAgIGF3YWl0IGJ1aWxkZXIud3JpdGVHZW5lcmF0ZWRGaWxlKHRhcmdldCwgJ3YyJyk7XG5cbiAgICBleHBlY3QocmVhZEZpbGVTeW5jKHRhcmdldCwgJ3V0ZjgnKSkudG9CZSgndjInKTtcbiAgfSk7XG5cbiAgaXQoJ2NyZWF0ZXMgdGhlIGZpbGUgb24gZmlyc3Qgd3JpdGUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYnVpbGRlciA9IGNyZWF0ZUJ1aWxkZXIodGVzdFJvb3QpO1xuICAgIGNvbnN0IHRhcmdldCA9IGpvaW4odGVzdFJvb3QsICdyb3V0ZS5qcycpO1xuXG4gICAgYXdhaXQgYnVpbGRlci53cml0ZUdlbmVyYXRlZEZpbGUodGFyZ2V0LCAnZmlyc3QnKTtcblxuICAgIGV4cGVjdChyZWFkRmlsZVN5bmModGFyZ2V0LCAndXRmOCcpKS50b0JlKCdmaXJzdCcpO1xuICB9KTtcblxuICAvLyBUaGUgTml0cm8gZGV2IGhhbmRsZXIgY2FjaGUtYnVzdHMgaXRzIGltcG9ydCBvZiBgc3RlcHMubWpzYCBvZmYgdGhlIG10aW1lXG4gIC8vIG9mIGB3b3JrZmxvd3MubWpzYCwgc28gdGhhdCB0YXJnZXQgb3B0cyBvdXQ6IHNraXBwaW5nIHRoZSByZWR1bmRhbnQgd3JpdGVcbiAgLy8gd291bGQgZnJlZXplIHRoZSB2ZXJzaW9uIGtleSBhbmQgc2VydmUgc3RhbGUgc3RlcCBjb2RlLiBTZWVcbiAgLy8gYHBhY2thZ2VzL25pdHJvL3NyYy9idWlsZGVycy50c2AuXG4gIGl0KCdzdGlsbCByZXdyaXRlcyB1bmNoYW5nZWQgb3V0cHV0IHdoZW4gdGhlIHRhcmdldCBvcHRzIG91dCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBidWlsZGVyID0gY3JlYXRlT3B0ZWRPdXRCdWlsZGVyKHRlc3RSb290KTtcbiAgICBjb25zdCB0YXJnZXQgPSBqb2luKHRlc3RSb290LCAnd29ya2Zsb3dzLm1qcycpO1xuXG4gICAgYXdhaXQgYnVpbGRlci53cml0ZUdlbmVyYXRlZEZpbGUodGFyZ2V0LCAnZXhwb3J0IGNvbnN0IGEgPSAxOycpO1xuICAgIGNvbnN0IGJlZm9yZSA9IGZpbGVJZGVudGl0eSh0YXJnZXQpO1xuXG4gICAgYXdhaXQgYnVpbGRlci53cml0ZUdlbmVyYXRlZEZpbGUodGFyZ2V0LCAnZXhwb3J0IGNvbnN0IGEgPSAxOycpO1xuXG4gICAgZXhwZWN0KGZpbGVJZGVudGl0eSh0YXJnZXQpKS5ub3QudG9CZShiZWZvcmUpO1xuICAgIGV4cGVjdChyZWFkRmlsZVN5bmModGFyZ2V0LCAndXRmOCcpKS50b0JlKCdleHBvcnQgY29uc3QgYSA9IDE7Jyk7XG4gIH0pO1xufSk7XG4iXX0=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@workflow/builders",
3
- "version": "5.0.0-beta.42",
3
+ "version": "5.0.0-beta.44",
4
4
  "description": "Shared builder infrastructure for Workflow SDK",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -41,9 +41,9 @@
41
41
  "find-up": "7.0.0",
42
42
  "json5": "2.2.3",
43
43
  "tinyglobby": "0.2.17",
44
- "@workflow/core": "5.0.0-beta.42",
45
- "@workflow/errors": "5.0.0-beta.17",
46
- "@workflow/utils": "5.0.0-beta.8",
44
+ "@workflow/core": "5.0.0-beta.44",
45
+ "@workflow/errors": "5.0.0-beta.18",
46
+ "@workflow/utils": "5.0.0-beta.9",
47
47
  "@workflow/swc-plugin": "5.0.0-beta.5"
48
48
  },
49
49
  "scripts": {