@bluelibs/runner 2.2.4 → 3.1.0
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/README.md +1409 -935
- package/dist/common.types.d.ts +20 -0
- package/dist/common.types.js +4 -0
- package/dist/common.types.js.map +1 -0
- package/dist/context.d.ts +34 -0
- package/dist/context.js +58 -0
- package/dist/context.js.map +1 -0
- package/dist/define.d.ts +24 -5
- package/dist/define.js +89 -20
- package/dist/define.js.map +1 -1
- package/dist/defs.d.ts +109 -73
- package/dist/defs.js +12 -2
- package/dist/defs.js.map +1 -1
- package/dist/errors.d.ts +5 -5
- package/dist/errors.js +6 -5
- package/dist/errors.js.map +1 -1
- package/dist/event.types.d.ts +18 -0
- package/dist/event.types.js +4 -0
- package/dist/event.types.js.map +1 -0
- package/dist/examples/registrator-example.d.ts +122 -0
- package/dist/examples/registrator-example.js +147 -0
- package/dist/examples/registrator-example.js.map +1 -0
- package/dist/globals/globalEvents.d.ts +41 -0
- package/dist/globals/globalEvents.js +94 -0
- package/dist/globals/globalEvents.js.map +1 -0
- package/dist/globals/globalMiddleware.d.ts +23 -0
- package/dist/globals/globalMiddleware.js +15 -0
- package/dist/globals/globalMiddleware.js.map +1 -0
- package/dist/globals/globalResources.d.ts +27 -0
- package/dist/globals/globalResources.js +47 -0
- package/dist/globals/globalResources.js.map +1 -0
- package/dist/globals/middleware/cache.middleware.d.ts +34 -0
- package/dist/globals/middleware/cache.middleware.js +85 -0
- package/dist/globals/middleware/cache.middleware.js.map +1 -0
- package/dist/globals/middleware/requireContext.middleware.d.ts +6 -0
- package/dist/globals/middleware/requireContext.middleware.js +25 -0
- package/dist/globals/middleware/requireContext.middleware.js.map +1 -0
- package/dist/globals/middleware/retry.middleware.d.ts +20 -0
- package/dist/globals/middleware/retry.middleware.js +34 -0
- package/dist/globals/middleware/retry.middleware.js.map +1 -0
- package/dist/globals/resources/queue.resource.d.ts +7 -0
- package/dist/globals/resources/queue.resource.js +31 -0
- package/dist/globals/resources/queue.resource.js.map +1 -0
- package/dist/index.d.ts +54 -18
- package/dist/index.js +14 -9
- package/dist/index.js.map +1 -1
- package/dist/middleware.types.d.ts +40 -0
- package/dist/middleware.types.js +4 -0
- package/dist/middleware.types.js.map +1 -0
- package/dist/models/DependencyProcessor.d.ts +6 -5
- package/dist/models/DependencyProcessor.js +13 -15
- package/dist/models/DependencyProcessor.js.map +1 -1
- package/dist/models/EventManager.d.ts +9 -4
- package/dist/models/EventManager.js +44 -2
- package/dist/models/EventManager.js.map +1 -1
- package/dist/models/Logger.d.ts +30 -13
- package/dist/models/Logger.js +132 -54
- package/dist/models/Logger.js.map +1 -1
- package/dist/models/OverrideManager.d.ts +13 -0
- package/dist/models/OverrideManager.js +70 -0
- package/dist/models/OverrideManager.js.map +1 -0
- package/dist/models/Queue.d.ts +25 -0
- package/dist/models/Queue.js +54 -0
- package/dist/models/Queue.js.map +1 -0
- package/dist/models/ResourceInitializer.d.ts +5 -2
- package/dist/models/ResourceInitializer.js +22 -14
- package/dist/models/ResourceInitializer.js.map +1 -1
- package/dist/models/Semaphore.d.ts +61 -0
- package/dist/models/Semaphore.js +166 -0
- package/dist/models/Semaphore.js.map +1 -0
- package/dist/models/Store.d.ts +18 -73
- package/dist/models/Store.js +71 -269
- package/dist/models/Store.js.map +1 -1
- package/dist/models/StoreConstants.d.ts +11 -0
- package/dist/models/StoreConstants.js +18 -0
- package/dist/models/StoreConstants.js.map +1 -0
- package/dist/models/StoreRegistry.d.ts +25 -0
- package/dist/models/StoreRegistry.js +171 -0
- package/dist/models/StoreRegistry.js.map +1 -0
- package/dist/models/StoreTypes.d.ts +21 -0
- package/dist/models/StoreTypes.js +3 -0
- package/dist/models/StoreTypes.js.map +1 -0
- package/dist/models/StoreValidator.d.ts +10 -0
- package/dist/models/StoreValidator.js +41 -0
- package/dist/models/StoreValidator.js.map +1 -0
- package/dist/models/TaskRunner.d.ts +1 -1
- package/dist/models/TaskRunner.js +39 -24
- package/dist/models/TaskRunner.js.map +1 -1
- package/dist/models/VarStore.d.ts +17 -0
- package/dist/models/VarStore.js +60 -0
- package/dist/models/VarStore.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/resource.types.d.ts +31 -0
- package/dist/resource.types.js +3 -0
- package/dist/resource.types.js.map +1 -0
- package/dist/run.d.ts +4 -1
- package/dist/run.js +6 -3
- package/dist/run.js.map +1 -1
- package/dist/symbols.d.ts +24 -0
- package/dist/symbols.js +29 -0
- package/dist/symbols.js.map +1 -0
- package/dist/task.types.d.ts +55 -0
- package/dist/task.types.js +23 -0
- package/dist/task.types.js.map +1 -0
- package/dist/tools/getCallerFile.d.ts +9 -1
- package/dist/tools/getCallerFile.js +41 -0
- package/dist/tools/getCallerFile.js.map +1 -1
- package/dist/tools/registratorId.d.ts +4 -0
- package/dist/tools/registratorId.js +40 -0
- package/dist/tools/registratorId.js.map +1 -0
- package/dist/tools/simpleHash.d.ts +9 -0
- package/dist/tools/simpleHash.js +34 -0
- package/dist/tools/simpleHash.js.map +1 -0
- package/dist/types/base-interfaces.d.ts +18 -0
- package/dist/types/base-interfaces.js +6 -0
- package/dist/types/base-interfaces.js.map +1 -0
- package/dist/types/base.d.ts +13 -0
- package/dist/types/base.js +3 -0
- package/dist/types/base.js.map +1 -0
- package/dist/types/dependencies.d.ts +22 -0
- package/dist/types/dependencies.js +3 -0
- package/dist/types/dependencies.js.map +1 -0
- package/dist/types/dependency-core.d.ts +14 -0
- package/dist/types/dependency-core.js +5 -0
- package/dist/types/dependency-core.js.map +1 -0
- package/dist/types/events.d.ts +52 -0
- package/dist/types/events.js +6 -0
- package/dist/types/events.js.map +1 -0
- package/dist/types/hooks.d.ts +16 -0
- package/dist/types/hooks.js +5 -0
- package/dist/types/hooks.js.map +1 -0
- package/dist/types/index.d.ts +14 -0
- package/dist/types/index.js +27 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/meta.d.ts +13 -0
- package/dist/types/meta.js +5 -0
- package/dist/types/meta.js.map +1 -0
- package/dist/types/middleware.d.ts +38 -0
- package/dist/types/middleware.js +6 -0
- package/dist/types/middleware.js.map +1 -0
- package/dist/types/registerable.d.ts +10 -0
- package/dist/types/registerable.js +5 -0
- package/dist/types/registerable.js.map +1 -0
- package/dist/types/resources.d.ts +44 -0
- package/dist/types/resources.js +5 -0
- package/dist/types/resources.js.map +1 -0
- package/dist/types/symbols.d.ts +24 -0
- package/dist/types/symbols.js +30 -0
- package/dist/types/symbols.js.map +1 -0
- package/dist/types/tasks.d.ts +41 -0
- package/dist/types/tasks.js +5 -0
- package/dist/types/tasks.js.map +1 -0
- package/dist/types/utilities.d.ts +7 -0
- package/dist/types/utilities.js +5 -0
- package/dist/types/utilities.js.map +1 -0
- package/package.json +10 -6
- package/src/__tests__/benchmark/benchmark.test.ts +1 -1
- package/src/__tests__/context.test.ts +91 -0
- package/src/__tests__/errors.test.ts +8 -5
- package/src/__tests__/globalEvents.test.ts +1 -1
- package/src/__tests__/globals/cache.middleware.test.ts +772 -0
- package/src/__tests__/globals/queue.resource.test.ts +141 -0
- package/src/__tests__/globals/requireContext.middleware.test.ts +98 -0
- package/src/__tests__/globals/retry.middleware.test.ts +157 -0
- package/src/__tests__/index.helper.test.ts +55 -0
- package/src/__tests__/models/EventManager.test.ts +157 -11
- package/src/__tests__/models/Logger.test.ts +291 -34
- package/src/__tests__/models/Queue.test.ts +189 -0
- package/src/__tests__/models/ResourceInitializer.test.ts +8 -6
- package/src/__tests__/models/Semaphore.test.ts +713 -0
- package/src/__tests__/models/Store.test.ts +40 -0
- package/src/__tests__/models/TaskRunner.test.ts +86 -5
- package/src/__tests__/run.anonymous.test.ts +679 -0
- package/src/__tests__/run.middleware.test.ts +312 -12
- package/src/__tests__/run.overrides.test.ts +13 -10
- package/src/__tests__/run.test.ts +364 -13
- package/src/__tests__/setOutput.test.ts +244 -0
- package/src/__tests__/tools/getCallerFile.test.ts +124 -9
- package/src/__tests__/typesafety.test.ts +71 -41
- package/src/context.ts +86 -0
- package/src/define.ts +129 -34
- package/src/defs.ts +156 -119
- package/src/errors.ts +15 -10
- package/src/{globalEvents.ts → globals/globalEvents.ts} +13 -12
- package/src/globals/globalMiddleware.ts +14 -0
- package/src/{globalResources.ts → globals/globalResources.ts} +14 -10
- package/src/globals/middleware/cache.middleware.ts +115 -0
- package/src/globals/middleware/requireContext.middleware.ts +36 -0
- package/src/globals/middleware/retry.middleware.ts +56 -0
- package/src/globals/resources/queue.resource.ts +34 -0
- package/src/index.ts +9 -5
- package/src/models/DependencyProcessor.ts +42 -49
- package/src/models/EventManager.ts +64 -13
- package/src/models/Logger.ts +181 -64
- package/src/models/OverrideManager.ts +84 -0
- package/src/models/Queue.ts +66 -0
- package/src/models/ResourceInitializer.ts +40 -20
- package/src/models/Semaphore.ts +208 -0
- package/src/models/Store.ts +94 -342
- package/src/models/StoreConstants.ts +17 -0
- package/src/models/StoreRegistry.ts +228 -0
- package/src/models/StoreTypes.ts +46 -0
- package/src/models/StoreValidator.ts +43 -0
- package/src/models/TaskRunner.ts +54 -41
- package/src/models/index.ts +3 -0
- package/src/run.ts +7 -4
- package/src/tools/getCallerFile.ts +54 -2
- package/src/__tests__/index.ts +0 -15
- package/src/examples/express-mongo/index.ts +0 -1
package/src/defs.ts
CHANGED
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
import { index } from ".";
|
|
2
|
+
import { MiddlewareEverywhereOptions } from "./define";
|
|
3
|
+
|
|
4
|
+
export { ICacheInstance } from "./globals/middleware/cache.middleware";
|
|
5
|
+
|
|
1
6
|
export const symbolTask: unique symbol = Symbol("runner.task");
|
|
2
7
|
export const symbolResource: unique symbol = Symbol("runner.resource");
|
|
3
8
|
export const symbolResourceWithConfig: unique symbol = Symbol(
|
|
@@ -5,20 +10,39 @@ export const symbolResourceWithConfig: unique symbol = Symbol(
|
|
|
5
10
|
);
|
|
6
11
|
export const symbolEvent: unique symbol = Symbol("runner.event");
|
|
7
12
|
export const symbolMiddleware: unique symbol = Symbol("runner.middleware");
|
|
13
|
+
export const symbolMiddlewareConfigured: unique symbol = Symbol(
|
|
14
|
+
"runner.middlewareConfigured"
|
|
15
|
+
);
|
|
8
16
|
export const symbolMiddlewareGlobal: unique symbol = Symbol(
|
|
9
17
|
"runner.middlewareGlobal"
|
|
10
18
|
);
|
|
19
|
+
export const symbolMiddlewareEverywhereTasks: unique symbol = Symbol(
|
|
20
|
+
"runner.middlewareGlobalTasks"
|
|
21
|
+
);
|
|
22
|
+
export const symbolMiddlewareEverywhereResources: unique symbol = Symbol(
|
|
23
|
+
"runner.middlewareGlobalResources"
|
|
24
|
+
);
|
|
11
25
|
|
|
12
26
|
export const symbolFilePath: unique symbol = Symbol("runner.filePath");
|
|
27
|
+
export const symbolDispose: unique symbol = Symbol("runner.dispose");
|
|
28
|
+
export const symbolStore: unique symbol = Symbol("runner.store");
|
|
29
|
+
|
|
30
|
+
export const symbolIndexResource: unique symbol = Symbol(
|
|
31
|
+
"runner.indexResource"
|
|
32
|
+
);
|
|
13
33
|
|
|
14
34
|
export const symbols = {
|
|
15
35
|
task: symbolTask,
|
|
16
36
|
resource: symbolResource,
|
|
17
37
|
resourceWithConfig: symbolResourceWithConfig,
|
|
38
|
+
indexResource: symbolIndexResource,
|
|
18
39
|
event: symbolEvent,
|
|
19
40
|
middleware: symbolMiddleware,
|
|
20
|
-
|
|
41
|
+
middlewareEverywhereTasks: symbolMiddlewareEverywhereTasks,
|
|
42
|
+
middlewareEverywhereResources: symbolMiddlewareEverywhereResources,
|
|
21
43
|
filePath: symbolFilePath,
|
|
44
|
+
dispose: symbolDispose,
|
|
45
|
+
store: symbolStore,
|
|
22
46
|
};
|
|
23
47
|
|
|
24
48
|
export interface IMeta {
|
|
@@ -44,12 +68,23 @@ type ExtractTaskOutput<T> = T extends ITask<any, infer O, infer D> ? O : never;
|
|
|
44
68
|
type ExtractResourceValue<T> = T extends IResource<any, infer V, infer D>
|
|
45
69
|
? V
|
|
46
70
|
: never;
|
|
47
|
-
type ExtractEventParams<T> = T extends IEventDefinition<infer P> ? P : never;
|
|
48
71
|
|
|
49
|
-
|
|
72
|
+
type ExtractEventParams<T> = T extends IEvent<infer P> ? P : never;
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* This represents a task dependency function that can be called with or without parameters.
|
|
76
|
+
*/
|
|
50
77
|
type TaskDependency<I, O> = (...args: I extends null | void ? [] : [I]) => O;
|
|
78
|
+
/**
|
|
79
|
+
* This represents the resource's value type.
|
|
80
|
+
*/
|
|
51
81
|
type ResourceDependency<V> = V;
|
|
52
|
-
|
|
82
|
+
/**
|
|
83
|
+
* This represents an event emission function that can be called with or without parameters.
|
|
84
|
+
*/
|
|
85
|
+
type EventDependency<P> = P extends void
|
|
86
|
+
? (() => Promise<void>) & ((input?: Record<string, never>) => Promise<void>)
|
|
87
|
+
: (input: P) => Promise<void>;
|
|
53
88
|
|
|
54
89
|
// Main DependencyValueType Definition
|
|
55
90
|
export type DependencyValueType<T> = T extends ITask<any, any, any>
|
|
@@ -64,33 +99,19 @@ export type DependencyValuesType<T extends DependencyMapType> = {
|
|
|
64
99
|
[K in keyof T]: DependencyValueType<T[K]>;
|
|
65
100
|
};
|
|
66
101
|
|
|
67
|
-
type Optional<T> = {
|
|
68
|
-
[K in keyof T]?: T[K];
|
|
69
|
-
};
|
|
70
|
-
|
|
71
|
-
// Utility type to check if a type is void
|
|
72
|
-
type IsVoid<T> = [T] extends [void] ? true : false;
|
|
73
|
-
|
|
74
|
-
// Utility type to check if a type is optional (can be undefined)
|
|
75
|
-
type IsOptional<T> = undefined extends T ? true : false;
|
|
76
|
-
|
|
77
|
-
// IReso
|
|
78
|
-
|
|
79
|
-
// Conditional type to allow `void`, optional, or any type
|
|
80
|
-
type OptionalOrVoidOrAnything<T> = IsVoid<T> extends true
|
|
81
|
-
? void
|
|
82
|
-
: IsOptional<T> extends true
|
|
83
|
-
? Optional<T>
|
|
84
|
-
: T;
|
|
85
|
-
|
|
86
102
|
// RegisterableItems Type with Conditional Inclusion
|
|
87
103
|
export type RegisterableItems<T = any> =
|
|
88
104
|
| IResourceWithConfig<any>
|
|
89
|
-
|
|
90
|
-
| IResource<
|
|
91
|
-
|
|
|
92
|
-
|
|
|
93
|
-
|
|
|
105
|
+
| IResource<void, any, any, any> // For void configs
|
|
106
|
+
| IResource<{ [K in any]?: any }, any, any, any> // For optional config
|
|
107
|
+
| ITask<any, any, any, any>
|
|
108
|
+
| IMiddleware<any>
|
|
109
|
+
| IEvent<any>;
|
|
110
|
+
|
|
111
|
+
export type MiddlewareAttachments =
|
|
112
|
+
| IMiddleware<void>
|
|
113
|
+
| IMiddleware<{ [K in any]?: any }>
|
|
114
|
+
| IMiddlewareConfigured<any>;
|
|
94
115
|
|
|
95
116
|
export interface ITaskDefinition<
|
|
96
117
|
TInput = any,
|
|
@@ -98,9 +119,9 @@ export interface ITaskDefinition<
|
|
|
98
119
|
TDependencies extends DependencyMapType = {},
|
|
99
120
|
TOn extends "*" | IEventDefinition<any> | undefined = undefined // Adding a generic to track 'on' type
|
|
100
121
|
> {
|
|
101
|
-
id
|
|
122
|
+
id?: string | symbol;
|
|
102
123
|
dependencies?: TDependencies | (() => TDependencies);
|
|
103
|
-
middleware?:
|
|
124
|
+
middleware?: MiddlewareAttachments[];
|
|
104
125
|
/**
|
|
105
126
|
* Listen to events in a simple way
|
|
106
127
|
*/
|
|
@@ -114,12 +135,7 @@ export interface ITaskDefinition<
|
|
|
114
135
|
run: (
|
|
115
136
|
input: TOn extends undefined
|
|
116
137
|
? TInput
|
|
117
|
-
:
|
|
118
|
-
// input: TOn extends "*"
|
|
119
|
-
// ? IEvent<any>
|
|
120
|
-
// : TEventDefinitionInput extends null | void
|
|
121
|
-
// ? TInput
|
|
122
|
-
// : IEvent<TEventDefinitionInput>,
|
|
138
|
+
: IEventEmission<TOn extends "*" ? any : ExtractEventParams<TOn>>,
|
|
123
139
|
dependencies: DependencyValuesType<TDependencies>
|
|
124
140
|
) => TOutput;
|
|
125
141
|
}
|
|
@@ -130,7 +146,8 @@ export type BeforeRunEventPayload<TInput> = {
|
|
|
130
146
|
|
|
131
147
|
export type AfterRunEventPayload<TInput, TOutput> = {
|
|
132
148
|
input: TInput;
|
|
133
|
-
output: TOutput;
|
|
149
|
+
output: TOutput extends Promise<infer U> ? U : TOutput;
|
|
150
|
+
setOutput(newOutput: TOutput extends Promise<infer U> ? U : TOutput): void;
|
|
134
151
|
};
|
|
135
152
|
|
|
136
153
|
export type OnErrorEventPayload = {
|
|
@@ -159,68 +176,75 @@ export interface ITask<
|
|
|
159
176
|
TDependencies extends DependencyMapType = {},
|
|
160
177
|
TOn extends "*" | IEventDefinition<any> | undefined = undefined
|
|
161
178
|
> extends ITaskDefinition<TInput, TOutput, TDependencies, TOn> {
|
|
179
|
+
id: string | symbol;
|
|
162
180
|
dependencies: TDependencies | (() => TDependencies);
|
|
163
181
|
computedDependencies?: DependencyValuesType<TDependencies>;
|
|
164
|
-
middleware:
|
|
182
|
+
middleware: MiddlewareAttachments[];
|
|
165
183
|
/**
|
|
166
184
|
* These events are automatically populated after the task has been defined.
|
|
167
185
|
*/
|
|
168
186
|
events: {
|
|
169
|
-
beforeRun:
|
|
170
|
-
afterRun:
|
|
171
|
-
onError:
|
|
187
|
+
beforeRun: IEvent<BeforeRunEventPayload<TInput>>;
|
|
188
|
+
afterRun: IEvent<AfterRunEventPayload<TInput, TOutput>>;
|
|
189
|
+
onError: IEvent<OnErrorEventPayload>;
|
|
172
190
|
};
|
|
173
191
|
}
|
|
174
192
|
|
|
175
|
-
type IsExactlyUnknown<T> = unknown extends T
|
|
176
|
-
? T extends unknown
|
|
177
|
-
? true
|
|
178
|
-
: false
|
|
179
|
-
: false;
|
|
180
|
-
|
|
181
|
-
// Resource interfaces
|
|
182
193
|
export interface IResourceDefinition<
|
|
183
194
|
TConfig = any,
|
|
184
195
|
TValue = unknown,
|
|
185
196
|
TDependencies extends DependencyMapType = {},
|
|
197
|
+
TContext = any,
|
|
198
|
+
THooks = any,
|
|
186
199
|
TRegisterableItems = any
|
|
187
200
|
> {
|
|
188
|
-
id
|
|
201
|
+
id?: string | symbol;
|
|
189
202
|
dependencies?: TDependencies | ((config: TConfig) => TDependencies);
|
|
190
203
|
register?:
|
|
191
204
|
| Array<RegisterableItems>
|
|
192
205
|
| ((config: TConfig) => Array<RegisterableItems>);
|
|
193
206
|
init?: (
|
|
207
|
+
this: any,
|
|
194
208
|
config: TConfig,
|
|
195
|
-
dependencies: DependencyValuesType<TDependencies
|
|
209
|
+
dependencies: DependencyValuesType<TDependencies>,
|
|
210
|
+
context: TContext
|
|
196
211
|
) => Promise<TValue>;
|
|
197
212
|
/**
|
|
198
213
|
* Clean-up function for the resource. This is called when the resource is no longer needed.
|
|
199
214
|
*
|
|
200
|
-
* @param value The value of the resource
|
|
215
|
+
* @param value The value of the resource (undefined if no init method)
|
|
201
216
|
* @param config The configuration it received
|
|
202
217
|
* @param dependencies The dependencies it needed
|
|
203
|
-
* @returns
|
|
218
|
+
* @returns Promise<void>
|
|
204
219
|
*/
|
|
205
220
|
dispose?: (
|
|
221
|
+
this: any,
|
|
206
222
|
value: TValue,
|
|
207
223
|
config: TConfig,
|
|
208
|
-
dependencies: DependencyValuesType<TDependencies
|
|
209
|
-
|
|
224
|
+
dependencies: DependencyValuesType<TDependencies>,
|
|
225
|
+
context: TContext
|
|
226
|
+
) => Promise<void>;
|
|
210
227
|
meta?: IResourceMeta;
|
|
211
228
|
overrides?: Array<IResource | ITask | IMiddleware | IResourceWithConfig>;
|
|
212
|
-
middleware?:
|
|
229
|
+
middleware?: MiddlewareAttachments[];
|
|
230
|
+
context?: () => TContext;
|
|
231
|
+
/**
|
|
232
|
+
* This is optional and used from an index resource to get the correct caller.
|
|
233
|
+
*/
|
|
234
|
+
[symbolFilePath]?: string;
|
|
235
|
+
/**
|
|
236
|
+
* This is used internally when creating index resources.
|
|
237
|
+
*/
|
|
238
|
+
[symbolIndexResource]?: boolean;
|
|
213
239
|
}
|
|
214
240
|
|
|
215
241
|
export interface IResource<
|
|
216
242
|
TConfig = void,
|
|
217
243
|
TValue = any,
|
|
218
|
-
TDependencies extends DependencyMapType = any
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
dependencies: DependencyValuesType<TDependencies>
|
|
223
|
-
) => Promise<TValue>;
|
|
244
|
+
TDependencies extends DependencyMapType = any,
|
|
245
|
+
TContext = any
|
|
246
|
+
> extends IResourceDefinition<TConfig, TValue, TDependencies, TContext> {
|
|
247
|
+
id: string | symbol;
|
|
224
248
|
with(config: TConfig): IResourceWithConfig<TConfig, TValue, TDependencies>;
|
|
225
249
|
register:
|
|
226
250
|
| Array<RegisterableItems>
|
|
@@ -229,12 +253,12 @@ export interface IResource<
|
|
|
229
253
|
* These events are automatically populated after the task has been defined.
|
|
230
254
|
*/
|
|
231
255
|
events: {
|
|
232
|
-
beforeInit:
|
|
233
|
-
afterInit:
|
|
234
|
-
onError:
|
|
256
|
+
beforeInit: IEvent<BeforeInitEventPayload<TConfig>>;
|
|
257
|
+
afterInit: IEvent<AfterInitEventPayload<TConfig, TValue>>;
|
|
258
|
+
onError: IEvent<OnErrorEventPayload>;
|
|
235
259
|
};
|
|
236
260
|
overrides: Array<IResource | ITask | IMiddleware | IResourceWithConfig>;
|
|
237
|
-
middleware:
|
|
261
|
+
middleware: MiddlewareAttachments[];
|
|
238
262
|
}
|
|
239
263
|
|
|
240
264
|
export interface IResourceWithConfig<
|
|
@@ -247,8 +271,32 @@ export interface IResourceWithConfig<
|
|
|
247
271
|
config: TConfig;
|
|
248
272
|
}
|
|
249
273
|
|
|
250
|
-
export
|
|
251
|
-
|
|
274
|
+
export type EventHandlerType<T = any> = (
|
|
275
|
+
event: IEventEmission<T>
|
|
276
|
+
) => any | Promise<any>;
|
|
277
|
+
|
|
278
|
+
export interface IEventDefinition<TPayload = void> {
|
|
279
|
+
id?: string | symbol;
|
|
280
|
+
meta?: IEventMeta;
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
export interface IEvent<TPayload = any> extends IEventDefinition<TPayload> {
|
|
284
|
+
id: string | symbol;
|
|
285
|
+
/**
|
|
286
|
+
* We use this event to discriminate between resources with just 'id' and 'events' as they collide. This is a workaround, should be redone using classes and instanceof.
|
|
287
|
+
*/
|
|
288
|
+
[symbolEvent]: true;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
/**
|
|
292
|
+
* This represents the object that is passed to event handlers
|
|
293
|
+
*/
|
|
294
|
+
export interface IEventEmission<TPayload = any> {
|
|
295
|
+
/**
|
|
296
|
+
* The ID of the event. This is the same as the event's ID.
|
|
297
|
+
* This is useful for global event listeners.
|
|
298
|
+
*/
|
|
299
|
+
id: string | symbol;
|
|
252
300
|
/**
|
|
253
301
|
* The data that the event carries. It can be anything.
|
|
254
302
|
*/
|
|
@@ -260,44 +308,46 @@ export interface IEvent<TPayload = any> {
|
|
|
260
308
|
/**
|
|
261
309
|
* The source of the event. This can be useful for debugging.
|
|
262
310
|
*/
|
|
263
|
-
source: string;
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
export type EventHandlerType<T = any> = (
|
|
267
|
-
event: IEvent<T>
|
|
268
|
-
) => any | Promise<any>;
|
|
269
|
-
|
|
270
|
-
// Other necessary interfaces
|
|
271
|
-
export interface IEventDefinitionConfig<TPayload = void> {
|
|
272
|
-
id: string;
|
|
273
|
-
meta?: IEventMeta;
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
export interface IEventDefinition<TPayload = void> {
|
|
277
|
-
id: string;
|
|
278
|
-
/**
|
|
279
|
-
* We use this event to discriminate between resources with just 'id' and 'events' as they collide. This is a workaround, should be redone using classes and instanceof.
|
|
280
|
-
*/
|
|
281
|
-
[symbolEvent]: true;
|
|
282
|
-
meta?: IEventMeta;
|
|
311
|
+
source: string | symbol;
|
|
283
312
|
}
|
|
284
313
|
|
|
285
314
|
export interface IMiddlewareDefinition<
|
|
315
|
+
TConfig = any,
|
|
286
316
|
TDependencies extends DependencyMapType = any
|
|
287
317
|
> {
|
|
288
|
-
id
|
|
318
|
+
id?: string | symbol;
|
|
289
319
|
dependencies?: TDependencies | (() => TDependencies);
|
|
290
320
|
run: (
|
|
291
321
|
input: IMiddlewareExecutionInput,
|
|
292
|
-
dependencies: DependencyValuesType<TDependencies
|
|
322
|
+
dependencies: DependencyValuesType<TDependencies>,
|
|
323
|
+
config: TConfig
|
|
293
324
|
) => Promise<any>;
|
|
294
325
|
meta?: IMiddlewareMeta;
|
|
295
326
|
}
|
|
296
327
|
|
|
297
|
-
export interface IMiddleware<
|
|
298
|
-
|
|
328
|
+
export interface IMiddleware<
|
|
329
|
+
TConfig = any,
|
|
330
|
+
TDependencies extends DependencyMapType = any
|
|
331
|
+
> extends IMiddlewareDefinition<TConfig, TDependencies> {
|
|
332
|
+
[symbolMiddleware]: true;
|
|
333
|
+
[symbolMiddlewareConfigured]?: boolean;
|
|
334
|
+
[symbolMiddlewareEverywhereTasks]?: boolean;
|
|
335
|
+
[symbolMiddlewareEverywhereResources]?: boolean;
|
|
336
|
+
|
|
337
|
+
id: string | symbol;
|
|
299
338
|
dependencies: TDependencies | (() => TDependencies);
|
|
300
|
-
|
|
339
|
+
everywhere(
|
|
340
|
+
config?: MiddlewareEverywhereOptions
|
|
341
|
+
): IMiddleware<TConfig, TDependencies>;
|
|
342
|
+
config: TConfig;
|
|
343
|
+
with: (config: TConfig) => IMiddlewareConfigured<TConfig, TDependencies>;
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
export interface IMiddlewareConfigured<
|
|
347
|
+
TConfig = any,
|
|
348
|
+
TDependencies extends DependencyMapType = any
|
|
349
|
+
> extends IMiddleware<TConfig, TDependencies> {
|
|
350
|
+
[symbolMiddlewareConfigured]: true;
|
|
301
351
|
}
|
|
302
352
|
|
|
303
353
|
export interface IMiddlewareDefinitionConfigured<
|
|
@@ -307,32 +357,19 @@ export interface IMiddlewareDefinitionConfigured<
|
|
|
307
357
|
config?: C;
|
|
308
358
|
}
|
|
309
359
|
|
|
310
|
-
export interface IMiddlewareExecutionInput
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
config?: any;
|
|
314
|
-
input?: any;
|
|
315
|
-
next: (taskInputOrResourceConfig?: any) => Promise<any>;
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
export interface IHookDefinition<
|
|
319
|
-
D extends DependencyMapType = {},
|
|
320
|
-
T = any,
|
|
321
|
-
B extends boolean = false
|
|
360
|
+
export interface IMiddlewareExecutionInput<
|
|
361
|
+
TTaskInput = any,
|
|
362
|
+
TResourceConfig = any
|
|
322
363
|
> {
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
run: (
|
|
335
|
-
event: IEvent<T>,
|
|
336
|
-
dependencies: T extends true ? void : DependencyValuesType<D>
|
|
337
|
-
) => Promise<void> | void;
|
|
364
|
+
task?: {
|
|
365
|
+
definition: ITask<TTaskInput>;
|
|
366
|
+
input: TTaskInput;
|
|
367
|
+
};
|
|
368
|
+
resource?: {
|
|
369
|
+
definition: IResource<TResourceConfig>;
|
|
370
|
+
config: TResourceConfig;
|
|
371
|
+
};
|
|
372
|
+
next: (
|
|
373
|
+
taskInputOrResourceConfig?: TTaskInput | TResourceConfig
|
|
374
|
+
) => Promise<any>;
|
|
338
375
|
}
|
package/src/errors.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { ITask, IResource } from "./defs";
|
|
2
2
|
|
|
3
3
|
export const Errors = {
|
|
4
|
-
duplicateRegistration: (type: string, id: string) =>
|
|
5
|
-
new Error(`${type} "${id}" already registered`),
|
|
4
|
+
duplicateRegistration: (type: string, id: string | symbol) =>
|
|
5
|
+
new Error(`${type} "${id.toString()}" already registered`),
|
|
6
6
|
|
|
7
|
-
dependencyNotFound: (key: string) =>
|
|
7
|
+
dependencyNotFound: (key: string | symbol) =>
|
|
8
8
|
new Error(
|
|
9
|
-
`Dependency ${key} not found. Did you forget to register it through a resource?`
|
|
9
|
+
`Dependency ${key.toString()} not found. Did you forget to register it through a resource?`
|
|
10
10
|
),
|
|
11
11
|
|
|
12
12
|
unknownItemType: (item: any) => new Error(`Unknown item type: ${item}`),
|
|
@@ -14,14 +14,19 @@ export const Errors = {
|
|
|
14
14
|
circularDependencies: (cycles: string[]) =>
|
|
15
15
|
new Error(`Circular dependencies detected: ${cycles.join(", ")}`),
|
|
16
16
|
|
|
17
|
-
eventNotFound: (id: string) =>
|
|
18
|
-
new Error(
|
|
17
|
+
eventNotFound: (id: string | symbol) =>
|
|
18
|
+
new Error(
|
|
19
|
+
`Event "${id.toString()}" not found. Did you forget to register it?`
|
|
20
|
+
),
|
|
19
21
|
|
|
20
|
-
middlewareAlreadyGlobal: (id: string) =>
|
|
21
|
-
new Error(
|
|
22
|
+
middlewareAlreadyGlobal: (id: string | symbol) =>
|
|
23
|
+
new Error(
|
|
24
|
+
"Cannot call .everywhere() on an already global middleware: " +
|
|
25
|
+
id.toString
|
|
26
|
+
),
|
|
22
27
|
|
|
23
|
-
locked: (what: string) =>
|
|
24
|
-
new Error(`Cannot modify the ${what} when it is locked.`),
|
|
28
|
+
locked: (what: string | symbol) =>
|
|
29
|
+
new Error(`Cannot modify the ${what.toString()} when it is locked.`),
|
|
25
30
|
|
|
26
31
|
storeAlreadyInitialized: () =>
|
|
27
32
|
new Error("Store already initialized. Cannot reinitialize."),
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { defineEvent } from "
|
|
2
|
-
import { ITask, IResource, IEvent } from "
|
|
3
|
-
import { ILog } from "
|
|
1
|
+
import { defineEvent } from "../define";
|
|
2
|
+
import { ITask, IResource, IEvent } from "../defs";
|
|
3
|
+
import { ILog } from "../models/Logger";
|
|
4
4
|
|
|
5
5
|
export const globalEvents = {
|
|
6
6
|
beforeInit: defineEvent({
|
|
7
|
-
id: "
|
|
7
|
+
id: "globals.events.beforeInit",
|
|
8
8
|
meta: {
|
|
9
9
|
title: "Before Initialization",
|
|
10
10
|
description:
|
|
@@ -13,7 +13,7 @@ export const globalEvents = {
|
|
|
13
13
|
},
|
|
14
14
|
}),
|
|
15
15
|
afterInit: defineEvent({
|
|
16
|
-
id: "
|
|
16
|
+
id: "globals.events.afterInit",
|
|
17
17
|
meta: {
|
|
18
18
|
title: "After Initialization",
|
|
19
19
|
description:
|
|
@@ -22,7 +22,7 @@ export const globalEvents = {
|
|
|
22
22
|
},
|
|
23
23
|
}),
|
|
24
24
|
log: defineEvent<ILog>({
|
|
25
|
-
id: "
|
|
25
|
+
id: "globals.events.log",
|
|
26
26
|
meta: {
|
|
27
27
|
title: "Log Event",
|
|
28
28
|
description: "Used to log events and messages across the system.",
|
|
@@ -34,7 +34,7 @@ export const globalEvents = {
|
|
|
34
34
|
task: ITask<any, any, any>;
|
|
35
35
|
input: any;
|
|
36
36
|
}>({
|
|
37
|
-
id: "
|
|
37
|
+
id: "globals.events.tasks.beforeRun",
|
|
38
38
|
meta: {
|
|
39
39
|
title: "Before Task Execution",
|
|
40
40
|
description:
|
|
@@ -46,8 +46,9 @@ export const globalEvents = {
|
|
|
46
46
|
task: ITask<any, any, any>;
|
|
47
47
|
input: any;
|
|
48
48
|
output: any;
|
|
49
|
+
setOutput: (newOutput: any) => void;
|
|
49
50
|
}>({
|
|
50
|
-
id: "
|
|
51
|
+
id: "globals.events.tasks.afterRun",
|
|
51
52
|
meta: {
|
|
52
53
|
title: "After Task Execution",
|
|
53
54
|
description:
|
|
@@ -60,7 +61,7 @@ export const globalEvents = {
|
|
|
60
61
|
suppress: () => void;
|
|
61
62
|
task: ITask<any, any, any>;
|
|
62
63
|
}>({
|
|
63
|
-
id: "
|
|
64
|
+
id: "globals.events.tasks.onError",
|
|
64
65
|
meta: {
|
|
65
66
|
title: "Task Error",
|
|
66
67
|
description:
|
|
@@ -74,7 +75,7 @@ export const globalEvents = {
|
|
|
74
75
|
resource: IResource<any, any, any>;
|
|
75
76
|
config: any;
|
|
76
77
|
}>({
|
|
77
|
-
id: "
|
|
78
|
+
id: "globals.events.resources.beforeInit",
|
|
78
79
|
meta: {
|
|
79
80
|
title: "Before Resource Initialization",
|
|
80
81
|
description:
|
|
@@ -87,7 +88,7 @@ export const globalEvents = {
|
|
|
87
88
|
config: any;
|
|
88
89
|
value: any;
|
|
89
90
|
}>({
|
|
90
|
-
id: "
|
|
91
|
+
id: "globals.events.resources.afterInit",
|
|
91
92
|
meta: {
|
|
92
93
|
title: "After Resource Initialization",
|
|
93
94
|
description:
|
|
@@ -100,7 +101,7 @@ export const globalEvents = {
|
|
|
100
101
|
suppress: () => void;
|
|
101
102
|
resource: IResource<any, any, any>;
|
|
102
103
|
}>({
|
|
103
|
-
id: "
|
|
104
|
+
id: "globals.events.resources.onError",
|
|
104
105
|
meta: {
|
|
105
106
|
title: "Resource Error",
|
|
106
107
|
description:
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Context, ContextError } from "../context";
|
|
2
|
+
import { defineMiddleware } from "../define";
|
|
3
|
+
import { cacheMiddleware } from "./middleware/cache.middleware";
|
|
4
|
+
import { requireContextMiddleware } from "./middleware/requireContext.middleware";
|
|
5
|
+
import { retryMiddleware } from "./middleware/retry.middleware";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Global middlewares
|
|
9
|
+
*/
|
|
10
|
+
export const globalMiddlewares = {
|
|
11
|
+
requireContext: requireContextMiddleware,
|
|
12
|
+
retry: retryMiddleware,
|
|
13
|
+
cache: cacheMiddleware,
|
|
14
|
+
};
|
|
@@ -1,11 +1,13 @@
|
|
|
1
|
-
import { defineResource } from "
|
|
2
|
-
import { EventManager } from "
|
|
3
|
-
import { Logger } from "
|
|
4
|
-
import { Store } from "
|
|
5
|
-
import { TaskRunner } from "
|
|
1
|
+
import { defineResource } from "../define";
|
|
2
|
+
import { EventManager } from "../models/EventManager";
|
|
3
|
+
import { Logger } from "../models/Logger";
|
|
4
|
+
import { Store } from "../models/Store";
|
|
5
|
+
import { TaskRunner } from "../models/TaskRunner";
|
|
6
|
+
import { cacheResource } from "./middleware/cache.middleware";
|
|
7
|
+
import { queueResource } from "./resources/queue.resource";
|
|
6
8
|
|
|
7
9
|
const store = defineResource({
|
|
8
|
-
id: "
|
|
10
|
+
id: "globals.resources.store",
|
|
9
11
|
init: async (store: Store) => store,
|
|
10
12
|
meta: {
|
|
11
13
|
title: "Store",
|
|
@@ -18,7 +20,7 @@ const store = defineResource({
|
|
|
18
20
|
export const globalResources = {
|
|
19
21
|
store,
|
|
20
22
|
eventManager: defineResource({
|
|
21
|
-
id: "
|
|
23
|
+
id: "globals.resources.eventManager",
|
|
22
24
|
init: async (em: EventManager) => em,
|
|
23
25
|
meta: {
|
|
24
26
|
title: "Event Manager",
|
|
@@ -28,7 +30,7 @@ export const globalResources = {
|
|
|
28
30
|
},
|
|
29
31
|
}),
|
|
30
32
|
taskRunner: defineResource({
|
|
31
|
-
id: "
|
|
33
|
+
id: "globals.resources.taskRunner",
|
|
32
34
|
init: async (runner: TaskRunner) => runner,
|
|
33
35
|
meta: {
|
|
34
36
|
title: "Task Runner",
|
|
@@ -38,12 +40,14 @@ export const globalResources = {
|
|
|
38
40
|
},
|
|
39
41
|
}),
|
|
40
42
|
logger: defineResource({
|
|
41
|
-
id: "
|
|
43
|
+
id: "globals.resources.logger",
|
|
42
44
|
init: async (logger: Logger) => logger,
|
|
43
45
|
meta: {
|
|
44
46
|
title: "Logger",
|
|
45
47
|
description:
|
|
46
|
-
"Logs all events and errors. This is meant to be used internally for most use-cases. Emits a
|
|
48
|
+
"Logs all events and errors. This is meant to be used internally for most use-cases. Emits a globals.log event for each log.",
|
|
47
49
|
},
|
|
48
50
|
}),
|
|
51
|
+
cache: cacheResource,
|
|
52
|
+
queue: queueResource,
|
|
49
53
|
};
|