@bluelibs/runner 5.3.0 → 5.4.0

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 (60) hide show
  1. package/dist/browser/index.cjs +829 -742
  2. package/dist/browser/index.cjs.map +1 -1
  3. package/dist/browser/index.mjs +828 -743
  4. package/dist/browser/index.mjs.map +1 -1
  5. package/dist/edge/index.cjs +829 -742
  6. package/dist/edge/index.cjs.map +1 -1
  7. package/dist/edge/index.mjs +828 -743
  8. package/dist/edge/index.mjs.map +1 -1
  9. package/dist/node/node.cjs +1462 -1706
  10. package/dist/node/node.cjs.map +1 -1
  11. package/dist/node/node.mjs +1459 -1659
  12. package/dist/node/node.mjs.map +1 -1
  13. package/dist/types/definers/builders/event/utils.d.ts +1 -4
  14. package/dist/types/definers/builders/hook/utils.d.ts +1 -4
  15. package/dist/types/definers/builders/middleware/utils.d.ts +1 -4
  16. package/dist/types/definers/builders/resource/utils.d.ts +1 -4
  17. package/dist/types/definers/builders/shared/mergeUtils.d.ts +5 -0
  18. package/dist/types/definers/builders/task/utils.d.ts +1 -4
  19. package/dist/types/definers/builders/utils.d.ts +1 -1
  20. package/dist/types/errors.d.ts +20 -21
  21. package/dist/types/models/DependencyProcessor.d.ts +1 -1
  22. package/dist/types/models/MiddlewareManager.d.ts +2 -2
  23. package/dist/types/models/RunResult.d.ts +1 -1
  24. package/dist/types/models/Store.d.ts +10 -10
  25. package/dist/types/models/StoreRegistry.d.ts +14 -13
  26. package/dist/types/models/middleware/ResourceMiddlewareComposer.d.ts +2 -2
  27. package/dist/types/models/utils/buildDependencyGraph.d.ts +12 -0
  28. package/dist/types/models/utils/dependencyStrategies.d.ts +15 -0
  29. package/dist/types/models/utils/disposeOrder.d.ts +7 -0
  30. package/dist/types/node/durable/core/DurableResource.d.ts +1 -0
  31. package/dist/types/node/durable/core/resource.d.ts +5 -5
  32. package/dist/types/node/durable/resources/memoryDurableResource.d.ts +5 -5
  33. package/dist/types/node/durable/resources/redisDurableResource.d.ts +5 -5
  34. package/dist/types/node/durable/tags/durableWorkflow.tag.d.ts +6 -1
  35. package/dist/types/node/exposure/requestContext.d.ts +1 -1
  36. package/dist/types/node/exposure/resource.d.ts +7 -7
  37. package/dist/types/node/http/http-mixed-client.factory.resource.d.ts +1 -1
  38. package/dist/types/node/http/http-smart-client.factory.resource.d.ts +1 -1
  39. package/dist/types/node/node.d.ts +1 -184
  40. package/dist/types/platform/adapters/edge.d.ts +17 -0
  41. package/dist/types/platform/adapters/universal-generic.d.ts +3 -0
  42. package/dist/types/platform/index.d.ts +1 -0
  43. package/dist/types/platform/types.d.ts +7 -1
  44. package/dist/types/public.d.ts +2 -0
  45. package/dist/types/tools/LockableMap.d.ts +20 -0
  46. package/dist/types/types/symbols.d.ts +1 -1
  47. package/dist/types/types/task.d.ts +1 -1
  48. package/dist/ui/assets/index-Bo7Gi6Vq.js +141 -0
  49. package/dist/ui/assets/index-Y_9aLumt.css +1 -0
  50. package/dist/ui/index.html +2 -3
  51. package/dist/universal/index.cjs +829 -742
  52. package/dist/universal/index.cjs.map +1 -1
  53. package/dist/universal/index.mjs +828 -743
  54. package/dist/universal/index.mjs.map +1 -1
  55. package/package.json +1 -2
  56. package/readmes/AI.md +34 -3
  57. package/dist/ui/assets/index-2cb8f39f.js +0 -141
  58. package/dist/ui/assets/index-b1f988bf.css +0 -1
  59. /package/dist/types/{tunnels → tools}/buildUniversalManifest.d.ts +0 -0
  60. /package/dist/types/{processHooks.d.ts → tools/processShutdownHooks.d.ts} +0 -0
@@ -1,9 +1,6 @@
1
1
  import { LRUCache } from 'lru-cache';
2
2
 
3
3
  var __defProp = Object.defineProperty;
4
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
- var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __hasOwnProp = Object.prototype.hasOwnProperty;
7
4
  var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
8
5
  var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
9
6
  get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
@@ -11,152 +8,10 @@ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require
11
8
  if (typeof require !== "undefined") return require.apply(this, arguments);
12
9
  throw Error('Dynamic require of "' + x + '" is not supported');
13
10
  });
14
- var __esm = (fn, res) => function __init() {
15
- return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
16
- };
17
11
  var __export = (target, all) => {
18
12
  for (var name in all)
19
13
  __defProp(target, name, { get: all[name], enumerable: true });
20
14
  };
21
- var __copyProps = (to, from, except, desc) => {
22
- if (from && typeof from === "object" || typeof from === "function") {
23
- for (let key of __getOwnPropNames(from))
24
- if (!__hasOwnProp.call(to, key) && key !== except)
25
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
26
- }
27
- return to;
28
- };
29
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
30
-
31
- // src/serializer/regexp-validator.ts
32
- var regexp_validator_exports = {};
33
- __export(regexp_validator_exports, {
34
- assertRegExpPayload: () => assertRegExpPayload,
35
- isBoundedQuantifier: () => isBoundedQuantifier,
36
- isQuantifierAt: () => isQuantifierAt,
37
- isQuantifierChar: () => isQuantifierChar,
38
- isRegExpPatternSafe: () => isRegExpPatternSafe
39
- });
40
- var isQuantifierAt, isQuantifierChar, isBoundedQuantifier, isRegExpPatternSafe, assertRegExpPayload;
41
- var init_regexp_validator = __esm({
42
- "src/serializer/regexp-validator.ts"() {
43
- isQuantifierAt = /* @__PURE__ */ __name((pattern, index) => {
44
- if (index >= pattern.length) {
45
- return false;
46
- }
47
- const char = pattern[index];
48
- if (char === "*" || char === "+" || char === "?") {
49
- return true;
50
- }
51
- if (char === "{") {
52
- return isBoundedQuantifier(pattern, index);
53
- }
54
- return false;
55
- }, "isQuantifierAt");
56
- isQuantifierChar = /* @__PURE__ */ __name((char, pattern, index) => {
57
- if (char === "*" || char === "+") {
58
- return true;
59
- }
60
- if (char === "?") {
61
- if (index > 0 && pattern[index - 1] === "(") {
62
- return false;
63
- }
64
- return true;
65
- }
66
- if (char === "{") {
67
- return isBoundedQuantifier(pattern, index);
68
- }
69
- return false;
70
- }, "isQuantifierChar");
71
- isBoundedQuantifier = /* @__PURE__ */ __name((pattern, index) => {
72
- let sawDigit = false;
73
- let sawComma = false;
74
- for (let i = index + 1; i < pattern.length; i += 1) {
75
- const char = pattern[i];
76
- if (char >= "0" && char <= "9") {
77
- sawDigit = true;
78
- continue;
79
- }
80
- if (char === "," && !sawComma) {
81
- sawComma = true;
82
- continue;
83
- }
84
- if (char === "}") {
85
- return sawDigit;
86
- }
87
- return false;
88
- }
89
- return false;
90
- }, "isBoundedQuantifier");
91
- isRegExpPatternSafe = /* @__PURE__ */ __name((pattern) => {
92
- const groupStack = [];
93
- let escaped = false;
94
- let inCharClass = false;
95
- for (let index = 0; index < pattern.length; index += 1) {
96
- const char = pattern[index];
97
- if (escaped) {
98
- escaped = false;
99
- continue;
100
- }
101
- if (char === "\\") {
102
- escaped = true;
103
- continue;
104
- }
105
- if (inCharClass) {
106
- if (char === "]") {
107
- inCharClass = false;
108
- }
109
- continue;
110
- }
111
- if (char === "[") {
112
- inCharClass = true;
113
- continue;
114
- }
115
- if (char === "(") {
116
- groupStack.push({ hasQuantifier: false });
117
- if (pattern[index + 1] === "?") {
118
- index += 1;
119
- }
120
- continue;
121
- }
122
- if (char === ")") {
123
- const group = groupStack.pop();
124
- if (group?.hasQuantifier && isQuantifierAt(pattern, index + 1)) {
125
- return false;
126
- }
127
- if (group?.hasQuantifier && groupStack.length > 0) {
128
- groupStack[groupStack.length - 1].hasQuantifier = true;
129
- }
130
- continue;
131
- }
132
- if (isQuantifierChar(char, pattern, index)) {
133
- if (groupStack.length > 0) {
134
- groupStack[groupStack.length - 1].hasQuantifier = true;
135
- }
136
- }
137
- }
138
- return true;
139
- }, "isRegExpPatternSafe");
140
- assertRegExpPayload = /* @__PURE__ */ __name((value, options) => {
141
- if (!value || typeof value !== "object") {
142
- throw new Error("Invalid RegExp payload");
143
- }
144
- const record = value;
145
- if (typeof record.pattern !== "string" || typeof record.flags !== "string") {
146
- throw new Error("Invalid RegExp payload");
147
- }
148
- if (record.pattern.length > options.maxPatternLength) {
149
- throw new Error(
150
- `RegExp pattern exceeds limit (${options.maxPatternLength})`
151
- );
152
- }
153
- if (!options.allowUnsafe && !isRegExpPatternSafe(record.pattern)) {
154
- throw new Error("Unsafe RegExp pattern");
155
- }
156
- return { pattern: record.pattern, flags: record.flags };
157
- }, "assertRegExpPayload");
158
- }
159
- });
160
15
 
161
16
  // src/types/symbols.ts
162
17
  var symbolTask = Symbol.for("runner.task");
@@ -194,227 +49,6 @@ var symbolAsyncContext = Symbol.for(
194
49
  "runner.asyncContext"
195
50
  );
196
51
 
197
- // src/tools/getCallerFile.ts
198
- function isNodeInline() {
199
- return typeof process !== "undefined" && typeof process?.versions?.node === "string";
200
- }
201
- __name(isNodeInline, "isNodeInline");
202
- function getCallerFile() {
203
- const originalPrepare = Error.prepareStackTrace;
204
- try {
205
- if (isNodeInline()) {
206
- const err = new Error();
207
- Error.prepareStackTrace = (_err, stack2) => stack2;
208
- const stack = err.stack;
209
- stack.shift();
210
- stack.shift();
211
- const candidate = stack.shift();
212
- const file = candidate?.getFileName?.();
213
- return file;
214
- }
215
- return "unknown";
216
- } finally {
217
- Error.prepareStackTrace = originalPrepare;
218
- }
219
- }
220
- __name(getCallerFile, "getCallerFile");
221
-
222
- // src/defs.ts
223
- var defs_exports = {};
224
- __export(defs_exports, {
225
- CONTRACT: () => CONTRACT,
226
- HookDependencyState: () => HookDependencyState,
227
- RunnerMode: () => RunnerMode,
228
- isOneOf: () => isOneOf,
229
- onAnyOf: () => onAnyOf,
230
- symbolAsyncContext: () => symbolAsyncContext,
231
- symbolError: () => symbolError,
232
- symbolEvent: () => symbolEvent,
233
- symbolFilePath: () => symbolFilePath,
234
- symbolForkedFrom: () => symbolForkedFrom,
235
- symbolHook: () => symbolHook,
236
- symbolMiddleware: () => symbolMiddleware,
237
- symbolMiddlewareConfigured: () => symbolMiddlewareConfigured,
238
- symbolOptionalDependency: () => symbolOptionalDependency,
239
- symbolPhantomTask: () => symbolPhantomTask,
240
- symbolResource: () => symbolResource,
241
- symbolResourceMiddleware: () => symbolResourceMiddleware,
242
- symbolResourceWithConfig: () => symbolResourceWithConfig,
243
- symbolTag: () => symbolTag,
244
- symbolTagConfigured: () => symbolTagConfigured,
245
- symbolTask: () => symbolTask,
246
- symbolTaskMiddleware: () => symbolTaskMiddleware,
247
- symbolTunneledBy: () => symbolTunneledBy
248
- });
249
-
250
- // src/types/event.ts
251
- function onAnyOf(...defs) {
252
- return defs;
253
- }
254
- __name(onAnyOf, "onAnyOf");
255
- function isOneOf(emission, defs) {
256
- return defs.some((d) => d.id === emission.id);
257
- }
258
- __name(isOneOf, "isOneOf");
259
-
260
- // src/types/runner.ts
261
- var RunnerMode = /* @__PURE__ */ ((RunnerMode2) => {
262
- RunnerMode2["TEST"] = "test";
263
- RunnerMode2["DEV"] = "dev";
264
- RunnerMode2["PROD"] = "prod";
265
- return RunnerMode2;
266
- })(RunnerMode || {});
267
-
268
- // src/types/contracts.ts
269
- var CONTRACT = Symbol.for("runner.contract");
270
-
271
- // src/types/storeTypes.ts
272
- var HookDependencyState = /* @__PURE__ */ ((HookDependencyState2) => {
273
- HookDependencyState2["Pending"] = "pending";
274
- HookDependencyState2["Computing"] = "computing";
275
- HookDependencyState2["Ready"] = "ready";
276
- return HookDependencyState2;
277
- })(HookDependencyState || {});
278
-
279
- // src/definers/tools.ts
280
- function isTask(definition) {
281
- return definition && definition[symbolTask];
282
- }
283
- __name(isTask, "isTask");
284
- function isResource(definition) {
285
- return definition && definition[symbolResource];
286
- }
287
- __name(isResource, "isResource");
288
- function isResourceWithConfig(definition) {
289
- return definition && definition[symbolResourceWithConfig];
290
- }
291
- __name(isResourceWithConfig, "isResourceWithConfig");
292
- function isEvent(definition) {
293
- return definition && definition[symbolEvent];
294
- }
295
- __name(isEvent, "isEvent");
296
- function isHook(definition) {
297
- return definition && definition[symbolHook];
298
- }
299
- __name(isHook, "isHook");
300
- function isTaskMiddleware(definition) {
301
- return definition && definition[symbolTaskMiddleware];
302
- }
303
- __name(isTaskMiddleware, "isTaskMiddleware");
304
- function isResourceMiddleware(definition) {
305
- return definition && definition[symbolResourceMiddleware];
306
- }
307
- __name(isResourceMiddleware, "isResourceMiddleware");
308
- function isTag(definition) {
309
- return definition && definition[symbolTag];
310
- }
311
- __name(isTag, "isTag");
312
- function isOptional(definition) {
313
- return definition && definition[symbolOptionalDependency];
314
- }
315
- __name(isOptional, "isOptional");
316
- function isError(definition) {
317
- return Boolean(definition && definition[symbolError]);
318
- }
319
- __name(isError, "isError");
320
- function isAsyncContext(definition) {
321
- return Boolean(definition && definition[symbolAsyncContext]);
322
- }
323
- __name(isAsyncContext, "isAsyncContext");
324
-
325
- // src/tools/throws.ts
326
- function invalidThrowsEntryError(owner, item) {
327
- const got = item === null ? "null" : Array.isArray(item) ? "array" : typeof item === "object" ? "object" : typeof item;
328
- return new Error(
329
- `Invalid throws entry for ${owner.kind} ${owner.id}: expected error id string or Error helper, got ${got}`
330
- );
331
- }
332
- __name(invalidThrowsEntryError, "invalidThrowsEntryError");
333
- function toErrorIdList(owner, list) {
334
- const ids = [];
335
- const seen = /* @__PURE__ */ new Set();
336
- for (const item of list) {
337
- let id2;
338
- if (typeof item === "string") {
339
- if (item.trim().length === 0) {
340
- throw invalidThrowsEntryError(owner, item);
341
- }
342
- id2 = item;
343
- } else if (isError(item)) {
344
- id2 = item.id;
345
- if (typeof id2 !== "string" || id2.trim().length === 0) {
346
- throw invalidThrowsEntryError(owner, item);
347
- }
348
- } else {
349
- throw invalidThrowsEntryError(owner, item);
350
- }
351
- if (seen.has(id2)) continue;
352
- seen.add(id2);
353
- ids.push(id2);
354
- }
355
- return ids;
356
- }
357
- __name(toErrorIdList, "toErrorIdList");
358
- function normalizeThrows(owner, throwsList) {
359
- if (throwsList === void 0) return void 0;
360
- return toErrorIdList(owner, throwsList);
361
- }
362
- __name(normalizeThrows, "normalizeThrows");
363
-
364
- // src/definers/defineTask.ts
365
- function defineTask(taskConfig) {
366
- const filePath = getCallerFile();
367
- const id2 = taskConfig.id;
368
- return {
369
- [symbolTask]: true,
370
- [symbolFilePath]: filePath,
371
- id: id2,
372
- dependencies: taskConfig.dependencies || {},
373
- middleware: taskConfig.middleware || [],
374
- run: taskConfig.run,
375
- inputSchema: taskConfig.inputSchema,
376
- resultSchema: taskConfig.resultSchema,
377
- meta: taskConfig.meta || {},
378
- tags: taskConfig.tags || [],
379
- throws: normalizeThrows({ kind: "task", id: id2 }, taskConfig.throws),
380
- // autorun,
381
- optional() {
382
- return {
383
- inner: this,
384
- [symbolOptionalDependency]: true
385
- };
386
- }
387
- };
388
- }
389
- __name(defineTask, "defineTask");
390
- defineTask.phantom = (taskConfig) => {
391
- const taskDef = defineTask({
392
- ...taskConfig,
393
- run: /* @__PURE__ */ __name(async (_input) => {
394
- return void 0;
395
- }, "run")
396
- });
397
- taskDef[symbolPhantomTask] = true;
398
- return taskDef;
399
- };
400
-
401
- // src/definers/defineHook.ts
402
- function defineHook(hookDef) {
403
- const filePath = getCallerFile();
404
- return {
405
- [symbolHook]: true,
406
- [symbolFilePath]: filePath,
407
- id: hookDef.id,
408
- dependencies: hookDef.dependencies || {},
409
- on: hookDef.on,
410
- order: hookDef.order,
411
- run: hookDef.run,
412
- meta: hookDef.meta || {},
413
- tags: hookDef.tags || []
414
- };
415
- }
416
- __name(defineHook, "defineHook");
417
-
418
52
  // src/errors.ts
419
53
  var errors_exports = {};
420
54
  __export(errors_exports, {
@@ -427,7 +61,6 @@ __export(errors_exports, {
427
61
  eventCycleError: () => eventCycleError,
428
62
  eventEmissionCycleError: () => eventEmissionCycleError,
429
63
  eventNotFoundError: () => eventNotFoundError,
430
- isCancellationError: () => isCancellationError,
431
64
  lockedError: () => lockedError,
432
65
  middlewareNotRegisteredError: () => middlewareNotRegisteredError,
433
66
  phantomTaskNotRoutedError: () => phantomTaskNotRoutedError,
@@ -441,6 +74,31 @@ __export(errors_exports, {
441
74
  validationError: () => validationError
442
75
  });
443
76
 
77
+ // src/tools/getCallerFile.ts
78
+ function isNodeInline() {
79
+ return typeof process !== "undefined" && typeof process?.versions?.node === "string";
80
+ }
81
+ __name(isNodeInline, "isNodeInline");
82
+ function getCallerFile() {
83
+ const originalPrepare = Error.prepareStackTrace;
84
+ try {
85
+ if (isNodeInline()) {
86
+ const err = new Error();
87
+ Error.prepareStackTrace = (_err, stack2) => stack2;
88
+ const stack = err.stack;
89
+ stack.shift();
90
+ stack.shift();
91
+ const candidate = stack.shift();
92
+ const file = candidate?.getFileName?.();
93
+ return file;
94
+ }
95
+ return "unknown";
96
+ } finally {
97
+ Error.prepareStackTrace = originalPrepare;
98
+ }
99
+ }
100
+ __name(getCallerFile, "getCallerFile");
101
+
444
102
  // src/definers/defineError.ts
445
103
  var isValidHttpCode = /* @__PURE__ */ __name((value) => Number.isInteger(value) && value >= 100 && value <= 599, "isValidHttpCode");
446
104
  var assertHttpCode = /* @__PURE__ */ __name((value) => {
@@ -778,20 +436,67 @@ var EdgePlatformAdapter = class extends BrowserPlatformAdapter {
778
436
  constructor() {
779
437
  super(...arguments);
780
438
  this.id = "edge";
439
+ this.alsClass = null;
440
+ this.alsProbed = false;
781
441
  }
782
442
  static {
783
443
  __name(this, "EdgePlatformAdapter");
784
444
  }
445
+ async init() {
446
+ await this.probeAsyncLocalStorage();
447
+ }
448
+ /**
449
+ * Attempt to discover AsyncLocalStorage from the runtime.
450
+ * Checks globalThis first, then tries `import("node:async_hooks")`.
451
+ */
452
+ probeGlobalAsyncLocalStorage() {
453
+ if (this.alsClass) return true;
454
+ const g = globalThis;
455
+ if (typeof g.AsyncLocalStorage === "function") {
456
+ this.alsClass = g.AsyncLocalStorage;
457
+ return true;
458
+ }
459
+ return false;
460
+ }
461
+ async probeAsyncLocalStorage() {
462
+ if (this.alsProbed) return;
463
+ if (this.probeGlobalAsyncLocalStorage()) {
464
+ this.alsProbed = true;
465
+ return;
466
+ }
467
+ try {
468
+ const mod = await import('async_hooks');
469
+ if (mod?.AsyncLocalStorage) {
470
+ this.alsClass = mod.AsyncLocalStorage;
471
+ }
472
+ } catch {
473
+ } finally {
474
+ this.alsProbed = true;
475
+ }
476
+ }
785
477
  onShutdownSignal(_handler) {
786
478
  return () => {
787
479
  };
788
480
  }
481
+ hasAsyncLocalStorage() {
482
+ this.probeGlobalAsyncLocalStorage();
483
+ return this.alsClass !== null;
484
+ }
485
+ createAsyncLocalStorage() {
486
+ this.probeGlobalAsyncLocalStorage();
487
+ if (this.alsClass) {
488
+ return new this.alsClass();
489
+ }
490
+ return super.createAsyncLocalStorage();
491
+ }
789
492
  };
790
493
 
791
494
  // src/platform/adapters/universal-generic.ts
792
495
  var GenericUniversalPlatformAdapter = class {
793
496
  constructor() {
794
497
  this.id = "universal";
498
+ this.alsClass = null;
499
+ this.alsProbed = false;
795
500
  this.setTimeout = globalThis.setTimeout;
796
501
  this.clearTimeout = globalThis.clearTimeout;
797
502
  }
@@ -800,6 +505,23 @@ var GenericUniversalPlatformAdapter = class {
800
505
  }
801
506
  async init() {
802
507
  }
508
+ probeAsyncLocalStorage() {
509
+ if (this.alsProbed) return;
510
+ this.alsProbed = true;
511
+ const g = globalThis;
512
+ if (typeof g.Deno === "undefined") return;
513
+ if (typeof g.AsyncLocalStorage === "function") {
514
+ this.alsClass = g.AsyncLocalStorage;
515
+ return;
516
+ }
517
+ try {
518
+ const mod = __require("async_hooks");
519
+ if (mod?.AsyncLocalStorage) {
520
+ this.alsClass = mod.AsyncLocalStorage;
521
+ }
522
+ } catch {
523
+ }
524
+ }
803
525
  onUncaughtException(handler) {
804
526
  const tgt = globalThis;
805
527
  if (tgt.addEventListener) {
@@ -854,9 +576,14 @@ var GenericUniversalPlatformAdapter = class {
854
576
  return void 0;
855
577
  }
856
578
  hasAsyncLocalStorage() {
857
- return false;
579
+ this.probeAsyncLocalStorage();
580
+ return this.alsClass !== null;
858
581
  }
859
582
  createAsyncLocalStorage() {
583
+ this.probeAsyncLocalStorage();
584
+ if (this.alsClass) {
585
+ return new this.alsClass();
586
+ }
860
587
  return {
861
588
  getStore: /* @__PURE__ */ __name(() => {
862
589
  platformUnsupportedFunctionError.throw({
@@ -914,6 +641,10 @@ var UniversalPlatformAdapter = class {
914
641
  if (this.inner) return;
915
642
  const kind = detectEnvironment();
916
643
  const global = globalThis;
644
+ if (typeof global.Deno !== "undefined") {
645
+ this.inner = new GenericUniversalPlatformAdapter();
646
+ return;
647
+ }
917
648
  if (typeof global.document !== "undefined" || typeof global.addEventListener === "function") {
918
649
  this.inner = new BrowserPlatformAdapter();
919
650
  } else {
@@ -1175,10 +906,202 @@ var builderIncompleteError = error("runner.errors.builderIncomplete").format(({
1175
906
  }).remediation(
1176
907
  ({ missingFields }) => `Add the missing builder steps: ${missingFields.map((f) => `.${f}()`).join(", ")} before calling .build().`
1177
908
  ).build();
1178
- function isCancellationError(err) {
1179
- return cancellationError.is(err);
909
+
910
+ // src/defs.ts
911
+ var defs_exports = {};
912
+ __export(defs_exports, {
913
+ CONTRACT: () => CONTRACT,
914
+ HookDependencyState: () => HookDependencyState,
915
+ RunnerMode: () => RunnerMode,
916
+ isOneOf: () => isOneOf,
917
+ onAnyOf: () => onAnyOf,
918
+ symbolAsyncContext: () => symbolAsyncContext,
919
+ symbolError: () => symbolError,
920
+ symbolEvent: () => symbolEvent,
921
+ symbolFilePath: () => symbolFilePath,
922
+ symbolForkedFrom: () => symbolForkedFrom,
923
+ symbolHook: () => symbolHook,
924
+ symbolMiddleware: () => symbolMiddleware,
925
+ symbolMiddlewareConfigured: () => symbolMiddlewareConfigured,
926
+ symbolOptionalDependency: () => symbolOptionalDependency,
927
+ symbolPhantomTask: () => symbolPhantomTask,
928
+ symbolResource: () => symbolResource,
929
+ symbolResourceMiddleware: () => symbolResourceMiddleware,
930
+ symbolResourceWithConfig: () => symbolResourceWithConfig,
931
+ symbolTag: () => symbolTag,
932
+ symbolTagConfigured: () => symbolTagConfigured,
933
+ symbolTask: () => symbolTask,
934
+ symbolTaskMiddleware: () => symbolTaskMiddleware,
935
+ symbolTunneledBy: () => symbolTunneledBy
936
+ });
937
+
938
+ // src/types/event.ts
939
+ function onAnyOf(...defs) {
940
+ return defs;
941
+ }
942
+ __name(onAnyOf, "onAnyOf");
943
+ function isOneOf(emission, defs) {
944
+ return defs.some((d) => d.id === emission.id);
945
+ }
946
+ __name(isOneOf, "isOneOf");
947
+
948
+ // src/types/runner.ts
949
+ var RunnerMode = /* @__PURE__ */ ((RunnerMode2) => {
950
+ RunnerMode2["TEST"] = "test";
951
+ RunnerMode2["DEV"] = "dev";
952
+ RunnerMode2["PROD"] = "prod";
953
+ return RunnerMode2;
954
+ })(RunnerMode || {});
955
+
956
+ // src/types/contracts.ts
957
+ var CONTRACT = Symbol.for("runner.contract");
958
+
959
+ // src/types/storeTypes.ts
960
+ var HookDependencyState = /* @__PURE__ */ ((HookDependencyState2) => {
961
+ HookDependencyState2["Pending"] = "pending";
962
+ HookDependencyState2["Computing"] = "computing";
963
+ HookDependencyState2["Ready"] = "ready";
964
+ return HookDependencyState2;
965
+ })(HookDependencyState || {});
966
+
967
+ // src/definers/tools.ts
968
+ function isTask(definition) {
969
+ return definition && definition[symbolTask];
970
+ }
971
+ __name(isTask, "isTask");
972
+ function isResource(definition) {
973
+ return definition && definition[symbolResource];
974
+ }
975
+ __name(isResource, "isResource");
976
+ function isResourceWithConfig(definition) {
977
+ return definition && definition[symbolResourceWithConfig];
978
+ }
979
+ __name(isResourceWithConfig, "isResourceWithConfig");
980
+ function isEvent(definition) {
981
+ return definition && definition[symbolEvent];
982
+ }
983
+ __name(isEvent, "isEvent");
984
+ function isHook(definition) {
985
+ return definition && definition[symbolHook];
986
+ }
987
+ __name(isHook, "isHook");
988
+ function isTaskMiddleware(definition) {
989
+ return definition && definition[symbolTaskMiddleware];
990
+ }
991
+ __name(isTaskMiddleware, "isTaskMiddleware");
992
+ function isResourceMiddleware(definition) {
993
+ return definition && definition[symbolResourceMiddleware];
994
+ }
995
+ __name(isResourceMiddleware, "isResourceMiddleware");
996
+ function isTag(definition) {
997
+ return definition && definition[symbolTag];
998
+ }
999
+ __name(isTag, "isTag");
1000
+ function isOptional(definition) {
1001
+ return definition && definition[symbolOptionalDependency];
1002
+ }
1003
+ __name(isOptional, "isOptional");
1004
+ function isError(definition) {
1005
+ return Boolean(definition && definition[symbolError]);
1006
+ }
1007
+ __name(isError, "isError");
1008
+ function isAsyncContext(definition) {
1009
+ return Boolean(definition && definition[symbolAsyncContext]);
1010
+ }
1011
+ __name(isAsyncContext, "isAsyncContext");
1012
+
1013
+ // src/tools/throws.ts
1014
+ function invalidThrowsEntryError(owner, item) {
1015
+ const got = item === null ? "null" : Array.isArray(item) ? "array" : typeof item === "object" ? "object" : typeof item;
1016
+ return new Error(
1017
+ `Invalid throws entry for ${owner.kind} ${owner.id}: expected error id string or Error helper, got ${got}`
1018
+ );
1019
+ }
1020
+ __name(invalidThrowsEntryError, "invalidThrowsEntryError");
1021
+ function toErrorIdList(owner, list) {
1022
+ const ids = [];
1023
+ const seen = /* @__PURE__ */ new Set();
1024
+ for (const item of list) {
1025
+ let id2;
1026
+ if (typeof item === "string") {
1027
+ if (item.trim().length === 0) {
1028
+ throw invalidThrowsEntryError(owner, item);
1029
+ }
1030
+ id2 = item;
1031
+ } else if (isError(item)) {
1032
+ id2 = item.id;
1033
+ if (typeof id2 !== "string" || id2.trim().length === 0) {
1034
+ throw invalidThrowsEntryError(owner, item);
1035
+ }
1036
+ } else {
1037
+ throw invalidThrowsEntryError(owner, item);
1038
+ }
1039
+ if (seen.has(id2)) continue;
1040
+ seen.add(id2);
1041
+ ids.push(id2);
1042
+ }
1043
+ return ids;
1044
+ }
1045
+ __name(toErrorIdList, "toErrorIdList");
1046
+ function normalizeThrows(owner, throwsList) {
1047
+ if (throwsList === void 0) return void 0;
1048
+ return toErrorIdList(owner, throwsList);
1049
+ }
1050
+ __name(normalizeThrows, "normalizeThrows");
1051
+
1052
+ // src/definers/defineTask.ts
1053
+ function defineTask(taskConfig) {
1054
+ const filePath = getCallerFile();
1055
+ const id2 = taskConfig.id;
1056
+ return {
1057
+ [symbolTask]: true,
1058
+ [symbolFilePath]: filePath,
1059
+ id: id2,
1060
+ dependencies: taskConfig.dependencies || {},
1061
+ middleware: taskConfig.middleware || [],
1062
+ run: taskConfig.run,
1063
+ inputSchema: taskConfig.inputSchema,
1064
+ resultSchema: taskConfig.resultSchema,
1065
+ meta: taskConfig.meta || {},
1066
+ tags: taskConfig.tags || [],
1067
+ throws: normalizeThrows({ kind: "task", id: id2 }, taskConfig.throws),
1068
+ // autorun,
1069
+ optional() {
1070
+ return {
1071
+ inner: this,
1072
+ [symbolOptionalDependency]: true
1073
+ };
1074
+ }
1075
+ };
1076
+ }
1077
+ __name(defineTask, "defineTask");
1078
+ defineTask.phantom = (taskConfig) => {
1079
+ const taskDef = defineTask({
1080
+ ...taskConfig,
1081
+ run: /* @__PURE__ */ __name(async (_input) => {
1082
+ phantomTaskNotRoutedError.throw({ taskId: taskConfig.id });
1083
+ }, "run")
1084
+ });
1085
+ taskDef[symbolPhantomTask] = true;
1086
+ return taskDef;
1087
+ };
1088
+
1089
+ // src/definers/defineHook.ts
1090
+ function defineHook(hookDef) {
1091
+ const filePath = getCallerFile();
1092
+ return {
1093
+ [symbolHook]: true,
1094
+ [symbolFilePath]: filePath,
1095
+ id: hookDef.id,
1096
+ dependencies: hookDef.dependencies || {},
1097
+ on: hookDef.on,
1098
+ order: hookDef.order,
1099
+ run: hookDef.run,
1100
+ meta: hookDef.meta || {},
1101
+ tags: hookDef.tags || []
1102
+ };
1180
1103
  }
1181
- __name(isCancellationError, "isCancellationError");
1104
+ __name(defineHook, "defineHook");
1182
1105
 
1183
1106
  // src/definers/resourceFork.ts
1184
1107
  function resolveReId(forkId, options) {
@@ -2186,8 +2109,124 @@ var builtInTypes = [
2186
2109
  ...binaryBuiltInTypes
2187
2110
  ];
2188
2111
 
2112
+ // src/serializer/regexp-validator.ts
2113
+ var isQuantifierAt = /* @__PURE__ */ __name((pattern, index) => {
2114
+ if (index >= pattern.length) {
2115
+ return false;
2116
+ }
2117
+ const char = pattern[index];
2118
+ if (char === "*" || char === "+" || char === "?") {
2119
+ return true;
2120
+ }
2121
+ if (char === "{") {
2122
+ return isBoundedQuantifier(pattern, index);
2123
+ }
2124
+ return false;
2125
+ }, "isQuantifierAt");
2126
+ var isQuantifierChar = /* @__PURE__ */ __name((char, pattern, index) => {
2127
+ if (char === "*" || char === "+") {
2128
+ return true;
2129
+ }
2130
+ if (char === "?") {
2131
+ if (index > 0 && pattern[index - 1] === "(") {
2132
+ return false;
2133
+ }
2134
+ return true;
2135
+ }
2136
+ if (char === "{") {
2137
+ return isBoundedQuantifier(pattern, index);
2138
+ }
2139
+ return false;
2140
+ }, "isQuantifierChar");
2141
+ var isBoundedQuantifier = /* @__PURE__ */ __name((pattern, index) => {
2142
+ let sawDigit = false;
2143
+ let sawComma = false;
2144
+ for (let i = index + 1; i < pattern.length; i += 1) {
2145
+ const char = pattern[i];
2146
+ if (char >= "0" && char <= "9") {
2147
+ sawDigit = true;
2148
+ continue;
2149
+ }
2150
+ if (char === "," && !sawComma) {
2151
+ sawComma = true;
2152
+ continue;
2153
+ }
2154
+ if (char === "}") {
2155
+ return sawDigit;
2156
+ }
2157
+ return false;
2158
+ }
2159
+ return false;
2160
+ }, "isBoundedQuantifier");
2161
+ var isRegExpPatternSafe = /* @__PURE__ */ __name((pattern) => {
2162
+ const groupStack = [];
2163
+ let escaped = false;
2164
+ let inCharClass = false;
2165
+ for (let index = 0; index < pattern.length; index += 1) {
2166
+ const char = pattern[index];
2167
+ if (escaped) {
2168
+ escaped = false;
2169
+ continue;
2170
+ }
2171
+ if (char === "\\") {
2172
+ escaped = true;
2173
+ continue;
2174
+ }
2175
+ if (inCharClass) {
2176
+ if (char === "]") {
2177
+ inCharClass = false;
2178
+ }
2179
+ continue;
2180
+ }
2181
+ if (char === "[") {
2182
+ inCharClass = true;
2183
+ continue;
2184
+ }
2185
+ if (char === "(") {
2186
+ groupStack.push({ hasQuantifier: false });
2187
+ if (pattern[index + 1] === "?") {
2188
+ index += 1;
2189
+ }
2190
+ continue;
2191
+ }
2192
+ if (char === ")") {
2193
+ const group = groupStack.pop();
2194
+ if (group?.hasQuantifier && isQuantifierAt(pattern, index + 1)) {
2195
+ return false;
2196
+ }
2197
+ if (group?.hasQuantifier && groupStack.length > 0) {
2198
+ groupStack[groupStack.length - 1].hasQuantifier = true;
2199
+ }
2200
+ continue;
2201
+ }
2202
+ if (isQuantifierChar(char, pattern, index)) {
2203
+ if (groupStack.length > 0) {
2204
+ groupStack[groupStack.length - 1].hasQuantifier = true;
2205
+ }
2206
+ }
2207
+ }
2208
+ return true;
2209
+ }, "isRegExpPatternSafe");
2210
+ var assertRegExpPayload = /* @__PURE__ */ __name((value, options) => {
2211
+ if (!value || typeof value !== "object") {
2212
+ throw new Error("Invalid RegExp payload");
2213
+ }
2214
+ const record = value;
2215
+ if (typeof record.pattern !== "string" || typeof record.flags !== "string") {
2216
+ throw new Error("Invalid RegExp payload");
2217
+ }
2218
+ if (record.pattern.length > options.maxPatternLength) {
2219
+ throw new Error(
2220
+ `RegExp pattern exceeds limit (${options.maxPatternLength})`
2221
+ );
2222
+ }
2223
+ if (!options.allowUnsafe && !isRegExpPatternSafe(record.pattern)) {
2224
+ throw new Error("Unsafe RegExp pattern");
2225
+ }
2226
+ return { pattern: record.pattern, flags: record.flags };
2227
+ }, "assertRegExpPayload");
2228
+
2189
2229
  // src/serializer/type-registry.ts
2190
- init_regexp_validator();
2191
2230
  var TypeRegistry = class {
2192
2231
  constructor(options) {
2193
2232
  this.typeRegistry = /* @__PURE__ */ new Map();
@@ -2946,29 +2985,25 @@ var Serializer = class {
2946
2985
  * @internal - Exposed for testing RegExp safety validation
2947
2986
  */
2948
2987
  this.isRegExpPatternSafe = /* @__PURE__ */ __name((pattern) => {
2949
- const { isRegExpPatternSafe: check } = (init_regexp_validator(), __toCommonJS(regexp_validator_exports));
2950
- return check(pattern);
2988
+ return isRegExpPatternSafe(pattern);
2951
2989
  }, "isRegExpPatternSafe");
2952
2990
  /**
2953
2991
  * @internal - Exposed for testing quantifier detection
2954
2992
  */
2955
2993
  this.isQuantifierAt = /* @__PURE__ */ __name((pattern, index) => {
2956
- const { isQuantifierAt: check } = (init_regexp_validator(), __toCommonJS(regexp_validator_exports));
2957
- return check(pattern, index);
2994
+ return isQuantifierAt(pattern, index);
2958
2995
  }, "isQuantifierAt");
2959
2996
  /**
2960
2997
  * @internal - Exposed for testing quantifier character detection
2961
2998
  */
2962
2999
  this.isQuantifierChar = /* @__PURE__ */ __name((char, pattern, index) => {
2963
- const { isQuantifierChar: check } = (init_regexp_validator(), __toCommonJS(regexp_validator_exports));
2964
- return check(char, pattern, index);
3000
+ return isQuantifierChar(char, pattern, index);
2965
3001
  }, "isQuantifierChar");
2966
3002
  /**
2967
3003
  * @internal - Exposed for testing bounded quantifier detection
2968
3004
  */
2969
3005
  this.isBoundedQuantifier = /* @__PURE__ */ __name((pattern, index) => {
2970
- const { isBoundedQuantifier: check } = (init_regexp_validator(), __toCommonJS(regexp_validator_exports));
2971
- return check(pattern, index);
3006
+ return isBoundedQuantifier(pattern, index);
2972
3007
  }, "isBoundedQuantifier");
2973
3008
  this.indent = options.pretty ? 2 : void 0;
2974
3009
  this.maxDepth = normalizeMaxDepth(options.maxDepth, DEFAULT_MAX_DEPTH);
@@ -4882,7 +4917,7 @@ function createExposureFetch(cfg) {
4882
4917
  }
4883
4918
  __name(createExposureFetch, "createExposureFetch");
4884
4919
 
4885
- // src/tunnels/buildUniversalManifest.ts
4920
+ // src/tools/buildUniversalManifest.ts
4886
4921
  function buildUniversalManifest(input) {
4887
4922
  const nodeFiles = [];
4888
4923
  const webFiles = [];
@@ -4939,6 +4974,15 @@ function toHeaders(auth) {
4939
4974
  return headers;
4940
4975
  }
4941
4976
  __name(toHeaders, "toHeaders");
4977
+ function rethrowWithRegistry(e, errorRegistry) {
4978
+ const te = e;
4979
+ if (errorRegistry && te.id && te.data) {
4980
+ const helper = errorRegistry.get(String(te.id));
4981
+ if (helper) helper.throw(te.data);
4982
+ }
4983
+ throw e;
4984
+ }
4985
+ __name(rethrowWithRegistry, "rethrowWithRegistry");
4942
4986
  function createHttpClient(cfg) {
4943
4987
  const baseUrl = cfg.baseUrl.replace(/\/$/, "");
4944
4988
  if (!baseUrl) throw new Error("createHttpClient requires baseUrl");
@@ -5005,12 +5049,7 @@ function createHttpClient(cfg) {
5005
5049
  fallbackMessage: "Tunnel task error"
5006
5050
  });
5007
5051
  } catch (e) {
5008
- const te = e;
5009
- if (cfg.errorRegistry && te.id && te.data) {
5010
- const helper = cfg.errorRegistry.get(String(te.id));
5011
- if (helper) helper.throw(te.data);
5012
- }
5013
- throw e;
5052
+ rethrowWithRegistry(e, cfg.errorRegistry);
5014
5053
  }
5015
5054
  }
5016
5055
  if (manifest.nodeFiles.length > 0) {
@@ -5021,24 +5060,14 @@ function createHttpClient(cfg) {
5021
5060
  try {
5022
5061
  return await fetchClient.task(id2, input);
5023
5062
  } catch (e) {
5024
- const te = e;
5025
- if (cfg.errorRegistry && te.id && te.data) {
5026
- const helper = cfg.errorRegistry.get(String(te.id));
5027
- if (helper) helper.throw(te.data);
5028
- }
5029
- throw e;
5063
+ rethrowWithRegistry(e, cfg.errorRegistry);
5030
5064
  }
5031
5065
  },
5032
5066
  async event(id2, payload) {
5033
5067
  try {
5034
5068
  return await fetchClient.event(id2, payload);
5035
5069
  } catch (e) {
5036
- const te = e;
5037
- if (cfg.errorRegistry && te.id && te.data) {
5038
- const helper = cfg.errorRegistry.get(String(te.id));
5039
- if (helper) helper.throw(te.data);
5040
- }
5041
- throw e;
5070
+ rethrowWithRegistry(e, cfg.errorRegistry);
5042
5071
  }
5043
5072
  },
5044
5073
  async eventWithResult(id2, payload) {
@@ -5050,12 +5079,7 @@ function createHttpClient(cfg) {
5050
5079
  }
5051
5080
  return await fetchClient.eventWithResult(id2, payload);
5052
5081
  } catch (e) {
5053
- const te = e;
5054
- if (cfg.errorRegistry && te.id && te.data) {
5055
- const helper = cfg.errorRegistry.get(String(te.id));
5056
- if (helper) helper.throw(te.data);
5057
- }
5058
- throw e;
5082
+ rethrowWithRegistry(e, cfg.errorRegistry);
5059
5083
  }
5060
5084
  }
5061
5085
  };
@@ -5989,6 +6013,34 @@ var Logger = class _Logger {
5989
6013
  }
5990
6014
  };
5991
6015
 
6016
+ // src/models/utils/dependencyStrategies.ts
6017
+ var dependencyStrategies = [
6018
+ {
6019
+ matches: isResource,
6020
+ getStoreMap: /* @__PURE__ */ __name((store2) => store2.resources, "getStoreMap")
6021
+ },
6022
+ {
6023
+ matches: isTask,
6024
+ getStoreMap: /* @__PURE__ */ __name((store2) => store2.tasks, "getStoreMap")
6025
+ },
6026
+ {
6027
+ matches: isEvent,
6028
+ getStoreMap: /* @__PURE__ */ __name((store2) => store2.events, "getStoreMap")
6029
+ },
6030
+ {
6031
+ matches: isError,
6032
+ getStoreMap: /* @__PURE__ */ __name((store2) => store2.errors, "getStoreMap")
6033
+ },
6034
+ {
6035
+ matches: isAsyncContext,
6036
+ getStoreMap: /* @__PURE__ */ __name((store2) => store2.asyncContexts, "getStoreMap")
6037
+ }
6038
+ ];
6039
+ function findDependencyStrategy(item) {
6040
+ return dependencyStrategies.find((s) => s.matches(item));
6041
+ }
6042
+ __name(findDependencyStrategy, "findDependencyStrategy");
6043
+
5992
6044
  // src/models/DependencyProcessor.ts
5993
6045
  var DependencyProcessor = class {
5994
6046
  constructor(store2, eventManager, taskRunner, logger) {
@@ -6096,7 +6148,16 @@ var DependencyProcessor = class {
6096
6148
  }
6097
6149
  throw error2;
6098
6150
  }
6099
- throw new Error(`${prefix}: ${String(error2)}`);
6151
+ const wrapper = new Error(`${prefix}: ${String(error2)}`);
6152
+ Object.defineProperty(wrapper, "resourceId", {
6153
+ value: resourceId,
6154
+ configurable: true
6155
+ });
6156
+ Object.defineProperty(wrapper, "cause", {
6157
+ value: error2,
6158
+ configurable: true
6159
+ });
6160
+ throw wrapper;
6100
6161
  }
6101
6162
  /**
6102
6163
  * Computes and caches dependencies for a resource (if not already computed).
@@ -6239,46 +6300,35 @@ var DependencyProcessor = class {
6239
6300
  return object;
6240
6301
  }
6241
6302
  async extractDependency(object, source) {
6242
- this.logger.trace(`Extracting dependency -> ${source} -> ${object?.id}`);
6303
+ this.logger.trace(
6304
+ `Extracting dependency -> ${source} -> ${object?.id}`
6305
+ );
6306
+ let isOpt = false;
6307
+ let item = object;
6243
6308
  if (isOptional(object)) {
6244
- const inner = object.inner;
6245
- if (isResource(inner)) {
6246
- const exists = this.store.resources.get(inner.id) !== void 0;
6247
- return exists ? this.extractResourceDependency(inner) : void 0;
6248
- } else if (isTask(inner)) {
6249
- const exists = this.store.tasks.get(inner.id) !== void 0;
6250
- return exists ? this.extractTaskDependency(inner) : void 0;
6251
- } else if (isEvent(inner)) {
6252
- const exists = this.store.events.get(inner.id) !== void 0;
6253
- return exists ? this.extractEventDependency(inner, source) : void 0;
6254
- } else if (isError(inner)) {
6255
- const exists = this.store.errors.get(inner.id) !== void 0;
6256
- return exists ? inner : void 0;
6257
- } else if (isAsyncContext(inner)) {
6258
- const exists = this.store.asyncContexts.get(inner.id) !== void 0;
6259
- return exists ? inner : void 0;
6260
- }
6261
- unknownItemTypeError.throw({ item: inner });
6262
- }
6263
- if (isResource(object)) {
6264
- return this.extractResourceDependency(object);
6265
- } else if (isTask(object)) {
6266
- return this.extractTaskDependency(object);
6267
- } else if (isEvent(object)) {
6268
- return this.extractEventDependency(object, source);
6269
- } else if (isError(object)) {
6270
- if (this.store.errors.get(object.id) === void 0) {
6271
- dependencyNotFoundError.throw({ key: `Error ${object.id}` });
6272
- }
6273
- return object;
6274
- } else if (isAsyncContext(object)) {
6275
- if (this.store.asyncContexts.get(object.id) === void 0) {
6276
- dependencyNotFoundError.throw({ key: `AsyncContext ${object.id}` });
6277
- }
6278
- return object;
6279
- } else {
6280
- unknownItemTypeError.throw({ item: object });
6309
+ isOpt = true;
6310
+ item = object.inner;
6311
+ }
6312
+ const itemWithId = item;
6313
+ const strategy = findDependencyStrategy(item);
6314
+ if (!strategy) {
6315
+ return unknownItemTypeError.throw({ item });
6316
+ }
6317
+ if (isOpt) {
6318
+ const exists = strategy.getStoreMap(this.store).has(itemWithId.id);
6319
+ if (!exists) return void 0;
6281
6320
  }
6321
+ if (isResource(item)) return this.extractResourceDependency(item);
6322
+ if (isTask(item)) return this.extractTaskDependency(item);
6323
+ if (isEvent(item)) return this.extractEventDependency(item, source);
6324
+ if (!isOpt) {
6325
+ const exists = strategy.getStoreMap(this.store).has(itemWithId.id);
6326
+ if (!exists) {
6327
+ const label = isError(item) ? "Error" : "AsyncContext";
6328
+ dependencyNotFoundError.throw({ key: `${label} ${itemWithId.id}` });
6329
+ }
6330
+ }
6331
+ return item;
6282
6332
  }
6283
6333
  /**
6284
6334
  * Converts the event into a running functions with real inputs
@@ -6475,19 +6525,246 @@ var StoreValidator = class {
6475
6525
  }
6476
6526
  };
6477
6527
 
6528
+ // src/models/utils/buildDependencyGraph.ts
6529
+ function setupBlankNodes(registry, nodeMap, dependents) {
6530
+ for (const task2 of registry.tasks.values()) {
6531
+ const node = {
6532
+ id: task2.task.id,
6533
+ dependencies: {}
6534
+ };
6535
+ nodeMap.set(task2.task.id, node);
6536
+ dependents.push(node);
6537
+ }
6538
+ for (const middleware of registry.taskMiddlewares.values()) {
6539
+ const node = {
6540
+ id: middleware.middleware.id,
6541
+ dependencies: {}
6542
+ };
6543
+ nodeMap.set(middleware.middleware.id, node);
6544
+ dependents.push(node);
6545
+ }
6546
+ for (const middleware of registry.resourceMiddlewares.values()) {
6547
+ const node = {
6548
+ id: middleware.middleware.id,
6549
+ dependencies: {}
6550
+ };
6551
+ nodeMap.set(middleware.middleware.id, node);
6552
+ dependents.push(node);
6553
+ }
6554
+ for (const resource2 of registry.resources.values()) {
6555
+ const node = {
6556
+ id: resource2.resource.id,
6557
+ dependencies: {}
6558
+ };
6559
+ nodeMap.set(resource2.resource.id, node);
6560
+ dependents.push(node);
6561
+ }
6562
+ for (const hook2 of registry.hooks.values()) {
6563
+ const node = {
6564
+ id: hook2.hook.id,
6565
+ dependencies: {}
6566
+ };
6567
+ nodeMap.set(hook2.hook.id, node);
6568
+ dependents.push(node);
6569
+ }
6570
+ }
6571
+ __name(setupBlankNodes, "setupBlankNodes");
6572
+ function buildDependencyGraph(registry) {
6573
+ const depenedants = [];
6574
+ const nodeMap = /* @__PURE__ */ new Map();
6575
+ setupBlankNodes(registry, nodeMap, depenedants);
6576
+ for (const task2 of registry.tasks.values()) {
6577
+ const node = nodeMap.get(task2.task.id);
6578
+ if (task2.task.dependencies) {
6579
+ for (const [depKey, depItem] of Object.entries(task2.task.dependencies)) {
6580
+ const candidate = isOptional(depItem) ? depItem.inner : depItem;
6581
+ const depNode = nodeMap.get(candidate.id);
6582
+ if (depNode) {
6583
+ node.dependencies[depKey] = depNode;
6584
+ }
6585
+ }
6586
+ }
6587
+ const t = task2.task;
6588
+ for (const middleware of t.middleware) {
6589
+ const middlewareNode = nodeMap.get(middleware.id);
6590
+ if (middlewareNode) {
6591
+ node.dependencies[middleware.id] = middlewareNode;
6592
+ }
6593
+ }
6594
+ }
6595
+ for (const storeTaskMiddleware of registry.taskMiddlewares.values()) {
6596
+ const node = nodeMap.get(storeTaskMiddleware.middleware.id);
6597
+ const { middleware } = storeTaskMiddleware;
6598
+ if (middleware.dependencies) {
6599
+ for (const [depKey, depItem] of Object.entries(middleware.dependencies)) {
6600
+ const candidate = isOptional(depItem) ? depItem.inner : depItem;
6601
+ const depNode = nodeMap.get(candidate.id);
6602
+ if (depNode) {
6603
+ node.dependencies[depKey] = depNode;
6604
+ }
6605
+ }
6606
+ }
6607
+ if (middleware.everywhere) {
6608
+ const filter = typeof middleware.everywhere === "function" ? middleware.everywhere : () => true;
6609
+ for (const task2 of registry.tasks.values()) {
6610
+ if (filter(task2.task)) {
6611
+ const taskNode = nodeMap.get(task2.task.id);
6612
+ taskNode.dependencies[`__middleware.${middleware.id}`] = node;
6613
+ }
6614
+ }
6615
+ }
6616
+ }
6617
+ for (const storeResourceMiddleware of registry.resourceMiddlewares.values()) {
6618
+ const node = nodeMap.get(storeResourceMiddleware.middleware.id);
6619
+ const { middleware } = storeResourceMiddleware;
6620
+ if (middleware.dependencies) {
6621
+ for (const [depKey, depItem] of Object.entries(middleware.dependencies)) {
6622
+ const candidate = isOptional(depItem) ? depItem.inner : depItem;
6623
+ const depNode = nodeMap.get(candidate.id);
6624
+ if (depNode) {
6625
+ node.dependencies[depKey] = depNode;
6626
+ }
6627
+ }
6628
+ }
6629
+ if (middleware.everywhere) {
6630
+ const filter = typeof middleware.everywhere === "function" ? middleware.everywhere : () => true;
6631
+ for (const resource2 of registry.resources.values()) {
6632
+ if (filter(resource2.resource)) {
6633
+ const resourceNode = nodeMap.get(resource2.resource.id);
6634
+ resourceNode.dependencies[`__middleware.${middleware.id}`] = node;
6635
+ }
6636
+ }
6637
+ }
6638
+ }
6639
+ for (const resource2 of registry.resources.values()) {
6640
+ const node = nodeMap.get(resource2.resource.id);
6641
+ if (resource2.resource.dependencies) {
6642
+ for (const [depKey, depItem] of Object.entries(
6643
+ resource2.resource.dependencies
6644
+ )) {
6645
+ const candidate = isOptional(depItem) ? depItem.inner : depItem;
6646
+ const depNode = nodeMap.get(candidate.id);
6647
+ if (depNode) {
6648
+ node.dependencies[depKey] = depNode;
6649
+ }
6650
+ }
6651
+ }
6652
+ for (const middleware of resource2.resource.middleware) {
6653
+ const middlewareNode = nodeMap.get(middleware.id);
6654
+ if (middlewareNode) {
6655
+ node.dependencies[middleware.id] = middlewareNode;
6656
+ }
6657
+ }
6658
+ }
6659
+ for (const hook2 of registry.hooks.values()) {
6660
+ const node = nodeMap.get(hook2.hook.id);
6661
+ if (hook2.hook.dependencies) {
6662
+ for (const [depKey, depItem] of Object.entries(hook2.hook.dependencies)) {
6663
+ const candidate = isOptional(depItem) ? depItem.inner : depItem;
6664
+ const depNode = nodeMap.get(candidate.id);
6665
+ if (depNode) {
6666
+ node.dependencies[depKey] = depNode;
6667
+ }
6668
+ }
6669
+ }
6670
+ }
6671
+ return depenedants;
6672
+ }
6673
+ __name(buildDependencyGraph, "buildDependencyGraph");
6674
+ function buildEventEmissionGraph(registry) {
6675
+ const nodes = /* @__PURE__ */ new Map();
6676
+ for (const e of registry.events.values()) {
6677
+ nodes.set(e.event.id, { id: e.event.id, dependencies: {} });
6678
+ }
6679
+ for (const h of registry.hooks.values()) {
6680
+ const listened = [];
6681
+ const on = h.hook.on;
6682
+ if (on === "*") continue;
6683
+ if (Array.isArray(on))
6684
+ listened.push(...on.map((e) => e.id));
6685
+ else listened.push(on.id);
6686
+ const depEvents = [];
6687
+ const deps = h.hook.dependencies;
6688
+ if (deps) {
6689
+ for (const value of Object.values(deps)) {
6690
+ const candidate = isOptional(value) ? value.inner : value;
6691
+ if (candidate && isEvent(candidate)) {
6692
+ depEvents.push(candidate.id);
6693
+ }
6694
+ }
6695
+ }
6696
+ for (const srcId of listened) {
6697
+ const srcNode = nodes.get(srcId);
6698
+ if (!srcNode) continue;
6699
+ for (const dstId of depEvents) {
6700
+ if (srcId === dstId) continue;
6701
+ const dstNode = nodes.get(dstId);
6702
+ if (dstNode) {
6703
+ srcNode.dependencies[dstId] = dstNode;
6704
+ }
6705
+ }
6706
+ }
6707
+ }
6708
+ return Array.from(nodes.values());
6709
+ }
6710
+ __name(buildEventEmissionGraph, "buildEventEmissionGraph");
6711
+
6712
+ // src/tools/LockableMap.ts
6713
+ var LockableMap = class extends Map {
6714
+ static {
6715
+ __name(this, "LockableMap");
6716
+ }
6717
+ #locked = false;
6718
+ #name;
6719
+ constructor(name) {
6720
+ super();
6721
+ this.#name = name ?? "LockableMap";
6722
+ }
6723
+ /** Whether the map is currently locked. */
6724
+ get locked() {
6725
+ return this.#locked;
6726
+ }
6727
+ /** Permanently lock the map — no further mutations allowed. */
6728
+ lock() {
6729
+ this.#locked = true;
6730
+ }
6731
+ /** @throws if the map is locked */
6732
+ throwIfLocked() {
6733
+ if (this.#locked) {
6734
+ throw new Error(`Cannot modify "${this.#name}" \u2014 the map is locked.`);
6735
+ }
6736
+ }
6737
+ set(key, value) {
6738
+ this.throwIfLocked();
6739
+ return super.set(key, value);
6740
+ }
6741
+ delete(key) {
6742
+ this.throwIfLocked();
6743
+ return super.delete(key);
6744
+ }
6745
+ clear() {
6746
+ this.throwIfLocked();
6747
+ super.clear();
6748
+ }
6749
+ };
6750
+
6478
6751
  // src/models/StoreRegistry.ts
6479
6752
  var StoreRegistry = class {
6480
6753
  constructor(store2) {
6481
6754
  this.store = store2;
6482
- this.tasks = /* @__PURE__ */ new Map();
6483
- this.resources = /* @__PURE__ */ new Map();
6484
- this.events = /* @__PURE__ */ new Map();
6485
- this.taskMiddlewares = /* @__PURE__ */ new Map();
6486
- this.resourceMiddlewares = /* @__PURE__ */ new Map();
6487
- this.hooks = /* @__PURE__ */ new Map();
6488
- this.tags = /* @__PURE__ */ new Map();
6489
- this.asyncContexts = /* @__PURE__ */ new Map();
6490
- this.errors = /* @__PURE__ */ new Map();
6755
+ this.tasks = new LockableMap("tasks");
6756
+ this.resources = new LockableMap(
6757
+ "resources"
6758
+ );
6759
+ this.events = new LockableMap("events");
6760
+ this.taskMiddlewares = new LockableMap("taskMiddlewares");
6761
+ this.resourceMiddlewares = new LockableMap("resourceMiddlewares");
6762
+ this.hooks = new LockableMap("hooks");
6763
+ this.tags = new LockableMap("tags");
6764
+ this.asyncContexts = new LockableMap(
6765
+ "asyncContexts"
6766
+ );
6767
+ this.errors = new LockableMap("errors");
6491
6768
  this.validator = new StoreValidator(this);
6492
6769
  }
6493
6770
  static {
@@ -6496,6 +6773,18 @@ var StoreRegistry = class {
6496
6773
  getValidator() {
6497
6774
  return this.validator;
6498
6775
  }
6776
+ /** Lock every map in the registry, preventing further mutations. */
6777
+ lockAll() {
6778
+ this.tasks.lock();
6779
+ this.resources.lock();
6780
+ this.events.lock();
6781
+ this.taskMiddlewares.lock();
6782
+ this.resourceMiddlewares.lock();
6783
+ this.hooks.lock();
6784
+ this.tags.lock();
6785
+ this.asyncContexts.lock();
6786
+ this.errors.lock();
6787
+ }
6499
6788
  storeGenericItem(item) {
6500
6789
  if (isTask(item)) {
6501
6790
  this.storeTask(item);
@@ -6632,195 +6921,14 @@ var StoreRegistry = class {
6632
6921
  }
6633
6922
  // Feels like a dependencyProcessor task?
6634
6923
  getDependentNodes() {
6635
- const depenedants = [];
6636
- const nodeMap = /* @__PURE__ */ new Map();
6637
- this.setupBlankNodes(nodeMap, depenedants);
6638
- for (const task2 of this.tasks.values()) {
6639
- const node = nodeMap.get(task2.task.id);
6640
- if (task2.task.dependencies) {
6641
- for (const [depKey, depItem] of Object.entries(
6642
- task2.task.dependencies
6643
- )) {
6644
- const candidate = isOptional(depItem) ? depItem.inner : depItem;
6645
- const depNode = nodeMap.get(candidate.id);
6646
- if (depNode) {
6647
- node.dependencies[depKey] = depNode;
6648
- }
6649
- }
6650
- }
6651
- const t = task2.task;
6652
- for (const middleware of t.middleware) {
6653
- const middlewareNode = nodeMap.get(middleware.id);
6654
- if (middlewareNode) {
6655
- node.dependencies[middleware.id] = middlewareNode;
6656
- }
6657
- }
6658
- }
6659
- for (const storeTaskMiddleware of this.taskMiddlewares.values()) {
6660
- const node = nodeMap.get(storeTaskMiddleware.middleware.id);
6661
- const { middleware } = storeTaskMiddleware;
6662
- if (middleware.dependencies) {
6663
- for (const [depKey, depItem] of Object.entries(
6664
- middleware.dependencies
6665
- )) {
6666
- const candidate = isOptional(depItem) ? depItem.inner : depItem;
6667
- const depNode = nodeMap.get(candidate.id);
6668
- if (depNode) {
6669
- node.dependencies[depKey] = depNode;
6670
- }
6671
- }
6672
- }
6673
- if (middleware.everywhere) {
6674
- const filter = typeof middleware.everywhere === "function" ? middleware.everywhere : () => true;
6675
- for (const task2 of this.tasks.values()) {
6676
- if (filter(task2.task)) {
6677
- const taskNode = nodeMap.get(task2.task.id);
6678
- taskNode.dependencies[`__middleware.${middleware.id}`] = node;
6679
- }
6680
- }
6681
- }
6682
- }
6683
- for (const storeResourceMiddleware of this.resourceMiddlewares.values()) {
6684
- const node = nodeMap.get(storeResourceMiddleware.middleware.id);
6685
- const { middleware } = storeResourceMiddleware;
6686
- if (middleware.dependencies) {
6687
- for (const [depKey, depItem] of Object.entries(
6688
- middleware.dependencies
6689
- )) {
6690
- const candidate = isOptional(depItem) ? depItem.inner : depItem;
6691
- const depNode = nodeMap.get(candidate.id);
6692
- if (depNode) {
6693
- node.dependencies[depKey] = depNode;
6694
- }
6695
- }
6696
- }
6697
- if (middleware.everywhere) {
6698
- const filter = typeof middleware.everywhere === "function" ? middleware.everywhere : () => true;
6699
- for (const resource2 of this.resources.values()) {
6700
- if (filter(resource2.resource)) {
6701
- const resourceNode = nodeMap.get(resource2.resource.id);
6702
- resourceNode.dependencies[`__middleware.${middleware.id}`] = node;
6703
- }
6704
- }
6705
- }
6706
- }
6707
- for (const resource2 of this.resources.values()) {
6708
- const node = nodeMap.get(resource2.resource.id);
6709
- if (resource2.resource.dependencies) {
6710
- for (const [depKey, depItem] of Object.entries(
6711
- resource2.resource.dependencies
6712
- )) {
6713
- const candidate = isOptional(depItem) ? depItem.inner : depItem;
6714
- const depNode = nodeMap.get(candidate.id);
6715
- if (depNode) {
6716
- node.dependencies[depKey] = depNode;
6717
- }
6718
- }
6719
- }
6720
- for (const middleware of resource2.resource.middleware) {
6721
- const middlewareNode = nodeMap.get(middleware.id);
6722
- if (middlewareNode) {
6723
- node.dependencies[middleware.id] = middlewareNode;
6724
- }
6725
- }
6726
- }
6727
- for (const hook2 of this.hooks.values()) {
6728
- const node = nodeMap.get(hook2.hook.id);
6729
- if (hook2.hook.dependencies) {
6730
- for (const [depKey, depItem] of Object.entries(
6731
- hook2.hook.dependencies
6732
- )) {
6733
- const candidate = isOptional(depItem) ? depItem.inner : depItem;
6734
- const depNode = nodeMap.get(candidate.id);
6735
- if (depNode) {
6736
- node.dependencies[depKey] = depNode;
6737
- }
6738
- }
6739
- }
6740
- }
6741
- return depenedants;
6924
+ return buildDependencyGraph(this);
6742
6925
  }
6743
6926
  /**
6744
6927
  * Builds a directed graph of event emissions based on hooks listening to events
6745
6928
  * and their dependencies on events (emission capability). Ignores wildcard hooks by default.
6746
6929
  */
6747
6930
  buildEventEmissionGraph() {
6748
- const nodes = /* @__PURE__ */ new Map();
6749
- for (const e of this.events.values()) {
6750
- nodes.set(e.event.id, { id: e.event.id, dependencies: {} });
6751
- }
6752
- for (const h of this.hooks.values()) {
6753
- const listened = [];
6754
- const on = h.hook.on;
6755
- if (on === "*") continue;
6756
- if (Array.isArray(on))
6757
- listened.push(...on.map((e) => e.id));
6758
- else listened.push(on.id);
6759
- const depEvents = [];
6760
- const deps = h.hook.dependencies;
6761
- if (deps) {
6762
- for (const value of Object.values(deps)) {
6763
- const candidate = isOptional(value) ? value.inner : value;
6764
- if (candidate && isEvent(candidate)) {
6765
- depEvents.push(candidate.id);
6766
- }
6767
- }
6768
- }
6769
- for (const srcId of listened) {
6770
- const srcNode = nodes.get(srcId);
6771
- if (!srcNode) continue;
6772
- for (const dstId of depEvents) {
6773
- if (srcId === dstId) continue;
6774
- const dstNode = nodes.get(dstId);
6775
- if (dstNode) {
6776
- srcNode.dependencies[dstId] = dstNode;
6777
- }
6778
- }
6779
- }
6780
- }
6781
- return Array.from(nodes.values());
6782
- }
6783
- setupBlankNodes(nodeMap, depenedants) {
6784
- for (const task2 of this.tasks.values()) {
6785
- const node = {
6786
- id: task2.task.id,
6787
- dependencies: {}
6788
- };
6789
- nodeMap.set(task2.task.id, node);
6790
- depenedants.push(node);
6791
- }
6792
- for (const middleware of this.taskMiddlewares.values()) {
6793
- const node = {
6794
- id: middleware.middleware.id,
6795
- dependencies: {}
6796
- };
6797
- nodeMap.set(middleware.middleware.id, node);
6798
- depenedants.push(node);
6799
- }
6800
- for (const middleware of this.resourceMiddlewares.values()) {
6801
- const node = {
6802
- id: middleware.middleware.id,
6803
- dependencies: {}
6804
- };
6805
- nodeMap.set(middleware.middleware.id, node);
6806
- depenedants.push(node);
6807
- }
6808
- for (const resource2 of this.resources.values()) {
6809
- const node = {
6810
- id: resource2.resource.id,
6811
- dependencies: {}
6812
- };
6813
- nodeMap.set(resource2.resource.id, node);
6814
- depenedants.push(node);
6815
- }
6816
- for (const hook2 of this.hooks.values()) {
6817
- const node = {
6818
- id: hook2.hook.id,
6819
- dependencies: {}
6820
- };
6821
- nodeMap.set(hook2.hook.id, node);
6822
- depenedants.push(node);
6823
- }
6931
+ return buildEventEmissionGraph(this);
6824
6932
  }
6825
6933
  getTasksWithTag(tag2) {
6826
6934
  const tagId = typeof tag2 === "string" ? tag2 : tag2.id;
@@ -7754,6 +7862,63 @@ function detectRunnerMode(explicitMode) {
7754
7862
  }
7755
7863
  __name(detectRunnerMode, "detectRunnerMode");
7756
7864
 
7865
+ // src/models/utils/disposeOrder.ts
7866
+ function getResourcesInDisposeOrder(resources, initializedResourceIds) {
7867
+ const initializedResources = Array.from(resources.values()).filter(
7868
+ (r2) => r2.isInitialized
7869
+ );
7870
+ const initOrderHasAllInitialized = initializedResourceIds.length === initializedResources.length && initializedResources.every(
7871
+ (r2) => initializedResourceIds.includes(r2.resource.id)
7872
+ );
7873
+ if (initOrderHasAllInitialized) {
7874
+ const byId = new Map(
7875
+ initializedResources.map((r2) => [r2.resource.id, r2])
7876
+ );
7877
+ return initializedResourceIds.slice().reverse().map((id2) => byId.get(id2)).filter((r2) => Boolean(r2));
7878
+ }
7879
+ const visitState = /* @__PURE__ */ new Map();
7880
+ const initOrder = [];
7881
+ let cycleDetected = false;
7882
+ const getDependencyIds = /* @__PURE__ */ __name((resource2) => {
7883
+ const raw = resource2.resource.dependencies;
7884
+ if (!raw) return [];
7885
+ const deps = raw;
7886
+ if (!deps || typeof deps !== "object") return [];
7887
+ const out = [];
7888
+ const collect = /* @__PURE__ */ __name((value) => {
7889
+ if (isOptional(value)) {
7890
+ collect(value.inner);
7891
+ return;
7892
+ }
7893
+ if (isResource(value)) {
7894
+ out.push(value.id);
7895
+ }
7896
+ }, "collect");
7897
+ Object.values(deps).forEach(collect);
7898
+ return out;
7899
+ }, "getDependencyIds");
7900
+ const visit = /* @__PURE__ */ __name((resourceId) => {
7901
+ const state = visitState.get(resourceId);
7902
+ if (state === "visited") return;
7903
+ if (state === "visiting") {
7904
+ cycleDetected = true;
7905
+ return;
7906
+ }
7907
+ const resource2 = resources.get(resourceId);
7908
+ if (!resource2) return;
7909
+ visitState.set(resourceId, "visiting");
7910
+ getDependencyIds(resource2).forEach(visit);
7911
+ visitState.set(resourceId, "visited");
7912
+ initOrder.push(resource2);
7913
+ }, "visit");
7914
+ initializedResources.forEach((r2) => visit(r2.resource.id));
7915
+ if (cycleDetected) {
7916
+ return initializedResources.slice().reverse();
7917
+ }
7918
+ return initOrder.reverse();
7919
+ }
7920
+ __name(getResourcesInDisposeOrder, "getResourcesInDisposeOrder");
7921
+
7757
7922
  // src/models/Store.ts
7758
7923
  var Store = class {
7759
7924
  constructor(eventManager, logger, onUnhandledError, mode) {
@@ -7818,6 +7983,7 @@ var Store = class {
7818
7983
  }
7819
7984
  lock() {
7820
7985
  this.#isLocked = true;
7986
+ this.registry.lockAll();
7821
7987
  }
7822
7988
  checkLock() {
7823
7989
  if (this.#isLocked) {
@@ -7959,58 +8125,7 @@ var Store = class {
7959
8125
  this.initializedResourceIds.push(resourceId);
7960
8126
  }
7961
8127
  getResourcesInDisposeOrder() {
7962
- const initializedResources = Array.from(this.resources.values()).filter(
7963
- (r2) => r2.isInitialized
7964
- );
7965
- const initOrderHasAllInitialized = this.initializedResourceIds.length === initializedResources.length && initializedResources.every(
7966
- (r2) => this.initializedResourceIds.includes(r2.resource.id)
7967
- );
7968
- if (initOrderHasAllInitialized) {
7969
- const byId = new Map(
7970
- initializedResources.map((r2) => [r2.resource.id, r2])
7971
- );
7972
- return this.initializedResourceIds.slice().reverse().map((id2) => byId.get(id2)).filter((r2) => Boolean(r2));
7973
- }
7974
- const visitState = /* @__PURE__ */ new Map();
7975
- const initOrder = [];
7976
- let cycleDetected = false;
7977
- const getDependencyIds = /* @__PURE__ */ __name((resource2) => {
7978
- const raw = resource2.resource.dependencies;
7979
- if (!raw) return [];
7980
- const deps = raw;
7981
- if (!deps || typeof deps !== "object") return [];
7982
- const out = [];
7983
- const collect = /* @__PURE__ */ __name((value) => {
7984
- if (isOptional(value)) {
7985
- collect(value.inner);
7986
- return;
7987
- }
7988
- if (isResource(value)) {
7989
- out.push(value.id);
7990
- }
7991
- }, "collect");
7992
- Object.values(deps).forEach(collect);
7993
- return out;
7994
- }, "getDependencyIds");
7995
- const visit = /* @__PURE__ */ __name((resourceId) => {
7996
- const state = visitState.get(resourceId);
7997
- if (state === "visited") return;
7998
- if (state === "visiting") {
7999
- cycleDetected = true;
8000
- return;
8001
- }
8002
- const resource2 = this.resources.get(resourceId);
8003
- if (!resource2) return;
8004
- visitState.set(resourceId, "visiting");
8005
- getDependencyIds(resource2).forEach(visit);
8006
- visitState.set(resourceId, "visited");
8007
- initOrder.push(resource2);
8008
- }, "visit");
8009
- initializedResources.forEach((r2) => visit(r2.resource.id));
8010
- if (cycleDetected) {
8011
- return initializedResources.slice().reverse();
8012
- }
8013
- return initOrder.reverse();
8128
+ return getResourcesInDisposeOrder(this.resources, this.initializedResourceIds);
8014
8129
  }
8015
8130
  /**
8016
8131
  * Internal, avoid using this method directly.
@@ -8293,7 +8408,7 @@ var debugResource = defineResource({
8293
8408
  tags: [globalTags.system]
8294
8409
  });
8295
8410
 
8296
- // src/processHooks.ts
8411
+ // src/tools/processShutdownHooks.ts
8297
8412
  var platform2 = getPlatform();
8298
8413
  var activeErrorHandlers = /* @__PURE__ */ new Set();
8299
8414
  var processSafetyNetsInstalled = false;
@@ -8631,6 +8746,16 @@ function buildTestFacade(deps) {
8631
8746
  }
8632
8747
  __name(buildTestFacade, "buildTestFacade");
8633
8748
 
8749
+ // src/definers/builders/shared/mergeUtils.ts
8750
+ function mergeArray(existing, addition, override2) {
8751
+ const toArray = [...addition];
8752
+ if (override2 || !existing) {
8753
+ return toArray;
8754
+ }
8755
+ return [...existing, ...toArray];
8756
+ }
8757
+ __name(mergeArray, "mergeArray");
8758
+
8634
8759
  // src/definers/builders/resource/utils.ts
8635
8760
  function clone2(s, patch) {
8636
8761
  return Object.freeze({
@@ -8675,14 +8800,6 @@ function mergeRegister(existing, addition, override2) {
8675
8800
  ];
8676
8801
  }
8677
8802
  __name(mergeRegister, "mergeRegister");
8678
- function mergeArray(existing, addition, override2) {
8679
- const toArray = [...addition];
8680
- if (override2 || !existing) {
8681
- return toArray;
8682
- }
8683
- return [...existing, ...toArray];
8684
- }
8685
- __name(mergeArray, "mergeArray");
8686
8803
  function mergeDependencies(existing, addition, override2) {
8687
8804
  const isFnExisting = typeof existing === "function";
8688
8805
  const isFnAddition = typeof addition === "function";
@@ -8846,14 +8963,6 @@ function clone3(s, patch) {
8846
8963
  });
8847
8964
  }
8848
8965
  __name(clone3, "clone");
8849
- function mergeArray2(existing, addition, override2) {
8850
- const toArray = [...addition];
8851
- if (override2 || !existing) {
8852
- return toArray;
8853
- }
8854
- return [...existing, ...toArray];
8855
- }
8856
- __name(mergeArray2, "mergeArray");
8857
8966
  function mergeDependencies2(existing, addition, override2) {
8858
8967
  const isFnExisting = typeof existing === "function";
8859
8968
  const isFnAddition = typeof addition === "function";
@@ -8909,14 +9018,14 @@ function makeTaskBuilder(state) {
8909
9018
  middleware(mw, options) {
8910
9019
  const override2 = options?.override ?? false;
8911
9020
  const next = clone3(state, {
8912
- middleware: mergeArray2(state.middleware, mw, override2)
9021
+ middleware: mergeArray(state.middleware, mw, override2)
8913
9022
  });
8914
9023
  return makeTaskBuilder(next);
8915
9024
  },
8916
9025
  tags(t, options) {
8917
9026
  const override2 = options?.override ?? false;
8918
9027
  const next = clone3(state, {
8919
- tags: mergeArray2(state.tags, t, override2)
9028
+ tags: mergeArray(state.tags, t, override2)
8920
9029
  });
8921
9030
  return makeTaskBuilder(next);
8922
9031
  },
@@ -8992,14 +9101,14 @@ function makePhantomTaskBuilder(state) {
8992
9101
  middleware(mw, options) {
8993
9102
  const override2 = options?.override ?? false;
8994
9103
  const next = clone3(state, {
8995
- middleware: mergeArray2(state.middleware, mw, override2)
9104
+ middleware: mergeArray(state.middleware, mw, override2)
8996
9105
  });
8997
9106
  return makePhantomTaskBuilder(next);
8998
9107
  },
8999
9108
  tags(t, options) {
9000
9109
  const override2 = options?.override ?? false;
9001
9110
  const next = clone3(state, {
9002
- tags: mergeArray2(state.tags, t, override2)
9111
+ tags: mergeArray(state.tags, t, override2)
9003
9112
  });
9004
9113
  return makePhantomTaskBuilder(
9005
9114
  next
@@ -9088,14 +9197,6 @@ function clone4(s, patch) {
9088
9197
  });
9089
9198
  }
9090
9199
  __name(clone4, "clone");
9091
- function mergeArray3(existing, addition, override2) {
9092
- const toArray = [...addition];
9093
- if (override2 || !existing) {
9094
- return toArray;
9095
- }
9096
- return [...existing, ...toArray];
9097
- }
9098
- __name(mergeArray3, "mergeArray");
9099
9200
 
9100
9201
  // src/definers/builders/event/fluent-builder.ts
9101
9202
  function makeEventBuilder(state) {
@@ -9110,7 +9211,7 @@ function makeEventBuilder(state) {
9110
9211
  tags(t, options) {
9111
9212
  const override2 = options?.override ?? false;
9112
9213
  const next = clone4(state, {
9113
- tags: mergeArray3(state.tags, t, override2)
9214
+ tags: mergeArray(state.tags, t, override2)
9114
9215
  });
9115
9216
  return makeEventBuilder(next);
9116
9217
  },
@@ -9158,14 +9259,6 @@ function clone5(s, patch) {
9158
9259
  });
9159
9260
  }
9160
9261
  __name(clone5, "clone");
9161
- function mergeArray4(existing, addition, override2) {
9162
- const toArray = [...addition];
9163
- if (override2 || !existing) {
9164
- return toArray;
9165
- }
9166
- return [...existing, ...toArray];
9167
- }
9168
- __name(mergeArray4, "mergeArray");
9169
9262
  function mergeDependencies3(existing, addition, override2) {
9170
9263
  const isFnExisting = typeof existing === "function";
9171
9264
  const isFnAddition = typeof addition === "function";
@@ -9239,7 +9332,7 @@ function makeHookBuilder(state) {
9239
9332
  tags(t, options) {
9240
9333
  const override2 = options?.override ?? false;
9241
9334
  const next = clone5(state, {
9242
- tags: mergeArray4(state.tags, t, override2)
9335
+ tags: mergeArray(state.tags, t, override2)
9243
9336
  });
9244
9337
  return makeHookBuilder(next);
9245
9338
  },
@@ -9316,14 +9409,6 @@ function cloneRes(s, patch) {
9316
9409
  });
9317
9410
  }
9318
9411
  __name(cloneRes, "cloneRes");
9319
- function mergeArray5(existing, addition, override2) {
9320
- const toArray = [...addition];
9321
- if (override2 || !existing) {
9322
- return toArray;
9323
- }
9324
- return [...existing, ...toArray];
9325
- }
9326
- __name(mergeArray5, "mergeArray");
9327
9412
  function mergeDependencies4(existing, addition, override2) {
9328
9413
  const isFnExisting = typeof existing === "function";
9329
9414
  const isFnAddition = typeof addition === "function";
@@ -9404,7 +9489,7 @@ function makeTaskMiddlewareBuilder(state) {
9404
9489
  tags(t, options) {
9405
9490
  const override2 = options?.override ?? false;
9406
9491
  const next = cloneTask(state, {
9407
- tags: mergeArray5(state.tags, t, override2)
9492
+ tags: mergeArray(state.tags, t, override2)
9408
9493
  });
9409
9494
  return makeTaskMiddlewareBuilder(next);
9410
9495
  },
@@ -9476,7 +9561,7 @@ function makeResourceMiddlewareBuilder(state) {
9476
9561
  tags(t, options) {
9477
9562
  const override2 = options?.override ?? false;
9478
9563
  const next = cloneRes(state, {
9479
- tags: mergeArray5(state.tags, t, override2)
9564
+ tags: mergeArray(state.tags, t, override2)
9480
9565
  });
9481
9566
  return makeResourceMiddlewareBuilder(next);
9482
9567
  },
@@ -9687,7 +9772,7 @@ function makeHookOverrideBuilder(base, state) {
9687
9772
  tags(t, options) {
9688
9773
  const override2 = options?.override ?? false;
9689
9774
  const next = cloneHookState(state, {
9690
- tags: mergeArray4(state.tags, t, override2)
9775
+ tags: mergeArray(state.tags, t, override2)
9691
9776
  });
9692
9777
  return makeHookOverrideBuilder(base, next);
9693
9778
  },
@@ -9892,7 +9977,7 @@ function makeResourceMiddlewareOverrideBuilder(base, state) {
9892
9977
  tags(t, options) {
9893
9978
  const override2 = options?.override ?? false;
9894
9979
  const next = cloneResourceMiddlewareState(state, {
9895
- tags: mergeArray5(state.tags, t, override2)
9980
+ tags: mergeArray(state.tags, t, override2)
9896
9981
  });
9897
9982
  return makeResourceMiddlewareOverrideBuilder(base, next);
9898
9983
  },
@@ -9952,14 +10037,14 @@ function makeTaskOverrideBuilder(base, state) {
9952
10037
  middleware(mw, options) {
9953
10038
  const override2 = options?.override ?? false;
9954
10039
  const next = cloneTaskState(state, {
9955
- middleware: mergeArray2(state.middleware, mw, override2)
10040
+ middleware: mergeArray(state.middleware, mw, override2)
9956
10041
  });
9957
10042
  return makeTaskOverrideBuilder(base, next);
9958
10043
  },
9959
10044
  tags(t, options) {
9960
10045
  const override2 = options?.override ?? false;
9961
10046
  const next = cloneTaskState(state, {
9962
- tags: mergeArray2(state.tags, t, override2)
10047
+ tags: mergeArray(state.tags, t, override2)
9963
10048
  });
9964
10049
  return makeTaskOverrideBuilder(base, next);
9965
10050
  },
@@ -10068,7 +10153,7 @@ function makeTaskMiddlewareOverrideBuilder(base, state) {
10068
10153
  tags(t, options) {
10069
10154
  const override2 = options?.override ?? false;
10070
10155
  const next = cloneTaskMiddlewareState(state, {
10071
- tags: mergeArray5(state.tags, t, override2)
10156
+ tags: mergeArray(state.tags, t, override2)
10072
10157
  });
10073
10158
  return makeTaskMiddlewareOverrideBuilder(base, next);
10074
10159
  },
@@ -10144,6 +10229,6 @@ var r = Object.freeze({
10144
10229
  })
10145
10230
  });
10146
10231
 
10147
- export { DependencyProcessor, errors_exports as Errors, EventManager, LogPrinter, Logger, MiddlewareManager, PlatformAdapter, Queue, ResourceInitializer, RunResult, RunnerError, Semaphore, Serializer, Store, SymbolPolicy, SymbolPolicyErrorMessage, TaskRunner, allFalse, defineAsyncContext as asyncContext, bindProcessErrorHandler, createContext2 as createContext, createDefaultUnhandledError, createExposureFetch, createHttpClient, createTestResource, debug, debugLevels, defs_exports as definitions, defineEvent as event, getConfig, globals, defineHook as hook, journal, levelNormal, levelVerbose, normalizeError, defineOverride as override, r, defineResource as resource, defineResourceMiddleware as resourceMiddleware, run, safeReportUnhandledError, setPlatform, defineTag as tag, defineTask as task, defineTaskMiddleware as taskMiddleware };
10232
+ export { DependencyProcessor, errors_exports as Errors, EventManager, LockableMap, LogPrinter, Logger, MiddlewareManager, PlatformAdapter, Queue, ResourceInitializer, RunResult, RunnerError, Semaphore, Serializer, Store, SymbolPolicy, SymbolPolicyErrorMessage, TaskRunner, allFalse, defineAsyncContext as asyncContext, bindProcessErrorHandler, cancellationError, createContext2 as createContext, createDefaultUnhandledError, createExposureFetch, createHttpClient, createTestResource, debug, debugLevels, defs_exports as definitions, defineEvent as event, getConfig, globals, defineHook as hook, journal, levelNormal, levelVerbose, normalizeError, defineOverride as override, r, defineResource as resource, defineResourceMiddleware as resourceMiddleware, run, safeReportUnhandledError, setPlatform, defineTag as tag, defineTask as task, defineTaskMiddleware as taskMiddleware };
10148
10233
  //# sourceMappingURL=index.mjs.map
10149
10234
  //# sourceMappingURL=index.mjs.map