@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,217 @@
1
+ import {
2
+ DependencyMapType,
3
+ IMiddlewareDefinition,
4
+ IEventDefinition,
5
+ IResource,
6
+ ITask,
7
+ IResourceWithConfig,
8
+ RegisterableItems,
9
+ IMiddleware,
10
+ symbolMiddlewareEverywhereResources,
11
+ symbolMiddlewareEverywhereTasks,
12
+ } from "../defs";
13
+ import * as utils from "../define";
14
+ import { Errors } from "../errors";
15
+ import {
16
+ TaskStoreElementType,
17
+ MiddlewareStoreElementType,
18
+ ResourceStoreElementType,
19
+ EventStoreElementType
20
+ } from "./StoreTypes";
21
+ import { StoreValidator } from "./StoreValidator";
22
+
23
+ export class StoreRegistry {
24
+ public tasks: Map<string, TaskStoreElementType> = new Map();
25
+ public resources: Map<string, ResourceStoreElementType> = new Map();
26
+ public events: Map<string, EventStoreElementType> = new Map();
27
+ public middlewares: Map<string, MiddlewareStoreElementType> = new Map();
28
+
29
+ private validator: StoreValidator;
30
+
31
+ constructor() {
32
+ this.validator = new StoreValidator(this.tasks, this.resources, this.events, this.middlewares);
33
+ }
34
+
35
+ getValidator(): StoreValidator {
36
+ return this.validator;
37
+ }
38
+
39
+ storeGenericItem<C>(item: RegisterableItems) {
40
+ if (utils.isTask(item)) {
41
+ this.storeTask<C>(item);
42
+ } else if (utils.isResource(item)) {
43
+ this.storeResource<C>(item);
44
+ } else if (utils.isEvent(item)) {
45
+ this.storeEvent<C>(item);
46
+ } else if (utils.isMiddleware(item)) {
47
+ this.storeMiddleware<C>(item);
48
+ } else if (utils.isResourceWithConfig(item)) {
49
+ this.storeResourceWithConfig<C>(item);
50
+ } else {
51
+ throw Errors.unknownItemType(item);
52
+ }
53
+ }
54
+
55
+ storeMiddleware<C>(item: IMiddleware<any>, check = true) {
56
+ check && this.validator.checkIfIDExists(item.id);
57
+
58
+ item.dependencies =
59
+ typeof item.dependencies === "function"
60
+ ? item.dependencies()
61
+ : item.dependencies;
62
+
63
+ this.middlewares.set(item.id, {
64
+ middleware: item,
65
+ computedDependencies: {},
66
+ });
67
+ }
68
+
69
+ storeEvent<C>(item: IEventDefinition<void>) {
70
+ this.validator.checkIfIDExists(item.id);
71
+ this.events.set(item.id, { event: item });
72
+ }
73
+
74
+ storeResourceWithConfig<C>(
75
+ item: IResourceWithConfig<any, any, any>,
76
+ check = true
77
+ ) {
78
+ check && this.validator.checkIfIDExists(item.resource.id);
79
+
80
+ this.prepareResource(item.resource, item.config);
81
+
82
+ this.resources.set(item.resource.id, {
83
+ resource: item.resource,
84
+ config: item.config,
85
+ value: undefined,
86
+ isInitialized: false,
87
+ context: {},
88
+ });
89
+
90
+ this.computeRegistrationDeeply(item.resource, item.config);
91
+ return item.resource;
92
+ }
93
+
94
+ computeRegistrationDeeply<C>(element: IResource<C>, config?: C) {
95
+ const items =
96
+ typeof element.register === "function"
97
+ ? element.register(config as C)
98
+ : element.register;
99
+
100
+ // if it was a computed function ensure the registered terms are stored, not the function.
101
+ element.register = items;
102
+
103
+ for (const item of items) {
104
+ // will call registration if it detects another resource.
105
+ this.storeGenericItem<C>(item);
106
+ }
107
+ }
108
+
109
+ storeResource<C>(item: IResource<any, any, any>, check = true) {
110
+ check && this.validator.checkIfIDExists(item.id);
111
+
112
+ this.prepareResource(item, {});
113
+
114
+ this.resources.set(item.id, {
115
+ resource: item,
116
+ config: {},
117
+ value: undefined,
118
+ isInitialized: false,
119
+ context: item.context?.() || {},
120
+ });
121
+
122
+ this.computeRegistrationDeeply(item, {});
123
+ return item;
124
+ }
125
+
126
+ storeTask<C>(item: ITask<any, any, {}>, check = true) {
127
+ check && this.validator.checkIfIDExists(item.id);
128
+
129
+ item.dependencies =
130
+ typeof item.dependencies === "function"
131
+ ? item.dependencies()
132
+ : item.dependencies;
133
+
134
+ this.tasks.set(item.id, {
135
+ task: item,
136
+ computedDependencies: {},
137
+ isInitialized: false,
138
+ });
139
+ }
140
+
141
+ storeEventsForAllTasks() {
142
+ for (const task of this.tasks.values()) {
143
+ this.storeEvent(task.task.events.beforeRun);
144
+ this.storeEvent(task.task.events.afterRun);
145
+ this.storeEvent(task.task.events.onError);
146
+ }
147
+
148
+ for (const resource of this.resources.values()) {
149
+ this.storeEvent(resource.resource.events.beforeInit);
150
+ this.storeEvent(resource.resource.events.afterInit);
151
+ this.storeEvent(resource.resource.events.onError);
152
+ }
153
+ }
154
+
155
+ getEverywhereMiddlewareForTasks(excludingIds: string[]): IMiddleware[] {
156
+ return Array.from(this.middlewares.values())
157
+ .filter((x) => x.middleware[symbolMiddlewareEverywhereTasks])
158
+ .filter((x) => !excludingIds.includes(x.middleware.id))
159
+ .map((x) => x.middleware);
160
+ }
161
+
162
+ getEverywhereMiddlewareForResources(excludingIds: string[]): IMiddleware[] {
163
+ return Array.from(this.middlewares.values())
164
+ .filter((x) => x.middleware[symbolMiddlewareEverywhereResources])
165
+ .filter((x) => !excludingIds.includes(x.middleware.id))
166
+ .map((x) => x.middleware);
167
+ }
168
+
169
+ private prepareResource<C>(
170
+ item: IResource<any, any, any>,
171
+ config: any
172
+ ): IResource<any, any, any> {
173
+ item.dependencies =
174
+ typeof item.dependencies === "function"
175
+ ? item.dependencies(config)
176
+ : item.dependencies;
177
+
178
+ return item;
179
+ }
180
+
181
+ private middlewareAsMap(middleware: IMiddlewareDefinition[]) {
182
+ return middleware.reduce((acc, item) => {
183
+ acc[item.id] = item;
184
+ return acc;
185
+ }, {} as Record<string, IMiddlewareDefinition>);
186
+ }
187
+
188
+ getDependentNodes() {
189
+ const depenedants: any[] = [];
190
+ for (const task of this.tasks.values()) {
191
+ depenedants.push({
192
+ id: task.task.id,
193
+ dependencies: {
194
+ ...task.task.dependencies,
195
+ ...this.middlewareAsMap(task.task.middleware),
196
+ },
197
+ });
198
+ }
199
+ for (const middleware of this.middlewares.values()) {
200
+ depenedants.push({
201
+ id: middleware.middleware.id,
202
+ dependencies: middleware.middleware.dependencies,
203
+ });
204
+ }
205
+ for (const resource of this.resources.values()) {
206
+ depenedants.push({
207
+ id: resource.resource.id,
208
+ dependencies: {
209
+ ...resource.resource.dependencies,
210
+ ...this.middlewareAsMap(resource.resource.middleware),
211
+ },
212
+ });
213
+ }
214
+
215
+ return depenedants;
216
+ }
217
+ }
@@ -0,0 +1,46 @@
1
+ import {
2
+ DependencyMapType,
3
+ DependencyValuesType,
4
+ IMiddlewareDefinition,
5
+ IEventDefinition,
6
+ IResource,
7
+ ITask,
8
+ IResourceWithConfig,
9
+ RegisterableItems,
10
+ IMiddleware,
11
+ } from "../defs";
12
+
13
+ export type ResourceStoreElementType<
14
+ C = any,
15
+ V = any,
16
+ D extends DependencyMapType = {},
17
+ TContext = any
18
+ > = {
19
+ resource: IResource<C, V, D>;
20
+ computedDependencies?: DependencyValuesType<D>;
21
+ config: C;
22
+ value: V;
23
+ context: TContext;
24
+ isInitialized?: boolean;
25
+ };
26
+
27
+ export type TaskStoreElementType<
28
+ Input = any,
29
+ Output extends Promise<any> = any,
30
+ D extends DependencyMapType = any,
31
+ TOn extends "*" | IEventDefinition | undefined = any
32
+ > = {
33
+ task: ITask<Input, Output, D, TOn>;
34
+ computedDependencies: DependencyValuesType<D>;
35
+ isInitialized: boolean;
36
+ };
37
+
38
+ export type MiddlewareStoreElementType<TDeps extends DependencyMapType = any> =
39
+ {
40
+ middleware: IMiddleware<TDeps>;
41
+ computedDependencies: DependencyValuesType<TDeps>;
42
+ };
43
+
44
+ export type EventStoreElementType = {
45
+ event: IEventDefinition;
46
+ };
@@ -0,0 +1,38 @@
1
+ import { Errors } from "../errors";
2
+ import { TaskStoreElementType, MiddlewareStoreElementType, ResourceStoreElementType, EventStoreElementType } from "./StoreTypes";
3
+
4
+ export class StoreValidator {
5
+ constructor(
6
+ private tasks: Map<string, TaskStoreElementType>,
7
+ private resources: Map<string, ResourceStoreElementType>,
8
+ private events: Map<string, EventStoreElementType>,
9
+ private middlewares: Map<string, MiddlewareStoreElementType>
10
+ ) {}
11
+
12
+ checkIfIDExists(id: string): void | never {
13
+ if (this.tasks.has(id)) {
14
+ throw Errors.duplicateRegistration("Task", id);
15
+ }
16
+ if (this.resources.has(id)) {
17
+ throw Errors.duplicateRegistration("Resource", id);
18
+ }
19
+ if (this.events.has(id)) {
20
+ throw Errors.duplicateRegistration("Event", id);
21
+ }
22
+ if (this.middlewares.has(id)) {
23
+ throw Errors.duplicateRegistration("Middleware", id);
24
+ }
25
+ }
26
+
27
+ runSanityChecks() {
28
+ for (const task of this.tasks.values()) {
29
+ task.task.middleware.forEach((middleware) => {
30
+ if (!this.middlewares.has(middleware.id)) {
31
+ throw Errors.dependencyNotFound(
32
+ `Middleware ${middleware.id} in Task ${task.task.id}`
33
+ );
34
+ }
35
+ });
36
+ }
37
+ }
38
+ }
@@ -1,12 +1,9 @@
1
1
  import { DependencyMapType, DependencyValuesType, ITask } from "../defs";
2
2
  import { Errors } from "../errors";
3
3
  import { EventManager } from "./EventManager";
4
- import { globalEvents } from "../globalEvents";
5
- import {
6
- MiddlewareStoreElementType,
7
- Store,
8
- TaskStoreElementType,
9
- } from "./Store";
4
+ import { globalEvents } from "../globals/globalEvents";
5
+ import { Store } from "./Store";
6
+ import { MiddlewareStoreElementType } from "./StoreTypes";
10
7
  import { Logger } from "./Logger";
11
8
 
12
9
  export class TaskRunner {
@@ -68,12 +65,24 @@ export class TaskRunner {
68
65
  let error;
69
66
  try {
70
67
  // craft the next function starting from the first next function
71
- const output = await runner(input);
72
-
68
+ const result = {
69
+ output: await runner(input),
70
+ };
71
+ const setOutput = (newOutput: any) => {
72
+ result.output = newOutput;
73
+ };
74
+
75
+ // If it's a global event listener, we stop emitting so we don't get into an infinite loop.
73
76
  if (!isGlobalEventListener) {
74
77
  await this.eventManager.emit(
75
78
  task.events.afterRun,
76
- { input, output },
79
+ {
80
+ input,
81
+ get output() {
82
+ return result.output;
83
+ },
84
+ setOutput,
85
+ },
77
86
  task.id
78
87
  );
79
88
  }
@@ -83,18 +92,22 @@ export class TaskRunner {
83
92
  task.on !== globalEvents.tasks.beforeRun &&
84
93
  task.on !== globalEvents.tasks.afterRun
85
94
  ) {
95
+ // If it's a lifecycle listener we prevent from emitting further events.
86
96
  await this.eventManager.emit(
87
97
  globalEvents.tasks.afterRun,
88
98
  {
89
99
  task,
90
100
  input,
91
- output,
101
+ get output() {
102
+ return result.output;
103
+ },
104
+ setOutput,
92
105
  },
93
106
  task.id
94
107
  );
95
108
  }
96
109
 
97
- return output;
110
+ return result.output;
98
111
  } catch (e) {
99
112
  let isSuppressed = false;
100
113
  function suppress() {
@@ -136,46 +149,46 @@ export class TaskRunner {
136
149
  TDeps extends DependencyMapType
137
150
  >(task: ITask<TInput, TOutput, TDeps>) {
138
151
  const storeTask = this.store.tasks.get(task.id);
139
- // this is the final next()
140
- let next = async (input) => {
141
- this.logger.debug(
142
- {
143
- message: `Running task ${task.id}`,
144
- input,
145
- },
146
- task.id
147
- );
148
152
 
153
+ // this is the final next()
154
+ let next = async (input: any) => {
149
155
  return task.run.call(null, input, storeTask?.computedDependencies as any);
150
156
  };
151
157
 
152
158
  const existingMiddlewares = task.middleware;
153
159
  const createdMiddlewares = [
154
- ...this.store.getGlobalMiddlewares(existingMiddlewares.map((x) => x.id)),
160
+ ...this.store.getEverywhereMiddlewareForTasks(
161
+ existingMiddlewares.map((x) => x.id)
162
+ ),
155
163
  ...existingMiddlewares,
156
164
  ];
157
165
 
158
- if (createdMiddlewares.length > 0) {
159
- // we need to run the middleware in reverse order
160
- // so we can chain the next function
161
- for (let i = createdMiddlewares.length - 1; i >= 0; i--) {
162
- const middleware = createdMiddlewares[i];
163
- const storeMiddleware = this.store.middlewares.get(
164
- middleware.id
165
- ) as MiddlewareStoreElementType; // we know it exists because at this stage all sanity checks have been done.
166
-
167
- const nextFunction = next;
168
- next = async (input) => {
169
- return storeMiddleware.middleware.run(
170
- {
171
- taskDefinition: task as any,
166
+ if (createdMiddlewares.length === 0) {
167
+ return next;
168
+ }
169
+
170
+ // we need to run the middleware in reverse order
171
+ // so we can chain the next function
172
+ for (let i = createdMiddlewares.length - 1; i >= 0; i--) {
173
+ const middleware = createdMiddlewares[i];
174
+ const storeMiddleware = this.store.middlewares.get(
175
+ middleware.id
176
+ ) as MiddlewareStoreElementType; // we know it exists because at this stage all sanity checks have been done.
177
+
178
+ const nextFunction = next;
179
+ next = async (input) => {
180
+ return storeMiddleware.middleware.run(
181
+ {
182
+ task: {
183
+ definition: task as any,
172
184
  input,
173
- next: nextFunction,
174
185
  },
175
- storeMiddleware.computedDependencies
176
- );
177
- };
178
- }
186
+ next: nextFunction,
187
+ },
188
+ storeMiddleware.computedDependencies,
189
+ middleware.config
190
+ );
191
+ };
179
192
  }
180
193
 
181
194
  return next;
@@ -3,3 +3,6 @@ export * from "./EventManager";
3
3
  export * from "./Logger";
4
4
  export * from "./Store";
5
5
  export * from "./TaskRunner";
6
+ export * from "./ResourceInitializer";
7
+ export * from "./Semaphore";
8
+ export * from "./Queue";
package/src/run.ts CHANGED
@@ -10,11 +10,11 @@ import {
10
10
  } from "./defs";
11
11
  import { DependencyProcessor } from "./models/DependencyProcessor";
12
12
  import { EventManager } from "./models/EventManager";
13
- import { globalEvents } from "./globalEvents";
13
+ import { globalEvents } from "./globals/globalEvents";
14
14
  import { Store } from "./models/Store";
15
15
  import { findCircularDependencies } from "./tools/findCircularDependencies";
16
16
  import { Errors } from "./errors";
17
- import { globalResources } from "./globalResources";
17
+ import { globalResources } from "./globals/globalResources";
18
18
  import { Logger } from "./models/Logger";
19
19
 
20
20
  export type ResourcesStoreElementType<
@@ -55,7 +55,7 @@ export type RunnerState = {
55
55
  export async function run<C, V>(
56
56
  resource: IResource<C, V>,
57
57
  config?: C
58
- ): Promise<V> {
58
+ ): Promise<{ value: V; dispose: () => Promise<void> }> {
59
59
  const eventManager = new EventManager();
60
60
 
61
61
  // ensure for logger, that it can be used only after: computeAllDependencies() has executed
@@ -106,5 +106,8 @@ export async function run<C, V>(
106
106
  // disallow manipulation or attaching more
107
107
  store.lock();
108
108
 
109
- return store.root.value;
109
+ return {
110
+ value: store.root.value,
111
+ dispose: () => store.dispose(),
112
+ };
110
113
  }
@@ -1,15 +0,0 @@
1
- import "./models/EventManager.test";
2
- import "./models/ResourceInitializer.test";
3
- import "./models/TaskRunner.test";
4
- import "./models/Store.test";
5
- import "./models/Logger.test";
6
-
7
- import "./tools/findCircularDependencies.test";
8
- import "./tools/getCallerFile.test";
9
-
10
- import "./run.test";
11
- import "./run.overrides.test";
12
- import "./run.middleware.test";
13
- import "./globalEvents.test";
14
- import "./errors.test";
15
- import "./typesafety.test";
@@ -1 +0,0 @@
1
- // TODO