@workflow/next 5.0.0-beta.36 → 5.0.0-beta.38

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,264 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.WATCH_IGNORED_PATHS_ENV = exports.BUILTIN_IGNORED_PATH_FRAGMENTS = void 0;
7
+ exports.parseIgnoredPathsEnv = parseIgnoredPathsEnv;
8
+ exports.createWatchIgnorePredicate = createWatchIgnorePredicate;
9
+ const node_fs_1 = require("node:fs");
10
+ const node_path_1 = require("node:path");
11
+ const ignore_1 = __importDefault(require("ignore"));
12
+ /**
13
+ * Directory-name fragments that are always excluded from the dev watcher,
14
+ * regardless of `.gitignore`. Matched as POSIX substrings of the absolute
15
+ * path (e.g. `/node_modules/` matches any path containing that segment).
16
+ */
17
+ exports.BUILTIN_IGNORED_PATH_FRAGMENTS = [
18
+ '/.git/',
19
+ '/node_modules/',
20
+ '/.next/',
21
+ '/.turbo/',
22
+ '/.vercel/',
23
+ '/dist/',
24
+ '/build/',
25
+ '/out/',
26
+ '/.cache/',
27
+ '/.yarn/',
28
+ '/.pnpm-store/',
29
+ '/.parcel-cache/',
30
+ '/.well-known/workflow/',
31
+ ];
32
+ /**
33
+ * Environment variable that lets a project add extra path fragments to the
34
+ * dev watcher ignore list. Comma-separated; each entry is matched as a POSIX
35
+ * substring of the absolute path, exactly like {@link BUILTIN_IGNORED_PATH_FRAGMENTS}.
36
+ * Additive to `.gitignore` and the built-in list. Dev-mode only.
37
+ */
38
+ exports.WATCH_IGNORED_PATHS_ENV = 'WORKFLOW_DEV_WATCH_IGNORED_PATHS';
39
+ const toPosix = (pathname) => pathname.replace(/\\/g, '/');
40
+ /**
41
+ * Parse the comma-separated {@link WATCH_IGNORED_PATHS_ENV} value into a list
42
+ * of POSIX path fragments. Whitespace is trimmed and empty entries dropped.
43
+ */
44
+ function parseIgnoredPathsEnv(value) {
45
+ if (!value) {
46
+ return [];
47
+ }
48
+ return value
49
+ .split(',')
50
+ .map((entry) => toPosix(entry.trim()))
51
+ .filter((entry) => entry.length > 0);
52
+ }
53
+ /**
54
+ * Rebuild a matcher with `dropped` pattern lines removed. Used when a rule
55
+ * excluded a directory that a deeper `.gitignore` re-included: that rule must
56
+ * stop applying to the subtree, while every *other* rule in the same file
57
+ * (e.g. a `*.secret` that still matches a file inside) keeps applying.
58
+ */
59
+ function matcherWithout(entry, dropped) {
60
+ if (dropped.size === 0) {
61
+ return entry.matcher;
62
+ }
63
+ const key = [...dropped].sort().join('\n');
64
+ const cached = entry.filtered.get(key);
65
+ if (cached) {
66
+ return cached;
67
+ }
68
+ const rebuilt = (0, ignore_1.default)().add(entry.lines.filter((line) => !dropped.has(line.trim())));
69
+ entry.filtered.set(key, rebuilt);
70
+ return rebuilt;
71
+ }
72
+ /**
73
+ * Load `.gitignore` matchers for `workingDir` up to and including
74
+ * `projectRoot`. In a monorepo the largest ignored trees are typically listed
75
+ * at the workspace root, and app-level `.gitignore` files are covered too.
76
+ *
77
+ * Returned outermost-first (workspace root → app), which is the order git
78
+ * applies them: a rule in a deeper `.gitignore` overrides a conflicting rule
79
+ * from a shallower one.
80
+ *
81
+ * Nested `.gitignore` files *below* `workingDir` are intentionally not read —
82
+ * the {@link WATCH_IGNORED_PATHS_ENV} env var backstops anything they'd cover.
83
+ */
84
+ function loadGitignoreMatchers(workingDir, projectRoot) {
85
+ const matchers = [];
86
+ const stopAt = toPosix(projectRoot);
87
+ let current = toPosix(workingDir);
88
+ while (true) {
89
+ let content;
90
+ try {
91
+ content = (0, node_fs_1.readFileSync)(node_path_1.posix.join(current, '.gitignore'), 'utf-8');
92
+ }
93
+ catch {
94
+ content = undefined;
95
+ }
96
+ if (content) {
97
+ const lines = content.split('\n');
98
+ matchers.push({
99
+ dir: current,
100
+ matcher: (0, ignore_1.default)().add(content),
101
+ lines,
102
+ hasNegation: lines.some((line) => line.trim().startsWith('!')),
103
+ filtered: new Map(),
104
+ });
105
+ }
106
+ if (current === stopAt) {
107
+ break;
108
+ }
109
+ const parent = (0, node_path_1.dirname)(current);
110
+ if (parent === current) {
111
+ break;
112
+ }
113
+ current = parent;
114
+ }
115
+ // Collected innermost-first while walking up; git precedence is
116
+ // outermost-first, with deeper files winning.
117
+ return matchers.reverse();
118
+ }
119
+ /**
120
+ * Build the dev-watcher ignore predicate. The returned function receives a
121
+ * POSIX-normalized absolute path and returns `true` when that path should be
122
+ * pruned from both the initial directory walk and the chokidar watch set.
123
+ *
124
+ * A path is ignored when it matches any of:
125
+ * - a built-in fragment ({@link BUILTIN_IGNORED_PATH_FRAGMENTS}) or caller
126
+ * `extraFragments` (POSIX substring match),
127
+ * - a {@link WATCH_IGNORED_PATHS_ENV} fragment (POSIX substring match),
128
+ * - a `.gitignore` rule from `workingDir` up to `projectRoot`.
129
+ *
130
+ * Matchers are built once here; the returned predicate is hot (called per path
131
+ * during traversal and per chokidar event) and does no I/O.
132
+ */
133
+ function createWatchIgnorePredicate(options) {
134
+ const projectRoot = options.projectRoot ?? options.workingDir;
135
+ const envIgnoredPaths = options.envIgnoredPaths ?? process.env[exports.WATCH_IGNORED_PATHS_ENV];
136
+ const fragments = [
137
+ ...exports.BUILTIN_IGNORED_PATH_FRAGMENTS,
138
+ ...(options.extraFragments ?? []).map(toPosix),
139
+ ...parseIgnoredPathsEnv(envIgnoredPaths),
140
+ ];
141
+ const gitignoreMatchers = loadGitignoreMatchers(options.workingDir, projectRoot);
142
+ // Re-inclusion is only possible when some file has a `!` rule. Without one,
143
+ // the cheap flat scan below is equivalent to the full per-directory walk.
144
+ const anyNegation = gitignoreMatchers.some((entry) => entry.hasNegation);
145
+ const outermostDir = gitignoreMatchers[0]?.dir;
146
+ /** Test one path against one matcher, as both a file and a directory node. */
147
+ const testEntry = (entry, rel, dropped) => {
148
+ const matcher = dropped ? matcherWithout(entry, dropped) : entry.matcher;
149
+ // Test the trailing-slash form too so a directory node itself matches a
150
+ // `dir/` gitignore rule (not just its children) — this lets the walk and
151
+ // chokidar prune the directory instead of descending into it.
152
+ const asFile = matcher.test(rel);
153
+ const asDir = matcher.test(`${rel}/`);
154
+ if (asFile.ignored) {
155
+ return { ignored: true, pattern: asFile.rule?.pattern };
156
+ }
157
+ if (asDir.ignored) {
158
+ return { ignored: true, pattern: asDir.rule?.pattern };
159
+ }
160
+ if (asFile.unignored || asDir.unignored) {
161
+ return { ignored: false, pattern: undefined };
162
+ }
163
+ return undefined;
164
+ };
165
+ /**
166
+ * Resolve one path level against every applicable `.gitignore`, deepest file
167
+ * last so it wins. Returns the level's verdict plus the rules that voted to
168
+ * exclude it, which the caller neutralizes if the level is re-included.
169
+ */
170
+ const decideLevel = (prefix, neutralized) => {
171
+ let decision;
172
+ let excludedBy = [];
173
+ for (let index = 0; index < gitignoreMatchers.length; index++) {
174
+ const entry = gitignoreMatchers[index];
175
+ const rel = node_path_1.posix.relative(entry.dir, prefix);
176
+ // Empty means the path *is* the gitignore dir; a `..` prefix means it is
177
+ // outside. `ignore` only accepts relative, in-tree paths.
178
+ if (rel === '' || rel === '..' || rel.startsWith('../')) {
179
+ continue;
180
+ }
181
+ const result = testEntry(entry, rel, neutralized.get(index));
182
+ if (!result) {
183
+ continue;
184
+ }
185
+ if (!result.ignored) {
186
+ decision = false;
187
+ continue;
188
+ }
189
+ if (decision !== true) {
190
+ excludedBy = [];
191
+ }
192
+ decision = true;
193
+ if (result.pattern) {
194
+ excludedBy.push({ index, pattern: result.pattern });
195
+ }
196
+ }
197
+ return { decision, excludedBy };
198
+ };
199
+ /**
200
+ * Walk the path one directory segment at a time, the way git does. At each
201
+ * level the deepest `.gitignore` with an opinion wins; if that verdict is
202
+ * "ignored" git stops descending, so we can return immediately.
203
+ *
204
+ * When a level is re-included after a shallower file excluded it, the rule
205
+ * that did the excluding is neutralized for the rest of the walk. That is
206
+ * what lets root `generated/` + app `!generated/` watch `app/generated/x.ts`
207
+ * while a sibling root rule such as `*.secret` still excludes
208
+ * `app/generated/a.secret`.
209
+ */
210
+ const walkGitignore = (normalizedPath) => {
211
+ if (!outermostDir) {
212
+ return false;
213
+ }
214
+ const relToBase = node_path_1.posix.relative(outermostDir, normalizedPath);
215
+ if (relToBase === '' || relToBase === '..' || relToBase.startsWith('../')) {
216
+ return false;
217
+ }
218
+ const neutralized = new Map();
219
+ let prefix = outermostDir;
220
+ for (const segment of relToBase.split('/')) {
221
+ prefix = `${prefix}/${segment}`;
222
+ const { decision, excludedBy } = decideLevel(prefix, neutralized);
223
+ if (decision === true) {
224
+ // Git does not descend into an excluded directory.
225
+ return true;
226
+ }
227
+ if (decision === false) {
228
+ // This level was re-included; the rules that excluded it must not
229
+ // resurrect for anything beneath it.
230
+ for (const { index, pattern } of excludedBy) {
231
+ const dropped = neutralized.get(index) ?? new Set();
232
+ dropped.add(pattern);
233
+ neutralized.set(index, dropped);
234
+ }
235
+ }
236
+ }
237
+ return false;
238
+ };
239
+ return (normalizedPath) => {
240
+ // Built-in and env-var fragments are hard excludes: they are deliberately
241
+ // not subject to gitignore negation, so a stray `!` rule cannot drag
242
+ // `node_modules` or the generated directory back into the watch set.
243
+ for (const fragment of fragments) {
244
+ if (normalizedPath.includes(fragment)) {
245
+ return true;
246
+ }
247
+ }
248
+ if (!anyNegation) {
249
+ // Fast path: no re-inclusion anywhere, so the first match decides.
250
+ for (const entry of gitignoreMatchers) {
251
+ const rel = node_path_1.posix.relative(entry.dir, normalizedPath);
252
+ if (rel === '' || rel === '..' || rel.startsWith('../')) {
253
+ continue;
254
+ }
255
+ if (entry.matcher.ignores(rel) || entry.matcher.ignores(`${rel}/`)) {
256
+ return true;
257
+ }
258
+ }
259
+ return false;
260
+ }
261
+ return walkGitignore(normalizedPath);
262
+ };
263
+ }
264
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2F0Y2gtaWdub3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3dhdGNoLWlnbm9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUF1Q0Esb0RBUUM7QUF5SEQsZ0VBNkpDO0FBclVELHFDQUF1QztBQUN2Qyx5Q0FBMkM7QUFDM0Msb0RBQTZDO0FBRTdDOzs7O0dBSUc7QUFDVSxRQUFBLDhCQUE4QixHQUFzQjtJQUMvRCxRQUFRO0lBQ1IsZ0JBQWdCO0lBQ2hCLFNBQVM7SUFDVCxVQUFVO0lBQ1YsV0FBVztJQUNYLFFBQVE7SUFDUixTQUFTO0lBQ1QsT0FBTztJQUNQLFVBQVU7SUFDVixTQUFTO0lBQ1QsZUFBZTtJQUNmLGlCQUFpQjtJQUNqQix3QkFBd0I7Q0FDekIsQ0FBQztBQUVGOzs7OztHQUtHO0FBQ1UsUUFBQSx1QkFBdUIsR0FBRyxrQ0FBa0MsQ0FBQztBQUUxRSxNQUFNLE9BQU8sR0FBRyxDQUFDLFFBQWdCLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBRW5FOzs7R0FHRztBQUNILFNBQWdCLG9CQUFvQixDQUFDLEtBQXlCO0lBQzVELElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNYLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUNELE9BQU8sS0FBSztTQUNULEtBQUssQ0FBQyxHQUFHLENBQUM7U0FDVixHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztTQUNyQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDekMsQ0FBQztBQWNEOzs7OztHQUtHO0FBQ0gsU0FBUyxjQUFjLENBQUMsS0FBdUIsRUFBRSxPQUFvQjtJQUNuRSxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtB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QkFDeEQsU0FBUztnQkFDWCxDQUFDO2dCQUNELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQ25FLE9BQU8sSUFBSSxDQUFDO2dCQUNkLENBQUM7WUFDSCxDQUFDO1lBQ0QsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRUQsT0FBTyxhQUFhLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDdkMsQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlYWRGaWxlU3luYyB9IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgZGlybmFtZSwgcG9zaXggfSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IGlnbm9yZSwgeyB0eXBlIElnbm9yZSB9IGZyb20gJ2lnbm9yZSc7XG5cbi8qKlxuICogRGlyZWN0b3J5LW5hbWUgZnJhZ21lbnRzIHRoYXQgYXJlIGFsd2F5cyBleGNsdWRlZCBmcm9tIHRoZSBkZXYgd2F0Y2hlcixcbiAqIHJlZ2FyZGxlc3Mgb2YgYC5naXRpZ25vcmVgLiBNYXRjaGVkIGFzIFBPU0lYIHN1YnN0cmluZ3Mgb2YgdGhlIGFic29sdXRlXG4gKiBwYXRoIChlLmcuIGAvbm9kZV9tb2R1bGVzL2AgbWF0Y2hlcyBhbnkgcGF0aCBjb250YWluaW5nIHRoYXQgc2VnbWVudCkuXG4gKi9cbmV4cG9ydCBjb25zdCBCVUlMVElOX0lHTk9SRURfUEFUSF9GUkFHTUVOVFM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW1xuICAnLy5naXQvJyxcbiAgJy9ub2RlX21vZHVsZXMvJyxcbiAgJy8ubmV4dC8nLFxuICAnLy50dXJiby8nLFxuICAnLy52ZXJjZWwvJyxcbiAgJy9kaXN0LycsXG4gICcvYnVpbGQvJyxcbiAgJy9vdXQvJyxcbiAgJy8uY2FjaGUvJyxcbiAgJy8ueWFybi8nLFxuICAnLy5wbnBtLXN0b3JlLycsXG4gICcvLnBhcmNlbC1jYWNoZS8nLFxuICAnLy53ZWxsLWtub3duL3dvcmtmbG93LycsXG5dO1xuXG4vKipcbiAqIEVudmlyb25tZW50IHZhcmlhYmxlIHRoYXQgbGV0cyBhIHByb2plY3QgYWRkIGV4dHJhIHBhdGggZnJhZ21lbnRzIHRvIHRoZVxuICogZGV2IHdhdGNoZXIgaWdub3JlIGxpc3QuIENvbW1hLXNlcGFyYXRlZDsgZWFjaCBlbnRyeSBpcyBtYXRjaGVkIGFzIGEgUE9TSVhcbiAqIHN1YnN0cmluZyBvZiB0aGUgYWJzb2x1dGUgcGF0aCwgZXhhY3RseSBsaWtlIHtAbGluayBCVUlMVElOX0lHTk9SRURfUEFUSF9GUkFHTUVOVFN9LlxuICogQWRkaXRpdmUgdG8gYC5naXRpZ25vcmVgIGFuZCB0aGUgYnVpbHQtaW4gbGlzdC4gRGV2LW1vZGUgb25seS5cbiAqL1xuZXhwb3J0IGNvbnN0IFdBVENIX0lHTk9SRURfUEFUSFNfRU5WID0gJ1dPUktGTE9XX0RFVl9XQVRDSF9JR05PUkVEX1BBVEhTJztcblxuY29uc3QgdG9Qb3NpeCA9IChwYXRobmFtZTogc3RyaW5nKSA9PiBwYXRobmFtZS5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG5cbi8qKlxuICogUGFyc2UgdGhlIGNvbW1hLXNlcGFyYXRlZCB7QGxpbmsgV0FUQ0hfSUdOT1JFRF9QQVRIU19FTlZ9IHZhbHVlIGludG8gYSBsaXN0XG4gKiBvZiBQT1NJWCBwYXRoIGZyYWdtZW50cy4gV2hpdGVzcGFjZSBpcyB0cmltbWVkIGFuZCBlbXB0eSBlbnRyaWVzIGRyb3BwZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUlnbm9yZWRQYXRoc0Vudih2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nW10ge1xuICBpZiAoIXZhbHVlKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIHJldHVybiB2YWx1ZVxuICAgIC5zcGxpdCgnLCcpXG4gICAgLm1hcCgoZW50cnkpID0+IHRvUG9zaXgoZW50cnkudHJpbSgpKSlcbiAgICAuZmlsdGVyKChlbnRyeSkgPT4gZW50cnkubGVuZ3RoID4gMCk7XG59XG5cbmludGVyZmFjZSBHaXRpZ25vcmVNYXRjaGVyIHtcbiAgLyoqIFBPU0lYIGFic29sdXRlIGRpcmVjdG9yeSB0aGUgYC5naXRpZ25vcmVgIGxpdmVzIGluIChubyB0cmFpbGluZyBzbGFzaCkuICovXG4gIGRpcjogc3RyaW5nO1xuICBtYXRjaGVyOiBJZ25vcmU7XG4gIC8qKiBSYXcgcGF0dGVybiBsaW5lcywgdXNlZCB0byByZWJ1aWxkIHRoZSBtYXRjaGVyIHdpdGhvdXQgYSBuZXV0cmFsaXplZCBydWxlLiAqL1xuICBsaW5lczogc3RyaW5nW107XG4gIC8qKiBXaGV0aGVyIHRoaXMgZmlsZSBjb250YWlucyBhbnkgYCFgIHJlLWluY2x1c2lvbiBydWxlLiAqL1xuICBoYXNOZWdhdGlvbjogYm9vbGVhbjtcbiAgLyoqIE1hdGNoZXJzIHJlYnVpbHQgd2l0aCBzb21lIHJ1bGVzIGRyb3BwZWQsIGtleWVkIGJ5IHRoZSBkcm9wcGVkIHNldC4gKi9cbiAgZmlsdGVyZWQ6IE1hcDxzdHJpbmcsIElnbm9yZT47XG59XG5cbi8qKlxuICogUmVidWlsZCBhIG1hdGNoZXIgd2l0aCBgZHJvcHBlZGAgcGF0dGVybiBsaW5lcyByZW1vdmVkLiBVc2VkIHdoZW4gYSBydWxlXG4gKiBleGNsdWRlZCBhIGRpcmVjdG9yeSB0aGF0IGEgZGVlcGVyIGAuZ2l0aWdub3JlYCByZS1pbmNsdWRlZDogdGhhdCBydWxlIG11c3RcbiAqIHN0b3AgYXBwbHlpbmcgdG8gdGhlIHN1YnRyZWUsIHdoaWxlIGV2ZXJ5ICpvdGhlciogcnVsZSBpbiB0aGUgc2FtZSBmaWxlXG4gKiAoZS5nLiBhIGAqLnNlY3JldGAgdGhhdCBzdGlsbCBtYXRjaGVzIGEgZmlsZSBpbnNpZGUpIGtlZXBzIGFwcGx5aW5nLlxuICovXG5mdW5jdGlvbiBtYXRjaGVyV2l0aG91dChlbnRyeTogR2l0aWdub3JlTWF0Y2hlciwgZHJvcHBlZDogU2V0PHN0cmluZz4pOiBJZ25vcmUge1xuICBpZiAoZHJvcHBlZC5zaXplID09PSAwKSB7XG4gICAgcmV0dXJuIGVudHJ5Lm1hdGNoZXI7XG4gIH1cbiAgY29uc3Qga2V5ID0gWy4uLmRyb3BwZWRdLnNvcnQoKS5qb2luKCdcXG4nKTtcbiAgY29uc3QgY2FjaGVkID0gZW50cnkuZmlsdGVyZWQuZ2V0KGtleSk7XG4gIGlmIChjYWNoZWQpIHtcbiAgICByZXR1cm4gY2FjaGVkO1xuICB9XG4gIGNvbnN0IHJlYnVpbHQgPSBpZ25vcmUoKS5hZGQoXG4gICAgZW50cnkubGluZXMuZmlsdGVyKChsaW5lKSA9PiAhZHJvcHBlZC5oYXMobGluZS50cmltKCkpKVxuICApO1xuICBlbnRyeS5maWx0ZXJlZC5zZXQoa2V5LCByZWJ1aWx0KTtcbiAgcmV0dXJuIHJlYnVpbHQ7XG59XG5cbi8qKlxuICogTG9hZCBgLmdpdGlnbm9yZWAgbWF0Y2hlcnMgZm9yIGB3b3JraW5nRGlyYCB1cCB0byBhbmQgaW5jbHVkaW5nXG4gKiBgcHJvamVjdFJvb3RgLiBJbiBhIG1vbm9yZXBvIHRoZSBsYXJnZXN0IGlnbm9yZWQgdHJlZXMgYXJlIHR5cGljYWxseSBsaXN0ZWRcbiAqIGF0IHRoZSB3b3Jrc3BhY2Ugcm9vdCwgYW5kIGFwcC1sZXZlbCBgLmdpdGlnbm9yZWAgZmlsZXMgYXJlIGNvdmVyZWQgdG9vLlxuICpcbiAqIFJldHVybmVkIG91dGVybW9zdC1maXJzdCAod29ya3NwYWNlIHJvb3Qg4oaSIGFwcCksIHdoaWNoIGlzIHRoZSBvcmRlciBnaXRcbiAqIGFwcGxpZXMgdGhlbTogYSBydWxlIGluIGEgZGVlcGVyIGAuZ2l0aWdub3JlYCBvdmVycmlkZXMgYSBjb25mbGljdGluZyBydWxlXG4gKiBmcm9tIGEgc2hhbGxvd2VyIG9uZS5cbiAqXG4gKiBOZXN0ZWQgYC5naXRpZ25vcmVgIGZpbGVzICpiZWxvdyogYHdvcmtpbmdEaXJgIGFyZSBpbnRlbnRpb25hbGx5IG5vdCByZWFkIOKAlFxuICogdGhlIHtAbGluayBXQVRDSF9JR05PUkVEX1BBVEhTX0VOVn0gZW52IHZhciBiYWNrc3RvcHMgYW55dGhpbmcgdGhleSdkIGNvdmVyLlxuICovXG5mdW5jdGlvbiBsb2FkR2l0aWdub3JlTWF0Y2hlcnMoXG4gIHdvcmtpbmdEaXI6IHN0cmluZyxcbiAgcHJvamVjdFJvb3Q6IHN0cmluZ1xuKTogR2l0aWdub3JlTWF0Y2hlcltdIHtcbiAgY29uc3QgbWF0Y2hlcnM6IEdpdGlnbm9yZU1hdGNoZXJbXSA9IFtdO1xuICBjb25zdCBzdG9wQXQgPSB0b1Bvc2l4KHByb2plY3RSb290KTtcblxuICBsZXQgY3VycmVudCA9IHRvUG9zaXgod29ya2luZ0Rpcik7XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgbGV0IGNvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgY29udGVudCA9IHJlYWRGaWxlU3luYyhwb3NpeC5qb2luKGN1cnJlbnQsICcuZ2l0aWdub3JlJyksICd1dGYtOCcpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgY29udGVudCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKGNvbnRlbnQpIHtcbiAgICAgIGNvbnN0IGxpbmVzID0gY29udGVudC5zcGxpdCgnXFxuJyk7XG4gICAgICBtYXRjaGVycy5wdXNoKHtcbiAgICAgICAgZGlyOiBjdXJyZW50LFxuICAgICAgICBtYXRjaGVyOiBpZ25vcmUoKS5hZGQoY29udGVudCksXG4gICAgICAgIGxpbmVzLFxuICAgICAgICBoYXNOZWdhdGlvbjogbGluZXMuc29tZSgobGluZSkgPT4gbGluZS50cmltKCkuc3RhcnRzV2l0aCgnIScpKSxcbiAgICAgICAgZmlsdGVyZWQ6IG5ldyBNYXAoKSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChjdXJyZW50ID09PSBzdG9wQXQpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjb25zdCBwYXJlbnQgPSBkaXJuYW1lKGN1cnJlbnQpO1xuICAgIGlmIChwYXJlbnQgPT09IGN1cnJlbnQpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjdXJyZW50ID0gcGFyZW50O1xuICB9XG5cbiAgLy8gQ29sbGVjdGVkIGlubmVybW9zdC1maXJzdCB3aGlsZSB3YWxraW5nIHVwOyBnaXQgcHJlY2VkZW5jZSBpc1xuICAvLyBvdXRlcm1vc3QtZmlyc3QsIHdpdGggZGVlcGVyIGZpbGVzIHdpbm5pbmcuXG4gIHJldHVybiBtYXRjaGVycy5yZXZlcnNlKCk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hJZ25vcmVPcHRpb25zIHtcbiAgLyoqIEFic29sdXRlIHBhdGggb2YgdGhlIGFwcCBkaXJlY3RvcnkgYmVpbmcgYnVpbHQuICovXG4gIHdvcmtpbmdEaXI6IHN0cmluZztcbiAgLyoqIEFic29sdXRlIHBhdGggb2YgdGhlIHdvcmtzcGFjZS9wcm9qZWN0IHJvb3QuIERlZmF1bHRzIHRvIGB3b3JraW5nRGlyYC4gKi9cbiAgcHJvamVjdFJvb3Q/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBFeHRyYSBQT1NJWCBzdWJzdHJpbmcgZnJhZ21lbnRzIHRvIGlnbm9yZSwgaW4gYWRkaXRpb24gdG8gdGhlIGJ1aWx0LWluXG4gICAqIGxpc3QgYW5kIHRoZSB7QGxpbmsgV0FUQ0hfSUdOT1JFRF9QQVRIU19FTlZ9IGVudiB2YXIuIFVzZWQgYnkgdGhlIGNhbGxlclxuICAgKiBmb3IgYnVpbGQtdGltZSBwYXRocyBzdWNoIGFzIHRoZSBnZW5lcmF0ZWQgd29ya2Zsb3cgZGlyZWN0b3J5LlxuICAgKi9cbiAgZXh0cmFGcmFnbWVudHM/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIE92ZXJyaWRlIGZvciB0aGUge0BsaW5rIFdBVENIX0lHTk9SRURfUEFUSFNfRU5WfSBlbnYgdmFyLiBQcmltYXJpbHkgZm9yXG4gICAqIHRlc3Rpbmc7IGRlZmF1bHRzIHRvIGBwcm9jZXNzLmVudltXQVRDSF9JR05PUkVEX1BBVEhTX0VOVl1gLlxuICAgKi9cbiAgZW52SWdub3JlZFBhdGhzPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEJ1aWxkIHRoZSBkZXYtd2F0Y2hlciBpZ25vcmUgcHJlZGljYXRlLiBUaGUgcmV0dXJuZWQgZnVuY3Rpb24gcmVjZWl2ZXMgYVxuICogUE9TSVgtbm9ybWFsaXplZCBhYnNvbHV0ZSBwYXRoIGFuZCByZXR1cm5zIGB0cnVlYCB3aGVuIHRoYXQgcGF0aCBzaG91bGQgYmVcbiAqIHBydW5lZCBmcm9tIGJvdGggdGhlIGluaXRpYWwgZGlyZWN0b3J5IHdhbGsgYW5kIHRoZSBjaG9raWRhciB3YXRjaCBzZXQuXG4gKlxuICogQSBwYXRoIGlzIGlnbm9yZWQgd2hlbiBpdCBtYXRjaGVzIGFueSBvZjpcbiAqIC0gYSBidWlsdC1pbiBmcmFnbWVudCAoe0BsaW5rIEJVSUxUSU5fSUdOT1JFRF9QQVRIX0ZSQUdNRU5UU30pIG9yIGNhbGxlclxuICogICBgZXh0cmFGcmFnbWVudHNgIChQT1NJWCBzdWJzdHJpbmcgbWF0Y2gpLFxuICogLSBhIHtAbGluayBXQVRDSF9JR05PUkVEX1BBVEhTX0VOVn0gZnJhZ21lbnQgKFBPU0lYIHN1YnN0cmluZyBtYXRjaCksXG4gKiAtIGEgYC5naXRpZ25vcmVgIHJ1bGUgZnJvbSBgd29ya2luZ0RpcmAgdXAgdG8gYHByb2plY3RSb290YC5cbiAqXG4gKiBNYXRjaGVycyBhcmUgYnVpbHQgb25jZSBoZXJlOyB0aGUgcmV0dXJuZWQgcHJlZGljYXRlIGlzIGhvdCAoY2FsbGVkIHBlciBwYXRoXG4gKiBkdXJpbmcgdHJhdmVyc2FsIGFuZCBwZXIgY2hva2lkYXIgZXZlbnQpIGFuZCBkb2VzIG5vIEkvTy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVdhdGNoSWdub3JlUHJlZGljYXRlKFxuICBvcHRpb25zOiBXYXRjaElnbm9yZU9wdGlvbnNcbik6IChub3JtYWxpemVkUGF0aDogc3RyaW5nKSA9PiBib29sZWFuIHtcbiAgY29uc3QgcHJvamVjdFJvb3QgPSBvcHRpb25zLnByb2plY3RSb290ID8/IG9wdGlvbnMud29ya2luZ0RpcjtcbiAgY29uc3QgZW52SWdub3JlZFBhdGhzID1cbiAgICBvcHRpb25zLmVudklnbm9yZWRQYXRocyA/PyBwcm9jZXNzLmVudltXQVRDSF9JR05PUkVEX1BBVEhTX0VOVl07XG5cbiAgY29uc3QgZnJhZ21lbnRzID0gW1xuICAgIC4uLkJVSUxUSU5fSUdOT1JFRF9QQVRIX0ZSQUdNRU5UUyxcbiAgICAuLi4ob3B0aW9ucy5leHRyYUZyYWdtZW50cyA/PyBbXSkubWFwKHRvUG9zaXgpLFxuICAgIC4uLnBhcnNlSWdub3JlZFBhdGhzRW52KGVudklnbm9yZWRQYXRocyksXG4gIF07XG5cbiAgY29uc3QgZ2l0aWdub3JlTWF0Y2hlcnMgPSBsb2FkR2l0aWdub3JlTWF0Y2hlcnMoXG4gICAgb3B0aW9ucy53b3JraW5nRGlyLFxuICAgIHByb2plY3RSb290XG4gICk7XG4gIC8vIFJlLWluY2x1c2lvbiBpcyBvbmx5IHBvc3NpYmxlIHdoZW4gc29tZSBmaWxlIGhhcyBhIGAhYCBydWxlLiBXaXRob3V0IG9uZSxcbiAgLy8gdGhlIGNoZWFwIGZsYXQgc2NhbiBiZWxvdyBpcyBlcXVpdmFsZW50IHRvIHRoZSBmdWxsIHBlci1kaXJlY3Rvcnkgd2Fsay5cbiAgY29uc3QgYW55TmVnYXRpb24gPSBnaXRpZ25vcmVNYXRjaGVycy5zb21lKChlbnRyeSkgPT4gZW50cnkuaGFzTmVnYXRpb24pO1xuICBjb25zdCBvdXRlcm1vc3REaXIgPSBnaXRpZ25vcmVNYXRjaGVyc1swXT8uZGlyO1xuXG4gIC8qKiBUZXN0IG9uZSBwYXRoIGFnYWluc3Qgb25lIG1hdGNoZXIsIGFzIGJvdGggYSBmaWxlIGFuZCBhIGRpcmVjdG9yeSBub2RlLiAqL1xuICBjb25zdCB0ZXN0RW50cnkgPSAoXG4gICAgZW50cnk6IEdpdGlnbm9yZU1hdGNoZXIsXG4gICAgcmVsOiBzdHJpbmcsXG4gICAgZHJvcHBlZDogU2V0PHN0cmluZz4gfCB1bmRlZmluZWRcbiAgKSA9PiB7XG4gICAgY29uc3QgbWF0Y2hlciA9IGRyb3BwZWQgPyBtYXRjaGVyV2l0aG91dChlbnRyeSwgZHJvcHBlZCkgOiBlbnRyeS5tYXRjaGVyO1xuICAgIC8vIFRlc3QgdGhlIHRyYWlsaW5nLXNsYXNoIGZvcm0gdG9vIHNvIGEgZGlyZWN0b3J5IG5vZGUgaXRzZWxmIG1hdGNoZXMgYVxuICAgIC8vIGBkaXIvYCBnaXRpZ25vcmUgcnVsZSAobm90IGp1c3QgaXRzIGNoaWxkcmVuKSDigJQgdGhpcyBsZXRzIHRoZSB3YWxrIGFuZFxuICAgIC8vIGNob2tpZGFyIHBydW5lIHRoZSBkaXJlY3RvcnkgaW5zdGVhZCBvZiBkZXNjZW5kaW5nIGludG8gaXQuXG4gICAgY29uc3QgYXNGaWxlID0gbWF0Y2hlci50ZXN0KHJlbCk7XG4gICAgY29uc3QgYXNEaXIgPSBtYXRjaGVyLnRlc3QoYCR7cmVsfS9gKTtcbiAgICBpZiAoYXNGaWxlLmlnbm9yZWQpIHtcbiAgICAgIHJldHVybiB7IGlnbm9yZWQ6IHRydWUsIHBhdHRlcm46IGFzRmlsZS5ydWxlPy5wYXR0ZXJuIH07XG4gICAgfVxuICAgIGlmIChhc0Rpci5pZ25vcmVkKSB7XG4gICAgICByZXR1cm4geyBpZ25vcmVkOiB0cnVlLCBwYXR0ZXJuOiBhc0Rpci5ydWxlPy5wYXR0ZXJuIH07XG4gICAgfVxuICAgIGlmIChhc0ZpbGUudW5pZ25vcmVkIHx8IGFzRGlyLnVuaWdub3JlZCkge1xuICAgICAgcmV0dXJuIHsgaWdub3JlZDogZmFsc2UsIHBhdHRlcm46IHVuZGVmaW5lZCB9O1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXNvbHZlIG9uZSBwYXRoIGxldmVsIGFnYWluc3QgZXZlcnkgYXBwbGljYWJsZSBgLmdpdGlnbm9yZWAsIGRlZXBlc3QgZmlsZVxuICAgKiBsYXN0IHNvIGl0IHdpbnMuIFJldHVybnMgdGhlIGxldmVsJ3MgdmVyZGljdCBwbHVzIHRoZSBydWxlcyB0aGF0IHZvdGVkIHRvXG4gICAqIGV4Y2x1ZGUgaXQsIHdoaWNoIHRoZSBjYWxsZXIgbmV1dHJhbGl6ZXMgaWYgdGhlIGxldmVsIGlzIHJlLWluY2x1ZGVkLlxuICAgKi9cbiAgY29uc3QgZGVjaWRlTGV2ZWwgPSAoXG4gICAgcHJlZml4OiBzdHJpbmcsXG4gICAgbmV1dHJhbGl6ZWQ6IE1hcDxudW1iZXIsIFNldDxzdHJpbmc+PlxuICApID0+IHtcbiAgICBsZXQgZGVjaXNpb246IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gICAgbGV0IGV4Y2x1ZGVkQnk6IEFycmF5PHsgaW5kZXg6IG51bWJlcjsgcGF0dGVybjogc3RyaW5nIH0+ID0gW107XG5cbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgZ2l0aWdub3JlTWF0Y2hlcnMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBjb25zdCBlbnRyeSA9IGdpdGlnbm9yZU1hdGNoZXJzW2luZGV4XTtcbiAgICAgIGNvbnN0IHJlbCA9IHBvc2l4LnJlbGF0aXZlKGVudHJ5LmRpciwgcHJlZml4KTtcbiAgICAgIC8vIEVtcHR5IG1lYW5zIHRoZSBwYXRoICppcyogdGhlIGdpdGlnbm9yZSBkaXI7IGEgYC4uYCBwcmVmaXggbWVhbnMgaXQgaXNcbiAgICAgIC8vIG91dHNpZGUuIGBpZ25vcmVgIG9ubHkgYWNjZXB0cyByZWxhdGl2ZSwgaW4tdHJlZSBwYXRocy5cbiAgICAgIGlmIChyZWwgPT09ICcnIHx8IHJlbCA9PT0gJy4uJyB8fCByZWwuc3RhcnRzV2l0aCgnLi4vJykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCByZXN1bHQgPSB0ZXN0RW50cnkoZW50cnksIHJlbCwgbmV1dHJhbGl6ZWQuZ2V0KGluZGV4KSk7XG4gICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICghcmVzdWx0Lmlnbm9yZWQpIHtcbiAgICAgICAgZGVjaXNpb24gPSBmYWxzZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoZGVjaXNpb24gIT09IHRydWUpIHtcbiAgICAgICAgZXhjbHVkZWRCeSA9IFtdO1xuICAgICAgfVxuICAgICAgZGVjaXNpb24gPSB0cnVlO1xuICAgICAgaWYgKHJlc3VsdC5wYXR0ZXJuKSB7XG4gICAgICAgIGV4Y2x1ZGVkQnkucHVzaCh7IGluZGV4LCBwYXR0ZXJuOiByZXN1bHQucGF0dGVybiB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4geyBkZWNpc2lvbiwgZXhjbHVkZWRCeSB9O1xuICB9O1xuXG4gIC8qKlxuICAgKiBXYWxrIHRoZSBwYXRoIG9uZSBkaXJlY3Rvcnkgc2VnbWVudCBhdCBhIHRpbWUsIHRoZSB3YXkgZ2l0IGRvZXMuIEF0IGVhY2hcbiAgICogbGV2ZWwgdGhlIGRlZXBlc3QgYC5naXRpZ25vcmVgIHdpdGggYW4gb3BpbmlvbiB3aW5zOyBpZiB0aGF0IHZlcmRpY3QgaXNcbiAgICogXCJpZ25vcmVkXCIgZ2l0IHN0b3BzIGRlc2NlbmRpbmcsIHNvIHdlIGNhbiByZXR1cm4gaW1tZWRpYXRlbHkuXG4gICAqXG4gICAqIFdoZW4gYSBsZXZlbCBpcyByZS1pbmNsdWRlZCBhZnRlciBhIHNoYWxsb3dlciBmaWxlIGV4Y2x1ZGVkIGl0LCB0aGUgcnVsZVxuICAgKiB0aGF0IGRpZCB0aGUgZXhjbHVkaW5nIGlzIG5ldXRyYWxpemVkIGZvciB0aGUgcmVzdCBvZiB0aGUgd2Fsay4gVGhhdCBpc1xuICAgKiB3aGF0IGxldHMgcm9vdCBgZ2VuZXJhdGVkL2AgKyBhcHAgYCFnZW5lcmF0ZWQvYCB3YXRjaCBgYXBwL2dlbmVyYXRlZC94LnRzYFxuICAgKiB3aGlsZSBhIHNpYmxpbmcgcm9vdCBydWxlIHN1Y2ggYXMgYCouc2VjcmV0YCBzdGlsbCBleGNsdWRlc1xuICAgKiBgYXBwL2dlbmVyYXRlZC9hLnNlY3JldGAuXG4gICAqL1xuICBjb25zdCB3YWxrR2l0aWdub3JlID0gKG5vcm1hbGl6ZWRQYXRoOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgICBpZiAoIW91dGVybW9zdERpcikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCByZWxUb0Jhc2UgPSBwb3NpeC5yZWxhdGl2ZShvdXRlcm1vc3REaXIsIG5vcm1hbGl6ZWRQYXRoKTtcbiAgICBpZiAocmVsVG9CYXNlID09PSAnJyB8fCByZWxUb0Jhc2UgPT09ICcuLicgfHwgcmVsVG9CYXNlLnN0YXJ0c1dpdGgoJy4uLycpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgbmV1dHJhbGl6ZWQgPSBuZXcgTWFwPG51bWJlciwgU2V0PHN0cmluZz4+KCk7XG4gICAgbGV0IHByZWZpeCA9IG91dGVybW9zdERpcjtcblxuICAgIGZvciAoY29uc3Qgc2VnbWVudCBvZiByZWxUb0Jhc2Uuc3BsaXQoJy8nKSkge1xuICAgICAgcHJlZml4ID0gYCR7cHJlZml4fS8ke3NlZ21lbnR9YDtcbiAgICAgIGNvbnN0IHsgZGVjaXNpb24sIGV4Y2x1ZGVkQnkgfSA9IGRlY2lkZUxldmVsKHByZWZpeCwgbmV1dHJhbGl6ZWQpO1xuXG4gICAgICBpZiAoZGVjaXNpb24gPT09IHRydWUpIHtcbiAgICAgICAgLy8gR2l0IGRvZXMgbm90IGRlc2NlbmQgaW50byBhbiBleGNsdWRlZCBkaXJlY3RvcnkuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKGRlY2lzaW9uID09PSBmYWxzZSkge1xuICAgICAgICAvLyBUaGlzIGxldmVsIHdhcyByZS1pbmNsdWRlZDsgdGhlIHJ1bGVzIHRoYXQgZXhjbHVkZWQgaXQgbXVzdCBub3RcbiAgICAgICAgLy8gcmVzdXJyZWN0IGZvciBhbnl0aGluZyBiZW5lYXRoIGl0LlxuICAgICAgICBmb3IgKGNvbnN0IHsgaW5kZXgsIHBhdHRlcm4gfSBvZiBleGNsdWRlZEJ5KSB7XG4gICAgICAgICAgY29uc3QgZHJvcHBlZCA9IG5ldXRyYWxpemVkLmdldChpbmRleCkgPz8gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgICAgZHJvcHBlZC5hZGQocGF0dGVybik7XG4gICAgICAgICAgbmV1dHJhbGl6ZWQuc2V0KGluZGV4LCBkcm9wcGVkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICByZXR1cm4gKG5vcm1hbGl6ZWRQYXRoOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgICAvLyBCdWlsdC1pbiBhbmQgZW52LXZhciBmcmFnbWVudHMgYXJlIGhhcmQgZXhjbHVkZXM6IHRoZXkgYXJlIGRlbGliZXJhdGVseVxuICAgIC8vIG5vdCBzdWJqZWN0IHRvIGdpdGlnbm9yZSBuZWdhdGlvbiwgc28gYSBzdHJheSBgIWAgcnVsZSBjYW5ub3QgZHJhZ1xuICAgIC8vIGBub2RlX21vZHVsZXNgIG9yIHRoZSBnZW5lcmF0ZWQgZGlyZWN0b3J5IGJhY2sgaW50byB0aGUgd2F0Y2ggc2V0LlxuICAgIGZvciAoY29uc3QgZnJhZ21lbnQgb2YgZnJhZ21lbnRzKSB7XG4gICAgICBpZiAobm9ybWFsaXplZFBhdGguaW5jbHVkZXMoZnJhZ21lbnQpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghYW55TmVnYXRpb24pIHtcbiAgICAgIC8vIEZhc3QgcGF0aDogbm8gcmUtaW5jbHVzaW9uIGFueXdoZXJlLCBzbyB0aGUgZmlyc3QgbWF0Y2ggZGVjaWRlcy5cbiAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZ2l0aWdub3JlTWF0Y2hlcnMpIHtcbiAgICAgICAgY29uc3QgcmVsID0gcG9zaXgucmVsYXRpdmUoZW50cnkuZGlyLCBub3JtYWxpemVkUGF0aCk7XG4gICAgICAgIGlmIChyZWwgPT09ICcnIHx8IHJlbCA9PT0gJy4uJyB8fCByZWwuc3RhcnRzV2l0aCgnLi4vJykpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW50cnkubWF0Y2hlci5pZ25vcmVzKHJlbCkgfHwgZW50cnkubWF0Y2hlci5pZ25vcmVzKGAke3JlbH0vYCkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB3YWxrR2l0aWdub3JlKG5vcm1hbGl6ZWRQYXRoKTtcbiAgfTtcbn1cbiJdfQ==
package/docs/next.mdx CHANGED
@@ -192,7 +192,7 @@ async function sendOnboardingEmail(user: { id: string; email: string}) {
192
192
 
193
193
  Taking a look at this code:
194
194
 
195
- * Business logic lives inside **steps**. When a step is invoked inside a **workflow**, it gets enqueued to run on a separate request while the workflow is suspended, just like `sleep`.
195
+ * Business logic lives inside **steps**. When a workflow invokes a step, the workflow suspends while the step runs with full Node.js access. The combined handler may execute it inline; queued retries and continuations return through the same flow route.
196
196
  * If a step throws an error, like in `sendWelcomeEmail`, the step will automatically be retried until it succeeds (or hits the step's max retry count).
197
197
  * Steps can throw a `FatalError` if an error is intentional and should not be retried.
198
198
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@workflow/next",
3
- "version": "5.0.0-beta.36",
3
+ "version": "5.0.0-beta.38",
4
4
  "description": "Next.js integration for Workflow SDK",
5
5
  "type": "commonjs",
6
6
  "main": "dist/index.js",
@@ -28,15 +28,16 @@
28
28
  "dependencies": {
29
29
  "@swc/core": "1.15.3",
30
30
  "chokidar": "4.0.3",
31
+ "ignore": "7.0.5",
31
32
  "semver": "7.7.4",
32
- "@workflow/builders": "5.0.0-beta.36",
33
- "@workflow/core": "5.0.0-beta.36",
33
+ "@workflow/builders": "5.0.0-beta.38",
34
+ "@workflow/core": "5.0.0-beta.38",
34
35
  "@workflow/swc-plugin": "5.0.0-beta.5"
35
36
  },
36
37
  "devDependencies": {
37
38
  "@types/node": "22.19.0",
38
39
  "@types/semver": "7.7.1",
39
- "next": "16.2.10",
40
+ "next": "16.2.11",
40
41
  "typescript": "^6.0.3",
41
42
  "vitest": "^4.1.10",
42
43
  "@workflow/tsconfig": "5.0.0-beta.0"