@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.
- package/README.md +191 -13
- package/dist/DependencyProcessor.d.ts +2 -2
- package/dist/DependencyProcessor.js +3 -3
- package/dist/DependencyProcessor.js.map +1 -1
- package/dist/Store.d.ts +24 -1
- package/dist/Store.js +108 -34
- package/dist/Store.js.map +1 -1
- package/dist/TaskRunner.d.ts +3 -0
- package/dist/TaskRunner.js +3 -0
- package/dist/TaskRunner.js.map +1 -1
- package/dist/define.js +1 -0
- package/dist/define.js.map +1 -1
- package/dist/defs.d.ts +6 -4
- package/dist/globalEvents.d.ts +2 -0
- package/dist/globalEvents.js +3 -0
- package/dist/globalEvents.js.map +1 -1
- package/dist/globalResources.d.ts +5 -3
- package/dist/globalResources.js +4 -0
- package/dist/globalResources.js.map +1 -1
- package/dist/index.d.ts +8 -6
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/models/DependencyProcessor.d.ts +49 -0
- package/dist/models/DependencyProcessor.js +178 -0
- package/dist/models/DependencyProcessor.js.map +1 -0
- package/dist/models/EventManager.d.ts +17 -0
- package/dist/models/EventManager.js +73 -0
- package/dist/models/EventManager.js.map +1 -0
- package/dist/models/Logger.d.ts +33 -0
- package/dist/models/Logger.js +76 -0
- package/dist/models/Logger.js.map +1 -0
- package/dist/models/ResourceInitializer.d.ts +13 -0
- package/dist/models/ResourceInitializer.js +54 -0
- package/dist/models/ResourceInitializer.js.map +1 -0
- package/dist/models/Store.d.ts +90 -0
- package/dist/models/Store.js +302 -0
- package/dist/models/Store.js.map +1 -0
- package/dist/models/TaskRunner.d.ts +25 -0
- package/dist/models/TaskRunner.js +96 -0
- package/dist/models/TaskRunner.js.map +1 -0
- package/dist/models/index.d.ts +5 -0
- package/dist/models/index.js +22 -0
- package/dist/models/index.js.map +1 -0
- package/dist/run.d.ts +3 -3
- package/dist/run.js +12 -6
- package/dist/run.js.map +1 -1
- package/package.json +1 -1
- package/src/__tests__/index.ts +8 -4
- package/src/__tests__/{EventManager.test.ts → models/EventManager.test.ts} +3 -3
- package/src/__tests__/models/Logger.test.ts +140 -0
- package/src/__tests__/{ResourceInitializer.test.ts → models/ResourceInitializer.test.ts} +4 -4
- package/src/__tests__/{Store.test.ts → models/Store.test.ts} +4 -4
- package/src/__tests__/{TaskRunner.test.ts → models/TaskRunner.test.ts} +5 -5
- package/src/__tests__/run.overrides.test.ts +392 -0
- package/src/define.ts +3 -0
- package/src/defs.ts +7 -4
- package/src/globalEvents.ts +4 -0
- package/src/globalResources.ts +8 -3
- package/src/index.ts +3 -3
- package/src/{DependencyProcessor.ts → models/DependencyProcessor.ts} +6 -6
- package/src/{EventManager.ts → models/EventManager.ts} +2 -2
- package/src/models/Logger.ts +100 -0
- package/src/{ResourceInitializer.ts → models/ResourceInitializer.ts} +2 -2
- package/src/{Store.ts → models/Store.ts} +145 -47
- package/src/{TaskRunner.ts → models/TaskRunner.ts} +6 -3
- package/src/models/index.ts +5 -0
- 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
|
}
|
package/src/globalEvents.ts
CHANGED
|
@@ -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>;
|
package/src/globalResources.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { defineResource } from "./define";
|
|
2
|
-
import { EventManager } from "./EventManager";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
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 "
|
|
8
|
+
} from "../defs";
|
|
9
9
|
import { ResourceStoreElementType, Store } from "./Store";
|
|
10
|
-
import * as utils from "
|
|
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 "
|
|
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
|
|
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.
|
|
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
|
|
130
|
+
public attachHooksToResource(
|
|
131
131
|
resourceStoreElement: ResourceStoreElementType<any, any, {}>
|
|
132
132
|
) {
|
|
133
133
|
let hooks = resourceStoreElement.resource.hooks;
|
|
@@ -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 "
|
|
6
|
+
} from "../defs";
|
|
7
7
|
import { EventManager } from "./EventManager";
|
|
8
|
-
import { globalEvents } from "
|
|
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 "
|
|
13
|
-
import * as utils from "
|
|
14
|
-
import { IDependentNode } from "
|
|
15
|
-
import { globalEventsArray } from "
|
|
16
|
-
import { Errors } from "
|
|
17
|
-
import { globalResources } from "
|
|
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.
|
|
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
|
|
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
|
-
|
|
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>(
|
|
216
|
-
|
|
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.
|
|
300
|
+
this.computeRegistrationDeeply(item.resource, item.config);
|
|
226
301
|
}
|
|
227
302
|
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
this.
|
|
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
|
|
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.
|
|
319
|
+
this.computeRegistrationDeeply(item, {});
|
|
248
320
|
}
|
|
249
321
|
|
|
250
|
-
|
|
251
|
-
this.
|
|
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
|
-
|
|
259
|
-
|
|
260
|
-
|
|
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 "
|
|
2
|
-
import { Errors } from "
|
|
1
|
+
import { DependencyMapType, DependencyValuesType, ITask } from "../defs";
|
|
2
|
+
import { Errors } from "../errors";
|
|
3
3
|
import { EventManager } from "./EventManager";
|
|
4
|
-
import { globalEvents } from "
|
|
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,
|
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
|
|
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
|
|