@bluelibs/runner 2.2.3 → 3.0.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 (204) hide show
  1. package/README.md +1315 -942
  2. package/dist/common.types.d.ts +20 -0
  3. package/dist/common.types.js +4 -0
  4. package/dist/common.types.js.map +1 -0
  5. package/dist/context.d.ts +34 -0
  6. package/dist/context.js +58 -0
  7. package/dist/context.js.map +1 -0
  8. package/dist/define.d.ts +22 -3
  9. package/dist/define.js +52 -8
  10. package/dist/define.js.map +1 -1
  11. package/dist/defs.d.ts +52 -31
  12. package/dist/defs.js +10 -2
  13. package/dist/defs.js.map +1 -1
  14. package/dist/errors.js +1 -1
  15. package/dist/errors.js.map +1 -1
  16. package/dist/event.types.d.ts +18 -0
  17. package/dist/event.types.js +4 -0
  18. package/dist/event.types.js.map +1 -0
  19. package/dist/examples/registrator-example.d.ts +122 -0
  20. package/dist/examples/registrator-example.js +147 -0
  21. package/dist/examples/registrator-example.js.map +1 -0
  22. package/dist/globals/globalEvents.d.ts +41 -0
  23. package/dist/globals/globalEvents.js +94 -0
  24. package/dist/globals/globalEvents.js.map +1 -0
  25. package/dist/globals/globalMiddleware.d.ts +23 -0
  26. package/dist/globals/globalMiddleware.js +15 -0
  27. package/dist/globals/globalMiddleware.js.map +1 -0
  28. package/dist/globals/globalResources.d.ts +27 -0
  29. package/dist/globals/globalResources.js +47 -0
  30. package/dist/globals/globalResources.js.map +1 -0
  31. package/dist/globals/middleware/cache.middleware.d.ts +34 -0
  32. package/dist/globals/middleware/cache.middleware.js +85 -0
  33. package/dist/globals/middleware/cache.middleware.js.map +1 -0
  34. package/dist/globals/middleware/requireContext.middleware.d.ts +6 -0
  35. package/dist/globals/middleware/requireContext.middleware.js +25 -0
  36. package/dist/globals/middleware/requireContext.middleware.js.map +1 -0
  37. package/dist/globals/middleware/retry.middleware.d.ts +20 -0
  38. package/dist/globals/middleware/retry.middleware.js +34 -0
  39. package/dist/globals/middleware/retry.middleware.js.map +1 -0
  40. package/dist/globals/resources/queue.resource.d.ts +7 -0
  41. package/dist/globals/resources/queue.resource.js +31 -0
  42. package/dist/globals/resources/queue.resource.js.map +1 -0
  43. package/dist/index.d.ts +45 -9
  44. package/dist/index.js +14 -9
  45. package/dist/index.js.map +1 -1
  46. package/dist/middleware.types.d.ts +40 -0
  47. package/dist/middleware.types.js +4 -0
  48. package/dist/middleware.types.js.map +1 -0
  49. package/dist/models/DependencyProcessor.d.ts +2 -1
  50. package/dist/models/DependencyProcessor.js +11 -13
  51. package/dist/models/DependencyProcessor.js.map +1 -1
  52. package/dist/models/EventManager.d.ts +5 -0
  53. package/dist/models/EventManager.js +44 -2
  54. package/dist/models/EventManager.js.map +1 -1
  55. package/dist/models/Logger.d.ts +30 -12
  56. package/dist/models/Logger.js +130 -42
  57. package/dist/models/Logger.js.map +1 -1
  58. package/dist/models/OverrideManager.d.ts +13 -0
  59. package/dist/models/OverrideManager.js +70 -0
  60. package/dist/models/OverrideManager.js.map +1 -0
  61. package/dist/models/Queue.d.ts +25 -0
  62. package/dist/models/Queue.js +54 -0
  63. package/dist/models/Queue.js.map +1 -0
  64. package/dist/models/ResourceInitializer.d.ts +5 -2
  65. package/dist/models/ResourceInitializer.js +20 -14
  66. package/dist/models/ResourceInitializer.js.map +1 -1
  67. package/dist/models/Semaphore.d.ts +61 -0
  68. package/dist/models/Semaphore.js +166 -0
  69. package/dist/models/Semaphore.js.map +1 -0
  70. package/dist/models/Store.d.ts +17 -72
  71. package/dist/models/Store.js +71 -269
  72. package/dist/models/Store.js.map +1 -1
  73. package/dist/models/StoreConstants.d.ts +11 -0
  74. package/dist/models/StoreConstants.js +18 -0
  75. package/dist/models/StoreConstants.js.map +1 -0
  76. package/dist/models/StoreRegistry.d.ts +25 -0
  77. package/dist/models/StoreRegistry.js +171 -0
  78. package/dist/models/StoreRegistry.js.map +1 -0
  79. package/dist/models/StoreTypes.d.ts +21 -0
  80. package/dist/models/StoreTypes.js +3 -0
  81. package/dist/models/StoreTypes.js.map +1 -0
  82. package/dist/models/StoreValidator.d.ts +10 -0
  83. package/dist/models/StoreValidator.js +41 -0
  84. package/dist/models/StoreValidator.js.map +1 -0
  85. package/dist/models/TaskRunner.js +39 -24
  86. package/dist/models/TaskRunner.js.map +1 -1
  87. package/dist/models/VarStore.d.ts +17 -0
  88. package/dist/models/VarStore.js +60 -0
  89. package/dist/models/VarStore.js.map +1 -0
  90. package/dist/models/index.d.ts +3 -0
  91. package/dist/models/index.js +3 -0
  92. package/dist/models/index.js.map +1 -1
  93. package/dist/resource.types.d.ts +31 -0
  94. package/dist/resource.types.js +3 -0
  95. package/dist/resource.types.js.map +1 -0
  96. package/dist/run.d.ts +4 -1
  97. package/dist/run.js +6 -3
  98. package/dist/run.js.map +1 -1
  99. package/dist/symbols.d.ts +24 -0
  100. package/dist/symbols.js +29 -0
  101. package/dist/symbols.js.map +1 -0
  102. package/dist/task.types.d.ts +55 -0
  103. package/dist/task.types.js +23 -0
  104. package/dist/task.types.js.map +1 -0
  105. package/dist/tools/registratorId.d.ts +4 -0
  106. package/dist/tools/registratorId.js +40 -0
  107. package/dist/tools/registratorId.js.map +1 -0
  108. package/dist/tools/simpleHash.d.ts +9 -0
  109. package/dist/tools/simpleHash.js +34 -0
  110. package/dist/tools/simpleHash.js.map +1 -0
  111. package/dist/types/base-interfaces.d.ts +18 -0
  112. package/dist/types/base-interfaces.js +6 -0
  113. package/dist/types/base-interfaces.js.map +1 -0
  114. package/dist/types/base.d.ts +13 -0
  115. package/dist/types/base.js +3 -0
  116. package/dist/types/base.js.map +1 -0
  117. package/dist/types/dependencies.d.ts +22 -0
  118. package/dist/types/dependencies.js +3 -0
  119. package/dist/types/dependencies.js.map +1 -0
  120. package/dist/types/dependency-core.d.ts +14 -0
  121. package/dist/types/dependency-core.js +5 -0
  122. package/dist/types/dependency-core.js.map +1 -0
  123. package/dist/types/events.d.ts +52 -0
  124. package/dist/types/events.js +6 -0
  125. package/dist/types/events.js.map +1 -0
  126. package/dist/types/hooks.d.ts +16 -0
  127. package/dist/types/hooks.js +5 -0
  128. package/dist/types/hooks.js.map +1 -0
  129. package/dist/types/index.d.ts +14 -0
  130. package/dist/types/index.js +27 -0
  131. package/dist/types/index.js.map +1 -0
  132. package/dist/types/meta.d.ts +13 -0
  133. package/dist/types/meta.js +5 -0
  134. package/dist/types/meta.js.map +1 -0
  135. package/dist/types/middleware.d.ts +38 -0
  136. package/dist/types/middleware.js +6 -0
  137. package/dist/types/middleware.js.map +1 -0
  138. package/dist/types/registerable.d.ts +10 -0
  139. package/dist/types/registerable.js +5 -0
  140. package/dist/types/registerable.js.map +1 -0
  141. package/dist/types/resources.d.ts +44 -0
  142. package/dist/types/resources.js +5 -0
  143. package/dist/types/resources.js.map +1 -0
  144. package/dist/types/symbols.d.ts +24 -0
  145. package/dist/types/symbols.js +30 -0
  146. package/dist/types/symbols.js.map +1 -0
  147. package/dist/types/tasks.d.ts +41 -0
  148. package/dist/types/tasks.js +5 -0
  149. package/dist/types/tasks.js.map +1 -0
  150. package/dist/types/utilities.d.ts +7 -0
  151. package/dist/types/utilities.js +5 -0
  152. package/dist/types/utilities.js.map +1 -0
  153. package/package.json +10 -6
  154. package/src/__tests__/benchmark/benchmark.test.ts +1 -1
  155. package/src/__tests__/context.test.ts +91 -0
  156. package/src/__tests__/errors.test.ts +8 -5
  157. package/src/__tests__/globalEvents.test.ts +1 -1
  158. package/src/__tests__/globals/cache.middleware.test.ts +772 -0
  159. package/src/__tests__/globals/queue.resource.test.ts +141 -0
  160. package/src/__tests__/globals/requireContext.middleware.test.ts +98 -0
  161. package/src/__tests__/globals/retry.middleware.test.ts +157 -0
  162. package/src/__tests__/index.helper.test.ts +55 -0
  163. package/src/__tests__/models/EventManager.test.ts +144 -0
  164. package/src/__tests__/models/Logger.test.ts +291 -34
  165. package/src/__tests__/models/Queue.test.ts +189 -0
  166. package/src/__tests__/models/ResourceInitializer.test.ts +8 -6
  167. package/src/__tests__/models/Semaphore.test.ts +713 -0
  168. package/src/__tests__/models/Store.test.ts +40 -0
  169. package/src/__tests__/models/TaskRunner.test.ts +86 -5
  170. package/src/__tests__/run.middleware.test.ts +166 -12
  171. package/src/__tests__/run.overrides.test.ts +13 -10
  172. package/src/__tests__/run.test.ts +363 -12
  173. package/src/__tests__/setOutput.test.ts +244 -0
  174. package/src/__tests__/tools/getCallerFile.test.ts +9 -9
  175. package/src/__tests__/typesafety.test.ts +54 -39
  176. package/src/context.ts +86 -0
  177. package/src/define.ts +84 -14
  178. package/src/defs.ts +91 -41
  179. package/src/errors.ts +3 -1
  180. package/src/{globalEvents.ts → globals/globalEvents.ts} +13 -12
  181. package/src/globals/globalMiddleware.ts +14 -0
  182. package/src/{globalResources.ts → globals/globalResources.ts} +14 -10
  183. package/src/globals/middleware/cache.middleware.ts +115 -0
  184. package/src/globals/middleware/requireContext.middleware.ts +36 -0
  185. package/src/globals/middleware/retry.middleware.ts +56 -0
  186. package/src/globals/resources/queue.resource.ts +34 -0
  187. package/src/index.ts +9 -5
  188. package/src/models/DependencyProcessor.ts +36 -40
  189. package/src/models/EventManager.ts +45 -5
  190. package/src/models/Logger.ts +170 -48
  191. package/src/models/OverrideManager.ts +84 -0
  192. package/src/models/Queue.ts +66 -0
  193. package/src/models/ResourceInitializer.ts +38 -20
  194. package/src/models/Semaphore.ts +208 -0
  195. package/src/models/Store.ts +94 -342
  196. package/src/models/StoreConstants.ts +17 -0
  197. package/src/models/StoreRegistry.ts +217 -0
  198. package/src/models/StoreTypes.ts +46 -0
  199. package/src/models/StoreValidator.ts +38 -0
  200. package/src/models/TaskRunner.ts +53 -40
  201. package/src/models/index.ts +3 -0
  202. package/src/run.ts +7 -4
  203. package/src/__tests__/index.ts +0 -15
  204. package/src/examples/express-mongo/index.ts +0 -1
@@ -0,0 +1,10 @@
1
+ import type { IsVoid, OnlyOptionalFields } from './utilities';
2
+ import type { IResourceWithConfig } from './resources';
3
+ import type { IResource } from './resources';
4
+ import type { ITaskDefinition } from './tasks';
5
+ import type { IMiddlewareDefinition } from './middleware';
6
+ import type { IEventDefinition } from './events';
7
+ export type RegisterableItems<T = any> = IResourceWithConfig<any> | IResource<void, any, any, any> | IResource<{
8
+ [K in any]?: any;
9
+ }, any, any, any> | ITaskDefinition<any, any, any, any> | IMiddlewareDefinition<any> | IEventDefinition<any>;
10
+ export type ValidateRegisterable<T> = T extends IResource<infer Config, any, any, any> ? IsVoid<Config> extends true ? T : OnlyOptionalFields<Config> extends true ? T : never : T;
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ // Layer 4: Integration Types - Registerable Items
3
+ // Imports all component types to define what can be registered
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ //# sourceMappingURL=registerable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registerable.js","sourceRoot":"","sources":["../../src/types/registerable.ts"],"names":[],"mappings":";AAAA,kDAAkD;AAClD,+DAA+D"}
@@ -0,0 +1,44 @@
1
+ import type { IResourceMeta } from './meta';
2
+ import type { DependencyMapType, DependencyValuesType } from './dependency-core';
3
+ import type { IEventDefinition, BeforeInitEventPayload, AfterInitEventPayload, OnErrorEventPayload } from './events';
4
+ import type { IMiddleware } from './middleware';
5
+ import type { ITask } from './tasks';
6
+ import type { MiddlewareAttachments } from './tasks';
7
+ export interface IResourceDefinition<TConfig = any, TValue = unknown, TDependencies extends DependencyMapType = {}, TContext = any, THooks = any, TRegisterableItems = any> {
8
+ id: string;
9
+ dependencies?: TDependencies | ((config: TConfig) => TDependencies);
10
+ register?: Array<any> | ((config: TConfig) => Array<any>);
11
+ init?: (this: any, config: TConfig, dependencies: DependencyValuesType<TDependencies>, context: TContext) => Promise<TValue>;
12
+ /**
13
+ * Clean-up function for the resource. This is called when the resource is no longer needed.
14
+ *
15
+ * @param value The value of the resource (undefined if no init method)
16
+ * @param config The configuration it received
17
+ * @param dependencies The dependencies it needed
18
+ * @returns Promise<void>
19
+ */
20
+ dispose?: (this: any, value: TValue, config: TConfig, dependencies: DependencyValuesType<TDependencies>, context: TContext) => Promise<void>;
21
+ meta?: IResourceMeta;
22
+ overrides?: Array<IResource | ITask | IMiddleware | IResourceWithConfig>;
23
+ middleware?: MiddlewareAttachments[];
24
+ context?: () => TContext;
25
+ }
26
+ export interface IResource<TConfig = void, TValue = any, TDependencies extends DependencyMapType = any, TContext = any> extends IResourceDefinition<TConfig, TValue, TDependencies, TContext> {
27
+ with(config: TConfig): IResourceWithConfig<TConfig, TValue, TDependencies>;
28
+ register: Array<any> | ((config: TConfig) => Array<any>);
29
+ /**
30
+ * These events are automatically populated after the task has been defined.
31
+ */
32
+ events: {
33
+ beforeInit: IEventDefinition<BeforeInitEventPayload<TConfig>>;
34
+ afterInit: IEventDefinition<AfterInitEventPayload<TConfig, TValue>>;
35
+ onError: IEventDefinition<OnErrorEventPayload>;
36
+ };
37
+ overrides: Array<IResource | ITask | IMiddleware | IResourceWithConfig>;
38
+ middleware: MiddlewareAttachments[];
39
+ }
40
+ export interface IResourceWithConfig<TConfig = any, TValue = any, TDependencies extends DependencyMapType = any> {
41
+ id: string;
42
+ resource: IResource<TConfig, TValue, TDependencies>;
43
+ config: TConfig;
44
+ }
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ // Layer 3: Component Definitions - Resources
3
+ // Imports from Layer 1, 2 & other Layer 3 files
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ //# sourceMappingURL=resources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resources.js","sourceRoot":"","sources":["../../src/types/resources.ts"],"names":[],"mappings":";AAAA,6CAA6C;AAC7C,gDAAgD"}
@@ -0,0 +1,24 @@
1
+ export declare const symbolTask: unique symbol;
2
+ export declare const symbolResource: unique symbol;
3
+ export declare const symbolResourceWithConfig: unique symbol;
4
+ export declare const symbolEvent: unique symbol;
5
+ export declare const symbolMiddleware: unique symbol;
6
+ export declare const symbolMiddlewareConfigured: unique symbol;
7
+ export declare const symbolMiddlewareGlobal: unique symbol;
8
+ export declare const symbolMiddlewareEverywhereTasks: unique symbol;
9
+ export declare const symbolMiddlewareEverywhereResources: unique symbol;
10
+ export declare const symbolFilePath: unique symbol;
11
+ export declare const symbolDispose: unique symbol;
12
+ export declare const symbolStore: unique symbol;
13
+ export declare const symbols: {
14
+ task: symbol;
15
+ resource: symbol;
16
+ resourceWithConfig: symbol;
17
+ event: symbol;
18
+ middleware: symbol;
19
+ middlewareEverywhereTasks: symbol;
20
+ middlewareEverywhereResources: symbol;
21
+ filePath: symbol;
22
+ dispose: symbol;
23
+ store: symbol;
24
+ };
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ // Layer 1: Foundation - Symbols and Constants
3
+ // No dependencies
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.symbols = exports.symbolStore = exports.symbolDispose = exports.symbolFilePath = exports.symbolMiddlewareEverywhereResources = exports.symbolMiddlewareEverywhereTasks = exports.symbolMiddlewareGlobal = exports.symbolMiddlewareConfigured = exports.symbolMiddleware = exports.symbolEvent = exports.symbolResourceWithConfig = exports.symbolResource = exports.symbolTask = void 0;
6
+ exports.symbolTask = Symbol("runner.task");
7
+ exports.symbolResource = Symbol("runner.resource");
8
+ exports.symbolResourceWithConfig = Symbol("runner.resourceWithConfig");
9
+ exports.symbolEvent = Symbol("runner.event");
10
+ exports.symbolMiddleware = Symbol("runner.middleware");
11
+ exports.symbolMiddlewareConfigured = Symbol("runner.middlewareConfigured");
12
+ exports.symbolMiddlewareGlobal = Symbol("runner.middlewareGlobal");
13
+ exports.symbolMiddlewareEverywhereTasks = Symbol("runner.middlewareGlobalTasks");
14
+ exports.symbolMiddlewareEverywhereResources = Symbol("runner.middlewareGlobalResources");
15
+ exports.symbolFilePath = Symbol("runner.filePath");
16
+ exports.symbolDispose = Symbol("runner.dispose");
17
+ exports.symbolStore = Symbol("runner.store");
18
+ exports.symbols = {
19
+ task: exports.symbolTask,
20
+ resource: exports.symbolResource,
21
+ resourceWithConfig: exports.symbolResourceWithConfig,
22
+ event: exports.symbolEvent,
23
+ middleware: exports.symbolMiddleware,
24
+ middlewareEverywhereTasks: exports.symbolMiddlewareEverywhereTasks,
25
+ middlewareEverywhereResources: exports.symbolMiddlewareEverywhereResources,
26
+ filePath: exports.symbolFilePath,
27
+ dispose: exports.symbolDispose,
28
+ store: exports.symbolStore,
29
+ };
30
+ //# sourceMappingURL=symbols.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"symbols.js","sourceRoot":"","sources":["../../src/types/symbols.ts"],"names":[],"mappings":";AAAA,8CAA8C;AAC9C,kBAAkB;;;AAEL,QAAA,UAAU,GAAkB,MAAM,CAAC,aAAa,CAAC,CAAC;AAClD,QAAA,cAAc,GAAkB,MAAM,CAAC,iBAAiB,CAAC,CAAC;AAC1D,QAAA,wBAAwB,GAAkB,MAAM,CAC3D,2BAA2B,CAC5B,CAAC;AACW,QAAA,WAAW,GAAkB,MAAM,CAAC,cAAc,CAAC,CAAC;AACpD,QAAA,gBAAgB,GAAkB,MAAM,CAAC,mBAAmB,CAAC,CAAC;AAC9D,QAAA,0BAA0B,GAAkB,MAAM,CAC7D,6BAA6B,CAC9B,CAAC;AACW,QAAA,sBAAsB,GAAkB,MAAM,CACzD,yBAAyB,CAC1B,CAAC;AACW,QAAA,+BAA+B,GAAkB,MAAM,CAClE,8BAA8B,CAC/B,CAAC;AACW,QAAA,mCAAmC,GAAkB,MAAM,CACtE,kCAAkC,CACnC,CAAC;AAEW,QAAA,cAAc,GAAkB,MAAM,CAAC,iBAAiB,CAAC,CAAC;AAC1D,QAAA,aAAa,GAAkB,MAAM,CAAC,gBAAgB,CAAC,CAAC;AACxD,QAAA,WAAW,GAAkB,MAAM,CAAC,cAAc,CAAC,CAAC;AAEpD,QAAA,OAAO,GAAG;IACrB,IAAI,EAAE,kBAAU;IAChB,QAAQ,EAAE,sBAAc;IACxB,kBAAkB,EAAE,gCAAwB;IAC5C,KAAK,EAAE,mBAAW;IAClB,UAAU,EAAE,wBAAgB;IAC5B,yBAAyB,EAAE,uCAA+B;IAC1D,6BAA6B,EAAE,2CAAmC;IAClE,QAAQ,EAAE,sBAAc;IACxB,OAAO,EAAE,qBAAa;IACtB,KAAK,EAAE,mBAAW;CACnB,CAAC"}
@@ -0,0 +1,41 @@
1
+ import type { ITaskMeta } from './meta';
2
+ import type { DependencyMapType, DependencyValuesType } from './dependency-core';
3
+ import type { IEventDefinition, IEvent, BeforeRunEventPayload, AfterRunEventPayload, OnErrorEventPayload } from './events';
4
+ import type { IMiddleware, IMiddlewareConfigured } from './middleware';
5
+ type ExtractEventParams<T> = T extends IEventDefinition<infer P> ? P : never;
6
+ export type MiddlewareAttachments = IMiddleware<void> | IMiddleware<{
7
+ [K in any]?: any;
8
+ }> | IMiddlewareConfigured<any>;
9
+ export interface ITaskDefinition<TInput = any, TOutput extends Promise<any> = any, TDependencies extends DependencyMapType = {}, TOn extends "*" | IEventDefinition<any> | undefined = undefined> {
10
+ id: string;
11
+ dependencies?: TDependencies | (() => TDependencies);
12
+ middleware?: MiddlewareAttachments[];
13
+ /**
14
+ * Listen to events in a simple way
15
+ */
16
+ on?: TOn;
17
+ /**
18
+ * This makes sense only when `on` is specified to provide the order of the execution.
19
+ * The event with the lowest order will be executed first.
20
+ */
21
+ listenerOrder?: number;
22
+ meta?: ITaskMeta;
23
+ run: (input: TOn extends undefined ? TInput : IEvent<TOn extends "*" ? any : ExtractEventParams<TOn>>, dependencies: DependencyValuesType<TDependencies>) => TOutput;
24
+ }
25
+ /**
26
+ * Task Interface (replaces forward declaration) - This is the response after the definition has been prepared. TODO: better naming?
27
+ */
28
+ export interface ITask<TInput = any, TOutput extends Promise<any> = any, TDependencies extends DependencyMapType = {}, TOn extends "*" | IEventDefinition<any> | undefined = undefined> extends ITaskDefinition<TInput, TOutput, TDependencies, TOn> {
29
+ dependencies: TDependencies | (() => TDependencies);
30
+ computedDependencies?: DependencyValuesType<TDependencies>;
31
+ middleware: MiddlewareAttachments[];
32
+ /**
33
+ * These events are automatically populated after the task has been defined.
34
+ */
35
+ events: {
36
+ beforeRun: IEventDefinition<BeforeRunEventPayload<TInput>>;
37
+ afterRun: IEventDefinition<AfterRunEventPayload<TInput, TOutput>>;
38
+ onError: IEventDefinition<OnErrorEventPayload>;
39
+ };
40
+ }
41
+ export {};
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ // Layer 3: Component Definitions - Tasks
3
+ // Imports from Layer 1, 2 & other Layer 3 files
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ //# sourceMappingURL=tasks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../src/types/tasks.ts"],"names":[],"mappings":";AAAA,yCAAyC;AACzC,gDAAgD"}
@@ -0,0 +1,7 @@
1
+ export type Optional<T> = {
2
+ [K in keyof T]?: T[K];
3
+ };
4
+ export type IsVoid<T> = [T] extends [void] ? true : false;
5
+ export type IsOptional<T> = undefined extends T ? true : false;
6
+ export type OptionalOrVoidOrAnything<T> = IsVoid<T> extends true ? void : IsOptional<T> extends true ? Optional<T> : T;
7
+ export type OnlyOptionalFields<T> = {} extends T ? true : false;
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ // Layer 1: Foundation - Utility Types
3
+ // No dependencies
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ //# sourceMappingURL=utilities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utilities.js","sourceRoot":"","sources":["../../src/types/utilities.ts"],"names":[],"mappings":";AAAA,sCAAsC;AACtC,kBAAkB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bluelibs/runner",
3
- "version": "2.2.3",
3
+ "version": "3.0.0",
4
4
  "description": "BlueLibs Runner",
5
5
  "main": "dist/index.js",
6
6
  "repository": {
@@ -10,10 +10,9 @@
10
10
  "scripts": {
11
11
  "build": "tsc",
12
12
  "watch": "tsc -w",
13
- "pretest": "npm run build",
14
- "test": "jest --verbose dist/__tests__/index.js",
15
- "test:dev": "jest --verbose src/__tests__/index.ts --watch",
16
- "coverage": "jest --verbose src/__tests__/index.ts --coverage",
13
+ "test": "jest --verbose --runInBand",
14
+ "test:dev": "jest --verbose --watch",
15
+ "coverage": "jest --verbose --coverage",
17
16
  "test:clean": "jest --clearCache",
18
17
  "testonly": "npm test",
19
18
  "test:ci": "npm run coverage -- --ci --maxWorkers=2 --reporters=default --reporters=jest-junit",
@@ -23,6 +22,7 @@
23
22
  },
24
23
  "devDependencies": {
25
24
  "@types/benchmark": "^2.1.5",
25
+ "@types/express": "^5.0.3",
26
26
  "@types/graphql": "^0.11.3",
27
27
  "@types/jest": "^27.0.0",
28
28
  "@types/node": "^20.0.0",
@@ -32,6 +32,7 @@
32
32
  "eslint": "^6.6.0",
33
33
  "eslint-config-prettier": "6.3.0",
34
34
  "eslint-plugin-prettier": "3.1.1",
35
+ "express": "^5.1.0",
35
36
  "jest": "^29.0.0",
36
37
  "jest-junit": "^10.0.0",
37
38
  "prettier": "^2.0.5",
@@ -46,5 +47,8 @@
46
47
  "typescript": {
47
48
  "definition": "dist/index.d.ts"
48
49
  },
49
- "license": "MIT"
50
+ "license": "MIT",
51
+ "dependencies": {
52
+ "lru-cache": "^11.1.0"
53
+ }
50
54
  }
@@ -7,7 +7,7 @@ import {
7
7
  } from "../../define";
8
8
  import { run } from "../../run";
9
9
 
10
- describe("Benchmarks", () => {
10
+ describe.skip("Benchmarks", () => {
11
11
  let suite: Benchmark.Suite;
12
12
 
13
13
  beforeEach(() => {
@@ -0,0 +1,91 @@
1
+ import { createContext, task, run, resource } from "../index";
2
+ import { ContextError } from "../context";
3
+
4
+ describe("Context System", () => {
5
+ const TestContext = createContext<{ id: string }>();
6
+
7
+ test("useContext throws when missing", async () => {
8
+ const r = resource({
9
+ id: "test.context.use",
10
+ init: async () => TestContext.use(),
11
+ });
12
+
13
+ await expect(run(r)).rejects.toThrow(ContextError);
14
+
15
+ await TestContext.provide({ id: "1" }, async () => {
16
+ await expect(run(r)).resolves.toEqual({
17
+ value: { id: "1" },
18
+ dispose: expect.any(Function),
19
+ });
20
+ });
21
+ });
22
+
23
+ test("require middleware blocks missing context", async () => {
24
+ const t = task({
25
+ id: "task",
26
+ middleware: [TestContext.require()],
27
+ run: async () => "ok",
28
+ });
29
+
30
+ const r = resource({
31
+ id: "resource",
32
+ register: [t],
33
+ dependencies: { t },
34
+ init: async (_, deps) => deps.t(),
35
+ });
36
+ await expect(run(r)).rejects.toThrow(ContextError);
37
+
38
+ await TestContext.provide({ id: "1" }, async () => {
39
+ await expect(run(r)).resolves.toEqual({
40
+ value: "ok",
41
+ dispose: expect.any(Function),
42
+ });
43
+ });
44
+ });
45
+
46
+ test("concurrent provide calls are isolated", async () => {
47
+ const results: string[] = [];
48
+
49
+ const promises = [
50
+ TestContext.provide({ id: "user-1" }, async () => {
51
+ await new Promise((resolve) => setTimeout(resolve, 10)); // small delay
52
+ const context = TestContext.use();
53
+ results.push(context.id);
54
+ return context.id;
55
+ }),
56
+ TestContext.provide({ id: "user-2" }, async () => {
57
+ await new Promise((resolve) => setTimeout(resolve, 5)); // smaller delay
58
+ const context = TestContext.use();
59
+ results.push(context.id);
60
+ return context.id;
61
+ }),
62
+ ];
63
+
64
+ const values = await Promise.all(promises);
65
+
66
+ // Each context should maintain its own value
67
+ expect(values).toEqual(["user-1", "user-2"]);
68
+ expect(results).toEqual(["user-2", "user-1"]); // user-2 finishes first due to shorter delay
69
+ });
70
+
71
+ test("nested provide calls work correctly", async () => {
72
+ const result = await TestContext.provide({ id: "outer" }, async () => {
73
+ const outer = TestContext.use();
74
+
75
+ const inner = await TestContext.provide({ id: "inner" }, async () => {
76
+ return TestContext.use();
77
+ });
78
+
79
+ const afterInner = TestContext.use();
80
+
81
+ return { outer: outer.id, inner: inner.id, afterInner: afterInner.id };
82
+ });
83
+
84
+ // Outer context should be restored after inner provide completes
85
+ expect(result).toEqual({
86
+ outer: "outer",
87
+ inner: "inner",
88
+ afterInner: "outer", // This should be restored!
89
+ });
90
+ });
91
+ });
@@ -56,13 +56,13 @@ describe("Errors", () => {
56
56
  });
57
57
 
58
58
  it("should throw circularDependencies error", async () => {
59
- const task1 = defineTask({
59
+ const task1: any = defineTask({
60
60
  id: "task1",
61
- dependencies: () => ({ task2 }),
61
+ dependencies: (): any => ({ task2 }),
62
62
  run: async () => {},
63
63
  });
64
64
 
65
- const task2 = defineTask({
65
+ const task2: any = defineTask({
66
66
  id: "task2",
67
67
  dependencies: { task1 },
68
68
  run: async () => {},
@@ -249,8 +249,11 @@ describe("Errors", () => {
249
249
  });
250
250
 
251
251
  it("should throw error, when a double global() is used on a middleware", async () => {
252
- const first = defineMiddleware({ id: "x", run: async () => {} }).global();
253
- expect(() => first.global()).toThrow(
252
+ const first = defineMiddleware({
253
+ id: "x",
254
+ run: async () => {},
255
+ }).everywhere();
256
+ expect(() => first.everywhere()).toThrow(
254
257
  Errors.middlewareAlreadyGlobal("x").message
255
258
  );
256
259
  });
@@ -1,4 +1,4 @@
1
- import { globalEvents } from "../globalEvents";
1
+ import { globalEvents } from "../globals/globalEvents";
2
2
  import { defineTask, defineResource } from "../define";
3
3
  import { run } from "../run";
4
4