@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.
- package/README.md +1315 -942
- package/dist/common.types.d.ts +20 -0
- package/dist/common.types.js +4 -0
- package/dist/common.types.js.map +1 -0
- package/dist/context.d.ts +34 -0
- package/dist/context.js +58 -0
- package/dist/context.js.map +1 -0
- package/dist/define.d.ts +22 -3
- package/dist/define.js +52 -8
- package/dist/define.js.map +1 -1
- package/dist/defs.d.ts +52 -31
- package/dist/defs.js +10 -2
- package/dist/defs.js.map +1 -1
- package/dist/errors.js +1 -1
- package/dist/errors.js.map +1 -1
- package/dist/event.types.d.ts +18 -0
- package/dist/event.types.js +4 -0
- package/dist/event.types.js.map +1 -0
- package/dist/examples/registrator-example.d.ts +122 -0
- package/dist/examples/registrator-example.js +147 -0
- package/dist/examples/registrator-example.js.map +1 -0
- package/dist/globals/globalEvents.d.ts +41 -0
- package/dist/globals/globalEvents.js +94 -0
- package/dist/globals/globalEvents.js.map +1 -0
- package/dist/globals/globalMiddleware.d.ts +23 -0
- package/dist/globals/globalMiddleware.js +15 -0
- package/dist/globals/globalMiddleware.js.map +1 -0
- package/dist/globals/globalResources.d.ts +27 -0
- package/dist/globals/globalResources.js +47 -0
- package/dist/globals/globalResources.js.map +1 -0
- package/dist/globals/middleware/cache.middleware.d.ts +34 -0
- package/dist/globals/middleware/cache.middleware.js +85 -0
- package/dist/globals/middleware/cache.middleware.js.map +1 -0
- package/dist/globals/middleware/requireContext.middleware.d.ts +6 -0
- package/dist/globals/middleware/requireContext.middleware.js +25 -0
- package/dist/globals/middleware/requireContext.middleware.js.map +1 -0
- package/dist/globals/middleware/retry.middleware.d.ts +20 -0
- package/dist/globals/middleware/retry.middleware.js +34 -0
- package/dist/globals/middleware/retry.middleware.js.map +1 -0
- package/dist/globals/resources/queue.resource.d.ts +7 -0
- package/dist/globals/resources/queue.resource.js +31 -0
- package/dist/globals/resources/queue.resource.js.map +1 -0
- package/dist/index.d.ts +45 -9
- package/dist/index.js +14 -9
- package/dist/index.js.map +1 -1
- package/dist/middleware.types.d.ts +40 -0
- package/dist/middleware.types.js +4 -0
- package/dist/middleware.types.js.map +1 -0
- package/dist/models/DependencyProcessor.d.ts +2 -1
- package/dist/models/DependencyProcessor.js +11 -13
- package/dist/models/DependencyProcessor.js.map +1 -1
- package/dist/models/EventManager.d.ts +5 -0
- package/dist/models/EventManager.js +44 -2
- package/dist/models/EventManager.js.map +1 -1
- package/dist/models/Logger.d.ts +30 -12
- package/dist/models/Logger.js +130 -42
- package/dist/models/Logger.js.map +1 -1
- package/dist/models/OverrideManager.d.ts +13 -0
- package/dist/models/OverrideManager.js +70 -0
- package/dist/models/OverrideManager.js.map +1 -0
- package/dist/models/Queue.d.ts +25 -0
- package/dist/models/Queue.js +54 -0
- package/dist/models/Queue.js.map +1 -0
- package/dist/models/ResourceInitializer.d.ts +5 -2
- package/dist/models/ResourceInitializer.js +20 -14
- package/dist/models/ResourceInitializer.js.map +1 -1
- package/dist/models/Semaphore.d.ts +61 -0
- package/dist/models/Semaphore.js +166 -0
- package/dist/models/Semaphore.js.map +1 -0
- package/dist/models/Store.d.ts +17 -72
- package/dist/models/Store.js +71 -269
- package/dist/models/Store.js.map +1 -1
- package/dist/models/StoreConstants.d.ts +11 -0
- package/dist/models/StoreConstants.js +18 -0
- package/dist/models/StoreConstants.js.map +1 -0
- package/dist/models/StoreRegistry.d.ts +25 -0
- package/dist/models/StoreRegistry.js +171 -0
- package/dist/models/StoreRegistry.js.map +1 -0
- package/dist/models/StoreTypes.d.ts +21 -0
- package/dist/models/StoreTypes.js +3 -0
- package/dist/models/StoreTypes.js.map +1 -0
- package/dist/models/StoreValidator.d.ts +10 -0
- package/dist/models/StoreValidator.js +41 -0
- package/dist/models/StoreValidator.js.map +1 -0
- package/dist/models/TaskRunner.js +39 -24
- package/dist/models/TaskRunner.js.map +1 -1
- package/dist/models/VarStore.d.ts +17 -0
- package/dist/models/VarStore.js +60 -0
- package/dist/models/VarStore.js.map +1 -0
- package/dist/models/index.d.ts +3 -0
- package/dist/models/index.js +3 -0
- package/dist/models/index.js.map +1 -1
- package/dist/resource.types.d.ts +31 -0
- package/dist/resource.types.js +3 -0
- package/dist/resource.types.js.map +1 -0
- package/dist/run.d.ts +4 -1
- package/dist/run.js +6 -3
- package/dist/run.js.map +1 -1
- package/dist/symbols.d.ts +24 -0
- package/dist/symbols.js +29 -0
- package/dist/symbols.js.map +1 -0
- package/dist/task.types.d.ts +55 -0
- package/dist/task.types.js +23 -0
- package/dist/task.types.js.map +1 -0
- package/dist/tools/registratorId.d.ts +4 -0
- package/dist/tools/registratorId.js +40 -0
- package/dist/tools/registratorId.js.map +1 -0
- package/dist/tools/simpleHash.d.ts +9 -0
- package/dist/tools/simpleHash.js +34 -0
- package/dist/tools/simpleHash.js.map +1 -0
- package/dist/types/base-interfaces.d.ts +18 -0
- package/dist/types/base-interfaces.js +6 -0
- package/dist/types/base-interfaces.js.map +1 -0
- package/dist/types/base.d.ts +13 -0
- package/dist/types/base.js +3 -0
- package/dist/types/base.js.map +1 -0
- package/dist/types/dependencies.d.ts +22 -0
- package/dist/types/dependencies.js +3 -0
- package/dist/types/dependencies.js.map +1 -0
- package/dist/types/dependency-core.d.ts +14 -0
- package/dist/types/dependency-core.js +5 -0
- package/dist/types/dependency-core.js.map +1 -0
- package/dist/types/events.d.ts +52 -0
- package/dist/types/events.js +6 -0
- package/dist/types/events.js.map +1 -0
- package/dist/types/hooks.d.ts +16 -0
- package/dist/types/hooks.js +5 -0
- package/dist/types/hooks.js.map +1 -0
- package/dist/types/index.d.ts +14 -0
- package/dist/types/index.js +27 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/meta.d.ts +13 -0
- package/dist/types/meta.js +5 -0
- package/dist/types/meta.js.map +1 -0
- package/dist/types/middleware.d.ts +38 -0
- package/dist/types/middleware.js +6 -0
- package/dist/types/middleware.js.map +1 -0
- package/dist/types/registerable.d.ts +10 -0
- package/dist/types/registerable.js +5 -0
- package/dist/types/registerable.js.map +1 -0
- package/dist/types/resources.d.ts +44 -0
- package/dist/types/resources.js +5 -0
- package/dist/types/resources.js.map +1 -0
- package/dist/types/symbols.d.ts +24 -0
- package/dist/types/symbols.js +30 -0
- package/dist/types/symbols.js.map +1 -0
- package/dist/types/tasks.d.ts +41 -0
- package/dist/types/tasks.js +5 -0
- package/dist/types/tasks.js.map +1 -0
- package/dist/types/utilities.d.ts +7 -0
- package/dist/types/utilities.js +5 -0
- package/dist/types/utilities.js.map +1 -0
- package/package.json +10 -6
- package/src/__tests__/benchmark/benchmark.test.ts +1 -1
- package/src/__tests__/context.test.ts +91 -0
- package/src/__tests__/errors.test.ts +8 -5
- package/src/__tests__/globalEvents.test.ts +1 -1
- package/src/__tests__/globals/cache.middleware.test.ts +772 -0
- package/src/__tests__/globals/queue.resource.test.ts +141 -0
- package/src/__tests__/globals/requireContext.middleware.test.ts +98 -0
- package/src/__tests__/globals/retry.middleware.test.ts +157 -0
- package/src/__tests__/index.helper.test.ts +55 -0
- package/src/__tests__/models/EventManager.test.ts +144 -0
- package/src/__tests__/models/Logger.test.ts +291 -34
- package/src/__tests__/models/Queue.test.ts +189 -0
- package/src/__tests__/models/ResourceInitializer.test.ts +8 -6
- package/src/__tests__/models/Semaphore.test.ts +713 -0
- package/src/__tests__/models/Store.test.ts +40 -0
- package/src/__tests__/models/TaskRunner.test.ts +86 -5
- package/src/__tests__/run.middleware.test.ts +166 -12
- package/src/__tests__/run.overrides.test.ts +13 -10
- package/src/__tests__/run.test.ts +363 -12
- package/src/__tests__/setOutput.test.ts +244 -0
- package/src/__tests__/tools/getCallerFile.test.ts +9 -9
- package/src/__tests__/typesafety.test.ts +54 -39
- package/src/context.ts +86 -0
- package/src/define.ts +84 -14
- package/src/defs.ts +91 -41
- package/src/errors.ts +3 -1
- package/src/{globalEvents.ts → globals/globalEvents.ts} +13 -12
- package/src/globals/globalMiddleware.ts +14 -0
- package/src/{globalResources.ts → globals/globalResources.ts} +14 -10
- package/src/globals/middleware/cache.middleware.ts +115 -0
- package/src/globals/middleware/requireContext.middleware.ts +36 -0
- package/src/globals/middleware/retry.middleware.ts +56 -0
- package/src/globals/resources/queue.resource.ts +34 -0
- package/src/index.ts +9 -5
- package/src/models/DependencyProcessor.ts +36 -40
- package/src/models/EventManager.ts +45 -5
- package/src/models/Logger.ts +170 -48
- package/src/models/OverrideManager.ts +84 -0
- package/src/models/Queue.ts +66 -0
- package/src/models/ResourceInitializer.ts +38 -20
- package/src/models/Semaphore.ts +208 -0
- package/src/models/Store.ts +94 -342
- package/src/models/StoreConstants.ts +17 -0
- package/src/models/StoreRegistry.ts +217 -0
- package/src/models/StoreTypes.ts +46 -0
- package/src/models/StoreValidator.ts +38 -0
- package/src/models/TaskRunner.ts +53 -40
- package/src/models/index.ts +3 -0
- package/src/run.ts +7 -4
- package/src/__tests__/index.ts +0 -15
- 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
|
+
}
|
package/src/models/TaskRunner.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
|
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
|
-
{
|
|
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.
|
|
160
|
+
...this.store.getEverywhereMiddlewareForTasks(
|
|
161
|
+
existingMiddlewares.map((x) => x.id)
|
|
162
|
+
),
|
|
155
163
|
...existingMiddlewares,
|
|
156
164
|
];
|
|
157
165
|
|
|
158
|
-
if (createdMiddlewares.length
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
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
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
186
|
+
next: nextFunction,
|
|
187
|
+
},
|
|
188
|
+
storeMiddleware.computedDependencies,
|
|
189
|
+
middleware.config
|
|
190
|
+
);
|
|
191
|
+
};
|
|
179
192
|
}
|
|
180
193
|
|
|
181
194
|
return next;
|
package/src/models/index.ts
CHANGED
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
|
|
109
|
+
return {
|
|
110
|
+
value: store.root.value,
|
|
111
|
+
dispose: () => store.dispose(),
|
|
112
|
+
};
|
|
110
113
|
}
|
package/src/__tests__/index.ts
DELETED
|
@@ -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
|