@digital-alchemy/core 24.8.3 → 24.9.3

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 (117) hide show
  1. package/README.md +4 -1
  2. package/dist/helpers/async.helper.d.ts +1 -1
  3. package/dist/helpers/async.helper.js +13 -14
  4. package/dist/helpers/async.helper.js.map +1 -1
  5. package/dist/helpers/config-environment-loader.helper.js +16 -20
  6. package/dist/helpers/config-environment-loader.helper.js.map +1 -1
  7. package/dist/helpers/config-file-loader.helper.js +39 -46
  8. package/dist/helpers/config-file-loader.helper.js.map +1 -1
  9. package/dist/helpers/config.helper.d.ts +23 -2
  10. package/dist/helpers/config.helper.js +28 -38
  11. package/dist/helpers/config.helper.js.map +1 -1
  12. package/dist/helpers/context.helper.js +1 -2
  13. package/dist/helpers/cron.helper.d.ts +27 -0
  14. package/dist/helpers/cron.helper.js +4 -7
  15. package/dist/helpers/cron.helper.js.map +1 -1
  16. package/dist/helpers/errors.helper.d.ts +0 -12
  17. package/dist/helpers/errors.helper.js +2 -23
  18. package/dist/helpers/errors.helper.js.map +1 -1
  19. package/dist/helpers/events.helper.js +4 -10
  20. package/dist/helpers/events.helper.js.map +1 -1
  21. package/dist/helpers/extend.helper.js +12 -17
  22. package/dist/helpers/extend.helper.js.map +1 -1
  23. package/dist/helpers/index.d.ts +2 -4
  24. package/dist/helpers/index.js +14 -19
  25. package/dist/helpers/index.js.map +1 -1
  26. package/dist/helpers/lifecycle.helper.d.ts +1 -5
  27. package/dist/helpers/lifecycle.helper.js +1 -4
  28. package/dist/helpers/lifecycle.helper.js.map +1 -1
  29. package/dist/{extensions/logger.extension.d.ts → helpers/logger.helper.d.ts} +33 -40
  30. package/dist/helpers/logger.helper.js +10 -0
  31. package/dist/helpers/logger.helper.js.map +1 -0
  32. package/dist/helpers/module.helper.d.ts +74 -0
  33. package/dist/helpers/module.helper.js +131 -0
  34. package/dist/helpers/module.helper.js.map +1 -0
  35. package/dist/helpers/utilities.helper.d.ts +1 -0
  36. package/dist/helpers/utilities.helper.js +57 -58
  37. package/dist/helpers/utilities.helper.js.map +1 -1
  38. package/dist/helpers/wiring.helper.d.ts +77 -23
  39. package/dist/helpers/wiring.helper.js +45 -47
  40. package/dist/helpers/wiring.helper.js.map +1 -1
  41. package/dist/index.d.ts +2 -1
  42. package/dist/index.js +3 -5
  43. package/dist/index.js.map +1 -1
  44. package/dist/services/als.extension.d.ts +2 -0
  45. package/dist/services/als.extension.js +17 -0
  46. package/dist/services/als.extension.js.map +1 -0
  47. package/dist/services/configuration.extension.d.ts +7 -0
  48. package/dist/services/configuration.extension.js +117 -0
  49. package/dist/services/configuration.extension.js.map +1 -0
  50. package/dist/{extensions → services}/index.d.ts +1 -3
  51. package/dist/services/index.js +8 -0
  52. package/dist/services/index.js.map +1 -0
  53. package/dist/{extensions → services}/internal.extension.d.ts +7 -23
  54. package/dist/{extensions → services}/internal.extension.js +43 -55
  55. package/dist/services/internal.extension.js.map +1 -0
  56. package/dist/{extensions → services}/is.extension.d.ts +5 -0
  57. package/dist/{extensions → services}/is.extension.js +20 -15
  58. package/dist/services/is.extension.js.map +1 -0
  59. package/dist/{extensions → services}/lifecycle.extension.js +17 -19
  60. package/dist/services/lifecycle.extension.js.map +1 -0
  61. package/dist/services/logger.extension.d.ts +2 -0
  62. package/dist/services/logger.extension.js +200 -0
  63. package/dist/services/logger.extension.js.map +1 -0
  64. package/dist/services/scheduler.extension.d.ts +2 -0
  65. package/dist/services/scheduler.extension.js +108 -0
  66. package/dist/services/scheduler.extension.js.map +1 -0
  67. package/dist/services/wiring.extension.d.ts +111 -0
  68. package/dist/services/wiring.extension.js +437 -0
  69. package/dist/services/wiring.extension.js.map +1 -0
  70. package/dist/testing/index.d.ts +2 -0
  71. package/dist/testing/index.js +3 -0
  72. package/dist/testing/index.js.map +1 -0
  73. package/dist/testing/mock-logger.d.ts +2 -0
  74. package/dist/testing/mock-logger.js +11 -0
  75. package/dist/testing/mock-logger.js.map +1 -0
  76. package/dist/testing/test-module.d.ts +112 -0
  77. package/dist/testing/test-module.js +138 -0
  78. package/dist/testing/test-module.js.map +1 -0
  79. package/package.json +57 -43
  80. package/dist/extensions/cache.extension.d.ts +0 -2
  81. package/dist/extensions/cache.extension.js +0 -90
  82. package/dist/extensions/cache.extension.js.map +0 -1
  83. package/dist/extensions/configuration.extension.d.ts +0 -52
  84. package/dist/extensions/configuration.extension.js +0 -131
  85. package/dist/extensions/configuration.extension.js.map +0 -1
  86. package/dist/extensions/fetch.extension.d.ts +0 -17
  87. package/dist/extensions/fetch.extension.js +0 -133
  88. package/dist/extensions/fetch.extension.js.map +0 -1
  89. package/dist/extensions/index.js +0 -13
  90. package/dist/extensions/index.js.map +0 -1
  91. package/dist/extensions/internal.extension.js.map +0 -1
  92. package/dist/extensions/is.extension.js.map +0 -1
  93. package/dist/extensions/lifecycle.extension.js.map +0 -1
  94. package/dist/extensions/logger.extension.js +0 -186
  95. package/dist/extensions/logger.extension.js.map +0 -1
  96. package/dist/extensions/metrics.extension.d.ts +0 -18
  97. package/dist/extensions/metrics.extension.js +0 -156
  98. package/dist/extensions/metrics.extension.js.map +0 -1
  99. package/dist/extensions/scheduler.extension.d.ts +0 -21
  100. package/dist/extensions/scheduler.extension.js +0 -133
  101. package/dist/extensions/scheduler.extension.js.map +0 -1
  102. package/dist/extensions/wiring.extension.d.ts +0 -50
  103. package/dist/extensions/wiring.extension.js +0 -374
  104. package/dist/extensions/wiring.extension.js.map +0 -1
  105. package/dist/helpers/cache-memory.helper.d.ts +0 -6
  106. package/dist/helpers/cache-memory.helper.js +0 -68
  107. package/dist/helpers/cache-memory.helper.js.map +0 -1
  108. package/dist/helpers/cache-redis.helper.d.ts +0 -6
  109. package/dist/helpers/cache-redis.helper.js +0 -73
  110. package/dist/helpers/cache-redis.helper.js.map +0 -1
  111. package/dist/helpers/cache.helper.d.ts +0 -19
  112. package/dist/helpers/cache.helper.js +0 -9
  113. package/dist/helpers/cache.helper.js.map +0 -1
  114. package/dist/helpers/fetch.helper.d.ts +0 -165
  115. package/dist/helpers/fetch.helper.js +0 -173
  116. package/dist/helpers/fetch.helper.js.map +0 -1
  117. /package/dist/{extensions → services}/lifecycle.extension.d.ts +0 -0
@@ -0,0 +1,437 @@
1
+ /* eslint-disable unicorn/no-process-exit */
2
+ import { EventEmitter } from "events";
3
+ import { ACTIVE_SLEEPS, BootstrapException, buildSortOrder, COERCE_CONTEXT, CreateLibrary, each, eachSeries, NONE, SINGLE, WIRE_PROJECT, wireOrder, WIRING_CONTEXT, } from "../helpers";
4
+ import { ALS, InternalDefinition, is } from ".";
5
+ import { Configuration, INITIALIZE, INJECTED_DEFINITIONS, LOAD_PROJECT, } from "./configuration.extension";
6
+ import { CreateLifecycle } from "./lifecycle.extension";
7
+ import { Logger } from "./logger.extension";
8
+ import { Scheduler } from "./scheduler.extension";
9
+ // #MARK: CreateBoilerplate
10
+ function createBoilerplate() {
11
+ // ! DO NOT MOVE TO ANOTHER FILE !
12
+ // While it SEEMS LIKE this can be safely moved, it causes code init race conditions.
13
+ return CreateLibrary({
14
+ configuration: {
15
+ ALS_ENABLED: {
16
+ type: "string",
17
+ },
18
+ /**
19
+ * Only usable by **cli switch**.
20
+ * Pass path to a config file for loader
21
+ *
22
+ * ```bash
23
+ * node dist/app.js --config ~/.config/my_app.ini
24
+ * ```
25
+ */
26
+ CONFIG: {
27
+ description: [
28
+ "Consumable as CLI switch only",
29
+ "If provided, all other file based configurations will be ignored",
30
+ "Environment variables + CLI switches will operate normally",
31
+ ].join(". "),
32
+ type: "string",
33
+ },
34
+ /**
35
+ * > by default true when:
36
+ *
37
+ * ```typescript
38
+ * NODE_ENV === "test*"
39
+ * ```
40
+ *
41
+ * ---
42
+ *
43
+ * When set
44
+ */
45
+ IS_TEST: {
46
+ // test | testing
47
+ default: process.env.NODE_ENV?.startsWith("test"),
48
+ description: "Quick reference for if this app is currently running with test mode",
49
+ type: "boolean",
50
+ },
51
+ /**
52
+ * ### `trace`
53
+ *
54
+ * Very noisy, contains extra details about what's going on in the internals.
55
+ *
56
+ * ### `debug`
57
+ *
58
+ * Additional diagnostic information about operations being form. `"did a thing w/ {name}"` is common.
59
+ *
60
+ * ### `info`
61
+ *
62
+ * Notifications for high level events, and app code.
63
+ *
64
+ * ### `warn`
65
+ *
66
+ * Notification that an non-critical issue happened.
67
+ *
68
+ * ### `error`
69
+ *
70
+ * Error logs are produced from unexpected situations.
71
+ *
72
+ * When an external API sends back an error messages, or tools are being used in a detectably wrong way.
73
+ *
74
+ * ### `fatal`
75
+ *
76
+ * Produce a log at the highest importance level, not common
77
+ *
78
+ * ### `silent`
79
+ *
80
+ * Emit no logs at all
81
+ */
82
+ LOG_LEVEL: {
83
+ default: "trace",
84
+ description: "Minimum log level to process",
85
+ enum: ["silent", "trace", "info", "warn", "debug", "error", "fatal"],
86
+ type: "string",
87
+ },
88
+ /**
89
+ * Reference to `process.env.NODE_ENV` by default, `"local"` if not provided
90
+ */
91
+ NODE_ENV: {
92
+ default: process.env.NODE_ENV || "local",
93
+ type: "string",
94
+ },
95
+ },
96
+ name: "boilerplate",
97
+ priorityInit: ["als", "configuration", "logger", "scheduler"],
98
+ services: {
99
+ /**
100
+ * [AsyncLocalStorage](https://nodejs.org/api/async_context.html) hooks
101
+ *
102
+ * Use to pass data around bypassing business logic and insert data into logs
103
+ */
104
+ als: ALS,
105
+ /**
106
+ * @internal
107
+ *
108
+ * Exposed via `internal.boilerplate.configuration`
109
+ *
110
+ * Used to directly modify application configuration
111
+ */
112
+ configuration: Configuration,
113
+ /**
114
+ * @internal
115
+ *
116
+ * Exposed via `internal.boilerplate.logger`
117
+ *
118
+ * Used to modify the way the logger works at runtime
119
+ */
120
+ logger: Logger,
121
+ /**
122
+ * @internal
123
+ *
124
+ * Used to generate the scheduler that will get injected into other services
125
+ */
126
+ scheduler: Scheduler,
127
+ },
128
+ });
129
+ }
130
+ // (re)defined at bootstrap
131
+ // unclear if this variable even serves a purpose beyond types
132
+ export let LIB_BOILERPLATE;
133
+ const RUNNING_APPLICATIONS = new Map();
134
+ // #MARK: QuickShutdown
135
+ async function quickShutdown(reason) {
136
+ await each([...RUNNING_APPLICATIONS.values()], async (application) => {
137
+ application.logger.warn({ reason }, `starting shutdown`);
138
+ await application.teardown();
139
+ });
140
+ }
141
+ // #MARK: processEvents
142
+ const processEvents = new Map([
143
+ [
144
+ "SIGTERM",
145
+ async () => {
146
+ await quickShutdown("SIGTERM");
147
+ process.exit();
148
+ },
149
+ ],
150
+ [
151
+ "SIGINT",
152
+ async () => {
153
+ await quickShutdown("SIGINT");
154
+ process.exit();
155
+ },
156
+ ],
157
+ // ["uncaughtException", () => {}],
158
+ // ["unhandledRejection", (reason, promise) => {}],
159
+ ]);
160
+ const DECIMALS = 2;
161
+ const BOILERPLATE = (internal) => internal.boot.loadedModules.get("boilerplate");
162
+ // #MARK: CreateApplication
163
+ export function CreateApplication({ name, services = {}, configurationLoaders, libraries = [], configuration = {}, priorityInit = [], }) {
164
+ let internal;
165
+ if (!is.empty(priorityInit)) {
166
+ priorityInit.forEach(name => {
167
+ if (!is.function(services[name])) {
168
+ throw new BootstrapException(WIRING_CONTEXT, "MISSING_PRIORITY_SERVICE", `${name} was listed as priority init, but was not found in services`);
169
+ }
170
+ });
171
+ }
172
+ const serviceApis = {};
173
+ const application = {
174
+ [WIRE_PROJECT]: async (internal) => {
175
+ BOILERPLATE(internal)?.configuration?.[LOAD_PROJECT](name, configuration);
176
+ await eachSeries(wireOrder(priorityInit, Object.keys(services)), async (service) => {
177
+ serviceApis[service] = await wireService(name, service, services[service], internal.boot.lifecycle.events, internal);
178
+ });
179
+ const append = internal.boot.options?.appendService;
180
+ if (!is.empty(append)) {
181
+ await eachSeries(Object.keys(append), async (service) => {
182
+ await wireService(name, service, append[service], internal.boot.lifecycle.events, internal);
183
+ });
184
+ }
185
+ internal.boot.constructComplete.add(name);
186
+ },
187
+ booted: false,
188
+ bootstrap: async (options) => {
189
+ if (application.booted) {
190
+ throw new BootstrapException(WIRING_CONTEXT, "DOUBLE_BOOT", "Application is already booted! Cannot bootstrap again");
191
+ }
192
+ internal = new InternalDefinition();
193
+ await bootstrap(application, options, internal);
194
+ application.booted = true;
195
+ RUNNING_APPLICATIONS.set(name, application);
196
+ },
197
+ configuration,
198
+ configurationLoaders,
199
+ libraries,
200
+ logger: undefined,
201
+ name,
202
+ priorityInit,
203
+ serviceApis,
204
+ services,
205
+ async teardown() {
206
+ if (!application.booted) {
207
+ processEvents.forEach((callback, event) => process.removeListener(event, callback));
208
+ return;
209
+ }
210
+ await teardown(internal, application.logger);
211
+ internal?.utils?.event?.removeAllListeners?.();
212
+ application.booted = false;
213
+ internal = undefined;
214
+ },
215
+ type: "application",
216
+ };
217
+ return application;
218
+ }
219
+ // #MARK: WireService
220
+ async function wireService(project, service, definition, lifecycle, internal) {
221
+ const mappings = internal.boot.moduleMappings.get(project) ?? {};
222
+ mappings[service] = definition;
223
+ internal.boot.moduleMappings.set(project, mappings);
224
+ const context = COERCE_CONTEXT(`${project}:${service}`);
225
+ // logger gets defined first, so this really is only for the start of the start of bootstrapping
226
+ const boilerplate = BOILERPLATE(internal);
227
+ const logger = boilerplate?.logger?.context(context);
228
+ const loaded = internal.boot.loadedModules.get(project) ?? {};
229
+ internal.boot.loadedModules.set(project, loaded);
230
+ try {
231
+ logger?.trace({ name: wireService }, `initializing`);
232
+ const inject = Object.fromEntries([...internal.boot.loadedModules.keys()].map(project => [
233
+ project,
234
+ internal.boot.loadedModules.get(project),
235
+ ]));
236
+ loaded[service] = (await definition({
237
+ ...inject,
238
+ als: boilerplate.als,
239
+ config: boilerplate?.configuration?.[INJECTED_DEFINITIONS](),
240
+ context,
241
+ event: internal?.utils?.event,
242
+ internal,
243
+ lifecycle,
244
+ logger,
245
+ scheduler: boilerplate?.scheduler?.(context),
246
+ }));
247
+ return loaded[service];
248
+ }
249
+ catch (error) {
250
+ // Init errors at this level are considered blocking / fatal
251
+ // eslint-disable-next-line no-console
252
+ console.error("initialization error", error);
253
+ process.exit();
254
+ }
255
+ }
256
+ const runPreInit = async (internal) => {
257
+ const duration = await internal.boot.lifecycle.exec("PreInit");
258
+ internal.boot.completedLifecycleEvents.add("PreInit");
259
+ return duration;
260
+ };
261
+ const runPostConfig = async (internal) => {
262
+ const duration = await internal.boot.lifecycle.exec("PostConfig");
263
+ internal.boot.completedLifecycleEvents.add("PostConfig");
264
+ return duration;
265
+ };
266
+ const runBootstrap = async (internal) => {
267
+ const duration = await internal.boot.lifecycle.exec("Bootstrap");
268
+ internal.boot.completedLifecycleEvents.add("Bootstrap");
269
+ return duration;
270
+ };
271
+ const runReady = async (internal) => {
272
+ const duration = await internal.boot.lifecycle.exec("Ready");
273
+ internal.boot.completedLifecycleEvents.add("Ready");
274
+ return duration;
275
+ };
276
+ // #MARK: Bootstrap
277
+ async function bootstrap(application, options, internal) {
278
+ const initTime = performance.now();
279
+ internal.boot = {
280
+ application,
281
+ completedLifecycleEvents: new Set(),
282
+ constructComplete: new Set(),
283
+ lifecycle: CreateLifecycle(),
284
+ loadedModules: new Map(),
285
+ moduleMappings: new Map(),
286
+ options,
287
+ phase: "bootstrap",
288
+ startup: new Date(),
289
+ };
290
+ process.title = application.name;
291
+ try {
292
+ const STATS = {};
293
+ const CONSTRUCT = {};
294
+ // pre-create loaded module for boilerplate, so it can be attached to `internal`
295
+ // this allows it to be used as part of `internal` during boilerplate construction
296
+ // otherwise it'd only be there for everyone else
297
+ const api = {};
298
+ internal.boilerplate = api;
299
+ internal.boot.loadedModules.set("boilerplate", api);
300
+ STATS.Construct = CONSTRUCT;
301
+ // * Recreate base eventemitter
302
+ internal.utils.event = new EventEmitter();
303
+ internal.utils.event.setMaxListeners(NONE);
304
+ // ? Some libraries need to be aware of
305
+ // * Generate a new boilerplate module
306
+ LIB_BOILERPLATE = createBoilerplate();
307
+ // * Wire it
308
+ let start = performance.now();
309
+ await LIB_BOILERPLATE[WIRE_PROJECT](internal, wireService);
310
+ CONSTRUCT.boilerplate = `${(performance.now() - start).toFixed(DECIMALS)}ms`;
311
+ // ~ configuration
312
+ api.configuration?.[LOAD_PROJECT](LIB_BOILERPLATE.name, LIB_BOILERPLATE.configuration);
313
+ const logger = api.logger.context(WIRING_CONTEXT);
314
+ application.logger = logger;
315
+ logger.info({ name: bootstrap }, `[boilerplate] wiring complete`);
316
+ // * Wire in various shutdown events
317
+ processEvents.forEach((callback, event) => {
318
+ process.on(event, callback);
319
+ logger.trace({ event, name: bootstrap }, "register shutdown event");
320
+ });
321
+ // * Add in libraries
322
+ application.libraries ??= [];
323
+ if (!is.undefined(options?.appendLibrary)) {
324
+ const list = is.array(options.appendLibrary)
325
+ ? options.appendLibrary
326
+ : [options.appendLibrary];
327
+ list.forEach(append => {
328
+ application.libraries.some((library, index) => {
329
+ if (append.name === library.name) {
330
+ // remove existing
331
+ logger.warn({ name: append.name }, `replacing library`);
332
+ application.libraries.splice(index, SINGLE);
333
+ return true;
334
+ }
335
+ return false;
336
+ });
337
+ logger.info({ name: append.name }, `appending library`);
338
+ // append
339
+ application.libraries.push(append);
340
+ });
341
+ }
342
+ const order = buildSortOrder(application, logger);
343
+ await eachSeries(order, async (i) => {
344
+ start = performance.now();
345
+ logger.info({ name: bootstrap }, `[%s] init project`, i.name);
346
+ await i[WIRE_PROJECT](internal, wireService);
347
+ CONSTRUCT[i.name] = `${(performance.now() - start).toFixed(DECIMALS)}ms`;
348
+ });
349
+ logger.trace({ name: bootstrap }, `library wiring complete`);
350
+ // * Finally the application
351
+ if (options?.bootLibrariesFirst) {
352
+ logger.warn({ name: bootstrap }, `bootLibrariesFirst`);
353
+ }
354
+ else {
355
+ logger.info({ name: bootstrap }, `init application`);
356
+ start = performance.now();
357
+ await application[WIRE_PROJECT](internal, wireService);
358
+ CONSTRUCT[application.name] = `${(performance.now() - start).toFixed(DECIMALS)}ms`;
359
+ }
360
+ // ? Configuration values provided bootstrap take priority over module level
361
+ if (!is.empty(options?.configuration)) {
362
+ api.configuration.merge(options?.configuration);
363
+ }
364
+ // - Kick off lifecycle
365
+ logger.debug({ name: bootstrap }, `[PreInit] running lifecycle callbacks`);
366
+ STATS.PreInit = await runPreInit(internal);
367
+ // - Pull in user configurations
368
+ logger.debug({ name: bootstrap }, "loading configuration");
369
+ const config = BOILERPLATE(internal)?.configuration;
370
+ STATS.Configure = await config?.[INITIALIZE](application);
371
+ // - Run through other events in order
372
+ logger.debug({ name: bootstrap }, `[PostConfig] running lifecycle callbacks`);
373
+ STATS.PostConfig = await runPostConfig(internal);
374
+ logger.debug({ name: bootstrap }, `[Bootstrap] running lifecycle callbacks`);
375
+ STATS.Bootstrap = await runBootstrap(internal);
376
+ if (options?.bootLibrariesFirst) {
377
+ // * mental note
378
+ // running between bootstrap & ready seems most appropriate
379
+ // resources are expected to *technically* be ready at this point, but not finalized
380
+ // reference examples:
381
+ // - hass: socket is open & resources are ready
382
+ // - fastify: bindings are available but port isn't listening
383
+ logger.info({ name: bootstrap }, `late init application`);
384
+ start = performance.now();
385
+ await application[WIRE_PROJECT](internal, wireService);
386
+ CONSTRUCT[application.name] = `${(performance.now() - start).toFixed(DECIMALS)}ms`;
387
+ }
388
+ logger.debug({ name: bootstrap }, `[Ready] running lifecycle callbacks`);
389
+ STATS.Ready = await runReady(internal);
390
+ STATS.Total = `${(performance.now() - initTime).toFixed(DECIMALS)}ms`;
391
+ // * App is ready!
392
+ logger.info(options?.showExtraBootStats
393
+ ? { ...STATS, name: bootstrap }
394
+ : { Total: STATS.Total, name: bootstrap }, `[%s] application bootstrapped`, application.name);
395
+ internal.boot.phase = "running";
396
+ }
397
+ catch (error) {
398
+ if (options?.configuration?.boilerplate?.LOG_LEVEL !== "silent") {
399
+ // eslint-disable-next-line no-console
400
+ console.error("bootstrap failed", error);
401
+ }
402
+ process.exit();
403
+ }
404
+ }
405
+ // #MARK: Teardown
406
+ async function teardown(internal, logger) {
407
+ // * Announce
408
+ logger.warn({ name: teardown }, `received teardown request`);
409
+ internal.boot.phase = "teardown";
410
+ try {
411
+ // * PreShutdown
412
+ logger.debug({ name: teardown }, `[PreShutdown] running lifecycle callbacks`);
413
+ await internal.boot.lifecycle.exec("PreShutdown");
414
+ internal.boot.completedLifecycleEvents.add("PreShutdown");
415
+ // * Formally shutting down
416
+ logger.info({ name: teardown }, `tearing down application`);
417
+ logger.debug({ name: teardown }, `[ShutdownStart] running lifecycle callbacks`);
418
+ await internal.boot.lifecycle.exec("ShutdownStart");
419
+ internal.boot.completedLifecycleEvents.add("ShutdownStart");
420
+ // - clean up active `sleep` calls (can keep tests open and stuff)
421
+ ACTIVE_SLEEPS.forEach(i => i.kill("stop"));
422
+ logger.debug({ name: teardown }, `[ShutdownComplete] running lifecycle callbacks`);
423
+ await internal.boot.lifecycle.exec("ShutdownComplete");
424
+ internal.boot.completedLifecycleEvents.add("ShutdownComplete");
425
+ }
426
+ catch (error) {
427
+ // ! oof
428
+ global.console.error({ error }, "error occurred during teardown, some lifecycle events may be incomplete");
429
+ }
430
+ // * Final resource cleanup, attempt to reset everything possible
431
+ logger.info({
432
+ name: teardown,
433
+ started_at: internal.utils.relativeDate(internal.boot.startup),
434
+ }, `application terminated`);
435
+ processEvents.forEach((callback, event) => process.removeListener(event, callback));
436
+ }
437
+ //# sourceMappingURL=wiring.extension.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wiring.extension.js","sourceRoot":"","sources":["../../src/services/wiring.extension.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export * from "./mock-logger";
2
+ export * from "./test-module";
@@ -0,0 +1,3 @@
1
+ export * from "./mock-logger";
2
+ export * from "./test-module";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { ILogger } from "../helpers";
2
+ export declare function createMockLogger(): ILogger;
@@ -0,0 +1,11 @@
1
+ export function createMockLogger() {
2
+ return {
3
+ debug: jest.fn(),
4
+ error: jest.fn(),
5
+ fatal: jest.fn(),
6
+ info: jest.fn(),
7
+ trace: jest.fn(),
8
+ warn: jest.fn(),
9
+ };
10
+ }
11
+ //# sourceMappingURL=mock-logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock-logger.js","sourceRoot":"","sources":["../../src/testing/mock-logger.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,gBAAgB;IAC9B,OAAO;QACL,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE;QAChB,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE;QAChB,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE;QAChB,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE;QACf,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE;QAChB,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE;KAChB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,112 @@
1
+ import { ApplicationDefinition, ConfigLoader, ILogger, LibraryDefinition, LoggerOptions, ModuleConfiguration, OptionalModuleConfiguration, PartialConfiguration, ServiceFunction, ServiceMap, TConfigLogLevel, TLibrary } from "../helpers";
2
+ export type CreateTestingLibraryOptions<S extends ServiceMap, C extends OptionalModuleConfiguration> = {
3
+ /**
4
+ * default: testing
5
+ */
6
+ name?: string;
7
+ target?: LibraryDefinition<S, C> | ApplicationDefinition<S, C>;
8
+ };
9
+ type TestingBootstrapOptions = {
10
+ /**
11
+ * default: false
12
+ *
13
+ * set to true to have this test emit logs
14
+ */
15
+ emitLogs?: boolean;
16
+ /**
17
+ * mostly useful for testing deep internals
18
+ */
19
+ configLoader?: ConfigLoader;
20
+ /**
21
+ * pass through to bootstrap params
22
+ */
23
+ loggerOptions?: LoggerOptions;
24
+ /**
25
+ * default: false
26
+ *
27
+ * Should testing apps consider config file / environment variables?
28
+ */
29
+ loadConfigs?: boolean;
30
+ /**
31
+ * replacement logger object to use
32
+ *
33
+ * default: **NOOP**
34
+ */
35
+ customLogger?: ILogger;
36
+ /**
37
+ * matches regular bootstrap options
38
+ */
39
+ bootLibrariesFirst?: boolean;
40
+ /**
41
+ * default values to use for configurations, before user values come in
42
+ */
43
+ configuration?: PartialConfiguration;
44
+ /**
45
+ * @internal
46
+ *
47
+ * define a configuration for the unit tests
48
+ *
49
+ * > **note**: you probably don't need to do this, it's not even documented
50
+ */
51
+ module_config?: ModuleConfiguration;
52
+ };
53
+ export type LibraryTestRunner<T> = T extends LibraryDefinition<infer S, infer C> ? iTestRunner<S, C> : never;
54
+ export type ApplicationTestRunner<T> = T extends ApplicationDefinition<infer S, infer C> ? iTestRunner<S, C> : never;
55
+ export type iTestRunner<S extends ServiceMap, C extends OptionalModuleConfiguration> = {
56
+ /**
57
+ * chained calls deep merge options together
58
+ */
59
+ configure: (configuration: PartialConfiguration) => iTestRunner<S, C>;
60
+ /**
61
+ * chained calls deep merge options together
62
+ */
63
+ setOptions: (options: TestingBootstrapOptions) => iTestRunner<S, C>;
64
+ /**
65
+ * sets flag to true
66
+ */
67
+ bootLibrariesFirst: () => iTestRunner<S, C>;
68
+ /**
69
+ * for debugging, single command to enable logging on this test
70
+ */
71
+ emitLogs: (log_level?: TConfigLogLevel) => iTestRunner<S, C>;
72
+ /**
73
+ * chained calls add multiple setup functions
74
+ */
75
+ setup: (test: ServiceFunction) => iTestRunner<S, C>;
76
+ /**
77
+ * returns reference to app that was booted
78
+ */
79
+ run: (test: ServiceFunction) => Promise<ApplicationDefinition<ServiceMap, OptionalModuleConfiguration>>;
80
+ /**
81
+ * add a library to the runner beyond what the target module requested
82
+ */
83
+ appendLibrary: (library: TLibrary) => iTestRunner<S, C>;
84
+ /**
85
+ * inject an extra service to your module
86
+ *
87
+ * by default will take the function name as context, can optionally provide the name as 2nd param (if it even matters)
88
+ */
89
+ appendService: (service: ServiceFunction, name?: string) => iTestRunner<S, C>;
90
+ /**
91
+ * substitute a library for another by name
92
+ */
93
+ replaceLibrary: (name: string, library: TLibrary) => iTestRunner<S, C>;
94
+ /**
95
+ * substitute a service for another in your module
96
+ *
97
+ * does not check if the substitution is valid
98
+ */
99
+ replaceService: (name: string, service: ServiceFunction) => iTestRunner<S, C>;
100
+ /**
101
+ * reference to the app teardown internally
102
+ *
103
+ * clean up your testing resources!
104
+ */
105
+ teardown: () => Promise<void>;
106
+ type: "test";
107
+ };
108
+ /**
109
+ * library optional
110
+ */
111
+ export declare function TestRunner<S extends ServiceMap, C extends OptionalModuleConfiguration>(options?: CreateTestingLibraryOptions<S, C>): iTestRunner<S, C>;
112
+ export {};