@bluelibs/runner 2.2.3 → 3.0.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.
Files changed (204) hide show
  1. package/README.md +1315 -942
  2. package/dist/common.types.d.ts +20 -0
  3. package/dist/common.types.js +4 -0
  4. package/dist/common.types.js.map +1 -0
  5. package/dist/context.d.ts +34 -0
  6. package/dist/context.js +58 -0
  7. package/dist/context.js.map +1 -0
  8. package/dist/define.d.ts +22 -3
  9. package/dist/define.js +52 -8
  10. package/dist/define.js.map +1 -1
  11. package/dist/defs.d.ts +52 -31
  12. package/dist/defs.js +10 -2
  13. package/dist/defs.js.map +1 -1
  14. package/dist/errors.js +1 -1
  15. package/dist/errors.js.map +1 -1
  16. package/dist/event.types.d.ts +18 -0
  17. package/dist/event.types.js +4 -0
  18. package/dist/event.types.js.map +1 -0
  19. package/dist/examples/registrator-example.d.ts +122 -0
  20. package/dist/examples/registrator-example.js +147 -0
  21. package/dist/examples/registrator-example.js.map +1 -0
  22. package/dist/globals/globalEvents.d.ts +41 -0
  23. package/dist/globals/globalEvents.js +94 -0
  24. package/dist/globals/globalEvents.js.map +1 -0
  25. package/dist/globals/globalMiddleware.d.ts +23 -0
  26. package/dist/globals/globalMiddleware.js +15 -0
  27. package/dist/globals/globalMiddleware.js.map +1 -0
  28. package/dist/globals/globalResources.d.ts +27 -0
  29. package/dist/globals/globalResources.js +47 -0
  30. package/dist/globals/globalResources.js.map +1 -0
  31. package/dist/globals/middleware/cache.middleware.d.ts +34 -0
  32. package/dist/globals/middleware/cache.middleware.js +85 -0
  33. package/dist/globals/middleware/cache.middleware.js.map +1 -0
  34. package/dist/globals/middleware/requireContext.middleware.d.ts +6 -0
  35. package/dist/globals/middleware/requireContext.middleware.js +25 -0
  36. package/dist/globals/middleware/requireContext.middleware.js.map +1 -0
  37. package/dist/globals/middleware/retry.middleware.d.ts +20 -0
  38. package/dist/globals/middleware/retry.middleware.js +34 -0
  39. package/dist/globals/middleware/retry.middleware.js.map +1 -0
  40. package/dist/globals/resources/queue.resource.d.ts +7 -0
  41. package/dist/globals/resources/queue.resource.js +31 -0
  42. package/dist/globals/resources/queue.resource.js.map +1 -0
  43. package/dist/index.d.ts +45 -9
  44. package/dist/index.js +14 -9
  45. package/dist/index.js.map +1 -1
  46. package/dist/middleware.types.d.ts +40 -0
  47. package/dist/middleware.types.js +4 -0
  48. package/dist/middleware.types.js.map +1 -0
  49. package/dist/models/DependencyProcessor.d.ts +2 -1
  50. package/dist/models/DependencyProcessor.js +11 -13
  51. package/dist/models/DependencyProcessor.js.map +1 -1
  52. package/dist/models/EventManager.d.ts +5 -0
  53. package/dist/models/EventManager.js +44 -2
  54. package/dist/models/EventManager.js.map +1 -1
  55. package/dist/models/Logger.d.ts +30 -12
  56. package/dist/models/Logger.js +130 -42
  57. package/dist/models/Logger.js.map +1 -1
  58. package/dist/models/OverrideManager.d.ts +13 -0
  59. package/dist/models/OverrideManager.js +70 -0
  60. package/dist/models/OverrideManager.js.map +1 -0
  61. package/dist/models/Queue.d.ts +25 -0
  62. package/dist/models/Queue.js +54 -0
  63. package/dist/models/Queue.js.map +1 -0
  64. package/dist/models/ResourceInitializer.d.ts +5 -2
  65. package/dist/models/ResourceInitializer.js +20 -14
  66. package/dist/models/ResourceInitializer.js.map +1 -1
  67. package/dist/models/Semaphore.d.ts +61 -0
  68. package/dist/models/Semaphore.js +166 -0
  69. package/dist/models/Semaphore.js.map +1 -0
  70. package/dist/models/Store.d.ts +17 -72
  71. package/dist/models/Store.js +71 -269
  72. package/dist/models/Store.js.map +1 -1
  73. package/dist/models/StoreConstants.d.ts +11 -0
  74. package/dist/models/StoreConstants.js +18 -0
  75. package/dist/models/StoreConstants.js.map +1 -0
  76. package/dist/models/StoreRegistry.d.ts +25 -0
  77. package/dist/models/StoreRegistry.js +171 -0
  78. package/dist/models/StoreRegistry.js.map +1 -0
  79. package/dist/models/StoreTypes.d.ts +21 -0
  80. package/dist/models/StoreTypes.js +3 -0
  81. package/dist/models/StoreTypes.js.map +1 -0
  82. package/dist/models/StoreValidator.d.ts +10 -0
  83. package/dist/models/StoreValidator.js +41 -0
  84. package/dist/models/StoreValidator.js.map +1 -0
  85. package/dist/models/TaskRunner.js +39 -24
  86. package/dist/models/TaskRunner.js.map +1 -1
  87. package/dist/models/VarStore.d.ts +17 -0
  88. package/dist/models/VarStore.js +60 -0
  89. package/dist/models/VarStore.js.map +1 -0
  90. package/dist/models/index.d.ts +3 -0
  91. package/dist/models/index.js +3 -0
  92. package/dist/models/index.js.map +1 -1
  93. package/dist/resource.types.d.ts +31 -0
  94. package/dist/resource.types.js +3 -0
  95. package/dist/resource.types.js.map +1 -0
  96. package/dist/run.d.ts +4 -1
  97. package/dist/run.js +6 -3
  98. package/dist/run.js.map +1 -1
  99. package/dist/symbols.d.ts +24 -0
  100. package/dist/symbols.js +29 -0
  101. package/dist/symbols.js.map +1 -0
  102. package/dist/task.types.d.ts +55 -0
  103. package/dist/task.types.js +23 -0
  104. package/dist/task.types.js.map +1 -0
  105. package/dist/tools/registratorId.d.ts +4 -0
  106. package/dist/tools/registratorId.js +40 -0
  107. package/dist/tools/registratorId.js.map +1 -0
  108. package/dist/tools/simpleHash.d.ts +9 -0
  109. package/dist/tools/simpleHash.js +34 -0
  110. package/dist/tools/simpleHash.js.map +1 -0
  111. package/dist/types/base-interfaces.d.ts +18 -0
  112. package/dist/types/base-interfaces.js +6 -0
  113. package/dist/types/base-interfaces.js.map +1 -0
  114. package/dist/types/base.d.ts +13 -0
  115. package/dist/types/base.js +3 -0
  116. package/dist/types/base.js.map +1 -0
  117. package/dist/types/dependencies.d.ts +22 -0
  118. package/dist/types/dependencies.js +3 -0
  119. package/dist/types/dependencies.js.map +1 -0
  120. package/dist/types/dependency-core.d.ts +14 -0
  121. package/dist/types/dependency-core.js +5 -0
  122. package/dist/types/dependency-core.js.map +1 -0
  123. package/dist/types/events.d.ts +52 -0
  124. package/dist/types/events.js +6 -0
  125. package/dist/types/events.js.map +1 -0
  126. package/dist/types/hooks.d.ts +16 -0
  127. package/dist/types/hooks.js +5 -0
  128. package/dist/types/hooks.js.map +1 -0
  129. package/dist/types/index.d.ts +14 -0
  130. package/dist/types/index.js +27 -0
  131. package/dist/types/index.js.map +1 -0
  132. package/dist/types/meta.d.ts +13 -0
  133. package/dist/types/meta.js +5 -0
  134. package/dist/types/meta.js.map +1 -0
  135. package/dist/types/middleware.d.ts +38 -0
  136. package/dist/types/middleware.js +6 -0
  137. package/dist/types/middleware.js.map +1 -0
  138. package/dist/types/registerable.d.ts +10 -0
  139. package/dist/types/registerable.js +5 -0
  140. package/dist/types/registerable.js.map +1 -0
  141. package/dist/types/resources.d.ts +44 -0
  142. package/dist/types/resources.js +5 -0
  143. package/dist/types/resources.js.map +1 -0
  144. package/dist/types/symbols.d.ts +24 -0
  145. package/dist/types/symbols.js +30 -0
  146. package/dist/types/symbols.js.map +1 -0
  147. package/dist/types/tasks.d.ts +41 -0
  148. package/dist/types/tasks.js +5 -0
  149. package/dist/types/tasks.js.map +1 -0
  150. package/dist/types/utilities.d.ts +7 -0
  151. package/dist/types/utilities.js +5 -0
  152. package/dist/types/utilities.js.map +1 -0
  153. package/package.json +10 -6
  154. package/src/__tests__/benchmark/benchmark.test.ts +1 -1
  155. package/src/__tests__/context.test.ts +91 -0
  156. package/src/__tests__/errors.test.ts +8 -5
  157. package/src/__tests__/globalEvents.test.ts +1 -1
  158. package/src/__tests__/globals/cache.middleware.test.ts +772 -0
  159. package/src/__tests__/globals/queue.resource.test.ts +141 -0
  160. package/src/__tests__/globals/requireContext.middleware.test.ts +98 -0
  161. package/src/__tests__/globals/retry.middleware.test.ts +157 -0
  162. package/src/__tests__/index.helper.test.ts +55 -0
  163. package/src/__tests__/models/EventManager.test.ts +144 -0
  164. package/src/__tests__/models/Logger.test.ts +291 -34
  165. package/src/__tests__/models/Queue.test.ts +189 -0
  166. package/src/__tests__/models/ResourceInitializer.test.ts +8 -6
  167. package/src/__tests__/models/Semaphore.test.ts +713 -0
  168. package/src/__tests__/models/Store.test.ts +40 -0
  169. package/src/__tests__/models/TaskRunner.test.ts +86 -5
  170. package/src/__tests__/run.middleware.test.ts +166 -12
  171. package/src/__tests__/run.overrides.test.ts +13 -10
  172. package/src/__tests__/run.test.ts +363 -12
  173. package/src/__tests__/setOutput.test.ts +244 -0
  174. package/src/__tests__/tools/getCallerFile.test.ts +9 -9
  175. package/src/__tests__/typesafety.test.ts +54 -39
  176. package/src/context.ts +86 -0
  177. package/src/define.ts +84 -14
  178. package/src/defs.ts +91 -41
  179. package/src/errors.ts +3 -1
  180. package/src/{globalEvents.ts → globals/globalEvents.ts} +13 -12
  181. package/src/globals/globalMiddleware.ts +14 -0
  182. package/src/{globalResources.ts → globals/globalResources.ts} +14 -10
  183. package/src/globals/middleware/cache.middleware.ts +115 -0
  184. package/src/globals/middleware/requireContext.middleware.ts +36 -0
  185. package/src/globals/middleware/retry.middleware.ts +56 -0
  186. package/src/globals/resources/queue.resource.ts +34 -0
  187. package/src/index.ts +9 -5
  188. package/src/models/DependencyProcessor.ts +36 -40
  189. package/src/models/EventManager.ts +45 -5
  190. package/src/models/Logger.ts +170 -48
  191. package/src/models/OverrideManager.ts +84 -0
  192. package/src/models/Queue.ts +66 -0
  193. package/src/models/ResourceInitializer.ts +38 -20
  194. package/src/models/Semaphore.ts +208 -0
  195. package/src/models/Store.ts +94 -342
  196. package/src/models/StoreConstants.ts +17 -0
  197. package/src/models/StoreRegistry.ts +217 -0
  198. package/src/models/StoreTypes.ts +46 -0
  199. package/src/models/StoreValidator.ts +38 -0
  200. package/src/models/TaskRunner.ts +53 -40
  201. package/src/models/index.ts +3 -0
  202. package/src/run.ts +7 -4
  203. package/src/__tests__/index.ts +0 -15
  204. package/src/examples/express-mongo/index.ts +0 -1
@@ -0,0 +1,166 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Semaphore = void 0;
4
+ /**
5
+ * A semaphore that limits the number of concurrent operations.
6
+ * Used to prevent connection pool exhaustion by limiting concurrent
7
+ * database operations to the pool size.
8
+ */
9
+ class Semaphore {
10
+ permits;
11
+ waitingQueue = [];
12
+ disposed = false;
13
+ maxPermits;
14
+ constructor(maxPermits) {
15
+ if (maxPermits <= 0) {
16
+ throw new Error("maxPermits must be greater than 0");
17
+ }
18
+ this.permits = maxPermits;
19
+ this.maxPermits = maxPermits;
20
+ }
21
+ /**
22
+ * Acquire a permit. If no permits are available, waits until one becomes available.
23
+ */
24
+ async acquire(options) {
25
+ if (this.disposed) {
26
+ throw new Error("Semaphore has been disposed");
27
+ }
28
+ if (options?.signal?.aborted) {
29
+ throw new Error("Operation was aborted");
30
+ }
31
+ if (this.permits > 0) {
32
+ this.permits--;
33
+ return;
34
+ }
35
+ // No permits available, wait in queue
36
+ return new Promise((resolve, reject) => {
37
+ const operation = { resolve, reject };
38
+ // Set up timeout if provided
39
+ if (options?.timeout && options.timeout > 0) {
40
+ operation.timeout = setTimeout(() => {
41
+ this.removeFromQueue(operation);
42
+ reject(new Error(`Semaphore acquire timeout after ${options.timeout}ms`));
43
+ }, options.timeout);
44
+ }
45
+ // Set up abort signal if provided
46
+ if (options?.signal) {
47
+ const abortHandler = () => {
48
+ this.removeFromQueue(operation);
49
+ reject(new Error("Operation was aborted"));
50
+ };
51
+ options.signal.addEventListener("abort", abortHandler, { once: true });
52
+ // Clean up the abort listener when operation completes
53
+ const originalResolve = operation.resolve;
54
+ const originalReject = operation.reject;
55
+ operation.resolve = () => {
56
+ options.signal.removeEventListener("abort", abortHandler);
57
+ originalResolve();
58
+ };
59
+ operation.reject = (error) => {
60
+ options.signal.removeEventListener("abort", abortHandler);
61
+ originalReject(error);
62
+ };
63
+ }
64
+ this.waitingQueue.push(operation);
65
+ });
66
+ }
67
+ /**
68
+ * Release a permit, allowing waiting operations to proceed.
69
+ */
70
+ release() {
71
+ if (this.disposed) {
72
+ return;
73
+ }
74
+ if (this.waitingQueue.length > 0) {
75
+ // Give permit directly to next waiting operation
76
+ const nextOperation = this.waitingQueue.shift();
77
+ // Clear timeout if it exists
78
+ if (nextOperation.timeout) {
79
+ clearTimeout(nextOperation.timeout);
80
+ }
81
+ nextOperation.resolve();
82
+ }
83
+ else {
84
+ // No one waiting, increment available permits (but don't exceed max)
85
+ this.permits = Math.min(this.permits + 1, this.maxPermits);
86
+ }
87
+ }
88
+ removeFromQueue(operation) {
89
+ const index = this.waitingQueue.indexOf(operation);
90
+ if (index !== -1) {
91
+ this.waitingQueue.splice(index, 1);
92
+ // Clear timeout if it exists
93
+ if (operation.timeout) {
94
+ clearTimeout(operation.timeout);
95
+ }
96
+ }
97
+ }
98
+ /**
99
+ * Execute a function with a permit, automatically releasing it afterwards.
100
+ */
101
+ async withPermit(fn, options) {
102
+ await this.acquire(options);
103
+ try {
104
+ return await fn();
105
+ }
106
+ finally {
107
+ this.release();
108
+ }
109
+ }
110
+ /**
111
+ * Dispose the semaphore, rejecting all waiting operations and preventing new ones.
112
+ */
113
+ dispose() {
114
+ if (this.disposed) {
115
+ return;
116
+ }
117
+ this.disposed = true;
118
+ // Reject all waiting operations
119
+ while (this.waitingQueue.length > 0) {
120
+ const operation = this.waitingQueue.shift();
121
+ // Clear timeout if it exists
122
+ if (operation.timeout) {
123
+ clearTimeout(operation.timeout);
124
+ }
125
+ operation.reject(new Error("Semaphore has been disposed"));
126
+ }
127
+ }
128
+ /**
129
+ * Get current number of available permits (for debugging)
130
+ */
131
+ getAvailablePermits() {
132
+ return this.permits;
133
+ }
134
+ /**
135
+ * Get current number of waiting operations (for debugging)
136
+ */
137
+ getWaitingCount() {
138
+ return this.waitingQueue.length;
139
+ }
140
+ /**
141
+ * Get maximum number of permits
142
+ */
143
+ getMaxPermits() {
144
+ return this.maxPermits;
145
+ }
146
+ /**
147
+ * Check if the semaphore has been disposed
148
+ */
149
+ isDisposed() {
150
+ return this.disposed;
151
+ }
152
+ /**
153
+ * Get metrics about the current state of the semaphore
154
+ */
155
+ getMetrics() {
156
+ return {
157
+ availablePermits: this.permits,
158
+ waitingCount: this.waitingQueue.length,
159
+ maxPermits: this.maxPermits,
160
+ utilization: (this.maxPermits - this.permits) / this.maxPermits,
161
+ disposed: this.disposed,
162
+ };
163
+ }
164
+ }
165
+ exports.Semaphore = Semaphore;
166
+ //# sourceMappingURL=Semaphore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Semaphore.js","sourceRoot":"","sources":["../../src/models/Semaphore.ts"],"names":[],"mappings":"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"}
@@ -1,26 +1,9 @@
1
- import { DependencyMapType, DependencyValuesType, IEventDefinition, IResource, ITask, IResourceWithConfig, RegisterableItems, IMiddleware } from "../defs";
1
+ import { IResource, RegisterableItems, IMiddleware } from "../defs";
2
2
  import { IDependentNode } from "../tools/findCircularDependencies";
3
3
  import { EventManager } from "./EventManager";
4
4
  import { Logger } from "./Logger";
5
- export type ResourceStoreElementType<C = any, V = any, D extends DependencyMapType = {}> = {
6
- resource: IResource<C, V, D>;
7
- computedDependencies?: DependencyValuesType<D>;
8
- config: C;
9
- value: V;
10
- isInitialized?: boolean;
11
- };
12
- export type TaskStoreElementType<Input = any, Output extends Promise<any> = any, D extends DependencyMapType = any, TOn extends "*" | IEventDefinition | undefined = any> = {
13
- task: ITask<Input, Output, D, TOn>;
14
- computedDependencies: DependencyValuesType<D>;
15
- isInitialized: boolean;
16
- };
17
- export type MiddlewareStoreElementType<TDeps extends DependencyMapType = any> = {
18
- middleware: IMiddleware<TDeps>;
19
- computedDependencies: DependencyValuesType<TDeps>;
20
- };
21
- export type EventStoreElementType = {
22
- event: IEventDefinition;
23
- };
5
+ import { ResourceStoreElementType, TaskStoreElementType, MiddlewareStoreElementType, EventStoreElementType } from "./StoreTypes";
6
+ export { ResourceStoreElementType, TaskStoreElementType, MiddlewareStoreElementType, EventStoreElementType, };
24
7
  /**
25
8
  * Store class which is used to store all the resources, tasks, middleware and events.
26
9
  */
@@ -29,68 +12,30 @@ export declare class Store {
29
12
  protected readonly eventManager: EventManager;
30
13
  protected readonly logger: Logger;
31
14
  root: ResourceStoreElementType;
32
- tasks: Map<string, TaskStoreElementType>;
33
- resources: Map<string, ResourceStoreElementType>;
34
- events: Map<string, EventStoreElementType>;
35
- middlewares: Map<string, MiddlewareStoreElementType>;
36
- overrides: Map<string, IResource | IMiddleware | ITask | IResourceWithConfig>;
37
- /**
38
- * This is because we can have multiple overrides at once, and the final override is the one that is used.
39
- */
40
- overrideRequests: Set<{
15
+ private registry;
16
+ private overrideManager;
17
+ private validator;
18
+ constructor(eventManager: EventManager, logger: Logger);
19
+ get tasks(): Map<string, TaskStoreElementType>;
20
+ get resources(): Map<string, ResourceStoreElementType>;
21
+ get events(): Map<string, EventStoreElementType>;
22
+ get middlewares(): Map<string, MiddlewareStoreElementType>;
23
+ get overrides(): Map<string, IResource<void, any, any, any> | import("../defs").IResourceWithConfig<any, any, any> | import("../defs").ITask<any, any, {}, undefined> | IMiddleware<any, any>>;
24
+ get overrideRequests(): Set<{
41
25
  source: string;
42
26
  override: RegisterableItems;
43
27
  }>;
44
- constructor(eventManager: EventManager, logger: Logger);
45
28
  get isLocked(): boolean;
46
29
  lock(): void;
47
30
  checkLock(): void;
31
+ private registerGlobalComponents;
32
+ private setupRootResource;
48
33
  initializeStore(root: IResource<any>, config: any): void;
49
- private runSanityChecks;
50
- /**
51
- * Beginning with the root, we perform registering to the container all the resources, tasks, middleware and events.
52
- * @param element
53
- * @param config
54
- */
55
- private computeRegistrationDeeply;
56
- /**
57
- * @param element
58
- */
59
- private storeOverridesDeeply;
60
- /**
61
- * middlewares are already stored in their final form and the check for them would be redundant
62
- * @param id
63
- */
64
- protected checkIfIDExists(id: string): void | never;
65
- /**
66
- * Cleanup
67
- */
68
34
  dispose(): Promise<void>;
69
- /**
70
- * When this is called, all overrides should have been stored in the "overrides" store.
71
- */
72
35
  processOverrides(): void;
73
- getGlobalMiddlewares(excludingIds: string[]): IMiddleware[];
74
- /**
75
- * If you want to register something to the store you can use this function.
76
- * @param item
77
- */
36
+ getEverywhereMiddlewareForTasks(excludingIds: string[]): IMiddleware[];
37
+ getEverywhereMiddlewareForResources(excludingIds: string[]): IMiddleware[];
78
38
  storeGenericItem<C>(item: RegisterableItems): void;
79
- private storeMiddleware;
80
- storeEvent<C>(item: IEventDefinition<void>): void;
81
- private storeResourceWithConfig;
82
- /**
83
- * This is for storing a resource without a config.
84
- * @param item
85
- */
86
- private storeResource;
87
39
  storeEventsForAllTasks(): void;
88
- /**
89
- * This is for storing a resource without a config.
90
- * @param item
91
- */
92
- private prepareResource;
93
- private storeTask;
94
- private middlewareAsMap;
95
40
  getDependentNodes(): IDependentNode[];
96
41
  }
@@ -1,11 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Store = void 0;
4
- const defs_1 = require("../defs");
5
- const utils = require("../define");
6
- const globalEvents_1 = require("../globalEvents");
4
+ const globalEvents_1 = require("../globals/globalEvents");
7
5
  const errors_1 = require("../errors");
8
- const globalResources_1 = require("../globalResources");
6
+ const StoreRegistry_1 = require("./StoreRegistry");
7
+ const OverrideManager_1 = require("./OverrideManager");
8
+ const StoreConstants_1 = require("./StoreConstants");
9
9
  /**
10
10
  * Store class which is used to store all the resources, tasks, middleware and events.
11
11
  */
@@ -13,20 +13,36 @@ class Store {
13
13
  eventManager;
14
14
  logger;
15
15
  root;
16
- tasks = new Map();
17
- resources = new Map();
18
- events = new Map();
19
- middlewares = new Map();
20
- overrides = new Map();
21
- /**
22
- * This is because we can have multiple overrides at once, and the final override is the one that is used.
23
- */
24
- overrideRequests = new Set();
16
+ registry;
17
+ overrideManager;
18
+ validator;
25
19
  #isLocked = false;
26
20
  #isInitialized = false;
27
21
  constructor(eventManager, logger) {
28
22
  this.eventManager = eventManager;
29
23
  this.logger = logger;
24
+ this.registry = new StoreRegistry_1.StoreRegistry();
25
+ this.validator = this.registry.getValidator();
26
+ this.overrideManager = new OverrideManager_1.OverrideManager(this.registry);
27
+ }
28
+ // Delegate properties to registry
29
+ get tasks() {
30
+ return this.registry.tasks;
31
+ }
32
+ get resources() {
33
+ return this.registry.resources;
34
+ }
35
+ get events() {
36
+ return this.registry.events;
37
+ }
38
+ get middlewares() {
39
+ return this.registry.middlewares;
40
+ }
41
+ get overrides() {
42
+ return this.overrideManager.overrides;
43
+ }
44
+ get overrideRequests() {
45
+ return this.overrideManager.overrideRequests;
30
46
  }
31
47
  get isLocked() {
32
48
  return this.#isLocked;
@@ -40,12 +56,26 @@ class Store {
40
56
  throw new Error("Cannot modify the Store when it is locked.");
41
57
  }
42
58
  }
43
- initializeStore(root, config) {
44
- if (this.#isInitialized) {
45
- throw errors_1.Errors.storeAlreadyInitialized();
46
- }
47
- this.storeGenericItem(globalResources_1.globalResources.eventManager.with(this.eventManager));
48
- this.storeGenericItem(globalResources_1.globalResources.store.with(this));
59
+ registerGlobalComponents() {
60
+ // Register built-in resources
61
+ const builtInResources = (0, StoreConstants_1.getBuiltInResources)(this.eventManager, this);
62
+ builtInResources.forEach((resource) => {
63
+ this.registry.storeGenericItem(resource);
64
+ });
65
+ // Register global events
66
+ globalEvents_1.globalEventsArray.forEach((event) => {
67
+ this.registry.storeEvent(event);
68
+ });
69
+ // Register built-in middlewares
70
+ const builtInMiddlewares = (0, StoreConstants_1.getBuiltInMiddlewares)();
71
+ builtInMiddlewares.forEach((middleware) => {
72
+ this.registry.middlewares.set(middleware.id, {
73
+ middleware,
74
+ computedDependencies: {},
75
+ });
76
+ });
77
+ }
78
+ setupRootResource(root, config) {
49
79
  root.dependencies =
50
80
  typeof root.dependencies === "function"
51
81
  ? root.dependencies(config)
@@ -56,275 +86,47 @@ class Store {
56
86
  config,
57
87
  value: undefined,
58
88
  isInitialized: false,
89
+ context: {},
59
90
  };
60
- // register global events
61
- globalEvents_1.globalEventsArray.forEach((event) => {
62
- this.storeEvent(event);
63
- });
64
- this.computeRegistrationDeeply(root, config);
65
- this.resources.set(root.id, this.root);
66
- this.runSanityChecks();
67
- for (const resource of this.resources.values()) {
68
- this.storeOverridesDeeply(resource.resource);
69
- }
70
- this.#isInitialized = true;
91
+ this.registry.computeRegistrationDeeply(root, config);
92
+ this.registry.resources.set(root.id, this.root);
71
93
  }
72
- runSanityChecks() {
73
- for (const task of this.tasks.values()) {
74
- task.task.middleware.forEach((middleware) => {
75
- if (!this.middlewares.has(middleware.id)) {
76
- throw errors_1.Errors.dependencyNotFound(`Middleware ${middleware.id} in Task ${task.task.id}`);
77
- }
78
- });
79
- }
80
- }
81
- /**
82
- * Beginning with the root, we perform registering to the container all the resources, tasks, middleware and events.
83
- * @param element
84
- * @param config
85
- */
86
- computeRegistrationDeeply(element, config) {
87
- const items = typeof element.register === "function"
88
- ? element.register(config)
89
- : element.register;
90
- // if it was a computed function ensure the registered terms are stored, not the function.
91
- element.register = items;
92
- for (const item of items) {
93
- // will call registration if it detects another resource.
94
- this.storeGenericItem(item);
95
- }
96
- }
97
- /**
98
- * @param element
99
- */
100
- storeOverridesDeeply(element) {
101
- element.overrides.forEach((override) => {
102
- // We go deeply for resources, because we want to store all the overrides first
103
- // the one on top has priority of setting the last override.
104
- if (utils.isResource(override)) {
105
- this.storeOverridesDeeply(override);
106
- }
107
- let id;
108
- if (utils.isResourceWithConfig(override)) {
109
- this.storeOverridesDeeply(override.resource);
110
- id = override.resource.id;
111
- }
112
- else {
113
- id = override.id;
114
- }
115
- this.overrideRequests.add({ source: element.id, override });
116
- this.overrides.set(id, override);
117
- });
118
- }
119
- /**
120
- * middlewares are already stored in their final form and the check for them would be redundant
121
- * @param id
122
- */
123
- checkIfIDExists(id) {
124
- if (this.tasks.has(id)) {
125
- throw errors_1.Errors.duplicateRegistration("Task", id);
126
- }
127
- if (this.resources.has(id)) {
128
- throw errors_1.Errors.duplicateRegistration("Resource", id);
129
- }
130
- if (this.events.has(id)) {
131
- throw errors_1.Errors.duplicateRegistration("Event", id);
94
+ initializeStore(root, config) {
95
+ if (this.#isInitialized) {
96
+ throw errors_1.Errors.storeAlreadyInitialized();
132
97
  }
133
- if (this.middlewares.has(id)) {
134
- throw errors_1.Errors.duplicateRegistration("Middleware", id);
98
+ this.registerGlobalComponents();
99
+ this.setupRootResource(root, config);
100
+ this.validator.runSanityChecks();
101
+ for (const resource of this.resources.values()) {
102
+ this.overrideManager.storeOverridesDeeply(resource.resource);
135
103
  }
104
+ this.#isInitialized = true;
136
105
  }
137
- /**
138
- * Cleanup
139
- */
140
106
  async dispose() {
141
107
  for (const resource of this.resources.values()) {
142
108
  if (resource.resource.dispose) {
143
- await resource.resource.dispose(resource.value, resource.config, resource.computedDependencies);
109
+ await resource.resource.dispose(resource.value, resource.config, resource.computedDependencies, resource.context);
144
110
  }
145
111
  }
146
112
  }
147
- /**
148
- * When this is called, all overrides should have been stored in the "overrides" store.
149
- */
150
113
  processOverrides() {
151
- // If we are trying to use override on something that wasn't previously registered, we throw an error.
152
- for (const override of this.overrides.values()) {
153
- let hasAnyItem = false;
154
- if (utils.isTask(override)) {
155
- hasAnyItem = this.tasks.has(override.id);
156
- }
157
- else if (utils.isResource(override)) {
158
- hasAnyItem = this.resources.has(override.id);
159
- }
160
- else if (utils.isMiddleware(override)) {
161
- hasAnyItem = this.middlewares.has(override.id);
162
- }
163
- else if (utils.isResourceWithConfig(override)) {
164
- hasAnyItem = this.resources.has(override.resource.id);
165
- }
166
- if (!hasAnyItem) {
167
- const id = utils.isResourceWithConfig(override)
168
- ? override.resource.id
169
- : override.id;
170
- throw errors_1.Errors.dependencyNotFound(id);
171
- }
172
- }
173
- for (const override of this.overrides.values()) {
174
- if (utils.isTask(override)) {
175
- this.storeTask(override, false);
176
- }
177
- else if (utils.isResource(override)) {
178
- this.storeResource(override, false);
179
- }
180
- else if (utils.isMiddleware(override)) {
181
- this.storeMiddleware(override, false);
182
- }
183
- else if (utils.isResourceWithConfig(override)) {
184
- this.storeResourceWithConfig(override, false);
185
- }
186
- }
114
+ this.overrideManager.processOverrides();
187
115
  }
188
- getGlobalMiddlewares(excludingIds) {
189
- return Array.from(this.middlewares.values())
190
- .filter((x) => x.middleware[defs_1.symbols.middlewareGlobal])
191
- .filter((x) => !excludingIds.includes(x.middleware.id))
192
- .map((x) => x.middleware);
116
+ getEverywhereMiddlewareForTasks(excludingIds) {
117
+ return this.registry.getEverywhereMiddlewareForTasks(excludingIds);
193
118
  }
194
- /**
195
- * If you want to register something to the store you can use this function.
196
- * @param item
197
- */
198
- storeGenericItem(item) {
199
- if (utils.isTask(item)) {
200
- this.storeTask(item);
201
- }
202
- else if (utils.isResource(item)) {
203
- // Registration a simple resource, which is interpreted as a resource with no configuration.
204
- this.storeResource(item);
205
- }
206
- else if (utils.isEvent(item)) {
207
- this.storeEvent(item);
208
- }
209
- else if (utils.isMiddleware(item)) {
210
- this.storeMiddleware(item);
211
- }
212
- else if (utils.isResourceWithConfig(item)) {
213
- this.storeResourceWithConfig(item);
214
- }
215
- else {
216
- throw errors_1.Errors.unknownItemType(item);
217
- }
218
- }
219
- storeMiddleware(item, check = true) {
220
- check && this.checkIfIDExists(item.id);
221
- item.dependencies =
222
- typeof item.dependencies === "function"
223
- ? item.dependencies()
224
- : item.dependencies;
225
- this.middlewares.set(item.id, {
226
- middleware: item,
227
- computedDependencies: {},
228
- });
229
- }
230
- storeEvent(item) {
231
- this.checkIfIDExists(item.id);
232
- this.events.set(item.id, { event: item });
233
- }
234
- storeResourceWithConfig(item, check = true) {
235
- check && this.checkIfIDExists(item.resource.id);
236
- this.prepareResource(item.resource, item.config);
237
- this.resources.set(item.resource.id, {
238
- resource: item.resource,
239
- config: item.config,
240
- value: undefined,
241
- isInitialized: false,
242
- });
243
- this.computeRegistrationDeeply(item.resource, item.config);
119
+ getEverywhereMiddlewareForResources(excludingIds) {
120
+ return this.registry.getEverywhereMiddlewareForResources(excludingIds);
244
121
  }
245
- /**
246
- * This is for storing a resource without a config.
247
- * @param item
248
- */
249
- storeResource(item, check = true) {
250
- check && this.checkIfIDExists(item.id);
251
- this.prepareResource(item, {});
252
- this.resources.set(item.id, {
253
- resource: item,
254
- config: {},
255
- value: undefined,
256
- isInitialized: false,
257
- });
258
- this.computeRegistrationDeeply(item, {});
122
+ storeGenericItem(item) {
123
+ return this.registry.storeGenericItem(item);
259
124
  }
260
125
  storeEventsForAllTasks() {
261
- for (const task of this.tasks.values()) {
262
- this.storeEvent(task.task.events.beforeRun);
263
- this.storeEvent(task.task.events.afterRun);
264
- this.storeEvent(task.task.events.onError);
265
- }
266
- for (const resource of this.resources.values()) {
267
- this.storeEvent(resource.resource.events.beforeInit);
268
- this.storeEvent(resource.resource.events.afterInit);
269
- this.storeEvent(resource.resource.events.onError);
270
- }
271
- }
272
- /**
273
- * This is for storing a resource without a config.
274
- * @param item
275
- */
276
- prepareResource(item, config) {
277
- item.dependencies =
278
- typeof item.dependencies === "function"
279
- ? item.dependencies(config)
280
- : item.dependencies;
281
- return item;
282
- }
283
- storeTask(item, check = true) {
284
- check && this.checkIfIDExists(item.id);
285
- item.dependencies =
286
- typeof item.dependencies === "function"
287
- ? item.dependencies()
288
- : item.dependencies;
289
- this.tasks.set(item.id, {
290
- task: item,
291
- computedDependencies: {},
292
- isInitialized: false,
293
- });
294
- }
295
- middlewareAsMap(middleware) {
296
- return middleware.reduce((acc, item) => {
297
- acc[item.id] = item;
298
- return acc;
299
- }, {});
126
+ this.registry.storeEventsForAllTasks();
300
127
  }
301
128
  getDependentNodes() {
302
- const depenedants = [];
303
- for (const task of this.tasks.values()) {
304
- depenedants.push({
305
- id: task.task.id,
306
- dependencies: {
307
- ...task.task.dependencies,
308
- ...this.middlewareAsMap(task.task.middleware),
309
- },
310
- });
311
- }
312
- for (const middleware of this.middlewares.values()) {
313
- depenedants.push({
314
- id: middleware.middleware.id,
315
- dependencies: middleware.middleware.dependencies,
316
- });
317
- }
318
- for (const resource of this.resources.values()) {
319
- depenedants.push({
320
- id: resource.resource.id,
321
- dependencies: {
322
- ...resource.resource.dependencies,
323
- ...this.middlewareAsMap(resource.resource.middleware),
324
- },
325
- });
326
- }
327
- return depenedants;
129
+ return this.registry.getDependentNodes();
328
130
  }
329
131
  }
330
132
  exports.Store = Store;