@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,139 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
task,
|
|
3
|
-
resource,
|
|
4
|
-
override,
|
|
5
|
-
run,
|
|
6
|
-
createTestResource,
|
|
7
|
-
globals,
|
|
8
|
-
event,
|
|
9
|
-
} from "..";
|
|
10
|
-
|
|
11
|
-
describe("createTestResource", () => {
|
|
12
|
-
it("runs tasks within the full ecosystem and returns results", async () => {
|
|
13
|
-
const double = task({ id: "t.double", run: async (x: number) => x * 2 });
|
|
14
|
-
|
|
15
|
-
const app = resource({
|
|
16
|
-
id: "app.root",
|
|
17
|
-
register: [double],
|
|
18
|
-
});
|
|
19
|
-
|
|
20
|
-
const harness = createTestResource(app);
|
|
21
|
-
const { value: t, dispose } = await run(harness);
|
|
22
|
-
|
|
23
|
-
const result = await t.runTask(double, 21);
|
|
24
|
-
expect(result).toBe(42);
|
|
25
|
-
|
|
26
|
-
await dispose();
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
it("supports overrides for integration tests", async () => {
|
|
30
|
-
const db = resource({ id: "db", init: async () => ({ kind: "real" }) });
|
|
31
|
-
const getDbKind = task({
|
|
32
|
-
id: "t.db.kind",
|
|
33
|
-
dependencies: { db },
|
|
34
|
-
run: async (_, { db }) => db.kind,
|
|
35
|
-
});
|
|
36
|
-
const app = resource({ id: "app", register: [db, getDbKind] });
|
|
37
|
-
|
|
38
|
-
const mockDb = override(db, { init: async () => ({ kind: "mock" }) });
|
|
39
|
-
|
|
40
|
-
const harness = createTestResource(app, { overrides: [mockDb] });
|
|
41
|
-
const { value: t, dispose } = await run(harness);
|
|
42
|
-
|
|
43
|
-
const kind = await t.runTask(getDbKind, undefined);
|
|
44
|
-
expect(kind).toBe("mock");
|
|
45
|
-
|
|
46
|
-
await dispose();
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
it("allows accessing resource values and subscribing to events", async () => {
|
|
50
|
-
const eventsSeen: Array<any> = [];
|
|
51
|
-
|
|
52
|
-
const say = task({ id: "t.say", run: async (m: string) => m });
|
|
53
|
-
|
|
54
|
-
const listener = task({
|
|
55
|
-
id: "tests.log-listener",
|
|
56
|
-
on: globals.events.tasks.beforeRun,
|
|
57
|
-
run: async (e: any) => eventsSeen.push(e.data),
|
|
58
|
-
});
|
|
59
|
-
|
|
60
|
-
const app = resource({ id: "app2", register: [say, listener] });
|
|
61
|
-
|
|
62
|
-
const harness = createTestResource(app);
|
|
63
|
-
const { value: t, dispose } = await run(harness);
|
|
64
|
-
|
|
65
|
-
// Subscribe via facade as well (no-op if using global path instead)
|
|
66
|
-
// t.on(globals.events.log, (e) => eventsSeen.push(e.data));
|
|
67
|
-
|
|
68
|
-
await t.runTask(say, "hello");
|
|
69
|
-
|
|
70
|
-
// We can also query resource values (will often be undefined for pure tasks)
|
|
71
|
-
expect(t.getResource("app2")).toBeUndefined();
|
|
72
|
-
|
|
73
|
-
// At least one event was recorded via the listener
|
|
74
|
-
expect(Array.isArray(eventsSeen)).toBe(true);
|
|
75
|
-
|
|
76
|
-
await dispose();
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
it("supports multiple harness instances without id collisions", async () => {
|
|
80
|
-
const add1 = task({ id: "t.add1", run: async (n: number) => n + 1 });
|
|
81
|
-
const app = resource({ id: "app.multi", register: [add1] });
|
|
82
|
-
|
|
83
|
-
const h1 = createTestResource(app);
|
|
84
|
-
const h2 = createTestResource(app);
|
|
85
|
-
|
|
86
|
-
const [r1, r2] = await Promise.all([run(h1), run(h2)]);
|
|
87
|
-
|
|
88
|
-
const v1 = await r1.value.runTask(add1, 1);
|
|
89
|
-
const v2 = await r2.value.runTask(add1, 2);
|
|
90
|
-
expect(v1).toBe(2);
|
|
91
|
-
expect(v2).toBe(3);
|
|
92
|
-
|
|
93
|
-
await Promise.all([r1.dispose(), r2.dispose()]);
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
it("runTask is typesafe in tests", async () => {
|
|
97
|
-
const sum = task<{ a: number; b: number }, Promise<number>>({
|
|
98
|
-
id: "t.sum",
|
|
99
|
-
run: async (i) => i.a + i.b,
|
|
100
|
-
});
|
|
101
|
-
|
|
102
|
-
const upper = task<{ v: string }, Promise<string>>({
|
|
103
|
-
id: "t.upper",
|
|
104
|
-
run: async (i) => i.v.toUpperCase(),
|
|
105
|
-
});
|
|
106
|
-
|
|
107
|
-
const usesUpper = task<
|
|
108
|
-
{ n: number },
|
|
109
|
-
Promise<number>,
|
|
110
|
-
{ upper: typeof upper }
|
|
111
|
-
>({
|
|
112
|
-
id: "t.usesUpper",
|
|
113
|
-
dependencies: { upper },
|
|
114
|
-
run: async (i, d) => Number(await d.upper({ v: String(i.n) })),
|
|
115
|
-
});
|
|
116
|
-
|
|
117
|
-
const app = resource({
|
|
118
|
-
id: "app.types",
|
|
119
|
-
register: [sum, upper, usesUpper],
|
|
120
|
-
});
|
|
121
|
-
const { value: t, dispose } = await run(createTestResource(app));
|
|
122
|
-
|
|
123
|
-
const ok1: number | undefined = await t.runTask(sum, { a: 1, b: 2 });
|
|
124
|
-
// Type-only checks (do not execute)
|
|
125
|
-
const typeOnly = () => {
|
|
126
|
-
// @ts-expect-error bad input
|
|
127
|
-
t.runTask(sum, { a: 1 });
|
|
128
|
-
// @ts-expect-error missing input
|
|
129
|
-
t.runTask(sum as any);
|
|
130
|
-
};
|
|
131
|
-
void typeOnly;
|
|
132
|
-
|
|
133
|
-
const ok2: number | undefined = await t.runTask(usesUpper, {
|
|
134
|
-
n: 3,
|
|
135
|
-
} as const);
|
|
136
|
-
|
|
137
|
-
await dispose();
|
|
138
|
-
});
|
|
139
|
-
});
|
|
@@ -1,341 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
defineTask,
|
|
3
|
-
defineResource,
|
|
4
|
-
defineEvent,
|
|
5
|
-
defineMiddleware,
|
|
6
|
-
} from "../define";
|
|
7
|
-
import { run } from "../run";
|
|
8
|
-
import { Errors } from "..";
|
|
9
|
-
|
|
10
|
-
const {
|
|
11
|
-
RuntimeError,
|
|
12
|
-
DuplicateRegistrationError,
|
|
13
|
-
DependencyNotFoundError,
|
|
14
|
-
UnknownItemTypeError,
|
|
15
|
-
CircularDependenciesError,
|
|
16
|
-
EventNotFoundError,
|
|
17
|
-
MiddlewareAlreadyGlobalError,
|
|
18
|
-
LockedError,
|
|
19
|
-
StoreAlreadyInitializedError,
|
|
20
|
-
ValidationError,
|
|
21
|
-
} = Errors;
|
|
22
|
-
|
|
23
|
-
describe("Errors", () => {
|
|
24
|
-
it("should throw duplicateRegistration error", async () => {
|
|
25
|
-
const task1 = defineTask({ id: "test.task", run: async () => {} });
|
|
26
|
-
const task2 = defineTask({ id: "test.task", run: async () => {} });
|
|
27
|
-
|
|
28
|
-
const app = defineResource({
|
|
29
|
-
id: "app",
|
|
30
|
-
register: [task1, task2],
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
await expect(run(app)).rejects.toThrow(
|
|
34
|
-
new DuplicateRegistrationError("Task", "test.task").message
|
|
35
|
-
);
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
it("should throw unknown item type error at task level", async () => {
|
|
39
|
-
const task = defineTask({
|
|
40
|
-
id: "test.task",
|
|
41
|
-
dependencies: { nonExistentDep: {} as any },
|
|
42
|
-
run: async () => {},
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
const app = defineResource({
|
|
46
|
-
id: "app",
|
|
47
|
-
register: [task],
|
|
48
|
-
dependencies: { task },
|
|
49
|
-
async init(_, { task }) {
|
|
50
|
-
await task();
|
|
51
|
-
},
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
await expect(run(app)).rejects.toThrow(
|
|
55
|
-
new UnknownItemTypeError({}).message
|
|
56
|
-
);
|
|
57
|
-
});
|
|
58
|
-
|
|
59
|
-
it("should throw unknown item type error at resource level", async () => {
|
|
60
|
-
const app = defineResource({
|
|
61
|
-
id: "app",
|
|
62
|
-
register: [
|
|
63
|
-
{
|
|
64
|
-
id: "nonExistent",
|
|
65
|
-
} as any,
|
|
66
|
-
],
|
|
67
|
-
async init(_, {}) {},
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
await expect(run(app)).rejects.toThrow(
|
|
71
|
-
new UnknownItemTypeError({}).message
|
|
72
|
-
);
|
|
73
|
-
});
|
|
74
|
-
|
|
75
|
-
it("should throw circularDependencies error", async () => {
|
|
76
|
-
const task1: any = defineTask({
|
|
77
|
-
id: "task1",
|
|
78
|
-
dependencies: (): any => ({ task2 }),
|
|
79
|
-
run: async () => {},
|
|
80
|
-
});
|
|
81
|
-
|
|
82
|
-
const task2: any = defineTask({
|
|
83
|
-
id: "task2",
|
|
84
|
-
dependencies: { task1 },
|
|
85
|
-
run: async () => {},
|
|
86
|
-
});
|
|
87
|
-
|
|
88
|
-
const app = defineResource({
|
|
89
|
-
id: "app",
|
|
90
|
-
register: [task1, task2],
|
|
91
|
-
});
|
|
92
|
-
|
|
93
|
-
await expect(run(app)).rejects.toThrow(/Circular dependencies detected/);
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
it("should throw eventNotFound error", async () => {
|
|
97
|
-
const nonExistentEvent = { id: "non.existent.event" } as any;
|
|
98
|
-
|
|
99
|
-
const task = defineTask({
|
|
100
|
-
id: "test.task",
|
|
101
|
-
on: nonExistentEvent,
|
|
102
|
-
run: async () => {},
|
|
103
|
-
});
|
|
104
|
-
|
|
105
|
-
const app = defineResource({
|
|
106
|
-
id: "app",
|
|
107
|
-
register: [task],
|
|
108
|
-
});
|
|
109
|
-
|
|
110
|
-
await expect(run(app)).rejects.toThrow(
|
|
111
|
-
new EventNotFoundError("non.existent.event").message
|
|
112
|
-
);
|
|
113
|
-
});
|
|
114
|
-
|
|
115
|
-
it("should throw taskError", async () => {
|
|
116
|
-
const errorTask = defineTask({
|
|
117
|
-
id: "error.task",
|
|
118
|
-
run: async () => {
|
|
119
|
-
throw new Error("Task error");
|
|
120
|
-
},
|
|
121
|
-
});
|
|
122
|
-
|
|
123
|
-
const app = defineResource({
|
|
124
|
-
id: "app",
|
|
125
|
-
register: [errorTask],
|
|
126
|
-
dependencies: { errorTask },
|
|
127
|
-
async init(_, { errorTask }) {
|
|
128
|
-
await errorTask();
|
|
129
|
-
},
|
|
130
|
-
});
|
|
131
|
-
|
|
132
|
-
await expect(run(app)).rejects.toThrow(/Task error/);
|
|
133
|
-
});
|
|
134
|
-
|
|
135
|
-
it("should throw resourceError", async () => {
|
|
136
|
-
const errorResource = defineResource({
|
|
137
|
-
id: "error.resource",
|
|
138
|
-
init: async () => {
|
|
139
|
-
if (true === true) {
|
|
140
|
-
throw new Error("Resource error");
|
|
141
|
-
}
|
|
142
|
-
},
|
|
143
|
-
});
|
|
144
|
-
|
|
145
|
-
const app = defineResource({
|
|
146
|
-
id: "app",
|
|
147
|
-
register: [errorResource],
|
|
148
|
-
});
|
|
149
|
-
|
|
150
|
-
await expect(run(app)).rejects.toThrow(/Resource error/);
|
|
151
|
-
});
|
|
152
|
-
|
|
153
|
-
it("should throw an ambigous one", async () => {
|
|
154
|
-
const res1 = defineResource({
|
|
155
|
-
id: "res1",
|
|
156
|
-
});
|
|
157
|
-
|
|
158
|
-
const ev1 = defineEvent({
|
|
159
|
-
id: "res1",
|
|
160
|
-
});
|
|
161
|
-
|
|
162
|
-
const app = defineResource({
|
|
163
|
-
id: "app",
|
|
164
|
-
register: [res1, ev1],
|
|
165
|
-
});
|
|
166
|
-
|
|
167
|
-
await expect(run(app)).rejects.toThrow(
|
|
168
|
-
new DuplicateRegistrationError("Resource", "res1").message
|
|
169
|
-
);
|
|
170
|
-
});
|
|
171
|
-
|
|
172
|
-
it("Should throw duplicate error for middlewares with the same id", async () => {
|
|
173
|
-
const middleware1 = defineMiddleware({
|
|
174
|
-
id: "middlewarex",
|
|
175
|
-
run: async () => {},
|
|
176
|
-
});
|
|
177
|
-
|
|
178
|
-
const middleware2 = defineMiddleware({
|
|
179
|
-
id: "middlewarex",
|
|
180
|
-
run: async () => {},
|
|
181
|
-
});
|
|
182
|
-
|
|
183
|
-
const app = defineResource({
|
|
184
|
-
id: "app",
|
|
185
|
-
register: [middleware1, middleware2],
|
|
186
|
-
});
|
|
187
|
-
|
|
188
|
-
await expect(run(app)).rejects.toThrow(
|
|
189
|
-
new DuplicateRegistrationError("Middleware", "middlewarex").message
|
|
190
|
-
);
|
|
191
|
-
});
|
|
192
|
-
|
|
193
|
-
it("Should throw duplicate error for events with the same id", async () => {
|
|
194
|
-
const ev1 = defineEvent({
|
|
195
|
-
id: "ev1",
|
|
196
|
-
});
|
|
197
|
-
const ev2 = defineEvent({
|
|
198
|
-
id: "ev1",
|
|
199
|
-
});
|
|
200
|
-
|
|
201
|
-
const app = defineResource({
|
|
202
|
-
id: "app",
|
|
203
|
-
register: [ev1, ev2],
|
|
204
|
-
});
|
|
205
|
-
|
|
206
|
-
await expect(run(app)).rejects.toThrow(
|
|
207
|
-
new DuplicateRegistrationError("Event", "ev1").message
|
|
208
|
-
);
|
|
209
|
-
});
|
|
210
|
-
|
|
211
|
-
it("should throw an error when a task depends on a non-registered task", async () => {
|
|
212
|
-
const offTheGrid = defineTask({
|
|
213
|
-
id: "test.off.the.grid",
|
|
214
|
-
dependencies: { nonExistentTask: { id: "non" } as any },
|
|
215
|
-
run: async () => {},
|
|
216
|
-
});
|
|
217
|
-
|
|
218
|
-
const task = defineTask({
|
|
219
|
-
id: "test.task",
|
|
220
|
-
dependencies: { offTheGrid },
|
|
221
|
-
run: async (_, deps) => {
|
|
222
|
-
throw "Should not even be here";
|
|
223
|
-
},
|
|
224
|
-
});
|
|
225
|
-
|
|
226
|
-
const app = defineResource({
|
|
227
|
-
id: "app",
|
|
228
|
-
register: [task],
|
|
229
|
-
dependencies: { task },
|
|
230
|
-
async init(_, { task }) {
|
|
231
|
-
await task();
|
|
232
|
-
},
|
|
233
|
-
});
|
|
234
|
-
|
|
235
|
-
await expect(run(app)).rejects.toThrow(
|
|
236
|
-
new DependencyNotFoundError("Task test.off.the.grid").message
|
|
237
|
-
);
|
|
238
|
-
});
|
|
239
|
-
|
|
240
|
-
it("should throw when a task depends on a non-registered resource", async () => {
|
|
241
|
-
const offTheGrid = defineResource({
|
|
242
|
-
id: "test.off.the.grid",
|
|
243
|
-
init: async () => {},
|
|
244
|
-
});
|
|
245
|
-
|
|
246
|
-
const task = defineTask({
|
|
247
|
-
id: "test.task",
|
|
248
|
-
dependencies: { offTheGrid },
|
|
249
|
-
run: async () => {
|
|
250
|
-
throw "Should not even be here";
|
|
251
|
-
},
|
|
252
|
-
});
|
|
253
|
-
|
|
254
|
-
const app = defineResource({
|
|
255
|
-
id: "app",
|
|
256
|
-
register: [task],
|
|
257
|
-
dependencies: { task },
|
|
258
|
-
async init(_, { task }) {
|
|
259
|
-
await task();
|
|
260
|
-
},
|
|
261
|
-
});
|
|
262
|
-
|
|
263
|
-
await expect(run(app)).rejects.toThrow(
|
|
264
|
-
new DependencyNotFoundError("Resource test.off.the.grid").message
|
|
265
|
-
);
|
|
266
|
-
});
|
|
267
|
-
|
|
268
|
-
it("should throw error, when a double global() is used on a middleware", async () => {
|
|
269
|
-
const first = defineMiddleware({
|
|
270
|
-
id: "x",
|
|
271
|
-
run: async () => {},
|
|
272
|
-
}).everywhere();
|
|
273
|
-
expect(() => first.everywhere()).toThrow(
|
|
274
|
-
new MiddlewareAlreadyGlobalError("x").message
|
|
275
|
-
);
|
|
276
|
-
});
|
|
277
|
-
|
|
278
|
-
describe("Error Classes", () => {
|
|
279
|
-
it("should have correct error names and inheritance", () => {
|
|
280
|
-
// Test base RuntimeError
|
|
281
|
-
const baseError = new RuntimeError("test");
|
|
282
|
-
expect(baseError.name).toBe("RuntimeError");
|
|
283
|
-
expect(baseError).toBeInstanceOf(Error);
|
|
284
|
-
expect(baseError).toBeInstanceOf(RuntimeError);
|
|
285
|
-
|
|
286
|
-
// Test DuplicateRegistrationError
|
|
287
|
-
const dupError = new DuplicateRegistrationError("Task", "test");
|
|
288
|
-
expect(dupError.name).toBe("DuplicateRegistrationError");
|
|
289
|
-
expect(dupError).toBeInstanceOf(Error);
|
|
290
|
-
expect(dupError).toBeInstanceOf(RuntimeError);
|
|
291
|
-
expect(dupError).toBeInstanceOf(DuplicateRegistrationError);
|
|
292
|
-
|
|
293
|
-
// Test DependencyNotFoundError
|
|
294
|
-
const depError = new DependencyNotFoundError("test");
|
|
295
|
-
expect(depError.name).toBe("DependencyNotFoundError");
|
|
296
|
-
expect(depError).toBeInstanceOf(RuntimeError);
|
|
297
|
-
|
|
298
|
-
// Test UnknownItemTypeError
|
|
299
|
-
const unknownError = new UnknownItemTypeError("test");
|
|
300
|
-
expect(unknownError.name).toBe("UnknownItemTypeError");
|
|
301
|
-
expect(unknownError).toBeInstanceOf(RuntimeError);
|
|
302
|
-
|
|
303
|
-
// Test CircularDependenciesError
|
|
304
|
-
const circularError = new CircularDependenciesError(["a", "b"]);
|
|
305
|
-
expect(circularError.name).toBe("CircularDependenciesError");
|
|
306
|
-
expect(circularError).toBeInstanceOf(RuntimeError);
|
|
307
|
-
|
|
308
|
-
// Test EventNotFoundError
|
|
309
|
-
const eventError = new EventNotFoundError("test");
|
|
310
|
-
expect(eventError.name).toBe("EventNotFoundError");
|
|
311
|
-
expect(eventError).toBeInstanceOf(RuntimeError);
|
|
312
|
-
|
|
313
|
-
// Test MiddlewareAlreadyGlobalError
|
|
314
|
-
const middlewareError = new MiddlewareAlreadyGlobalError("test");
|
|
315
|
-
expect(middlewareError.name).toBe("MiddlewareAlreadyGlobalError");
|
|
316
|
-
expect(middlewareError).toBeInstanceOf(RuntimeError);
|
|
317
|
-
|
|
318
|
-
// Test LockedError
|
|
319
|
-
const lockedError = new LockedError("test");
|
|
320
|
-
expect(lockedError.name).toBe("LockedError");
|
|
321
|
-
expect(lockedError).toBeInstanceOf(RuntimeError);
|
|
322
|
-
|
|
323
|
-
// Test StoreAlreadyInitializedError
|
|
324
|
-
const storeError = new StoreAlreadyInitializedError();
|
|
325
|
-
expect(storeError.name).toBe("StoreAlreadyInitializedError");
|
|
326
|
-
expect(storeError).toBeInstanceOf(RuntimeError);
|
|
327
|
-
|
|
328
|
-
// Test ValidationError with Error object
|
|
329
|
-
const validationErrorWithError = new ValidationError("Task input", "test-task", new Error("Required field missing"));
|
|
330
|
-
expect(validationErrorWithError.name).toBe("ValidationError");
|
|
331
|
-
expect(validationErrorWithError.message).toBe("Task input validation failed for test-task: Required field missing");
|
|
332
|
-
expect(validationErrorWithError).toBeInstanceOf(RuntimeError);
|
|
333
|
-
|
|
334
|
-
// Test ValidationError with string
|
|
335
|
-
const validationErrorWithString = new ValidationError("Resource config", Symbol("test-resource"), "Invalid configuration");
|
|
336
|
-
expect(validationErrorWithString.name).toBe("ValidationError");
|
|
337
|
-
expect(validationErrorWithString.message).toBe("Resource config validation failed for Symbol(test-resource): Invalid configuration");
|
|
338
|
-
expect(validationErrorWithString).toBeInstanceOf(RuntimeError);
|
|
339
|
-
});
|
|
340
|
-
});
|
|
341
|
-
});
|