@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,428 +0,0 @@
|
|
|
1
|
-
import { defineTask, defineResource, defineEvent, defineMiddleware } from "../define";
|
|
2
|
-
import { run } from "../run";
|
|
3
|
-
import { IValidationSchema } from "../defs";
|
|
4
|
-
|
|
5
|
-
// Simple mock validation schemas for testing the interface
|
|
6
|
-
class MockValidationSchema<T> implements IValidationSchema<T> {
|
|
7
|
-
constructor(
|
|
8
|
-
private validator: (input: unknown) => T,
|
|
9
|
-
private errorMessage?: string
|
|
10
|
-
) {}
|
|
11
|
-
|
|
12
|
-
parse(input: unknown): T {
|
|
13
|
-
try {
|
|
14
|
-
return this.validator(input);
|
|
15
|
-
} catch (error) {
|
|
16
|
-
throw new Error(this.errorMessage || "Validation failed");
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
// Helper functions to create mock schemas similar to Zod
|
|
22
|
-
const mockSchema = {
|
|
23
|
-
object: <T extends Record<string, any>>(shape: Record<keyof T, string>): IValidationSchema<T> => {
|
|
24
|
-
return new MockValidationSchema((input: unknown) => {
|
|
25
|
-
if (typeof input !== "object" || input === null) {
|
|
26
|
-
throw new Error("Expected object");
|
|
27
|
-
}
|
|
28
|
-
const obj = input as any;
|
|
29
|
-
for (const [key, expectedType] of Object.entries(shape)) {
|
|
30
|
-
if (expectedType === "string" && typeof obj[key] !== "string") {
|
|
31
|
-
throw new Error(`${key} must be string`);
|
|
32
|
-
}
|
|
33
|
-
if (expectedType === "number" && typeof obj[key] !== "number") {
|
|
34
|
-
throw new Error(`${key} must be number`);
|
|
35
|
-
}
|
|
36
|
-
if (expectedType === "boolean" && typeof obj[key] !== "boolean") {
|
|
37
|
-
throw new Error(`${key} must be boolean`);
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
return obj as T;
|
|
41
|
-
});
|
|
42
|
-
},
|
|
43
|
-
|
|
44
|
-
string: (): IValidationSchema<string> => {
|
|
45
|
-
return new MockValidationSchema((input: unknown) => {
|
|
46
|
-
if (typeof input !== "string") {
|
|
47
|
-
throw new Error("Expected string");
|
|
48
|
-
}
|
|
49
|
-
return input;
|
|
50
|
-
});
|
|
51
|
-
},
|
|
52
|
-
|
|
53
|
-
number: (): IValidationSchema<number> => {
|
|
54
|
-
return new MockValidationSchema((input: unknown) => {
|
|
55
|
-
if (typeof input !== "number") {
|
|
56
|
-
throw new Error("Expected number");
|
|
57
|
-
}
|
|
58
|
-
return input;
|
|
59
|
-
});
|
|
60
|
-
},
|
|
61
|
-
|
|
62
|
-
boolean: (): IValidationSchema<boolean> => {
|
|
63
|
-
return new MockValidationSchema((input: unknown) => {
|
|
64
|
-
if (typeof input !== "boolean") {
|
|
65
|
-
throw new Error("Expected boolean");
|
|
66
|
-
}
|
|
67
|
-
return input;
|
|
68
|
-
});
|
|
69
|
-
},
|
|
70
|
-
|
|
71
|
-
transform: <T, U>(schema: IValidationSchema<T>, transformer: (value: T) => U): IValidationSchema<U> => {
|
|
72
|
-
return new MockValidationSchema((input: unknown) => {
|
|
73
|
-
const validated = schema.parse(input);
|
|
74
|
-
return transformer(validated);
|
|
75
|
-
});
|
|
76
|
-
},
|
|
77
|
-
|
|
78
|
-
withDefaults: <T>(defaultValue: T): IValidationSchema<T> => {
|
|
79
|
-
return new MockValidationSchema((input: unknown) => {
|
|
80
|
-
return input === undefined ? defaultValue : (input as T);
|
|
81
|
-
});
|
|
82
|
-
},
|
|
83
|
-
};
|
|
84
|
-
|
|
85
|
-
describe("Generic Validation Interface", () => {
|
|
86
|
-
describe("Task Input Validation", () => {
|
|
87
|
-
it("should validate task input successfully with valid data", async () => {
|
|
88
|
-
const userSchema = mockSchema.object<{
|
|
89
|
-
name: string;
|
|
90
|
-
age: number;
|
|
91
|
-
}>({
|
|
92
|
-
name: "string",
|
|
93
|
-
age: "number",
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
const createUserTask = defineTask({
|
|
97
|
-
id: "task.createUser",
|
|
98
|
-
inputSchema: userSchema,
|
|
99
|
-
run: async (input) => {
|
|
100
|
-
return `Created user ${(input as any).name}`;
|
|
101
|
-
},
|
|
102
|
-
});
|
|
103
|
-
|
|
104
|
-
const app = defineResource({
|
|
105
|
-
id: "app",
|
|
106
|
-
register: [createUserTask],
|
|
107
|
-
dependencies: { createUserTask },
|
|
108
|
-
init: async (_, { createUserTask }) => {
|
|
109
|
-
const result = await createUserTask({
|
|
110
|
-
name: "John Doe",
|
|
111
|
-
age: 30,
|
|
112
|
-
});
|
|
113
|
-
expect(result).toBe("Created user John Doe");
|
|
114
|
-
return result;
|
|
115
|
-
},
|
|
116
|
-
});
|
|
117
|
-
|
|
118
|
-
await run(app);
|
|
119
|
-
});
|
|
120
|
-
|
|
121
|
-
it("should throw validation error for invalid task input", async () => {
|
|
122
|
-
const userSchema = new MockValidationSchema((input: unknown) => {
|
|
123
|
-
if (typeof input !== "object" || input === null) {
|
|
124
|
-
throw new Error("Expected object");
|
|
125
|
-
}
|
|
126
|
-
const obj = input as any;
|
|
127
|
-
if (typeof obj.name !== "string") {
|
|
128
|
-
throw new Error("name must be string");
|
|
129
|
-
}
|
|
130
|
-
if (typeof obj.age !== "number" || obj.age < 0) {
|
|
131
|
-
throw new Error("age must be positive number");
|
|
132
|
-
}
|
|
133
|
-
return obj;
|
|
134
|
-
});
|
|
135
|
-
|
|
136
|
-
const createUserTask = defineTask({
|
|
137
|
-
id: "task.createUser.invalid",
|
|
138
|
-
inputSchema: userSchema,
|
|
139
|
-
run: async (input) => {
|
|
140
|
-
return `Created user ${(input as any).name}`;
|
|
141
|
-
},
|
|
142
|
-
});
|
|
143
|
-
|
|
144
|
-
const app = defineResource({
|
|
145
|
-
id: "app",
|
|
146
|
-
register: [createUserTask],
|
|
147
|
-
dependencies: { createUserTask },
|
|
148
|
-
init: async (_, { createUserTask }) => {
|
|
149
|
-
await createUserTask({
|
|
150
|
-
name: "John Doe",
|
|
151
|
-
age: -5, // Invalid: negative age
|
|
152
|
-
});
|
|
153
|
-
},
|
|
154
|
-
});
|
|
155
|
-
|
|
156
|
-
await expect(run(app)).rejects.toThrow(/Task input validation failed/);
|
|
157
|
-
});
|
|
158
|
-
|
|
159
|
-
it("should transform input data when schema supports it", async () => {
|
|
160
|
-
const stringToNumberSchema = mockSchema.transform(
|
|
161
|
-
mockSchema.string(),
|
|
162
|
-
(val: string) => parseInt(val, 10)
|
|
163
|
-
);
|
|
164
|
-
|
|
165
|
-
const mathTask = defineTask({
|
|
166
|
-
id: "task.math",
|
|
167
|
-
inputSchema: stringToNumberSchema,
|
|
168
|
-
run: async (input: number) => {
|
|
169
|
-
expect(typeof input).toBe("number");
|
|
170
|
-
return input * 2;
|
|
171
|
-
},
|
|
172
|
-
});
|
|
173
|
-
|
|
174
|
-
const app = defineResource({
|
|
175
|
-
id: "app",
|
|
176
|
-
register: [mathTask],
|
|
177
|
-
dependencies: { mathTask },
|
|
178
|
-
init: async (_, { mathTask }) => {
|
|
179
|
-
const result = await (mathTask as any)("42"); // String input should be transformed to number
|
|
180
|
-
expect(result).toBe(84);
|
|
181
|
-
return result;
|
|
182
|
-
},
|
|
183
|
-
});
|
|
184
|
-
|
|
185
|
-
await run(app);
|
|
186
|
-
});
|
|
187
|
-
});
|
|
188
|
-
|
|
189
|
-
describe("Resource Config Validation", () => {
|
|
190
|
-
it("should validate resource config when .with() is called (fail fast)", async () => {
|
|
191
|
-
const configSchema = new MockValidationSchema((input: unknown) => {
|
|
192
|
-
if (typeof input !== "object" || input === null) {
|
|
193
|
-
throw new Error("Expected object");
|
|
194
|
-
}
|
|
195
|
-
const obj = input as any;
|
|
196
|
-
if (typeof obj.host !== "string") {
|
|
197
|
-
throw new Error("host must be string");
|
|
198
|
-
}
|
|
199
|
-
if (typeof obj.port !== "number" || obj.port < 1 || obj.port > 65535) {
|
|
200
|
-
throw new Error("port must be number between 1-65535");
|
|
201
|
-
}
|
|
202
|
-
return obj;
|
|
203
|
-
});
|
|
204
|
-
|
|
205
|
-
const databaseResource = defineResource({
|
|
206
|
-
id: "resource.database",
|
|
207
|
-
configSchema: configSchema,
|
|
208
|
-
init: async (config) => {
|
|
209
|
-
return {
|
|
210
|
-
connect: () => `Connected to ${(config as any).host}:${(config as any).port}`,
|
|
211
|
-
};
|
|
212
|
-
},
|
|
213
|
-
});
|
|
214
|
-
|
|
215
|
-
// This should throw immediately when .with() is called, not during init
|
|
216
|
-
expect(() => {
|
|
217
|
-
databaseResource.with({
|
|
218
|
-
host: "localhost",
|
|
219
|
-
port: 99999, // Invalid: port too high
|
|
220
|
-
});
|
|
221
|
-
}).toThrow(/Resource config validation failed/);
|
|
222
|
-
});
|
|
223
|
-
|
|
224
|
-
it("should work with valid resource config", async () => {
|
|
225
|
-
const configSchema = mockSchema.object<{
|
|
226
|
-
host: string;
|
|
227
|
-
port: number;
|
|
228
|
-
}>({
|
|
229
|
-
host: "string",
|
|
230
|
-
port: "number",
|
|
231
|
-
});
|
|
232
|
-
|
|
233
|
-
const databaseResource = defineResource({
|
|
234
|
-
id: "resource.database.valid",
|
|
235
|
-
configSchema: configSchema,
|
|
236
|
-
init: async (config) => {
|
|
237
|
-
return {
|
|
238
|
-
connect: () => `Connected to ${(config as any).host}:${(config as any).port}`,
|
|
239
|
-
};
|
|
240
|
-
},
|
|
241
|
-
});
|
|
242
|
-
|
|
243
|
-
const app = defineResource({
|
|
244
|
-
id: "app",
|
|
245
|
-
register: [
|
|
246
|
-
databaseResource.with({
|
|
247
|
-
host: "localhost",
|
|
248
|
-
port: 5432,
|
|
249
|
-
}),
|
|
250
|
-
],
|
|
251
|
-
dependencies: { database: databaseResource },
|
|
252
|
-
init: async (_, { database }) => {
|
|
253
|
-
const result = database.connect();
|
|
254
|
-
expect(result).toBe("Connected to localhost:5432");
|
|
255
|
-
return result;
|
|
256
|
-
},
|
|
257
|
-
});
|
|
258
|
-
|
|
259
|
-
await run(app);
|
|
260
|
-
});
|
|
261
|
-
});
|
|
262
|
-
|
|
263
|
-
describe("Event Payload Validation", () => {
|
|
264
|
-
it("should validate event payload when emitted", async () => {
|
|
265
|
-
const payloadSchema = new MockValidationSchema((input: unknown) => {
|
|
266
|
-
if (typeof input !== "object" || input === null) {
|
|
267
|
-
throw new Error("Expected object");
|
|
268
|
-
}
|
|
269
|
-
const obj = input as any;
|
|
270
|
-
if (typeof obj.message !== "string") {
|
|
271
|
-
throw new Error("message must be string");
|
|
272
|
-
}
|
|
273
|
-
return obj;
|
|
274
|
-
});
|
|
275
|
-
|
|
276
|
-
const testEvent = defineEvent({
|
|
277
|
-
id: "event.test",
|
|
278
|
-
payloadSchema: payloadSchema,
|
|
279
|
-
});
|
|
280
|
-
|
|
281
|
-
let receivedMessage = "";
|
|
282
|
-
const listenerTask = defineTask({
|
|
283
|
-
id: "task.listener",
|
|
284
|
-
on: testEvent,
|
|
285
|
-
run: async (event) => {
|
|
286
|
-
receivedMessage = (event.data as any).message;
|
|
287
|
-
},
|
|
288
|
-
});
|
|
289
|
-
|
|
290
|
-
const app = defineResource({
|
|
291
|
-
id: "app",
|
|
292
|
-
register: [testEvent, listenerTask],
|
|
293
|
-
dependencies: { testEvent },
|
|
294
|
-
init: async (_, { testEvent }) => {
|
|
295
|
-
// This should work with valid payload
|
|
296
|
-
await testEvent({ message: "Hello World" });
|
|
297
|
-
expect(receivedMessage).toBe("Hello World");
|
|
298
|
-
|
|
299
|
-
// This should throw with invalid payload
|
|
300
|
-
await expect(testEvent({ invalidField: 123 } as any)).rejects.toThrow(/Event payload validation failed/);
|
|
301
|
-
},
|
|
302
|
-
});
|
|
303
|
-
|
|
304
|
-
await run(app);
|
|
305
|
-
});
|
|
306
|
-
});
|
|
307
|
-
|
|
308
|
-
describe("Middleware Config Validation", () => {
|
|
309
|
-
it("should validate middleware config when .with() is called (fail fast)", async () => {
|
|
310
|
-
const configSchema = new MockValidationSchema((input: unknown) => {
|
|
311
|
-
if (typeof input !== "object" || input === null) {
|
|
312
|
-
throw new Error("Expected object");
|
|
313
|
-
}
|
|
314
|
-
const obj = input as any;
|
|
315
|
-
if (typeof obj.timeout !== "number" || obj.timeout <= 0) {
|
|
316
|
-
throw new Error("timeout must be positive number");
|
|
317
|
-
}
|
|
318
|
-
return obj;
|
|
319
|
-
});
|
|
320
|
-
|
|
321
|
-
const timingMiddleware = defineMiddleware({
|
|
322
|
-
id: "middleware.timing",
|
|
323
|
-
configSchema: configSchema,
|
|
324
|
-
run: async ({ next }, _, config) => {
|
|
325
|
-
return next();
|
|
326
|
-
},
|
|
327
|
-
});
|
|
328
|
-
|
|
329
|
-
// This should throw immediately when .with() is called
|
|
330
|
-
expect(() => {
|
|
331
|
-
timingMiddleware.with({
|
|
332
|
-
timeout: -5, // Invalid: negative timeout
|
|
333
|
-
});
|
|
334
|
-
}).toThrow(/Middleware config validation failed/);
|
|
335
|
-
});
|
|
336
|
-
|
|
337
|
-
it("should work with valid middleware config", async () => {
|
|
338
|
-
const configSchema = mockSchema.object<{
|
|
339
|
-
timeout: number;
|
|
340
|
-
}>({
|
|
341
|
-
timeout: "number",
|
|
342
|
-
});
|
|
343
|
-
|
|
344
|
-
const timingMiddleware = defineMiddleware({
|
|
345
|
-
id: "middleware.timing.valid",
|
|
346
|
-
configSchema: configSchema,
|
|
347
|
-
run: async ({ next }, _, config) => {
|
|
348
|
-
const start = Date.now();
|
|
349
|
-
const result = await next();
|
|
350
|
-
const duration = Date.now() - start;
|
|
351
|
-
expect(typeof (config as any).timeout).toBe("number");
|
|
352
|
-
return result;
|
|
353
|
-
},
|
|
354
|
-
});
|
|
355
|
-
|
|
356
|
-
const testTask = defineTask({
|
|
357
|
-
id: "task.test",
|
|
358
|
-
middleware: [timingMiddleware.with({ timeout: 5000 })],
|
|
359
|
-
run: async () => {
|
|
360
|
-
return "success";
|
|
361
|
-
},
|
|
362
|
-
});
|
|
363
|
-
|
|
364
|
-
const app = defineResource({
|
|
365
|
-
id: "app",
|
|
366
|
-
register: [timingMiddleware, testTask],
|
|
367
|
-
dependencies: { testTask },
|
|
368
|
-
init: async (_, { testTask }) => {
|
|
369
|
-
const result = await testTask();
|
|
370
|
-
expect(result).toBe("success");
|
|
371
|
-
return result;
|
|
372
|
-
},
|
|
373
|
-
});
|
|
374
|
-
|
|
375
|
-
await run(app);
|
|
376
|
-
});
|
|
377
|
-
});
|
|
378
|
-
|
|
379
|
-
describe("No Validation (Backward Compatibility)", () => {
|
|
380
|
-
it("should work without any validation schemas", async () => {
|
|
381
|
-
const task = defineTask({
|
|
382
|
-
id: "task.noValidation",
|
|
383
|
-
run: async (input: any) => {
|
|
384
|
-
return `Received: ${JSON.stringify(input)}`;
|
|
385
|
-
},
|
|
386
|
-
});
|
|
387
|
-
|
|
388
|
-
const resource = defineResource({
|
|
389
|
-
id: "resource.noValidation",
|
|
390
|
-
init: async (config: any) => {
|
|
391
|
-
return { config };
|
|
392
|
-
},
|
|
393
|
-
});
|
|
394
|
-
|
|
395
|
-
const event = defineEvent<any>({
|
|
396
|
-
id: "event.noValidation",
|
|
397
|
-
});
|
|
398
|
-
|
|
399
|
-
const middleware = defineMiddleware({
|
|
400
|
-
id: "middleware.noValidation",
|
|
401
|
-
run: async ({ next }) => next(),
|
|
402
|
-
});
|
|
403
|
-
|
|
404
|
-
const app = defineResource({
|
|
405
|
-
id: "app",
|
|
406
|
-
register: [
|
|
407
|
-
task,
|
|
408
|
-
resource.with({ anything: "goes" }),
|
|
409
|
-
event,
|
|
410
|
-
middleware,
|
|
411
|
-
],
|
|
412
|
-
dependencies: { task, resource, event },
|
|
413
|
-
init: async (_, { task, resource, event }) => {
|
|
414
|
-
const taskResult = await task({ any: "data" });
|
|
415
|
-
expect(taskResult).toBe('Received: {"any":"data"}');
|
|
416
|
-
|
|
417
|
-
expect(resource.config.anything).toBe("goes");
|
|
418
|
-
|
|
419
|
-
await event({ any: "payload" }); // Should work without validation
|
|
420
|
-
|
|
421
|
-
return "success";
|
|
422
|
-
},
|
|
423
|
-
});
|
|
424
|
-
|
|
425
|
-
await run(app);
|
|
426
|
-
});
|
|
427
|
-
});
|
|
428
|
-
});
|
package/src/context.ts
DELETED
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
import { AsyncLocalStorage } from "async_hooks";
|
|
2
|
-
import { defineMiddleware } from "./define";
|
|
3
|
-
import { IMiddleware, IMiddlewareConfigured } from "./defs";
|
|
4
|
-
import { requireContextMiddleware } from "./globals/middleware/requireContext.middleware";
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Error thrown whenever a requested context is not available.
|
|
8
|
-
*/
|
|
9
|
-
export class ContextError extends Error {
|
|
10
|
-
constructor(message: string) {
|
|
11
|
-
super(message);
|
|
12
|
-
this.name = "ContextError";
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* The generic Context object returned by `createContext`.
|
|
18
|
-
*/
|
|
19
|
-
export interface Context<T> {
|
|
20
|
-
/** unique symbol used as key in the AsyncLocalStorage map */
|
|
21
|
-
readonly id: symbol;
|
|
22
|
-
/** Retrieve the current context value or throw */
|
|
23
|
-
use(): T;
|
|
24
|
-
/**
|
|
25
|
-
* Provide a value for this context during the lifetime of `fn()`
|
|
26
|
-
*/
|
|
27
|
-
provide<R>(value: T, fn: () => Promise<R> | R): Promise<R> | R;
|
|
28
|
-
/**
|
|
29
|
-
* Generates a middleware that guarantees the context exists (and optionally
|
|
30
|
-
* enforces that certain keys are present on the context object).
|
|
31
|
-
*/
|
|
32
|
-
require<K extends keyof T = never>(
|
|
33
|
-
keys?: K[]
|
|
34
|
-
): IMiddlewareConfigured<{ context: Context<T> }>;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
// The internal storage maps Context identifiers (symbols) to their values
|
|
38
|
-
export const storage = new AsyncLocalStorage<Map<symbol, unknown>>();
|
|
39
|
-
|
|
40
|
-
/** Returns the currently active store or undefined. */
|
|
41
|
-
function getCurrentStore(): Map<symbol, unknown> | undefined {
|
|
42
|
-
return storage.getStore();
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* Create a new typed Context. The result contains helpers similar to React’s
|
|
47
|
-
* Context API but adapted for async usage in Runner.
|
|
48
|
-
*/
|
|
49
|
-
export function createContext<T>(name: string = "runner.context"): Context<T> {
|
|
50
|
-
const ctxId = Symbol(name);
|
|
51
|
-
|
|
52
|
-
function use(): T {
|
|
53
|
-
const store = getCurrentStore();
|
|
54
|
-
if (!store || !store.has(ctxId)) {
|
|
55
|
-
throw new ContextError(
|
|
56
|
-
`Context not available for symbol ${ctxId.toString()}`
|
|
57
|
-
);
|
|
58
|
-
}
|
|
59
|
-
return store.get(ctxId) as T;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
function provide<R>(value: T, fn: () => Promise<R> | R): Promise<R> | R {
|
|
63
|
-
const currentStore = getCurrentStore();
|
|
64
|
-
const map = currentStore
|
|
65
|
-
? new Map(currentStore)
|
|
66
|
-
: new Map<symbol, unknown>();
|
|
67
|
-
map.set(ctxId, value);
|
|
68
|
-
|
|
69
|
-
return storage.run(map, fn as any);
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
/**
|
|
73
|
-
* Generates a middleware that guarantees the context exists (and optionally
|
|
74
|
-
* enforces that certain keys are present on the context object).
|
|
75
|
-
*/
|
|
76
|
-
function require(): IMiddlewareConfigured {
|
|
77
|
-
return requireContextMiddleware.with({ context: this as Context<T> });
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
return {
|
|
81
|
-
id: ctxId,
|
|
82
|
-
use,
|
|
83
|
-
provide,
|
|
84
|
-
require,
|
|
85
|
-
};
|
|
86
|
-
}
|