@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.
- package/README.md +1 -1
- package/dist/base-builder.d.ts +15 -1
- package/dist/base-builder.d.ts.map +1 -1
- package/dist/base-builder.js +61 -15
- package/dist/constants.d.ts +2 -2
- package/dist/constants.js +3 -3
- package/dist/fast-discovery.d.ts +1 -1
- package/dist/fast-discovery.js +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/module-specifier.d.ts +1 -1
- package/dist/module-specifier.js +2 -2
- package/dist/node-module-esbuild-plugin.js +3 -3
- package/dist/optional-otel-api.d.ts +1 -1
- package/dist/optional-otel-api.js +2 -2
- package/dist/optional-typescript.js +2 -2
- package/dist/optional-ws-native.d.ts +1 -1
- package/dist/optional-ws-native.js +2 -2
- package/dist/swc-esbuild-plugin.d.ts +1 -1
- package/dist/swc-esbuild-plugin.js +5 -5
- package/dist/types.d.ts +3 -3
- package/dist/types.js +1 -1
- package/dist/vercel-build-output-api.js +2 -2
- package/dist/write-if-changed.d.ts +20 -0
- package/dist/write-if-changed.d.ts.map +1 -0
- package/dist/write-if-changed.js +44 -0
- package/dist/write-if-changed.test.d.ts +2 -0
- package/dist/write-if-changed.test.d.ts.map +1 -0
- package/dist/write-if-changed.test.js +186 -0
- package/package.json +4 -4
|
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3JpdGUtaWYtY2hhbmdlZC50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3dyaXRlLWlmLWNoYW5nZWQudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFdBQVcsRUFDWCxXQUFXLEVBQ1gsWUFBWSxFQUNaLFlBQVksRUFDWixNQUFNLEVBQ04sUUFBUSxFQUNSLGFBQWEsR0FDZCxNQUFNLFNBQVMsQ0FBQztBQUNqQixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ2pDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDckUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRWhELE9BQU8sRUFBRSxjQUFjLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUUzRSx3RUFBd0U7QUFDeEUsTUFBTSxVQUFVLEdBQUcsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7QUFFMUMsc0VBQXNFO0FBQ3RFLE1BQU0sV0FBWSxTQUFRLFdBQVc7SUFDbkMsS0FBSyxDQUFDLEtBQUs7UUFDVCxRQUFRO0lBQ1YsQ0FBQztJQUVNLGtCQUFrQixDQUN2QixVQUFrQixFQUNsQixPQUFlO1FBRWYsT0FBTyxLQUFLLENBQUMsa0JBQWtCLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZELENBQUM7Q0FDRjtBQUVEOzs7R0FHRztBQUNILE1BQU0sZUFBZ0IsU0FBUSxXQUFXO0lBQ3ZDLElBQXVCLDZCQUE2QjtRQUNsRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7Q0FDRjtBQUVELFNBQVMsVUFBVSxDQUFDLFVBQWtCO0lBQ3BDLE9BQU87UUFDTCxXQUFXLEVBQUUs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QUFDLE1BQU0sRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO1FBQ2hFLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUVwQyxNQUFNLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUscUJBQXFCLENBQUMsQ0FBQztRQUVoRSxNQUFNLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM5QyxNQUFNLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0lBQ25FLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBjaG1vZFN5bmMsXG4gIG1rZHRlbXBTeW5jLFxuICByZWFkZGlyU3luYyxcbiAgcmVhZEZpbGVTeW5jLFxuICByZWFscGF0aFN5bmMsXG4gIHJtU3luYyxcbiAgc3RhdFN5bmMsXG4gIHdyaXRlRmlsZVN5bmMsXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgdG1wZGlyIH0gZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IGFmdGVyRWFjaCwgYmVmb3JlRWFjaCwgZGVzY3JpYmUsIGV4cGVjdCwgaXQgfSBmcm9tICd2aXRlc3QnO1xuaW1wb3J0IHsgQmFzZUJ1aWxkZXIgfSBmcm9tICcuL2Jhc2UtYnVpbGRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFN0YW5kYWxvbmVDb25maWcgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IGhhc1NhbWVDb250ZW50LCB3cml0ZUZpbGVJZkNoYW5nZWQgfSBmcm9tICcuL3dyaXRlLWlmLWNoYW5nZWQuanMnO1xuXG4vLyBSZXNvbHZlIHN5bWxpbmtzIGluIHRtcGRpciB0byBhdm9pZCBtYWNPUyAvdmFyIC0+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.
|
|
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.
|
|
45
|
-
"@workflow/errors": "5.0.0-beta.
|
|
46
|
-
"@workflow/utils": "5.0.0-beta.
|
|
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": {
|