@digital-alchemy/core 24.8.4 → 24.9.4
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 +17 -27
- package/dist/helpers/async.helper.d.ts +1 -1
- package/dist/helpers/async.helper.js +13 -14
- package/dist/helpers/async.helper.js.map +1 -1
- package/dist/helpers/config-environment-loader.helper.js +16 -20
- package/dist/helpers/config-environment-loader.helper.js.map +1 -1
- package/dist/helpers/config-file-loader.helper.d.ts +5 -3
- package/dist/helpers/config-file-loader.helper.js +45 -52
- package/dist/helpers/config-file-loader.helper.js.map +1 -1
- package/dist/helpers/config.helper.d.ts +24 -3
- package/dist/helpers/config.helper.js +30 -37
- package/dist/helpers/config.helper.js.map +1 -1
- package/dist/helpers/context.helper.js +1 -2
- package/dist/helpers/cron.helper.d.ts +27 -0
- package/dist/helpers/cron.helper.js +4 -7
- package/dist/helpers/cron.helper.js.map +1 -1
- package/dist/helpers/errors.helper.d.ts +0 -12
- package/dist/helpers/errors.helper.js +2 -23
- package/dist/helpers/errors.helper.js.map +1 -1
- package/dist/helpers/events.helper.js +4 -10
- package/dist/helpers/events.helper.js.map +1 -1
- package/dist/helpers/extend.helper.d.ts +2 -0
- package/dist/helpers/extend.helper.js +19 -24
- package/dist/helpers/extend.helper.js.map +1 -1
- package/dist/helpers/index.d.ts +2 -4
- package/dist/helpers/index.js +14 -19
- package/dist/helpers/index.js.map +1 -1
- package/dist/helpers/lifecycle.helper.d.ts +1 -5
- package/dist/helpers/lifecycle.helper.js +1 -4
- package/dist/helpers/lifecycle.helper.js.map +1 -1
- package/dist/{extensions/logger.extension.d.ts → helpers/logger.helper.d.ts} +33 -40
- package/dist/helpers/logger.helper.js +10 -0
- package/dist/helpers/logger.helper.js.map +1 -0
- package/dist/helpers/module.helper.d.ts +74 -0
- package/dist/helpers/module.helper.js +131 -0
- package/dist/helpers/module.helper.js.map +1 -0
- package/dist/helpers/utilities.helper.d.ts +3 -14
- package/dist/helpers/utilities.helper.js +51 -73
- package/dist/helpers/utilities.helper.js.map +1 -1
- package/dist/helpers/wiring.helper.d.ts +77 -23
- package/dist/helpers/wiring.helper.js +45 -47
- package/dist/helpers/wiring.helper.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +3 -5
- package/dist/index.js.map +1 -1
- package/dist/services/als.extension.d.ts +2 -0
- package/dist/services/als.extension.js +17 -0
- package/dist/services/als.extension.js.map +1 -0
- package/dist/services/configuration.extension.d.ts +7 -0
- package/dist/services/configuration.extension.js +117 -0
- package/dist/services/configuration.extension.js.map +1 -0
- package/dist/{extensions → services}/index.d.ts +1 -3
- package/dist/services/index.js +8 -0
- package/dist/services/index.js.map +1 -0
- package/dist/{extensions → services}/internal.extension.d.ts +7 -23
- package/dist/{extensions → services}/internal.extension.js +43 -55
- package/dist/services/internal.extension.js.map +1 -0
- package/dist/{extensions → services}/is.extension.d.ts +5 -0
- package/dist/{extensions → services}/is.extension.js +20 -15
- package/dist/services/is.extension.js.map +1 -0
- package/dist/{extensions → services}/lifecycle.extension.js +17 -19
- package/dist/services/lifecycle.extension.js.map +1 -0
- package/dist/services/logger.extension.d.ts +2 -0
- package/dist/services/logger.extension.js +201 -0
- package/dist/services/logger.extension.js.map +1 -0
- package/dist/services/scheduler.extension.d.ts +2 -0
- package/dist/services/scheduler.extension.js +108 -0
- package/dist/services/scheduler.extension.js.map +1 -0
- package/dist/services/wiring.extension.d.ts +111 -0
- package/dist/services/wiring.extension.js +437 -0
- package/dist/services/wiring.extension.js.map +1 -0
- package/dist/testing/index.d.ts +2 -0
- package/dist/testing/index.js +3 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/mock-logger.d.ts +2 -0
- package/dist/testing/mock-logger.js +11 -0
- package/dist/testing/mock-logger.js.map +1 -0
- package/dist/testing/test-module.d.ts +112 -0
- package/dist/testing/test-module.js +138 -0
- package/dist/testing/test-module.js.map +1 -0
- package/package.json +56 -43
- package/dist/extensions/cache.extension.d.ts +0 -2
- package/dist/extensions/cache.extension.js +0 -90
- package/dist/extensions/cache.extension.js.map +0 -1
- package/dist/extensions/configuration.extension.d.ts +0 -52
- package/dist/extensions/configuration.extension.js +0 -131
- package/dist/extensions/configuration.extension.js.map +0 -1
- package/dist/extensions/fetch.extension.d.ts +0 -17
- package/dist/extensions/fetch.extension.js +0 -133
- package/dist/extensions/fetch.extension.js.map +0 -1
- package/dist/extensions/index.js +0 -13
- package/dist/extensions/index.js.map +0 -1
- package/dist/extensions/internal.extension.js.map +0 -1
- package/dist/extensions/is.extension.js.map +0 -1
- package/dist/extensions/lifecycle.extension.js.map +0 -1
- package/dist/extensions/logger.extension.js +0 -186
- package/dist/extensions/logger.extension.js.map +0 -1
- package/dist/extensions/metrics.extension.d.ts +0 -18
- package/dist/extensions/metrics.extension.js +0 -156
- package/dist/extensions/metrics.extension.js.map +0 -1
- package/dist/extensions/scheduler.extension.d.ts +0 -21
- package/dist/extensions/scheduler.extension.js +0 -133
- package/dist/extensions/scheduler.extension.js.map +0 -1
- package/dist/extensions/wiring.extension.d.ts +0 -50
- package/dist/extensions/wiring.extension.js +0 -374
- package/dist/extensions/wiring.extension.js.map +0 -1
- package/dist/helpers/cache-memory.helper.d.ts +0 -6
- package/dist/helpers/cache-memory.helper.js +0 -68
- package/dist/helpers/cache-memory.helper.js.map +0 -1
- package/dist/helpers/cache-redis.helper.d.ts +0 -6
- package/dist/helpers/cache-redis.helper.js +0 -73
- package/dist/helpers/cache-redis.helper.js.map +0 -1
- package/dist/helpers/cache.helper.d.ts +0 -19
- package/dist/helpers/cache.helper.js +0 -9
- package/dist/helpers/cache.helper.js.map +0 -1
- package/dist/helpers/fetch.helper.d.ts +0 -165
- package/dist/helpers/fetch.helper.js +0 -173
- package/dist/helpers/fetch.helper.js.map +0 -1
- /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 @@
|
|
|
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 @@
|
|
|
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 {};
|