@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
package/src/define.ts
DELETED
|
@@ -1,480 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Factory functions for defining tasks, resources, events and middleware.
|
|
3
|
-
*
|
|
4
|
-
* These helpers create strongly-typed definitions while also wiring internal
|
|
5
|
-
* metadata: anonymous IDs, file path tags (for better debugging), lifecycle
|
|
6
|
-
* events, and global middleware flags. See README for high-level concepts.
|
|
7
|
-
*/
|
|
8
|
-
import {
|
|
9
|
-
ITask,
|
|
10
|
-
ITaskDefinition,
|
|
11
|
-
IResource,
|
|
12
|
-
IResourceWithConfig,
|
|
13
|
-
IResourceDefinition,
|
|
14
|
-
IEventDefinition,
|
|
15
|
-
IMiddlewareDefinition,
|
|
16
|
-
DependencyMapType,
|
|
17
|
-
DependencyValuesType,
|
|
18
|
-
IMiddleware,
|
|
19
|
-
IEvent,
|
|
20
|
-
symbolEvent,
|
|
21
|
-
RegisterableItems,
|
|
22
|
-
symbolMiddlewareConfigured,
|
|
23
|
-
symbolFilePath,
|
|
24
|
-
symbolIndexResource,
|
|
25
|
-
ITag,
|
|
26
|
-
ITagDefinition,
|
|
27
|
-
ITagWithConfig,
|
|
28
|
-
TagType,
|
|
29
|
-
ITaggable,
|
|
30
|
-
symbolTask,
|
|
31
|
-
symbolMiddlewareEverywhereTasks,
|
|
32
|
-
symbolMiddlewareEverywhereResources,
|
|
33
|
-
symbolResourceWithConfig,
|
|
34
|
-
symbolResource,
|
|
35
|
-
symbolMiddleware,
|
|
36
|
-
ITaskMeta,
|
|
37
|
-
IResourceMeta,
|
|
38
|
-
} from "./defs";
|
|
39
|
-
import { MiddlewareAlreadyGlobalError, ValidationError } from "./errors";
|
|
40
|
-
import { generateCallerIdFromFile, getCallerFile } from "./tools/getCallerFile";
|
|
41
|
-
|
|
42
|
-
// Helper function to get the caller file
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
* Define a task.
|
|
46
|
-
* Generates a strongly-typed task object with id, lifecycle events, dependencies,
|
|
47
|
-
* middleware, and metadata.
|
|
48
|
-
*
|
|
49
|
-
* - If `id` is omitted, an anonymous, file-based id is generated.
|
|
50
|
-
* - Wires lifecycle events: `beforeRun`, `afterRun`, `onError`.
|
|
51
|
-
* - Carries through dependencies, middleware, input schema, and metadata.
|
|
52
|
-
*
|
|
53
|
-
* @typeParam Input - Input type accepted by the task's `run` function.
|
|
54
|
-
* @typeParam Output - Promise type returned by the `run` function.
|
|
55
|
-
* @typeParam Deps - Dependency map type this task requires.
|
|
56
|
-
* @typeParam TOn - Event type or "*" this task listens to.
|
|
57
|
-
* @typeParam TMeta - Arbitrary metadata type carried by the task.
|
|
58
|
-
* @param taskConfig - The task definition config.
|
|
59
|
-
* @returns A branded task definition usable by the runner.
|
|
60
|
-
*/
|
|
61
|
-
export function defineTask<
|
|
62
|
-
Input = undefined,
|
|
63
|
-
Output extends Promise<any> = any,
|
|
64
|
-
Deps extends DependencyMapType = any,
|
|
65
|
-
TOn extends "*" | IEventDefinition | undefined = undefined,
|
|
66
|
-
TMeta extends ITaskMeta = any
|
|
67
|
-
>(
|
|
68
|
-
taskConfig: ITaskDefinition<Input, Output, Deps, TOn, TMeta>
|
|
69
|
-
): ITask<Input, Output, Deps, TOn, TMeta> {
|
|
70
|
-
const filePath = getCallerFile();
|
|
71
|
-
const isAnonymous = !Boolean(taskConfig.id);
|
|
72
|
-
const id = taskConfig.id || generateCallerIdFromFile(filePath, "task");
|
|
73
|
-
return {
|
|
74
|
-
[symbolTask]: true,
|
|
75
|
-
[symbolFilePath]: filePath,
|
|
76
|
-
id,
|
|
77
|
-
dependencies: taskConfig.dependencies || ({} as Deps),
|
|
78
|
-
middleware: taskConfig.middleware || [],
|
|
79
|
-
run: taskConfig.run,
|
|
80
|
-
on: taskConfig.on,
|
|
81
|
-
listenerOrder: taskConfig.listenerOrder,
|
|
82
|
-
inputSchema: taskConfig.inputSchema,
|
|
83
|
-
events: {
|
|
84
|
-
beforeRun: {
|
|
85
|
-
...defineEvent({
|
|
86
|
-
id: isAnonymous
|
|
87
|
-
? Symbol(`anonymous-task.events.beforeRun`)
|
|
88
|
-
: `${id as string}.events.beforeRun`,
|
|
89
|
-
}),
|
|
90
|
-
[symbolFilePath]: getCallerFile(),
|
|
91
|
-
},
|
|
92
|
-
afterRun: {
|
|
93
|
-
...defineEvent({
|
|
94
|
-
id: isAnonymous
|
|
95
|
-
? Symbol(`anonymous-task.events.afterRun`)
|
|
96
|
-
: `${id as string}.events.afterRun`,
|
|
97
|
-
}),
|
|
98
|
-
[symbolFilePath]: getCallerFile(),
|
|
99
|
-
},
|
|
100
|
-
onError: {
|
|
101
|
-
...defineEvent({
|
|
102
|
-
id: isAnonymous
|
|
103
|
-
? Symbol(`anonymous-task.events.onError`)
|
|
104
|
-
: `${id as string}.events.onError`,
|
|
105
|
-
}),
|
|
106
|
-
[symbolFilePath]: getCallerFile(),
|
|
107
|
-
},
|
|
108
|
-
},
|
|
109
|
-
meta: taskConfig.meta || ({} as TMeta),
|
|
110
|
-
// autorun,
|
|
111
|
-
};
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
export function defineResource<
|
|
115
|
-
TConfig = void,
|
|
116
|
-
TValue extends Promise<any> = Promise<any>,
|
|
117
|
-
TDeps extends DependencyMapType = {},
|
|
118
|
-
TPrivate = any,
|
|
119
|
-
TMeta extends IResourceMeta = any
|
|
120
|
-
>(
|
|
121
|
-
constConfig: IResourceDefinition<
|
|
122
|
-
TConfig,
|
|
123
|
-
TValue,
|
|
124
|
-
TDeps,
|
|
125
|
-
TPrivate,
|
|
126
|
-
any,
|
|
127
|
-
any,
|
|
128
|
-
TMeta
|
|
129
|
-
>
|
|
130
|
-
): IResource<TConfig, TValue, TDeps, TPrivate, TMeta> {
|
|
131
|
-
/**
|
|
132
|
-
* Define a resource.
|
|
133
|
-
* Produces a strongly-typed resource with id, lifecycle events, registration hooks,
|
|
134
|
-
* and optional config schema.
|
|
135
|
-
*
|
|
136
|
-
* - If `id` is omitted, an anonymous, file-based id is generated (resource or index flavored).
|
|
137
|
-
* - Wires lifecycle events: `beforeInit`, `afterInit`, `onError`.
|
|
138
|
-
* - Provides `.with(config)` for config-bound registration with optional runtime validation.
|
|
139
|
-
*
|
|
140
|
-
* @typeParam TConfig - Configuration type accepted by the resource.
|
|
141
|
-
* @typeParam TValue - Promise type resolved by the resource `init`.
|
|
142
|
-
* @typeParam TDeps - Dependency map type this resource requires.
|
|
143
|
-
* @typeParam TPrivate - Private context type exposed to middleware during init.
|
|
144
|
-
* @typeParam TMeta - Arbitrary metadata type carried by the resource.
|
|
145
|
-
* @param constConfig - The resource definition config.
|
|
146
|
-
* @returns A branded resource definition usable by the runner.
|
|
147
|
-
*/
|
|
148
|
-
// The symbolFilePath might already come from defineIndex() for example
|
|
149
|
-
const filePath: string = constConfig[symbolFilePath] || getCallerFile();
|
|
150
|
-
const isIndexResource = constConfig[symbolIndexResource] || false;
|
|
151
|
-
const isAnonymous = !Boolean(constConfig.id);
|
|
152
|
-
const id =
|
|
153
|
-
constConfig.id ||
|
|
154
|
-
generateCallerIdFromFile(filePath, isIndexResource ? "index" : "resource");
|
|
155
|
-
|
|
156
|
-
return {
|
|
157
|
-
[symbolResource]: true,
|
|
158
|
-
[symbolFilePath]: filePath,
|
|
159
|
-
[symbolIndexResource]: isIndexResource,
|
|
160
|
-
id,
|
|
161
|
-
dependencies: constConfig.dependencies,
|
|
162
|
-
dispose: constConfig.dispose,
|
|
163
|
-
register: constConfig.register || [],
|
|
164
|
-
overrides: constConfig.overrides || [],
|
|
165
|
-
init: constConfig.init,
|
|
166
|
-
context: constConfig.context,
|
|
167
|
-
configSchema: constConfig.configSchema,
|
|
168
|
-
with: function (config: TConfig) {
|
|
169
|
-
// Validate config with schema if provided (fail fast)
|
|
170
|
-
if (this.configSchema) {
|
|
171
|
-
try {
|
|
172
|
-
config = this.configSchema.parse(config);
|
|
173
|
-
} catch (error) {
|
|
174
|
-
throw new ValidationError(
|
|
175
|
-
"Resource config",
|
|
176
|
-
this.id,
|
|
177
|
-
error instanceof Error ? error : new Error(String(error))
|
|
178
|
-
);
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
return {
|
|
183
|
-
[symbolResourceWithConfig]: true,
|
|
184
|
-
id: this.id,
|
|
185
|
-
resource: this,
|
|
186
|
-
config,
|
|
187
|
-
};
|
|
188
|
-
},
|
|
189
|
-
|
|
190
|
-
events: {
|
|
191
|
-
beforeInit: {
|
|
192
|
-
...defineEvent({
|
|
193
|
-
id: isAnonymous
|
|
194
|
-
? Symbol(`anonymous-resource.events.beforeInit`)
|
|
195
|
-
: `${id as string}.events.beforeInit`,
|
|
196
|
-
}),
|
|
197
|
-
[symbolFilePath]: filePath,
|
|
198
|
-
},
|
|
199
|
-
afterInit: {
|
|
200
|
-
...defineEvent({
|
|
201
|
-
id: isAnonymous
|
|
202
|
-
? Symbol(`anonymous-resource.events.afterInit`)
|
|
203
|
-
: `${id as string}.events.afterInit`,
|
|
204
|
-
}),
|
|
205
|
-
[symbolFilePath]: filePath,
|
|
206
|
-
},
|
|
207
|
-
onError: {
|
|
208
|
-
...defineEvent({
|
|
209
|
-
id: isAnonymous
|
|
210
|
-
? Symbol(`anonymous-resource.events.onError`)
|
|
211
|
-
: `${id as string}.events.onError`,
|
|
212
|
-
}),
|
|
213
|
-
[symbolFilePath]: filePath,
|
|
214
|
-
},
|
|
215
|
-
},
|
|
216
|
-
meta: (constConfig.meta || {}) as TMeta,
|
|
217
|
-
middleware: constConfig.middleware || [],
|
|
218
|
-
};
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
/**
|
|
222
|
-
* Creates an "index" resource which groups multiple registerable items under
|
|
223
|
-
* a single dependency. The resulting resource registers every item, depends
|
|
224
|
-
* on the same items, and returns the resolved dependency map so users can
|
|
225
|
-
* access them naturally: `deps.services.myTask()` or `deps.services.myResource`.
|
|
226
|
-
*/
|
|
227
|
-
export function defineIndex<
|
|
228
|
-
T extends Record<string, RegisterableItems>,
|
|
229
|
-
D extends {
|
|
230
|
-
[K in keyof T]: T[K] extends IResourceWithConfig<any, any, any>
|
|
231
|
-
? T[K]["resource"]
|
|
232
|
-
: T[K];
|
|
233
|
-
} & DependencyMapType
|
|
234
|
-
>(items: T): IResource<void, Promise<DependencyValuesType<D>>, D> {
|
|
235
|
-
// Build dependency map from given items; unwrap `.with()` to the base resource
|
|
236
|
-
const dependencies = {} as D;
|
|
237
|
-
const register: RegisterableItems[] = [];
|
|
238
|
-
|
|
239
|
-
for (const key of Object.keys(items) as (keyof T)[]) {
|
|
240
|
-
const item = items[key];
|
|
241
|
-
register.push(item);
|
|
242
|
-
|
|
243
|
-
if (isResourceWithConfig(item)) {
|
|
244
|
-
(dependencies as any)[key] = item.resource;
|
|
245
|
-
} else {
|
|
246
|
-
(dependencies as any)[key] = item as any;
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
const callerFilePath = getCallerFile();
|
|
250
|
-
|
|
251
|
-
return defineResource({
|
|
252
|
-
register,
|
|
253
|
-
dependencies,
|
|
254
|
-
async init(_, deps) {
|
|
255
|
-
return deps as any;
|
|
256
|
-
},
|
|
257
|
-
[symbolFilePath]: callerFilePath,
|
|
258
|
-
[symbolIndexResource]: true,
|
|
259
|
-
});
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
export function defineEvent<TPayload = void>(
|
|
263
|
-
config?: IEventDefinition<TPayload>
|
|
264
|
-
): IEvent<TPayload> {
|
|
265
|
-
/**
|
|
266
|
-
* Define an event.
|
|
267
|
-
* Generates a branded event definition with a stable id (anonymous if omitted)
|
|
268
|
-
* and file path metadata for better debugging.
|
|
269
|
-
*
|
|
270
|
-
* @typeParam TPayload - Payload type carried by the event.
|
|
271
|
-
* @param config - Optional event definition (id, etc.).
|
|
272
|
-
* @returns A branded event definition.
|
|
273
|
-
*/
|
|
274
|
-
const callerFilePath = getCallerFile();
|
|
275
|
-
const eventConfig = config || {};
|
|
276
|
-
return {
|
|
277
|
-
...eventConfig,
|
|
278
|
-
id: eventConfig.id || generateCallerIdFromFile(callerFilePath, "event"),
|
|
279
|
-
[symbolFilePath]: callerFilePath,
|
|
280
|
-
[symbolEvent]: true, // This is a workaround
|
|
281
|
-
};
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
export type MiddlewareEverywhereOptions = {
|
|
285
|
-
/**
|
|
286
|
-
* Enable this for tasks. Default is true.
|
|
287
|
-
*/
|
|
288
|
-
tasks?: boolean;
|
|
289
|
-
/**
|
|
290
|
-
* Enable this for resources. Default is true.
|
|
291
|
-
*/
|
|
292
|
-
resources?: boolean;
|
|
293
|
-
};
|
|
294
|
-
|
|
295
|
-
/**
|
|
296
|
-
* Define a middleware.
|
|
297
|
-
* Creates a middleware definition with anonymous id generation, `.with(config)`,
|
|
298
|
-
* and `.everywhere()` helpers.
|
|
299
|
-
*
|
|
300
|
-
* - `.with(config)` merges config (optionally validated via `configSchema`).
|
|
301
|
-
* - `.everywhere()` marks the middleware global (optionally scoping to tasks/resources).
|
|
302
|
-
*
|
|
303
|
-
* @typeParam TConfig - Configuration type accepted by the middleware.
|
|
304
|
-
* @typeParam TDependencies - Dependency map type required by the middleware.
|
|
305
|
-
* @param middlewareDef - The middleware definition config.
|
|
306
|
-
* @returns A branded middleware definition usable by the runner.
|
|
307
|
-
*/
|
|
308
|
-
export function defineMiddleware<
|
|
309
|
-
TConfig extends Record<string, any>,
|
|
310
|
-
TDependencies extends DependencyMapType
|
|
311
|
-
>(
|
|
312
|
-
middlewareDef: IMiddlewareDefinition<TConfig, TDependencies>
|
|
313
|
-
): IMiddleware<TConfig, TDependencies> {
|
|
314
|
-
const filePath = getCallerFile();
|
|
315
|
-
const object = {
|
|
316
|
-
[symbolFilePath]: filePath,
|
|
317
|
-
[symbolMiddleware]: true,
|
|
318
|
-
config: {} as TConfig,
|
|
319
|
-
id: middlewareDef.id || generateCallerIdFromFile(filePath, "middleware"),
|
|
320
|
-
...middlewareDef,
|
|
321
|
-
dependencies: middlewareDef.dependencies || ({} as TDependencies),
|
|
322
|
-
} as IMiddleware<TConfig, TDependencies>;
|
|
323
|
-
|
|
324
|
-
return {
|
|
325
|
-
...object,
|
|
326
|
-
with: (config: TConfig) => {
|
|
327
|
-
// Validate config with schema if provided (fail fast)
|
|
328
|
-
if (object.configSchema) {
|
|
329
|
-
try {
|
|
330
|
-
config = object.configSchema.parse(config);
|
|
331
|
-
} catch (error) {
|
|
332
|
-
throw new ValidationError(
|
|
333
|
-
"Middleware config",
|
|
334
|
-
object.id,
|
|
335
|
-
error instanceof Error ? error : new Error(String(error))
|
|
336
|
-
);
|
|
337
|
-
}
|
|
338
|
-
}
|
|
339
|
-
|
|
340
|
-
return {
|
|
341
|
-
...object,
|
|
342
|
-
[symbolMiddlewareConfigured]: true,
|
|
343
|
-
config: {
|
|
344
|
-
...object.config,
|
|
345
|
-
...config,
|
|
346
|
-
},
|
|
347
|
-
};
|
|
348
|
-
},
|
|
349
|
-
everywhere(options: MiddlewareEverywhereOptions = {}) {
|
|
350
|
-
const { tasks = true, resources = true } = options;
|
|
351
|
-
|
|
352
|
-
return {
|
|
353
|
-
...object,
|
|
354
|
-
[symbolMiddlewareEverywhereTasks]: tasks,
|
|
355
|
-
[symbolMiddlewareEverywhereResources]: resources,
|
|
356
|
-
everywhere() {
|
|
357
|
-
throw new MiddlewareAlreadyGlobalError(object.id);
|
|
358
|
-
},
|
|
359
|
-
};
|
|
360
|
-
},
|
|
361
|
-
};
|
|
362
|
-
}
|
|
363
|
-
|
|
364
|
-
/**
|
|
365
|
-
* Type guard: checks if a definition is a Task.
|
|
366
|
-
* @param definition - Any value to test.
|
|
367
|
-
* @returns True when `definition` is a branded Task.
|
|
368
|
-
*/
|
|
369
|
-
export function isTask(definition: any): definition is ITask {
|
|
370
|
-
return definition && definition[symbolTask];
|
|
371
|
-
}
|
|
372
|
-
|
|
373
|
-
/**
|
|
374
|
-
* Type guard: checks if a definition is a Resource.
|
|
375
|
-
* @param definition - Any value to test.
|
|
376
|
-
* @returns True when `definition` is a branded Resource.
|
|
377
|
-
*/
|
|
378
|
-
export function isResource(definition: any): definition is IResource {
|
|
379
|
-
return definition && definition[symbolResource];
|
|
380
|
-
}
|
|
381
|
-
|
|
382
|
-
/**
|
|
383
|
-
* Type guard: checks if a definition is a Resource that carries config via `.with()`.
|
|
384
|
-
* @param definition - Any value to test.
|
|
385
|
-
* @returns True when `definition` is a branded ResourceWithConfig.
|
|
386
|
-
*/
|
|
387
|
-
export function isResourceWithConfig(
|
|
388
|
-
definition: any
|
|
389
|
-
): definition is IResourceWithConfig {
|
|
390
|
-
return definition && definition[symbolResourceWithConfig];
|
|
391
|
-
}
|
|
392
|
-
|
|
393
|
-
/**
|
|
394
|
-
* Type guard: checks if a definition is an Event.
|
|
395
|
-
* @param definition - Any value to test.
|
|
396
|
-
* @returns True when `definition` is a branded Event.
|
|
397
|
-
*/
|
|
398
|
-
export function isEvent(definition: any): definition is IEvent {
|
|
399
|
-
return definition && definition[symbolEvent];
|
|
400
|
-
}
|
|
401
|
-
|
|
402
|
-
/**
|
|
403
|
-
* Type guard: checks if a definition is a Middleware.
|
|
404
|
-
* @param definition - Any value to test.
|
|
405
|
-
* @returns True when `definition` is a branded Middleware.
|
|
406
|
-
*/
|
|
407
|
-
export function isMiddleware(definition: any): definition is IMiddleware {
|
|
408
|
-
return definition && definition[symbolMiddleware];
|
|
409
|
-
}
|
|
410
|
-
|
|
411
|
-
/**
|
|
412
|
-
* Override helper that preserves the original `id` and returns the same type.
|
|
413
|
-
* You can override any property except `id`. The override is shallow-merged over the base.
|
|
414
|
-
*
|
|
415
|
-
* @param base - The base definition to override.
|
|
416
|
-
* @param patch - Properties to override (except `id`).
|
|
417
|
-
* @returns A definition of the same kind with overrides applied.
|
|
418
|
-
*/
|
|
419
|
-
export function defineOverride<T extends ITask<any, any, any, any>>(
|
|
420
|
-
base: T,
|
|
421
|
-
patch: Omit<Partial<T>, "id">
|
|
422
|
-
): T;
|
|
423
|
-
export function defineOverride<T extends IResource<any, any, any, any>>(
|
|
424
|
-
base: T,
|
|
425
|
-
patch: Omit<Partial<T>, "id">
|
|
426
|
-
): T;
|
|
427
|
-
export function defineOverride<T extends IMiddleware<any, any>>(
|
|
428
|
-
base: T,
|
|
429
|
-
patch: Omit<Partial<T>, "id">
|
|
430
|
-
): T;
|
|
431
|
-
export function defineOverride(
|
|
432
|
-
base: ITask | IResource | IMiddleware,
|
|
433
|
-
patch: Record<string | symbol, unknown>
|
|
434
|
-
): ITask | IResource | IMiddleware {
|
|
435
|
-
const { id: _ignored, ...rest } = (patch || {}) as any;
|
|
436
|
-
// Ensure we never change the id, and merge overrides last
|
|
437
|
-
return {
|
|
438
|
-
...(base as any),
|
|
439
|
-
...rest,
|
|
440
|
-
id: (base as any).id,
|
|
441
|
-
} as any;
|
|
442
|
-
}
|
|
443
|
-
|
|
444
|
-
/**
|
|
445
|
-
* Create a tag definition.
|
|
446
|
-
* - `.with(config)` to create configured instances
|
|
447
|
-
* - `.extract(tags)` to extract this tag from a list of tags or a taggable's meta
|
|
448
|
-
*
|
|
449
|
-
* @typeParam TConfig - Configuration type carried by configured tags.
|
|
450
|
-
* @typeParam TEnforceContract - Optional helper type to enforce a contract when tags are used.
|
|
451
|
-
* @param definition - The tag definition (id).
|
|
452
|
-
* @returns A tag object with helpers to configure and extract.
|
|
453
|
-
*/
|
|
454
|
-
export function defineTag<TConfig = void, TEnforceContract = void>(
|
|
455
|
-
definition: ITagDefinition<TConfig, TEnforceContract>
|
|
456
|
-
): ITag<TConfig, TEnforceContract> {
|
|
457
|
-
const id = definition.id;
|
|
458
|
-
|
|
459
|
-
return {
|
|
460
|
-
id,
|
|
461
|
-
with(tagConfig: TConfig) {
|
|
462
|
-
return {
|
|
463
|
-
id,
|
|
464
|
-
tag: this,
|
|
465
|
-
config: tagConfig as any,
|
|
466
|
-
} as ITagWithConfig<TConfig>;
|
|
467
|
-
},
|
|
468
|
-
extract(target: TagType[] | ITaggable) {
|
|
469
|
-
const tags = Array.isArray(target) ? target : target?.meta?.tags || [];
|
|
470
|
-
for (const candidate of tags) {
|
|
471
|
-
if (typeof candidate === "string") continue;
|
|
472
|
-
// Configured instance
|
|
473
|
-
if (candidate.id === id) {
|
|
474
|
-
return candidate as ITagWithConfig<TConfig>;
|
|
475
|
-
}
|
|
476
|
-
}
|
|
477
|
-
return null;
|
|
478
|
-
},
|
|
479
|
-
} as ITag<TConfig>;
|
|
480
|
-
}
|
package/src/defs.returnTag.ts
DELETED
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
// HasContracts<Meta> → true if contracts present, else false
|
|
2
|
-
|
|
3
|
-
import { ITag, ITagWithConfig } from "./defs";
|
|
4
|
-
import { IMeta } from "./defs";
|
|
5
|
-
|
|
6
|
-
// Keep these param names aligned with your defs.ts: ITag<TConfig, TEnforceContract>
|
|
7
|
-
type NonVoid<T> = [T] extends [void] ? never : T;
|
|
8
|
-
|
|
9
|
-
type ExtractReturnFromTag<T> = T extends ITagWithConfig<any, infer R>
|
|
10
|
-
? NonVoid<R>
|
|
11
|
-
: T extends ITag<any, infer R>
|
|
12
|
-
? NonVoid<R>
|
|
13
|
-
: never;
|
|
14
|
-
|
|
15
|
-
type IsTuple<T extends readonly unknown[]> = number extends T["length"]
|
|
16
|
-
? false
|
|
17
|
-
: true;
|
|
18
|
-
|
|
19
|
-
type FilterContracts<
|
|
20
|
-
TTags extends readonly unknown[],
|
|
21
|
-
Acc extends readonly unknown[] = []
|
|
22
|
-
> = TTags extends readonly [infer H, ...infer R]
|
|
23
|
-
? ExtractReturnFromTag<H> extends never
|
|
24
|
-
? FilterContracts<R, Acc>
|
|
25
|
-
: FilterContracts<R, [...Acc, ExtractReturnFromTag<H>]>
|
|
26
|
-
: Acc;
|
|
27
|
-
|
|
28
|
-
export type ExtractContractsFromTags<TTags extends readonly unknown[]> =
|
|
29
|
-
IsTuple<TTags> extends true
|
|
30
|
-
? FilterContracts<TTags>
|
|
31
|
-
: Array<ExtractReturnFromTag<TTags[number]>>;
|
|
32
|
-
|
|
33
|
-
export type ExtractTagsWithNonVoidReturnTypeFromMeta<TMeta extends IMeta> =
|
|
34
|
-
TMeta extends { tags?: infer TTags }
|
|
35
|
-
? TTags extends readonly unknown[]
|
|
36
|
-
? ExtractContractsFromTags<TTags>
|
|
37
|
-
: []
|
|
38
|
-
: [];
|
|
39
|
-
|
|
40
|
-
type IsNeverTuple<T extends readonly unknown[]> = T extends [] ? true : false;
|
|
41
|
-
|
|
42
|
-
export type HasContracts<T extends IMeta> =
|
|
43
|
-
ExtractTagsWithNonVoidReturnTypeFromMeta<T> extends never[] ? false : true; // HasContracts and enforcement
|
|
44
|
-
|
|
45
|
-
// Ensure a response type satisfies ALL contracts (intersection)
|
|
46
|
-
type UnionToIntersection<U> = (
|
|
47
|
-
U extends any ? (arg: U) => void : never
|
|
48
|
-
) extends (arg: infer I) => void
|
|
49
|
-
? I
|
|
50
|
-
: never;
|
|
51
|
-
|
|
52
|
-
type ContractsUnion<TMeta extends IMeta> =
|
|
53
|
-
ExtractTagsWithNonVoidReturnTypeFromMeta<TMeta> extends readonly (infer U)[]
|
|
54
|
-
? U
|
|
55
|
-
: never;
|
|
56
|
-
|
|
57
|
-
type ContractsIntersection<TMeta extends IMeta> = UnionToIntersection<
|
|
58
|
-
ContractsUnion<TMeta>
|
|
59
|
-
>;
|
|
60
|
-
|
|
61
|
-
/**
|
|
62
|
-
* Pretty-print helper to expand intersections for better IDE display.
|
|
63
|
-
*/
|
|
64
|
-
type Simplify<T> = { [K in keyof T]: T[K] } & {};
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* Verbose compile-time error surfaced when a value does not satisfy
|
|
68
|
-
* the intersection of all tag-enforced contracts.
|
|
69
|
-
*
|
|
70
|
-
* Intersected with `never` in call sites when desired to ensure assignment
|
|
71
|
-
* fails while still surfacing a readable shape in tooltips.
|
|
72
|
-
*/
|
|
73
|
-
export type ContractViolationError<TMeta extends IMeta, TActual> = {
|
|
74
|
-
message: "Value does not satisfy all tag contracts";
|
|
75
|
-
expected: Simplify<ContractsIntersection<TMeta>>;
|
|
76
|
-
received: TActual;
|
|
77
|
-
};
|
|
78
|
-
|
|
79
|
-
export type EnsureResponseSatisfiesContracts<TMeta extends IMeta, TResponse> = [
|
|
80
|
-
ContractsUnion<TMeta>
|
|
81
|
-
] extends [never]
|
|
82
|
-
? TResponse // no contracts, allow as-is
|
|
83
|
-
: TResponse extends Promise<infer U>
|
|
84
|
-
? Promise<
|
|
85
|
-
U extends ContractsIntersection<TMeta>
|
|
86
|
-
? U
|
|
87
|
-
: ContractViolationError<TMeta, U>
|
|
88
|
-
>
|
|
89
|
-
: TResponse extends ContractsIntersection<TMeta>
|
|
90
|
-
? TResponse
|
|
91
|
-
: ContractViolationError<TMeta, TResponse>;
|