@bluelibs/runner 1.1.0 → 1.2.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 (67) hide show
  1. package/README.md +191 -13
  2. package/dist/DependencyProcessor.d.ts +2 -2
  3. package/dist/DependencyProcessor.js +3 -3
  4. package/dist/DependencyProcessor.js.map +1 -1
  5. package/dist/Store.d.ts +24 -1
  6. package/dist/Store.js +108 -34
  7. package/dist/Store.js.map +1 -1
  8. package/dist/TaskRunner.d.ts +3 -0
  9. package/dist/TaskRunner.js +3 -0
  10. package/dist/TaskRunner.js.map +1 -1
  11. package/dist/define.js +1 -0
  12. package/dist/define.js.map +1 -1
  13. package/dist/defs.d.ts +6 -4
  14. package/dist/globalEvents.d.ts +2 -0
  15. package/dist/globalEvents.js +3 -0
  16. package/dist/globalEvents.js.map +1 -1
  17. package/dist/globalResources.d.ts +5 -3
  18. package/dist/globalResources.js +4 -0
  19. package/dist/globalResources.js.map +1 -1
  20. package/dist/index.d.ts +8 -6
  21. package/dist/index.js +3 -3
  22. package/dist/index.js.map +1 -1
  23. package/dist/models/DependencyProcessor.d.ts +49 -0
  24. package/dist/models/DependencyProcessor.js +178 -0
  25. package/dist/models/DependencyProcessor.js.map +1 -0
  26. package/dist/models/EventManager.d.ts +17 -0
  27. package/dist/models/EventManager.js +73 -0
  28. package/dist/models/EventManager.js.map +1 -0
  29. package/dist/models/Logger.d.ts +33 -0
  30. package/dist/models/Logger.js +76 -0
  31. package/dist/models/Logger.js.map +1 -0
  32. package/dist/models/ResourceInitializer.d.ts +13 -0
  33. package/dist/models/ResourceInitializer.js +54 -0
  34. package/dist/models/ResourceInitializer.js.map +1 -0
  35. package/dist/models/Store.d.ts +90 -0
  36. package/dist/models/Store.js +302 -0
  37. package/dist/models/Store.js.map +1 -0
  38. package/dist/models/TaskRunner.d.ts +25 -0
  39. package/dist/models/TaskRunner.js +96 -0
  40. package/dist/models/TaskRunner.js.map +1 -0
  41. package/dist/models/index.d.ts +5 -0
  42. package/dist/models/index.js +22 -0
  43. package/dist/models/index.js.map +1 -0
  44. package/dist/run.d.ts +3 -3
  45. package/dist/run.js +12 -6
  46. package/dist/run.js.map +1 -1
  47. package/package.json +1 -1
  48. package/src/__tests__/index.ts +8 -4
  49. package/src/__tests__/{EventManager.test.ts → models/EventManager.test.ts} +3 -3
  50. package/src/__tests__/models/Logger.test.ts +140 -0
  51. package/src/__tests__/{ResourceInitializer.test.ts → models/ResourceInitializer.test.ts} +4 -4
  52. package/src/__tests__/{Store.test.ts → models/Store.test.ts} +4 -4
  53. package/src/__tests__/{TaskRunner.test.ts → models/TaskRunner.test.ts} +5 -5
  54. package/src/__tests__/run.overrides.test.ts +392 -0
  55. package/src/define.ts +3 -0
  56. package/src/defs.ts +7 -4
  57. package/src/globalEvents.ts +4 -0
  58. package/src/globalResources.ts +8 -3
  59. package/src/index.ts +3 -3
  60. package/src/{DependencyProcessor.ts → models/DependencyProcessor.ts} +6 -6
  61. package/src/{EventManager.ts → models/EventManager.ts} +2 -2
  62. package/src/models/Logger.ts +100 -0
  63. package/src/{ResourceInitializer.ts → models/ResourceInitializer.ts} +2 -2
  64. package/src/{Store.ts → models/Store.ts} +145 -47
  65. package/src/{TaskRunner.ts → models/TaskRunner.ts} +6 -3
  66. package/src/models/index.ts +5 -0
  67. package/src/run.ts +13 -7
package/src/defs.ts CHANGED
@@ -21,7 +21,7 @@ export interface IMiddlewareMeta extends IMeta {}
21
21
  // DependencyMap types
22
22
  export type DependencyMapType = Record<
23
23
  string,
24
- ITask | IResource | IEventDefinition
24
+ ITask | IResource | IEventDefinition | IResourceWithConfig<any, any>
25
25
  >;
26
26
 
27
27
  export type DependencyValueType<T> = T extends ITask<
@@ -146,6 +146,7 @@ export interface IResourceDefinintion<
146
146
  dependencies: DependencyValuesType<TDependencies>
147
147
  ) => Promise<TValue>;
148
148
  meta?: IResourceMeta;
149
+ overrides?: Array<IResource | ITask | IMiddleware | IResourceWithConfig>;
149
150
  }
150
151
 
151
152
  export interface IResource<
@@ -168,6 +169,8 @@ export interface IResource<
168
169
  hooks:
169
170
  | IHookDefinition<TDependencies>[]
170
171
  | ((config: TConfig) => IHookDefinition<TDependencies>[]);
172
+
173
+ overrides: Array<IResource | ITask | IMiddleware | IResourceWithConfig>;
171
174
  }
172
175
 
173
176
  export interface IResourceWithConfig<
@@ -225,10 +228,10 @@ export interface IMiddlewareExecutionInput {
225
228
  next: (input?: any) => Promise<any>;
226
229
  }
227
230
 
228
- export interface IHookDefinition<D extends DependencyMapType = {}> {
229
- event: IEventDefinition;
231
+ export interface IHookDefinition<D extends DependencyMapType = {}, T = any> {
232
+ event: IEventDefinition<T>;
230
233
  run: (
231
- event: IEvent,
234
+ event: IEvent<T>,
232
235
  dependencies: DependencyValuesType<D>
233
236
  ) => Promise<void> | void;
234
237
  }
@@ -1,5 +1,6 @@
1
1
  import { defineEvent } from "./define";
2
2
  import { ITask, IResource } from "./defs";
3
+ import { ILog } from "./models/Logger";
3
4
 
4
5
  export const globalEvents = {
5
6
  beforeInit: defineEvent({
@@ -8,6 +9,9 @@ export const globalEvents = {
8
9
  afterInit: defineEvent({
9
10
  id: "global.afterInit",
10
11
  }),
12
+ log: defineEvent<ILog>({
13
+ id: "global.log",
14
+ }),
11
15
  tasks: {
12
16
  beforeRun: defineEvent<{
13
17
  task: ITask<any, any, any>;
@@ -1,7 +1,8 @@
1
1
  import { defineResource } from "./define";
2
- import { EventManager } from "./EventManager";
3
- import { Store } from "./Store";
4
- import { TaskRunner } from "./TaskRunner";
2
+ import { EventManager } from "./models/EventManager";
3
+ import { Logger } from "./models/Logger";
4
+ import { Store } from "./models/Store";
5
+ import { TaskRunner } from "./models/TaskRunner";
5
6
 
6
7
  const store = defineResource({
7
8
  id: "global.store",
@@ -18,4 +19,8 @@ export const globalResources = {
18
19
  id: "global.taskRunner",
19
20
  init: async (runner: TaskRunner) => runner,
20
21
  }),
22
+ logger: defineResource({
23
+ id: "global.logger",
24
+ init: async (logger: Logger) => logger,
25
+ }),
21
26
  };
package/src/index.ts CHANGED
@@ -23,6 +23,6 @@ export {
23
23
  };
24
24
 
25
25
  export * as definitions from "./defs";
26
- export { Store } from "./Store";
27
- export { EventManager } from "./EventManager";
28
- export { TaskRunner } from "./TaskRunner";
26
+ export { Store } from "./models/Store";
27
+ export { EventManager } from "./models/EventManager";
28
+ export { TaskRunner } from "./models/TaskRunner";
@@ -5,13 +5,13 @@ import {
5
5
  IResource,
6
6
  IHookDefinition,
7
7
  IEventDefinition,
8
- } from "./defs";
8
+ } from "../defs";
9
9
  import { ResourceStoreElementType, Store } from "./Store";
10
- import * as utils from "./define";
10
+ import * as utils from "../define";
11
11
  import { EventManager } from "./EventManager";
12
12
  import { ResourceInitializer } from "./ResourceInitializer";
13
13
  import { TaskRunner } from "./TaskRunner";
14
- import { Errors } from "./errors";
14
+ import { Errors } from "../errors";
15
15
 
16
16
  /**
17
17
  * This class is responsible of setting up dependencies with their respective computedValues.
@@ -113,11 +113,11 @@ export class DependencyProcessor {
113
113
  * Processes all hooks, should run before emission of any event.
114
114
  * @returns
115
115
  */
116
- public processHooks() {
116
+ public attachHooks() {
117
117
  // iterate through resources and send them to processHooks
118
118
  for (const resource of this.store.resources.values()) {
119
119
  if (resource.resource.hooks) {
120
- this.processHooksForResource(resource);
120
+ this.attachHooksToResource(resource);
121
121
  }
122
122
  }
123
123
  }
@@ -127,7 +127,7 @@ export class DependencyProcessor {
127
127
  * @param hooks
128
128
  * @param deps
129
129
  */
130
- public processHooksForResource(
130
+ public attachHooksToResource(
131
131
  resourceStoreElement: ResourceStoreElementType<any, any, {}>
132
132
  ) {
133
133
  let hooks = resourceStoreElement.resource.hooks;
@@ -1,5 +1,5 @@
1
- import { EventHandlerType, IEvent, IEventDefinition } from "./defs";
2
- import { Errors } from "./errors";
1
+ import { EventHandlerType, IEvent, IEventDefinition } from "../defs";
2
+ import { Errors } from "../errors";
3
3
 
4
4
  const HandlerOptionsDefaults = { order: 0 };
5
5
 
@@ -0,0 +1,100 @@
1
+ import { globalEvents } from "../globalEvents";
2
+ import { EventManager } from "./EventManager";
3
+
4
+ export type LogLevels =
5
+ | "trace"
6
+ | "debug"
7
+ | "info"
8
+ | "warn"
9
+ | "error"
10
+ | "critical";
11
+
12
+ export interface ILog {
13
+ level: string;
14
+ context?: string;
15
+ data: any;
16
+ timestamp: Date;
17
+ }
18
+
19
+ export class Logger {
20
+ public static defaultContext = "app";
21
+
22
+ public severity = {
23
+ trace: 0,
24
+ debug: 1,
25
+ info: 2,
26
+ warn: 3,
27
+ error: 4,
28
+ critical: 5,
29
+ };
30
+
31
+ constructor(private eventManager: EventManager) {}
32
+
33
+ /**
34
+ * @param level
35
+ * @param message
36
+ */
37
+ public async log(level: LogLevels, data: any): Promise<void> {
38
+ const log: ILog = {
39
+ level,
40
+ data,
41
+ timestamp: new Date(),
42
+ };
43
+
44
+ await this.eventManager.emit(globalEvents.log, log);
45
+ }
46
+
47
+ public async print(log: ILog) {
48
+ // Extract the relevant information from the log
49
+ const { level, context, data, timestamp } = log;
50
+
51
+ // Format the timestamp to a more readable format
52
+ const formattedTimestamp = timestamp.toISOString();
53
+
54
+ // Format the log level for better visibility
55
+ const levelStr = `[${level.toUpperCase()}]`;
56
+
57
+ // Format the context, if provided
58
+ const contextStr = context ? `(${context})` : "";
59
+
60
+ // Handle different data types, especially if it's an error
61
+ let dataStr: string;
62
+ if (data instanceof Error) {
63
+ dataStr = `Error: ${data.name} - ${data.message}\nStack Trace:\n${data.stack}`;
64
+ } else if (typeof data === "object") {
65
+ dataStr = JSON.stringify(data, null, 2); // Pretty-print JSON objects
66
+ } else {
67
+ dataStr = String(data); // Convert any other type to string
68
+ }
69
+
70
+ // Construct the final log message
71
+ const logMessage = `${formattedTimestamp} ${levelStr} ${contextStr} - ${dataStr}`;
72
+
73
+ // Print the log message
74
+ console.log(logMessage);
75
+ }
76
+
77
+ public async info(data: any) {
78
+ await this.log("info", data);
79
+ }
80
+
81
+ public async error(data: any) {
82
+ await this.log("error", data);
83
+ }
84
+
85
+ public async warn(data: any) {
86
+ await this.log("warn", data);
87
+ }
88
+
89
+ public async debug(data: any) {
90
+ await this.log("debug", data);
91
+ }
92
+
93
+ public async trace(data: any) {
94
+ await this.log("trace", data);
95
+ }
96
+
97
+ public async critical(data: any) {
98
+ await this.log("critical", data);
99
+ }
100
+ }
@@ -3,9 +3,9 @@ import {
3
3
  DependencyValuesType,
4
4
  ITask,
5
5
  IResource,
6
- } from "./defs";
6
+ } from "../defs";
7
7
  import { EventManager } from "./EventManager";
8
- import { globalEvents } from "./globalEvents";
8
+ import { globalEvents } from "../globalEvents";
9
9
  import { Store } from "./Store";
10
10
 
11
11
  export class ResourceInitializer {
@@ -9,12 +9,12 @@ import {
9
9
  RegisterableItems,
10
10
  symbols,
11
11
  IMiddleware,
12
- } from "./defs";
13
- import * as utils from "./define";
14
- import { IDependentNode } from "./tools/findCircularDependencies";
15
- import { globalEventsArray } from "./globalEvents";
16
- import { Errors } from "./errors";
17
- import { globalResources } from "./globalResources";
12
+ } from "../defs";
13
+ import * as utils from "../define";
14
+ import { IDependentNode } from "../tools/findCircularDependencies";
15
+ import { globalEventsArray } from "../globalEvents";
16
+ import { Errors } from "../errors";
17
+ import { globalResources } from "../globalResources";
18
18
  import { EventManager } from "./EventManager";
19
19
  import { TaskRunner } from "./TaskRunner";
20
20
 
@@ -59,6 +59,11 @@ export class Store {
59
59
  public resources: Map<string, ResourceStoreElementType> = new Map();
60
60
  public events: Map<string, EventStoreElementType> = new Map();
61
61
  public middlewares: Map<string, MiddlewareStoreElementType> = new Map();
62
+ public overrides: Map<
63
+ string,
64
+ IResource | IMiddleware | ITask | IResourceWithConfig
65
+ > = new Map();
66
+
62
67
  #isLocked = false;
63
68
  #isInitialized = false;
64
69
 
@@ -71,11 +76,6 @@ export class Store {
71
76
  lock() {
72
77
  this.#isLocked = true;
73
78
  this.eventManager.lock();
74
- // freeze the maps so they can't be modified
75
- Object.freeze(this.tasks);
76
- Object.freeze(this.resources);
77
- Object.freeze(this.events);
78
- Object.freeze(this.middlewares);
79
79
  }
80
80
 
81
81
  checkLock() {
@@ -115,10 +115,13 @@ export class Store {
115
115
  this.storeEvent(event);
116
116
  });
117
117
 
118
- this.computeRegisterOfResource(root, config);
119
-
118
+ this.computeRegistrationDeeply(root, config);
120
119
  this.resources.set(root.id, this.root);
121
120
 
121
+ for (const resource of this.resources.values()) {
122
+ this.storeOverridesDeeply(resource.resource);
123
+ }
124
+
122
125
  this.#isInitialized = true;
123
126
  }
124
127
 
@@ -127,17 +130,37 @@ export class Store {
127
130
  * @param element
128
131
  * @param config
129
132
  */
130
- private computeRegisterOfResource<C>(element: IResource<C>, config?: C) {
133
+ private computeRegistrationDeeply<C>(element: IResource<C>, config?: C) {
131
134
  const items =
132
135
  typeof element.register === "function"
133
136
  ? element.register(config as C)
134
137
  : element.register;
135
138
 
136
139
  for (const item of items) {
140
+ // will call registration if it detects another resource.
137
141
  this.storeGenericItem<C>(item);
138
142
  }
139
143
  }
140
144
 
145
+ /**
146
+ * @param element
147
+ */
148
+ private storeOverridesDeeply<C>(element: IResource<C, any, any>) {
149
+ element.overrides.forEach((override) => {
150
+ // the one on top has priority of setting the last override.
151
+ if (utils.isResource(override)) {
152
+ this.storeOverridesDeeply(override);
153
+ }
154
+
155
+ if (utils.isResourceWithConfig(override)) {
156
+ this.storeOverridesDeeply(override.resource);
157
+ this.overrides.set(override.resource.id, override);
158
+ } else {
159
+ this.overrides.set(override.id, override);
160
+ }
161
+ });
162
+ }
163
+
141
164
  /**
142
165
  * middlewares are already stored in their final form and the check for them would be redundant
143
166
  * @param id
@@ -152,8 +175,14 @@ export class Store {
152
175
  if (this.events.has(id)) {
153
176
  throw Errors.duplicateRegistration("Event", id);
154
177
  }
178
+ if (this.middlewares.has(id)) {
179
+ throw Errors.duplicateRegistration("Middleware", id);
180
+ }
155
181
  }
156
182
 
183
+ /**
184
+ * Cleanup
185
+ */
157
186
  public async dispose() {
158
187
  for (const resource of this.resources.values()) {
159
188
  if (resource.resource.dispose) {
@@ -166,6 +195,45 @@ export class Store {
166
195
  }
167
196
  }
168
197
 
198
+ /**
199
+ * When this is called, all overrides should have been stored in the "overrides" store.
200
+ */
201
+ public processOverrides() {
202
+ // If we are trying to use override on something that wasn't previously registered, we throw an error.
203
+ for (const override of this.overrides.values()) {
204
+ let hasAnyItem = false;
205
+ if (utils.isTask(override)) {
206
+ hasAnyItem = this.tasks.has(override.id);
207
+ } else if (utils.isResource(override)) {
208
+ hasAnyItem = this.resources.has(override.id);
209
+ } else if (utils.isMiddleware(override)) {
210
+ hasAnyItem = this.middlewares.has(override.id);
211
+ } else if (utils.isResourceWithConfig(override)) {
212
+ hasAnyItem = this.resources.has(override.resource.id);
213
+ }
214
+
215
+ if (!hasAnyItem) {
216
+ const id = utils.isResourceWithConfig(override)
217
+ ? override.resource.id
218
+ : override.id;
219
+
220
+ throw Errors.dependencyNotFound(id);
221
+ }
222
+ }
223
+
224
+ for (const override of this.overrides.values()) {
225
+ if (utils.isTask(override)) {
226
+ this.storeTask(override, false);
227
+ } else if (utils.isResource(override)) {
228
+ this.storeResource(override, false);
229
+ } else if (utils.isMiddleware(override)) {
230
+ this.storeMiddleware(override, false);
231
+ } else if (utils.isResourceWithConfig(override)) {
232
+ this.storeResourceWithConfig(override, false);
233
+ }
234
+ }
235
+ }
236
+
169
237
  public getGlobalMiddlewares(excludingIds: string[]): IMiddleware[] {
170
238
  return Array.from(this.middlewares.values())
171
239
  .filter((x) => x.middleware[symbols.middlewareGlobal])
@@ -186,19 +254,7 @@ export class Store {
186
254
  } else if (utils.isEvent(item)) {
187
255
  this.storeEvent<C>(item);
188
256
  } else if (utils.isMiddleware(item)) {
189
- if (this.middlewares.has(item.id)) {
190
- throw Errors.duplicateRegistration("Middleware", item.id);
191
- }
192
-
193
- item.dependencies =
194
- typeof item.dependencies === "function"
195
- ? item.dependencies()
196
- : item.dependencies;
197
-
198
- this.middlewares.set(item.id, {
199
- middleware: item,
200
- computedDependencies: {},
201
- });
257
+ this.storeMiddleware<C>(item);
202
258
  } else if (utils.isResourceWithConfig(item)) {
203
259
  this.storeResourceWithConfig<C>(item);
204
260
  } else {
@@ -206,14 +262,33 @@ export class Store {
206
262
  }
207
263
  }
208
264
 
265
+ private storeMiddleware<C>(item: IMiddleware<any>, check = true) {
266
+ check && this.checkIfIDExists(item.id);
267
+
268
+ item.dependencies =
269
+ typeof item.dependencies === "function"
270
+ ? item.dependencies()
271
+ : item.dependencies;
272
+
273
+ this.middlewares.set(item.id, {
274
+ middleware: item,
275
+ computedDependencies: {},
276
+ });
277
+ }
278
+
209
279
  public storeEvent<C>(item: IEventDefinition<void>) {
210
280
  this.checkIfIDExists(item.id);
211
281
 
212
282
  this.events.set(item.id, { event: item });
213
283
  }
214
284
 
215
- private storeResourceWithConfig<C>(item: IResourceWithConfig<any, any, any>) {
216
- this.checkIfIDExists(item.resource.id);
285
+ private storeResourceWithConfig<C>(
286
+ item: IResourceWithConfig<any, any, any>,
287
+ check = true
288
+ ) {
289
+ check && this.checkIfIDExists(item.resource.id);
290
+
291
+ this.prepareResource(item.resource, item.config);
217
292
 
218
293
  this.resources.set(item.resource.id, {
219
294
  resource: item.resource,
@@ -222,20 +297,17 @@ export class Store {
222
297
  isInitialized: false,
223
298
  });
224
299
 
225
- this.computeRegisterOfResource(item.resource, item.config);
300
+ this.computeRegistrationDeeply(item.resource, item.config);
226
301
  }
227
302
 
228
- private storeResource<C>(item: IResource<any, any, any>) {
229
- this.checkIfIDExists(item.id);
230
-
231
- this.storeEvent(item.events.beforeInit);
232
- this.storeEvent(item.events.afterInit);
233
- this.storeEvent(item.events.onError);
303
+ /**
304
+ * This is for storing a resource without a config.
305
+ * @param item
306
+ */
307
+ private storeResource<C>(item: IResource<any, any, any>, check = true) {
308
+ check && this.checkIfIDExists(item.id);
234
309
 
235
- item.dependencies =
236
- typeof item.dependencies === "function"
237
- ? item.dependencies()
238
- : item.dependencies;
310
+ this.prepareResource(item, {});
239
311
 
240
312
  this.resources.set(item.id, {
241
313
  resource: item,
@@ -244,20 +316,46 @@ export class Store {
244
316
  isInitialized: false,
245
317
  });
246
318
 
247
- this.computeRegisterOfResource(item, {});
319
+ this.computeRegistrationDeeply(item, {});
248
320
  }
249
321
 
250
- private storeTask<C>(item: ITask<any, any, {}>) {
251
- this.checkIfIDExists(item.id);
322
+ public storeEventsForAllTasks() {
323
+ for (const task of this.tasks.values()) {
324
+ this.storeEvent(task.task.events.beforeRun);
325
+ this.storeEvent(task.task.events.afterRun);
326
+ this.storeEvent(task.task.events.onError);
327
+ }
252
328
 
329
+ for (const resource of this.resources.values()) {
330
+ this.storeEvent(resource.resource.events.beforeInit);
331
+ this.storeEvent(resource.resource.events.afterInit);
332
+ this.storeEvent(resource.resource.events.onError);
333
+ }
334
+ }
335
+
336
+ /**
337
+ * This is for storing a resource without a config.
338
+ * @param item
339
+ */
340
+ private prepareResource<C>(
341
+ item: IResource<any, any, any>,
342
+ config: any
343
+ ): IResource<any, any, any> {
253
344
  item.dependencies =
254
345
  typeof item.dependencies === "function"
255
- ? item.dependencies()
346
+ ? item.dependencies(config)
256
347
  : item.dependencies;
257
348
 
258
- this.storeEvent(item.events.beforeRun);
259
- this.storeEvent(item.events.afterRun);
260
- this.storeEvent(item.events.onError);
349
+ return item;
350
+ }
351
+
352
+ private storeTask<C>(item: ITask<any, any, {}>, check = true) {
353
+ check && this.checkIfIDExists(item.id);
354
+
355
+ item.dependencies =
356
+ typeof item.dependencies === "function"
357
+ ? item.dependencies()
358
+ : item.dependencies;
261
359
 
262
360
  this.tasks.set(item.id, {
263
361
  task: item,
@@ -1,7 +1,7 @@
1
- import { DependencyMapType, DependencyValuesType, ITask } from "./defs";
2
- import { Errors } from "./errors";
1
+ import { DependencyMapType, DependencyValuesType, ITask } from "../defs";
2
+ import { Errors } from "../errors";
3
3
  import { EventManager } from "./EventManager";
4
- import { globalEvents } from "./globalEvents";
4
+ import { globalEvents } from "../globalEvents";
5
5
  import {
6
6
  MiddlewareStoreElementType,
7
7
  Store,
@@ -22,6 +22,9 @@ export class TaskRunner {
22
22
  /**
23
23
  * Begins the execution of an task. These are registered tasks and all sanity checks have been performed at this stage to ensure consistency of the object.
24
24
  * This function can throw only if any of the event listeners or run function throws
25
+ * @param task the task to be run
26
+ * @param input the input to be passed to the task
27
+ * @param taskDependencies optional dependencies to be passed to the task, if not provided, the dependencies will be the ones already computed from the store.
25
28
  */
26
29
  public async run<
27
30
  TInput,
@@ -0,0 +1,5 @@
1
+ export * from "./DependencyProcessor";
2
+ export * from "./EventManager";
3
+ export * from "./Logger";
4
+ export * from "./Store";
5
+ export * from "./TaskRunner";
package/src/run.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { TaskRunner } from "./TaskRunner";
1
+ import { TaskRunner } from "./models/TaskRunner";
2
2
  import {
3
3
  DependencyMapType,
4
4
  ITaskDefinition,
@@ -8,13 +8,14 @@ import {
8
8
  DependencyValuesType,
9
9
  IResource,
10
10
  } from "./defs";
11
- import { DependencyProcessor } from "./DependencyProcessor";
12
- import { EventManager } from "./EventManager";
11
+ import { DependencyProcessor } from "./models/DependencyProcessor";
12
+ import { EventManager } from "./models/EventManager";
13
13
  import { globalEvents } from "./globalEvents";
14
- import { Store } from "./Store";
14
+ import { Store } from "./models/Store";
15
15
  import { findCircularDependencies } from "./tools/findCircularDependencies";
16
16
  import { Errors } from "./errors";
17
17
  import { globalResources } from "./globalResources";
18
+ import { Logger } from "./models/Logger";
18
19
 
19
20
  export type ResourcesStoreElementType<
20
21
  C = any,
@@ -65,9 +66,11 @@ export async function run<C, V>(
65
66
  const store = new Store(eventManager);
66
67
  const taskRunner = new TaskRunner(store, eventManager);
67
68
  const processor = new DependencyProcessor(store, eventManager, taskRunner);
69
+ const logger = new Logger(eventManager);
68
70
 
69
71
  // In the registration phase we register deeply all the resources, tasks, middleware and events
70
72
  store.initializeStore(resource, config);
73
+ store.storeGenericItem(globalResources.logger.with(logger));
71
74
  store.storeGenericItem(globalResources.taskRunner.with(taskRunner));
72
75
 
73
76
  // We verify that there isn't any circular dependencies before we begin computing the dependencies
@@ -77,14 +80,17 @@ export async function run<C, V>(
77
80
  throw Errors.circularDependencies(circularDependencies.cycles);
78
81
  }
79
82
 
80
- await processor.processHooks();
83
+ await store.processOverrides();
84
+
85
+ // a form of hooking, we store the events for all tasks
86
+ await store.storeEventsForAllTasks();
87
+ await processor.attachHooks();
88
+ await processor.computeAllDependencies();
81
89
 
82
90
  // Now we can safely compute dependencies without being afraid of an infinite loop.
83
91
  // The hooking part is done here.
84
92
  await eventManager.emit(globalEvents.beforeInit);
85
93
 
86
- await processor.computeAllDependencies();
87
-
88
94
  // leftovers that were registered but not depended upon, except root
89
95
  await processor.initializeUninitializedResources();
90
96