@bluelibs/runner 5.3.0 → 5.5.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 (189) hide show
  1. package/README.md +23 -22
  2. package/dist/browser/index.cjs +6159 -3049
  3. package/dist/browser/index.cjs.map +1 -1
  4. package/dist/browser/index.mjs +6157 -3046
  5. package/dist/browser/index.mjs.map +1 -1
  6. package/dist/edge/index.cjs +6159 -3049
  7. package/dist/edge/index.cjs.map +1 -1
  8. package/dist/edge/index.mjs +6157 -3046
  9. package/dist/edge/index.mjs.map +1 -1
  10. package/dist/node/node.cjs +10843 -10814
  11. package/dist/node/node.cjs.map +1 -1
  12. package/dist/node/node.mjs +10801 -10770
  13. package/dist/node/node.mjs.map +1 -1
  14. package/dist/types/definers/builders/asyncContext/fluent-builder.interface.d.ts +4 -0
  15. package/dist/types/definers/builders/error/fluent-builder.interface.d.ts +8 -1
  16. package/dist/types/definers/builders/error/index.d.ts +1 -0
  17. package/dist/types/definers/builders/error/types.d.ts +2 -1
  18. package/dist/types/definers/builders/error/utils.d.ts +1 -0
  19. package/dist/types/definers/builders/event/fluent-builder.interface.d.ts +10 -0
  20. package/dist/types/definers/builders/event/utils.d.ts +1 -4
  21. package/dist/types/definers/builders/hook/fluent-builder.interface.d.ts +3 -0
  22. package/dist/types/definers/builders/hook/types.d.ts +3 -0
  23. package/dist/types/definers/builders/hook/utils.d.ts +1 -4
  24. package/dist/types/definers/builders/middleware/index.d.ts +4 -2
  25. package/dist/types/definers/builders/middleware/resource.interface.d.ts +7 -0
  26. package/dist/types/definers/builders/middleware/task.interface.d.ts +7 -0
  27. package/dist/types/definers/builders/middleware/types.d.ts +22 -3
  28. package/dist/types/definers/builders/middleware/utils.d.ts +3 -4
  29. package/dist/types/definers/builders/override/hook.d.ts +3 -0
  30. package/dist/types/definers/builders/override/index.d.ts +5 -0
  31. package/dist/types/definers/builders/resource/fluent-builder.interface.d.ts +15 -0
  32. package/dist/types/definers/builders/resource/index.d.ts +0 -1
  33. package/dist/types/definers/builders/resource/types.d.ts +1 -0
  34. package/dist/types/definers/builders/resource/utils.d.ts +1 -4
  35. package/dist/types/definers/builders/shared/mergeUtils.d.ts +5 -0
  36. package/dist/types/definers/builders/tag/fluent-builder.interface.d.ts +4 -0
  37. package/dist/types/definers/builders/tag/utils.d.ts +1 -0
  38. package/dist/types/definers/builders/task/fluent-builder.interface.d.ts +4 -0
  39. package/dist/types/definers/builders/task/index.d.ts +2 -2
  40. package/dist/types/definers/builders/task/utils.d.ts +1 -4
  41. package/dist/types/definers/builders/utils.d.ts +7 -2
  42. package/dist/types/definers/defineError.d.ts +12 -2
  43. package/dist/types/definers/resourceFork.d.ts +3 -1
  44. package/dist/types/definers/tools.d.ts +12 -12
  45. package/dist/types/errors/domain-error-ids.d.ts +44 -0
  46. package/dist/types/errors/domain-runtime.errors.d.ts +136 -0
  47. package/dist/types/errors/foundation.errors.d.ts +125 -0
  48. package/dist/types/errors/generic.errors.d.ts +1 -0
  49. package/dist/types/errors/model-runtime.errors.d.ts +20 -0
  50. package/dist/types/errors.d.ts +5 -74
  51. package/dist/types/globals/cron/cron-parser.d.ts +4 -0
  52. package/dist/types/globals/cron/cron.errors.d.ts +8 -0
  53. package/dist/types/globals/cron/cron.resource.d.ts +12 -0
  54. package/dist/types/globals/cron/cron.tag.d.ts +2 -0
  55. package/dist/types/globals/cron/types.d.ts +25 -0
  56. package/dist/types/globals/globalMiddleware.d.ts +87 -13
  57. package/dist/types/globals/globalResources.d.ts +110 -24
  58. package/dist/types/globals/globalTags.d.ts +10 -2
  59. package/dist/types/globals/middleware/cache.middleware.d.ts +173 -13
  60. package/dist/types/globals/middleware/circuitBreaker.middleware.d.ts +5 -1
  61. package/dist/types/globals/middleware/concurrency.middleware.d.ts +3 -0
  62. package/dist/types/globals/middleware/fallback.middleware.d.ts +8 -1
  63. package/dist/types/globals/middleware/rateLimit.middleware.d.ts +4 -1
  64. package/dist/types/globals/middleware/retry.middleware.d.ts +5 -0
  65. package/dist/types/globals/middleware/temporal.middleware.d.ts +19 -19
  66. package/dist/types/globals/middleware/timeout.middleware.d.ts +4 -1
  67. package/dist/types/globals/resources/eventManager.resource.d.ts +2 -0
  68. package/dist/types/globals/resources/logger.resource.d.ts +2 -0
  69. package/dist/types/globals/resources/middlewareManager.resource.d.ts +2 -0
  70. package/dist/types/globals/resources/queue.resource.d.ts +2 -0
  71. package/dist/types/globals/resources/runtime.resource.d.ts +2 -0
  72. package/dist/types/globals/resources/serializer.resource.d.ts +2 -0
  73. package/dist/types/globals/resources/store.resource.d.ts +2 -0
  74. package/dist/types/globals/resources/taskRunner.resource.d.ts +2 -0
  75. package/dist/types/globals/resources/tunnel/plan.d.ts +6 -3
  76. package/dist/types/globals/resources/tunnel/tunnel.policy.tag.d.ts +2 -0
  77. package/dist/types/globals/resources/tunnel/types.d.ts +7 -2
  78. package/dist/types/globals/types.d.ts +6 -1
  79. package/dist/types/models/BuiltinsRegistry.d.ts +2 -0
  80. package/dist/types/models/DependencyProcessor.d.ts +27 -6
  81. package/dist/types/models/EventManager.d.ts +9 -9
  82. package/dist/types/models/LogPrinter.d.ts +5 -5
  83. package/dist/types/models/Logger.d.ts +16 -16
  84. package/dist/types/models/MiddlewareManager.d.ts +20 -2
  85. package/dist/types/models/OverrideManager.d.ts +4 -1
  86. package/dist/types/models/Queue.d.ts +2 -0
  87. package/dist/types/models/RunResult.d.ts +290 -26
  88. package/dist/types/models/Store.d.ts +29 -12
  89. package/dist/types/models/StoreRegistry.d.ts +16 -13
  90. package/dist/types/models/StoreValidator.d.ts +2 -0
  91. package/dist/types/models/TaskRunner.d.ts +3 -1
  92. package/dist/types/models/VisibilityTracker.d.ts +75 -0
  93. package/dist/types/models/dependency-processor/DependencyExtractor.d.ts +23 -0
  94. package/dist/types/models/dependency-processor/HookEventBuffer.d.ts +15 -0
  95. package/dist/types/models/dependency-processor/ResourceScheduler.d.ts +10 -0
  96. package/dist/types/models/event/EmissionExecutor.d.ts +5 -4
  97. package/dist/types/models/event/ListenerRegistry.d.ts +2 -0
  98. package/dist/types/models/index.d.ts +1 -3
  99. package/dist/types/models/middleware/InterceptorRegistry.d.ts +13 -4
  100. package/dist/types/models/middleware/ResourceMiddlewareComposer.d.ts +3 -2
  101. package/dist/types/models/middleware/ValidationHelper.d.ts +3 -6
  102. package/dist/types/models/utils/buildDependencyGraph.d.ts +12 -0
  103. package/dist/types/models/utils/dependencyStrategies.d.ts +15 -0
  104. package/dist/types/models/utils/disposeOrder.d.ts +11 -0
  105. package/dist/types/models/utils/resourceDependencyIds.d.ts +1 -0
  106. package/dist/types/node/durable/bus/MemoryEventBus.d.ts +10 -1
  107. package/dist/types/node/durable/bus/NoopEventBus.d.ts +1 -1
  108. package/dist/types/node/durable/bus/RedisEventBus.d.ts +8 -2
  109. package/dist/types/node/durable/core/CronParser.d.ts +2 -13
  110. package/dist/types/node/durable/core/DurableResource.d.ts +15 -32
  111. package/dist/types/node/durable/core/DurableService.d.ts +1 -0
  112. package/dist/types/node/durable/core/DurableWorker.d.ts +4 -2
  113. package/dist/types/node/durable/core/createRunnerDurableRuntime.d.ts +2 -0
  114. package/dist/types/node/durable/core/interfaces/bus.d.ts +1 -1
  115. package/dist/types/node/durable/core/interfaces/resource.d.ts +61 -0
  116. package/dist/types/node/durable/core/interfaces/service.d.ts +2 -0
  117. package/dist/types/node/durable/core/interfaces/store.d.ts +5 -0
  118. package/dist/types/node/durable/core/managers/ExecutionManager.d.ts +1 -0
  119. package/dist/types/node/durable/core/managers/PollingManager.d.ts +3 -1
  120. package/dist/types/node/durable/core/resource.d.ts +6 -5
  121. package/dist/types/node/durable/core/utils.d.ts +11 -1
  122. package/dist/types/node/durable/queue/RabbitMQQueue.d.ts +4 -0
  123. package/dist/types/node/durable/resources/memoryDurableResource.d.ts +7 -5
  124. package/dist/types/node/durable/resources/redisDurableResource.d.ts +7 -5
  125. package/dist/types/node/durable/store/MemoryStore.d.ts +2 -0
  126. package/dist/types/node/durable/store/RedisStore.d.ts +1 -0
  127. package/dist/types/node/durable/tags/durableWorkflow.tag.d.ts +6 -1
  128. package/dist/types/node/exposure/allowList.d.ts +2 -1
  129. package/dist/types/node/exposure/handlers/contextWrapper.d.ts +6 -2
  130. package/dist/types/node/exposure/handlers/errorHandlers.d.ts +1 -0
  131. package/dist/types/node/exposure/handlers/eventHandler.d.ts +1 -0
  132. package/dist/types/node/exposure/handlers/taskHandler.d.ts +3 -1
  133. package/dist/types/node/exposure/logging.d.ts +1 -0
  134. package/dist/types/node/exposure/requestContext.d.ts +1 -1
  135. package/dist/types/node/exposure/requestHandlers.d.ts +3 -1
  136. package/dist/types/node/exposure/requestIdentity.d.ts +3 -0
  137. package/dist/types/node/exposure/resource.d.ts +7 -7
  138. package/dist/types/node/exposure/resourceTypes.d.ts +6 -0
  139. package/dist/types/node/exposure/serverLifecycle.d.ts +2 -0
  140. package/dist/types/node/http/http-mixed-client.factory.resource.d.ts +1 -1
  141. package/dist/types/node/http/http-smart-client.factory.resource.d.ts +1 -1
  142. package/dist/types/node/node.d.ts +1 -184
  143. package/dist/types/node/tunnel/allowlist.d.ts +10 -1
  144. package/dist/types/platform/adapters/browser.d.ts +1 -1
  145. package/dist/types/platform/adapters/edge.d.ts +17 -0
  146. package/dist/types/platform/adapters/node-als.d.ts +1 -1
  147. package/dist/types/platform/adapters/node.d.ts +1 -1
  148. package/dist/types/platform/adapters/universal-generic.d.ts +5 -2
  149. package/dist/types/platform/adapters/universal.d.ts +1 -1
  150. package/dist/types/platform/index.d.ts +3 -2
  151. package/dist/types/platform/types.d.ts +8 -2
  152. package/dist/types/public.d.ts +376 -20
  153. package/dist/types/run.d.ts +17 -1
  154. package/dist/types/serializer/Serializer.d.ts +1 -41
  155. package/dist/types/serializer/errors.d.ts +8 -0
  156. package/dist/types/serializer/marker-key-escapes.d.ts +2 -0
  157. package/dist/types/serializer/serialize-utils.d.ts +1 -1
  158. package/dist/types/serializer/type-registry.d.ts +0 -1
  159. package/dist/types/serializer/types.d.ts +7 -6
  160. package/dist/types/testing.d.ts +1 -0
  161. package/dist/types/tools/LockableMap.d.ts +20 -0
  162. package/dist/types/tools/getAllThrows.d.ts +13 -0
  163. package/dist/types/tools/throws.d.ts +1 -1
  164. package/dist/types/types/error.d.ts +25 -2
  165. package/dist/types/types/event.d.ts +35 -0
  166. package/dist/types/types/hook.d.ts +8 -0
  167. package/dist/types/types/resource.d.ts +13 -1
  168. package/dist/types/types/resourceMiddleware.d.ts +8 -0
  169. package/dist/types/types/runner.d.ts +56 -0
  170. package/dist/types/types/storeTypes.d.ts +5 -1
  171. package/dist/types/types/symbols.d.ts +1 -1
  172. package/dist/types/types/tag.d.ts +1 -0
  173. package/dist/types/types/tagged.d.ts +2 -2
  174. package/dist/types/types/task.d.ts +3 -3
  175. package/dist/types/types/taskMiddleware.d.ts +8 -0
  176. package/dist/types/types/utilities.d.ts +25 -3
  177. package/dist/ui/assets/index-B4lZaXFJ.js +141 -0
  178. package/dist/ui/assets/index-Y_9aLumt.css +1 -0
  179. package/dist/ui/index.html +2 -3
  180. package/dist/universal/index.cjs +6159 -3049
  181. package/dist/universal/index.cjs.map +1 -1
  182. package/dist/universal/index.mjs +6157 -3046
  183. package/dist/universal/index.mjs.map +1 -1
  184. package/package.json +18 -15
  185. package/readmes/AI.md +181 -45
  186. package/dist/ui/assets/index-2cb8f39f.js +0 -141
  187. package/dist/ui/assets/index-b1f988bf.css +0 -1
  188. /package/dist/types/{tunnels → tools}/buildUniversalManifest.d.ts +0 -0
  189. /package/dist/types/{processHooks.d.ts → tools/processShutdownHooks.d.ts} +0 -0
@@ -87,11 +87,12 @@ export interface SerializedGraph {
87
87
  root: SerializedValue;
88
88
  nodes: Record<string, SerializedNode>;
89
89
  }
90
- export declare enum SymbolPolicy {
91
- AllowAll = "AllowAll",
92
- WellKnownOnly = "WellKnownOnly",
93
- Disabled = "Disabled"
94
- }
90
+ export declare const SymbolPolicy: {
91
+ readonly AllowAll: "allow-all";
92
+ readonly WellKnownOnly: "well-known-only";
93
+ readonly Disabled: "disabled";
94
+ };
95
+ export type SymbolPolicy = (typeof SymbolPolicy)[keyof typeof SymbolPolicy];
95
96
  export declare enum SymbolPolicyErrorMessage {
96
97
  GlobalSymbolsNotAllowed = "Global symbols are not allowed",
97
98
  SymbolsNotAllowed = "Symbols are not allowed",
@@ -122,5 +123,5 @@ export interface SerializerOptions {
122
123
  export interface SerializerLike {
123
124
  stringify(value: unknown): string;
124
125
  parse<T = unknown>(text: string): T;
125
- addType?<TJson = unknown, TInstance = unknown>(name: string, factory: (json: TJson) => TInstance): void;
126
+ addType?<TInstance, TSerialized>(typeDef: TypeDefinition<TInstance, TSerialized>): void;
126
127
  }
@@ -12,6 +12,7 @@ export interface TestFacade {
12
12
  * Helper to create a minimal test harness resource that wraps a root app (or any registerable)
13
13
  * and exposes convenient testing utilities while running the full ecosystem
14
14
  * (registration, overrides, middleware, events) without modifying the core API.
15
+ * @deprecated Use run() in your tests instead, which provides the same benefits with a more flexible API and better type safety.
15
16
  */
16
17
  export declare function createTestResource(root: RegisterableItems, options?: {
17
18
  overrides?: Array<IResource | ITask | ITaskMiddleware | IResourceMiddleware | IResourceWithConfig>;
@@ -0,0 +1,20 @@
1
+ /**
2
+ * A Map that can be permanently locked to prevent further mutations.
3
+ *
4
+ * Before locking it behaves exactly like a regular `Map`.
5
+ * After `lock()` is called, any call to `set`, `delete` or `clear`
6
+ * throws immediately — enforcing immutability at the data-structure level.
7
+ */
8
+ export declare class LockableMap<K, V> extends Map<K, V> {
9
+ #private;
10
+ constructor(name?: string);
11
+ /** Whether the map is currently locked. */
12
+ get locked(): boolean;
13
+ /** Permanently lock the map — no further mutations allowed. */
14
+ lock(): void;
15
+ /** @throws if the map is locked */
16
+ private throwIfLocked;
17
+ set(key: K, value: V): this;
18
+ delete(key: K): boolean;
19
+ clear(): void;
20
+ }
@@ -0,0 +1,13 @@
1
+ import type { ITask } from "../types/task";
2
+ import type { IResource } from "../types/resource";
3
+ import type { StoreRegistry } from "../models/StoreRegistry";
4
+ /**
5
+ * Collects all declared error ids from a task or resource definition and its
6
+ * entire dependency chain: own throws, middleware throws (local + everywhere),
7
+ * resource dependency throws (with their middleware), and — for tasks — hook
8
+ * throws on events the task can emit.
9
+ *
10
+ * Designed for introspection, documentation, and error-contract tooling.
11
+ * Returns a deduplicated list of normalized error id strings.
12
+ */
13
+ export declare function getAllThrows(registry: StoreRegistry, target: ITask<any, any, any, any, any, any> | IResource<any, any, any, any>): readonly string[];
@@ -1,6 +1,6 @@
1
1
  import type { ThrowsList } from "../types/error";
2
2
  type ThrowOwner = {
3
- kind: "task" | "resource";
3
+ kind: "task" | "resource" | "hook" | "task-middleware" | "resource-middleware";
4
4
  id: string;
5
5
  };
6
6
  export declare function normalizeThrows(owner: ThrowOwner, throwsList: ThrowsList | undefined): readonly string[] | undefined;
@@ -2,6 +2,7 @@ import { symbolError, symbolFilePath } from "./symbols";
2
2
  import type { IOptionalDependency } from "./utilities";
3
3
  import type { IValidationSchema } from "./utilities";
4
4
  import type { IErrorMeta } from "./meta";
5
+ import type { TagType } from "./tag";
5
6
  export type ErrorReference = string | IErrorHelper<any>;
6
7
  export type ThrowsList = ReadonlyArray<ErrorReference>;
7
8
  export interface IErrorDefinition<TData extends DefaultErrorType = DefaultErrorType> {
@@ -21,6 +22,7 @@ export interface IErrorDefinition<TData extends DefaultErrorType = DefaultErrorT
21
22
  */
22
23
  dataSchema?: IValidationSchema<TData>;
23
24
  meta?: IErrorMeta;
25
+ tags?: TagType[];
24
26
  }
25
27
  export interface IErrorDefinitionFinal<TData extends DefaultErrorType> extends IErrorDefinition<TData> {
26
28
  format: (data: TData) => string;
@@ -28,6 +30,10 @@ export interface IErrorDefinitionFinal<TData extends DefaultErrorType> extends I
28
30
  remediation?: string | ((data: TData) => string);
29
31
  }
30
32
  export type DefaultErrorType = Record<string, unknown>;
33
+ type RequiredKeys<T extends object> = {
34
+ [K in keyof T]-?: {} extends Pick<T, K> ? never : K;
35
+ }[keyof T];
36
+ export type ErrorThrowArgs<TData extends DefaultErrorType> = RequiredKeys<TData> extends never ? [data?: TData] : [data: TData];
31
37
  /**
32
38
  * Runtime error shape thrown by r.error()/defineError() helpers.
33
39
  * Consumers can use helper.is(error) to narrow unknown values to this type.
@@ -47,10 +53,26 @@ export interface IErrorHelper<TData extends DefaultErrorType = DefaultErrorType>
47
53
  id: string;
48
54
  /** Optional HTTP status code associated with this error helper */
49
55
  httpCode?: number;
56
+ /** Metadata attached to this error */
57
+ meta: IErrorMeta;
58
+ /** Tags attached to this error */
59
+ tags: TagType[];
60
+ /** Construct a typed error with the given data without throwing it */
61
+ "new"(...args: ErrorThrowArgs<TData>): IRunnerError<TData>;
62
+ /** Alias for .new() */
63
+ create(...args: ErrorThrowArgs<TData>): IRunnerError<TData>;
50
64
  /** Throw a typed error with the given data */
51
- throw(data: TData): never;
52
- /** Type guard for checking if an unknown error is this error */
65
+ throw(...args: ErrorThrowArgs<TData>): never;
66
+ /**
67
+ * Type guard for checking if an unknown error is this error.
68
+ * Optionally provide a partial data object to require shallow strict matches.
69
+ */
53
70
  is(error: unknown): error is IRunnerError<TData>;
71
+ /**
72
+ * Type guard for checking if an unknown error is this error,
73
+ * with shallow strict matching (`===`) on provided data keys.
74
+ */
75
+ is(error: unknown, partialData: Partial<TData>): error is IRunnerError<TData>;
54
76
  /** Brand symbol for runtime detection */
55
77
  [symbolError]: true;
56
78
  /** Return an optional dependency wrapper for this error */
@@ -58,3 +80,4 @@ export interface IErrorHelper<TData extends DefaultErrorType = DefaultErrorType>
58
80
  /** File path where this error was defined */
59
81
  [symbolFilePath]: string;
60
82
  }
83
+ export {};
@@ -3,6 +3,41 @@ import { TagType } from "./tag";
3
3
  import { IEventMeta } from "./meta";
4
4
  import { CommonPayload, symbolEvent, symbolFilePath } from "./utilities";
5
5
  export type EventHandlerType<T = any> = (event: IEventEmission<T>) => any | Promise<any>;
6
+ export declare const EventEmissionFailureMode: {
7
+ readonly FailFast: "fail-fast";
8
+ readonly Aggregate: "aggregate";
9
+ };
10
+ export type EventEmissionFailureMode = (typeof EventEmissionFailureMode)[keyof typeof EventEmissionFailureMode];
11
+ export interface IEventListenerError extends Error {
12
+ listenerId?: string;
13
+ listenerOrder?: number;
14
+ }
15
+ export interface IEventEmitReport {
16
+ totalListeners: number;
17
+ attemptedListeners: number;
18
+ skippedListeners: number;
19
+ succeededListeners: number;
20
+ failedListeners: number;
21
+ propagationStopped: boolean;
22
+ errors: IEventListenerError[];
23
+ }
24
+ export interface IEventEmitOptions {
25
+ /**
26
+ * Controls error behavior during listener execution.
27
+ * - fail-fast (default): throw on first failure.
28
+ * - aggregate: continue execution and collect listener errors.
29
+ */
30
+ failureMode?: EventEmissionFailureMode;
31
+ /**
32
+ * When false, suppress throwing even if listener errors occurred.
33
+ * Defaults to true.
34
+ */
35
+ throwOnError?: boolean;
36
+ /**
37
+ * When true, `emit(...)`/dependency event emitter returns `IEventEmitReport`.
38
+ */
39
+ report?: boolean;
40
+ }
6
41
  export declare function onAnyOf<T extends readonly IEventDefinition<any>[]>(...defs: T): T;
7
42
  /**
8
43
  * Runtime guard that checks if an emission belongs to one of the given event defs.
@@ -2,6 +2,7 @@ import { DependencyMapType, DependencyValuesType, ExtractEventPayload } from "./
2
2
  import { IEventDefinition, IEventEmission } from "./event";
3
3
  import { TagType } from "./tag";
4
4
  import { ITaskMeta } from "./meta";
5
+ import type { ThrowsList } from "./error";
5
6
  import { CommonPayload, symbolFilePath, symbolHook } from "./utilities";
6
7
  export type OnType = "*" | IEventDefinition<any> | readonly IEventDefinition<any>[];
7
8
  export interface IHookDefinition<TDependencies extends DependencyMapType = {}, TOn extends OnType = any, TMeta extends ITaskMeta = any> {
@@ -11,6 +12,11 @@ export interface IHookDefinition<TDependencies extends DependencyMapType = {}, T
11
12
  /** Listener execution order. Lower numbers run first. */
12
13
  order?: number;
13
14
  meta?: TMeta;
15
+ /**
16
+ * Declares which typed errors are part of this hook's contract.
17
+ * Declarative only — does not imply DI or enforcement.
18
+ */
19
+ throws?: ThrowsList;
14
20
  run: (event: IEventEmission<TOn extends "*" ? any : TOn extends readonly IEventDefinition<any>[] ? CommonPayload<TOn> : ExtractEventPayload<TOn>>, dependencies: DependencyValuesType<TDependencies>) => Promise<any>;
15
21
  tags?: TagType[];
16
22
  }
@@ -19,5 +25,7 @@ export interface IHook<TDependencies extends DependencyMapType = {}, TOn extends
19
25
  dependencies: TDependencies | (() => TDependencies);
20
26
  [symbolFilePath]: string;
21
27
  [symbolHook]: true;
28
+ /** Normalized list of error ids declared via `throws`. */
29
+ throws?: readonly string[];
22
30
  tags: TagType[];
23
31
  }
@@ -58,7 +58,7 @@ export interface IResourceDefinition<TConfig = any, TValue extends Promise<any>
58
58
  * @param dependencies The dependencies it needed
59
59
  * @returns Promise<void>
60
60
  */
61
- dispose?: (this: any, value: TValue extends Promise<infer U> ? U : TValue, config: TConfig, dependencies: ResourceDependencyValuesType<TDependencies>, context: TContext) => Promise<void>;
61
+ dispose?: (this: unknown, value: TValue extends Promise<infer U> ? U : TValue, config: TConfig, dependencies: ResourceDependencyValuesType<TDependencies>, context: TContext) => Promise<void>;
62
62
  meta?: TMeta;
63
63
  /**
64
64
  * Declares which typed errors are part of this resource's contract.
@@ -86,6 +86,13 @@ export interface IResourceDefinition<TConfig = any, TValue extends Promise<any>
86
86
  * Create a private, mutable context shared between `init` and `dispose`.
87
87
  */
88
88
  context?: () => TContext;
89
+ /**
90
+ * Declares which registered items are visible outside this resource's
91
+ * registration subtree. When present, only listed items (and items registered
92
+ * by child resources that also export them) are accessible from outside.
93
+ * Omitting `exports` means everything is public (default).
94
+ */
95
+ exports?: Array<RegisterableItems>;
89
96
  /**
90
97
  * This is optional and used from an index resource to get the correct caller.
91
98
  * This is the reason we allow it here as well.
@@ -110,6 +117,11 @@ export interface IResource<TConfig = void, TValue extends Promise<any> = Promise
110
117
  [symbolForkedFrom]?: ResourceForkInfo;
111
118
  /** Normalized list of error ids declared via `throws`. */
112
119
  throws?: readonly string[];
120
+ /**
121
+ * Items visible outside this resource's subtree. When set, only listed items
122
+ * can be referenced from outside.
123
+ */
124
+ exports?: Array<RegisterableItems>;
113
125
  /** Return an optional dependency wrapper for this resource. */
114
126
  optional: () => IOptionalDependency<IResource<TConfig, TValue, TDependencies, TContext, TMeta, TTags, TMiddleware>>;
115
127
  tags: TTags;
@@ -4,6 +4,7 @@ import { TagType } from "./tag";
4
4
  import { IMiddlewareMeta } from "./meta";
5
5
  import { symbolFilePath, symbolMiddlewareConfigured, symbolResourceMiddleware } from "./symbols";
6
6
  import { IContractable } from "./contracts";
7
+ import type { ThrowsList } from "./error";
7
8
  export interface IResourceMiddlewareDefinition<TConfig = any, TEnforceInputContract = void, TEnforceOutputContract = void, TDependencies extends DependencyMapType = any> {
8
9
  id: string;
9
10
  /** Static or lazy dependency map. */
@@ -19,12 +20,19 @@ export interface IResourceMiddlewareDefinition<TConfig = any, TEnforceInputContr
19
20
  run: (input: IResourceMiddlewareExecutionInput<TEnforceInputContract extends void ? any : TEnforceInputContract, TEnforceOutputContract extends void ? any : TEnforceOutputContract>, dependencies: DependencyValuesType<TDependencies>, config: TConfig) => Promise<any>;
20
21
  meta?: IMiddlewareMeta;
21
22
  tags?: TagType[];
23
+ /**
24
+ * Declares which typed errors are part of this middleware's contract.
25
+ * Declarative only — does not imply DI or enforcement.
26
+ */
27
+ throws?: ThrowsList;
22
28
  everywhere?: boolean | ((resource: IResource<any, any, any, any, any>) => boolean);
23
29
  }
24
30
  export interface IResourceMiddleware<TConfig = any, TEnforceInputContract = void, TEnforceOutputContract = void, TDependencies extends DependencyMapType = any> extends IResourceMiddlewareDefinition<TConfig, TEnforceInputContract, TEnforceOutputContract, TDependencies>, IContractable<TConfig, TEnforceInputContract, TEnforceOutputContract> {
25
31
  [symbolResourceMiddleware]: true;
26
32
  id: string;
27
33
  dependencies: TDependencies | ((config: TConfig) => TDependencies);
34
+ /** Normalized list of error ids declared via `throws`. */
35
+ throws?: readonly string[];
28
36
  /** Current configuration object (empty by default). */
29
37
  config: TConfig;
30
38
  /** Configure the middleware and return a marked, configured instance. */
@@ -1,6 +1,44 @@
1
1
  import { DebugFriendlyConfig } from "../globals/resources/debug";
2
2
  import { LogLevels, PrintStrategy } from "../models/Logger";
3
3
  import { OnUnhandledError } from "../models/UnhandledError";
4
+ import { IEvent, IEventEmitOptions, IEventEmitReport } from "../defs";
5
+ import { IResource } from "./resource";
6
+ import { ITask } from "./task";
7
+ import { TaskCallOptions } from "./utilities";
8
+ /**
9
+ * Common interface for the Runner runtime instance.
10
+ * Provides access to tasks, events, resources, and lifecycle management.
11
+ */
12
+ export interface IRuntime<V = unknown> {
13
+ /**
14
+ * Executes a registered task.
15
+ */
16
+ runTask<TTask extends ITask<any, Promise<any>, any> | string>(task: TTask, ...args: TTask extends ITask<infer I, any, any> ? I extends undefined | void ? [input?: I, options?: TaskCallOptions] : [input: I, options?: TaskCallOptions] : [input?: unknown, options?: TaskCallOptions]): TTask extends ITask<any, infer O, any> ? O : Promise<any>;
17
+ /**
18
+ * Emits an event to trigger hooks.
19
+ */
20
+ emitEvent<P>(event: IEvent<P> | string, payload?: P extends undefined | void ? undefined : P, options?: IEventEmitOptions): Promise<void | IEventEmitReport>;
21
+ /**
22
+ * Synchronously retrieves an initialized resource value.
23
+ */
24
+ getResourceValue<Output extends Promise<any>>(resource: string | IResource<any, Output, any, any, any>): Output extends Promise<infer U> ? U : Output;
25
+ /**
26
+ * Initializes and returns a resource value on-demand (lazy mode only).
27
+ */
28
+ getLazyResourceValue<Output extends Promise<any>>(resource: string | IResource<any, Output, any, any, any>): Promise<Output extends Promise<infer U> ? U : Output>;
29
+ /**
30
+ * Retrieves the configuration passed to a resource.
31
+ */
32
+ getResourceConfig<Config>(resource: string | IResource<Config, any, any, any, any>): Config;
33
+ /** Returns the ID of the root resource. */
34
+ getRootId(): string;
35
+ /** Returns the configuration passed to the root resource. */
36
+ getRootConfig<Config = unknown>(): Config;
37
+ /** Returns the initialized value of the root resource. */
38
+ getRootValue<Value = V>(): Value;
39
+ /** Disposes the runtime and all resources. */
40
+ dispose(): Promise<void>;
41
+ }
4
42
  export type RunOptions = {
5
43
  /**
6
44
  * Defaults to undefined. If true, we introduce logging to the console.
@@ -52,6 +90,17 @@ export type RunOptions = {
52
90
  * you don't have event deadlocks to improve event emission performance.
53
91
  */
54
92
  runtimeEventCycleDetection?: boolean;
93
+ /**
94
+ * Defaults to false.
95
+ * When true, startup skips initializing resources that are not used during bootstrap.
96
+ * Such resources can be initialized on-demand via `runResult.getLazyResourceValue(...)`.
97
+ */
98
+ lazy?: boolean;
99
+ /**
100
+ * Defaults to `sequential`.
101
+ * Controls how resources are initialized during startup.
102
+ */
103
+ initMode?: ResourceInitMode | "sequential" | "parallel";
55
104
  /**
56
105
  * Specify in which mode to run "dev", "prod" or "test".
57
106
  * If inside Node this is automatically detected from the NODE_ENV environment variable if not provided.
@@ -66,3 +115,10 @@ export declare enum RunnerMode {
66
115
  DEV = "dev",
67
116
  PROD = "prod"
68
117
  }
118
+ /**
119
+ * Resource initialization strategy during run() bootstrap.
120
+ */
121
+ export declare enum ResourceInitMode {
122
+ Sequential = "sequential",
123
+ Parallel = "parallel"
124
+ }
@@ -24,7 +24,11 @@ export type TaskStoreElementType<Input = any, Output extends Promise<any> = any,
24
24
  task: ITask<Input, Output, D>;
25
25
  computedDependencies: DependencyValuesType<D>;
26
26
  isInitialized: boolean;
27
- interceptors?: Array<TaskLocalInterceptor<any, any>>;
27
+ interceptors?: Array<TaskLocalInterceptorRecord<any, any>>;
28
+ };
29
+ export type TaskLocalInterceptorRecord<TInput = any, TOutput = any> = {
30
+ interceptor: TaskLocalInterceptor<TInput, TOutput>;
31
+ ownerResourceId?: string;
28
32
  };
29
33
  export type HookStoreElementType<D extends DependencyMapType = any, TOn extends "*" | IEventDefinition = any> = {
30
34
  hook: IHook<D, TOn>;
@@ -5,7 +5,7 @@
5
5
  * @internal
6
6
  */
7
7
  export declare const symbolTask: unique symbol;
8
- /** Marks a task as a phantom task (no-op run; meant to be tunneled/routed). */
8
+ /** Marks a task as a phantom task (throws when unrouted; meant to be tunneled/routed). */
9
9
  export declare const symbolPhantomTask: unique symbol;
10
10
  export declare const symbolResource: unique symbol;
11
11
  /** @internal Generic fork provenance metadata for definitions that support `.fork()` */
@@ -20,6 +20,7 @@ export interface ITag<TConfig = void, TEnforceInputContract = void, TEnforceOutp
20
20
  */
21
21
  readonly __configHasOnlyOptionalKeys: RequiredKeys<TConfig> extends never ? true : false;
22
22
  config?: TConfig;
23
+ meta: ITagMeta;
23
24
  /**
24
25
  * Checks if the tag exists in a taggable or a list of tags.
25
26
  */
@@ -2,8 +2,8 @@ import type { HasInputContracts, HasOutputContracts, InferInputOrViolationFromCo
2
2
  import type { IResource } from "./resource";
3
3
  import type { ITask } from "./task";
4
4
  import type { ITag } from "./tag";
5
- type TagInputContract<TTag extends ITag<any, any, any>> = HasInputContracts<[TTag]> extends true ? InferInputOrViolationFromContracts<[TTag]> : any;
6
- type TagOutputContract<TTag extends ITag<any, any, any>> = HasOutputContracts<[TTag]> extends true ? InferOutputOrViolationFromContracts<[TTag]> : any;
5
+ type TagInputContract<TTag extends ITag<any, any, any>> = HasInputContracts<[TTag]> extends true ? InferInputOrViolationFromContracts<[TTag]> : unknown;
6
+ type TagOutputContract<TTag extends ITag<any, any, any>> = HasOutputContracts<[TTag]> extends true ? InferOutputOrViolationFromContracts<[TTag]> : unknown;
7
7
  export type AnyResource = IResource<any, any, any, any, any, any, any>;
8
8
  /**
9
9
  * A task discovered by a concrete tag. If the tag carries contracts,
@@ -10,7 +10,7 @@ export type { DependencyMapType, DependencyValuesType, IOptionalDependency, } fr
10
10
  export type { TaskMiddlewareAttachmentType } from "./taskMiddleware";
11
11
  export type { TagType } from "./tag";
12
12
  export type { ITaskMeta } from "./meta";
13
- export interface ITaskDefinition<TInput = undefined, TOutput extends Promise<any> = any, TDependencies extends DependencyMapType = {}, TMeta extends ITaskMeta = any, TTags extends TagType[] = TagType[], TMiddleware extends TaskMiddlewareAttachmentType[] = TaskMiddlewareAttachmentType[]> {
13
+ export interface ITaskDefinition<TInput = undefined, TOutput extends Promise<unknown> = Promise<unknown>, TDependencies extends DependencyMapType = {}, TMeta extends ITaskMeta = any, TTags extends TagType[] = TagType[], TMiddleware extends TaskMiddlewareAttachmentType[] = TaskMiddlewareAttachmentType[]> {
14
14
  id: string;
15
15
  /**
16
16
  * Access other tasks/resources/events. Can be an object or a function when
@@ -50,7 +50,7 @@ export interface ITaskDefinition<TInput = undefined, TOutput extends Promise<any
50
50
  */
51
51
  tags?: TTags;
52
52
  }
53
- export interface ITask<TInput = any, TOutput extends Promise<any> = any, TDependencies extends DependencyMapType = {}, TMeta extends ITaskMeta = any, TTags extends TagType[] = TagType[], TMiddleware extends TaskMiddlewareAttachmentType[] = TaskMiddlewareAttachmentType[]> extends ITaskDefinition<TInput, TOutput, TDependencies, TMeta, TTags, TMiddleware> {
53
+ export interface ITask<TInput = any, TOutput extends Promise<unknown> = Promise<unknown>, TDependencies extends DependencyMapType = {}, TMeta extends ITaskMeta = any, TTags extends TagType[] = TagType[], TMiddleware extends TaskMiddlewareAttachmentType[] = TaskMiddlewareAttachmentType[]> extends ITaskDefinition<TInput, TOutput, TDependencies, TMeta, TTags, TMiddleware> {
54
54
  [symbolFilePath]: string;
55
55
  [symbolTask]: true;
56
56
  /** Present only for phantom tasks. */
@@ -70,7 +70,7 @@ export interface ITask<TInput = any, TOutput extends Promise<any> = any, TDepend
70
70
  tags: TTags;
71
71
  }
72
72
  export type AnyTask = ITask<any, any, any, any, any, any>;
73
- /** Narrowed type for phantom tasks (no-op run by default). */
73
+ /** Narrowed type for phantom tasks (throws unless routed through a tunnel). */
74
74
  export type IPhantomTask<TInput = any, TResolved = any, TDependencies extends DependencyMapType = {}, TMeta extends ITaskMeta = any, TTags extends TagType[] = TagType[], TMiddleware extends TaskMiddlewareAttachmentType[] = TaskMiddlewareAttachmentType[]> = ITask<TInput, Promise<TResolved>, TDependencies, TMeta, TTags, TMiddleware> & {
75
75
  [symbolPhantomTask]: true;
76
76
  };
@@ -5,6 +5,7 @@ import { TagType } from "./tag";
5
5
  import { IMiddlewareMeta } from "./meta";
6
6
  import { symbolFilePath, symbolMiddlewareConfigured, symbolTaskMiddleware } from "./symbols";
7
7
  import { IContractable } from "./contracts";
8
+ import type { ThrowsList } from "./error";
8
9
  export type { DependencyMapType, DependencyValuesType } from "./utilities";
9
10
  export type { TagType } from "./tag";
10
11
  export type { IMiddlewareMeta } from "./meta";
@@ -23,6 +24,11 @@ export interface ITaskMiddlewareDefinition<TConfig = any, TEnforceInputContract
23
24
  run: (input: ITaskMiddlewareExecutionInput<TEnforceInputContract extends void ? any : TEnforceInputContract, TEnforceOutputContract extends void ? any : TEnforceOutputContract>, dependencies: DependencyValuesType<TDependencies>, config: TConfig) => Promise<any>;
24
25
  meta?: IMiddlewareMeta;
25
26
  tags?: TagType[];
27
+ /**
28
+ * Declares which typed errors are part of this middleware's contract.
29
+ * Declarative only — does not imply DI or enforcement.
30
+ */
31
+ throws?: ThrowsList;
26
32
  everywhere?: boolean | ((task: ITask<any, any, any, any>) => boolean);
27
33
  }
28
34
  export interface ITaskMiddleware<TConfig = any, TEnforceInputContract = void, TEnforceOutputContract = void, TDependencies extends DependencyMapType = any> extends ITaskMiddlewareDefinition<TConfig, TEnforceInputContract, TEnforceOutputContract, TDependencies>, IContractable<TConfig, TEnforceInputContract, TEnforceOutputContract> {
@@ -30,6 +36,8 @@ export interface ITaskMiddleware<TConfig = any, TEnforceInputContract = void, TE
30
36
  [symbolFilePath]: string;
31
37
  id: string;
32
38
  dependencies: TDependencies | ((config: TConfig) => TDependencies);
39
+ /** Normalized list of error ids declared via `throws`. */
40
+ throws?: readonly string[];
33
41
  /** Current configuration object (empty by default). */
34
42
  config: TConfig;
35
43
  /** Configure the middleware and return a marked, configured instance. */
@@ -3,7 +3,7 @@ import { ITask } from "./task";
3
3
  import { ITaskMiddleware } from "./taskMiddleware";
4
4
  import { IResourceMiddleware } from "./resourceMiddleware";
5
5
  import { IHook } from "./hook";
6
- import { IEvent, IEventDefinition } from "./event";
6
+ import { IEvent, IEventDefinition, IEventEmitOptions, IEventEmitReport } from "./event";
7
7
  import { ITag } from "./tag";
8
8
  import { symbolOptionalDependency } from "./symbols";
9
9
  import { IErrorHelper } from "./error";
@@ -14,7 +14,7 @@ export * from "./symbols";
14
14
  * Generic validation schema interface that can be implemented by any validation library.
15
15
  * Compatible with Zod, Yup, Joi, and other validation libraries.
16
16
  */
17
- export interface IValidationSchema<T = any> {
17
+ export interface IValidationSchema<T = unknown> {
18
18
  /**
19
19
  * Parse and validate the input data.
20
20
  * Should throw an error if validation fails.
@@ -93,7 +93,28 @@ export type ResourceDependency<V> = V;
93
93
  * Event dependencies resolve to an emitter function. If the payload type is
94
94
  * `void`, the function can be called with zero args (or an empty object).
95
95
  */
96
- export type EventDependency<P> = P extends void ? (() => Promise<void>) & ((input?: Record<string, never>) => Promise<void>) : (input: P) => Promise<void>;
96
+ type EventEmitVoidDependency = {
97
+ (): Promise<void>;
98
+ (input?: Record<string, never>): Promise<void>;
99
+ (input: Record<string, never> | undefined, options: IEventEmitOptions & {
100
+ report: true;
101
+ }): Promise<IEventEmitReport>;
102
+ (input: Record<string, never> | undefined, options?: IEventEmitOptions & {
103
+ report?: false | undefined;
104
+ }): Promise<void>;
105
+ (input: Record<string, never> | undefined, options?: IEventEmitOptions): Promise<void | IEventEmitReport>;
106
+ };
107
+ type EventEmitPayloadDependency<P> = {
108
+ (input: P): Promise<void>;
109
+ (input: P, options: IEventEmitOptions & {
110
+ report: true;
111
+ }): Promise<IEventEmitReport>;
112
+ (input: P, options?: IEventEmitOptions & {
113
+ report?: false | undefined;
114
+ }): Promise<void>;
115
+ (input: P, options?: IEventEmitOptions): Promise<void | IEventEmitReport>;
116
+ };
117
+ export type EventDependency<P> = P extends void ? EventEmitVoidDependency : EventEmitPayloadDependency<P>;
97
118
  /**
98
119
  * Transforms a dependency definition into the usable shape inside `run`/`init`:
99
120
  * - Task -> callable function
@@ -107,6 +128,7 @@ export type DependencyValuesType<T extends DependencyMapType> = {
107
128
  export type TaskLocalInterceptor<TInput, TOutput> = (next: (input: TInput) => TOutput, input: TInput) => TOutput;
108
129
  export type TaskDependencyWithIntercept<TInput, TOutput> = TaskDependency<TInput, TOutput> & {
109
130
  intercept: (middleware: TaskLocalInterceptor<TInput, TOutput>) => void;
131
+ getInterceptingResourceIds: () => readonly string[];
110
132
  };
111
133
  /** Resource-context dependency typing where tasks expose intercept() */
112
134
  export type ResourceDependencyValueType<T> = T extends ITask<any, any, any> ? TaskDependencyWithIntercept<ExtractTaskInput<T>, ExtractTaskOutput<T>> : T extends IResource<any, any> ? ResourceDependency<ExtractResourceValue<T>> : T extends IErrorHelper<any> ? T : T extends IAsyncContext<any> ? T : T extends IEventDefinition<any> ? EventDependency<ExtractEventPayload<T>> : T extends IOptionalDependency<infer U> ? ResourceDependencyValueType<U> | undefined : never;