@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
|
@@ -127,4 +127,44 @@ describe("Store", () => {
|
|
|
127
127
|
/Store already initialized/i
|
|
128
128
|
);
|
|
129
129
|
});
|
|
130
|
+
|
|
131
|
+
it("should access overrides and overrideRequests getters", () => {
|
|
132
|
+
// Test the overrides getter (line 56)
|
|
133
|
+
const overrides = store.overrides;
|
|
134
|
+
expect(overrides).toBeDefined();
|
|
135
|
+
expect(overrides instanceof Map).toBe(true);
|
|
136
|
+
|
|
137
|
+
// Test the overrideRequests getter (line 57)
|
|
138
|
+
const overrideRequests = store.overrideRequests;
|
|
139
|
+
expect(overrideRequests).toBeDefined();
|
|
140
|
+
expect(overrideRequests instanceof Set).toBe(true);
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
it("should call processOverrides method", () => {
|
|
144
|
+
// Test processOverrides method (line 149)
|
|
145
|
+
expect(() => store.processOverrides()).not.toThrow();
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
it("should call getEverywhereMiddlewareForTasks method", () => {
|
|
149
|
+
// Test getEverywhereMiddlewareForTasks method (lines 152-153)
|
|
150
|
+
const result = store.getEverywhereMiddlewareForTasks([]);
|
|
151
|
+
expect(Array.isArray(result)).toBe(true);
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
it("should call getEverywhereMiddlewareForResources method", () => {
|
|
155
|
+
// Test getEverywhereMiddlewareForResources method (lines 156-157)
|
|
156
|
+
const result = store.getEverywhereMiddlewareForResources([]);
|
|
157
|
+
expect(Array.isArray(result)).toBe(true);
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
it("should call storeEventsForAllTasks method", () => {
|
|
161
|
+
// Test storeEventsForAllTasks method (line 165)
|
|
162
|
+
expect(() => store.storeEventsForAllTasks()).not.toThrow();
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
it("should call getDependentNodes method", () => {
|
|
166
|
+
// Test getDependentNodes method (line 169)
|
|
167
|
+
const result = store.getDependentNodes();
|
|
168
|
+
expect(Array.isArray(result)).toBe(true);
|
|
169
|
+
});
|
|
130
170
|
});
|
|
@@ -4,6 +4,7 @@ import { EventManager } from "../../models/EventManager";
|
|
|
4
4
|
import { defineTask, defineResource, defineMiddleware } from "../../define";
|
|
5
5
|
import { ITask } from "../../defs";
|
|
6
6
|
import { Logger } from "../../models";
|
|
7
|
+
import { globalEvents } from "../../globals/globalEvents";
|
|
7
8
|
|
|
8
9
|
describe("TaskRunner", () => {
|
|
9
10
|
let store: Store;
|
|
@@ -42,16 +43,16 @@ describe("TaskRunner", () => {
|
|
|
42
43
|
it("should run an task with middleware", async () => {
|
|
43
44
|
const middleware1 = defineMiddleware({
|
|
44
45
|
id: "middleware1",
|
|
45
|
-
run: async ({ next,
|
|
46
|
-
const result = await next(input);
|
|
46
|
+
run: async ({ next, task }) => {
|
|
47
|
+
const result = await next(task?.input);
|
|
47
48
|
return result + 1;
|
|
48
49
|
},
|
|
49
50
|
});
|
|
50
51
|
|
|
51
52
|
const middleware2 = defineMiddleware({
|
|
52
53
|
id: "middleware2",
|
|
53
|
-
run: async ({
|
|
54
|
-
const result = await next(input);
|
|
54
|
+
run: async ({ task, next }, deps, config) => {
|
|
55
|
+
const result = await next(task?.input);
|
|
55
56
|
return result * 2;
|
|
56
57
|
},
|
|
57
58
|
});
|
|
@@ -104,8 +105,22 @@ describe("TaskRunner", () => {
|
|
|
104
105
|
expect.objectContaining({ data: { input: 5 } })
|
|
105
106
|
);
|
|
106
107
|
expect(afterRunSpy).toHaveBeenCalledWith(
|
|
107
|
-
expect.objectContaining({
|
|
108
|
+
expect.objectContaining({
|
|
109
|
+
data: expect.objectContaining({
|
|
110
|
+
input: 5,
|
|
111
|
+
output: 10,
|
|
112
|
+
setOutput: expect.any(Function),
|
|
113
|
+
}),
|
|
114
|
+
})
|
|
108
115
|
);
|
|
116
|
+
|
|
117
|
+
// Verify that the output getter actually works
|
|
118
|
+
const afterRunCall = afterRunSpy.mock.calls[0][0];
|
|
119
|
+
expect(afterRunCall.data.output).toBe(10);
|
|
120
|
+
|
|
121
|
+
// Also test the setOutput function to cover line 71
|
|
122
|
+
afterRunCall.data.setOutput(20);
|
|
123
|
+
expect(afterRunCall.data.output).toBe(20);
|
|
109
124
|
});
|
|
110
125
|
|
|
111
126
|
it("should handle errors and emit onError event", async () => {
|
|
@@ -137,4 +152,70 @@ describe("TaskRunner", () => {
|
|
|
137
152
|
})
|
|
138
153
|
);
|
|
139
154
|
});
|
|
155
|
+
|
|
156
|
+
it("should handle error suppression", async () => {
|
|
157
|
+
const error = new Error("Test error");
|
|
158
|
+
const onErrorSpy = jest.fn().mockImplementation((event) => {
|
|
159
|
+
// Call suppress to cover line 113
|
|
160
|
+
event.data.suppress();
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
const task = defineTask({
|
|
164
|
+
id: "testTask",
|
|
165
|
+
run: async () => {
|
|
166
|
+
throw error;
|
|
167
|
+
},
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
store.tasks.set(task.id, {
|
|
171
|
+
task,
|
|
172
|
+
computedDependencies: {},
|
|
173
|
+
isInitialized: false,
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
eventManager.addListener(task.events.onError, onErrorSpy);
|
|
177
|
+
|
|
178
|
+
// The error should be suppressed, so no exception should be thrown
|
|
179
|
+
const result = await taskRunner.run(task, undefined);
|
|
180
|
+
|
|
181
|
+
expect(result).toBeUndefined();
|
|
182
|
+
expect(onErrorSpy).toHaveBeenCalledWith(
|
|
183
|
+
expect.objectContaining({
|
|
184
|
+
data: expect.objectContaining({
|
|
185
|
+
error,
|
|
186
|
+
suppress: expect.any(Function),
|
|
187
|
+
}),
|
|
188
|
+
})
|
|
189
|
+
);
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
it("should handle global events and access output getter", async () => {
|
|
193
|
+
const globalAfterRunSpy = jest.fn();
|
|
194
|
+
|
|
195
|
+
const task = defineTask({
|
|
196
|
+
id: "testTask",
|
|
197
|
+
run: async (input: number) => input * 2,
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
store.tasks.set(task.id, {
|
|
201
|
+
task,
|
|
202
|
+
computedDependencies: {},
|
|
203
|
+
isInitialized: false,
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
// Listen to global afterRun event
|
|
207
|
+
eventManager.addListener(globalEvents.tasks.afterRun, globalAfterRunSpy);
|
|
208
|
+
|
|
209
|
+
await taskRunner.run(task, 5);
|
|
210
|
+
|
|
211
|
+
expect(globalAfterRunSpy).toHaveBeenCalledTimes(1);
|
|
212
|
+
|
|
213
|
+
// Access the output property to trigger the getter
|
|
214
|
+
const globalCall = globalAfterRunSpy.mock.calls[0][0];
|
|
215
|
+
expect(globalCall.data.output).toBe(10);
|
|
216
|
+
|
|
217
|
+
// Test setOutput function as well
|
|
218
|
+
globalCall.data.setOutput(25);
|
|
219
|
+
expect(globalCall.data.output).toBe(25);
|
|
220
|
+
});
|
|
140
221
|
});
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { defineMiddleware, defineTask, defineResource } from "../define";
|
|
2
2
|
import { run } from "../run";
|
|
3
|
+
import { retryMiddleware } from "../globals/middleware/retry.middleware";
|
|
3
4
|
|
|
4
5
|
// Middleware
|
|
5
6
|
describe("Middleware", () => {
|
|
@@ -56,7 +57,7 @@ describe("Middleware", () => {
|
|
|
56
57
|
|
|
57
58
|
const app = defineResource({
|
|
58
59
|
id: "app",
|
|
59
|
-
register: [globalMiddleware.
|
|
60
|
+
register: [globalMiddleware.everywhere(), testMiddleware, testTask],
|
|
60
61
|
dependencies: { testTask },
|
|
61
62
|
async init(_, { testTask }) {
|
|
62
63
|
const result = await testTask();
|
|
@@ -94,7 +95,7 @@ describe("Middleware", () => {
|
|
|
94
95
|
|
|
95
96
|
const app = defineResource({
|
|
96
97
|
id: "app",
|
|
97
|
-
register: [globalMiddleware.
|
|
98
|
+
register: [globalMiddleware.everywhere(), testMiddleware, testTask],
|
|
98
99
|
dependencies: { testTask },
|
|
99
100
|
async init(_, { testTask }) {
|
|
100
101
|
const result = await testTask();
|
|
@@ -176,7 +177,7 @@ describe("Middleware", () => {
|
|
|
176
177
|
it("Should work with resources", async () => {
|
|
177
178
|
const middleware = defineMiddleware({
|
|
178
179
|
id: "middleware",
|
|
179
|
-
run: async ({
|
|
180
|
+
run: async ({ resource, next }) => {
|
|
180
181
|
const result = await next();
|
|
181
182
|
return `Middleware: ${result}`;
|
|
182
183
|
},
|
|
@@ -190,14 +191,15 @@ describe("Middleware", () => {
|
|
|
190
191
|
},
|
|
191
192
|
});
|
|
192
193
|
|
|
193
|
-
|
|
194
|
+
const result = await run(app);
|
|
195
|
+
expect(result.value).toBe("Middleware: App initialized");
|
|
194
196
|
});
|
|
195
197
|
|
|
196
198
|
it("Should work with global middleware", async () => {
|
|
197
199
|
const middleware = defineMiddleware({
|
|
198
200
|
id: "middleware",
|
|
199
|
-
run: async ({
|
|
200
|
-
const result = await next();
|
|
201
|
+
run: async ({ resource, next }) => {
|
|
202
|
+
const result = await next({});
|
|
201
203
|
return `Middleware: ${result}`;
|
|
202
204
|
},
|
|
203
205
|
});
|
|
@@ -211,26 +213,29 @@ describe("Middleware", () => {
|
|
|
211
213
|
|
|
212
214
|
const app = defineResource({
|
|
213
215
|
id: "app",
|
|
214
|
-
register: [middleware.
|
|
216
|
+
register: [middleware.everywhere(), sub],
|
|
215
217
|
dependencies: { sub },
|
|
216
218
|
async init(_, { sub }) {
|
|
217
219
|
return sub;
|
|
218
220
|
},
|
|
219
221
|
});
|
|
220
222
|
|
|
221
|
-
|
|
223
|
+
const result = await run(app);
|
|
224
|
+
expect(String(result.value)).toBe(
|
|
225
|
+
"Middleware: Middleware: Sub initialized"
|
|
226
|
+
);
|
|
222
227
|
});
|
|
223
228
|
|
|
224
229
|
it("Should prevent circular dependencies when middleware depends on the same task", async () => {
|
|
225
|
-
const middleware = defineMiddleware({
|
|
230
|
+
const middleware: any = defineMiddleware({
|
|
226
231
|
id: "middleware",
|
|
227
|
-
dependencies: () => ({ task }),
|
|
228
|
-
run: async (_, { task }) => {
|
|
232
|
+
dependencies: (): any => ({ task }),
|
|
233
|
+
run: async (_: any, { task }: any) => {
|
|
229
234
|
// example
|
|
230
235
|
},
|
|
231
236
|
});
|
|
232
237
|
|
|
233
|
-
const task = defineTask({
|
|
238
|
+
const task: any = defineTask({
|
|
234
239
|
id: "task",
|
|
235
240
|
middleware: [middleware],
|
|
236
241
|
run: async () => "Task executed",
|
|
@@ -247,3 +252,152 @@ describe("Middleware", () => {
|
|
|
247
252
|
expect(run(app)).rejects.toThrowError(/Circular dependencies detected/);
|
|
248
253
|
});
|
|
249
254
|
});
|
|
255
|
+
|
|
256
|
+
describe("Configurable Middleware (.with)", () => {
|
|
257
|
+
it("should allow using middleware usage in a task and pass config to run", async () => {
|
|
258
|
+
let receivedConfig: any;
|
|
259
|
+
const validate = defineMiddleware({
|
|
260
|
+
id: "validate",
|
|
261
|
+
run: async ({ next }, deps, config: { schema: string }) => {
|
|
262
|
+
receivedConfig = config;
|
|
263
|
+
return next();
|
|
264
|
+
},
|
|
265
|
+
});
|
|
266
|
+
const usage = validate.with({ schema: "user" });
|
|
267
|
+
const task = defineTask({
|
|
268
|
+
id: "task",
|
|
269
|
+
middleware: [usage],
|
|
270
|
+
run: async () => "ok",
|
|
271
|
+
});
|
|
272
|
+
const app = defineResource({
|
|
273
|
+
id: "app",
|
|
274
|
+
register: [validate, task],
|
|
275
|
+
dependencies: { task },
|
|
276
|
+
async init(_, { task }) {
|
|
277
|
+
const result = await task();
|
|
278
|
+
expect(result).toBe("ok");
|
|
279
|
+
expect(receivedConfig).toEqual({ schema: "user" });
|
|
280
|
+
},
|
|
281
|
+
});
|
|
282
|
+
await run(app);
|
|
283
|
+
});
|
|
284
|
+
|
|
285
|
+
it("should allow multiple usages of the same middleware definition with different configs", async () => {
|
|
286
|
+
const calls: (string | undefined)[] = [];
|
|
287
|
+
const validate = defineMiddleware({
|
|
288
|
+
id: "validate",
|
|
289
|
+
run: async ({ next }, deps, config: { schema: string }) => {
|
|
290
|
+
calls.push(config.schema);
|
|
291
|
+
return next();
|
|
292
|
+
},
|
|
293
|
+
});
|
|
294
|
+
const usage1 = validate.with({ schema: "user" });
|
|
295
|
+
const usage2 = validate.with({ schema: "admin" });
|
|
296
|
+
const task1 = defineTask({
|
|
297
|
+
id: "task1",
|
|
298
|
+
middleware: [usage1],
|
|
299
|
+
run: async () => "ok1",
|
|
300
|
+
});
|
|
301
|
+
const task2 = defineTask({
|
|
302
|
+
id: "task2",
|
|
303
|
+
middleware: [usage2],
|
|
304
|
+
run: async () => "ok2",
|
|
305
|
+
});
|
|
306
|
+
const app = defineResource({
|
|
307
|
+
id: "app",
|
|
308
|
+
register: [validate, task1, task2],
|
|
309
|
+
dependencies: { task1, task2 },
|
|
310
|
+
async init(_, { task1, task2 }) {
|
|
311
|
+
await task1();
|
|
312
|
+
await task2();
|
|
313
|
+
expect(calls).toEqual(["user", "admin"]);
|
|
314
|
+
},
|
|
315
|
+
});
|
|
316
|
+
await run(app);
|
|
317
|
+
});
|
|
318
|
+
|
|
319
|
+
it("should work in an integration scenario with global and per-task middleware", async () => {
|
|
320
|
+
const calls: string[] = [];
|
|
321
|
+
const log = defineMiddleware({
|
|
322
|
+
id: "log",
|
|
323
|
+
run: async ({ next }) => {
|
|
324
|
+
calls.push("global");
|
|
325
|
+
return next();
|
|
326
|
+
},
|
|
327
|
+
});
|
|
328
|
+
const validate = defineMiddleware({
|
|
329
|
+
id: "validate",
|
|
330
|
+
run: async ({ next }, deps, config: { schema: string }) => {
|
|
331
|
+
expect(config).toBeDefined();
|
|
332
|
+
calls.push(config!.schema);
|
|
333
|
+
return next();
|
|
334
|
+
},
|
|
335
|
+
});
|
|
336
|
+
const usage = validate.with({ schema: "user" });
|
|
337
|
+
const task = defineTask({
|
|
338
|
+
id: "task",
|
|
339
|
+
middleware: [usage],
|
|
340
|
+
run: async () => "ok",
|
|
341
|
+
});
|
|
342
|
+
const app = defineResource({
|
|
343
|
+
id: "app",
|
|
344
|
+
register: [log.everywhere(), validate, task],
|
|
345
|
+
dependencies: { task },
|
|
346
|
+
async init(_, { task }) {
|
|
347
|
+
const result = await task();
|
|
348
|
+
expect(result).toBe("ok");
|
|
349
|
+
expect(calls).toContain("global");
|
|
350
|
+
expect(calls).toContain("user");
|
|
351
|
+
},
|
|
352
|
+
});
|
|
353
|
+
await run(app);
|
|
354
|
+
});
|
|
355
|
+
|
|
356
|
+
it("should enforce type safety for config in .with()", () => {
|
|
357
|
+
const validate = defineMiddleware({
|
|
358
|
+
id: "validate",
|
|
359
|
+
run: async ({ next }, deps, config: { schema: string }) => next(),
|
|
360
|
+
});
|
|
361
|
+
|
|
362
|
+
// Should error if config type is not correct
|
|
363
|
+
// @ts-expect-error
|
|
364
|
+
validate.with({ schema: 123 });
|
|
365
|
+
});
|
|
366
|
+
|
|
367
|
+
it("should modify task outputs independently based on middleware configs", async () => {
|
|
368
|
+
const prefixMiddleware = defineMiddleware({
|
|
369
|
+
id: "prefixer",
|
|
370
|
+
run: async ({ next }, deps, config: { prefix: string }) => {
|
|
371
|
+
const result = await next();
|
|
372
|
+
return `${config.prefix}: ${result}`;
|
|
373
|
+
},
|
|
374
|
+
});
|
|
375
|
+
|
|
376
|
+
const taskA = defineTask({
|
|
377
|
+
id: "taskA",
|
|
378
|
+
middleware: [prefixMiddleware.with({ prefix: "Alpha" })],
|
|
379
|
+
run: async () => "Result",
|
|
380
|
+
});
|
|
381
|
+
|
|
382
|
+
const taskB = defineTask({
|
|
383
|
+
id: "taskB",
|
|
384
|
+
middleware: [prefixMiddleware.with({ prefix: "Beta" })],
|
|
385
|
+
run: async () => "Result",
|
|
386
|
+
});
|
|
387
|
+
|
|
388
|
+
const app = defineResource({
|
|
389
|
+
id: "app",
|
|
390
|
+
register: [prefixMiddleware, taskA, taskB],
|
|
391
|
+
dependencies: { taskA, taskB },
|
|
392
|
+
async init(_, deps) {
|
|
393
|
+
const resultA = await deps.taskA();
|
|
394
|
+
const resultB = await deps.taskB();
|
|
395
|
+
|
|
396
|
+
expect(resultA).toBe("Alpha: Result");
|
|
397
|
+
expect(resultB).toBe("Beta: Result");
|
|
398
|
+
},
|
|
399
|
+
});
|
|
400
|
+
|
|
401
|
+
await run(app);
|
|
402
|
+
});
|
|
403
|
+
});
|
|
@@ -34,7 +34,7 @@ describe("run.overrides", () => {
|
|
|
34
34
|
});
|
|
35
35
|
|
|
36
36
|
const result = await run(app);
|
|
37
|
-
expect(result).toBe("Task overridden");
|
|
37
|
+
expect(result.value).toBe("Task overridden");
|
|
38
38
|
});
|
|
39
39
|
|
|
40
40
|
it("Should work with a deep override", async () => {
|
|
@@ -64,7 +64,7 @@ describe("run.overrides", () => {
|
|
|
64
64
|
});
|
|
65
65
|
|
|
66
66
|
const result = await run(root);
|
|
67
|
-
expect(result).toBe("Task overridden");
|
|
67
|
+
expect(result.value).toBe("Task overridden");
|
|
68
68
|
});
|
|
69
69
|
|
|
70
70
|
it("Should work with a deep override with config", async () => {
|
|
@@ -94,7 +94,7 @@ describe("run.overrides", () => {
|
|
|
94
94
|
});
|
|
95
95
|
|
|
96
96
|
const result = await run(root);
|
|
97
|
-
expect(result).toBe("Task overridden");
|
|
97
|
+
expect(result.value).toBe("Task overridden");
|
|
98
98
|
});
|
|
99
99
|
|
|
100
100
|
it("Should work with a override that has an override", async () => {
|
|
@@ -133,7 +133,7 @@ describe("run.overrides", () => {
|
|
|
133
133
|
});
|
|
134
134
|
|
|
135
135
|
const result = await run(root);
|
|
136
|
-
expect(result).toBe("Task overridden");
|
|
136
|
+
expect(result.value).toBe("Task overridden");
|
|
137
137
|
});
|
|
138
138
|
|
|
139
139
|
it("Should work with a override that has an override with config", async () => {
|
|
@@ -175,7 +175,7 @@ describe("run.overrides", () => {
|
|
|
175
175
|
});
|
|
176
176
|
|
|
177
177
|
const result = await run(root);
|
|
178
|
-
expect(result).toBe("Task overridden");
|
|
178
|
+
expect(result.value).toBe("Task overridden");
|
|
179
179
|
});
|
|
180
180
|
|
|
181
181
|
it("should work overriding a middleware", async () => {
|
|
@@ -210,7 +210,7 @@ describe("run.overrides", () => {
|
|
|
210
210
|
});
|
|
211
211
|
|
|
212
212
|
const result = await run(resource);
|
|
213
|
-
expect(result).toBe("Override: Task executed");
|
|
213
|
+
expect(result.value).toBe("Override: Task executed");
|
|
214
214
|
});
|
|
215
215
|
|
|
216
216
|
it("should throw, when you try to override something unregistered", async () => {
|
|
@@ -301,7 +301,7 @@ describe("run.overrides", () => {
|
|
|
301
301
|
});
|
|
302
302
|
|
|
303
303
|
const result = await run(app);
|
|
304
|
-
expect(result).toBe("Task super-overridden");
|
|
304
|
+
expect(result.value).toBe("Task super-overridden");
|
|
305
305
|
});
|
|
306
306
|
|
|
307
307
|
it("should override if I have a previously registered normal resource with a resource with config", async () => {
|
|
@@ -326,7 +326,8 @@ describe("run.overrides", () => {
|
|
|
326
326
|
},
|
|
327
327
|
});
|
|
328
328
|
|
|
329
|
-
await
|
|
329
|
+
const result = await run(app);
|
|
330
|
+
expect(result.value).toBe("Task overriden.");
|
|
330
331
|
});
|
|
331
332
|
|
|
332
333
|
it("should override if I have a previously registered normal resource with a resource with config", async () => {
|
|
@@ -351,7 +352,8 @@ describe("run.overrides", () => {
|
|
|
351
352
|
},
|
|
352
353
|
});
|
|
353
354
|
|
|
354
|
-
await
|
|
355
|
+
const result = await run(app);
|
|
356
|
+
expect(result.value).toBe("Task overriden.");
|
|
355
357
|
});
|
|
356
358
|
|
|
357
359
|
it("should override something deeply registered, with a with config", async () => {
|
|
@@ -387,6 +389,7 @@ describe("run.overrides", () => {
|
|
|
387
389
|
},
|
|
388
390
|
});
|
|
389
391
|
|
|
390
|
-
await
|
|
392
|
+
const result = await run(app);
|
|
393
|
+
expect(result.value).toBe("Task overriden.");
|
|
391
394
|
});
|
|
392
395
|
});
|