@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,63 +0,0 @@
|
|
|
1
|
-
import type { symbolMiddleware, symbolMiddlewareConfigured, symbolMiddlewareEverywhereTasks, symbolMiddlewareEverywhereResources } from './symbols';
|
|
2
|
-
import type { IMiddlewareMeta } from './metadata';
|
|
3
|
-
import type { DependencyMapType, DependencyValuesType } from './dependencies';
|
|
4
|
-
export type MiddlewareEverywhereOptions = {
|
|
5
|
-
/**
|
|
6
|
-
* Enable this for tasks. Default is true.
|
|
7
|
-
*/
|
|
8
|
-
tasks?: boolean;
|
|
9
|
-
/**
|
|
10
|
-
* Enable this for resources. Default is true.
|
|
11
|
-
*/
|
|
12
|
-
resources?: boolean;
|
|
13
|
-
};
|
|
14
|
-
export interface IMiddlewareDefinition<TConfig = any, TDependencies extends DependencyMapType = any> {
|
|
15
|
-
/** Stable identifier. Omit to get an anonymous id. */
|
|
16
|
-
id?: string | symbol;
|
|
17
|
-
/** Static or lazy dependency map. */
|
|
18
|
-
dependencies?: TDependencies | ((config: TConfig) => TDependencies);
|
|
19
|
-
/**
|
|
20
|
-
* The middleware body, called with task/resource execution input.
|
|
21
|
-
*/
|
|
22
|
-
run: (input: IMiddlewareExecutionInput, dependencies: DependencyValuesType<TDependencies>, config: TConfig) => Promise<any>;
|
|
23
|
-
meta?: IMiddlewareMeta;
|
|
24
|
-
}
|
|
25
|
-
export interface IMiddleware<TConfig = any, TDependencies extends DependencyMapType = any> extends IMiddlewareDefinition<TConfig, TDependencies> {
|
|
26
|
-
[symbolMiddleware]: true;
|
|
27
|
-
[symbolMiddlewareConfigured]?: boolean;
|
|
28
|
-
[symbolMiddlewareEverywhereTasks]?: boolean;
|
|
29
|
-
[symbolMiddlewareEverywhereResources]?: boolean;
|
|
30
|
-
id: string | symbol;
|
|
31
|
-
dependencies: TDependencies | (() => TDependencies);
|
|
32
|
-
/**
|
|
33
|
-
* Attach this middleware globally. Use options to scope to tasks/resources.
|
|
34
|
-
*/
|
|
35
|
-
everywhere(config?: MiddlewareEverywhereOptions): IMiddleware<TConfig, TDependencies>;
|
|
36
|
-
/** Current configuration object (empty by default). */
|
|
37
|
-
config: TConfig;
|
|
38
|
-
/** Configure the middleware and return a marked, configured instance. */
|
|
39
|
-
with: (config: TConfig) => IMiddlewareConfigured<TConfig, TDependencies>;
|
|
40
|
-
}
|
|
41
|
-
export interface IMiddlewareConfigured<TConfig = any, TDependencies extends DependencyMapType = any> extends IMiddleware<TConfig, TDependencies> {
|
|
42
|
-
[symbolMiddlewareConfigured]: true;
|
|
43
|
-
}
|
|
44
|
-
export interface IMiddlewareDefinitionConfigured<C extends Record<string, any> = {}> {
|
|
45
|
-
middleware: IMiddleware<C>;
|
|
46
|
-
config?: C;
|
|
47
|
-
}
|
|
48
|
-
export interface IMiddlewareExecutionInput<TTaskInput = any, TResourceConfig = any> {
|
|
49
|
-
/** Task hook: present when wrapping a task run. */
|
|
50
|
-
task?: {
|
|
51
|
-
definition: any;
|
|
52
|
-
input: TTaskInput;
|
|
53
|
-
};
|
|
54
|
-
/** Resource hook: present when wrapping init/dispose. */
|
|
55
|
-
resource?: {
|
|
56
|
-
definition: any;
|
|
57
|
-
config: TResourceConfig;
|
|
58
|
-
};
|
|
59
|
-
next: (taskInputOrResourceConfig?: TTaskInput | TResourceConfig) => Promise<any>;
|
|
60
|
-
}
|
|
61
|
-
export type MiddlewareAttachments = IMiddleware<void> | IMiddleware<{
|
|
62
|
-
[K in any]?: any;
|
|
63
|
-
}> | IMiddlewareConfigured<any>;
|
package/dist/types/middleware.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../src/types/middleware.ts"],"names":[],"mappings":""}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import type { IsVoid, OnlyOptionalFields } from './utilities';
|
|
2
|
-
import type { IResourceWithConfig } from './resources';
|
|
3
|
-
import type { IResource } from './resources';
|
|
4
|
-
import type { ITaskDefinition } from './tasks';
|
|
5
|
-
import type { IMiddlewareDefinition } from './middleware';
|
|
6
|
-
import type { IEventDefinition } from './events';
|
|
7
|
-
export type RegisterableItems<T = any> = IResourceWithConfig<any> | IResource<void, any, any, any> | IResource<{
|
|
8
|
-
[K in any]?: any;
|
|
9
|
-
}, any, any, any> | ITaskDefinition<any, any, any, any> | IMiddlewareDefinition<any> | IEventDefinition<any>;
|
|
10
|
-
export type ValidateRegisterable<T> = T extends IResource<infer Config, any, any, any> ? IsVoid<Config> extends true ? T : OnlyOptionalFields<Config> extends true ? T : never : T;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"registerable.js","sourceRoot":"","sources":["../../src/types/registerable.ts"],"names":[],"mappings":";AAAA,kDAAkD;AAClD,+DAA+D"}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import type { IResourceMeta } from './meta';
|
|
2
|
-
import type { DependencyMapType, DependencyValuesType } from './dependency-core';
|
|
3
|
-
import type { IEventDefinition, BeforeInitEventPayload, AfterInitEventPayload, OnErrorEventPayload } from './events';
|
|
4
|
-
import type { IMiddleware } from './middleware';
|
|
5
|
-
import type { ITask } from './tasks';
|
|
6
|
-
import type { MiddlewareAttachments } from './tasks';
|
|
7
|
-
export interface IResourceDefinition<TConfig = any, TValue = unknown, TDependencies extends DependencyMapType = {}, TContext = any, THooks = any, TRegisterableItems = any> {
|
|
8
|
-
id: string;
|
|
9
|
-
dependencies?: TDependencies | ((config: TConfig) => TDependencies);
|
|
10
|
-
register?: Array<any> | ((config: TConfig) => Array<any>);
|
|
11
|
-
init?: (this: any, config: TConfig, dependencies: DependencyValuesType<TDependencies>, context: TContext) => Promise<TValue>;
|
|
12
|
-
/**
|
|
13
|
-
* Clean-up function for the resource. This is called when the resource is no longer needed.
|
|
14
|
-
*
|
|
15
|
-
* @param value The value of the resource (undefined if no init method)
|
|
16
|
-
* @param config The configuration it received
|
|
17
|
-
* @param dependencies The dependencies it needed
|
|
18
|
-
* @returns Promise<void>
|
|
19
|
-
*/
|
|
20
|
-
dispose?: (this: any, value: TValue, config: TConfig, dependencies: DependencyValuesType<TDependencies>, context: TContext) => Promise<void>;
|
|
21
|
-
meta?: IResourceMeta;
|
|
22
|
-
overrides?: Array<IResource | ITask | IMiddleware | IResourceWithConfig>;
|
|
23
|
-
middleware?: MiddlewareAttachments[];
|
|
24
|
-
context?: () => TContext;
|
|
25
|
-
}
|
|
26
|
-
export interface IResource<TConfig = void, TValue = any, TDependencies extends DependencyMapType = any, TContext = any> extends IResourceDefinition<TConfig, TValue, TDependencies, TContext> {
|
|
27
|
-
with(config: TConfig): IResourceWithConfig<TConfig, TValue, TDependencies>;
|
|
28
|
-
register: Array<any> | ((config: TConfig) => Array<any>);
|
|
29
|
-
/**
|
|
30
|
-
* These events are automatically populated after the task has been defined.
|
|
31
|
-
*/
|
|
32
|
-
events: {
|
|
33
|
-
beforeInit: IEventDefinition<BeforeInitEventPayload<TConfig>>;
|
|
34
|
-
afterInit: IEventDefinition<AfterInitEventPayload<TConfig, TValue>>;
|
|
35
|
-
onError: IEventDefinition<OnErrorEventPayload>;
|
|
36
|
-
};
|
|
37
|
-
overrides: Array<IResource | ITask | IMiddleware | IResourceWithConfig>;
|
|
38
|
-
middleware: MiddlewareAttachments[];
|
|
39
|
-
}
|
|
40
|
-
export interface IResourceWithConfig<TConfig = any, TValue = any, TDependencies extends DependencyMapType = any> {
|
|
41
|
-
id: string;
|
|
42
|
-
resource: IResource<TConfig, TValue, TDependencies>;
|
|
43
|
-
config: TConfig;
|
|
44
|
-
}
|
package/dist/types/resources.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"resources.js","sourceRoot":"","sources":["../../src/types/resources.ts"],"names":[],"mappings":";AAAA,6CAA6C;AAC7C,gDAAgD"}
|
package/dist/types/tasks.d.ts
DELETED
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import type { ITaskMeta } from './meta';
|
|
2
|
-
import type { DependencyMapType, DependencyValuesType } from './dependency-core';
|
|
3
|
-
import type { IEventDefinition, IEvent, BeforeRunEventPayload, AfterRunEventPayload, OnErrorEventPayload } from './events';
|
|
4
|
-
import type { IMiddleware, IMiddlewareConfigured } from './middleware';
|
|
5
|
-
type ExtractEventParams<T> = T extends IEventDefinition<infer P> ? P : never;
|
|
6
|
-
export type MiddlewareAttachments = IMiddleware<void> | IMiddleware<{
|
|
7
|
-
[K in any]?: any;
|
|
8
|
-
}> | IMiddlewareConfigured<any>;
|
|
9
|
-
export interface ITaskDefinition<TInput = any, TOutput extends Promise<any> = any, TDependencies extends DependencyMapType = {}, TOn extends "*" | IEventDefinition<any> | undefined = undefined> {
|
|
10
|
-
id: string;
|
|
11
|
-
dependencies?: TDependencies | (() => TDependencies);
|
|
12
|
-
middleware?: MiddlewareAttachments[];
|
|
13
|
-
/**
|
|
14
|
-
* Listen to events in a simple way
|
|
15
|
-
*/
|
|
16
|
-
on?: TOn;
|
|
17
|
-
/**
|
|
18
|
-
* This makes sense only when `on` is specified to provide the order of the execution.
|
|
19
|
-
* The event with the lowest order will be executed first.
|
|
20
|
-
*/
|
|
21
|
-
listenerOrder?: number;
|
|
22
|
-
meta?: ITaskMeta;
|
|
23
|
-
run: (input: TOn extends undefined ? TInput : IEvent<TOn extends "*" ? any : ExtractEventParams<TOn>>, dependencies: DependencyValuesType<TDependencies>) => TOutput;
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* Task Interface (replaces forward declaration) - This is the response after the definition has been prepared. TODO: better naming?
|
|
27
|
-
*/
|
|
28
|
-
export interface ITask<TInput = any, TOutput extends Promise<any> = any, TDependencies extends DependencyMapType = {}, TOn extends "*" | IEventDefinition<any> | undefined = undefined> extends ITaskDefinition<TInput, TOutput, TDependencies, TOn> {
|
|
29
|
-
dependencies: TDependencies | (() => TDependencies);
|
|
30
|
-
computedDependencies?: DependencyValuesType<TDependencies>;
|
|
31
|
-
middleware: MiddlewareAttachments[];
|
|
32
|
-
/**
|
|
33
|
-
* These events are automatically populated after the task has been defined.
|
|
34
|
-
*/
|
|
35
|
-
events: {
|
|
36
|
-
beforeRun: IEventDefinition<BeforeRunEventPayload<TInput>>;
|
|
37
|
-
afterRun: IEventDefinition<AfterRunEventPayload<TInput, TOutput>>;
|
|
38
|
-
onError: IEventDefinition<OnErrorEventPayload>;
|
|
39
|
-
};
|
|
40
|
-
}
|
|
41
|
-
export {};
|
package/dist/types/tasks.js
DELETED
package/dist/types/tasks.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../src/types/tasks.ts"],"names":[],"mappings":";AAAA,yCAAyC;AACzC,gDAAgD"}
|
|
@@ -1,148 +0,0 @@
|
|
|
1
|
-
import * as Benchmark from "benchmark";
|
|
2
|
-
import {
|
|
3
|
-
defineTask,
|
|
4
|
-
defineResource,
|
|
5
|
-
defineEvent,
|
|
6
|
-
defineMiddleware,
|
|
7
|
-
} from "../../define";
|
|
8
|
-
import { run } from "../../run";
|
|
9
|
-
|
|
10
|
-
describe.skip("Benchmarks", () => {
|
|
11
|
-
let suite: Benchmark.Suite;
|
|
12
|
-
|
|
13
|
-
beforeEach(() => {
|
|
14
|
-
suite = new Benchmark.Suite();
|
|
15
|
-
});
|
|
16
|
-
|
|
17
|
-
it("should benchmark task execution", (done) => {
|
|
18
|
-
const testTask = defineTask({
|
|
19
|
-
id: "test.task",
|
|
20
|
-
run: async () => "Hello, World!",
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
const app = defineResource({
|
|
24
|
-
id: "app",
|
|
25
|
-
dependencies: { testTask },
|
|
26
|
-
register: [testTask],
|
|
27
|
-
async init(_, { testTask }) {
|
|
28
|
-
await testTask();
|
|
29
|
-
},
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
suite.add("Task Execution", {
|
|
33
|
-
defer: true,
|
|
34
|
-
fn: (deferred: { resolve: () => void }) => {
|
|
35
|
-
run(app).then(() => deferred.resolve());
|
|
36
|
-
},
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
suite.on("complete", function () {
|
|
40
|
-
console.log("Task Execution:", this[0].hz.toFixed(2), "ops/sec");
|
|
41
|
-
done();
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
suite.run({ async: true });
|
|
45
|
-
});
|
|
46
|
-
|
|
47
|
-
it("should benchmark resource initialization", (done) => {
|
|
48
|
-
const testResource = defineResource({
|
|
49
|
-
id: "test.resource",
|
|
50
|
-
init: async () => "Resource Value",
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
const app = defineResource({
|
|
54
|
-
id: "app",
|
|
55
|
-
register: [testResource],
|
|
56
|
-
dependencies: { testResource },
|
|
57
|
-
async init(_, { testResource }) {
|
|
58
|
-
expect(testResource).toBe("Resource Value");
|
|
59
|
-
},
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
suite.add("Resource Initialization", {
|
|
63
|
-
defer: true,
|
|
64
|
-
fn: (deferred: { resolve: () => void }) => {
|
|
65
|
-
run(app).then(() => deferred.resolve());
|
|
66
|
-
},
|
|
67
|
-
});
|
|
68
|
-
|
|
69
|
-
suite.on("complete", function () {
|
|
70
|
-
console.log("Resource Initialization:", this[0].hz.toFixed(2), "ops/sec");
|
|
71
|
-
done();
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
suite.run({ async: true });
|
|
75
|
-
});
|
|
76
|
-
|
|
77
|
-
it("should benchmark event emission", (done) => {
|
|
78
|
-
const testEvent = defineEvent<{ message: string }>({ id: "test.event" });
|
|
79
|
-
const eventHandler = jest.fn();
|
|
80
|
-
|
|
81
|
-
const handlerTask = defineTask({
|
|
82
|
-
id: "handler.task",
|
|
83
|
-
on: testEvent,
|
|
84
|
-
run: async ({ data }) => {
|
|
85
|
-
eventHandler(data.message);
|
|
86
|
-
},
|
|
87
|
-
});
|
|
88
|
-
|
|
89
|
-
const app = defineResource({
|
|
90
|
-
id: "app",
|
|
91
|
-
register: [testEvent, handlerTask],
|
|
92
|
-
dependencies: { testEvent },
|
|
93
|
-
async init(_, { testEvent }) {
|
|
94
|
-
await testEvent({ message: "Event emitted" });
|
|
95
|
-
},
|
|
96
|
-
});
|
|
97
|
-
|
|
98
|
-
suite.add("Event Emission", {
|
|
99
|
-
defer: true,
|
|
100
|
-
fn: (deferred: { resolve: () => void }) => {
|
|
101
|
-
run(app).then(() => deferred.resolve());
|
|
102
|
-
},
|
|
103
|
-
});
|
|
104
|
-
|
|
105
|
-
suite.on("complete", function () {
|
|
106
|
-
console.log("Event Emission:", this[0].hz.toFixed(2), "ops/sec");
|
|
107
|
-
done();
|
|
108
|
-
});
|
|
109
|
-
|
|
110
|
-
suite.run({ async: true });
|
|
111
|
-
});
|
|
112
|
-
|
|
113
|
-
it("should benchmark dependency resolution", (done) => {
|
|
114
|
-
const dep1 = defineResource({
|
|
115
|
-
id: "dep1",
|
|
116
|
-
init: async () => "Dep1 Value",
|
|
117
|
-
});
|
|
118
|
-
|
|
119
|
-
const dep2 = defineResource({
|
|
120
|
-
id: "dep2",
|
|
121
|
-
dependencies: { dep1 },
|
|
122
|
-
init: async (_, { dep1 }) => `Dep2 Value: ${dep1}`,
|
|
123
|
-
});
|
|
124
|
-
|
|
125
|
-
const app = defineResource({
|
|
126
|
-
id: "app",
|
|
127
|
-
register: [dep1, dep2],
|
|
128
|
-
dependencies: { dep2 },
|
|
129
|
-
async init(_, { dep2 }) {
|
|
130
|
-
expect(dep2).toBe("Dep2 Value: Dep1 Value");
|
|
131
|
-
},
|
|
132
|
-
});
|
|
133
|
-
|
|
134
|
-
suite.add("Dependency Resolution", {
|
|
135
|
-
defer: true,
|
|
136
|
-
fn: (deferred: { resolve: () => void }) => {
|
|
137
|
-
run(app).then(() => deferred.resolve());
|
|
138
|
-
},
|
|
139
|
-
});
|
|
140
|
-
|
|
141
|
-
suite.on("complete", function () {
|
|
142
|
-
console.log("Dependency Resolution:", this[0].hz.toFixed(2), "ops/sec");
|
|
143
|
-
done();
|
|
144
|
-
});
|
|
145
|
-
|
|
146
|
-
suite.run({ async: true });
|
|
147
|
-
});
|
|
148
|
-
});
|
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
import { defineTask, defineResource, defineMiddleware } from "../../define";
|
|
2
|
-
import { run } from "../../run";
|
|
3
|
-
|
|
4
|
-
// Benchmarks are environment-sensitive; keep skipped by default.
|
|
5
|
-
describe("Task benchmarks - sync vs async", () => {
|
|
6
|
-
const iterations = 500;
|
|
7
|
-
|
|
8
|
-
it("compares sync vs async task execution without middleware", async () => {
|
|
9
|
-
const syncTask = defineTask<number, any>({
|
|
10
|
-
id: "bench.syncTask",
|
|
11
|
-
// Intentionally synchronous
|
|
12
|
-
run: ((n: number) => {
|
|
13
|
-
let acc = 0;
|
|
14
|
-
for (let i = 0; i < 200; i++) acc += (n + i) % 7;
|
|
15
|
-
return acc;
|
|
16
|
-
}) as any,
|
|
17
|
-
} as any);
|
|
18
|
-
|
|
19
|
-
const asyncTask = defineTask<number, Promise<number>>({
|
|
20
|
-
id: "bench.asyncTask",
|
|
21
|
-
run: async (n: number) => {
|
|
22
|
-
let acc = 0;
|
|
23
|
-
for (let i = 0; i < 200; i++) acc += (n + i) % 7;
|
|
24
|
-
return acc;
|
|
25
|
-
},
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
const app = defineResource({
|
|
29
|
-
id: "bench.app",
|
|
30
|
-
register: [syncTask, asyncTask],
|
|
31
|
-
dependencies: { syncTask, asyncTask },
|
|
32
|
-
async init(_, { syncTask, asyncTask }) {
|
|
33
|
-
// Warm-up
|
|
34
|
-
await asyncTask(0);
|
|
35
|
-
await syncTask(0 as any);
|
|
36
|
-
|
|
37
|
-
const syncStart = performance.now();
|
|
38
|
-
for (let i = 0; i < iterations; i++) {
|
|
39
|
-
// Note: sync path still awaited at the TaskRunner boundary
|
|
40
|
-
await syncTask(i as any);
|
|
41
|
-
}
|
|
42
|
-
const syncTime = performance.now() - syncStart;
|
|
43
|
-
|
|
44
|
-
const asyncStart = performance.now();
|
|
45
|
-
for (let i = 0; i < iterations; i++) {
|
|
46
|
-
await asyncTask(i);
|
|
47
|
-
}
|
|
48
|
-
const asyncTime = performance.now() - asyncStart;
|
|
49
|
-
|
|
50
|
-
// Log metrics for manual inspection
|
|
51
|
-
// eslint-disable-next-line no-console
|
|
52
|
-
console.log(
|
|
53
|
-
`Task benchmark (iterations=${iterations}) -> sync: ${syncTime.toFixed(
|
|
54
|
-
2
|
|
55
|
-
)}ms, async: ${asyncTime.toFixed(2)}ms`
|
|
56
|
-
);
|
|
57
|
-
},
|
|
58
|
-
});
|
|
59
|
-
|
|
60
|
-
const { dispose } = await run(app);
|
|
61
|
-
await dispose();
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
it("compares with a chain of pass-through middlewares", async () => {
|
|
65
|
-
const chainLength = 10;
|
|
66
|
-
|
|
67
|
-
const middlewares = Array.from({ length: chainLength }, (_, idx) =>
|
|
68
|
-
defineMiddleware({
|
|
69
|
-
id: `mw.${idx}`,
|
|
70
|
-
// Return the result of next() directly; no extra async wrapper here
|
|
71
|
-
run: ({ next }: any) => next(),
|
|
72
|
-
})
|
|
73
|
-
);
|
|
74
|
-
|
|
75
|
-
const syncTask = defineTask<number, any>({
|
|
76
|
-
id: "bench.syncTask.withMw",
|
|
77
|
-
middleware: middlewares,
|
|
78
|
-
// Intentionally synchronous
|
|
79
|
-
run: ((n: number) => {
|
|
80
|
-
let acc = 0;
|
|
81
|
-
for (let i = 0; i < 200; i++) acc += (n + i) % 7;
|
|
82
|
-
return acc;
|
|
83
|
-
}) as any,
|
|
84
|
-
} as any);
|
|
85
|
-
|
|
86
|
-
const asyncTask = defineTask<number, Promise<number>>({
|
|
87
|
-
id: "bench.asyncTask.withMw",
|
|
88
|
-
middleware: middlewares,
|
|
89
|
-
run: async (n: number) => {
|
|
90
|
-
let acc = 0;
|
|
91
|
-
for (let i = 0; i < 200; i++) acc += (n + i) % 7;
|
|
92
|
-
return acc;
|
|
93
|
-
},
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
const app = defineResource({
|
|
97
|
-
id: "bench.app.mw",
|
|
98
|
-
register: [...middlewares, syncTask, asyncTask],
|
|
99
|
-
dependencies: { syncTask, asyncTask },
|
|
100
|
-
async init(_, { syncTask, asyncTask }) {
|
|
101
|
-
// Warm-up
|
|
102
|
-
await asyncTask(0);
|
|
103
|
-
await syncTask(0 as any);
|
|
104
|
-
|
|
105
|
-
const iters = 5000;
|
|
106
|
-
const t0 = process.hrtime.bigint();
|
|
107
|
-
for (let i = 0; i < iters; i++) {
|
|
108
|
-
await syncTask(i as any);
|
|
109
|
-
}
|
|
110
|
-
const t1 = process.hrtime.bigint();
|
|
111
|
-
const syncNs = Number(t1 - t0);
|
|
112
|
-
|
|
113
|
-
const t2 = process.hrtime.bigint();
|
|
114
|
-
for (let i = 0; i < iters; i++) {
|
|
115
|
-
await asyncTask(i);
|
|
116
|
-
}
|
|
117
|
-
const t3 = process.hrtime.bigint();
|
|
118
|
-
const asyncNs = Number(t3 - t2);
|
|
119
|
-
|
|
120
|
-
// eslint-disable-next-line no-console
|
|
121
|
-
console.log(
|
|
122
|
-
`Task benchmark with ${chainLength} middlewares (iterations=${iters}) -> sync: ${(
|
|
123
|
-
syncNs / 1e6
|
|
124
|
-
).toFixed(2)}ms, async: ${(asyncNs / 1e6).toFixed(2)}ms`
|
|
125
|
-
);
|
|
126
|
-
},
|
|
127
|
-
});
|
|
128
|
-
|
|
129
|
-
const { dispose } = await run(app);
|
|
130
|
-
await dispose();
|
|
131
|
-
});
|
|
132
|
-
});
|
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
import { createContext, task, run, resource } from "../index";
|
|
2
|
-
import { ContextError } from "../context";
|
|
3
|
-
|
|
4
|
-
describe("Context System", () => {
|
|
5
|
-
const TestContext = createContext<{ id: string }>();
|
|
6
|
-
|
|
7
|
-
test("useContext throws when missing", async () => {
|
|
8
|
-
const r = resource({
|
|
9
|
-
id: "test.context.use",
|
|
10
|
-
init: async () => TestContext.use(),
|
|
11
|
-
});
|
|
12
|
-
|
|
13
|
-
await expect(run(r)).rejects.toThrow(ContextError);
|
|
14
|
-
|
|
15
|
-
await TestContext.provide({ id: "1" }, async () => {
|
|
16
|
-
await expect(run(r)).resolves.toEqual({
|
|
17
|
-
value: { id: "1" },
|
|
18
|
-
dispose: expect.any(Function),
|
|
19
|
-
});
|
|
20
|
-
});
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
test("require middleware blocks missing context", async () => {
|
|
24
|
-
const t = task({
|
|
25
|
-
id: "task",
|
|
26
|
-
middleware: [TestContext.require()],
|
|
27
|
-
run: async () => "ok",
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
const r = resource({
|
|
31
|
-
id: "resource",
|
|
32
|
-
register: [t],
|
|
33
|
-
dependencies: { t },
|
|
34
|
-
init: async (_, deps) => deps.t(),
|
|
35
|
-
});
|
|
36
|
-
await expect(run(r)).rejects.toThrow(ContextError);
|
|
37
|
-
|
|
38
|
-
await TestContext.provide({ id: "1" }, async () => {
|
|
39
|
-
await expect(run(r)).resolves.toEqual({
|
|
40
|
-
value: "ok",
|
|
41
|
-
dispose: expect.any(Function),
|
|
42
|
-
});
|
|
43
|
-
});
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
test("concurrent provide calls are isolated", async () => {
|
|
47
|
-
const results: string[] = [];
|
|
48
|
-
|
|
49
|
-
const promises = [
|
|
50
|
-
TestContext.provide({ id: "user-1" }, async () => {
|
|
51
|
-
await new Promise((resolve) => setTimeout(resolve, 10)); // small delay
|
|
52
|
-
const context = TestContext.use();
|
|
53
|
-
results.push(context.id);
|
|
54
|
-
return context.id;
|
|
55
|
-
}),
|
|
56
|
-
TestContext.provide({ id: "user-2" }, async () => {
|
|
57
|
-
await new Promise((resolve) => setTimeout(resolve, 5)); // smaller delay
|
|
58
|
-
const context = TestContext.use();
|
|
59
|
-
results.push(context.id);
|
|
60
|
-
return context.id;
|
|
61
|
-
}),
|
|
62
|
-
];
|
|
63
|
-
|
|
64
|
-
const values = await Promise.all(promises);
|
|
65
|
-
|
|
66
|
-
// Each context should maintain its own value
|
|
67
|
-
expect(values).toEqual(["user-1", "user-2"]);
|
|
68
|
-
expect(results).toEqual(["user-2", "user-1"]); // user-2 finishes first due to shorter delay
|
|
69
|
-
});
|
|
70
|
-
|
|
71
|
-
test("nested provide calls work correctly", async () => {
|
|
72
|
-
const result = await TestContext.provide({ id: "outer" }, async () => {
|
|
73
|
-
const outer = TestContext.use();
|
|
74
|
-
|
|
75
|
-
const inner = await TestContext.provide({ id: "inner" }, async () => {
|
|
76
|
-
return TestContext.use();
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
const afterInner = TestContext.use();
|
|
80
|
-
|
|
81
|
-
return { outer: outer.id, inner: inner.id, afterInner: afterInner.id };
|
|
82
|
-
});
|
|
83
|
-
|
|
84
|
-
// Outer context should be restored after inner provide completes
|
|
85
|
-
expect(result).toEqual({
|
|
86
|
-
outer: "outer",
|
|
87
|
-
inner: "inner",
|
|
88
|
-
afterInner: "outer", // This should be restored!
|
|
89
|
-
});
|
|
90
|
-
});
|
|
91
|
-
});
|