@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,244 +0,0 @@
|
|
|
1
|
-
import { defineTask, defineResource } from "../define";
|
|
2
|
-
import { run } from "../run";
|
|
3
|
-
|
|
4
|
-
describe("setOutput functionality", () => {
|
|
5
|
-
it("should allow afterRun event listeners to modify task output", async () => {
|
|
6
|
-
const originalTask = defineTask({
|
|
7
|
-
id: "original.task",
|
|
8
|
-
run: async (input: string) => `Hello, ${input}!`,
|
|
9
|
-
});
|
|
10
|
-
|
|
11
|
-
const transformListener = defineTask({
|
|
12
|
-
id: "transform.listener",
|
|
13
|
-
on: originalTask.events.afterRun,
|
|
14
|
-
run: async (event) => {
|
|
15
|
-
const transformedOutput = event.data.output.toUpperCase();
|
|
16
|
-
event.data.setOutput(transformedOutput);
|
|
17
|
-
},
|
|
18
|
-
});
|
|
19
|
-
|
|
20
|
-
const app = defineResource({
|
|
21
|
-
id: "app",
|
|
22
|
-
register: [originalTask, transformListener],
|
|
23
|
-
dependencies: { originalTask },
|
|
24
|
-
async init(_, { originalTask }) {
|
|
25
|
-
const result = await originalTask("World");
|
|
26
|
-
expect(result).toBe("HELLO, WORLD!");
|
|
27
|
-
return result;
|
|
28
|
-
},
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
await run(app);
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
it("should preserve original output if setOutput is not called", async () => {
|
|
35
|
-
const originalTask = defineTask({
|
|
36
|
-
id: "original.task",
|
|
37
|
-
run: async (input: string) => `Hello, ${input}!`,
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
const observerListener = defineTask({
|
|
41
|
-
id: "observer.listener",
|
|
42
|
-
on: originalTask.events.afterRun,
|
|
43
|
-
run: async (event) => {
|
|
44
|
-
// Just observe, don't modify
|
|
45
|
-
expect(event.data.output).toBe("Hello, World!");
|
|
46
|
-
},
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
const app = defineResource({
|
|
50
|
-
id: "app",
|
|
51
|
-
register: [originalTask, observerListener],
|
|
52
|
-
dependencies: { originalTask },
|
|
53
|
-
async init(_, { originalTask }) {
|
|
54
|
-
const result = await originalTask("World");
|
|
55
|
-
expect(result).toBe("Hello, World!");
|
|
56
|
-
return result;
|
|
57
|
-
},
|
|
58
|
-
});
|
|
59
|
-
|
|
60
|
-
await run(app);
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
it("should handle multiple afterRun listeners with setOutput (last one wins)", async () => {
|
|
64
|
-
const originalTask = defineTask({
|
|
65
|
-
id: "original.task",
|
|
66
|
-
run: async (input: number) => input * 2,
|
|
67
|
-
});
|
|
68
|
-
|
|
69
|
-
const firstTransform = defineTask({
|
|
70
|
-
id: "first.transform",
|
|
71
|
-
on: originalTask.events.afterRun,
|
|
72
|
-
listenerOrder: 1,
|
|
73
|
-
run: async (event) => {
|
|
74
|
-
event.data.setOutput(event.data.output + 10);
|
|
75
|
-
},
|
|
76
|
-
});
|
|
77
|
-
|
|
78
|
-
const secondTransform = defineTask({
|
|
79
|
-
id: "second.transform",
|
|
80
|
-
on: originalTask.events.afterRun,
|
|
81
|
-
listenerOrder: 2,
|
|
82
|
-
run: async (event) => {
|
|
83
|
-
event.data.setOutput(event.data.output * 3);
|
|
84
|
-
},
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
const app = defineResource({
|
|
88
|
-
id: "app",
|
|
89
|
-
register: [originalTask, firstTransform, secondTransform],
|
|
90
|
-
dependencies: { originalTask },
|
|
91
|
-
async init(_, { originalTask }) {
|
|
92
|
-
const result = await originalTask(5);
|
|
93
|
-
// Original: 5 * 2 = 10
|
|
94
|
-
// First transform: 10 + 10 = 20
|
|
95
|
-
// Second transform: 20 * 3 = 60
|
|
96
|
-
expect(result).toBe(60);
|
|
97
|
-
return result;
|
|
98
|
-
},
|
|
99
|
-
});
|
|
100
|
-
|
|
101
|
-
await run(app);
|
|
102
|
-
});
|
|
103
|
-
|
|
104
|
-
it("should work with external library scenario", async () => {
|
|
105
|
-
// Simulate an external library task
|
|
106
|
-
const externalLibraryTask = defineTask({
|
|
107
|
-
id: "external.library.task",
|
|
108
|
-
run: async (data: { name: string; age: number }) => {
|
|
109
|
-
return {
|
|
110
|
-
id: Math.random(),
|
|
111
|
-
name: data.name,
|
|
112
|
-
age: data.age,
|
|
113
|
-
timestamp: Date.now(),
|
|
114
|
-
};
|
|
115
|
-
},
|
|
116
|
-
});
|
|
117
|
-
|
|
118
|
-
// Create a transformer for the external task
|
|
119
|
-
const resultTransformer = defineTask({
|
|
120
|
-
id: "result.transformer",
|
|
121
|
-
on: externalLibraryTask.events.afterRun,
|
|
122
|
-
run: async (event) => {
|
|
123
|
-
const result = event.data.output;
|
|
124
|
-
// Add some computed fields
|
|
125
|
-
const enrichedResult = {
|
|
126
|
-
...result,
|
|
127
|
-
displayName: `${result.name} (${result.age} years old)`,
|
|
128
|
-
isAdult: result.age >= 18,
|
|
129
|
-
};
|
|
130
|
-
event.data.setOutput(enrichedResult);
|
|
131
|
-
},
|
|
132
|
-
});
|
|
133
|
-
|
|
134
|
-
const app = defineResource({
|
|
135
|
-
id: "app",
|
|
136
|
-
register: [externalLibraryTask, resultTransformer],
|
|
137
|
-
dependencies: { externalLibraryTask },
|
|
138
|
-
async init(_, { externalLibraryTask }) {
|
|
139
|
-
const result = await externalLibraryTask({ name: "Alice", age: 25 });
|
|
140
|
-
|
|
141
|
-
expect(result).toMatchObject({
|
|
142
|
-
name: "Alice",
|
|
143
|
-
age: 25,
|
|
144
|
-
displayName: "Alice (25 years old)",
|
|
145
|
-
isAdult: true,
|
|
146
|
-
});
|
|
147
|
-
expect(result.id).toBeDefined();
|
|
148
|
-
expect(result.timestamp).toBeDefined();
|
|
149
|
-
|
|
150
|
-
return result;
|
|
151
|
-
},
|
|
152
|
-
});
|
|
153
|
-
|
|
154
|
-
await run(app);
|
|
155
|
-
});
|
|
156
|
-
|
|
157
|
-
it("should handle type safety with setOutput", async () => {
|
|
158
|
-
interface TaskOutput {
|
|
159
|
-
message: string;
|
|
160
|
-
count: number;
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
const typedTask = defineTask({
|
|
164
|
-
id: "typed.task",
|
|
165
|
-
run: async (input: string): Promise<TaskOutput> => ({
|
|
166
|
-
message: `Hello, ${input}!`,
|
|
167
|
-
count: input.length,
|
|
168
|
-
}),
|
|
169
|
-
});
|
|
170
|
-
|
|
171
|
-
const typedTransformer = defineTask({
|
|
172
|
-
id: "typed.transformer",
|
|
173
|
-
on: typedTask.events.afterRun,
|
|
174
|
-
run: async (event) => {
|
|
175
|
-
const result = event.data.output;
|
|
176
|
-
const newResult: TaskOutput = {
|
|
177
|
-
message: result.message.toUpperCase(),
|
|
178
|
-
count: result.count * 2,
|
|
179
|
-
};
|
|
180
|
-
event.data.setOutput(newResult);
|
|
181
|
-
},
|
|
182
|
-
});
|
|
183
|
-
|
|
184
|
-
const app = defineResource({
|
|
185
|
-
id: "app",
|
|
186
|
-
register: [typedTask, typedTransformer],
|
|
187
|
-
dependencies: { typedTask },
|
|
188
|
-
async init(_, { typedTask }) {
|
|
189
|
-
const result = await typedTask("World");
|
|
190
|
-
expect(result).toEqual({
|
|
191
|
-
message: "HELLO, WORLD!",
|
|
192
|
-
count: 10, // "World".length * 2
|
|
193
|
-
});
|
|
194
|
-
return result;
|
|
195
|
-
},
|
|
196
|
-
});
|
|
197
|
-
|
|
198
|
-
await run(app);
|
|
199
|
-
});
|
|
200
|
-
|
|
201
|
-
it("should work with middleware and setOutput together", async () => {
|
|
202
|
-
const { defineMiddleware } = await import("../define");
|
|
203
|
-
|
|
204
|
-
const testMiddleware = defineMiddleware({
|
|
205
|
-
id: "test.middleware",
|
|
206
|
-
run: async ({ next, task }) => {
|
|
207
|
-
const result = await next(task?.input);
|
|
208
|
-
return `[middleware: ${result}]`;
|
|
209
|
-
},
|
|
210
|
-
});
|
|
211
|
-
|
|
212
|
-
const originalTask = defineTask({
|
|
213
|
-
id: "original.task",
|
|
214
|
-
middleware: [testMiddleware],
|
|
215
|
-
run: async (input: string) => `Hello, ${input}!`,
|
|
216
|
-
});
|
|
217
|
-
|
|
218
|
-
const outputTransformer = defineTask({
|
|
219
|
-
id: "output.transformer",
|
|
220
|
-
on: originalTask.events.afterRun,
|
|
221
|
-
run: async (event) => {
|
|
222
|
-
// The output here already includes middleware processing
|
|
223
|
-
const transformed = event.data.output.replace(
|
|
224
|
-
"middleware:",
|
|
225
|
-
"processed:"
|
|
226
|
-
);
|
|
227
|
-
event.data.setOutput(transformed);
|
|
228
|
-
},
|
|
229
|
-
});
|
|
230
|
-
|
|
231
|
-
const app = defineResource({
|
|
232
|
-
id: "app",
|
|
233
|
-
register: [testMiddleware, originalTask, outputTransformer],
|
|
234
|
-
dependencies: { originalTask },
|
|
235
|
-
async init(_, { originalTask }) {
|
|
236
|
-
const result = await originalTask("World");
|
|
237
|
-
expect(result).toBe("[processed: Hello, World!]");
|
|
238
|
-
return result;
|
|
239
|
-
},
|
|
240
|
-
});
|
|
241
|
-
|
|
242
|
-
await run(app);
|
|
243
|
-
});
|
|
244
|
-
});
|
|
@@ -1,396 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
defineTag,
|
|
3
|
-
defineTask,
|
|
4
|
-
defineResource,
|
|
5
|
-
defineEvent,
|
|
6
|
-
defineMiddleware,
|
|
7
|
-
} from "../define";
|
|
8
|
-
import { run } from "../run";
|
|
9
|
-
|
|
10
|
-
describe("Configurable Tags", () => {
|
|
11
|
-
describe("Tag Definition", () => {
|
|
12
|
-
it("should create a tag with string id", () => {
|
|
13
|
-
const performanceTag = defineTag<{ alertAboveMs: number }>({
|
|
14
|
-
id: "performance.track",
|
|
15
|
-
});
|
|
16
|
-
|
|
17
|
-
expect(performanceTag.id).toBe("performance.track");
|
|
18
|
-
expect(typeof performanceTag.with).toBe("function");
|
|
19
|
-
expect(typeof performanceTag.extract).toBe("function");
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
it("should create a tag with symbol id", () => {
|
|
23
|
-
const symbolId = Symbol("test.tag");
|
|
24
|
-
const testTag = defineTag<{ value: string }>({ id: symbolId });
|
|
25
|
-
|
|
26
|
-
expect(testTag.id).toBe(symbolId);
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
it("should create a tag without configuration", () => {
|
|
30
|
-
const simpleTag = defineTag({ id: "simple.tag" });
|
|
31
|
-
|
|
32
|
-
expect(simpleTag.id).toBe("simple.tag");
|
|
33
|
-
expect(typeof simpleTag.with).toBe("function");
|
|
34
|
-
expect(typeof simpleTag.extract).toBe("function");
|
|
35
|
-
});
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
describe("Tag Configuration with .with()", () => {
|
|
39
|
-
it("should create a configured tag instance", () => {
|
|
40
|
-
const performanceTag = defineTag<{ alertAboveMs: number }>({
|
|
41
|
-
id: "performance.track",
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
const configuredTag = performanceTag.with({ alertAboveMs: 200 });
|
|
45
|
-
|
|
46
|
-
expect(configuredTag.id).toBe("performance.track");
|
|
47
|
-
expect(configuredTag.config).toEqual({ alertAboveMs: 200 });
|
|
48
|
-
expect(configuredTag.tag).toBe(performanceTag);
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
it("should allow multiple configurations of the same tag", () => {
|
|
52
|
-
const cacheTag = defineTag<{ ttl: number }>({ id: "cache.config" });
|
|
53
|
-
|
|
54
|
-
const shortCache = cacheTag.with({ ttl: 300 });
|
|
55
|
-
const longCache = cacheTag.with({ ttl: 3600 });
|
|
56
|
-
|
|
57
|
-
expect(shortCache.config.ttl).toBe(300);
|
|
58
|
-
expect(longCache.config.ttl).toBe(3600);
|
|
59
|
-
expect(shortCache.tag).toBe(cacheTag);
|
|
60
|
-
expect(longCache.tag).toBe(cacheTag);
|
|
61
|
-
});
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
describe("Tag Extraction with .extract()", () => {
|
|
65
|
-
it("should extract configured tag from tags array", () => {
|
|
66
|
-
const performanceTag = defineTag<{ alertAboveMs: number }>({
|
|
67
|
-
id: "performance.track",
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
const tags = [
|
|
71
|
-
"simple-string-tag",
|
|
72
|
-
performanceTag.with({ alertAboveMs: 200 }),
|
|
73
|
-
"another-string",
|
|
74
|
-
];
|
|
75
|
-
|
|
76
|
-
const extracted = performanceTag.extract(tags);
|
|
77
|
-
|
|
78
|
-
expect(extracted).not.toBeNull();
|
|
79
|
-
expect(extracted?.id).toBe("performance.track");
|
|
80
|
-
expect(extracted?.config).toEqual({ alertAboveMs: 200 });
|
|
81
|
-
});
|
|
82
|
-
|
|
83
|
-
it("should extract unconfigured tag from tags array", () => {
|
|
84
|
-
const simpleTag = defineTag({ id: "simple.tag" });
|
|
85
|
-
|
|
86
|
-
const tags = ["string-tag", simpleTag, "another-string"];
|
|
87
|
-
|
|
88
|
-
const extracted = simpleTag.extract(tags);
|
|
89
|
-
|
|
90
|
-
expect(extracted).not.toBeNull();
|
|
91
|
-
expect(extracted?.id).toBe("simple.tag");
|
|
92
|
-
expect(extracted?.config).toBeUndefined();
|
|
93
|
-
});
|
|
94
|
-
|
|
95
|
-
it("should return null if tag not found", () => {
|
|
96
|
-
const performanceTag = defineTag<{ alertAboveMs: number }>({
|
|
97
|
-
id: "performance.track",
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
const tags = ["string-tag", "another-string"];
|
|
101
|
-
|
|
102
|
-
const extracted = performanceTag.extract(tags);
|
|
103
|
-
|
|
104
|
-
expect(extracted).toBeNull();
|
|
105
|
-
});
|
|
106
|
-
|
|
107
|
-
it("should ignore string tags during extraction", () => {
|
|
108
|
-
const performanceTag = defineTag<{ alertAboveMs: number }>({
|
|
109
|
-
id: "performance.track",
|
|
110
|
-
});
|
|
111
|
-
|
|
112
|
-
const tags = [
|
|
113
|
-
"performance.track", // This is a string, not the tag
|
|
114
|
-
performanceTag.with({ alertAboveMs: 100 }),
|
|
115
|
-
];
|
|
116
|
-
|
|
117
|
-
const extracted = performanceTag.extract(tags);
|
|
118
|
-
|
|
119
|
-
expect(extracted).not.toBeNull();
|
|
120
|
-
expect(extracted?.config).toEqual({ alertAboveMs: 100 });
|
|
121
|
-
});
|
|
122
|
-
|
|
123
|
-
it("should handle symbol ids correctly", () => {
|
|
124
|
-
const symbolId = Symbol("test.tag");
|
|
125
|
-
const testTag = defineTag<{ data: string }>({ id: symbolId });
|
|
126
|
-
|
|
127
|
-
const tags = [testTag.with({ data: "test" })];
|
|
128
|
-
|
|
129
|
-
const extracted = testTag.extract(tags);
|
|
130
|
-
|
|
131
|
-
expect(extracted).not.toBeNull();
|
|
132
|
-
expect(extracted?.id).toBe(symbolId);
|
|
133
|
-
expect(extracted?.config).toEqual({ data: "test" });
|
|
134
|
-
});
|
|
135
|
-
|
|
136
|
-
it("should extract configured tag from a taggable object (task.definition)", () => {
|
|
137
|
-
const performanceTag = defineTag<{ alertAboveMs: number }>({
|
|
138
|
-
id: "performance.track",
|
|
139
|
-
});
|
|
140
|
-
|
|
141
|
-
const task = defineTask({
|
|
142
|
-
id: "task.with.tags",
|
|
143
|
-
meta: {
|
|
144
|
-
tags: [performanceTag.with({ alertAboveMs: 123 })],
|
|
145
|
-
},
|
|
146
|
-
run: async () => "ok",
|
|
147
|
-
});
|
|
148
|
-
|
|
149
|
-
const extracted = performanceTag.extract(task);
|
|
150
|
-
expect(extracted).not.toBeNull();
|
|
151
|
-
expect(extracted?.config).toEqual({ alertAboveMs: 123 });
|
|
152
|
-
});
|
|
153
|
-
|
|
154
|
-
it("should return null when taggable has no tags", () => {
|
|
155
|
-
const t = defineTag({ id: "x" });
|
|
156
|
-
const task = defineTask({ id: "no.tags", run: async () => "ok" });
|
|
157
|
-
expect(t.extract(task)).toBeNull();
|
|
158
|
-
});
|
|
159
|
-
|
|
160
|
-
it("should work with a simple taggable carrying meta.tags directly", () => {
|
|
161
|
-
const t = defineTag<{ p: number }>({ id: "pp" });
|
|
162
|
-
const taggable = { meta: { tags: [t.with({ p: 9 })] } } as any;
|
|
163
|
-
const extracted = t.extract(taggable);
|
|
164
|
-
expect(extracted?.config).toEqual({ p: 9 });
|
|
165
|
-
});
|
|
166
|
-
});
|
|
167
|
-
|
|
168
|
-
describe("Integration with Tasks", () => {
|
|
169
|
-
it("should work with task metadata", () => {
|
|
170
|
-
const performanceTag = defineTag<{ alertAboveMs: number }>({
|
|
171
|
-
id: "performance.track",
|
|
172
|
-
});
|
|
173
|
-
|
|
174
|
-
const testTask = defineTask({
|
|
175
|
-
id: "test.task",
|
|
176
|
-
meta: {
|
|
177
|
-
tags: [
|
|
178
|
-
"api",
|
|
179
|
-
performanceTag.with({ alertAboveMs: 200 }),
|
|
180
|
-
"important",
|
|
181
|
-
],
|
|
182
|
-
},
|
|
183
|
-
run: async () => {
|
|
184
|
-
return "success";
|
|
185
|
-
},
|
|
186
|
-
});
|
|
187
|
-
|
|
188
|
-
expect(testTask.meta?.tags).toHaveLength(3);
|
|
189
|
-
expect(testTask.meta?.tags?.[0]).toBe("api");
|
|
190
|
-
expect(testTask.meta?.tags?.[2]).toBe("important");
|
|
191
|
-
|
|
192
|
-
const extracted = performanceTag.extract(testTask.meta?.tags || []);
|
|
193
|
-
expect(extracted).not.toBeNull();
|
|
194
|
-
expect(extracted?.config).toEqual({ alertAboveMs: 200 });
|
|
195
|
-
});
|
|
196
|
-
|
|
197
|
-
it("should work with middleware checking tags", async () => {
|
|
198
|
-
const performanceTag = defineTag<{ alertAboveMs: number }>({
|
|
199
|
-
id: "performance.track",
|
|
200
|
-
});
|
|
201
|
-
|
|
202
|
-
const middlewareExecutions: Array<{ taskId: string; config: any }> = [];
|
|
203
|
-
|
|
204
|
-
const performanceMiddleware = defineMiddleware({
|
|
205
|
-
id: "performance.middleware",
|
|
206
|
-
run: async ({ task, next }) => {
|
|
207
|
-
if (task?.definition.meta?.tags) {
|
|
208
|
-
const extracted = performanceTag.extract(task.definition.meta.tags);
|
|
209
|
-
if (extracted) {
|
|
210
|
-
middlewareExecutions.push({
|
|
211
|
-
taskId: task.definition.id as string,
|
|
212
|
-
config: extracted.config,
|
|
213
|
-
});
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
return next(task?.input);
|
|
217
|
-
},
|
|
218
|
-
});
|
|
219
|
-
|
|
220
|
-
const fastTask = defineTask({
|
|
221
|
-
id: "fast.task",
|
|
222
|
-
meta: {
|
|
223
|
-
tags: [performanceTag.with({ alertAboveMs: 100 })],
|
|
224
|
-
},
|
|
225
|
-
run: async () => "fast",
|
|
226
|
-
});
|
|
227
|
-
|
|
228
|
-
const slowTask = defineTask({
|
|
229
|
-
id: "slow.task",
|
|
230
|
-
meta: {
|
|
231
|
-
tags: [performanceTag.with({ alertAboveMs: 500 })],
|
|
232
|
-
},
|
|
233
|
-
run: async () => "slow",
|
|
234
|
-
});
|
|
235
|
-
|
|
236
|
-
const normalTask = defineTask({
|
|
237
|
-
id: "normal.task",
|
|
238
|
-
meta: {
|
|
239
|
-
tags: ["just-a-string"],
|
|
240
|
-
},
|
|
241
|
-
run: async () => "normal",
|
|
242
|
-
});
|
|
243
|
-
|
|
244
|
-
const app = defineResource({
|
|
245
|
-
id: "test.app",
|
|
246
|
-
register: [
|
|
247
|
-
fastTask,
|
|
248
|
-
slowTask,
|
|
249
|
-
normalTask,
|
|
250
|
-
performanceMiddleware.everywhere(),
|
|
251
|
-
],
|
|
252
|
-
dependencies: { fastTask, slowTask, normalTask },
|
|
253
|
-
init: async (_, { fastTask, slowTask, normalTask }) => {
|
|
254
|
-
await fastTask();
|
|
255
|
-
await slowTask();
|
|
256
|
-
await normalTask();
|
|
257
|
-
return "done";
|
|
258
|
-
},
|
|
259
|
-
});
|
|
260
|
-
|
|
261
|
-
const { dispose } = await run(app);
|
|
262
|
-
await dispose();
|
|
263
|
-
|
|
264
|
-
expect(middlewareExecutions).toHaveLength(2);
|
|
265
|
-
expect(middlewareExecutions).toEqual([
|
|
266
|
-
{ taskId: "fast.task", config: { alertAboveMs: 100 } },
|
|
267
|
-
{ taskId: "slow.task", config: { alertAboveMs: 500 } },
|
|
268
|
-
]);
|
|
269
|
-
});
|
|
270
|
-
});
|
|
271
|
-
|
|
272
|
-
describe("Integration with Resources", () => {
|
|
273
|
-
it("should work with resource metadata", () => {
|
|
274
|
-
const dbTag = defineTag<{ connectionTimeout: number }>({
|
|
275
|
-
id: "db.config",
|
|
276
|
-
});
|
|
277
|
-
|
|
278
|
-
const database = defineResource({
|
|
279
|
-
id: "database",
|
|
280
|
-
meta: {
|
|
281
|
-
tags: ["database", dbTag.with({ connectionTimeout: 5000 })],
|
|
282
|
-
},
|
|
283
|
-
init: async () => ({ query: () => "result" }),
|
|
284
|
-
});
|
|
285
|
-
|
|
286
|
-
expect(database.meta?.tags).toHaveLength(2);
|
|
287
|
-
const extracted = dbTag.extract(database.meta?.tags || []);
|
|
288
|
-
expect(extracted?.config).toEqual({ connectionTimeout: 5000 });
|
|
289
|
-
});
|
|
290
|
-
});
|
|
291
|
-
|
|
292
|
-
describe("Integration with Events", () => {
|
|
293
|
-
it("should work with event metadata", () => {
|
|
294
|
-
const auditTag = defineTag<{ sensitive: boolean }>({
|
|
295
|
-
id: "audit.config",
|
|
296
|
-
});
|
|
297
|
-
|
|
298
|
-
const userEvent = defineEvent<{ userId: string }>({
|
|
299
|
-
id: "user.created",
|
|
300
|
-
meta: {
|
|
301
|
-
tags: ["user-event", auditTag.with({ sensitive: true })],
|
|
302
|
-
},
|
|
303
|
-
});
|
|
304
|
-
|
|
305
|
-
expect(userEvent.meta?.tags).toHaveLength(2);
|
|
306
|
-
const extracted = auditTag.extract(userEvent.meta?.tags || []);
|
|
307
|
-
expect(extracted?.config).toEqual({ sensitive: true });
|
|
308
|
-
});
|
|
309
|
-
});
|
|
310
|
-
|
|
311
|
-
describe("Integration with Middleware", () => {
|
|
312
|
-
it("should work with middleware metadata", () => {
|
|
313
|
-
const rateLimitTag = defineTag<{ requestsPerMinute: number }>({
|
|
314
|
-
id: "rate-limit",
|
|
315
|
-
});
|
|
316
|
-
|
|
317
|
-
const rateLimitMiddleware = defineMiddleware({
|
|
318
|
-
id: "rate.limit.middleware",
|
|
319
|
-
meta: {
|
|
320
|
-
tags: ["security", rateLimitTag.with({ requestsPerMinute: 60 })],
|
|
321
|
-
},
|
|
322
|
-
run: async ({ next, task }) => {
|
|
323
|
-
return next(task?.input);
|
|
324
|
-
},
|
|
325
|
-
});
|
|
326
|
-
|
|
327
|
-
expect(rateLimitMiddleware.meta?.tags).toHaveLength(2);
|
|
328
|
-
const extracted = rateLimitTag.extract(
|
|
329
|
-
rateLimitMiddleware.meta?.tags || []
|
|
330
|
-
);
|
|
331
|
-
expect(extracted?.config).toEqual({ requestsPerMinute: 60 });
|
|
332
|
-
});
|
|
333
|
-
});
|
|
334
|
-
|
|
335
|
-
describe("Backward Compatibility", () => {
|
|
336
|
-
it("should work with existing string tags", () => {
|
|
337
|
-
const task = defineTask({
|
|
338
|
-
id: "legacy.task",
|
|
339
|
-
meta: {
|
|
340
|
-
tags: ["api", "legacy", "important"],
|
|
341
|
-
},
|
|
342
|
-
run: async () => "success",
|
|
343
|
-
});
|
|
344
|
-
|
|
345
|
-
// String tags should still work
|
|
346
|
-
expect(task.meta?.tags).toEqual(["api", "legacy", "important"]);
|
|
347
|
-
|
|
348
|
-
// New tags should not interfere with string tags
|
|
349
|
-
const performanceTag = defineTag<{ alertAboveMs: number }>({
|
|
350
|
-
id: "performance.track",
|
|
351
|
-
});
|
|
352
|
-
|
|
353
|
-
const extracted = performanceTag.extract(task.meta?.tags || []);
|
|
354
|
-
expect(extracted).toBeNull(); // Should not find the tag
|
|
355
|
-
});
|
|
356
|
-
|
|
357
|
-
it("should allow mixing string tags and configurable tags", () => {
|
|
358
|
-
const performanceTag = defineTag<{ alertAboveMs: number }>({
|
|
359
|
-
id: "performance.track",
|
|
360
|
-
});
|
|
361
|
-
|
|
362
|
-
const task = defineTask({
|
|
363
|
-
id: "mixed.task",
|
|
364
|
-
meta: {
|
|
365
|
-
tags: [
|
|
366
|
-
"api", // string tag
|
|
367
|
-
performanceTag.with({ alertAboveMs: 200 }), // configurable tag
|
|
368
|
-
"important", // string tag
|
|
369
|
-
],
|
|
370
|
-
},
|
|
371
|
-
run: async () => "success",
|
|
372
|
-
});
|
|
373
|
-
|
|
374
|
-
expect(task.meta?.tags).toHaveLength(3);
|
|
375
|
-
expect(task.meta?.tags?.[0]).toBe("api");
|
|
376
|
-
expect(task.meta?.tags?.[2]).toBe("important");
|
|
377
|
-
|
|
378
|
-
const extracted = performanceTag.extract(task.meta?.tags || []);
|
|
379
|
-
expect(extracted?.config).toEqual({ alertAboveMs: 200 });
|
|
380
|
-
});
|
|
381
|
-
});
|
|
382
|
-
|
|
383
|
-
describe("Edge Cases", () => {
|
|
384
|
-
it("should handle null/undefined config", () => {
|
|
385
|
-
const optionalTag = defineTag<{ value?: string }>({
|
|
386
|
-
id: "optional.config",
|
|
387
|
-
});
|
|
388
|
-
|
|
389
|
-
const configuredTag = optionalTag.with({});
|
|
390
|
-
expect(configuredTag.config).toEqual({});
|
|
391
|
-
|
|
392
|
-
const extracted = optionalTag.extract([configuredTag]);
|
|
393
|
-
expect(extracted?.config).toEqual({});
|
|
394
|
-
});
|
|
395
|
-
});
|
|
396
|
-
});
|