@bluelibs/runner 1.5.4 → 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.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 +3 -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
|
@@ -23,30 +23,55 @@ describe("Global Events", () => {
|
|
|
23
23
|
},
|
|
24
24
|
});
|
|
25
25
|
|
|
26
|
+
const taskBeforeInit = defineTask({
|
|
27
|
+
id: "task.beforeInit",
|
|
28
|
+
on: globalEvents.beforeInit,
|
|
29
|
+
run: globalBeforeInitHandler,
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
const taskAfterInit = defineTask({
|
|
33
|
+
id: "task.afterInit",
|
|
34
|
+
on: globalEvents.afterInit,
|
|
35
|
+
run: globalAfterInitHandler,
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
const taskBeforeRun = defineTask({
|
|
39
|
+
id: "task.beforeRun",
|
|
40
|
+
on: globalEvents.tasks.beforeRun,
|
|
41
|
+
run: globalTaskBeforeRunHandler,
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
const taskAfterRun = defineTask({
|
|
45
|
+
id: "task.afterRun",
|
|
46
|
+
on: globalEvents.tasks.afterRun,
|
|
47
|
+
run: globalTaskAfterRunHandler,
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
const resourceBeforeInit = defineTask({
|
|
51
|
+
id: "resource.beforeInit",
|
|
52
|
+
on: globalEvents.resources.beforeInit,
|
|
53
|
+
run: globalResourceBeforeInitHandler,
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
const resourceAfterInit = defineTask({
|
|
57
|
+
id: "resource.afterInit",
|
|
58
|
+
on: globalEvents.resources.afterInit,
|
|
59
|
+
run: globalResourceAfterInitHandler,
|
|
60
|
+
});
|
|
61
|
+
|
|
26
62
|
const app = defineResource({
|
|
27
63
|
id: "app",
|
|
28
|
-
register: [
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
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
|
-
},
|
|
64
|
+
register: [
|
|
65
|
+
testResource,
|
|
66
|
+
testTask,
|
|
67
|
+
taskBeforeInit,
|
|
68
|
+
taskAfterInit,
|
|
69
|
+
taskBeforeRun,
|
|
70
|
+
taskAfterRun,
|
|
71
|
+
resourceBeforeInit,
|
|
72
|
+
resourceAfterInit,
|
|
49
73
|
],
|
|
74
|
+
dependencies: { testResource, testTask },
|
|
50
75
|
async init(_, { testResource, testTask }) {
|
|
51
76
|
expect(testResource).toBe("Resource Value");
|
|
52
77
|
const response = await testTask();
|
|
@@ -73,16 +98,16 @@ describe("Global Events", () => {
|
|
|
73
98
|
},
|
|
74
99
|
});
|
|
75
100
|
|
|
101
|
+
const onErrorHandler = defineTask({
|
|
102
|
+
id: "on.error.handler",
|
|
103
|
+
on: globalEvents.tasks.onError,
|
|
104
|
+
run: globalTaskOnErrorHandler,
|
|
105
|
+
});
|
|
106
|
+
|
|
76
107
|
const app = defineResource({
|
|
77
108
|
id: "app",
|
|
78
|
-
register: [errorTask],
|
|
109
|
+
register: [errorTask, onErrorHandler],
|
|
79
110
|
dependencies: { errorTask },
|
|
80
|
-
hooks: [
|
|
81
|
-
{
|
|
82
|
-
event: globalEvents.tasks.onError,
|
|
83
|
-
run: globalTaskOnErrorHandler,
|
|
84
|
-
},
|
|
85
|
-
],
|
|
86
111
|
async init(_, { errorTask }) {
|
|
87
112
|
try {
|
|
88
113
|
await errorTask();
|
package/src/__tests__/index.ts
CHANGED
|
@@ -72,15 +72,15 @@ describe("run", () => {
|
|
|
72
72
|
},
|
|
73
73
|
});
|
|
74
74
|
|
|
75
|
+
const handlerTask = defineTask({
|
|
76
|
+
id: "handler.task",
|
|
77
|
+
on: testEvent,
|
|
78
|
+
run: eventHandler,
|
|
79
|
+
});
|
|
80
|
+
|
|
75
81
|
const app = defineResource({
|
|
76
82
|
id: "app",
|
|
77
|
-
register: [testEvent, testTask],
|
|
78
|
-
hooks: [
|
|
79
|
-
{
|
|
80
|
-
event: testEvent,
|
|
81
|
-
run: eventHandler,
|
|
82
|
-
},
|
|
83
|
-
],
|
|
83
|
+
register: [testEvent, testTask, handlerTask],
|
|
84
84
|
dependencies: { testTask },
|
|
85
85
|
async init(_, { testTask }) {
|
|
86
86
|
await testTask();
|
|
@@ -101,15 +101,28 @@ describe("run", () => {
|
|
|
101
101
|
run: async () => "Task executed",
|
|
102
102
|
});
|
|
103
103
|
|
|
104
|
+
const onBeforeRun = defineTask({
|
|
105
|
+
id: "on.before.run",
|
|
106
|
+
on: testTask.events.beforeRun,
|
|
107
|
+
run: beforeRunHandler,
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
const onAfterRun = defineTask({
|
|
111
|
+
id: "on.after.run",
|
|
112
|
+
on: testTask.events.afterRun,
|
|
113
|
+
run: afterRunHandler,
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
const onError = defineTask({
|
|
117
|
+
id: "on.error",
|
|
118
|
+
on: testTask.events.onError,
|
|
119
|
+
run: onErrorHandler,
|
|
120
|
+
});
|
|
121
|
+
|
|
104
122
|
const app = defineResource({
|
|
105
123
|
id: "app",
|
|
106
|
-
register: [testTask],
|
|
124
|
+
register: [testTask, onBeforeRun, onAfterRun, onError],
|
|
107
125
|
dependencies: { testTask },
|
|
108
|
-
hooks: [
|
|
109
|
-
{ event: testTask.events.beforeRun, run: beforeRunHandler },
|
|
110
|
-
{ event: testTask.events.afterRun, run: afterRunHandler },
|
|
111
|
-
{ event: testTask.events.onError, run: onErrorHandler },
|
|
112
|
-
],
|
|
113
126
|
async init(_, { testTask }) {
|
|
114
127
|
await testTask();
|
|
115
128
|
expect(beforeRunHandler).toHaveBeenCalled();
|
|
@@ -132,56 +145,23 @@ describe("run", () => {
|
|
|
132
145
|
let value = false;
|
|
133
146
|
const errorHook = jest.fn();
|
|
134
147
|
|
|
135
|
-
const
|
|
136
|
-
id: "
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
hooks: [
|
|
140
|
-
{
|
|
141
|
-
event: testTask.events.onError,
|
|
142
|
-
run: errorHook,
|
|
143
|
-
},
|
|
144
|
-
],
|
|
145
|
-
async init(_, { testTask }) {
|
|
146
|
-
await testTask();
|
|
147
|
-
},
|
|
148
|
-
});
|
|
149
|
-
|
|
150
|
-
await expect(run(app)).rejects.toThrow("Task failed");
|
|
151
|
-
expect(errorHook).toHaveBeenCalled();
|
|
152
|
-
});
|
|
153
|
-
|
|
154
|
-
it("should allow suppression of an error", async () => {
|
|
155
|
-
const supressMock = jest.fn();
|
|
156
|
-
const testTask = defineTask({
|
|
157
|
-
id: "test.task",
|
|
158
|
-
run: async () => {
|
|
159
|
-
throw new Error("Task failed");
|
|
160
|
-
},
|
|
148
|
+
const handler = defineTask({
|
|
149
|
+
id: "handler",
|
|
150
|
+
on: testTask.events.onError,
|
|
151
|
+
run: errorHook,
|
|
161
152
|
});
|
|
162
153
|
|
|
163
154
|
const app = defineResource({
|
|
164
155
|
id: "app",
|
|
165
|
-
register: [testTask],
|
|
156
|
+
register: [testTask, handler],
|
|
166
157
|
dependencies: { testTask },
|
|
167
|
-
hooks: [
|
|
168
|
-
{
|
|
169
|
-
event: testTask.events.onError,
|
|
170
|
-
run: async (event, deps) => {
|
|
171
|
-
supressMock();
|
|
172
|
-
event.data.suppress();
|
|
173
|
-
},
|
|
174
|
-
},
|
|
175
|
-
],
|
|
176
158
|
async init(_, { testTask }) {
|
|
177
159
|
await testTask();
|
|
178
|
-
|
|
179
|
-
return "ok";
|
|
180
160
|
},
|
|
181
161
|
});
|
|
182
162
|
|
|
183
|
-
await expect(run(app)).
|
|
184
|
-
expect(
|
|
163
|
+
await expect(run(app)).rejects.toThrow("Task failed");
|
|
164
|
+
expect(errorHook).toHaveBeenCalled();
|
|
185
165
|
});
|
|
186
166
|
|
|
187
167
|
it("should be able to register an task with middleware and execute it, ensuring the middleware is called in the correct order", async () => {
|
|
@@ -307,58 +287,86 @@ describe("run", () => {
|
|
|
307
287
|
|
|
308
288
|
await expect(run(app)).rejects.toThrow(/Circular dependencies detected/);
|
|
309
289
|
});
|
|
310
|
-
});
|
|
311
290
|
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
291
|
+
it("should be able to listen to an event through the 'on' property", async () => {
|
|
292
|
+
const testEvent = defineEvent<{ message: string }>({ id: "test.event" });
|
|
293
|
+
const eventHandler = jest.fn();
|
|
315
294
|
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
295
|
+
const task = defineTask({
|
|
296
|
+
id: "app",
|
|
297
|
+
on: testEvent,
|
|
298
|
+
async run(event) {
|
|
299
|
+
eventHandler();
|
|
300
|
+
},
|
|
301
|
+
});
|
|
323
302
|
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
303
|
+
const app = defineResource({
|
|
304
|
+
id: "app.resource",
|
|
305
|
+
register: [testEvent, task],
|
|
306
|
+
dependencies: { task, testEvent },
|
|
307
|
+
async init(_, deps) {
|
|
308
|
+
await deps.testEvent({ message: "Event emitted" });
|
|
309
|
+
},
|
|
310
|
+
});
|
|
311
|
+
|
|
312
|
+
await run(app);
|
|
313
|
+
expect(eventHandler).toHaveBeenCalled();
|
|
331
314
|
});
|
|
332
315
|
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
316
|
+
it("should avoid infinite recursion by omitting task emissions recursively", async () => {
|
|
317
|
+
const testEvent = defineEvent<{ message: string }>({ id: "test.event" });
|
|
318
|
+
const eventHandler = jest.fn();
|
|
336
319
|
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
320
|
+
const task = defineTask({
|
|
321
|
+
id: "app",
|
|
322
|
+
on: testEvent,
|
|
323
|
+
dependencies: { testEvent },
|
|
324
|
+
async run(event, { testEvent }) {
|
|
325
|
+
eventHandler();
|
|
326
|
+
await testEvent({ message: "Event emitted" });
|
|
327
|
+
},
|
|
328
|
+
});
|
|
340
329
|
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
{
|
|
345
|
-
|
|
346
|
-
|
|
330
|
+
const app = defineResource({
|
|
331
|
+
id: "app.resource",
|
|
332
|
+
register: [testEvent, task],
|
|
333
|
+
dependencies: { task, testEvent },
|
|
334
|
+
async init(_, deps) {
|
|
335
|
+
await deps.testEvent({ message: "Event emitted" });
|
|
347
336
|
},
|
|
348
|
-
|
|
349
|
-
});
|
|
337
|
+
});
|
|
350
338
|
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
register: [testEvent, resource],
|
|
354
|
-
dependencies: { resource, testEvent },
|
|
355
|
-
async init(_, deps) {
|
|
356
|
-
await deps.testEvent({ message: "Event emitted" });
|
|
357
|
-
},
|
|
339
|
+
await run(app);
|
|
340
|
+
expect(eventHandler).toHaveBeenCalled();
|
|
358
341
|
});
|
|
359
342
|
|
|
360
|
-
|
|
361
|
-
|
|
343
|
+
it("should be able to listen to global events", async () => {
|
|
344
|
+
const testEvent = defineEvent<{ message: string }>({ id: "test.event" });
|
|
345
|
+
const eventHandler = jest.fn();
|
|
346
|
+
let isReady = false;
|
|
347
|
+
|
|
348
|
+
const task = defineTask({
|
|
349
|
+
id: "app",
|
|
350
|
+
on: "*",
|
|
351
|
+
async run(event) {
|
|
352
|
+
event.data;
|
|
353
|
+
isReady && eventHandler();
|
|
354
|
+
},
|
|
355
|
+
});
|
|
356
|
+
|
|
357
|
+
const app = defineResource({
|
|
358
|
+
id: "app.resource",
|
|
359
|
+
register: [testEvent, task],
|
|
360
|
+
dependencies: { task, testEvent },
|
|
361
|
+
async init(_, deps) {
|
|
362
|
+
isReady = true;
|
|
363
|
+
await deps.testEvent({ message: "Event emitted" });
|
|
364
|
+
},
|
|
365
|
+
});
|
|
366
|
+
|
|
367
|
+
await run(app);
|
|
368
|
+
expect(eventHandler).toHaveBeenCalled();
|
|
369
|
+
});
|
|
362
370
|
});
|
|
363
371
|
|
|
364
372
|
// Resources
|
|
@@ -462,8 +470,8 @@ describe("run", () => {
|
|
|
462
470
|
|
|
463
471
|
it("should allow suppression of an error", async () => {
|
|
464
472
|
const supressMock = jest.fn();
|
|
465
|
-
const
|
|
466
|
-
id: "
|
|
473
|
+
const erroringResource = defineResource({
|
|
474
|
+
id: "error.resource",
|
|
467
475
|
init: async () => {
|
|
468
476
|
// we do this so it doesn't become a never.
|
|
469
477
|
if (true === true) {
|
|
@@ -471,29 +479,52 @@ describe("run", () => {
|
|
|
471
479
|
}
|
|
472
480
|
},
|
|
473
481
|
});
|
|
482
|
+
const erroringTask = defineTask({
|
|
483
|
+
id: "error.task",
|
|
484
|
+
run: async (event) => {
|
|
485
|
+
if (true === true) {
|
|
486
|
+
throw new Error("Run failed");
|
|
487
|
+
}
|
|
488
|
+
},
|
|
489
|
+
});
|
|
490
|
+
|
|
491
|
+
const resourceErrorHandler = defineTask({
|
|
492
|
+
id: "resourcehandler",
|
|
493
|
+
on: erroringResource.events.onError,
|
|
494
|
+
run: async (event) => {
|
|
495
|
+
supressMock();
|
|
496
|
+
event.data.suppress();
|
|
497
|
+
},
|
|
498
|
+
});
|
|
499
|
+
|
|
500
|
+
const taskErrorHandler = defineTask({
|
|
501
|
+
id: "taskhandler",
|
|
502
|
+
on: erroringTask.events.onError,
|
|
503
|
+
run: async (event) => {
|
|
504
|
+
supressMock();
|
|
505
|
+
event.data.suppress();
|
|
506
|
+
},
|
|
507
|
+
});
|
|
474
508
|
|
|
475
509
|
const app = defineResource({
|
|
476
510
|
id: "app",
|
|
477
|
-
register: [
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
run: async (event, deps) => {
|
|
483
|
-
supressMock();
|
|
484
|
-
event.data.suppress();
|
|
485
|
-
},
|
|
486
|
-
},
|
|
511
|
+
register: [
|
|
512
|
+
erroringResource,
|
|
513
|
+
erroringTask,
|
|
514
|
+
resourceErrorHandler,
|
|
515
|
+
taskErrorHandler,
|
|
487
516
|
],
|
|
488
|
-
|
|
489
|
-
|
|
517
|
+
dependencies: { erroringResource, erroringTask },
|
|
518
|
+
async init(_, { erroringResource, erroringTask }) {
|
|
519
|
+
expect(erroringResource).toBeUndefined();
|
|
520
|
+
expect(await erroringTask()).toBeUndefined();
|
|
490
521
|
|
|
491
522
|
return "ok";
|
|
492
523
|
},
|
|
493
524
|
});
|
|
494
525
|
|
|
495
526
|
await expect(run(app)).resolves.toBe("ok");
|
|
496
|
-
expect(supressMock).
|
|
527
|
+
expect(supressMock).toHaveBeenCalledTimes(2);
|
|
497
528
|
});
|
|
498
529
|
});
|
|
499
530
|
|
|
@@ -51,6 +51,10 @@ describe("typesafety", () => {
|
|
|
51
51
|
id: "dummy.resource",
|
|
52
52
|
init: async () => "Resource Value",
|
|
53
53
|
});
|
|
54
|
+
const dummyResourceOptionalConfig = defineResource({
|
|
55
|
+
id: "dummy.resource",
|
|
56
|
+
init: async (config?: string) => "Resource Value",
|
|
57
|
+
});
|
|
54
58
|
|
|
55
59
|
const testResource = defineResource({
|
|
56
60
|
id: "test.resource",
|
|
@@ -91,6 +95,9 @@ describe("typesafety", () => {
|
|
|
91
95
|
dummyResource.with({ ok: 123 }),
|
|
92
96
|
// @ts-expect-error
|
|
93
97
|
dummyResource.with(),
|
|
98
|
+
|
|
99
|
+
// should work
|
|
100
|
+
dummyResourceOptionalConfig.with("hello"),
|
|
94
101
|
],
|
|
95
102
|
});
|
|
96
103
|
|
|
@@ -105,24 +112,18 @@ describe("typesafety", () => {
|
|
|
105
112
|
run: async () => "Task executed",
|
|
106
113
|
});
|
|
107
114
|
|
|
108
|
-
const testResource =
|
|
115
|
+
const testResource = defineTask({
|
|
109
116
|
id: "test.resource",
|
|
110
117
|
dependencies: { task },
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
deps.task;
|
|
121
|
-
// @ts-expect-error
|
|
122
|
-
deps.task2;
|
|
123
|
-
},
|
|
124
|
-
},
|
|
125
|
-
],
|
|
118
|
+
on: hookEvent,
|
|
119
|
+
run: async (_, deps) => {
|
|
120
|
+
_.data.message;
|
|
121
|
+
// @ts-expect-error
|
|
122
|
+
_.data.messagex;
|
|
123
|
+
deps.task();
|
|
124
|
+
// @ts-expect-error
|
|
125
|
+
deps.task2;
|
|
126
|
+
},
|
|
126
127
|
});
|
|
127
128
|
|
|
128
129
|
expect(true).toBe(true);
|
package/src/define.ts
CHANGED
|
@@ -21,10 +21,10 @@ export function defineTask<
|
|
|
21
21
|
Input = undefined,
|
|
22
22
|
Output extends Promise<any> = any,
|
|
23
23
|
Deps extends DependencyMapType = any,
|
|
24
|
-
|
|
24
|
+
TOn extends "*" | IEventDefinition | undefined = undefined
|
|
25
25
|
>(
|
|
26
|
-
taskConfig: ITaskDefinition<Input, Output, Deps,
|
|
27
|
-
): ITask<Input, Output, Deps,
|
|
26
|
+
taskConfig: ITaskDefinition<Input, Output, Deps, TOn>
|
|
27
|
+
): ITask<Input, Output, Deps, TOn> {
|
|
28
28
|
return {
|
|
29
29
|
[symbols.task]: true,
|
|
30
30
|
id: taskConfig.id,
|
|
@@ -60,7 +60,6 @@ export function defineResource<
|
|
|
60
60
|
[symbols.resource]: true,
|
|
61
61
|
id: constConfig.id,
|
|
62
62
|
dependencies: constConfig.dependencies,
|
|
63
|
-
hooks: constConfig.hooks || [],
|
|
64
63
|
dispose: constConfig.dispose,
|
|
65
64
|
register: constConfig.register || [],
|
|
66
65
|
overrides: constConfig.overrides || [],
|
package/src/defs.ts
CHANGED
|
@@ -32,7 +32,7 @@ export interface IMiddlewareMeta extends IMeta {}
|
|
|
32
32
|
// DependencyMap types
|
|
33
33
|
export type DependencyMapType = Record<
|
|
34
34
|
string,
|
|
35
|
-
ITask<any, any, any> | IResource<any, any, any> | IEventDefinition<any>
|
|
35
|
+
ITask<any, any, any, any> | IResource<any, any, any> | IEventDefinition<any>
|
|
36
36
|
>;
|
|
37
37
|
|
|
38
38
|
// Helper Types for Extracting Generics
|
|
@@ -61,19 +61,39 @@ export type DependencyValuesType<T extends DependencyMapType> = {
|
|
|
61
61
|
[K in keyof T]: DependencyValueType<T[K]>;
|
|
62
62
|
};
|
|
63
63
|
|
|
64
|
+
type Optional<T> = {
|
|
65
|
+
[K in keyof T]?: T[K];
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
// Utility type to check if a type is void
|
|
69
|
+
type IsVoid<T> = [T] extends [void] ? true : false;
|
|
70
|
+
|
|
71
|
+
// Utility type to check if a type is optional (can be undefined)
|
|
72
|
+
type IsOptional<T> = undefined extends T ? true : false;
|
|
73
|
+
|
|
74
|
+
// IReso
|
|
75
|
+
|
|
76
|
+
// Conditional type to allow `void`, optional, or any type
|
|
77
|
+
type OptionalOrVoidOrAnything<T> = IsVoid<T> extends true
|
|
78
|
+
? void
|
|
79
|
+
: IsOptional<T> extends true
|
|
80
|
+
? Optional<T>
|
|
81
|
+
: T;
|
|
82
|
+
|
|
64
83
|
// RegisterableItems Type with Conditional Inclusion
|
|
65
|
-
export type RegisterableItems =
|
|
84
|
+
export type RegisterableItems<T = any> =
|
|
66
85
|
| IResourceWithConfig<any>
|
|
67
86
|
| IResource<void, any, any>
|
|
68
|
-
|
|
|
69
|
-
|
|
|
70
|
-
|
|
|
87
|
+
| IResource<OptionalOrVoidOrAnything<T>, any, any>
|
|
88
|
+
| ITaskDefinition<any, any, any, any>
|
|
89
|
+
| IMiddlewareDefinition<any>
|
|
90
|
+
| IEventDefinition<any>;
|
|
71
91
|
|
|
72
92
|
export interface ITaskDefinition<
|
|
73
93
|
TInput = any,
|
|
74
94
|
TOutput extends Promise<any> = any,
|
|
75
95
|
TDependencies extends DependencyMapType = {},
|
|
76
|
-
|
|
96
|
+
TOn extends "*" | IEventDefinition<any> | undefined = undefined // Adding a generic to track 'on' type
|
|
77
97
|
> {
|
|
78
98
|
id: string;
|
|
79
99
|
dependencies?: TDependencies | (() => TDependencies);
|
|
@@ -81,7 +101,7 @@ export interface ITaskDefinition<
|
|
|
81
101
|
/**
|
|
82
102
|
* Listen to events in a simple way
|
|
83
103
|
*/
|
|
84
|
-
on?:
|
|
104
|
+
on?: TOn;
|
|
85
105
|
/**
|
|
86
106
|
* This makes sense only when `on` is specified to provide the order of the execution.
|
|
87
107
|
* The event with the lowest order will be executed first.
|
|
@@ -89,7 +109,12 @@ export interface ITaskDefinition<
|
|
|
89
109
|
listenerOrder?: number;
|
|
90
110
|
meta?: ITaskMeta;
|
|
91
111
|
run: (
|
|
92
|
-
input:
|
|
112
|
+
input: TOn extends undefined ? TInput : IEvent<ExtractEventParams<TOn>>,
|
|
113
|
+
// input: TOn extends "*"
|
|
114
|
+
// ? IEvent<any>
|
|
115
|
+
// : TEventDefinitionInput extends null | void
|
|
116
|
+
// ? TInput
|
|
117
|
+
// : IEvent<TEventDefinitionInput>,
|
|
93
118
|
dependencies: DependencyValuesType<TDependencies>
|
|
94
119
|
) => TOutput;
|
|
95
120
|
}
|
|
@@ -127,13 +152,8 @@ export interface ITask<
|
|
|
127
152
|
TInput = any,
|
|
128
153
|
TOutput extends Promise<any> = any,
|
|
129
154
|
TDependencies extends DependencyMapType = {},
|
|
130
|
-
|
|
131
|
-
> extends ITaskDefinition<
|
|
132
|
-
TInput,
|
|
133
|
-
TOutput,
|
|
134
|
-
TDependencies,
|
|
135
|
-
TEventDefinitionInput
|
|
136
|
-
> {
|
|
155
|
+
TOn extends "*" | IEventDefinition<any> | undefined = undefined
|
|
156
|
+
> extends ITaskDefinition<TInput, TOutput, TDependencies, TOn> {
|
|
137
157
|
dependencies: TDependencies | (() => TDependencies);
|
|
138
158
|
computedDependencies?: DependencyValuesType<TDependencies>;
|
|
139
159
|
middleware: IMiddlewareDefinition[];
|
|
@@ -156,9 +176,6 @@ export interface IResourceDefinition<
|
|
|
156
176
|
> {
|
|
157
177
|
id: string;
|
|
158
178
|
dependencies?: TDependencies | ((config: TConfig) => TDependencies);
|
|
159
|
-
hooks?:
|
|
160
|
-
| IHookDefinition<TDependencies, THooks>[]
|
|
161
|
-
| ((config: TConfig) => IHookDefinition<TDependencies, THooks>[]);
|
|
162
179
|
register?:
|
|
163
180
|
| Array<RegisterableItems>
|
|
164
181
|
| ((config: TConfig) => Array<RegisterableItems>);
|
|
@@ -201,10 +218,6 @@ export interface IResource<
|
|
|
201
218
|
afterInit: IEventDefinition<AfterInitEventPayload<TConfig, TValue>>;
|
|
202
219
|
onError: IEventDefinition<OnErrorEventPayload>;
|
|
203
220
|
};
|
|
204
|
-
hooks:
|
|
205
|
-
| IHookDefinition<TDependencies>[]
|
|
206
|
-
| ((config: TConfig) => IHookDefinition<TDependencies>[]);
|
|
207
|
-
|
|
208
221
|
overrides: Array<IResource | ITask | IMiddleware | IResourceWithConfig>;
|
|
209
222
|
middleware: IMiddlewareDefinition[];
|
|
210
223
|
}
|