@bluelibs/runner 2.2.4 → 3.1.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 (211) hide show
  1. package/README.md +1409 -935
  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 +24 -5
  9. package/dist/define.js +89 -20
  10. package/dist/define.js.map +1 -1
  11. package/dist/defs.d.ts +109 -73
  12. package/dist/defs.js +12 -2
  13. package/dist/defs.js.map +1 -1
  14. package/dist/errors.d.ts +5 -5
  15. package/dist/errors.js +6 -5
  16. package/dist/errors.js.map +1 -1
  17. package/dist/event.types.d.ts +18 -0
  18. package/dist/event.types.js +4 -0
  19. package/dist/event.types.js.map +1 -0
  20. package/dist/examples/registrator-example.d.ts +122 -0
  21. package/dist/examples/registrator-example.js +147 -0
  22. package/dist/examples/registrator-example.js.map +1 -0
  23. package/dist/globals/globalEvents.d.ts +41 -0
  24. package/dist/globals/globalEvents.js +94 -0
  25. package/dist/globals/globalEvents.js.map +1 -0
  26. package/dist/globals/globalMiddleware.d.ts +23 -0
  27. package/dist/globals/globalMiddleware.js +15 -0
  28. package/dist/globals/globalMiddleware.js.map +1 -0
  29. package/dist/globals/globalResources.d.ts +27 -0
  30. package/dist/globals/globalResources.js +47 -0
  31. package/dist/globals/globalResources.js.map +1 -0
  32. package/dist/globals/middleware/cache.middleware.d.ts +34 -0
  33. package/dist/globals/middleware/cache.middleware.js +85 -0
  34. package/dist/globals/middleware/cache.middleware.js.map +1 -0
  35. package/dist/globals/middleware/requireContext.middleware.d.ts +6 -0
  36. package/dist/globals/middleware/requireContext.middleware.js +25 -0
  37. package/dist/globals/middleware/requireContext.middleware.js.map +1 -0
  38. package/dist/globals/middleware/retry.middleware.d.ts +20 -0
  39. package/dist/globals/middleware/retry.middleware.js +34 -0
  40. package/dist/globals/middleware/retry.middleware.js.map +1 -0
  41. package/dist/globals/resources/queue.resource.d.ts +7 -0
  42. package/dist/globals/resources/queue.resource.js +31 -0
  43. package/dist/globals/resources/queue.resource.js.map +1 -0
  44. package/dist/index.d.ts +54 -18
  45. package/dist/index.js +14 -9
  46. package/dist/index.js.map +1 -1
  47. package/dist/middleware.types.d.ts +40 -0
  48. package/dist/middleware.types.js +4 -0
  49. package/dist/middleware.types.js.map +1 -0
  50. package/dist/models/DependencyProcessor.d.ts +6 -5
  51. package/dist/models/DependencyProcessor.js +13 -15
  52. package/dist/models/DependencyProcessor.js.map +1 -1
  53. package/dist/models/EventManager.d.ts +9 -4
  54. package/dist/models/EventManager.js +44 -2
  55. package/dist/models/EventManager.js.map +1 -1
  56. package/dist/models/Logger.d.ts +30 -13
  57. package/dist/models/Logger.js +132 -54
  58. package/dist/models/Logger.js.map +1 -1
  59. package/dist/models/OverrideManager.d.ts +13 -0
  60. package/dist/models/OverrideManager.js +70 -0
  61. package/dist/models/OverrideManager.js.map +1 -0
  62. package/dist/models/Queue.d.ts +25 -0
  63. package/dist/models/Queue.js +54 -0
  64. package/dist/models/Queue.js.map +1 -0
  65. package/dist/models/ResourceInitializer.d.ts +5 -2
  66. package/dist/models/ResourceInitializer.js +22 -14
  67. package/dist/models/ResourceInitializer.js.map +1 -1
  68. package/dist/models/Semaphore.d.ts +61 -0
  69. package/dist/models/Semaphore.js +166 -0
  70. package/dist/models/Semaphore.js.map +1 -0
  71. package/dist/models/Store.d.ts +18 -73
  72. package/dist/models/Store.js +71 -269
  73. package/dist/models/Store.js.map +1 -1
  74. package/dist/models/StoreConstants.d.ts +11 -0
  75. package/dist/models/StoreConstants.js +18 -0
  76. package/dist/models/StoreConstants.js.map +1 -0
  77. package/dist/models/StoreRegistry.d.ts +25 -0
  78. package/dist/models/StoreRegistry.js +171 -0
  79. package/dist/models/StoreRegistry.js.map +1 -0
  80. package/dist/models/StoreTypes.d.ts +21 -0
  81. package/dist/models/StoreTypes.js +3 -0
  82. package/dist/models/StoreTypes.js.map +1 -0
  83. package/dist/models/StoreValidator.d.ts +10 -0
  84. package/dist/models/StoreValidator.js +41 -0
  85. package/dist/models/StoreValidator.js.map +1 -0
  86. package/dist/models/TaskRunner.d.ts +1 -1
  87. package/dist/models/TaskRunner.js +39 -24
  88. package/dist/models/TaskRunner.js.map +1 -1
  89. package/dist/models/VarStore.d.ts +17 -0
  90. package/dist/models/VarStore.js +60 -0
  91. package/dist/models/VarStore.js.map +1 -0
  92. package/dist/models/index.d.ts +3 -0
  93. package/dist/models/index.js +3 -0
  94. package/dist/models/index.js.map +1 -1
  95. package/dist/resource.types.d.ts +31 -0
  96. package/dist/resource.types.js +3 -0
  97. package/dist/resource.types.js.map +1 -0
  98. package/dist/run.d.ts +4 -1
  99. package/dist/run.js +6 -3
  100. package/dist/run.js.map +1 -1
  101. package/dist/symbols.d.ts +24 -0
  102. package/dist/symbols.js +29 -0
  103. package/dist/symbols.js.map +1 -0
  104. package/dist/task.types.d.ts +55 -0
  105. package/dist/task.types.js +23 -0
  106. package/dist/task.types.js.map +1 -0
  107. package/dist/tools/getCallerFile.d.ts +9 -1
  108. package/dist/tools/getCallerFile.js +41 -0
  109. package/dist/tools/getCallerFile.js.map +1 -1
  110. package/dist/tools/registratorId.d.ts +4 -0
  111. package/dist/tools/registratorId.js +40 -0
  112. package/dist/tools/registratorId.js.map +1 -0
  113. package/dist/tools/simpleHash.d.ts +9 -0
  114. package/dist/tools/simpleHash.js +34 -0
  115. package/dist/tools/simpleHash.js.map +1 -0
  116. package/dist/types/base-interfaces.d.ts +18 -0
  117. package/dist/types/base-interfaces.js +6 -0
  118. package/dist/types/base-interfaces.js.map +1 -0
  119. package/dist/types/base.d.ts +13 -0
  120. package/dist/types/base.js +3 -0
  121. package/dist/types/base.js.map +1 -0
  122. package/dist/types/dependencies.d.ts +22 -0
  123. package/dist/types/dependencies.js +3 -0
  124. package/dist/types/dependencies.js.map +1 -0
  125. package/dist/types/dependency-core.d.ts +14 -0
  126. package/dist/types/dependency-core.js +5 -0
  127. package/dist/types/dependency-core.js.map +1 -0
  128. package/dist/types/events.d.ts +52 -0
  129. package/dist/types/events.js +6 -0
  130. package/dist/types/events.js.map +1 -0
  131. package/dist/types/hooks.d.ts +16 -0
  132. package/dist/types/hooks.js +5 -0
  133. package/dist/types/hooks.js.map +1 -0
  134. package/dist/types/index.d.ts +14 -0
  135. package/dist/types/index.js +27 -0
  136. package/dist/types/index.js.map +1 -0
  137. package/dist/types/meta.d.ts +13 -0
  138. package/dist/types/meta.js +5 -0
  139. package/dist/types/meta.js.map +1 -0
  140. package/dist/types/middleware.d.ts +38 -0
  141. package/dist/types/middleware.js +6 -0
  142. package/dist/types/middleware.js.map +1 -0
  143. package/dist/types/registerable.d.ts +10 -0
  144. package/dist/types/registerable.js +5 -0
  145. package/dist/types/registerable.js.map +1 -0
  146. package/dist/types/resources.d.ts +44 -0
  147. package/dist/types/resources.js +5 -0
  148. package/dist/types/resources.js.map +1 -0
  149. package/dist/types/symbols.d.ts +24 -0
  150. package/dist/types/symbols.js +30 -0
  151. package/dist/types/symbols.js.map +1 -0
  152. package/dist/types/tasks.d.ts +41 -0
  153. package/dist/types/tasks.js +5 -0
  154. package/dist/types/tasks.js.map +1 -0
  155. package/dist/types/utilities.d.ts +7 -0
  156. package/dist/types/utilities.js +5 -0
  157. package/dist/types/utilities.js.map +1 -0
  158. package/package.json +10 -6
  159. package/src/__tests__/benchmark/benchmark.test.ts +1 -1
  160. package/src/__tests__/context.test.ts +91 -0
  161. package/src/__tests__/errors.test.ts +8 -5
  162. package/src/__tests__/globalEvents.test.ts +1 -1
  163. package/src/__tests__/globals/cache.middleware.test.ts +772 -0
  164. package/src/__tests__/globals/queue.resource.test.ts +141 -0
  165. package/src/__tests__/globals/requireContext.middleware.test.ts +98 -0
  166. package/src/__tests__/globals/retry.middleware.test.ts +157 -0
  167. package/src/__tests__/index.helper.test.ts +55 -0
  168. package/src/__tests__/models/EventManager.test.ts +157 -11
  169. package/src/__tests__/models/Logger.test.ts +291 -34
  170. package/src/__tests__/models/Queue.test.ts +189 -0
  171. package/src/__tests__/models/ResourceInitializer.test.ts +8 -6
  172. package/src/__tests__/models/Semaphore.test.ts +713 -0
  173. package/src/__tests__/models/Store.test.ts +40 -0
  174. package/src/__tests__/models/TaskRunner.test.ts +86 -5
  175. package/src/__tests__/run.anonymous.test.ts +679 -0
  176. package/src/__tests__/run.middleware.test.ts +312 -12
  177. package/src/__tests__/run.overrides.test.ts +13 -10
  178. package/src/__tests__/run.test.ts +364 -13
  179. package/src/__tests__/setOutput.test.ts +244 -0
  180. package/src/__tests__/tools/getCallerFile.test.ts +124 -9
  181. package/src/__tests__/typesafety.test.ts +71 -41
  182. package/src/context.ts +86 -0
  183. package/src/define.ts +129 -34
  184. package/src/defs.ts +156 -119
  185. package/src/errors.ts +15 -10
  186. package/src/{globalEvents.ts → globals/globalEvents.ts} +13 -12
  187. package/src/globals/globalMiddleware.ts +14 -0
  188. package/src/{globalResources.ts → globals/globalResources.ts} +14 -10
  189. package/src/globals/middleware/cache.middleware.ts +115 -0
  190. package/src/globals/middleware/requireContext.middleware.ts +36 -0
  191. package/src/globals/middleware/retry.middleware.ts +56 -0
  192. package/src/globals/resources/queue.resource.ts +34 -0
  193. package/src/index.ts +9 -5
  194. package/src/models/DependencyProcessor.ts +42 -49
  195. package/src/models/EventManager.ts +64 -13
  196. package/src/models/Logger.ts +181 -64
  197. package/src/models/OverrideManager.ts +84 -0
  198. package/src/models/Queue.ts +66 -0
  199. package/src/models/ResourceInitializer.ts +40 -20
  200. package/src/models/Semaphore.ts +208 -0
  201. package/src/models/Store.ts +94 -342
  202. package/src/models/StoreConstants.ts +17 -0
  203. package/src/models/StoreRegistry.ts +228 -0
  204. package/src/models/StoreTypes.ts +46 -0
  205. package/src/models/StoreValidator.ts +43 -0
  206. package/src/models/TaskRunner.ts +54 -41
  207. package/src/models/index.ts +3 -0
  208. package/src/run.ts +7 -4
  209. package/src/tools/getCallerFile.ts +54 -2
  210. package/src/__tests__/index.ts +0 -15
  211. package/src/examples/express-mongo/index.ts +0 -1
package/src/defs.ts CHANGED
@@ -1,3 +1,8 @@
1
+ import { index } from ".";
2
+ import { MiddlewareEverywhereOptions } from "./define";
3
+
4
+ export { ICacheInstance } from "./globals/middleware/cache.middleware";
5
+
1
6
  export const symbolTask: unique symbol = Symbol("runner.task");
2
7
  export const symbolResource: unique symbol = Symbol("runner.resource");
3
8
  export const symbolResourceWithConfig: unique symbol = Symbol(
@@ -5,20 +10,39 @@ export const symbolResourceWithConfig: unique symbol = Symbol(
5
10
  );
6
11
  export const symbolEvent: unique symbol = Symbol("runner.event");
7
12
  export const symbolMiddleware: unique symbol = Symbol("runner.middleware");
13
+ export const symbolMiddlewareConfigured: unique symbol = Symbol(
14
+ "runner.middlewareConfigured"
15
+ );
8
16
  export const symbolMiddlewareGlobal: unique symbol = Symbol(
9
17
  "runner.middlewareGlobal"
10
18
  );
19
+ export const symbolMiddlewareEverywhereTasks: unique symbol = Symbol(
20
+ "runner.middlewareGlobalTasks"
21
+ );
22
+ export const symbolMiddlewareEverywhereResources: unique symbol = Symbol(
23
+ "runner.middlewareGlobalResources"
24
+ );
11
25
 
12
26
  export const symbolFilePath: unique symbol = Symbol("runner.filePath");
27
+ export const symbolDispose: unique symbol = Symbol("runner.dispose");
28
+ export const symbolStore: unique symbol = Symbol("runner.store");
29
+
30
+ export const symbolIndexResource: unique symbol = Symbol(
31
+ "runner.indexResource"
32
+ );
13
33
 
14
34
  export const symbols = {
15
35
  task: symbolTask,
16
36
  resource: symbolResource,
17
37
  resourceWithConfig: symbolResourceWithConfig,
38
+ indexResource: symbolIndexResource,
18
39
  event: symbolEvent,
19
40
  middleware: symbolMiddleware,
20
- middlewareGlobal: symbolMiddlewareGlobal,
41
+ middlewareEverywhereTasks: symbolMiddlewareEverywhereTasks,
42
+ middlewareEverywhereResources: symbolMiddlewareEverywhereResources,
21
43
  filePath: symbolFilePath,
44
+ dispose: symbolDispose,
45
+ store: symbolStore,
22
46
  };
23
47
 
24
48
  export interface IMeta {
@@ -44,12 +68,23 @@ type ExtractTaskOutput<T> = T extends ITask<any, infer O, infer D> ? O : never;
44
68
  type ExtractResourceValue<T> = T extends IResource<any, infer V, infer D>
45
69
  ? V
46
70
  : never;
47
- type ExtractEventParams<T> = T extends IEventDefinition<infer P> ? P : never;
48
71
 
49
- // Helper Types for Dependency Value Construction
72
+ type ExtractEventParams<T> = T extends IEvent<infer P> ? P : never;
73
+
74
+ /**
75
+ * This represents a task dependency function that can be called with or without parameters.
76
+ */
50
77
  type TaskDependency<I, O> = (...args: I extends null | void ? [] : [I]) => O;
78
+ /**
79
+ * This represents the resource's value type.
80
+ */
51
81
  type ResourceDependency<V> = V;
52
- type EventDependency<P> = (input: P) => Promise<void>;
82
+ /**
83
+ * This represents an event emission function that can be called with or without parameters.
84
+ */
85
+ type EventDependency<P> = P extends void
86
+ ? (() => Promise<void>) & ((input?: Record<string, never>) => Promise<void>)
87
+ : (input: P) => Promise<void>;
53
88
 
54
89
  // Main DependencyValueType Definition
55
90
  export type DependencyValueType<T> = T extends ITask<any, any, any>
@@ -64,33 +99,19 @@ export type DependencyValuesType<T extends DependencyMapType> = {
64
99
  [K in keyof T]: DependencyValueType<T[K]>;
65
100
  };
66
101
 
67
- type Optional<T> = {
68
- [K in keyof T]?: T[K];
69
- };
70
-
71
- // Utility type to check if a type is void
72
- type IsVoid<T> = [T] extends [void] ? true : false;
73
-
74
- // Utility type to check if a type is optional (can be undefined)
75
- type IsOptional<T> = undefined extends T ? true : false;
76
-
77
- // IReso
78
-
79
- // Conditional type to allow `void`, optional, or any type
80
- type OptionalOrVoidOrAnything<T> = IsVoid<T> extends true
81
- ? void
82
- : IsOptional<T> extends true
83
- ? Optional<T>
84
- : T;
85
-
86
102
  // RegisterableItems Type with Conditional Inclusion
87
103
  export type RegisterableItems<T = any> =
88
104
  | IResourceWithConfig<any>
89
- // | IResource<void, any, any>
90
- | IResource<OptionalOrVoidOrAnything<T>, any, any>
91
- | ITaskDefinition<any, any, any, any>
92
- | IMiddlewareDefinition<any>
93
- | IEventDefinition<any>;
105
+ | IResource<void, any, any, any> // For void configs
106
+ | IResource<{ [K in any]?: any }, any, any, any> // For optional config
107
+ | ITask<any, any, any, any>
108
+ | IMiddleware<any>
109
+ | IEvent<any>;
110
+
111
+ export type MiddlewareAttachments =
112
+ | IMiddleware<void>
113
+ | IMiddleware<{ [K in any]?: any }>
114
+ | IMiddlewareConfigured<any>;
94
115
 
95
116
  export interface ITaskDefinition<
96
117
  TInput = any,
@@ -98,9 +119,9 @@ export interface ITaskDefinition<
98
119
  TDependencies extends DependencyMapType = {},
99
120
  TOn extends "*" | IEventDefinition<any> | undefined = undefined // Adding a generic to track 'on' type
100
121
  > {
101
- id: string;
122
+ id?: string | symbol;
102
123
  dependencies?: TDependencies | (() => TDependencies);
103
- middleware?: IMiddlewareDefinition[];
124
+ middleware?: MiddlewareAttachments[];
104
125
  /**
105
126
  * Listen to events in a simple way
106
127
  */
@@ -114,12 +135,7 @@ export interface ITaskDefinition<
114
135
  run: (
115
136
  input: TOn extends undefined
116
137
  ? TInput
117
- : IEvent<TOn extends "*" ? any : ExtractEventParams<TOn>>,
118
- // input: TOn extends "*"
119
- // ? IEvent<any>
120
- // : TEventDefinitionInput extends null | void
121
- // ? TInput
122
- // : IEvent<TEventDefinitionInput>,
138
+ : IEventEmission<TOn extends "*" ? any : ExtractEventParams<TOn>>,
123
139
  dependencies: DependencyValuesType<TDependencies>
124
140
  ) => TOutput;
125
141
  }
@@ -130,7 +146,8 @@ export type BeforeRunEventPayload<TInput> = {
130
146
 
131
147
  export type AfterRunEventPayload<TInput, TOutput> = {
132
148
  input: TInput;
133
- output: TOutput;
149
+ output: TOutput extends Promise<infer U> ? U : TOutput;
150
+ setOutput(newOutput: TOutput extends Promise<infer U> ? U : TOutput): void;
134
151
  };
135
152
 
136
153
  export type OnErrorEventPayload = {
@@ -159,68 +176,75 @@ export interface ITask<
159
176
  TDependencies extends DependencyMapType = {},
160
177
  TOn extends "*" | IEventDefinition<any> | undefined = undefined
161
178
  > extends ITaskDefinition<TInput, TOutput, TDependencies, TOn> {
179
+ id: string | symbol;
162
180
  dependencies: TDependencies | (() => TDependencies);
163
181
  computedDependencies?: DependencyValuesType<TDependencies>;
164
- middleware: IMiddlewareDefinition[];
182
+ middleware: MiddlewareAttachments[];
165
183
  /**
166
184
  * These events are automatically populated after the task has been defined.
167
185
  */
168
186
  events: {
169
- beforeRun: IEventDefinition<BeforeRunEventPayload<TInput>>;
170
- afterRun: IEventDefinition<AfterRunEventPayload<TInput, TOutput>>;
171
- onError: IEventDefinition<OnErrorEventPayload>;
187
+ beforeRun: IEvent<BeforeRunEventPayload<TInput>>;
188
+ afterRun: IEvent<AfterRunEventPayload<TInput, TOutput>>;
189
+ onError: IEvent<OnErrorEventPayload>;
172
190
  };
173
191
  }
174
192
 
175
- type IsExactlyUnknown<T> = unknown extends T
176
- ? T extends unknown
177
- ? true
178
- : false
179
- : false;
180
-
181
- // Resource interfaces
182
193
  export interface IResourceDefinition<
183
194
  TConfig = any,
184
195
  TValue = unknown,
185
196
  TDependencies extends DependencyMapType = {},
197
+ TContext = any,
198
+ THooks = any,
186
199
  TRegisterableItems = any
187
200
  > {
188
- id: string;
201
+ id?: string | symbol;
189
202
  dependencies?: TDependencies | ((config: TConfig) => TDependencies);
190
203
  register?:
191
204
  | Array<RegisterableItems>
192
205
  | ((config: TConfig) => Array<RegisterableItems>);
193
206
  init?: (
207
+ this: any,
194
208
  config: TConfig,
195
- dependencies: DependencyValuesType<TDependencies>
209
+ dependencies: DependencyValuesType<TDependencies>,
210
+ context: TContext
196
211
  ) => Promise<TValue>;
197
212
  /**
198
213
  * Clean-up function for the resource. This is called when the resource is no longer needed.
199
214
  *
200
- * @param value The value of the resource
215
+ * @param value The value of the resource (undefined if no init method)
201
216
  * @param config The configuration it received
202
217
  * @param dependencies The dependencies it needed
203
- * @returns
218
+ * @returns Promise<void>
204
219
  */
205
220
  dispose?: (
221
+ this: any,
206
222
  value: TValue,
207
223
  config: TConfig,
208
- dependencies: DependencyValuesType<TDependencies>
209
- ) => Promise<TValue>;
224
+ dependencies: DependencyValuesType<TDependencies>,
225
+ context: TContext
226
+ ) => Promise<void>;
210
227
  meta?: IResourceMeta;
211
228
  overrides?: Array<IResource | ITask | IMiddleware | IResourceWithConfig>;
212
- middleware?: IMiddlewareDefinition[];
229
+ middleware?: MiddlewareAttachments[];
230
+ context?: () => TContext;
231
+ /**
232
+ * This is optional and used from an index resource to get the correct caller.
233
+ */
234
+ [symbolFilePath]?: string;
235
+ /**
236
+ * This is used internally when creating index resources.
237
+ */
238
+ [symbolIndexResource]?: boolean;
213
239
  }
214
240
 
215
241
  export interface IResource<
216
242
  TConfig = void,
217
243
  TValue = any,
218
- TDependencies extends DependencyMapType = any
219
- > extends IResourceDefinition<TConfig, TValue, TDependencies> {
220
- init: (
221
- config: TConfig,
222
- dependencies: DependencyValuesType<TDependencies>
223
- ) => Promise<TValue>;
244
+ TDependencies extends DependencyMapType = any,
245
+ TContext = any
246
+ > extends IResourceDefinition<TConfig, TValue, TDependencies, TContext> {
247
+ id: string | symbol;
224
248
  with(config: TConfig): IResourceWithConfig<TConfig, TValue, TDependencies>;
225
249
  register:
226
250
  | Array<RegisterableItems>
@@ -229,12 +253,12 @@ export interface IResource<
229
253
  * These events are automatically populated after the task has been defined.
230
254
  */
231
255
  events: {
232
- beforeInit: IEventDefinition<BeforeInitEventPayload<TConfig>>;
233
- afterInit: IEventDefinition<AfterInitEventPayload<TConfig, TValue>>;
234
- onError: IEventDefinition<OnErrorEventPayload>;
256
+ beforeInit: IEvent<BeforeInitEventPayload<TConfig>>;
257
+ afterInit: IEvent<AfterInitEventPayload<TConfig, TValue>>;
258
+ onError: IEvent<OnErrorEventPayload>;
235
259
  };
236
260
  overrides: Array<IResource | ITask | IMiddleware | IResourceWithConfig>;
237
- middleware: IMiddlewareDefinition[];
261
+ middleware: MiddlewareAttachments[];
238
262
  }
239
263
 
240
264
  export interface IResourceWithConfig<
@@ -247,8 +271,32 @@ export interface IResourceWithConfig<
247
271
  config: TConfig;
248
272
  }
249
273
 
250
- export interface IEvent<TPayload = any> {
251
- id: string;
274
+ export type EventHandlerType<T = any> = (
275
+ event: IEventEmission<T>
276
+ ) => any | Promise<any>;
277
+
278
+ export interface IEventDefinition<TPayload = void> {
279
+ id?: string | symbol;
280
+ meta?: IEventMeta;
281
+ }
282
+
283
+ export interface IEvent<TPayload = any> extends IEventDefinition<TPayload> {
284
+ id: string | symbol;
285
+ /**
286
+ * We use this event to discriminate between resources with just 'id' and 'events' as they collide. This is a workaround, should be redone using classes and instanceof.
287
+ */
288
+ [symbolEvent]: true;
289
+ }
290
+
291
+ /**
292
+ * This represents the object that is passed to event handlers
293
+ */
294
+ export interface IEventEmission<TPayload = any> {
295
+ /**
296
+ * The ID of the event. This is the same as the event's ID.
297
+ * This is useful for global event listeners.
298
+ */
299
+ id: string | symbol;
252
300
  /**
253
301
  * The data that the event carries. It can be anything.
254
302
  */
@@ -260,44 +308,46 @@ export interface IEvent<TPayload = any> {
260
308
  /**
261
309
  * The source of the event. This can be useful for debugging.
262
310
  */
263
- source: string;
264
- }
265
-
266
- export type EventHandlerType<T = any> = (
267
- event: IEvent<T>
268
- ) => any | Promise<any>;
269
-
270
- // Other necessary interfaces
271
- export interface IEventDefinitionConfig<TPayload = void> {
272
- id: string;
273
- meta?: IEventMeta;
274
- }
275
-
276
- export interface IEventDefinition<TPayload = void> {
277
- id: string;
278
- /**
279
- * We use this event to discriminate between resources with just 'id' and 'events' as they collide. This is a workaround, should be redone using classes and instanceof.
280
- */
281
- [symbolEvent]: true;
282
- meta?: IEventMeta;
311
+ source: string | symbol;
283
312
  }
284
313
 
285
314
  export interface IMiddlewareDefinition<
315
+ TConfig = any,
286
316
  TDependencies extends DependencyMapType = any
287
317
  > {
288
- id: string;
318
+ id?: string | symbol;
289
319
  dependencies?: TDependencies | (() => TDependencies);
290
320
  run: (
291
321
  input: IMiddlewareExecutionInput,
292
- dependencies: DependencyValuesType<TDependencies>
322
+ dependencies: DependencyValuesType<TDependencies>,
323
+ config: TConfig
293
324
  ) => Promise<any>;
294
325
  meta?: IMiddlewareMeta;
295
326
  }
296
327
 
297
- export interface IMiddleware<TDependencies extends DependencyMapType = any>
298
- extends IMiddlewareDefinition<TDependencies> {
328
+ export interface IMiddleware<
329
+ TConfig = any,
330
+ TDependencies extends DependencyMapType = any
331
+ > extends IMiddlewareDefinition<TConfig, TDependencies> {
332
+ [symbolMiddleware]: true;
333
+ [symbolMiddlewareConfigured]?: boolean;
334
+ [symbolMiddlewareEverywhereTasks]?: boolean;
335
+ [symbolMiddlewareEverywhereResources]?: boolean;
336
+
337
+ id: string | symbol;
299
338
  dependencies: TDependencies | (() => TDependencies);
300
- global(): IMiddleware<TDependencies>;
339
+ everywhere(
340
+ config?: MiddlewareEverywhereOptions
341
+ ): IMiddleware<TConfig, TDependencies>;
342
+ config: TConfig;
343
+ with: (config: TConfig) => IMiddlewareConfigured<TConfig, TDependencies>;
344
+ }
345
+
346
+ export interface IMiddlewareConfigured<
347
+ TConfig = any,
348
+ TDependencies extends DependencyMapType = any
349
+ > extends IMiddleware<TConfig, TDependencies> {
350
+ [symbolMiddlewareConfigured]: true;
301
351
  }
302
352
 
303
353
  export interface IMiddlewareDefinitionConfigured<
@@ -307,32 +357,19 @@ export interface IMiddlewareDefinitionConfigured<
307
357
  config?: C;
308
358
  }
309
359
 
310
- export interface IMiddlewareExecutionInput {
311
- taskDefinition?: ITask;
312
- resourceDefinition?: IResource;
313
- config?: any;
314
- input?: any;
315
- next: (taskInputOrResourceConfig?: any) => Promise<any>;
316
- }
317
-
318
- export interface IHookDefinition<
319
- D extends DependencyMapType = {},
320
- T = any,
321
- B extends boolean = false
360
+ export interface IMiddlewareExecutionInput<
361
+ TTaskInput = any,
362
+ TResourceConfig = any
322
363
  > {
323
- event: "*" | IEventDefinition<T>;
324
- /**
325
- * The higher the number, the higher the priority.
326
- * We recommend using numbers between -1000 and 1000.
327
- */
328
- order?: number;
329
- /**
330
- * These are hooks that run before any resource instantiation.
331
- * @param event
332
- */
333
- early?: B;
334
- run: (
335
- event: IEvent<T>,
336
- dependencies: T extends true ? void : DependencyValuesType<D>
337
- ) => Promise<void> | void;
364
+ task?: {
365
+ definition: ITask<TTaskInput>;
366
+ input: TTaskInput;
367
+ };
368
+ resource?: {
369
+ definition: IResource<TResourceConfig>;
370
+ config: TResourceConfig;
371
+ };
372
+ next: (
373
+ taskInputOrResourceConfig?: TTaskInput | TResourceConfig
374
+ ) => Promise<any>;
338
375
  }
package/src/errors.ts CHANGED
@@ -1,12 +1,12 @@
1
1
  import { ITask, IResource } from "./defs";
2
2
 
3
3
  export const Errors = {
4
- duplicateRegistration: (type: string, id: string) =>
5
- new Error(`${type} "${id}" already registered`),
4
+ duplicateRegistration: (type: string, id: string | symbol) =>
5
+ new Error(`${type} "${id.toString()}" already registered`),
6
6
 
7
- dependencyNotFound: (key: string) =>
7
+ dependencyNotFound: (key: string | symbol) =>
8
8
  new Error(
9
- `Dependency ${key} not found. Did you forget to register it through a resource?`
9
+ `Dependency ${key.toString()} not found. Did you forget to register it through a resource?`
10
10
  ),
11
11
 
12
12
  unknownItemType: (item: any) => new Error(`Unknown item type: ${item}`),
@@ -14,14 +14,19 @@ export const Errors = {
14
14
  circularDependencies: (cycles: string[]) =>
15
15
  new Error(`Circular dependencies detected: ${cycles.join(", ")}`),
16
16
 
17
- eventNotFound: (id: string) =>
18
- new Error(`Event "${id}" not found. Did you forget to register it?`),
17
+ eventNotFound: (id: string | symbol) =>
18
+ new Error(
19
+ `Event "${id.toString()}" not found. Did you forget to register it?`
20
+ ),
19
21
 
20
- middlewareAlreadyGlobal: (id: string) =>
21
- new Error("Cannot call global on a global middleware: " + id),
22
+ middlewareAlreadyGlobal: (id: string | symbol) =>
23
+ new Error(
24
+ "Cannot call .everywhere() on an already global middleware: " +
25
+ id.toString
26
+ ),
22
27
 
23
- locked: (what: string) =>
24
- new Error(`Cannot modify the ${what} when it is locked.`),
28
+ locked: (what: string | symbol) =>
29
+ new Error(`Cannot modify the ${what.toString()} when it is locked.`),
25
30
 
26
31
  storeAlreadyInitialized: () =>
27
32
  new Error("Store already initialized. Cannot reinitialize."),
@@ -1,10 +1,10 @@
1
- import { defineEvent } from "./define";
2
- import { ITask, IResource, IEvent } from "./defs";
3
- import { ILog } from "./models/Logger";
1
+ import { defineEvent } from "../define";
2
+ import { ITask, IResource, IEvent } from "../defs";
3
+ import { ILog } from "../models/Logger";
4
4
 
5
5
  export const globalEvents = {
6
6
  beforeInit: defineEvent({
7
- id: "global.events.beforeInit",
7
+ id: "globals.events.beforeInit",
8
8
  meta: {
9
9
  title: "Before Initialization",
10
10
  description:
@@ -13,7 +13,7 @@ export const globalEvents = {
13
13
  },
14
14
  }),
15
15
  afterInit: defineEvent({
16
- id: "global.events.afterInit",
16
+ id: "globals.events.afterInit",
17
17
  meta: {
18
18
  title: "After Initialization",
19
19
  description:
@@ -22,7 +22,7 @@ export const globalEvents = {
22
22
  },
23
23
  }),
24
24
  log: defineEvent<ILog>({
25
- id: "global.events.log",
25
+ id: "globals.events.log",
26
26
  meta: {
27
27
  title: "Log Event",
28
28
  description: "Used to log events and messages across the system.",
@@ -34,7 +34,7 @@ export const globalEvents = {
34
34
  task: ITask<any, any, any>;
35
35
  input: any;
36
36
  }>({
37
- id: "global.events.tasks.beforeRun",
37
+ id: "globals.events.tasks.beforeRun",
38
38
  meta: {
39
39
  title: "Before Task Execution",
40
40
  description:
@@ -46,8 +46,9 @@ export const globalEvents = {
46
46
  task: ITask<any, any, any>;
47
47
  input: any;
48
48
  output: any;
49
+ setOutput: (newOutput: any) => void;
49
50
  }>({
50
- id: "global.events.tasks.afterRun",
51
+ id: "globals.events.tasks.afterRun",
51
52
  meta: {
52
53
  title: "After Task Execution",
53
54
  description:
@@ -60,7 +61,7 @@ export const globalEvents = {
60
61
  suppress: () => void;
61
62
  task: ITask<any, any, any>;
62
63
  }>({
63
- id: "global.events.tasks.onError",
64
+ id: "globals.events.tasks.onError",
64
65
  meta: {
65
66
  title: "Task Error",
66
67
  description:
@@ -74,7 +75,7 @@ export const globalEvents = {
74
75
  resource: IResource<any, any, any>;
75
76
  config: any;
76
77
  }>({
77
- id: "global.events.resources.beforeInit",
78
+ id: "globals.events.resources.beforeInit",
78
79
  meta: {
79
80
  title: "Before Resource Initialization",
80
81
  description:
@@ -87,7 +88,7 @@ export const globalEvents = {
87
88
  config: any;
88
89
  value: any;
89
90
  }>({
90
- id: "global.events.resources.afterInit",
91
+ id: "globals.events.resources.afterInit",
91
92
  meta: {
92
93
  title: "After Resource Initialization",
93
94
  description:
@@ -100,7 +101,7 @@ export const globalEvents = {
100
101
  suppress: () => void;
101
102
  resource: IResource<any, any, any>;
102
103
  }>({
103
- id: "global.events.resources.onError",
104
+ id: "globals.events.resources.onError",
104
105
  meta: {
105
106
  title: "Resource Error",
106
107
  description:
@@ -0,0 +1,14 @@
1
+ import { Context, ContextError } from "../context";
2
+ import { defineMiddleware } from "../define";
3
+ import { cacheMiddleware } from "./middleware/cache.middleware";
4
+ import { requireContextMiddleware } from "./middleware/requireContext.middleware";
5
+ import { retryMiddleware } from "./middleware/retry.middleware";
6
+
7
+ /**
8
+ * Global middlewares
9
+ */
10
+ export const globalMiddlewares = {
11
+ requireContext: requireContextMiddleware,
12
+ retry: retryMiddleware,
13
+ cache: cacheMiddleware,
14
+ };
@@ -1,11 +1,13 @@
1
- import { defineResource } from "./define";
2
- import { EventManager } from "./models/EventManager";
3
- import { Logger } from "./models/Logger";
4
- import { Store } from "./models/Store";
5
- import { TaskRunner } from "./models/TaskRunner";
1
+ import { defineResource } from "../define";
2
+ import { EventManager } from "../models/EventManager";
3
+ import { Logger } from "../models/Logger";
4
+ import { Store } from "../models/Store";
5
+ import { TaskRunner } from "../models/TaskRunner";
6
+ import { cacheResource } from "./middleware/cache.middleware";
7
+ import { queueResource } from "./resources/queue.resource";
6
8
 
7
9
  const store = defineResource({
8
- id: "global.resources.store",
10
+ id: "globals.resources.store",
9
11
  init: async (store: Store) => store,
10
12
  meta: {
11
13
  title: "Store",
@@ -18,7 +20,7 @@ const store = defineResource({
18
20
  export const globalResources = {
19
21
  store,
20
22
  eventManager: defineResource({
21
- id: "global.resources.eventManager",
23
+ id: "globals.resources.eventManager",
22
24
  init: async (em: EventManager) => em,
23
25
  meta: {
24
26
  title: "Event Manager",
@@ -28,7 +30,7 @@ export const globalResources = {
28
30
  },
29
31
  }),
30
32
  taskRunner: defineResource({
31
- id: "global.resources.taskRunner",
33
+ id: "globals.resources.taskRunner",
32
34
  init: async (runner: TaskRunner) => runner,
33
35
  meta: {
34
36
  title: "Task Runner",
@@ -38,12 +40,14 @@ export const globalResources = {
38
40
  },
39
41
  }),
40
42
  logger: defineResource({
41
- id: "global.resources.logger",
43
+ id: "globals.resources.logger",
42
44
  init: async (logger: Logger) => logger,
43
45
  meta: {
44
46
  title: "Logger",
45
47
  description:
46
- "Logs all events and errors. This is meant to be used internally for most use-cases. Emits a global.log event for each log.",
48
+ "Logs all events and errors. This is meant to be used internally for most use-cases. Emits a globals.log event for each log.",
47
49
  },
48
50
  }),
51
+ cache: cacheResource,
52
+ queue: queueResource,
49
53
  };