@bluelibs/runner 3.3.0 → 3.3.2

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 (43) hide show
  1. package/dist/define.js +24 -23
  2. package/dist/define.js.map +1 -1
  3. package/dist/defs/core.d.ts +144 -0
  4. package/dist/defs/core.js +6 -0
  5. package/dist/defs/core.js.map +1 -0
  6. package/dist/defs/symbols.d.ts +42 -0
  7. package/dist/defs/symbols.js +45 -0
  8. package/dist/defs/symbols.js.map +1 -0
  9. package/dist/defs/tags.d.ts +70 -0
  10. package/dist/defs/tags.js +6 -0
  11. package/dist/defs/tags.js.map +1 -0
  12. package/dist/defs.d.ts +11 -18
  13. package/dist/defs.js +16 -19
  14. package/dist/defs.js.map +1 -1
  15. package/dist/models/StoreTypes.d.ts +2 -2
  16. package/dist/types/dependencies.d.ts +47 -18
  17. package/dist/types/event.d.ts +49 -0
  18. package/dist/types/event.js +4 -0
  19. package/dist/types/event.js.map +1 -0
  20. package/dist/types/index.d.ts +4 -10
  21. package/dist/types/index.js +8 -7
  22. package/dist/types/index.js.map +1 -1
  23. package/dist/types/metadata.d.ts +75 -0
  24. package/dist/types/metadata.js +3 -0
  25. package/dist/types/metadata.js.map +1 -0
  26. package/dist/types/middleware.d.ts +43 -18
  27. package/dist/types/middleware.js +0 -3
  28. package/dist/types/middleware.js.map +1 -1
  29. package/dist/types/resource.d.ts +96 -0
  30. package/dist/types/resource.js +3 -0
  31. package/dist/types/resource.js.map +1 -0
  32. package/dist/types/symbols.d.ts +17 -0
  33. package/dist/types/symbols.js +18 -3
  34. package/dist/types/symbols.js.map +1 -1
  35. package/dist/types/task.d.ts +68 -0
  36. package/dist/types/task.js +3 -0
  37. package/dist/types/task.js.map +1 -0
  38. package/package.json +1 -1
  39. package/src/__tests__/models/EventManager.test.ts +39 -6
  40. package/src/__tests__/tools/getCallerFile.test.ts +9 -11
  41. package/src/define.ts +31 -24
  42. package/src/defs.ts +11 -19
  43. package/src/models/StoreTypes.ts +3 -2
@@ -1,4 +1,9 @@
1
- import { IEvent, IEventEmission, symbolEvent } from "../../defs";
1
+ import {
2
+ IEvent,
3
+ IEventEmission,
4
+ symbolEvent,
5
+ symbolFilePath,
6
+ } from "../../defs";
2
7
  import { Errors } from "../../errors";
3
8
  import { EventManager } from "../../models/EventManager";
4
9
 
@@ -8,7 +13,11 @@ describe("EventManager", () => {
8
13
 
9
14
  beforeEach(() => {
10
15
  eventManager = new EventManager();
11
- eventDefinition = { id: "testEvent", [symbolEvent]: true };
16
+ eventDefinition = {
17
+ id: "testEvent",
18
+ [symbolEvent]: true,
19
+ [symbolFilePath]: "test.ts",
20
+ };
12
21
  });
13
22
 
14
23
  it("should add and emit event listener", async () => {
@@ -165,10 +174,12 @@ describe("EventManager", () => {
165
174
  const eventDef1: IEvent<string> = {
166
175
  id: "event1",
167
176
  [symbolEvent]: true,
177
+ [symbolFilePath]: "test.ts",
168
178
  };
169
179
  const eventDef2: IEvent<string> = {
170
180
  id: "event2",
171
181
  [symbolEvent]: true,
182
+ [symbolFilePath]: "test.ts",
172
183
  };
173
184
 
174
185
  const handler1 = jest.fn();
@@ -215,10 +226,12 @@ describe("EventManager", () => {
215
226
  const eventDef1: IEvent<string> = {
216
227
  id: "event1",
217
228
  [symbolEvent]: true,
229
+ [symbolFilePath]: "test.ts",
218
230
  };
219
231
  const eventDef2: IEvent<string> = {
220
232
  id: "event2",
221
233
  [symbolEvent]: true,
234
+ [symbolFilePath]: "test.ts",
222
235
  };
223
236
 
224
237
  const handler = jest.fn();
@@ -249,10 +262,12 @@ describe("EventManager", () => {
249
262
  const eventDef1: IEvent<string> = {
250
263
  id: "event1",
251
264
  [symbolEvent]: true,
265
+ [symbolFilePath]: "test.ts",
252
266
  };
253
267
  const eventDef2: IEvent<string> = {
254
268
  id: "event2",
255
269
  [symbolEvent]: true,
270
+ [symbolFilePath]: "test.ts",
256
271
  };
257
272
 
258
273
  const handler1 = jest.fn();
@@ -392,6 +407,7 @@ describe("EventManager", () => {
392
407
  const voidEventDefinition: IEvent<void> = {
393
408
  id: "voidEvent",
394
409
  [symbolEvent]: true,
410
+ [symbolFilePath]: "test.ts",
395
411
  };
396
412
 
397
413
  eventManager.addListener(voidEventDefinition, handler);
@@ -445,8 +461,16 @@ describe("EventManager", () => {
445
461
  });
446
462
 
447
463
  it("should invalidate all caches when adding global listeners", async () => {
448
- const event1: IEvent<string> = { id: "event1", [symbolEvent]: true };
449
- const event2: IEvent<string> = { id: "event2", [symbolEvent]: true };
464
+ const event1: IEvent<string> = {
465
+ id: "event1",
466
+ [symbolEvent]: true,
467
+ [symbolFilePath]: "test.ts",
468
+ };
469
+ const event2: IEvent<string> = {
470
+ id: "event2",
471
+ [symbolEvent]: true,
472
+ [symbolFilePath]: "test.ts",
473
+ };
450
474
 
451
475
  const handler1 = jest.fn();
452
476
  const handler2 = jest.fn();
@@ -473,6 +497,7 @@ describe("EventManager", () => {
473
497
  const emptyEventDef: IEvent<string> = {
474
498
  id: "emptyEvent",
475
499
  [symbolEvent]: true,
500
+ [symbolFilePath]: "test.ts",
476
501
  };
477
502
 
478
503
  // Should return immediately without creating event object
@@ -528,8 +553,16 @@ describe("EventManager", () => {
528
553
  });
529
554
 
530
555
  it("should reuse cached results across different event types", async () => {
531
- const event1: IEvent<string> = { id: "event1", [symbolEvent]: true };
532
- const event2: IEvent<string> = { id: "event2", [symbolEvent]: true };
556
+ const event1: IEvent<string> = {
557
+ id: "event1",
558
+ [symbolEvent]: true,
559
+ [symbolFilePath]: "test.ts",
560
+ };
561
+ const event2: IEvent<string> = {
562
+ id: "event2",
563
+ [symbolEvent]: true,
564
+ [symbolFilePath]: "test.ts",
565
+ };
533
566
 
534
567
  const handler1 = jest.fn();
535
568
  const handler2 = jest.fn();
@@ -4,7 +4,7 @@ import {
4
4
  defineMiddleware,
5
5
  defineEvent,
6
6
  } from "../../define";
7
- import { symbols } from "../../defs";
7
+ import { symbolFilePath } from "../../defs";
8
8
  import {
9
9
  getCallerFile,
10
10
  generateCallerIdFromFile,
@@ -41,17 +41,15 @@ describe("getCallerFile", () => {
41
41
  id: "event",
42
42
  });
43
43
 
44
- expect((task as any)[symbols.filePath]).toBeDefined();
45
- expect((resource as any)[symbols.filePath]).toBeDefined();
46
- expect((middleware as any)[symbols.filePath]).toBeDefined();
47
- expect((event as any)[symbols.filePath]).toBeDefined();
44
+ expect((task as any)[symbolFilePath]).toBeDefined();
45
+ expect((resource as any)[symbolFilePath]).toBeDefined();
46
+ expect((middleware as any)[symbolFilePath]).toBeDefined();
47
+ expect((event as any)[symbolFilePath]).toBeDefined();
48
48
 
49
- expect((task as any)[symbols.filePath]).toContain("getCallerFile.test");
50
- expect((resource as any)[symbols.filePath]).toContain("getCallerFile.test");
51
- expect((middleware as any)[symbols.filePath]).toContain(
52
- "getCallerFile.test"
53
- );
54
- expect((event as any)[symbols.filePath]).toContain("getCallerFile.test");
49
+ expect((task as any)[symbolFilePath]).toContain("getCallerFile.test");
50
+ expect((resource as any)[symbolFilePath]).toContain("getCallerFile.test");
51
+ expect((middleware as any)[symbolFilePath]).toContain("getCallerFile.test");
52
+ expect((event as any)[symbolFilePath]).toContain("getCallerFile.test");
55
53
  });
56
54
  });
57
55
 
package/src/define.ts CHANGED
@@ -13,7 +13,6 @@ import {
13
13
  IResourceDefinition,
14
14
  IEventDefinition,
15
15
  IMiddlewareDefinition,
16
- symbols,
17
16
  DependencyMapType,
18
17
  DependencyValuesType,
19
18
  IMiddleware,
@@ -28,6 +27,12 @@ import {
28
27
  ITagWithConfig,
29
28
  TagType,
30
29
  ITaggable,
30
+ symbolTask,
31
+ symbolMiddlewareEverywhereTasks,
32
+ symbolMiddlewareEverywhereResources,
33
+ symbolResourceWithConfig,
34
+ symbolResource,
35
+ symbolMiddleware,
31
36
  } from "./defs";
32
37
  import { Errors } from "./errors";
33
38
  import { generateCallerIdFromFile, getCallerFile } from "./tools/getCallerFile";
@@ -52,8 +57,8 @@ export function defineTask<
52
57
  const isAnonymous = !Boolean(taskConfig.id);
53
58
  const id = taskConfig.id || generateCallerIdFromFile(filePath, "task");
54
59
  return {
55
- [symbols.task]: true,
56
- [symbols.filePath]: filePath,
60
+ [symbolTask]: true,
61
+ [symbolFilePath]: filePath,
57
62
  id,
58
63
  dependencies: taskConfig.dependencies || ({} as Deps),
59
64
  middleware: taskConfig.middleware || [],
@@ -67,7 +72,7 @@ export function defineTask<
67
72
  ? Symbol(`anonymous-task.events.beforeRun`)
68
73
  : `${id as string}.events.beforeRun`,
69
74
  }),
70
- [symbols.filePath]: getCallerFile(),
75
+ [symbolFilePath]: getCallerFile(),
71
76
  },
72
77
  afterRun: {
73
78
  ...defineEvent({
@@ -75,7 +80,7 @@ export function defineTask<
75
80
  ? Symbol(`anonymous-task.events.afterRun`)
76
81
  : `${id as string}.events.afterRun`,
77
82
  }),
78
- [symbols.filePath]: getCallerFile(),
83
+ [symbolFilePath]: getCallerFile(),
79
84
  },
80
85
  onError: {
81
86
  ...defineEvent({
@@ -83,7 +88,7 @@ export function defineTask<
83
88
  ? Symbol(`anonymous-task.events.onError`)
84
89
  : `${id as string}.events.onError`,
85
90
  }),
86
- [symbols.filePath]: getCallerFile(),
91
+ [symbolFilePath]: getCallerFile(),
87
92
  },
88
93
  },
89
94
  meta: taskConfig.meta || {},
@@ -112,9 +117,11 @@ export function defineResource<
112
117
  const id =
113
118
  constConfig.id ||
114
119
  generateCallerIdFromFile(filePath, isIndexResource ? "index" : "resource");
120
+
115
121
  return {
116
- [symbols.resource]: true,
117
- [symbols.filePath]: filePath,
122
+ [symbolResource]: true,
123
+ [symbolFilePath]: filePath,
124
+ [symbolIndexResource]: isIndexResource,
118
125
  id,
119
126
  dependencies: constConfig.dependencies,
120
127
  dispose: constConfig.dispose,
@@ -124,7 +131,7 @@ export function defineResource<
124
131
  context: constConfig.context,
125
132
  with: function (config: TConfig) {
126
133
  return {
127
- [symbols.resourceWithConfig]: true,
134
+ [symbolResourceWithConfig]: true,
128
135
  id: this.id,
129
136
  resource: this,
130
137
  config,
@@ -138,7 +145,7 @@ export function defineResource<
138
145
  ? Symbol(`anonymous-resource.events.beforeInit`)
139
146
  : `${id as string}.events.beforeInit`,
140
147
  }),
141
- [symbols.filePath]: filePath,
148
+ [symbolFilePath]: filePath,
142
149
  },
143
150
  afterInit: {
144
151
  ...defineEvent({
@@ -146,7 +153,7 @@ export function defineResource<
146
153
  ? Symbol(`anonymous-resource.events.afterInit`)
147
154
  : `${id as string}.events.afterInit`,
148
155
  }),
149
- [symbols.filePath]: filePath,
156
+ [symbolFilePath]: filePath,
150
157
  },
151
158
  onError: {
152
159
  ...defineEvent({
@@ -154,7 +161,7 @@ export function defineResource<
154
161
  ? Symbol(`anonymous-resource.events.onError`)
155
162
  : `${id as string}.events.onError`,
156
163
  }),
157
- [symbols.filePath]: filePath,
164
+ [symbolFilePath]: filePath,
158
165
  },
159
166
  },
160
167
  meta: constConfig.meta || {},
@@ -198,8 +205,8 @@ export function defineIndex<
198
205
  async init(_, deps) {
199
206
  return deps as any;
200
207
  },
201
- [symbols.filePath]: callerFilePath,
202
- [symbols.indexResource]: true,
208
+ [symbolFilePath]: callerFilePath,
209
+ [symbolIndexResource]: true,
203
210
  });
204
211
  }
205
212
 
@@ -215,7 +222,7 @@ export function defineEvent<TPayload = void>(
215
222
  return {
216
223
  ...eventConfig,
217
224
  id: eventConfig.id || generateCallerIdFromFile(callerFilePath, "event"),
218
- [symbols.filePath]: callerFilePath,
225
+ [symbolFilePath]: callerFilePath,
219
226
  [symbolEvent]: true, // This is a workaround
220
227
  };
221
228
  }
@@ -245,8 +252,8 @@ export function defineMiddleware<
245
252
  */
246
253
  const filePath = getCallerFile();
247
254
  const object = {
248
- [symbols.filePath]: filePath,
249
- [symbols.middleware]: true,
255
+ [symbolFilePath]: filePath,
256
+ [symbolMiddleware]: true,
250
257
  config: {} as TConfig,
251
258
  id: middlewareDef.id || generateCallerIdFromFile(filePath, "middleware"),
252
259
  ...middlewareDef,
@@ -270,8 +277,8 @@ export function defineMiddleware<
270
277
 
271
278
  return {
272
279
  ...object,
273
- [symbols.middlewareEverywhereTasks]: tasks,
274
- [symbols.middlewareEverywhereResources]: resources,
280
+ [symbolMiddlewareEverywhereTasks]: tasks,
281
+ [symbolMiddlewareEverywhereResources]: resources,
275
282
  everywhere() {
276
283
  throw Errors.middlewareAlreadyGlobal(object.id);
277
284
  },
@@ -281,25 +288,25 @@ export function defineMiddleware<
281
288
  }
282
289
 
283
290
  export function isTask(definition: any): definition is ITask {
284
- return definition && definition[symbols.task];
291
+ return definition && definition[symbolTask];
285
292
  }
286
293
 
287
294
  export function isResource(definition: any): definition is IResource {
288
- return definition && definition[symbols.resource];
295
+ return definition && definition[symbolResource];
289
296
  }
290
297
 
291
298
  export function isResourceWithConfig(
292
299
  definition: any
293
300
  ): definition is IResourceWithConfig {
294
- return definition && definition[symbols.resourceWithConfig];
301
+ return definition && definition[symbolResourceWithConfig];
295
302
  }
296
303
 
297
304
  export function isEvent(definition: any): definition is IEvent {
298
- return definition && definition[symbols.event];
305
+ return definition && definition[symbolEvent];
299
306
  }
300
307
 
301
308
  export function isMiddleware(definition: any): definition is IMiddleware {
302
- return definition && definition[symbols.middleware];
309
+ return definition && definition[symbolMiddleware];
303
310
  }
304
311
 
305
312
  /**
package/src/defs.ts CHANGED
@@ -18,7 +18,7 @@ import { MiddlewareEverywhereOptions } from "./define";
18
18
 
19
19
  // Re-export public cache type so consumers don’t import from internals.
20
20
  export { ICacheInstance } from "./globals/middleware/cache.middleware";
21
-
21
+ export * from "./models/StoreTypes";
22
22
  /**
23
23
  * Internal brand symbols used to tag created objects at runtime and help with
24
24
  * type‑narrowing. Prefer the `isTask`/`isResource`/`isEvent`/`isMiddleware`
@@ -57,24 +57,6 @@ export const symbolIndexResource: unique symbol = Symbol(
57
57
  "runner.indexResource"
58
58
  );
59
59
 
60
- /**
61
- * Convenience bag of internal symbols. Intended for framework internals;
62
- * consumers should not rely on this shape.
63
- * @internal
64
- */
65
- export const symbols = {
66
- task: symbolTask,
67
- resource: symbolResource,
68
- resourceWithConfig: symbolResourceWithConfig,
69
- indexResource: symbolIndexResource,
70
- event: symbolEvent,
71
- middleware: symbolMiddleware,
72
- middlewareEverywhereTasks: symbolMiddlewareEverywhereTasks,
73
- middlewareEverywhereResources: symbolMiddlewareEverywhereResources,
74
- filePath: symbolFilePath,
75
- dispose: symbolDispose,
76
- store: symbolStore,
77
- };
78
60
  export interface ITagDefinition<TConfig = void> {
79
61
  id: string | symbol;
80
62
  }
@@ -104,6 +86,7 @@ export interface ITag<TConfig = void> extends ITagDefinition<TConfig> {
104
86
  * or from a taggable object (`{ meta: { tags?: [] } }`).
105
87
  */
106
88
  extract(target: TagType[] | ITaggable): ExtractedTagResult<TConfig> | null;
89
+ [symbolFilePath]: string;
107
90
  }
108
91
 
109
92
  /**
@@ -315,6 +298,8 @@ export interface ITask<
315
298
  afterRun: IEvent<AfterRunEventPayload<TInput, TOutput>>;
316
299
  onError: IEvent<OnErrorEventPayload>;
317
300
  };
301
+ [symbolFilePath]: string;
302
+ [symbolTask]: true;
318
303
  }
319
304
 
320
305
  export interface IResourceDefinition<
@@ -374,6 +359,7 @@ export interface IResourceDefinition<
374
359
  context?: () => TContext;
375
360
  /**
376
361
  * This is optional and used from an index resource to get the correct caller.
362
+ * This is the reason we allow it here as well.
377
363
  */
378
364
  [symbolFilePath]?: string;
379
365
  /**
@@ -403,6 +389,9 @@ export interface IResource<
403
389
  };
404
390
  overrides: Array<IResource | ITask | IMiddleware | IResourceWithConfig>;
405
391
  middleware: MiddlewareAttachments[];
392
+ [symbolFilePath]: string;
393
+ [symbolIndexResource]: boolean;
394
+ [symbolResource]: true;
406
395
  }
407
396
 
408
397
  export interface IResourceWithConfig<
@@ -434,6 +423,7 @@ export interface IEvent<TPayload = any> extends IEventDefinition<TPayload> {
434
423
  * 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.
435
424
  */
436
425
  [symbolEvent]: true;
426
+ [symbolFilePath]: string;
437
427
  }
438
428
 
439
429
  /**
@@ -511,6 +501,8 @@ export interface IMiddleware<
511
501
  config: TConfig;
512
502
  /** Configure the middleware and return a marked, configured instance. */
513
503
  with: (config: TConfig) => IMiddlewareConfigured<TConfig, TDependencies>;
504
+ [symbolFilePath]: string;
505
+ [symbolMiddleware]: true;
514
506
  }
515
507
 
516
508
  export interface IMiddlewareConfigured<
@@ -8,6 +8,7 @@ import {
8
8
  IResourceWithConfig,
9
9
  RegisterableItems,
10
10
  IMiddleware,
11
+ IEvent,
11
12
  } from "../defs";
12
13
 
13
14
  export type ResourceStoreElementType<
@@ -42,5 +43,5 @@ export type MiddlewareStoreElementType<TDeps extends DependencyMapType = any> =
42
43
  };
43
44
 
44
45
  export type EventStoreElementType = {
45
- event: IEventDefinition;
46
- };
46
+ event: IEvent<any>;
47
+ };