@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/dist/defs.d.ts CHANGED
@@ -1,18 +1,30 @@
1
+ import { MiddlewareEverywhereOptions } from "./define";
2
+ export { ICacheInstance } from "./globals/middleware/cache.middleware";
1
3
  export declare const symbolTask: unique symbol;
2
4
  export declare const symbolResource: unique symbol;
3
5
  export declare const symbolResourceWithConfig: unique symbol;
4
6
  export declare const symbolEvent: unique symbol;
5
7
  export declare const symbolMiddleware: unique symbol;
8
+ export declare const symbolMiddlewareConfigured: unique symbol;
6
9
  export declare const symbolMiddlewareGlobal: unique symbol;
10
+ export declare const symbolMiddlewareEverywhereTasks: unique symbol;
11
+ export declare const symbolMiddlewareEverywhereResources: unique symbol;
7
12
  export declare const symbolFilePath: unique symbol;
13
+ export declare const symbolDispose: unique symbol;
14
+ export declare const symbolStore: unique symbol;
15
+ export declare const symbolIndexResource: unique symbol;
8
16
  export declare const symbols: {
9
17
  task: symbol;
10
18
  resource: symbol;
11
19
  resourceWithConfig: symbol;
20
+ indexResource: symbol;
12
21
  event: symbol;
13
22
  middleware: symbol;
14
- middlewareGlobal: symbol;
23
+ middlewareEverywhereTasks: symbol;
24
+ middlewareEverywhereResources: symbol;
15
25
  filePath: symbol;
26
+ dispose: symbol;
27
+ store: symbol;
16
28
  };
17
29
  export interface IMeta {
18
30
  title?: string;
@@ -31,25 +43,33 @@ export type DependencyMapType = Record<string, ITask<any, any, any, any> | IReso
31
43
  type ExtractTaskInput<T> = T extends ITask<infer I, any, infer D> ? I : never;
32
44
  type ExtractTaskOutput<T> = T extends ITask<any, infer O, infer D> ? O : never;
33
45
  type ExtractResourceValue<T> = T extends IResource<any, infer V, infer D> ? V : never;
34
- type ExtractEventParams<T> = T extends IEventDefinition<infer P> ? P : never;
46
+ type ExtractEventParams<T> = T extends IEvent<infer P> ? P : never;
47
+ /**
48
+ * This represents a task dependency function that can be called with or without parameters.
49
+ */
35
50
  type TaskDependency<I, O> = (...args: I extends null | void ? [] : [I]) => O;
51
+ /**
52
+ * This represents the resource's value type.
53
+ */
36
54
  type ResourceDependency<V> = V;
37
- type EventDependency<P> = (input: P) => Promise<void>;
55
+ /**
56
+ * This represents an event emission function that can be called with or without parameters.
57
+ */
58
+ type EventDependency<P> = P extends void ? (() => Promise<void>) & ((input?: Record<string, never>) => Promise<void>) : (input: P) => Promise<void>;
38
59
  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<ExtractEventParams<T>> : never;
39
60
  export type DependencyValuesType<T extends DependencyMapType> = {
40
61
  [K in keyof T]: DependencyValueType<T[K]>;
41
62
  };
42
- type Optional<T> = {
43
- [K in keyof T]?: T[K];
44
- };
45
- type IsVoid<T> = [T] extends [void] ? true : false;
46
- type IsOptional<T> = undefined extends T ? true : false;
47
- type OptionalOrVoidOrAnything<T> = IsVoid<T> extends true ? void : IsOptional<T> extends true ? Optional<T> : T;
48
- export type RegisterableItems<T = any> = IResourceWithConfig<any> | IResource<OptionalOrVoidOrAnything<T>, any, any> | ITaskDefinition<any, any, any, any> | IMiddlewareDefinition<any> | IEventDefinition<any>;
63
+ export type RegisterableItems<T = any> = IResourceWithConfig<any> | IResource<void, any, any, any> | IResource<{
64
+ [K in any]?: any;
65
+ }, any, any, any> | ITask<any, any, any, any> | IMiddleware<any> | IEvent<any>;
66
+ export type MiddlewareAttachments = IMiddleware<void> | IMiddleware<{
67
+ [K in any]?: any;
68
+ }> | IMiddlewareConfigured<any>;
49
69
  export interface ITaskDefinition<TInput = any, TOutput extends Promise<any> = any, TDependencies extends DependencyMapType = {}, TOn extends "*" | IEventDefinition<any> | undefined = undefined> {
50
- id: string;
70
+ id?: string | symbol;
51
71
  dependencies?: TDependencies | (() => TDependencies);
52
- middleware?: IMiddlewareDefinition[];
72
+ middleware?: MiddlewareAttachments[];
53
73
  /**
54
74
  * Listen to events in a simple way
55
75
  */
@@ -60,14 +80,15 @@ export interface ITaskDefinition<TInput = any, TOutput extends Promise<any> = an
60
80
  */
61
81
  listenerOrder?: number;
62
82
  meta?: ITaskMeta;
63
- run: (input: TOn extends undefined ? TInput : IEvent<TOn extends "*" ? any : ExtractEventParams<TOn>>, dependencies: DependencyValuesType<TDependencies>) => TOutput;
83
+ run: (input: TOn extends undefined ? TInput : IEventEmission<TOn extends "*" ? any : ExtractEventParams<TOn>>, dependencies: DependencyValuesType<TDependencies>) => TOutput;
64
84
  }
65
85
  export type BeforeRunEventPayload<TInput> = {
66
86
  input: TInput;
67
87
  };
68
88
  export type AfterRunEventPayload<TInput, TOutput> = {
69
89
  input: TInput;
70
- output: TOutput;
90
+ output: TOutput extends Promise<infer U> ? U : TOutput;
91
+ setOutput(newOutput: TOutput extends Promise<infer U> ? U : TOutput): void;
71
92
  };
72
93
  export type OnErrorEventPayload = {
73
94
  error: any;
@@ -87,58 +108,87 @@ export type AfterInitEventPayload<TConfig, TValue> = {
87
108
  * This is the response after the definition has been prepared. TODO: better naming?
88
109
  */
89
110
  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> {
111
+ id: string | symbol;
90
112
  dependencies: TDependencies | (() => TDependencies);
91
113
  computedDependencies?: DependencyValuesType<TDependencies>;
92
- middleware: IMiddlewareDefinition[];
114
+ middleware: MiddlewareAttachments[];
93
115
  /**
94
116
  * These events are automatically populated after the task has been defined.
95
117
  */
96
118
  events: {
97
- beforeRun: IEventDefinition<BeforeRunEventPayload<TInput>>;
98
- afterRun: IEventDefinition<AfterRunEventPayload<TInput, TOutput>>;
99
- onError: IEventDefinition<OnErrorEventPayload>;
119
+ beforeRun: IEvent<BeforeRunEventPayload<TInput>>;
120
+ afterRun: IEvent<AfterRunEventPayload<TInput, TOutput>>;
121
+ onError: IEvent<OnErrorEventPayload>;
100
122
  };
101
123
  }
102
- export interface IResourceDefinition<TConfig = any, TValue = unknown, TDependencies extends DependencyMapType = {}, TRegisterableItems = any> {
103
- id: string;
124
+ export interface IResourceDefinition<TConfig = any, TValue = unknown, TDependencies extends DependencyMapType = {}, TContext = any, THooks = any, TRegisterableItems = any> {
125
+ id?: string | symbol;
104
126
  dependencies?: TDependencies | ((config: TConfig) => TDependencies);
105
127
  register?: Array<RegisterableItems> | ((config: TConfig) => Array<RegisterableItems>);
106
- init?: (config: TConfig, dependencies: DependencyValuesType<TDependencies>) => Promise<TValue>;
128
+ init?: (this: any, config: TConfig, dependencies: DependencyValuesType<TDependencies>, context: TContext) => Promise<TValue>;
107
129
  /**
108
130
  * Clean-up function for the resource. This is called when the resource is no longer needed.
109
131
  *
110
- * @param value The value of the resource
132
+ * @param value The value of the resource (undefined if no init method)
111
133
  * @param config The configuration it received
112
134
  * @param dependencies The dependencies it needed
113
- * @returns
135
+ * @returns Promise<void>
114
136
  */
115
- dispose?: (value: TValue, config: TConfig, dependencies: DependencyValuesType<TDependencies>) => Promise<TValue>;
137
+ dispose?: (this: any, value: TValue, config: TConfig, dependencies: DependencyValuesType<TDependencies>, context: TContext) => Promise<void>;
116
138
  meta?: IResourceMeta;
117
139
  overrides?: Array<IResource | ITask | IMiddleware | IResourceWithConfig>;
118
- middleware?: IMiddlewareDefinition[];
140
+ middleware?: MiddlewareAttachments[];
141
+ context?: () => TContext;
142
+ /**
143
+ * This is optional and used from an index resource to get the correct caller.
144
+ */
145
+ [symbolFilePath]?: string;
146
+ /**
147
+ * This is used internally when creating index resources.
148
+ */
149
+ [symbolIndexResource]?: boolean;
119
150
  }
120
- export interface IResource<TConfig = void, TValue = any, TDependencies extends DependencyMapType = any> extends IResourceDefinition<TConfig, TValue, TDependencies> {
121
- init: (config: TConfig, dependencies: DependencyValuesType<TDependencies>) => Promise<TValue>;
151
+ export interface IResource<TConfig = void, TValue = any, TDependencies extends DependencyMapType = any, TContext = any> extends IResourceDefinition<TConfig, TValue, TDependencies, TContext> {
152
+ id: string | symbol;
122
153
  with(config: TConfig): IResourceWithConfig<TConfig, TValue, TDependencies>;
123
154
  register: Array<RegisterableItems> | ((config: TConfig) => Array<RegisterableItems>);
124
155
  /**
125
156
  * These events are automatically populated after the task has been defined.
126
157
  */
127
158
  events: {
128
- beforeInit: IEventDefinition<BeforeInitEventPayload<TConfig>>;
129
- afterInit: IEventDefinition<AfterInitEventPayload<TConfig, TValue>>;
130
- onError: IEventDefinition<OnErrorEventPayload>;
159
+ beforeInit: IEvent<BeforeInitEventPayload<TConfig>>;
160
+ afterInit: IEvent<AfterInitEventPayload<TConfig, TValue>>;
161
+ onError: IEvent<OnErrorEventPayload>;
131
162
  };
132
163
  overrides: Array<IResource | ITask | IMiddleware | IResourceWithConfig>;
133
- middleware: IMiddlewareDefinition[];
164
+ middleware: MiddlewareAttachments[];
134
165
  }
135
166
  export interface IResourceWithConfig<TConfig = any, TValue = any, TDependencies extends DependencyMapType = any> {
136
167
  id: string;
137
168
  resource: IResource<TConfig, TValue, TDependencies>;
138
169
  config: TConfig;
139
170
  }
140
- export interface IEvent<TPayload = any> {
141
- id: string;
171
+ export type EventHandlerType<T = any> = (event: IEventEmission<T>) => any | Promise<any>;
172
+ export interface IEventDefinition<TPayload = void> {
173
+ id?: string | symbol;
174
+ meta?: IEventMeta;
175
+ }
176
+ export interface IEvent<TPayload = any> extends IEventDefinition<TPayload> {
177
+ id: string | symbol;
178
+ /**
179
+ * 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.
180
+ */
181
+ [symbolEvent]: true;
182
+ }
183
+ /**
184
+ * This represents the object that is passed to event handlers
185
+ */
186
+ export interface IEventEmission<TPayload = any> {
187
+ /**
188
+ * The ID of the event. This is the same as the event's ID.
189
+ * This is useful for global event listeners.
190
+ */
191
+ id: string | symbol;
142
192
  /**
143
193
  * The data that the event carries. It can be anything.
144
194
  */
@@ -150,54 +200,40 @@ export interface IEvent<TPayload = any> {
150
200
  /**
151
201
  * The source of the event. This can be useful for debugging.
152
202
  */
153
- source: string;
154
- }
155
- export type EventHandlerType<T = any> = (event: IEvent<T>) => any | Promise<any>;
156
- export interface IEventDefinitionConfig<TPayload = void> {
157
- id: string;
158
- meta?: IEventMeta;
203
+ source: string | symbol;
159
204
  }
160
- export interface IEventDefinition<TPayload = void> {
161
- id: string;
162
- /**
163
- * 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.
164
- */
165
- [symbolEvent]: true;
166
- meta?: IEventMeta;
167
- }
168
- export interface IMiddlewareDefinition<TDependencies extends DependencyMapType = any> {
169
- id: string;
205
+ export interface IMiddlewareDefinition<TConfig = any, TDependencies extends DependencyMapType = any> {
206
+ id?: string | symbol;
170
207
  dependencies?: TDependencies | (() => TDependencies);
171
- run: (input: IMiddlewareExecutionInput, dependencies: DependencyValuesType<TDependencies>) => Promise<any>;
208
+ run: (input: IMiddlewareExecutionInput, dependencies: DependencyValuesType<TDependencies>, config: TConfig) => Promise<any>;
172
209
  meta?: IMiddlewareMeta;
173
210
  }
174
- export interface IMiddleware<TDependencies extends DependencyMapType = any> extends IMiddlewareDefinition<TDependencies> {
211
+ export interface IMiddleware<TConfig = any, TDependencies extends DependencyMapType = any> extends IMiddlewareDefinition<TConfig, TDependencies> {
212
+ [symbolMiddleware]: true;
213
+ [symbolMiddlewareConfigured]?: boolean;
214
+ [symbolMiddlewareEverywhereTasks]?: boolean;
215
+ [symbolMiddlewareEverywhereResources]?: boolean;
216
+ id: string | symbol;
175
217
  dependencies: TDependencies | (() => TDependencies);
176
- global(): IMiddleware<TDependencies>;
218
+ everywhere(config?: MiddlewareEverywhereOptions): IMiddleware<TConfig, TDependencies>;
219
+ config: TConfig;
220
+ with: (config: TConfig) => IMiddlewareConfigured<TConfig, TDependencies>;
221
+ }
222
+ export interface IMiddlewareConfigured<TConfig = any, TDependencies extends DependencyMapType = any> extends IMiddleware<TConfig, TDependencies> {
223
+ [symbolMiddlewareConfigured]: true;
177
224
  }
178
225
  export interface IMiddlewareDefinitionConfigured<C extends Record<string, any> = {}> {
179
226
  middleware: IMiddleware<C>;
180
227
  config?: C;
181
228
  }
182
- export interface IMiddlewareExecutionInput {
183
- taskDefinition?: ITask;
184
- resourceDefinition?: IResource;
185
- config?: any;
186
- input?: any;
187
- next: (taskInputOrResourceConfig?: any) => Promise<any>;
188
- }
189
- export interface IHookDefinition<D extends DependencyMapType = {}, T = any, B extends boolean = false> {
190
- event: "*" | IEventDefinition<T>;
191
- /**
192
- * The higher the number, the higher the priority.
193
- * We recommend using numbers between -1000 and 1000.
194
- */
195
- order?: number;
196
- /**
197
- * These are hooks that run before any resource instantiation.
198
- * @param event
199
- */
200
- early?: B;
201
- run: (event: IEvent<T>, dependencies: T extends true ? void : DependencyValuesType<D>) => Promise<void> | void;
229
+ export interface IMiddlewareExecutionInput<TTaskInput = any, TResourceConfig = any> {
230
+ task?: {
231
+ definition: ITask<TTaskInput>;
232
+ input: TTaskInput;
233
+ };
234
+ resource?: {
235
+ definition: IResource<TResourceConfig>;
236
+ config: TResourceConfig;
237
+ };
238
+ next: (taskInputOrResourceConfig?: TTaskInput | TResourceConfig) => Promise<any>;
202
239
  }
203
- export {};
package/dist/defs.js CHANGED
@@ -1,20 +1,30 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.symbols = exports.symbolFilePath = exports.symbolMiddlewareGlobal = exports.symbolMiddleware = exports.symbolEvent = exports.symbolResourceWithConfig = exports.symbolResource = exports.symbolTask = void 0;
3
+ exports.symbols = exports.symbolIndexResource = 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;
4
4
  exports.symbolTask = Symbol("runner.task");
5
5
  exports.symbolResource = Symbol("runner.resource");
6
6
  exports.symbolResourceWithConfig = Symbol("runner.resourceWithConfig");
7
7
  exports.symbolEvent = Symbol("runner.event");
8
8
  exports.symbolMiddleware = Symbol("runner.middleware");
9
+ exports.symbolMiddlewareConfigured = Symbol("runner.middlewareConfigured");
9
10
  exports.symbolMiddlewareGlobal = Symbol("runner.middlewareGlobal");
11
+ exports.symbolMiddlewareEverywhereTasks = Symbol("runner.middlewareGlobalTasks");
12
+ exports.symbolMiddlewareEverywhereResources = Symbol("runner.middlewareGlobalResources");
10
13
  exports.symbolFilePath = Symbol("runner.filePath");
14
+ exports.symbolDispose = Symbol("runner.dispose");
15
+ exports.symbolStore = Symbol("runner.store");
16
+ exports.symbolIndexResource = Symbol("runner.indexResource");
11
17
  exports.symbols = {
12
18
  task: exports.symbolTask,
13
19
  resource: exports.symbolResource,
14
20
  resourceWithConfig: exports.symbolResourceWithConfig,
21
+ indexResource: exports.symbolIndexResource,
15
22
  event: exports.symbolEvent,
16
23
  middleware: exports.symbolMiddleware,
17
- middlewareGlobal: exports.symbolMiddlewareGlobal,
24
+ middlewareEverywhereTasks: exports.symbolMiddlewareEverywhereTasks,
25
+ middlewareEverywhereResources: exports.symbolMiddlewareEverywhereResources,
18
26
  filePath: exports.symbolFilePath,
27
+ dispose: exports.symbolDispose,
28
+ store: exports.symbolStore,
19
29
  };
20
30
  //# sourceMappingURL=defs.js.map
package/dist/defs.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"defs.js","sourceRoot":"","sources":["../src/defs.ts"],"names":[],"mappings":";;;AAAa,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,sBAAsB,GAAkB,MAAM,CACzD,yBAAyB,CAC1B,CAAC;AAEW,QAAA,cAAc,GAAkB,MAAM,CAAC,iBAAiB,CAAC,CAAC;AAE1D,QAAA,OAAO,GAAG;IACrB,IAAI,EAAE,kBAAU;IAChB,QAAQ,EAAE,sBAAc;IACxB,kBAAkB,EAAE,gCAAwB;IAC5C,KAAK,EAAE,mBAAW;IAClB,UAAU,EAAE,wBAAgB;IAC5B,gBAAgB,EAAE,8BAAsB;IACxC,QAAQ,EAAE,sBAAc;CACzB,CAAC"}
1
+ {"version":3,"file":"defs.js","sourceRoot":"","sources":["../src/defs.ts"],"names":[],"mappings":";;;AAKa,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,mBAAmB,GAAkB,MAAM,CACtD,sBAAsB,CACvB,CAAC;AAEW,QAAA,OAAO,GAAG;IACrB,IAAI,EAAE,kBAAU;IAChB,QAAQ,EAAE,sBAAc;IACxB,kBAAkB,EAAE,gCAAwB;IAC5C,aAAa,EAAE,2BAAmB;IAClC,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"}
package/dist/errors.d.ts CHANGED
@@ -1,10 +1,10 @@
1
1
  export declare const Errors: {
2
- duplicateRegistration: (type: string, id: string) => Error;
3
- dependencyNotFound: (key: string) => Error;
2
+ duplicateRegistration: (type: string, id: string | symbol) => Error;
3
+ dependencyNotFound: (key: string | symbol) => Error;
4
4
  unknownItemType: (item: any) => Error;
5
5
  circularDependencies: (cycles: string[]) => Error;
6
- eventNotFound: (id: string) => Error;
7
- middlewareAlreadyGlobal: (id: string) => Error;
8
- locked: (what: string) => Error;
6
+ eventNotFound: (id: string | symbol) => Error;
7
+ middlewareAlreadyGlobal: (id: string | symbol) => Error;
8
+ locked: (what: string | symbol) => Error;
9
9
  storeAlreadyInitialized: () => Error;
10
10
  };
package/dist/errors.js CHANGED
@@ -2,13 +2,14 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Errors = void 0;
4
4
  exports.Errors = {
5
- duplicateRegistration: (type, id) => new Error(`${type} "${id}" already registered`),
6
- dependencyNotFound: (key) => new Error(`Dependency ${key} not found. Did you forget to register it through a resource?`),
5
+ duplicateRegistration: (type, id) => new Error(`${type} "${id.toString()}" already registered`),
6
+ dependencyNotFound: (key) => new Error(`Dependency ${key.toString()} not found. Did you forget to register it through a resource?`),
7
7
  unknownItemType: (item) => new Error(`Unknown item type: ${item}`),
8
8
  circularDependencies: (cycles) => new Error(`Circular dependencies detected: ${cycles.join(", ")}`),
9
- eventNotFound: (id) => new Error(`Event "${id}" not found. Did you forget to register it?`),
10
- middlewareAlreadyGlobal: (id) => new Error("Cannot call global on a global middleware: " + id),
11
- locked: (what) => new Error(`Cannot modify the ${what} when it is locked.`),
9
+ eventNotFound: (id) => new Error(`Event "${id.toString()}" not found. Did you forget to register it?`),
10
+ middlewareAlreadyGlobal: (id) => new Error("Cannot call .everywhere() on an already global middleware: " +
11
+ id.toString),
12
+ locked: (what) => new Error(`Cannot modify the ${what.toString()} when it is locked.`),
12
13
  storeAlreadyInitialized: () => new Error("Store already initialized. Cannot reinitialize."),
13
14
  };
14
15
  //# sourceMappingURL=errors.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":";;;AAEa,QAAA,MAAM,GAAG;IACpB,qBAAqB,EAAE,CAAC,IAAY,EAAE,EAAU,EAAE,EAAE,CAClD,IAAI,KAAK,CAAC,GAAG,IAAI,KAAK,EAAE,sBAAsB,CAAC;IAEjD,kBAAkB,EAAE,CAAC,GAAW,EAAE,EAAE,CAClC,IAAI,KAAK,CACP,cAAc,GAAG,+DAA+D,CACjF;IAEH,eAAe,EAAE,CAAC,IAAS,EAAE,EAAE,CAAC,IAAI,KAAK,CAAC,sBAAsB,IAAI,EAAE,CAAC;IAEvE,oBAAoB,EAAE,CAAC,MAAgB,EAAE,EAAE,CACzC,IAAI,KAAK,CAAC,mCAAmC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IAEnE,aAAa,EAAE,CAAC,EAAU,EAAE,EAAE,CAC5B,IAAI,KAAK,CAAC,UAAU,EAAE,6CAA6C,CAAC;IAEtE,uBAAuB,EAAE,CAAC,EAAU,EAAE,EAAE,CACtC,IAAI,KAAK,CAAC,6CAA6C,GAAG,EAAE,CAAC;IAE/D,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE,CACvB,IAAI,KAAK,CAAC,qBAAqB,IAAI,qBAAqB,CAAC;IAE3D,uBAAuB,EAAE,GAAG,EAAE,CAC5B,IAAI,KAAK,CAAC,iDAAiD,CAAC;CAC/D,CAAC"}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":";;;AAEa,QAAA,MAAM,GAAG;IACpB,qBAAqB,EAAE,CAAC,IAAY,EAAE,EAAmB,EAAE,EAAE,CAC3D,IAAI,KAAK,CAAC,GAAG,IAAI,KAAK,EAAE,CAAC,QAAQ,EAAE,sBAAsB,CAAC;IAE5D,kBAAkB,EAAE,CAAC,GAAoB,EAAE,EAAE,CAC3C,IAAI,KAAK,CACP,cAAc,GAAG,CAAC,QAAQ,EAAE,+DAA+D,CAC5F;IAEH,eAAe,EAAE,CAAC,IAAS,EAAE,EAAE,CAAC,IAAI,KAAK,CAAC,sBAAsB,IAAI,EAAE,CAAC;IAEvE,oBAAoB,EAAE,CAAC,MAAgB,EAAE,EAAE,CACzC,IAAI,KAAK,CAAC,mCAAmC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IAEnE,aAAa,EAAE,CAAC,EAAmB,EAAE,EAAE,CACrC,IAAI,KAAK,CACP,UAAU,EAAE,CAAC,QAAQ,EAAE,6CAA6C,CACrE;IAEH,uBAAuB,EAAE,CAAC,EAAmB,EAAE,EAAE,CAC/C,IAAI,KAAK,CACP,6DAA6D;QAC3D,EAAE,CAAC,QAAQ,CACd;IAEH,MAAM,EAAE,CAAC,IAAqB,EAAE,EAAE,CAChC,IAAI,KAAK,CAAC,qBAAqB,IAAI,CAAC,QAAQ,EAAE,qBAAqB,CAAC;IAEtE,uBAAuB,EAAE,GAAG,EAAE,CAC5B,IAAI,KAAK,CAAC,iDAAiD,CAAC;CAC/D,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { IEventMeta } from "./common.types";
2
+ import { symbolEvent } from "./symbols";
3
+ export interface IEvent<TPayload = any> {
4
+ id: string;
5
+ data: TPayload;
6
+ timestamp: Date;
7
+ source: string;
8
+ }
9
+ export type EventHandlerType<T = any> = (event: IEvent<T>) => any | Promise<any>;
10
+ export interface IEventDefinitionConfig<TPayload = void> {
11
+ id: string;
12
+ meta?: IEventMeta;
13
+ }
14
+ export interface IEventDefinition<TPayload = void> {
15
+ id: string;
16
+ [symbolEvent]: true;
17
+ meta?: IEventMeta;
18
+ }
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const symbols_1 = require("./symbols");
4
+ //# sourceMappingURL=event.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event.types.js","sourceRoot":"","sources":["../src/event.types.ts"],"names":[],"mappings":";;AACA,uCAAwC"}
@@ -0,0 +1,122 @@
1
+ export declare const userPackage: import("../defs").IRegistrator<(import("../defs").IEventDefinition<{
2
+ userId: string;
3
+ email: string;
4
+ }> | import("../defs").IResource<void, {
5
+ createUser: (email: string) => Promise<{
6
+ id: string;
7
+ email: string;
8
+ }>;
9
+ getUser: (id: string) => Promise<{
10
+ id: string;
11
+ email: string;
12
+ }>;
13
+ }, {}> | import("../defs").ITask<string, Promise<{
14
+ id: string;
15
+ email: string;
16
+ }>, {
17
+ userService: import("../defs").IResource<void, {
18
+ createUser: (email: string) => Promise<{
19
+ id: string;
20
+ email: string;
21
+ }>;
22
+ getUser: (id: string) => Promise<{
23
+ id: string;
24
+ email: string;
25
+ }>;
26
+ }, {}>;
27
+ userCreatedEvent: import("../defs").IEventDefinition<{
28
+ userId: string;
29
+ email: string;
30
+ }>;
31
+ }, undefined>)[]> & import("../defs").IResource<void, {
32
+ items: ({
33
+ createUser: (email: string) => Promise<{
34
+ id: string;
35
+ email: string;
36
+ }>;
37
+ getUser: (id: string) => Promise<{
38
+ id: string;
39
+ email: string;
40
+ }>;
41
+ } | ((args_0: string) => Promise<{
42
+ id: string;
43
+ email: string;
44
+ }>) | ((input: {
45
+ userId: string;
46
+ email: string;
47
+ }) => Promise<void>))[];
48
+ }, any>;
49
+ export declare const loggingPackage: import("../defs").IRegistrator<(import("../defs").IEventDefinition<{
50
+ level: string;
51
+ message: string;
52
+ }> | import("../defs").IMiddleware<{
53
+ logEvent: import("../defs").IEventDefinition<{
54
+ level: string;
55
+ message: string;
56
+ }>;
57
+ }> | import("../defs").IResource<void, {
58
+ info: (message: string) => Promise<void>;
59
+ error: (message: string) => Promise<void>;
60
+ }, {
61
+ logEvent: import("../defs").IEventDefinition<{
62
+ level: string;
63
+ message: string;
64
+ }>;
65
+ }>)[]> & import("../defs").IResource<void, {
66
+ items: ({
67
+ info: (message: string) => Promise<void>;
68
+ error: (message: string) => Promise<void>;
69
+ } | ((input: {
70
+ level: string;
71
+ message: string;
72
+ }) => Promise<void>))[];
73
+ }, any>;
74
+ export declare const emailPackage: import("../defs").IRegistrator<(import("../defs").IEventDefinition<{
75
+ to: string;
76
+ subject: string;
77
+ }> | import("../defs").IResource<void, {
78
+ sendEmail: (to: string, subject: string, body: string) => Promise<{
79
+ messageId: string;
80
+ }>;
81
+ }, {
82
+ emailSentEvent: import("../defs").IEventDefinition<{
83
+ to: string;
84
+ subject: string;
85
+ }>;
86
+ }> | import("../defs").ITask<undefined, Promise<{
87
+ messageId: string;
88
+ }>, {
89
+ emailService: import("../defs").IResource<void, {
90
+ sendEmail: (to: string, subject: string, body: string) => Promise<{
91
+ messageId: string;
92
+ }>;
93
+ }, {
94
+ emailSentEvent: import("../defs").IEventDefinition<{
95
+ to: string;
96
+ subject: string;
97
+ }>;
98
+ }>;
99
+ }, import("../defs").IEventDefinition<{
100
+ userId: string;
101
+ email: string;
102
+ }>>)[]> & import("../defs").IResource<void, {
103
+ items: ({
104
+ sendEmail: (to: string, subject: string, body: string) => Promise<{
105
+ messageId: string;
106
+ }>;
107
+ } | ((input: {
108
+ to: string;
109
+ subject: string;
110
+ }) => Promise<void>))[];
111
+ }, any>;
112
+ declare function demonstrateRegistrators(): Promise<{
113
+ createUser: (args_0: string) => Promise<{
114
+ id: string;
115
+ email: string;
116
+ }>;
117
+ logger: {
118
+ info: (message: string) => Promise<void>;
119
+ error: (message: string) => Promise<void>;
120
+ };
121
+ }>;
122
+ export { demonstrateRegistrators };