@bluelibs/runner 3.4.2 → 4.0.1
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/AI.md +621 -0
- package/README.md +1024 -577
- package/dist/context.d.ts +4 -8
- package/dist/context.js +5 -12
- package/dist/context.js.map +1 -1
- package/dist/define.d.ts +9 -113
- package/dist/define.js +29 -358
- package/dist/define.js.map +1 -1
- package/dist/definers/defineEvent.d.ts +2 -0
- package/dist/definers/defineEvent.js +23 -0
- package/dist/definers/defineEvent.js.map +1 -0
- package/dist/definers/defineHook.d.ts +6 -0
- package/dist/definers/defineHook.js +24 -0
- package/dist/definers/defineHook.js.map +1 -0
- package/dist/definers/defineOverride.d.ts +14 -0
- package/dist/definers/defineOverride.js +13 -0
- package/dist/definers/defineOverride.js.map +1 -0
- package/dist/definers/defineResource.d.ts +2 -0
- package/dist/definers/defineResource.js +69 -0
- package/dist/definers/defineResource.js.map +1 -0
- package/dist/definers/defineResourceMiddleware.d.ts +2 -0
- package/dist/definers/defineResourceMiddleware.js +42 -0
- package/dist/definers/defineResourceMiddleware.js.map +1 -0
- package/dist/definers/defineTag.d.ts +12 -0
- package/dist/definers/defineTag.js +106 -0
- package/dist/definers/defineTag.js.map +1 -0
- package/dist/definers/defineTask.d.ts +15 -0
- package/dist/definers/defineTask.js +42 -0
- package/dist/definers/defineTask.js.map +1 -0
- package/dist/definers/defineTaskMiddleware.d.ts +2 -0
- package/dist/definers/defineTaskMiddleware.js +42 -0
- package/dist/definers/defineTaskMiddleware.js.map +1 -0
- package/dist/definers/tools.d.ts +45 -0
- package/dist/definers/tools.js +75 -0
- package/dist/definers/tools.js.map +1 -0
- package/dist/defs.d.ts +16 -424
- package/dist/defs.js +26 -38
- package/dist/defs.js.map +1 -1
- package/dist/errors.d.ts +23 -8
- package/dist/errors.js +50 -10
- package/dist/errors.js.map +1 -1
- package/dist/globals/globalEvents.d.ts +15 -39
- package/dist/globals/globalEvents.js +20 -81
- package/dist/globals/globalEvents.js.map +1 -1
- package/dist/globals/globalMiddleware.d.ts +24 -17
- package/dist/globals/globalMiddleware.js +12 -4
- package/dist/globals/globalMiddleware.js.map +1 -1
- package/dist/globals/globalResources.d.ts +13 -28
- package/dist/globals/globalResources.js +15 -7
- package/dist/globals/globalResources.js.map +1 -1
- package/dist/globals/globalTags.d.ts +9 -0
- package/dist/globals/globalTags.js +23 -0
- package/dist/globals/globalTags.js.map +1 -0
- package/dist/globals/middleware/cache.middleware.d.ts +10 -17
- package/dist/globals/middleware/cache.middleware.js +4 -16
- package/dist/globals/middleware/cache.middleware.js.map +1 -1
- package/dist/globals/middleware/requireContext.middleware.d.ts +1 -1
- package/dist/globals/middleware/requireContext.middleware.js +5 -14
- package/dist/globals/middleware/requireContext.middleware.js.map +1 -1
- package/dist/globals/middleware/retry.middleware.d.ts +2 -1
- package/dist/globals/middleware/retry.middleware.js +32 -5
- package/dist/globals/middleware/retry.middleware.js.map +1 -1
- package/dist/globals/middleware/timeout.middleware.d.ts +2 -1
- package/dist/globals/middleware/timeout.middleware.js +31 -5
- package/dist/globals/middleware/timeout.middleware.js.map +1 -1
- package/dist/globals/resources/debug/debug.resource.d.ts +7 -0
- package/dist/globals/resources/debug/debug.resource.js +29 -0
- package/dist/globals/resources/debug/debug.resource.js.map +1 -0
- package/dist/globals/resources/debug/debug.tag.d.ts +2 -0
- package/dist/globals/resources/debug/debug.tag.js +12 -0
- package/dist/globals/resources/debug/debug.tag.js.map +1 -0
- package/dist/globals/resources/debug/debugConfig.resource.d.ts +22 -0
- package/dist/globals/resources/debug/debugConfig.resource.js +20 -0
- package/dist/globals/resources/debug/debugConfig.resource.js.map +1 -0
- package/dist/globals/resources/debug/executionTracker.middleware.d.ts +50 -0
- package/dist/globals/resources/debug/executionTracker.middleware.js +87 -0
- package/dist/globals/resources/debug/executionTracker.middleware.js.map +1 -0
- package/dist/globals/resources/debug/globalEvent.hook.d.ts +27 -0
- package/dist/globals/resources/debug/globalEvent.hook.js +38 -0
- package/dist/globals/resources/debug/globalEvent.hook.js.map +1 -0
- package/dist/globals/resources/debug/hook.hook.d.ts +25 -0
- package/dist/globals/resources/debug/hook.hook.js +42 -0
- package/dist/globals/resources/debug/hook.hook.js.map +1 -0
- package/dist/globals/resources/debug/index.d.ts +6 -0
- package/dist/{types → globals/resources/debug}/index.js +6 -11
- package/dist/globals/resources/debug/index.js.map +1 -0
- package/dist/globals/resources/debug/middleware.hook.d.ts +25 -0
- package/dist/globals/resources/debug/middleware.hook.js +71 -0
- package/dist/globals/resources/debug/middleware.hook.js.map +1 -0
- package/dist/globals/resources/debug/types.d.ts +25 -0
- package/dist/globals/resources/debug/types.js +65 -0
- package/dist/globals/resources/debug/types.js.map +1 -0
- package/dist/globals/resources/debug/utils.d.ts +2 -0
- package/dist/globals/resources/debug/utils.js +9 -0
- package/dist/globals/resources/debug/utils.js.map +1 -0
- package/dist/globals/resources/queue.resource.d.ts +3 -3
- package/dist/globals/resources/queue.resource.js.map +1 -1
- package/dist/globals/types.d.ts +1 -0
- package/dist/{task.types.js → globals/types.js} +2 -7
- package/dist/globals/types.js.map +1 -0
- package/dist/index.d.ts +58 -85
- package/dist/index.js +23 -10
- package/dist/index.js.map +1 -1
- package/dist/models/DependencyProcessor.d.ts +8 -6
- package/dist/models/DependencyProcessor.js +116 -33
- package/dist/models/DependencyProcessor.js.map +1 -1
- package/dist/models/EventManager.d.ts +127 -7
- package/dist/models/EventManager.js +251 -78
- package/dist/models/EventManager.js.map +1 -1
- package/dist/models/LogPrinter.d.ts +55 -0
- package/dist/models/LogPrinter.js +196 -0
- package/dist/models/LogPrinter.js.map +1 -0
- package/dist/models/Logger.d.ts +47 -27
- package/dist/models/Logger.js +133 -155
- package/dist/models/Logger.js.map +1 -1
- package/dist/models/MiddlewareManager.d.ts +86 -0
- package/dist/models/MiddlewareManager.js +409 -0
- package/dist/models/MiddlewareManager.js.map +1 -0
- package/dist/models/OverrideManager.d.ts +3 -3
- package/dist/models/OverrideManager.js +22 -7
- package/dist/models/OverrideManager.js.map +1 -1
- package/dist/models/ResourceInitializer.d.ts +4 -3
- package/dist/models/ResourceInitializer.js +12 -68
- package/dist/models/ResourceInitializer.js.map +1 -1
- package/dist/models/RunResult.d.ts +35 -0
- package/dist/models/RunResult.js +68 -0
- package/dist/models/RunResult.js.map +1 -0
- package/dist/models/Store.d.ts +30 -17
- package/dist/models/Store.js +87 -25
- package/dist/models/Store.js.map +1 -1
- package/dist/models/StoreRegistry.d.ts +34 -19
- package/dist/models/StoreRegistry.js +248 -100
- package/dist/models/StoreRegistry.js.map +1 -1
- package/dist/models/StoreValidator.d.ts +5 -7
- package/dist/models/StoreValidator.js +50 -17
- package/dist/models/StoreValidator.js.map +1 -1
- package/dist/models/TaskRunner.d.ts +3 -2
- package/dist/models/TaskRunner.js +6 -103
- package/dist/models/TaskRunner.js.map +1 -1
- package/dist/models/UnhandledError.d.ts +11 -0
- package/dist/models/UnhandledError.js +30 -0
- package/dist/models/UnhandledError.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/{tools → models/utils}/findCircularDependencies.js +8 -16
- package/dist/models/utils/findCircularDependencies.js.map +1 -0
- package/dist/models/utils/safeStringify.d.ts +3 -0
- package/dist/models/utils/safeStringify.js +45 -0
- package/dist/models/utils/safeStringify.js.map +1 -0
- package/dist/processHooks.d.ts +2 -0
- package/dist/processHooks.js +70 -0
- package/dist/processHooks.js.map +1 -0
- package/dist/run.d.ts +14 -27
- package/dist/run.js +100 -36
- package/dist/run.js.map +1 -1
- package/dist/testing.d.ts +5 -4
- package/dist/testing.js +3 -2
- package/dist/testing.js.map +1 -1
- package/dist/tools/getCallerFile.d.ts +0 -8
- package/dist/tools/getCallerFile.js +0 -51
- package/dist/tools/getCallerFile.js.map +1 -1
- package/dist/types/contracts.d.ts +55 -0
- package/dist/types/contracts.js +4 -0
- package/dist/types/contracts.js.map +1 -0
- package/dist/types/event.d.ts +26 -7
- package/dist/types/event.js +1 -1
- package/dist/types/event.js.map +1 -1
- package/dist/types/hook.d.ts +21 -0
- package/dist/{models/StoreTypes.js → types/hook.js} +2 -1
- package/dist/types/hook.js.map +1 -0
- package/dist/types/meta.d.ts +6 -1
- package/dist/types/meta.js +4 -2
- package/dist/types/meta.js.map +1 -1
- package/dist/types/resource.d.ts +40 -52
- package/dist/types/resource.js +1 -0
- package/dist/types/resource.js.map +1 -1
- package/dist/types/resourceMiddleware.d.ts +47 -0
- package/dist/{middleware.types.js → types/resourceMiddleware.js} +1 -1
- package/dist/types/resourceMiddleware.js.map +1 -0
- package/dist/types/runner.d.ts +37 -0
- package/dist/types/{base.js → runner.js} +1 -1
- package/dist/types/runner.js.map +1 -0
- package/dist/types/storeTypes.d.ts +40 -0
- package/dist/types/{metadata.js → storeTypes.js} +1 -1
- package/dist/types/storeTypes.js.map +1 -0
- package/dist/types/symbols.d.ts +10 -21
- package/dist/types/symbols.js +17 -22
- package/dist/types/symbols.js.map +1 -1
- package/dist/types/tag.d.ts +46 -0
- package/dist/{resource.types.js → types/tag.js} +2 -1
- package/dist/types/tag.js.map +1 -0
- package/dist/types/task.d.ts +28 -52
- package/dist/types/task.js +1 -0
- package/dist/types/task.js.map +1 -1
- package/dist/types/taskMiddleware.d.ts +48 -0
- package/dist/{event.types.js → types/taskMiddleware.js} +1 -1
- package/dist/types/taskMiddleware.js.map +1 -0
- package/dist/types/utilities.d.ts +105 -6
- package/dist/types/utilities.js +16 -2
- package/dist/types/utilities.js.map +1 -1
- package/package.json +14 -5
- package/dist/cli/extract-docs.d.ts +0 -2
- package/dist/cli/extract-docs.js +0 -88
- package/dist/cli/extract-docs.js.map +0 -1
- package/dist/common.types.d.ts +0 -20
- package/dist/common.types.js +0 -4
- package/dist/common.types.js.map +0 -1
- package/dist/defs/core.d.ts +0 -144
- package/dist/defs/core.js +0 -6
- package/dist/defs/core.js.map +0 -1
- package/dist/defs/symbols.d.ts +0 -42
- package/dist/defs/symbols.js +0 -45
- package/dist/defs/symbols.js.map +0 -1
- package/dist/defs/tags.d.ts +0 -70
- package/dist/defs/tags.js +0 -6
- package/dist/defs/tags.js.map +0 -1
- package/dist/defs.returnTag.d.ts +0 -36
- package/dist/defs.returnTag.js +0 -4
- package/dist/defs.returnTag.js.map +0 -1
- package/dist/docs/introspect.d.ts +0 -7
- package/dist/docs/introspect.js +0 -199
- package/dist/docs/introspect.js.map +0 -1
- package/dist/docs/markdown.d.ts +0 -2
- package/dist/docs/markdown.js +0 -148
- package/dist/docs/markdown.js.map +0 -1
- package/dist/docs/model.d.ts +0 -62
- package/dist/docs/model.js +0 -33
- package/dist/docs/model.js.map +0 -1
- package/dist/event.types.d.ts +0 -18
- package/dist/event.types.js.map +0 -1
- package/dist/examples/express-mongo/index.d.ts +0 -0
- package/dist/examples/express-mongo/index.js +0 -3
- package/dist/examples/express-mongo/index.js.map +0 -1
- package/dist/examples/registrator-example.d.ts +0 -122
- package/dist/examples/registrator-example.js +0 -147
- package/dist/examples/registrator-example.js.map +0 -1
- package/dist/express/docsRouter.d.ts +0 -12
- package/dist/express/docsRouter.js +0 -54
- package/dist/express/docsRouter.js.map +0 -1
- package/dist/globalEvents.d.ts +0 -40
- package/dist/globalEvents.js +0 -94
- package/dist/globalEvents.js.map +0 -1
- package/dist/globalResources.d.ts +0 -10
- package/dist/globalResources.js +0 -43
- package/dist/globalResources.js.map +0 -1
- package/dist/middleware.types.d.ts +0 -40
- package/dist/middleware.types.js.map +0 -1
- package/dist/models/StoreConstants.d.ts +0 -14
- package/dist/models/StoreConstants.js +0 -19
- package/dist/models/StoreConstants.js.map +0 -1
- package/dist/models/StoreTypes.d.ts +0 -21
- package/dist/models/StoreTypes.js.map +0 -1
- package/dist/models/VarStore.d.ts +0 -17
- package/dist/models/VarStore.js +0 -60
- package/dist/models/VarStore.js.map +0 -1
- package/dist/resource.types.d.ts +0 -31
- package/dist/resource.types.js.map +0 -1
- package/dist/symbols.d.ts +0 -24
- package/dist/symbols.js +0 -29
- package/dist/symbols.js.map +0 -1
- package/dist/t1.d.ts +0 -1
- package/dist/t1.js +0 -13
- package/dist/t1.js.map +0 -1
- package/dist/task.types.d.ts +0 -55
- package/dist/task.types.js.map +0 -1
- package/dist/tools/findCircularDependencies.js.map +0 -1
- package/dist/tools/registratorId.d.ts +0 -4
- package/dist/tools/registratorId.js +0 -40
- package/dist/tools/registratorId.js.map +0 -1
- package/dist/tools/simpleHash.d.ts +0 -9
- package/dist/tools/simpleHash.js +0 -34
- package/dist/tools/simpleHash.js.map +0 -1
- package/dist/types/base-interfaces.d.ts +0 -18
- package/dist/types/base-interfaces.js +0 -6
- package/dist/types/base-interfaces.js.map +0 -1
- package/dist/types/base.d.ts +0 -13
- package/dist/types/base.js.map +0 -1
- package/dist/types/dependencies.d.ts +0 -51
- package/dist/types/dependencies.js +0 -3
- package/dist/types/dependencies.js.map +0 -1
- package/dist/types/dependency-core.d.ts +0 -14
- package/dist/types/dependency-core.js +0 -5
- package/dist/types/dependency-core.js.map +0 -1
- package/dist/types/events.d.ts +0 -52
- package/dist/types/events.js +0 -6
- package/dist/types/events.js.map +0 -1
- package/dist/types/hooks.d.ts +0 -16
- package/dist/types/hooks.js +0 -5
- package/dist/types/hooks.js.map +0 -1
- package/dist/types/index.d.ts +0 -8
- package/dist/types/index.js.map +0 -1
- package/dist/types/metadata.d.ts +0 -75
- package/dist/types/metadata.js.map +0 -1
- package/dist/types/middleware.d.ts +0 -63
- package/dist/types/middleware.js +0 -3
- package/dist/types/middleware.js.map +0 -1
- package/dist/types/registerable.d.ts +0 -10
- package/dist/types/registerable.js +0 -5
- package/dist/types/registerable.js.map +0 -1
- package/dist/types/resources.d.ts +0 -44
- package/dist/types/resources.js +0 -5
- package/dist/types/resources.js.map +0 -1
- package/dist/types/tasks.d.ts +0 -41
- package/dist/types/tasks.js +0 -5
- package/dist/types/tasks.js.map +0 -1
- package/src/__tests__/benchmark/benchmark.test.ts +0 -148
- package/src/__tests__/benchmark/task-benchmark.test.ts +0 -132
- package/src/__tests__/context.test.ts +0 -91
- package/src/__tests__/createTestResource.test.ts +0 -139
- package/src/__tests__/errors.test.ts +0 -341
- package/src/__tests__/globalEvents.test.ts +0 -542
- package/src/__tests__/globals/cache.middleware.test.ts +0 -772
- package/src/__tests__/globals/queue.resource.test.ts +0 -141
- package/src/__tests__/globals/requireContext.middleware.test.ts +0 -98
- package/src/__tests__/globals/retry.middleware.test.ts +0 -157
- package/src/__tests__/globals/timeout.middleware.test.ts +0 -88
- package/src/__tests__/index.helper.test.ts +0 -55
- package/src/__tests__/models/EventManager.test.ts +0 -585
- package/src/__tests__/models/Logger.test.ts +0 -519
- package/src/__tests__/models/Queue.test.ts +0 -189
- package/src/__tests__/models/ResourceInitializer.test.ts +0 -148
- package/src/__tests__/models/Semaphore.test.ts +0 -713
- package/src/__tests__/models/Store.test.ts +0 -227
- package/src/__tests__/models/TaskRunner.test.ts +0 -221
- package/src/__tests__/override.test.ts +0 -104
- package/src/__tests__/recursion/README.md +0 -3
- package/src/__tests__/recursion/a.resource.ts +0 -25
- package/src/__tests__/recursion/b.resource.ts +0 -33
- package/src/__tests__/recursion/c.resource.ts +0 -18
- package/src/__tests__/run.anonymous.test.ts +0 -706
- package/src/__tests__/run.dynamic-register-and-dependencies.test.ts +0 -1185
- package/src/__tests__/run.middleware.test.ts +0 -549
- package/src/__tests__/run.overrides.test.ts +0 -424
- package/src/__tests__/run.test.ts +0 -1040
- package/src/__tests__/setOutput.test.ts +0 -244
- package/src/__tests__/tags.test.ts +0 -396
- package/src/__tests__/tools/findCircularDependencies.test.ts +0 -217
- package/src/__tests__/tools/getCallerFile.test.ts +0 -179
- package/src/__tests__/typesafety.test.ts +0 -423
- package/src/__tests__/validation-edge-cases.test.ts +0 -111
- package/src/__tests__/validation-interface.test.ts +0 -428
- package/src/context.ts +0 -86
- package/src/define.ts +0 -480
- package/src/defs.returnTag.ts +0 -91
- package/src/defs.ts +0 -596
- package/src/errors.ts +0 -105
- package/src/globals/globalEvents.ts +0 -125
- package/src/globals/globalMiddleware.ts +0 -16
- package/src/globals/globalResources.ts +0 -53
- package/src/globals/middleware/cache.middleware.ts +0 -115
- package/src/globals/middleware/requireContext.middleware.ts +0 -36
- package/src/globals/middleware/retry.middleware.ts +0 -56
- package/src/globals/middleware/timeout.middleware.ts +0 -46
- package/src/globals/resources/queue.resource.ts +0 -34
- package/src/index.ts +0 -39
- package/src/models/DependencyProcessor.ts +0 -257
- package/src/models/EventManager.ts +0 -210
- package/src/models/Logger.ts +0 -282
- package/src/models/OverrideManager.ts +0 -79
- package/src/models/Queue.ts +0 -66
- package/src/models/ResourceInitializer.ts +0 -165
- package/src/models/Semaphore.ts +0 -208
- package/src/models/Store.ts +0 -193
- package/src/models/StoreConstants.ts +0 -18
- package/src/models/StoreRegistry.ts +0 -253
- package/src/models/StoreTypes.ts +0 -47
- package/src/models/StoreValidator.ts +0 -43
- package/src/models/TaskRunner.ts +0 -203
- package/src/models/index.ts +0 -8
- package/src/run.ts +0 -116
- package/src/testing.ts +0 -66
- package/src/tools/findCircularDependencies.ts +0 -69
- package/src/tools/getCallerFile.ts +0 -96
- /package/dist/{tools → models/utils}/findCircularDependencies.d.ts +0 -0
|
@@ -1,141 +0,0 @@
|
|
|
1
|
-
import { defineResource } from "../../define";
|
|
2
|
-
import { run } from "../../run";
|
|
3
|
-
import { queueResource } from "../../globals/resources/queue.resource";
|
|
4
|
-
|
|
5
|
-
describe("Queue Resource", () => {
|
|
6
|
-
it("should provide queue functionality with proper isolation and disposal", async () => {
|
|
7
|
-
let callCount = 0;
|
|
8
|
-
const executionOrder: number[] = [];
|
|
9
|
-
let successCallCount = 0;
|
|
10
|
-
|
|
11
|
-
const app = defineResource({
|
|
12
|
-
id: "app",
|
|
13
|
-
// Don't register queueResource - it's already registered globally
|
|
14
|
-
dependencies: { queue: queueResource },
|
|
15
|
-
async init(_, { queue }) {
|
|
16
|
-
// Test 1: Initialize with empty queue map
|
|
17
|
-
expect(queue.map).toBeInstanceOf(Map);
|
|
18
|
-
expect(queue.map.size).toBe(0);
|
|
19
|
-
expect(typeof queue.run).toBe("function");
|
|
20
|
-
|
|
21
|
-
// Test 2: Create and reuse queues by ID
|
|
22
|
-
const task = async () => {
|
|
23
|
-
callCount++;
|
|
24
|
-
return `result-${callCount}`;
|
|
25
|
-
};
|
|
26
|
-
|
|
27
|
-
const result1 = await queue.run("test-queue", task);
|
|
28
|
-
expect(queue.map.size).toBe(1);
|
|
29
|
-
expect(queue.map.has("test-queue")).toBe(true);
|
|
30
|
-
|
|
31
|
-
const result2 = await queue.run("test-queue", task);
|
|
32
|
-
expect(queue.map.size).toBe(1);
|
|
33
|
-
expect(result1).toBe("result-1");
|
|
34
|
-
expect(result2).toBe("result-2");
|
|
35
|
-
|
|
36
|
-
// Test 3: Create separate queues for different IDs
|
|
37
|
-
const task1 = async () => "queue1-result";
|
|
38
|
-
const task2 = async () => "queue2-result";
|
|
39
|
-
|
|
40
|
-
await queue.run("queue-1", task1);
|
|
41
|
-
await queue.run("queue-2", task2);
|
|
42
|
-
|
|
43
|
-
expect(queue.map.size).toBe(3); // test-queue, queue-1, queue-2
|
|
44
|
-
expect(queue.map.has("queue-1")).toBe(true);
|
|
45
|
-
expect(queue.map.has("queue-2")).toBe(true);
|
|
46
|
-
|
|
47
|
-
// Test 4: Ensure tasks run sequentially within the same queue
|
|
48
|
-
const taskFactory = (id: number) => async () => {
|
|
49
|
-
executionOrder.push(id);
|
|
50
|
-
await new Promise((resolve) => setTimeout(resolve, 1));
|
|
51
|
-
return id;
|
|
52
|
-
};
|
|
53
|
-
|
|
54
|
-
const promises = [
|
|
55
|
-
queue.run("sequential-queue", taskFactory(1)),
|
|
56
|
-
queue.run("sequential-queue", taskFactory(2)),
|
|
57
|
-
queue.run("sequential-queue", taskFactory(3)),
|
|
58
|
-
];
|
|
59
|
-
|
|
60
|
-
const results = await Promise.all(promises);
|
|
61
|
-
expect(results).toEqual([1, 2, 3]);
|
|
62
|
-
expect(executionOrder).toEqual([1, 2, 3]);
|
|
63
|
-
expect(queue.map.size).toBe(4); // Added sequential-queue
|
|
64
|
-
|
|
65
|
-
// Test 5: Handle async tasks properly
|
|
66
|
-
const asyncTask = async () => {
|
|
67
|
-
await new Promise((resolve) => setTimeout(resolve, 5));
|
|
68
|
-
return "async-result";
|
|
69
|
-
};
|
|
70
|
-
|
|
71
|
-
const asyncResult = await queue.run("async-queue", asyncTask);
|
|
72
|
-
expect(asyncResult).toBe("async-result");
|
|
73
|
-
expect(queue.map.size).toBe(5); // Added async-queue
|
|
74
|
-
|
|
75
|
-
// Test 6: Handle errors in tasks without breaking the queue
|
|
76
|
-
const errorTask = async () => {
|
|
77
|
-
throw new Error("Task failed");
|
|
78
|
-
};
|
|
79
|
-
|
|
80
|
-
const successTask = async () => {
|
|
81
|
-
successCallCount++;
|
|
82
|
-
return `success-${successCallCount}`;
|
|
83
|
-
};
|
|
84
|
-
|
|
85
|
-
await expect(queue.run("error-queue", errorTask)).rejects.toThrow(
|
|
86
|
-
"Task failed"
|
|
87
|
-
);
|
|
88
|
-
|
|
89
|
-
const successResult = await queue.run("error-queue", successTask);
|
|
90
|
-
expect(successResult).toBe("success-1");
|
|
91
|
-
expect(queue.map.size).toBe(6); // Added error-queue
|
|
92
|
-
|
|
93
|
-
return queue;
|
|
94
|
-
},
|
|
95
|
-
});
|
|
96
|
-
|
|
97
|
-
const result = await run(app);
|
|
98
|
-
|
|
99
|
-
// Test 7: Dispose all queues when resource is disposed
|
|
100
|
-
expect(result.value.map.size).toBe(6);
|
|
101
|
-
|
|
102
|
-
await result.dispose();
|
|
103
|
-
|
|
104
|
-
// Try to run a task on a disposed queue - should reject
|
|
105
|
-
await expect(
|
|
106
|
-
result.value.run("test-queue", async () => "test")
|
|
107
|
-
).rejects.toThrow(/disposed/);
|
|
108
|
-
});
|
|
109
|
-
|
|
110
|
-
it("should propagate task exceptions to the caller", async () => {
|
|
111
|
-
const app = defineResource({
|
|
112
|
-
id: "exception-test-app",
|
|
113
|
-
dependencies: { queue: queueResource },
|
|
114
|
-
async init(_, { queue }) {
|
|
115
|
-
// Test that exceptions from tasks are properly propagated
|
|
116
|
-
const errorTask = async () => {
|
|
117
|
-
throw new Error("Queue resource task error");
|
|
118
|
-
};
|
|
119
|
-
|
|
120
|
-
const successTask = async () => "success";
|
|
121
|
-
|
|
122
|
-
// Exception should be catchable by the caller
|
|
123
|
-
await expect(queue.run("error-queue", errorTask)).rejects.toThrow(
|
|
124
|
-
"Queue resource task error"
|
|
125
|
-
);
|
|
126
|
-
|
|
127
|
-
// Queue should still work for subsequent tasks
|
|
128
|
-
await expect(queue.run("error-queue", successTask)).resolves.toBe(
|
|
129
|
-
"success"
|
|
130
|
-
);
|
|
131
|
-
|
|
132
|
-
// Multiple exceptions should all be catchable
|
|
133
|
-
await expect(queue.run("error-queue", errorTask)).rejects.toThrow(
|
|
134
|
-
"Queue resource task error"
|
|
135
|
-
);
|
|
136
|
-
},
|
|
137
|
-
});
|
|
138
|
-
|
|
139
|
-
await run(app);
|
|
140
|
-
});
|
|
141
|
-
});
|
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
import { requireContextMiddleware } from "../../globals/middleware/requireContext.middleware";
|
|
2
|
-
import { ContextError } from "../../context";
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Utility function to build a fake Context implementation that allows us to
|
|
6
|
-
* control the behaviour of the `use()` call during each test.
|
|
7
|
-
*/
|
|
8
|
-
function createFakeContext<T>(useImplementation: () => T) {
|
|
9
|
-
return {
|
|
10
|
-
/** unique id is irrelevant for tests */
|
|
11
|
-
id: Symbol("fake-context"),
|
|
12
|
-
// `use` is what we care about – we wire whatever behaviour the test needs
|
|
13
|
-
use: jest.fn(useImplementation),
|
|
14
|
-
// The following members are not used by the middleware but are required
|
|
15
|
-
// to satisfy the `Context` interface.
|
|
16
|
-
provide: jest.fn(),
|
|
17
|
-
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
|
|
18
|
-
require: jest.fn() as any,
|
|
19
|
-
} as any;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
describe("requireContextMiddleware", () => {
|
|
23
|
-
it("throws if the middleware receives no context in its config", async () => {
|
|
24
|
-
// Arrange → no context passed
|
|
25
|
-
const next = jest.fn();
|
|
26
|
-
|
|
27
|
-
// Act & Assert
|
|
28
|
-
await expect(
|
|
29
|
-
requireContextMiddleware.run({ next } as any, {} as any, {} as any)
|
|
30
|
-
).rejects.toThrow(
|
|
31
|
-
"Context not available. Did you forget to pass 'context' to the middleware?"
|
|
32
|
-
);
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
it("throws ContextError when the context has not been provided", async () => {
|
|
36
|
-
// Arrange → a context whose `use` returns undefined, simulating missing provider
|
|
37
|
-
const fakeContext = createFakeContext(() => undefined);
|
|
38
|
-
const next = jest.fn();
|
|
39
|
-
|
|
40
|
-
// Act & Assert
|
|
41
|
-
await expect(
|
|
42
|
-
requireContextMiddleware.run(
|
|
43
|
-
{ next } as any,
|
|
44
|
-
{} as any,
|
|
45
|
-
{ context: fakeContext } as any
|
|
46
|
-
)
|
|
47
|
-
).rejects.toBeInstanceOf(ContextError);
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
it("passes task.input to next() and returns its result when called within a task", async () => {
|
|
51
|
-
const fakeContext = createFakeContext(() => ({ user: "alice" }));
|
|
52
|
-
const task = { input: "payload" };
|
|
53
|
-
const expectedResult = "task-result";
|
|
54
|
-
const next = jest.fn().mockResolvedValue(expectedResult);
|
|
55
|
-
|
|
56
|
-
const result = await requireContextMiddleware.run(
|
|
57
|
-
{ task, next } as any,
|
|
58
|
-
{} as any,
|
|
59
|
-
{ context: fakeContext } as any
|
|
60
|
-
);
|
|
61
|
-
|
|
62
|
-
expect(next).toHaveBeenCalledTimes(1);
|
|
63
|
-
expect(next).toHaveBeenCalledWith(task.input);
|
|
64
|
-
expect(result).toBe(expectedResult);
|
|
65
|
-
});
|
|
66
|
-
|
|
67
|
-
it("passes resource.config to next() and returns its result when called within a resource", async () => {
|
|
68
|
-
const fakeContext = createFakeContext(() => ({ user: "bob" }));
|
|
69
|
-
const resource = { config: { url: "https://example.com" } };
|
|
70
|
-
const expectedResult = "resource-result";
|
|
71
|
-
const next = jest.fn().mockResolvedValue(expectedResult);
|
|
72
|
-
|
|
73
|
-
const result = await requireContextMiddleware.run(
|
|
74
|
-
{ resource, next } as any,
|
|
75
|
-
{} as any,
|
|
76
|
-
{ context: fakeContext } as any
|
|
77
|
-
);
|
|
78
|
-
|
|
79
|
-
expect(next).toHaveBeenCalledTimes(1);
|
|
80
|
-
expect(next).toHaveBeenCalledWith(resource.config);
|
|
81
|
-
expect(result).toBe(expectedResult);
|
|
82
|
-
});
|
|
83
|
-
|
|
84
|
-
it("calls next() with no arguments when neither task nor resource is provided", async () => {
|
|
85
|
-
const fakeContext = createFakeContext(() => ({ user: "charlie" }));
|
|
86
|
-
const next = jest.fn().mockResolvedValue("noop-result");
|
|
87
|
-
|
|
88
|
-
const result = await requireContextMiddleware.run(
|
|
89
|
-
{ next } as any,
|
|
90
|
-
{} as any,
|
|
91
|
-
{ context: fakeContext } as any
|
|
92
|
-
);
|
|
93
|
-
|
|
94
|
-
expect(next).toHaveBeenCalledTimes(1);
|
|
95
|
-
expect(next).toHaveBeenCalledWith();
|
|
96
|
-
expect(result).toBe("noop-result");
|
|
97
|
-
});
|
|
98
|
-
});
|
|
@@ -1,157 +0,0 @@
|
|
|
1
|
-
import { defineResource, defineTask } from "../../define";
|
|
2
|
-
import { retryMiddleware } from "../../globals/middleware/retry.middleware";
|
|
3
|
-
import { run } from "../../run";
|
|
4
|
-
|
|
5
|
-
describe("Retry Middleware", () => {
|
|
6
|
-
it("should retry failed operations with exponential backoff", async () => {
|
|
7
|
-
let attempt = 0;
|
|
8
|
-
const task = defineTask({
|
|
9
|
-
id: "flakyTask",
|
|
10
|
-
middleware: [
|
|
11
|
-
retryMiddleware.with({
|
|
12
|
-
retries: 3,
|
|
13
|
-
stopRetryIf: (e) => e.message.includes("FATAL"),
|
|
14
|
-
}),
|
|
15
|
-
],
|
|
16
|
-
run: async () => {
|
|
17
|
-
attempt++;
|
|
18
|
-
if (attempt < 3) throw new Error("Temporary failure");
|
|
19
|
-
return "Success";
|
|
20
|
-
},
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
const app = defineResource({
|
|
24
|
-
id: "app",
|
|
25
|
-
register: [task],
|
|
26
|
-
dependencies: { task },
|
|
27
|
-
async init(_, { task }) {
|
|
28
|
-
const result = await task();
|
|
29
|
-
expect(result).toBe("Success");
|
|
30
|
-
expect(attempt).toBe(3);
|
|
31
|
-
},
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
await run(app);
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
it("should respect stopRetryIf condition", async () => {
|
|
38
|
-
const errorSpy = jest.fn();
|
|
39
|
-
const task = defineTask({
|
|
40
|
-
id: "fatalTask",
|
|
41
|
-
middleware: [
|
|
42
|
-
retryMiddleware.with({
|
|
43
|
-
retries: 3,
|
|
44
|
-
stopRetryIf: (e) => e.message === "FATAL",
|
|
45
|
-
}),
|
|
46
|
-
],
|
|
47
|
-
run: async () => {
|
|
48
|
-
throw new Error("FATAL");
|
|
49
|
-
},
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
const app = defineResource({
|
|
53
|
-
id: "app",
|
|
54
|
-
register: [task],
|
|
55
|
-
dependencies: { task },
|
|
56
|
-
async init(_, { task }) {
|
|
57
|
-
await expect(task()).rejects.toThrow("FATAL");
|
|
58
|
-
expect(errorSpy).not.toHaveBeenCalled();
|
|
59
|
-
throw new Error("FATAL");
|
|
60
|
-
},
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
await run(app).catch(errorSpy);
|
|
64
|
-
expect(errorSpy).toHaveBeenCalledTimes(1);
|
|
65
|
-
});
|
|
66
|
-
|
|
67
|
-
it("should use custom delay strategy", async () => {
|
|
68
|
-
jest.useFakeTimers();
|
|
69
|
-
const delays: number[] = [];
|
|
70
|
-
const start = Date.now();
|
|
71
|
-
|
|
72
|
-
const task = defineTask({
|
|
73
|
-
id: "delayedTask",
|
|
74
|
-
middleware: [
|
|
75
|
-
retryMiddleware.with({
|
|
76
|
-
retries: 3,
|
|
77
|
-
delayStrategy: (attempt) => (attempt + 1) * 100, // Linear delay
|
|
78
|
-
}),
|
|
79
|
-
],
|
|
80
|
-
run: async () => {
|
|
81
|
-
throw new Error("Retry me");
|
|
82
|
-
},
|
|
83
|
-
});
|
|
84
|
-
|
|
85
|
-
const app = defineResource({
|
|
86
|
-
id: "app",
|
|
87
|
-
register: [task],
|
|
88
|
-
dependencies: { task },
|
|
89
|
-
async init(_, { task }) {
|
|
90
|
-
task().catch(() => {});
|
|
91
|
-
},
|
|
92
|
-
});
|
|
93
|
-
|
|
94
|
-
await run(app);
|
|
95
|
-
|
|
96
|
-
// Advance timers through all retries
|
|
97
|
-
jest.advanceTimersByTime(1000);
|
|
98
|
-
const elapsed = Date.now() - start;
|
|
99
|
-
|
|
100
|
-
// Verify delay sequence: 100ms, 200ms, 300ms
|
|
101
|
-
expect(elapsed).toBeGreaterThanOrEqual(600); // 100+200+300=600
|
|
102
|
-
jest.useRealTimers();
|
|
103
|
-
});
|
|
104
|
-
|
|
105
|
-
it("should work with resource initialization", async () => {
|
|
106
|
-
let attempts = 0;
|
|
107
|
-
const resource = defineResource({
|
|
108
|
-
id: "flakyResource",
|
|
109
|
-
middleware: [
|
|
110
|
-
retryMiddleware.with({
|
|
111
|
-
retries: 2,
|
|
112
|
-
}),
|
|
113
|
-
],
|
|
114
|
-
async init() {
|
|
115
|
-
attempts++;
|
|
116
|
-
if (attempts < 2) throw new Error("Resource init failed");
|
|
117
|
-
return "Resource ready";
|
|
118
|
-
},
|
|
119
|
-
});
|
|
120
|
-
|
|
121
|
-
const app = defineResource({
|
|
122
|
-
id: "app",
|
|
123
|
-
register: [resource],
|
|
124
|
-
dependencies: { resource },
|
|
125
|
-
async init(_, { resource }) {
|
|
126
|
-
expect(resource).toBe("Resource ready");
|
|
127
|
-
expect(attempts).toBe(2);
|
|
128
|
-
},
|
|
129
|
-
});
|
|
130
|
-
|
|
131
|
-
await run(app);
|
|
132
|
-
});
|
|
133
|
-
|
|
134
|
-
it("Should default to 3 retries", async () => {
|
|
135
|
-
let attempt = 0;
|
|
136
|
-
const task = defineTask({
|
|
137
|
-
id: "flakyTask",
|
|
138
|
-
middleware: [retryMiddleware],
|
|
139
|
-
run: async () => {
|
|
140
|
-
attempt++;
|
|
141
|
-
throw new Error("Temporary failure");
|
|
142
|
-
},
|
|
143
|
-
});
|
|
144
|
-
|
|
145
|
-
const app = defineResource({
|
|
146
|
-
id: "app",
|
|
147
|
-
register: [task],
|
|
148
|
-
dependencies: { task },
|
|
149
|
-
async init(_, { task }) {
|
|
150
|
-
await expect(task()).rejects.toThrow("Temporary failure");
|
|
151
|
-
},
|
|
152
|
-
});
|
|
153
|
-
|
|
154
|
-
await run(app);
|
|
155
|
-
expect(attempt).toBe(4); // fails once and retries 3 more times, logically
|
|
156
|
-
});
|
|
157
|
-
});
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
import { defineResource, defineTask } from "../../define";
|
|
2
|
-
import { run } from "../../run";
|
|
3
|
-
import { timeoutMiddleware } from "../../globals/middleware/timeout.middleware";
|
|
4
|
-
|
|
5
|
-
const sleep = (ms: number) => new Promise((res) => setTimeout(res, ms));
|
|
6
|
-
|
|
7
|
-
describe("Timeout Middleware", () => {
|
|
8
|
-
it("should abort long-running tasks after ttl", async () => {
|
|
9
|
-
const slowTask = defineTask({
|
|
10
|
-
id: "timeout.slowTask",
|
|
11
|
-
middleware: [timeoutMiddleware.with({ ttl: 20 })],
|
|
12
|
-
run: async () => {
|
|
13
|
-
await sleep(50);
|
|
14
|
-
return "done";
|
|
15
|
-
},
|
|
16
|
-
});
|
|
17
|
-
|
|
18
|
-
const app = defineResource({
|
|
19
|
-
id: "app",
|
|
20
|
-
register: [slowTask],
|
|
21
|
-
dependencies: { slowTask },
|
|
22
|
-
async init(_, { slowTask }) {
|
|
23
|
-
await expect(slowTask()).rejects.toThrow(/timed out/i);
|
|
24
|
-
},
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
await run(app);
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
it("should allow tasks to complete before ttl", async () => {
|
|
31
|
-
const fastTask = defineTask({
|
|
32
|
-
id: "timeout.fastTask",
|
|
33
|
-
middleware: [timeoutMiddleware.with({ ttl: 50 })],
|
|
34
|
-
run: async () => {
|
|
35
|
-
await sleep(10);
|
|
36
|
-
return "ok";
|
|
37
|
-
},
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
const app = defineResource({
|
|
41
|
-
id: "app",
|
|
42
|
-
register: [fastTask],
|
|
43
|
-
dependencies: { fastTask },
|
|
44
|
-
async init(_, { fastTask }) {
|
|
45
|
-
await expect(fastTask()).resolves.toBe("ok");
|
|
46
|
-
},
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
await run(app);
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
it("should timeout resource initialization", async () => {
|
|
53
|
-
const slowResource = defineResource({
|
|
54
|
-
id: "timeout.slowResource",
|
|
55
|
-
middleware: [timeoutMiddleware.with({ ttl: 20 })],
|
|
56
|
-
async init() {
|
|
57
|
-
await sleep(50);
|
|
58
|
-
return "ready";
|
|
59
|
-
},
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
const app = defineResource({
|
|
63
|
-
id: "app",
|
|
64
|
-
register: [slowResource],
|
|
65
|
-
});
|
|
66
|
-
|
|
67
|
-
await expect(run(app)).rejects.toThrow(/timed out/i);
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
it("should throw immediately when ttl is 0", async () => {
|
|
71
|
-
const task = defineTask({
|
|
72
|
-
id: "timeout.immediate",
|
|
73
|
-
middleware: [timeoutMiddleware.with({ ttl: 0 })],
|
|
74
|
-
run: async () => "never",
|
|
75
|
-
});
|
|
76
|
-
|
|
77
|
-
const app = defineResource({
|
|
78
|
-
id: "app",
|
|
79
|
-
register: [task],
|
|
80
|
-
dependencies: { task },
|
|
81
|
-
async init(_, { task }) {
|
|
82
|
-
await expect(task()).rejects.toThrow(/timed out/i);
|
|
83
|
-
},
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
await run(app);
|
|
87
|
-
});
|
|
88
|
-
});
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
import { defineTask, defineResource, defineIndex } from "../define";
|
|
2
|
-
import { run } from "../run";
|
|
3
|
-
import { index } from "../index";
|
|
4
|
-
|
|
5
|
-
describe("index helper", () => {
|
|
6
|
-
it("should aggregate dependencies and expose proper types", async () => {
|
|
7
|
-
const userService = defineResource({
|
|
8
|
-
id: "user.service",
|
|
9
|
-
async init() {
|
|
10
|
-
return "USER";
|
|
11
|
-
},
|
|
12
|
-
});
|
|
13
|
-
|
|
14
|
-
const configuredService = defineResource({
|
|
15
|
-
id: "configured.service",
|
|
16
|
-
async init(config: { name: string }) {
|
|
17
|
-
return config.name;
|
|
18
|
-
},
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
const getUserTask = defineTask({
|
|
22
|
-
id: "task.getUser",
|
|
23
|
-
dependencies: { userService },
|
|
24
|
-
async run(_, { userService }) {
|
|
25
|
-
return userService;
|
|
26
|
-
},
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
// The helper under test
|
|
30
|
-
const services = index({
|
|
31
|
-
userService,
|
|
32
|
-
getUserTask,
|
|
33
|
-
configuredService: configuredService.with({ name: "configured" }),
|
|
34
|
-
});
|
|
35
|
-
|
|
36
|
-
const app = defineResource({
|
|
37
|
-
id: "app",
|
|
38
|
-
register: [services],
|
|
39
|
-
dependencies: { services },
|
|
40
|
-
async init(_, { services }) {
|
|
41
|
-
// Runtime assertions
|
|
42
|
-
expect(services.userService).toBe("USER");
|
|
43
|
-
const result = await services.getUserTask();
|
|
44
|
-
expect(result).toBe("USER");
|
|
45
|
-
expect(services.configuredService).toBe("configured");
|
|
46
|
-
// Type assertions
|
|
47
|
-
services.userService as string;
|
|
48
|
-
// @ts-expect-error – assigning to never should error
|
|
49
|
-
const neverValue: never = "bad";
|
|
50
|
-
},
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
await run(app);
|
|
54
|
-
});
|
|
55
|
-
});
|