@bluelibs/runner 1.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/LICENSE.md +7 -0
- package/README.md +797 -0
- package/dist/DependencyProcessor.d.ts +49 -0
- package/dist/DependencyProcessor.js +178 -0
- package/dist/DependencyProcessor.js.map +1 -0
- package/dist/EventManager.d.ts +13 -0
- package/dist/EventManager.js +58 -0
- package/dist/EventManager.js.map +1 -0
- package/dist/ResourceInitializer.d.ts +13 -0
- package/dist/ResourceInitializer.js +54 -0
- package/dist/ResourceInitializer.js.map +1 -0
- package/dist/Store.d.ts +62 -0
- package/dist/Store.js +186 -0
- package/dist/Store.js.map +1 -0
- package/dist/TaskRunner.d.ts +22 -0
- package/dist/TaskRunner.js +93 -0
- package/dist/TaskRunner.js.map +1 -0
- package/dist/define.d.ts +10 -0
- package/dist/define.js +111 -0
- package/dist/define.js.map +1 -0
- package/dist/defs.d.ts +127 -0
- package/dist/defs.js +12 -0
- package/dist/defs.js.map +1 -0
- package/dist/errors.d.ts +8 -0
- package/dist/errors.js +12 -0
- package/dist/errors.js.map +1 -0
- package/dist/globalEvents.d.ts +36 -0
- package/dist/globalEvents.js +45 -0
- package/dist/globalEvents.js.map +1 -0
- package/dist/globalResources.d.ts +8 -0
- package/dist/globalResources.js +19 -0
- package/dist/globalResources.js.map +1 -0
- package/dist/index.d.ts +49 -0
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -0
- package/dist/run.d.ts +32 -0
- package/dist/run.js +39 -0
- package/dist/run.js.map +1 -0
- package/dist/tools/findCircularDependencies.d.ts +16 -0
- package/dist/tools/findCircularDependencies.js +53 -0
- package/dist/tools/findCircularDependencies.js.map +1 -0
- package/package.json +50 -0
- package/src/DependencyProcessor.ts +243 -0
- package/src/EventManager.ts +84 -0
- package/src/ResourceInitializer.ts +69 -0
- package/src/Store.ts +250 -0
- package/src/TaskRunner.ts +135 -0
- package/src/__tests__/EventManager.test.ts +96 -0
- package/src/__tests__/ResourceInitializer.test.ts +109 -0
- package/src/__tests__/Store.test.ts +143 -0
- package/src/__tests__/TaskRunner.test.ts +135 -0
- package/src/__tests__/benchmark/benchmark.test.ts +146 -0
- package/src/__tests__/errors.test.ts +268 -0
- package/src/__tests__/globalEvents.test.ts +99 -0
- package/src/__tests__/index.ts +9 -0
- package/src/__tests__/run.hooks.test.ts +110 -0
- package/src/__tests__/run.test.ts +614 -0
- package/src/__tests__/tools/findCircularDependencies.test.ts +217 -0
- package/src/define.ts +142 -0
- package/src/defs.ts +221 -0
- package/src/errors.ts +22 -0
- package/src/globalEvents.ts +64 -0
- package/src/globalResources.ts +19 -0
- package/src/index.ts +28 -0
- package/src/run.ts +98 -0
- package/src/tools/findCircularDependencies.ts +69 -0
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { globalEvents } from "../globalEvents";
|
|
2
|
+
import { defineTask, defineResource } from "../define";
|
|
3
|
+
import { run } from "../run";
|
|
4
|
+
|
|
5
|
+
describe("Global Events", () => {
|
|
6
|
+
it("should emit global events during resource initialization and task execution", async () => {
|
|
7
|
+
const globalBeforeInitHandler = jest.fn();
|
|
8
|
+
const globalAfterInitHandler = jest.fn();
|
|
9
|
+
const globalTaskBeforeRunHandler = jest.fn();
|
|
10
|
+
const globalTaskAfterRunHandler = jest.fn();
|
|
11
|
+
const globalResourceBeforeInitHandler = jest.fn();
|
|
12
|
+
const globalResourceAfterInitHandler = jest.fn();
|
|
13
|
+
|
|
14
|
+
const testResource = defineResource({
|
|
15
|
+
id: "test.resource",
|
|
16
|
+
init: async () => "Resource Value",
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
const testTask = defineTask({
|
|
20
|
+
id: "test.task",
|
|
21
|
+
run: async () => {
|
|
22
|
+
return "Task Result";
|
|
23
|
+
},
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
const app = defineResource({
|
|
27
|
+
id: "app",
|
|
28
|
+
register: [testResource, testTask],
|
|
29
|
+
dependencies: { testResource, testTask },
|
|
30
|
+
hooks: [
|
|
31
|
+
{ event: globalEvents.beforeInit, run: globalBeforeInitHandler },
|
|
32
|
+
{ event: globalEvents.afterInit, run: globalAfterInitHandler },
|
|
33
|
+
{
|
|
34
|
+
event: globalEvents.tasks.beforeRun,
|
|
35
|
+
run: globalTaskBeforeRunHandler,
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
event: globalEvents.tasks.afterRun,
|
|
39
|
+
run: globalTaskAfterRunHandler,
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
event: globalEvents.resources.beforeInit,
|
|
43
|
+
run: globalResourceBeforeInitHandler,
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
event: globalEvents.resources.afterInit,
|
|
47
|
+
run: globalResourceAfterInitHandler,
|
|
48
|
+
},
|
|
49
|
+
],
|
|
50
|
+
async init(_, { testResource, testTask }) {
|
|
51
|
+
expect(testResource).toBe("Resource Value");
|
|
52
|
+
const response = await testTask();
|
|
53
|
+
},
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
await run(app);
|
|
57
|
+
|
|
58
|
+
expect(globalBeforeInitHandler).toHaveBeenCalled();
|
|
59
|
+
expect(globalAfterInitHandler).toHaveBeenCalled();
|
|
60
|
+
expect(globalResourceBeforeInitHandler).toHaveBeenCalled();
|
|
61
|
+
expect(globalResourceAfterInitHandler).toHaveBeenCalled();
|
|
62
|
+
expect(globalTaskBeforeRunHandler).toHaveBeenCalled();
|
|
63
|
+
expect(globalTaskAfterRunHandler).toHaveBeenCalled();
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
it("should emit global error event when an task throws an error", async () => {
|
|
67
|
+
const globalTaskOnErrorHandler = jest.fn();
|
|
68
|
+
|
|
69
|
+
const errorTask = defineTask({
|
|
70
|
+
id: "error.task",
|
|
71
|
+
run: async () => {
|
|
72
|
+
throw new Error("Test Error");
|
|
73
|
+
},
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
const app = defineResource({
|
|
77
|
+
id: "app",
|
|
78
|
+
register: [errorTask],
|
|
79
|
+
dependencies: { errorTask },
|
|
80
|
+
hooks: [
|
|
81
|
+
{
|
|
82
|
+
event: globalEvents.tasks.onError,
|
|
83
|
+
run: globalTaskOnErrorHandler,
|
|
84
|
+
},
|
|
85
|
+
],
|
|
86
|
+
async init(_, { errorTask }) {
|
|
87
|
+
try {
|
|
88
|
+
await errorTask();
|
|
89
|
+
} catch (error) {
|
|
90
|
+
// Error is expected
|
|
91
|
+
}
|
|
92
|
+
},
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
await run(app);
|
|
96
|
+
|
|
97
|
+
expect(globalTaskOnErrorHandler).toHaveBeenCalled();
|
|
98
|
+
});
|
|
99
|
+
});
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import "./EventManager.test";
|
|
2
|
+
import "./tools/findCircularDependencies.test";
|
|
3
|
+
import "./ResourceInitializer.test";
|
|
4
|
+
import "./run.test";
|
|
5
|
+
import "./run.hooks.test";
|
|
6
|
+
import "./TaskRunner.test";
|
|
7
|
+
import "./globalEvents.test";
|
|
8
|
+
import "./Store.test";
|
|
9
|
+
import "./errors.test";
|
|
@@ -0,0 +1,110 @@
|
|
|
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
|
+
});
|