@bluelibs/runner 1.5.3 → 2.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 +299 -156
- package/dist/define.d.ts +1 -1
- package/dist/define.js +0 -1
- package/dist/define.js.map +1 -1
- package/dist/defs.d.ts +12 -8
- package/dist/globalEvents.js +45 -0
- package/dist/globalEvents.js.map +1 -1
- package/dist/globalResources.js +14 -0
- package/dist/globalResources.js.map +1 -1
- package/dist/models/DependencyProcessor.d.ts +1 -7
- package/dist/models/DependencyProcessor.js +31 -54
- package/dist/models/DependencyProcessor.js.map +1 -1
- package/dist/models/EventManager.d.ts +4 -0
- package/dist/models/EventManager.js.map +1 -1
- package/dist/models/ResourceInitializer.js +4 -2
- package/dist/models/ResourceInitializer.js.map +1 -1
- package/dist/models/Store.d.ts +2 -2
- package/dist/models/Store.js +2 -0
- package/dist/models/Store.js.map +1 -1
- package/dist/models/TaskRunner.js +28 -16
- package/dist/models/TaskRunner.js.map +1 -1
- package/dist/run.js +1 -1
- package/dist/run.js.map +1 -1
- package/package.json +1 -1
- package/src/__tests__/benchmark/benchmark.test.ts +9 -7
- package/src/__tests__/errors.test.ts +0 -13
- package/src/__tests__/globalEvents.test.ts +53 -28
- package/src/__tests__/index.ts +0 -1
- package/src/__tests__/models/EventManager.test.ts +1 -0
- package/src/__tests__/run.test.ts +140 -109
- package/src/__tests__/typesafety.test.ts +17 -16
- package/src/define.ts +3 -4
- package/src/defs.ts +35 -22
- package/src/globalEvents.ts +53 -0
- package/src/globalResources.ts +17 -0
- package/src/models/DependencyProcessor.ts +45 -80
- package/src/models/EventManager.ts +4 -0
- package/src/models/ResourceInitializer.ts +4 -2
- package/src/models/Store.ts +6 -2
- package/src/models/TaskRunner.ts +51 -28
- package/src/run.ts +1 -1
- package/dist/DependencyProcessor.d.ts +0 -49
- package/dist/DependencyProcessor.js +0 -178
- package/dist/DependencyProcessor.js.map +0 -1
- package/dist/EventManager.d.ts +0 -17
- package/dist/EventManager.js +0 -73
- package/dist/EventManager.js.map +0 -1
- package/dist/ResourceInitializer.d.ts +0 -13
- package/dist/ResourceInitializer.js +0 -54
- package/dist/ResourceInitializer.js.map +0 -1
- package/dist/Store.d.ts +0 -90
- package/dist/Store.js +0 -291
- package/dist/Store.js.map +0 -1
- package/dist/TaskRunner.d.ts +0 -25
- package/dist/TaskRunner.js +0 -96
- package/dist/TaskRunner.js.map +0 -1
- package/src/__tests__/run.hooks.test.ts +0 -110
package/dist/TaskRunner.js
DELETED
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.TaskRunner = void 0;
|
|
4
|
-
const globalEvents_1 = require("./globalEvents");
|
|
5
|
-
class TaskRunner {
|
|
6
|
-
store;
|
|
7
|
-
eventManager;
|
|
8
|
-
runnerStore = new Map();
|
|
9
|
-
constructor(store, eventManager) {
|
|
10
|
-
this.store = store;
|
|
11
|
-
this.eventManager = eventManager;
|
|
12
|
-
}
|
|
13
|
-
/**
|
|
14
|
-
* 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.
|
|
15
|
-
* This function can throw only if any of the event listeners or run function throws
|
|
16
|
-
* @param task the task to be run
|
|
17
|
-
* @param input the input to be passed to the task
|
|
18
|
-
* @param taskDependencies optional dependencies to be passed to the task, if not provided, the dependencies will be the ones already computed from the store.
|
|
19
|
-
*/
|
|
20
|
-
async run(task, input, taskDependencies) {
|
|
21
|
-
let runner = this.runnerStore.get(task.id);
|
|
22
|
-
if (!runner) {
|
|
23
|
-
const storeTask = this.store.tasks.get(task.id);
|
|
24
|
-
const deps = taskDependencies || storeTask.computedDependencies;
|
|
25
|
-
runner = this.createRunnerWithMiddleware(task, deps);
|
|
26
|
-
this.runnerStore.set(task.id, runner);
|
|
27
|
-
}
|
|
28
|
-
// begin by dispatching the event of creating it.
|
|
29
|
-
// then ensure the hooks are called
|
|
30
|
-
// then ensure the middleware are called
|
|
31
|
-
await this.eventManager.emit(task.events.beforeRun, { input });
|
|
32
|
-
await this.eventManager.emit(globalEvents_1.globalEvents.tasks.beforeRun, {
|
|
33
|
-
task,
|
|
34
|
-
input,
|
|
35
|
-
});
|
|
36
|
-
let error;
|
|
37
|
-
try {
|
|
38
|
-
// craft the next function starting from the first next function
|
|
39
|
-
const output = await runner(input);
|
|
40
|
-
await this.eventManager.emit(task.events.afterRun, { input, output });
|
|
41
|
-
await this.eventManager.emit(globalEvents_1.globalEvents.tasks.afterRun, {
|
|
42
|
-
task,
|
|
43
|
-
input,
|
|
44
|
-
output,
|
|
45
|
-
});
|
|
46
|
-
return output;
|
|
47
|
-
}
|
|
48
|
-
catch (e) {
|
|
49
|
-
error = e;
|
|
50
|
-
// If you want to rewthrow the error, this should be done inside the onError event.
|
|
51
|
-
await this.eventManager.emit(task.events.onError, { error });
|
|
52
|
-
await this.eventManager.emit(globalEvents_1.globalEvents.tasks.onError, {
|
|
53
|
-
task,
|
|
54
|
-
error,
|
|
55
|
-
});
|
|
56
|
-
throw e;
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
/**
|
|
60
|
-
* Creates the function with the chain of middleware.
|
|
61
|
-
* @param task
|
|
62
|
-
* @param input
|
|
63
|
-
* @param taskDependencies
|
|
64
|
-
* @returns
|
|
65
|
-
*/
|
|
66
|
-
createRunnerWithMiddleware(task, taskDependencies) {
|
|
67
|
-
// this is the final next()
|
|
68
|
-
let next = async (input) => {
|
|
69
|
-
return task.run.call(null, input, taskDependencies);
|
|
70
|
-
};
|
|
71
|
-
const existingMiddlewares = task.middleware;
|
|
72
|
-
const createdMiddlewares = [
|
|
73
|
-
...this.store.getGlobalMiddlewares(existingMiddlewares.map((x) => x.id)),
|
|
74
|
-
...existingMiddlewares,
|
|
75
|
-
];
|
|
76
|
-
if (createdMiddlewares.length > 0) {
|
|
77
|
-
// we need to run the middleware in reverse order
|
|
78
|
-
// so we can chain the next function
|
|
79
|
-
for (let i = createdMiddlewares.length - 1; i >= 0; i--) {
|
|
80
|
-
const middleware = createdMiddlewares[i];
|
|
81
|
-
const storeMiddleware = this.store.middlewares.get(middleware.id); // we know it exists because at this stage all sanity checks have been done.
|
|
82
|
-
const nextFunction = next;
|
|
83
|
-
next = async (input) => {
|
|
84
|
-
return storeMiddleware.middleware.run({
|
|
85
|
-
taskDefinition: task,
|
|
86
|
-
input,
|
|
87
|
-
next: nextFunction,
|
|
88
|
-
}, storeMiddleware.computedDependencies);
|
|
89
|
-
};
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
return next;
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
exports.TaskRunner = TaskRunner;
|
|
96
|
-
//# sourceMappingURL=TaskRunner.js.map
|
package/dist/TaskRunner.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"TaskRunner.js","sourceRoot":"","sources":["../src/TaskRunner.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,110 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
defineTask,
|
|
3
|
-
defineResource,
|
|
4
|
-
defineEvent,
|
|
5
|
-
defineMiddleware,
|
|
6
|
-
} from "../define";
|
|
7
|
-
import { run } from "../run";
|
|
8
|
-
|
|
9
|
-
describe("run", () => {
|
|
10
|
-
// Tasks
|
|
11
|
-
describe("Hooks", () => {
|
|
12
|
-
it("should work with hooks and beforeInit, afterInit, onError", async () => {
|
|
13
|
-
const beforeInitHandler = jest.fn();
|
|
14
|
-
const afterInitHandler = jest.fn();
|
|
15
|
-
const onErrorHandler = jest.fn();
|
|
16
|
-
|
|
17
|
-
const testResource = defineResource({
|
|
18
|
-
id: "test.resource",
|
|
19
|
-
init: async () => "Resource Value",
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
const app = defineResource({
|
|
23
|
-
id: "app",
|
|
24
|
-
register: [testResource],
|
|
25
|
-
dependencies: { testResource },
|
|
26
|
-
hooks: [
|
|
27
|
-
{ event: testResource.events.beforeInit, run: beforeInitHandler },
|
|
28
|
-
{ event: testResource.events.afterInit, run: afterInitHandler },
|
|
29
|
-
{ event: testResource.events.onError, run: onErrorHandler },
|
|
30
|
-
],
|
|
31
|
-
async init(_, { testResource }) {
|
|
32
|
-
expect(testResource).toBe("Resource Value");
|
|
33
|
-
expect(beforeInitHandler).toHaveBeenCalled();
|
|
34
|
-
expect(afterInitHandler).toHaveBeenCalled();
|
|
35
|
-
expect(onErrorHandler).not.toHaveBeenCalled();
|
|
36
|
-
},
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
await run(app);
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
it("should work with hooks() as function and config and beforeInit, afterInit, onError", async () => {
|
|
43
|
-
const beforeInitHandler = jest.fn();
|
|
44
|
-
const afterInitHandler = jest.fn();
|
|
45
|
-
const onErrorHandler = jest.fn();
|
|
46
|
-
|
|
47
|
-
const testResource = defineResource({
|
|
48
|
-
id: "test.resource",
|
|
49
|
-
init: async () => "Resource Value",
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
const app = defineResource({
|
|
53
|
-
id: "app",
|
|
54
|
-
register: [testResource],
|
|
55
|
-
dependencies: { testResource },
|
|
56
|
-
hooks: () => [
|
|
57
|
-
{ event: testResource.events.beforeInit, run: beforeInitHandler },
|
|
58
|
-
{ event: testResource.events.afterInit, run: afterInitHandler },
|
|
59
|
-
{ event: testResource.events.onError, run: onErrorHandler },
|
|
60
|
-
],
|
|
61
|
-
async init(_: { secret: string }, { testResource }) {
|
|
62
|
-
expect(testResource).toBe("Resource Value");
|
|
63
|
-
expect(_.secret).toBe("XXX");
|
|
64
|
-
expect(beforeInitHandler).toHaveBeenCalled();
|
|
65
|
-
expect(afterInitHandler).toHaveBeenCalled();
|
|
66
|
-
expect(onErrorHandler).not.toHaveBeenCalled();
|
|
67
|
-
},
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
const wrapper = defineResource({
|
|
71
|
-
id: "root",
|
|
72
|
-
register: [app.with({ secret: "XXX" })],
|
|
73
|
-
});
|
|
74
|
-
|
|
75
|
-
await run(wrapper);
|
|
76
|
-
});
|
|
77
|
-
|
|
78
|
-
it("should work with hooks", async () => {
|
|
79
|
-
const hookEvent = defineEvent<{ message: string }>({ id: "hook.event" });
|
|
80
|
-
const hookHandler = jest.fn();
|
|
81
|
-
|
|
82
|
-
const testResource = defineResource({
|
|
83
|
-
id: "test.resource",
|
|
84
|
-
init: async () => "Resource Value",
|
|
85
|
-
hooks: [
|
|
86
|
-
{
|
|
87
|
-
event: hookEvent,
|
|
88
|
-
run: hookHandler,
|
|
89
|
-
},
|
|
90
|
-
],
|
|
91
|
-
});
|
|
92
|
-
|
|
93
|
-
const app = defineResource({
|
|
94
|
-
id: "app",
|
|
95
|
-
register: [hookEvent, testResource],
|
|
96
|
-
dependencies: { testResource, hookEvent },
|
|
97
|
-
async init(_, { testResource, hookEvent }) {
|
|
98
|
-
await hookEvent({ message: "Hook triggered" });
|
|
99
|
-
|
|
100
|
-
expect(hookHandler).toHaveBeenCalledWith(
|
|
101
|
-
expect.objectContaining({ data: { message: "Hook triggered" } }),
|
|
102
|
-
expect.anything()
|
|
103
|
-
);
|
|
104
|
-
},
|
|
105
|
-
});
|
|
106
|
-
|
|
107
|
-
await run(app);
|
|
108
|
-
});
|
|
109
|
-
});
|
|
110
|
-
});
|