@bluelibs/runner 4.6.1 → 4.7.0-alpha

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 (156) hide show
  1. package/AI.md +319 -579
  2. package/README.md +886 -731
  3. package/dist/browser/index.cjs +1438 -251
  4. package/dist/browser/index.cjs.map +1 -1
  5. package/dist/browser/index.mjs +1433 -252
  6. package/dist/browser/index.mjs.map +1 -1
  7. package/dist/context.d.ts +31 -0
  8. package/dist/define.d.ts +9 -0
  9. package/dist/definers/builders/core.d.ts +30 -0
  10. package/dist/definers/builders/event.d.ts +12 -0
  11. package/dist/definers/builders/hook.d.ts +20 -0
  12. package/dist/definers/builders/middleware.d.ts +39 -0
  13. package/dist/definers/builders/resource.d.ts +40 -0
  14. package/dist/definers/builders/tag.d.ts +10 -0
  15. package/dist/definers/builders/task.d.ts +37 -0
  16. package/dist/definers/builders/task.phantom.d.ts +27 -0
  17. package/dist/definers/builders/utils.d.ts +4 -0
  18. package/dist/definers/defineEvent.d.ts +2 -0
  19. package/dist/definers/defineHook.d.ts +6 -0
  20. package/dist/definers/defineOverride.d.ts +17 -0
  21. package/dist/definers/defineResource.d.ts +2 -0
  22. package/dist/definers/defineResourceMiddleware.d.ts +2 -0
  23. package/dist/definers/defineTag.d.ts +12 -0
  24. package/dist/definers/defineTask.d.ts +18 -0
  25. package/dist/definers/defineTaskMiddleware.d.ts +2 -0
  26. package/dist/definers/tools.d.ts +47 -0
  27. package/dist/defs.d.ts +29 -0
  28. package/dist/edge/index.cjs +1438 -251
  29. package/dist/edge/index.cjs.map +1 -1
  30. package/dist/edge/index.mjs +1433 -252
  31. package/dist/edge/index.mjs.map +1 -1
  32. package/dist/errors.d.ts +104 -0
  33. package/dist/globals/globalEvents.d.ts +8 -0
  34. package/dist/globals/globalMiddleware.d.ts +31 -0
  35. package/dist/globals/globalResources.d.ts +32 -0
  36. package/dist/globals/globalTags.d.ts +11 -0
  37. package/dist/globals/middleware/cache.middleware.d.ts +27 -0
  38. package/dist/globals/middleware/requireContext.middleware.d.ts +6 -0
  39. package/dist/globals/middleware/retry.middleware.d.ts +21 -0
  40. package/dist/globals/middleware/timeout.middleware.d.ts +9 -0
  41. package/dist/globals/middleware/tunnel.middleware.d.ts +2 -0
  42. package/dist/globals/resources/debug/debug.resource.d.ts +7 -0
  43. package/dist/globals/resources/debug/debug.tag.d.ts +2 -0
  44. package/dist/globals/resources/debug/debugConfig.resource.d.ts +22 -0
  45. package/dist/globals/resources/debug/executionTracker.middleware.d.ts +50 -0
  46. package/dist/globals/resources/debug/globalEvent.hook.d.ts +27 -0
  47. package/dist/globals/resources/debug/hook.hook.d.ts +30 -0
  48. package/dist/globals/resources/debug/index.d.ts +6 -0
  49. package/dist/globals/resources/debug/middleware.hook.d.ts +30 -0
  50. package/dist/globals/resources/debug/types.d.ts +25 -0
  51. package/dist/globals/resources/debug/utils.d.ts +2 -0
  52. package/dist/globals/resources/queue.resource.d.ts +10 -0
  53. package/dist/globals/resources/tunnel/ejson-extensions.d.ts +1 -0
  54. package/dist/globals/resources/tunnel/error-utils.d.ts +1 -0
  55. package/dist/globals/resources/tunnel/plan.d.ts +19 -0
  56. package/dist/globals/resources/tunnel/protocol.d.ts +40 -0
  57. package/dist/globals/resources/tunnel/serializer.d.ts +9 -0
  58. package/dist/globals/resources/tunnel/tunnel.policy.tag.d.ts +18 -0
  59. package/dist/globals/resources/tunnel/tunnel.tag.d.ts +2 -0
  60. package/dist/globals/resources/tunnel/types.d.ts +17 -0
  61. package/dist/globals/tunnels/index.d.ts +23 -0
  62. package/dist/globals/types.d.ts +1 -0
  63. package/dist/http-client.d.ts +23 -0
  64. package/dist/http-fetch-tunnel.resource.d.ts +22 -0
  65. package/dist/index.d.ts +99 -0
  66. package/dist/models/DependencyProcessor.d.ts +48 -0
  67. package/dist/models/EventManager.d.ts +153 -0
  68. package/dist/models/LogPrinter.d.ts +55 -0
  69. package/dist/models/Logger.d.ts +85 -0
  70. package/dist/models/MiddlewareManager.d.ts +86 -0
  71. package/dist/models/OverrideManager.d.ts +13 -0
  72. package/dist/models/Queue.d.ts +26 -0
  73. package/dist/models/ResourceInitializer.d.ts +20 -0
  74. package/dist/models/RunResult.d.ts +35 -0
  75. package/dist/models/Semaphore.d.ts +61 -0
  76. package/dist/models/Store.d.ts +69 -0
  77. package/dist/models/StoreRegistry.d.ts +43 -0
  78. package/dist/models/StoreValidator.d.ts +8 -0
  79. package/dist/models/TaskRunner.d.ts +27 -0
  80. package/dist/models/UnhandledError.d.ts +11 -0
  81. package/dist/models/index.d.ts +11 -0
  82. package/dist/models/utils/findCircularDependencies.d.ts +16 -0
  83. package/dist/models/utils/safeStringify.d.ts +3 -0
  84. package/dist/node/exposure/allowList.d.ts +3 -0
  85. package/dist/node/exposure/authenticator.d.ts +6 -0
  86. package/dist/node/exposure/cors.d.ts +4 -0
  87. package/dist/node/exposure/createNodeExposure.d.ts +2 -0
  88. package/dist/node/exposure/exposureServer.d.ts +18 -0
  89. package/dist/node/exposure/httpResponse.d.ts +10 -0
  90. package/dist/node/exposure/logging.d.ts +4 -0
  91. package/dist/node/exposure/multipart.d.ts +27 -0
  92. package/dist/node/exposure/requestBody.d.ts +11 -0
  93. package/dist/node/exposure/requestContext.d.ts +17 -0
  94. package/dist/node/exposure/requestHandlers.d.ts +24 -0
  95. package/dist/node/exposure/resourceTypes.d.ts +60 -0
  96. package/dist/node/exposure/router.d.ts +17 -0
  97. package/dist/node/exposure/serverLifecycle.d.ts +13 -0
  98. package/dist/node/exposure/types.d.ts +31 -0
  99. package/dist/node/exposure/utils.d.ts +17 -0
  100. package/dist/node/exposure.resource.d.ts +12 -0
  101. package/dist/node/files.d.ts +9 -0
  102. package/dist/node/http-smart-client.model.d.ts +22 -0
  103. package/dist/node/index.d.ts +1 -0
  104. package/dist/node/inputFile.model.d.ts +22 -0
  105. package/dist/node/inputFile.utils.d.ts +14 -0
  106. package/dist/node/mixed-http-client.node.d.ts +27 -0
  107. package/dist/node/node.cjs +11168 -0
  108. package/dist/node/node.cjs.map +1 -0
  109. package/dist/node/node.d.ts +6 -0
  110. package/dist/node/node.mjs +11099 -0
  111. package/dist/node/node.mjs.map +1 -0
  112. package/dist/node/platform/createFile.d.ts +9 -0
  113. package/dist/node/tunnel.allowlist.d.ts +7 -0
  114. package/dist/node/upload/manifest.d.ts +22 -0
  115. package/dist/platform/adapters/browser.d.ts +14 -0
  116. package/dist/platform/adapters/edge.d.ts +5 -0
  117. package/dist/platform/adapters/node-als.d.ts +1 -0
  118. package/dist/platform/adapters/node.d.ts +15 -0
  119. package/dist/platform/adapters/universal-generic.d.ts +14 -0
  120. package/dist/platform/adapters/universal.d.ts +17 -0
  121. package/dist/platform/createFile.d.ts +10 -0
  122. package/dist/platform/createWebFile.d.ts +11 -0
  123. package/dist/platform/factory.d.ts +2 -0
  124. package/dist/platform/index.d.ts +27 -0
  125. package/dist/platform/types.d.ts +29 -0
  126. package/dist/processHooks.d.ts +2 -0
  127. package/dist/run.d.ts +14 -0
  128. package/dist/testing.d.ts +25 -0
  129. package/dist/tools/getCallerFile.d.ts +1 -0
  130. package/dist/tunnels/buildUniversalManifest.d.ts +24 -0
  131. package/dist/types/contracts.d.ts +63 -0
  132. package/dist/types/event.d.ts +74 -0
  133. package/dist/types/hook.d.ts +23 -0
  134. package/dist/types/inputFile.d.ts +34 -0
  135. package/dist/types/meta.d.ts +18 -0
  136. package/dist/types/resource.d.ts +87 -0
  137. package/dist/types/resourceMiddleware.d.ts +47 -0
  138. package/dist/types/runner.d.ts +55 -0
  139. package/dist/types/storeTypes.d.ts +40 -0
  140. package/dist/types/symbols.d.ts +28 -0
  141. package/dist/types/tag.d.ts +46 -0
  142. package/dist/types/task.d.ts +50 -0
  143. package/dist/types/taskMiddleware.d.ts +48 -0
  144. package/dist/types/utilities.d.ts +111 -0
  145. package/dist/universal/index.cjs +1438 -251
  146. package/dist/universal/index.cjs.map +1 -1
  147. package/dist/universal/index.mjs +1433 -252
  148. package/dist/universal/index.mjs.map +1 -1
  149. package/package.json +32 -4
  150. package/dist/index.d.mts +0 -1747
  151. package/dist/index.unused.js +0 -4466
  152. package/dist/index.unused.js.map +0 -1
  153. package/dist/node/index.cjs +0 -4498
  154. package/dist/node/index.cjs.map +0 -1
  155. package/dist/node/index.mjs +0 -4466
  156. package/dist/node/index.mjs.map +0 -1
@@ -0,0 +1,55 @@
1
+ import { DebugFriendlyConfig } from "../globals/resources/debug";
2
+ import { LogLevels, PrintStrategy } from "../models/Logger";
3
+ import { OnUnhandledError } from "../models/UnhandledError";
4
+ export type RunOptions = {
5
+ /**
6
+ * Defaults to undefined. If true, we introduce logging to the console.
7
+ */
8
+ debug?: DebugFriendlyConfig;
9
+ /**
10
+ * Configure logging settings.
11
+ */
12
+ logs?: {
13
+ /**
14
+ * Defaults to info. Use null to disable logging.
15
+ */
16
+ printThreshold?: null | LogLevels;
17
+ /**
18
+ * Defaults to PRETTY. How to print the logs.
19
+ */
20
+ printStrategy?: PrintStrategy;
21
+ /**
22
+ * Defaults to false. If true, we buffer logs until the root resource is ready.
23
+ * This provides you with the chance to see the logs before the root resource is ready.
24
+ */
25
+ bufferLogs?: boolean;
26
+ };
27
+ /**
28
+ * When true (default), installs a central error boundary that catches uncaught errors
29
+ * from process-level events and routes them to `onUnhandledError`.
30
+ */
31
+ errorBoundary?: boolean;
32
+ /**
33
+ * When true (default), installs SIGINT/SIGTERM handlers that call dispose() on the root allowing for graceful shutdown.
34
+ */
35
+ shutdownHooks?: boolean;
36
+ /**
37
+ * Custom handler for any unhandled error caught by Runner. Defaults to logging via the created logger.
38
+ */
39
+ onUnhandledError?: OnUnhandledError;
40
+ /**
41
+ * Defaults to false.
42
+ *
43
+ * Dry run mode. When true, the runner will setup the system, ensure there are no errors, but will not start the system.
44
+ * Your resources will not be initialized, and no events will be emitted. This is useful for testing and debugging.
45
+ *
46
+ * Note: this cannot catch init() errors that happen within resources.
47
+ */
48
+ dryRun?: boolean;
49
+ /**
50
+ * Defaults to true.
51
+ * When set, forces runtime cycle detection for event emissions. Disable if you're sure
52
+ * you don't have event deadlocks to improve event emission performance.
53
+ */
54
+ runtimeCycleDetection?: boolean;
55
+ };
@@ -0,0 +1,40 @@
1
+ import { DependencyMapType, DependencyValuesType, ResourceDependencyValuesType } from "./utilities";
2
+ import { IResource } from "./resource";
3
+ import { ITask } from "./task";
4
+ import { IHook } from "./hook";
5
+ import { ITaskMiddleware } from "./taskMiddleware";
6
+ import { IResourceMiddleware } from "./resourceMiddleware";
7
+ import { IEvent } from "./event";
8
+ import { IEventDefinition } from "./event";
9
+ import { TaskLocalInterceptor } from "./utilities";
10
+ export type ResourceStoreElementType<C = any, V extends Promise<any> = any, D extends DependencyMapType = {}, TContext = any> = {
11
+ resource: IResource<C, V, D>;
12
+ computedDependencies?: ResourceDependencyValuesType<D>;
13
+ config: C;
14
+ value: V;
15
+ context: TContext;
16
+ isInitialized?: boolean;
17
+ };
18
+ export type TaskStoreElementType<Input = any, Output extends Promise<any> = any, D extends DependencyMapType = any> = {
19
+ task: ITask<Input, Output, D>;
20
+ computedDependencies: DependencyValuesType<D>;
21
+ isInitialized: boolean;
22
+ interceptors?: Array<TaskLocalInterceptor<any, any>>;
23
+ };
24
+ export type HookStoreElementType<D extends DependencyMapType = any, TOn extends "*" | IEventDefinition = any> = {
25
+ hook: IHook<D, TOn>;
26
+ computedDependencies: DependencyValuesType<D>;
27
+ };
28
+ export type TaskMiddlewareStoreElementType<TDeps extends DependencyMapType = any> = {
29
+ middleware: ITaskMiddleware<any, TDeps>;
30
+ computedDependencies: DependencyValuesType<TDeps>;
31
+ isInitialized: boolean;
32
+ };
33
+ export type ResourceMiddlewareStoreElementType<TDeps extends DependencyMapType = any> = {
34
+ middleware: IResourceMiddleware<any, TDeps>;
35
+ computedDependencies: DependencyValuesType<TDeps>;
36
+ isInitialized: boolean;
37
+ };
38
+ export type EventStoreElementType = {
39
+ event: IEvent<any>;
40
+ };
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Internal brand symbols used to tag created objects at runtime and help with
3
+ * type‑narrowing. Prefer the `isTask`/`isResource`/`isEvent`/`isMiddleware`
4
+ * helpers instead of touching these directly.
5
+ * @internal
6
+ */
7
+ export declare const symbolTask: unique symbol;
8
+ /** Marks a task as a phantom task (no-op run; meant to be tunneled/routed). */
9
+ export declare const symbolPhantomTask: unique symbol;
10
+ export declare const symbolResource: unique symbol;
11
+ export declare const symbolResourceWithConfig: unique symbol;
12
+ export declare const symbolEvent: unique symbol;
13
+ export declare const symbolMiddleware: unique symbol;
14
+ /** New brands for separated middleware kinds */
15
+ export declare const symbolTaskMiddleware: unique symbol;
16
+ export declare const symbolResourceMiddleware: unique symbol;
17
+ export declare const symbolMiddlewareConfigured: unique symbol;
18
+ /** Marks a task that has been patched by a tunnel. Value is the local side mode. */
19
+ export declare const symbolTunneledTask: unique symbol;
20
+ /** @internal Marks hook definitions (event listeners without middleware) */
21
+ export declare const symbolHook: unique symbol;
22
+ /** @internal Marks a tag definition */
23
+ export declare const symbolTag: unique symbol;
24
+ export declare const symbolTagConfigured: unique symbol;
25
+ /** @internal Marks an optional dependency wrapper */
26
+ export declare const symbolOptionalDependency: unique symbol;
27
+ /** @internal Path to aid anonymous id generation and error messages */
28
+ export declare const symbolFilePath: unique symbol;
@@ -0,0 +1,46 @@
1
+ import { IContractable } from "./contracts";
2
+ import { ITagMeta } from "./meta";
3
+ import { IValidationSchema, RequiredKeys, symbolFilePath, symbolTag, symbolTagConfigured } from "./utilities";
4
+ export interface ITaggable {
5
+ tags: TagType[];
6
+ }
7
+ export interface ITagDefinition<TConfig = void, TEnforceInputContract = void, TEnforceOutputContract = void> {
8
+ id: string;
9
+ meta?: ITagMeta;
10
+ configSchema?: IValidationSchema<TConfig>;
11
+ /**
12
+ * Utilizing config at definition level stores its defaults
13
+ */
14
+ config?: TConfig;
15
+ }
16
+ export interface ITag<TConfig = void, TEnforceInputContract = void, TEnforceOutputContract = void> extends ITagDefinition<TConfig, TEnforceInputContract, TEnforceOutputContract>, IContractable<TConfig, TEnforceInputContract, TEnforceOutputContract> {
17
+ /**
18
+ * A special validation property.
19
+ * It resolves to `true` if TConfig only has optional keys, otherwise `false`.
20
+ */
21
+ readonly __configHasOnlyOptionalKeys: RequiredKeys<TConfig> extends never ? true : false;
22
+ config?: TConfig;
23
+ /**
24
+ * Checks if the tag exists in a taggable or a list of tags.
25
+ */
26
+ exists(target: ITaggable | TagType[]): boolean;
27
+ /**
28
+ * Creates a configured instance of the tag.
29
+ */
30
+ with(config: TConfig): ITagConfigured<TConfig, TEnforceInputContract, TEnforceOutputContract>;
31
+ /**
32
+ * Extracts the configuration of the tag from a taggable or a list of tags.
33
+ */
34
+ extract(target: ITaggable | TagType[]): TConfig | undefined;
35
+ [symbolFilePath]: string;
36
+ [symbolTag]: true;
37
+ }
38
+ type ITagWithOptionalConfig<TValue, TEnforceInputContract, TEnforceOutputContract> = ITag<any, TEnforceInputContract, TEnforceOutputContract> & {
39
+ readonly __configHasOnlyOptionalKeys: true;
40
+ };
41
+ export interface ITagConfigured<TConfig = void, TEnforceInputContract = void, TEnforceOutputContract = void> extends ITag<TConfig, TEnforceInputContract, TEnforceOutputContract> {
42
+ [symbolTagConfigured]: true;
43
+ config: TConfig;
44
+ }
45
+ export type TagType = ITag<void, any, any> | ITagWithOptionalConfig<any, any, any> | ITagConfigured<any, any, any>;
46
+ export {};
@@ -0,0 +1,50 @@
1
+ import { DependencyMapType, DependencyValuesType, IOptionalDependency, IValidationSchema, TaskMiddlewareAttachmentType } from "../defs";
2
+ import { TagType } from "./tag";
3
+ import { ITaskMeta } from "./meta";
4
+ import { symbolFilePath, symbolTask, symbolPhantomTask } from "./symbols";
5
+ import { EnsureInputSatisfiesContracts, EnsureOutputSatisfiesContracts, HasInputContracts, HasOutputContracts, InferInputOrViolationFromContracts } from "./contracts";
6
+ 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[]> {
7
+ id: string;
8
+ /**
9
+ * Access other tasks/resources/events. Can be an object or a function when
10
+ * you need late or config‑dependent resolution.
11
+ */
12
+ dependencies?: TDependencies | (() => TDependencies);
13
+ /** Middleware applied around task execution. */
14
+ middleware?: TMiddleware;
15
+ /** Optional metadata used for docs, filtering and tooling. */
16
+ meta?: TMeta;
17
+ /**
18
+ * Optional validation schema for runtime input validation.
19
+ * When provided, task input will be validated before execution.
20
+ */
21
+ inputSchema?: IValidationSchema<TInput>;
22
+ /**
23
+ * Optional validation schema for the task result.
24
+ * When provided, the result will be validated immediately after the task's
25
+ * `run` resolves, without considering middleware.
26
+ */
27
+ resultSchema?: IValidationSchema<TOutput extends Promise<infer U> ? U : never>;
28
+ run: (input: HasInputContracts<[...TTags, ...TMiddleware]> extends true ? [TInput] extends [undefined] ? InferInputOrViolationFromContracts<[...TTags, ...TMiddleware]> : EnsureInputSatisfiesContracts<[...TTags, ...TMiddleware], TInput> : TInput, dependencies: DependencyValuesType<TDependencies>) => HasOutputContracts<[...TTags, ...TMiddleware]> extends true ? EnsureOutputSatisfiesContracts<[...TTags, ...TMiddleware], TOutput> : TOutput;
29
+ /**
30
+ * Tags applied to the task that might define its behvaiour or impact the systems.
31
+ */
32
+ tags?: TTags;
33
+ }
34
+ 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> {
35
+ [symbolFilePath]: string;
36
+ [symbolTask]: true;
37
+ /** Present only for phantom tasks. */
38
+ [symbolPhantomTask]?: true;
39
+ id: string;
40
+ dependencies: TDependencies | (() => TDependencies);
41
+ computedDependencies?: DependencyValuesType<TDependencies>;
42
+ middleware: TMiddleware;
43
+ /** Return an optional dependency wrapper for this task. */
44
+ optional: () => IOptionalDependency<ITask<TInput, TOutput, TDependencies, TMeta, TTags, TMiddleware>>;
45
+ tags: TTags;
46
+ }
47
+ /** Narrowed type for phantom tasks (no-op run by default). */
48
+ 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> & {
49
+ [symbolPhantomTask]: true;
50
+ };
@@ -0,0 +1,48 @@
1
+ import { DependencyMapType, DependencyValuesType, IValidationSchema, ITask } from "../defs";
2
+ import { TagType } from "./tag";
3
+ import { IMiddlewareMeta } from "./meta";
4
+ import { symbolFilePath, symbolMiddlewareConfigured, symbolTaskMiddleware } from "./symbols";
5
+ import { IContractable } from "./contracts";
6
+ export interface ITaskMiddlewareDefinition<TConfig = any, TEnforceInputContract = void, TEnforceOutputContract = void, TDependencies extends DependencyMapType = any> {
7
+ id: string;
8
+ /** Static or lazy dependency map. */
9
+ dependencies?: TDependencies | ((config: TConfig) => TDependencies);
10
+ /**
11
+ * Optional validation schema for runtime config validation.
12
+ * When provided, middleware config will be validated when .with() is called.
13
+ */
14
+ configSchema?: IValidationSchema<TConfig>;
15
+ /**
16
+ * The middleware body, called with task execution input.
17
+ */
18
+ run: (input: ITaskMiddlewareExecutionInput<TEnforceInputContract extends void ? any : TEnforceInputContract, TEnforceOutputContract extends void ? any : TEnforceOutputContract>, dependencies: DependencyValuesType<TDependencies>, config: TConfig) => Promise<any>;
19
+ meta?: IMiddlewareMeta;
20
+ tags?: TagType[];
21
+ everywhere?: boolean | ((task: ITask<any, any, any, any>) => boolean);
22
+ }
23
+ export interface ITaskMiddleware<TConfig = any, TEnforceInputContract = void, TEnforceOutputContract = void, TDependencies extends DependencyMapType = any> extends ITaskMiddlewareDefinition<TConfig, TEnforceInputContract, TEnforceOutputContract, TDependencies>, IContractable<TConfig, TEnforceInputContract, TEnforceOutputContract> {
24
+ [symbolTaskMiddleware]: true;
25
+ [symbolFilePath]: string;
26
+ id: string;
27
+ dependencies: TDependencies | (() => TDependencies);
28
+ /** Current configuration object (empty by default). */
29
+ config: TConfig;
30
+ /** Configure the middleware and return a marked, configured instance. */
31
+ with: (config: TConfig) => ITaskMiddlewareConfigured<TConfig, TEnforceInputContract, TEnforceOutputContract, TDependencies>;
32
+ tags: TagType[];
33
+ }
34
+ export interface ITaskMiddlewareConfigured<TConfig = any, TEnforceInputContract = void, TEnforceOutputContract = void, TDependencies extends DependencyMapType = any> extends ITaskMiddleware<TConfig, TEnforceInputContract, TEnforceOutputContract, TDependencies> {
35
+ [symbolMiddlewareConfigured]: true;
36
+ config: TConfig;
37
+ }
38
+ export interface ITaskMiddlewareExecutionInput<TTaskInput = any, TTaskOutput = any> {
39
+ /** Task hook */
40
+ task: {
41
+ definition: ITask<TTaskInput, any, any, any>;
42
+ input: TTaskInput;
43
+ };
44
+ next: (taskInput?: TTaskInput) => Promise<TTaskOutput>;
45
+ }
46
+ export type TaskMiddlewareAttachmentType = ITaskMiddleware<void, any, any, any> | ITaskMiddleware<{
47
+ [K in any]?: any;
48
+ }, any, any, any> | ITaskMiddlewareConfigured<any, any, any, any>;
@@ -0,0 +1,111 @@
1
+ import { IResource, IResourceWithConfig } from "./resource";
2
+ import { ITask } from "./task";
3
+ import { ITaskMiddleware } from "./taskMiddleware";
4
+ import { IResourceMiddleware } from "./resourceMiddleware";
5
+ import { IHook } from "./hook";
6
+ import { IEvent, IEventDefinition } from "./event";
7
+ import { ITag } from "./tag";
8
+ import { symbolOptionalDependency } from "./symbols";
9
+ export * from "./symbols";
10
+ /**
11
+ * Generic validation schema interface that can be implemented by any validation library.
12
+ * Compatible with Zod, Yup, Joi, and other validation libraries.
13
+ */
14
+ export interface IValidationSchema<T = any> {
15
+ /**
16
+ * Parse and validate the input data.
17
+ * Should throw an error if validation fails.
18
+ * Can transform the data if the schema supports transformations.
19
+ */
20
+ parse(input: unknown): T;
21
+ }
22
+ /**
23
+ * Core public TypeScript types for BlueLibs Runner.
24
+ *
25
+ * This file contains the strongly-typed contract for tasks, resources, events
26
+ * and middleware. It mirrors the mental model described in the README:
27
+ * - Tasks are functions
28
+ * - Resources are singletons (with init/dispose hooks)
29
+ * - Events are simple, strongly-typed emissions
30
+ * - Middleware can target both tasks and resources
31
+ *
32
+ * DX goals:
33
+ * - Crystal‑clear generics and helper types that infer dependency shapes
34
+ * - Friendly JSDoc you can hover in editors to understand usage instantly
35
+ * - Safe overrides and strong typing around config and register mechanics
36
+ */
37
+ export type RequiredKeys<T> = {
38
+ [K in keyof T]-?: {} extends Pick<T, K> ? never : K;
39
+ }[keyof T];
40
+ /**
41
+ * The reason we accept null and undefined is because we want to be able to offer beautiful DX:
42
+ * overrides: [
43
+ * process.env.NODE_ENV === 'production' ? prodEmailer : null,
44
+ * ]
45
+ */
46
+ export type OverridableElements = IResource<any, any, any, any, any> | ITask<any, any, any, any> | ITaskMiddleware<any> | IResourceMiddleware<any, any> | IResourceWithConfig<any, any, any> | IHook<any, any> | undefined | null;
47
+ /**
48
+ * A mapping of dependency keys to Runner definitions. Used in `dependencies`
49
+ * for tasks and resources. Values are later transformed into the actual
50
+ * callable/value shape by `DependencyValuesType`.
51
+ */
52
+ export type DependencyMapType = Record<string, ITask<any, any, any, any, any, any> | IResource<any, any, any, any, any, any, any> | IEvent<any> | IOptionalDependency<ITask<any, any, any, any, any, any>> | IOptionalDependency<IResource<any, any, any, any, any, any, any>> | IOptionalDependency<IEvent<any>>>;
53
+ /** Wrapper type marking a dependency as optional at wiring time */
54
+ export interface IOptionalDependency<T> {
55
+ /** The wrapped dependency definition */
56
+ inner: T;
57
+ /** Brand symbol for optional dependency */
58
+ [symbolOptionalDependency]: true;
59
+ }
60
+ export type ExtractTaskInput<T> = T extends ITask<infer I, any, infer D> ? I : never;
61
+ export type ExtractTaskOutput<T> = T extends ITask<any, infer O, infer D> ? O : never;
62
+ export type ExtractResourceConfig<T> = T extends IResource<infer C, any, any> ? C : never;
63
+ export type ExtractResourceValue<T> = T extends IResource<any, infer V, infer D> ? V extends Promise<infer U> ? U : V : never;
64
+ export type ExtractEventPayload<T> = T extends IEventDefinition<infer P> ? P : T extends IEvent<infer P> ? P : never;
65
+ export type UnionToIntersection<U> = (U extends any ? (x: U) => any : never) extends (x: infer I) => any ? I : never;
66
+ export type CommonPayload<T extends readonly IEventDefinition<any>[] | IEventDefinition<any>> = T extends readonly IEventDefinition<any>[] ? {
67
+ [K in keyof ExtractEventPayload<T[number]>]: UnionToIntersection<ExtractEventPayload<T[number]> extends any ? ExtractEventPayload<T[number]>[K] : never>;
68
+ } : ExtractEventPayload<T>;
69
+ /**
70
+ * Task dependencies transform into callable functions: call with the task input
71
+ * and you receive the task output.
72
+ */
73
+ type TaskDependency<I, O> = (...args: I extends null | void ? [] : [I]) => O;
74
+ /**
75
+ * Resource dependencies resolve to the resource's value directly.
76
+ */
77
+ type ResourceDependency<V> = V;
78
+ /**
79
+ * Event dependencies resolve to an emitter function. If the payload type is
80
+ * `void`, the function can be called with zero args (or an empty object).
81
+ */
82
+ type EventDependency<P> = P extends void ? (() => Promise<void>) & ((input?: Record<string, never>) => Promise<void>) : (input: P) => Promise<void>;
83
+ /**
84
+ * Transforms a dependency definition into the usable shape inside `run`/`init`:
85
+ * - Task -> callable function
86
+ * - Resource -> resolved value
87
+ * - Event -> emit function
88
+ */
89
+ export type DependencyValueType<T> = T extends ITask<any, any, any> ? TaskDependency<ExtractTaskInput<T>, ExtractTaskOutput<T>> : T extends IResource<any, any> ? ResourceDependency<ExtractResourceValue<T>> : T extends IEventDefinition<any> ? EventDependency<ExtractEventPayload<T>> : T extends IOptionalDependency<infer U> ? DependencyValueType<U> | undefined : never;
90
+ export type DependencyValuesType<T extends DependencyMapType> = {
91
+ [K in keyof T]: DependencyValueType<T[K]>;
92
+ };
93
+ export type TaskLocalInterceptor<TInput, TOutput> = (next: (input: TInput) => TOutput, input: TInput) => TOutput;
94
+ export type TaskDependencyWithIntercept<TInput, TOutput> = TaskDependency<TInput, TOutput> & {
95
+ intercept: (middleware: TaskLocalInterceptor<TInput, TOutput>) => void;
96
+ };
97
+ /** Resource-context dependency typing where tasks expose intercept() */
98
+ 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 IEventDefinition<any> ? EventDependency<ExtractEventPayload<T>> : T extends IOptionalDependency<infer U> ? ResourceDependencyValueType<U> | undefined : never;
99
+ export type ResourceDependencyValuesType<T extends DependencyMapType> = {
100
+ [K in keyof T]: ResourceDependencyValueType<T[K]>;
101
+ };
102
+ /**
103
+ * Anything you can put inside a resource's `register: []`.
104
+ * - Resources (with or without `.with()`)
105
+ * - Tasks
106
+ * - Middleware
107
+ * - Events
108
+ */
109
+ export type RegisterableItems = IResourceWithConfig<any, any, any, any, any, any, any> | IResource<void, any, any, any, any, any, any> | IResource<{
110
+ [K in any]?: any;
111
+ }, any, any, any, any, any, any> | ITask<any, any, any, any, any, any> | IHook<any, any> | ITaskMiddleware<any, any, any, any> | IResourceMiddleware<any, any, any, any> | IEvent<any> | ITag<any, any, any>;