@avijs/core 0.2.1 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/app.d.ts +6 -0
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +87 -2
- package/dist/app.js.map +1 -1
- package/dist/config.d.ts +2 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +6 -0
- package/dist/config.js.map +1 -1
- package/dist/controller.d.ts +6 -4
- package/dist/controller.d.ts.map +1 -1
- package/dist/controller.js.map +1 -1
- package/dist/endpoint.d.ts +62 -0
- package/dist/endpoint.d.ts.map +1 -0
- package/dist/endpoint.js +2 -0
- package/dist/endpoint.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/pipeline.d.ts +15 -4
- package/dist/pipeline.d.ts.map +1 -1
- package/dist/pipeline.js.map +1 -1
- package/dist/summary.d.ts +30 -0
- package/dist/summary.d.ts.map +1 -0
- package/dist/summary.js +74 -0
- package/dist/summary.js.map +1 -0
- package/package.json +4 -4
- package/src/app.ts +96 -2
- package/src/config.ts +8 -0
- package/src/controller.ts +12 -6
- package/src/endpoint.ts +107 -0
- package/src/index.ts +2 -0
- package/src/pipeline.ts +18 -7
- package/src/summary.ts +99 -0
package/dist/app.d.ts
CHANGED
|
@@ -20,6 +20,12 @@ export interface AviOptions extends ServerOptions {
|
|
|
20
20
|
* An override that matches no provider is an error.
|
|
21
21
|
*/
|
|
22
22
|
overrides?: readonly Provider[];
|
|
23
|
+
/**
|
|
24
|
+
* What `listen()` reports once the app is up: modules, providers, config, routes and the
|
|
25
|
+
* startup time. `'routes'` also lists every route; `false` reports nothing. Default: on,
|
|
26
|
+
* except when `NODE_ENV` is `test`. A logger with `info` receives it as one structured entry.
|
|
27
|
+
*/
|
|
28
|
+
startupSummary?: boolean | 'routes';
|
|
23
29
|
}
|
|
24
30
|
export interface AviApp {
|
|
25
31
|
/** Adds a root module: `defineModule`, an `@Module` class or inline options. Checks run in `init()`. */
|
package/dist/app.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,KAAK,QAAQ,EAAE,KAAK,KAAK,EAAE,KAAK,SAAS,EAAE,MAAM,WAAW,CAAC;AACjF,OAAO,EAML,KAAK,UAAU,EAIf,KAAK,aAAa,EACnB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAkB,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,KAAK,QAAQ,EAAE,KAAK,KAAK,EAAE,KAAK,SAAS,EAAE,MAAM,WAAW,CAAC;AACjF,OAAO,EAML,KAAK,UAAU,EAIf,KAAK,aAAa,EACnB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAkB,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAK5C,OAAO,EAAoC,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AACtF,OAAO,EAIL,KAAK,aAAa,EAClB,KAAK,SAAS,EACf,MAAM,aAAa,CAAC;AACrB,OAAO,EAIL,KAAK,QAAQ,EAEb,KAAK,aAAa,EAClB,KAAK,SAAS,EACf,MAAM,eAAe,CAAC;AAavB,MAAM,WAAW,UAAW,SAAQ,aAAa;IAC/C,mCAAmC;IACnC,UAAU,CAAC,EAAE,SAAS,aAAa,EAAE,CAAC;IACtC,sCAAsC;IACtC,MAAM,CAAC,EAAE,SAAS,QAAQ,EAAE,CAAC;IAC7B;;;OAGG;IACH,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B;;;OAGG;IACH,SAAS,CAAC,EAAE,SAAS,QAAQ,EAAE,CAAC;IAChC;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;CACrC;AAED,MAAM,WAAW,MAAM;IACrB,wGAAwG;IACxG,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,aAAa,GAAG,IAAI,CAAC;IAClD,+FAA+F;IAC/F,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,8DAA8D;IAC9D,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAC1D,4FAA4F;IAC5F,GAAG,CAAC,CAAC,SAAS,KAAK,EAAE,KAAK,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;IAC7C,wFAAwF;IACxF,MAAM,IAAI,SAAS,SAAS,EAAE,CAAC;IAC/B,0FAA0F;IAC1F,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,CAAC;IACzC,QAAQ,CAAC,OAAO,EAAE,SAAS,GAAG,SAAS,CAAC;CACzC;AASD,wBAAgB,SAAS,CAAC,OAAO,GAAE,UAAe,GAAG,MAAM,CAE1D;AAED,eAAO,MAAM,UAAU;IACrB,qFAAqF;mBAChE,SAAS,GAAG,aAAa,YAAY,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;CAKvF,CAAC"}
|
package/dist/app.js
CHANGED
|
@@ -1,12 +1,25 @@
|
|
|
1
1
|
import { Container } from '@avijs/di';
|
|
2
2
|
import { HttpServer, Router, compose, } from '@avijs/http';
|
|
3
3
|
import { withValidation } from '@avijs/validation';
|
|
4
|
+
import { createRequire } from 'node:module';
|
|
5
|
+
import { performance } from 'node:perf_hooks';
|
|
6
|
+
import { isConfigToken } from './config.js';
|
|
4
7
|
import { joinPath } from './controller.js';
|
|
5
8
|
import { checkConsumers, injectOf } from './consumers.js';
|
|
6
9
|
import { describeModules, firstDifference } from './describe.js';
|
|
7
10
|
import { defineModule, toModule, } from './module.js';
|
|
8
11
|
import { checkRefs, isClass, } from './pipeline.js';
|
|
9
12
|
import { REQUEST, REQUEST_TOKENS } from './request.js';
|
|
13
|
+
import { addressUrl, formatSummary, summaryFields, summaryLine, } from './summary.js';
|
|
14
|
+
const { version } = createRequire(import.meta.url)('../package.json');
|
|
15
|
+
/** The error and its causes, one per line. */
|
|
16
|
+
function describeFailure(error, depth = 0) {
|
|
17
|
+
if (!(error instanceof Error))
|
|
18
|
+
return String(error);
|
|
19
|
+
if (error.cause === undefined || depth === 4)
|
|
20
|
+
return error.message;
|
|
21
|
+
return `${error.message}\n${describeFailure(error.cause, depth + 1)}`;
|
|
22
|
+
}
|
|
10
23
|
export function createAvi(options = {}) {
|
|
11
24
|
return new Application(options);
|
|
12
25
|
}
|
|
@@ -27,6 +40,10 @@ class Application {
|
|
|
27
40
|
#manifest;
|
|
28
41
|
#overrides;
|
|
29
42
|
#logger;
|
|
43
|
+
#summary;
|
|
44
|
+
#createdAt = performance.now();
|
|
45
|
+
#report = { version, durationMs: 0 };
|
|
46
|
+
#step = 'Dependency graph';
|
|
30
47
|
#container;
|
|
31
48
|
#routes;
|
|
32
49
|
#init;
|
|
@@ -36,6 +53,8 @@ class Application {
|
|
|
36
53
|
this.#guards = checkRefs(options.guards, 'canActivate', 'App guards');
|
|
37
54
|
this.#manifest = options.manifest;
|
|
38
55
|
this.#overrides = options.overrides ?? [];
|
|
56
|
+
const summary = options.startupSummary ?? process.env['NODE_ENV'] !== 'test';
|
|
57
|
+
this.#summary = summary === 'routes' ? 'routes' : summary ? 'basic' : false;
|
|
39
58
|
this.#logger = options.logger ?? {
|
|
40
59
|
error(message, error, fields) {
|
|
41
60
|
console.error(fields?.requestId ? `${message} [${fields.requestId}]` : message, error);
|
|
@@ -55,8 +74,48 @@ class Application {
|
|
|
55
74
|
return (this.#init ??= this.#start());
|
|
56
75
|
}
|
|
57
76
|
async listen(port, host) {
|
|
58
|
-
|
|
59
|
-
|
|
77
|
+
let address;
|
|
78
|
+
try {
|
|
79
|
+
await this.init();
|
|
80
|
+
this.#step = 'HTTP server';
|
|
81
|
+
address = await this.#server.listen(port, host);
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
this.#announce({ step: this.#step, message: describeFailure(error) });
|
|
85
|
+
throw error;
|
|
86
|
+
}
|
|
87
|
+
this.#report.url = addressUrl(address);
|
|
88
|
+
this.#announce();
|
|
89
|
+
return address;
|
|
90
|
+
}
|
|
91
|
+
/** Prints the startup summary; see `startupSummary`. */
|
|
92
|
+
#announce(failure) {
|
|
93
|
+
if (!this.#summary)
|
|
94
|
+
return;
|
|
95
|
+
const report = this.#report;
|
|
96
|
+
report.durationMs = performance.now() - this.#createdAt;
|
|
97
|
+
if (failure)
|
|
98
|
+
report.failure = failure;
|
|
99
|
+
if (this.#routes) {
|
|
100
|
+
report.routes = this.#routes.map(({ method, path, controller }) => ({
|
|
101
|
+
method,
|
|
102
|
+
path,
|
|
103
|
+
controller,
|
|
104
|
+
}));
|
|
105
|
+
}
|
|
106
|
+
if (this.#logger.info) {
|
|
107
|
+
if (!failure)
|
|
108
|
+
this.#logger.info('Application started', summaryFields(report));
|
|
109
|
+
}
|
|
110
|
+
else if (process.stdout.isTTY) {
|
|
111
|
+
// isTTY can be set on a plain stream (tests do), which has no hasColors.
|
|
112
|
+
const { hasColors } = process.stdout;
|
|
113
|
+
const colors = hasColors?.call(process.stdout) ?? false;
|
|
114
|
+
process.stdout.write(formatSummary(report, this.#summary === 'routes', colors));
|
|
115
|
+
}
|
|
116
|
+
else if (!failure) {
|
|
117
|
+
console.log(summaryLine(report));
|
|
118
|
+
}
|
|
60
119
|
}
|
|
61
120
|
get(token) {
|
|
62
121
|
if (!this.#container)
|
|
@@ -78,9 +137,16 @@ class Application {
|
|
|
78
137
|
requestTokens: REQUEST_TOKENS,
|
|
79
138
|
});
|
|
80
139
|
const modules = container.modules;
|
|
140
|
+
const report = this.#report;
|
|
141
|
+
report.modules = modules.length;
|
|
81
142
|
checkConsumers(container);
|
|
143
|
+
report.graphValidated = true;
|
|
144
|
+
this.#step = 'Providers';
|
|
82
145
|
await container.init();
|
|
146
|
+
report.providers = container.describe().reduce((sum, m) => sum + m.providers.length, 0);
|
|
147
|
+
report.configVariables = countConfig(container, modules);
|
|
83
148
|
try {
|
|
149
|
+
this.#step = 'Routes';
|
|
84
150
|
const appScope = new Pipeline((token) => container.get(token));
|
|
85
151
|
const appMiddleware = appScope.middleware(this.#middleware);
|
|
86
152
|
const appGuards = appScope.guards(this.#guards);
|
|
@@ -122,6 +188,7 @@ class Application {
|
|
|
122
188
|
this.#router.add(routes);
|
|
123
189
|
this.#routes = Object.freeze(infos);
|
|
124
190
|
if (this.#manifest) {
|
|
191
|
+
this.#step = 'Manifest';
|
|
125
192
|
const difference = firstDifference(this.#manifest, describeModules(container));
|
|
126
193
|
if (difference) {
|
|
127
194
|
throw new Error(`The app does not match its manifest (first difference at ${difference}). Regenerate the manifest.`);
|
|
@@ -154,6 +221,24 @@ class Application {
|
|
|
154
221
|
};
|
|
155
222
|
}
|
|
156
223
|
}
|
|
224
|
+
/** Variables across the app's `defineConfig` tokens, or undefined when it has none. */
|
|
225
|
+
function countConfig(container, modules) {
|
|
226
|
+
const seen = new Set();
|
|
227
|
+
let total;
|
|
228
|
+
for (const module of modules) {
|
|
229
|
+
for (const provider of module.providers) {
|
|
230
|
+
const token = typeof provider === 'object' ? provider.provide : undefined;
|
|
231
|
+
if (!isConfigToken(token) || seen.has(token))
|
|
232
|
+
continue;
|
|
233
|
+
seen.add(token);
|
|
234
|
+
const value = container.resolve(module, token);
|
|
235
|
+
total =
|
|
236
|
+
(total ?? 0) +
|
|
237
|
+
(typeof value === 'object' && value !== null ? Object.keys(value).length : 0);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
return total;
|
|
241
|
+
}
|
|
157
242
|
function tokenLabel(token) {
|
|
158
243
|
return typeof token === 'function' ? token.name : token.description;
|
|
159
244
|
}
|
package/dist/app.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
CHANGED
|
@@ -24,6 +24,8 @@ export interface ConfigToken<T> extends InjectionToken<T> {
|
|
|
24
24
|
/** Reads and validates the config now, outside dependency injection. */
|
|
25
25
|
load(): Promise<T>;
|
|
26
26
|
}
|
|
27
|
+
/** True for tokens made by `defineConfig`. */
|
|
28
|
+
export declare function isConfigToken(value: unknown): value is ConfigToken<unknown>;
|
|
27
29
|
/** Thrown when the environment does not match the config schema. Never contains the values. */
|
|
28
30
|
export declare class ConfigError extends Error {
|
|
29
31
|
readonly issues: readonly {
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,MAAM,WAAW,CAAC;AACnF,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAGvE,OAAO,EAAgB,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAE3D,MAAM,WAAW,aAAa;IAC5B,oEAAoE;IACpE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IACxD,2EAA2E;IAC3E,GAAG,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;CACpD;AAED,2FAA2F;AAC3F,MAAM,WAAW,WAAW,CAAC,CAAC,CAAE,SAAQ,cAAc,CAAC,CAAC,CAAC;IACvD,8FAA8F;IAC9F,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAC3B,+DAA+D;IAC/D,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC;IACtC,wEAAwE;IACxE,IAAI,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC;CACpB;AAED,+FAA+F;AAC/F,qBAAa,WAAY,SAAQ,KAAK;IAElC,QAAQ,CAAC,MAAM,EAAE,SAAS;QAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE;gBAArE,MAAM,EAAE,SAAS;QAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,EAC9E,IAAI,EAAE,MAAM;CAOf;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,gBAAgB,EACrD,MAAM,EAAE,CAAC,EACT,OAAO,GAAE,aAAkB,GAC1B,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,MAAM,WAAW,CAAC;AACnF,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAGvE,OAAO,EAAgB,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAE3D,MAAM,WAAW,aAAa;IAC5B,oEAAoE;IACpE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IACxD,2EAA2E;IAC3E,GAAG,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;CACpD;AAED,2FAA2F;AAC3F,MAAM,WAAW,WAAW,CAAC,CAAC,CAAE,SAAQ,cAAc,CAAC,CAAC,CAAC;IACvD,8FAA8F;IAC9F,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAC3B,+DAA+D;IAC/D,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC;IACtC,wEAAwE;IACxE,IAAI,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC;CACpB;AAID,8CAA8C;AAC9C,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,WAAW,CAAC,OAAO,CAAC,CAE3E;AAED,+FAA+F;AAC/F,qBAAa,WAAY,SAAQ,KAAK;IAElC,QAAQ,CAAC,MAAM,EAAE,SAAS;QAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE;gBAArE,MAAM,EAAE,SAAS;QAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,EAC9E,IAAI,EAAE,MAAM;CAOf;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,gBAAgB,EACrD,MAAM,EAAE,CAAC,EACT,OAAO,GAAE,aAAkB,GAC1B,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAmC7B"}
|
package/dist/config.js
CHANGED
|
@@ -2,6 +2,11 @@ import { createToken } from '@avijs/di';
|
|
|
2
2
|
import { readFile } from 'node:fs/promises';
|
|
3
3
|
import { parseEnv } from 'node:util';
|
|
4
4
|
import { defineModule } from './module.js';
|
|
5
|
+
const CONFIG = Symbol('avi.config');
|
|
6
|
+
/** True for tokens made by `defineConfig`. */
|
|
7
|
+
export function isConfigToken(value) {
|
|
8
|
+
return typeof value === 'object' && value !== null && CONFIG in value;
|
|
9
|
+
}
|
|
5
10
|
/** Thrown when the environment does not match the config schema. Never contains the values. */
|
|
6
11
|
export class ConfigError extends Error {
|
|
7
12
|
issues;
|
|
@@ -42,6 +47,7 @@ export function defineConfig(schema, options = {}) {
|
|
|
42
47
|
const config = { description: token.description, load };
|
|
43
48
|
config.provider = { provide: config, useFactory: load };
|
|
44
49
|
config.module = defineModule({ name, providers: [config.provider], exports: [config] });
|
|
50
|
+
Object.defineProperty(config, CONFIG, { value: true });
|
|
45
51
|
return Object.freeze(config);
|
|
46
52
|
}
|
|
47
53
|
async function readEnvFile(path, required) {
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/controller.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { ResolveTokens, Token } from '@avijs/di';
|
|
2
2
|
import type { HttpMethod } from '@avijs/http';
|
|
3
3
|
import { type GuardRef, type MiddlewareRef, type Route } from './pipeline.js';
|
|
4
|
-
export interface ControllerOptions<K extends readonly Token[] = []> {
|
|
4
|
+
export interface ControllerOptions<K extends readonly Token[] = [], R extends readonly Route[] = readonly Route[]> {
|
|
5
5
|
/** Used in manifests and error messages. Default: 'controller <prefix>'. */
|
|
6
6
|
name?: string;
|
|
7
7
|
/** Path prefix for every route. Default: `/`. */
|
|
@@ -12,14 +12,14 @@ export interface ControllerOptions<K extends readonly Token[] = []> {
|
|
|
12
12
|
middleware?: readonly MiddlewareRef[];
|
|
13
13
|
/** Checked for every route in this controller, after app and module guards. */
|
|
14
14
|
guards?: readonly GuardRef[];
|
|
15
|
-
routes:
|
|
15
|
+
routes: R | ((...deps: ResolveTokens<K>) => R);
|
|
16
16
|
}
|
|
17
17
|
/** The normalized shape both controller styles produce. */
|
|
18
18
|
export interface StaticRoute {
|
|
19
19
|
readonly method: HttpMethod;
|
|
20
20
|
readonly path: string;
|
|
21
21
|
}
|
|
22
|
-
export interface ControllerDefinition {
|
|
22
|
+
export interface ControllerDefinition<R extends readonly Route[] = readonly Route[]> {
|
|
23
23
|
readonly name: string;
|
|
24
24
|
readonly prefix: string;
|
|
25
25
|
readonly inject: readonly Token[];
|
|
@@ -28,8 +28,10 @@ export interface ControllerDefinition {
|
|
|
28
28
|
/** Routes known without creating the controller; 'dynamic' for a routes factory. */
|
|
29
29
|
readonly staticRoutes: readonly StaticRoute[] | 'dynamic';
|
|
30
30
|
createRoutes(deps: readonly unknown[]): readonly Route[];
|
|
31
|
+
/** Type-only: the routes as written, for `avi client`. Never set. */
|
|
32
|
+
readonly '~routes'?: R;
|
|
31
33
|
}
|
|
32
|
-
export declare function defineController<const K extends readonly Token[] = []>(options: ControllerOptions<K>): ControllerDefinition
|
|
34
|
+
export declare function defineController<const K extends readonly Token[] = [], const R extends readonly Route[] = readonly Route[]>(options: ControllerOptions<K, R>): ControllerDefinition<R>;
|
|
33
35
|
export declare function checkRoutes(value: unknown): readonly Route[];
|
|
34
36
|
/** Joins a prefix and a route path, collapsing repeated slashes and dropping a trailing one. */
|
|
35
37
|
export declare function joinPath(prefix: string, path: string): string;
|
package/dist/controller.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../src/controller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,OAAO,EAAa,KAAK,QAAQ,EAAE,KAAK,aAAa,EAAE,KAAK,KAAK,EAAE,MAAM,eAAe,CAAC;AAEzF,MAAM,WAAW,iBAAiB,CAAC,CAAC,SAAS,SAAS,KAAK,EAAE,GAAG,EAAE;
|
|
1
|
+
{"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../src/controller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,OAAO,EAAa,KAAK,QAAQ,EAAE,KAAK,aAAa,EAAE,KAAK,KAAK,EAAE,MAAM,eAAe,CAAC;AAEzF,MAAM,WAAW,iBAAiB,CAChC,CAAC,SAAS,SAAS,KAAK,EAAE,GAAG,EAAE,EAC/B,CAAC,SAAS,SAAS,KAAK,EAAE,GAAG,SAAS,KAAK,EAAE;IAE7C,4EAA4E;IAC5E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iDAAiD;IACjD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iDAAiD;IACjD,MAAM,CAAC,EAAE,CAAC,CAAC;IACX,gFAAgF;IAChF,UAAU,CAAC,EAAE,SAAS,aAAa,EAAE,CAAC;IACtC,+EAA+E;IAC/E,MAAM,CAAC,EAAE,SAAS,QAAQ,EAAE,CAAC;IAC7B,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;CAChD;AAED,2DAA2D;AAC3D,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,oBAAoB,CAAC,CAAC,SAAS,SAAS,KAAK,EAAE,GAAG,SAAS,KAAK,EAAE;IACjF,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,SAAS,KAAK,EAAE,CAAC;IAClC,QAAQ,CAAC,UAAU,EAAE,SAAS,aAAa,EAAE,CAAC;IAC9C,QAAQ,CAAC,MAAM,EAAE,SAAS,QAAQ,EAAE,CAAC;IACrC,oFAAoF;IACpF,QAAQ,CAAC,YAAY,EAAE,SAAS,WAAW,EAAE,GAAG,SAAS,CAAC;IAC1D,YAAY,CAAC,IAAI,EAAE,SAAS,OAAO,EAAE,GAAG,SAAS,KAAK,EAAE,CAAC;IACzD,qEAAqE;IACrE,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;CACxB;AAED,wBAAgB,gBAAgB,CAC9B,KAAK,CAAC,CAAC,SAAS,SAAS,KAAK,EAAE,GAAG,EAAE,EACrC,KAAK,CAAC,CAAC,SAAS,SAAS,KAAK,EAAE,GAAG,SAAS,KAAK,EAAE,EACnD,OAAO,EAAE,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,oBAAoB,CAAC,CAAC,CAAC,CAsC3D;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS,KAAK,EAAE,CAiB5D;AAED,gGAAgG;AAChG,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAG7D"}
|
package/dist/controller.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"controller.js","sourceRoot":"","sources":["../src/controller.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAiD,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"controller.js","sourceRoot":"","sources":["../src/controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type { Readable } from 'node:stream';
|
|
2
|
+
import type { Reply } from '@avijs/http';
|
|
3
|
+
import type { InferInput, InferOutput, PathParams, StandardSchemaV1 } from '@avijs/validation';
|
|
4
|
+
import type { ControllerDefinition } from './controller.js';
|
|
5
|
+
type Fn = (...args: never[]) => unknown;
|
|
6
|
+
interface NoSchema {
|
|
7
|
+
readonly params?: never;
|
|
8
|
+
}
|
|
9
|
+
type Dropped = undefined | symbol | bigint | Fn;
|
|
10
|
+
type OptionalKeys<T> = {
|
|
11
|
+
[K in keyof T]-?: undefined extends T[K] ? K : never;
|
|
12
|
+
}[keyof T];
|
|
13
|
+
type JsonKeys<T> = {
|
|
14
|
+
[K in keyof T]-?: K extends symbol ? never : [T[K]] extends [Dropped] ? never : K;
|
|
15
|
+
}[keyof T];
|
|
16
|
+
type JsonObject<T> = {
|
|
17
|
+
[K in Exclude<JsonKeys<T>, OptionalKeys<T>>]: Jsonify<T[K]>;
|
|
18
|
+
} & {
|
|
19
|
+
[K in Extract<JsonKeys<T>, OptionalKeys<T>>]?: Jsonify<Exclude<T[K], undefined>>;
|
|
20
|
+
} extends infer O ? {
|
|
21
|
+
[K in keyof O]: O[K];
|
|
22
|
+
} : never;
|
|
23
|
+
/** The type of `JSON.parse(JSON.stringify(value))` for a value of type `T`. */
|
|
24
|
+
export type Jsonify<T> = unknown extends T ? T : T extends string | number | boolean | null ? T : T extends Dropped ? never : T extends {
|
|
25
|
+
toJSON(): infer J;
|
|
26
|
+
} ? Jsonify<J> : T extends readonly unknown[] ? {
|
|
27
|
+
-readonly [K in keyof T]: Jsonify<T[K]> | (Extract<T[K], Dropped> extends never ? never : null);
|
|
28
|
+
} : T extends ReadonlyMap<unknown, unknown> | ReadonlySet<unknown> ? Record<string, never> : JsonObject<T>;
|
|
29
|
+
/** What the client receives for a handler result `R`. */
|
|
30
|
+
export type ResponseBody<R> = unknown extends R ? unknown : [
|
|
31
|
+
R
|
|
32
|
+
] extends [undefined | void] ? undefined : R extends Reply<infer B> ? ResponseBody<B> : R extends Uint8Array | ReadableStream | Readable ? Response : R extends Response ? unknown : Jsonify<R>;
|
|
33
|
+
type Input<S, K extends string> = S extends Partial<Record<K, infer X>> ? X extends StandardSchemaV1 ? InferInput<X> : undefined : undefined;
|
|
34
|
+
/** The endpoint for full path `P`, route schema `S` and handler result `R`. */
|
|
35
|
+
export interface Endpoint<P extends string, S, R> {
|
|
36
|
+
readonly params: Input<S, 'params'> extends undefined ? PathParams<P> : Input<S, 'params'>;
|
|
37
|
+
readonly query: Input<S, 'query'>;
|
|
38
|
+
readonly body: Input<S, 'body'>;
|
|
39
|
+
readonly response: S extends {
|
|
40
|
+
readonly response?: infer X;
|
|
41
|
+
} ? X extends StandardSchemaV1 ? Jsonify<InferOutput<X>> : ResponseBody<Awaited<R>> : ResponseBody<Awaited<R>>;
|
|
42
|
+
}
|
|
43
|
+
type SchemaOf<C> = C extends {
|
|
44
|
+
readonly '~schema'?: infer S;
|
|
45
|
+
} ? unknown extends S ? NoSchema : S : NoSchema;
|
|
46
|
+
/** The endpoint of a `@Get`/`@Post`/... method `H` at full path `P`. */
|
|
47
|
+
export type MethodEndpoint<P extends string, H> = H extends (...args: infer A) => infer R ? Endpoint<P, A extends readonly [infer C, ...unknown[]] ? SchemaOf<C> : NoSchema, R> : never;
|
|
48
|
+
type RouteAt<C, I extends number> = C extends ControllerDefinition<infer Routes> ? Routes[I] : never;
|
|
49
|
+
/** The endpoint of route number `I` in a `defineController` controller `C`, at full path `P`. */
|
|
50
|
+
export type RouteEndpoint<P extends string, C, I extends number> = RouteAt<C, I> extends infer X ? X extends {
|
|
51
|
+
readonly '~types'?: {
|
|
52
|
+
readonly schema: infer S;
|
|
53
|
+
readonly result: infer R;
|
|
54
|
+
};
|
|
55
|
+
} ? unknown extends R ? PlainEndpoint<P, X> : Endpoint<P, S, R> : PlainEndpoint<P, X> : never;
|
|
56
|
+
type PlainEndpoint<P extends string, X> = X extends {
|
|
57
|
+
readonly handler: (...args: never[]) => infer R;
|
|
58
|
+
} ? Endpoint<P, X extends {
|
|
59
|
+
readonly schema?: infer S;
|
|
60
|
+
} ? S : NoSchema, R> : never;
|
|
61
|
+
export {};
|
|
62
|
+
//# sourceMappingURL=endpoint.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"endpoint.d.ts","sourceRoot":"","sources":["../src/endpoint.ts"],"names":[],"mappings":"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"}
|
package/dist/endpoint.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"endpoint.js","sourceRoot":"","sources":["../src/endpoint.ts"],"names":[],"mappings":""}
|
package/dist/index.d.ts
CHANGED
|
@@ -13,10 +13,11 @@ export { defineModule } from './module.js';
|
|
|
13
13
|
export type { AviModule, ModuleOptions, ModuleRef } from './module.js';
|
|
14
14
|
export { route } from './pipeline.js';
|
|
15
15
|
export { REQUEST } from './request.js';
|
|
16
|
-
export type { GuardClass, GuardRef, MiddlewareClass, MiddlewareRef, Route, RouteContext, RouteDocs, TypedRoute, } from './pipeline.js';
|
|
16
|
+
export type { GuardClass, GuardRef, MiddlewareClass, MiddlewareRef, Route, RouteContext, RouteDocs, RouteOf, TypedRoute, } from './pipeline.js';
|
|
17
17
|
export type { InferInput, InferOutput, InputOf, PathParams, RouteSchema, StandardSchemaV1, ValidationIssue, } from '@avijs/validation';
|
|
18
18
|
export { HTTP_METHODS, HttpError, jsonLogger, logRequests, reply, sse } from '@avijs/http';
|
|
19
19
|
export type { AviState, Context, ErrorHandler, Guard, Handler, HttpErrorOptions, HttpMethod, JsonLoggerOptions, LogFields, LogRequestsOptions, Logger, Middleware, Next, NoInput, Params, Reply, ReplyInit, RequestHook, RequestIdOptions, ResponseInfo, RouteDefinition, ServerSentEvent, SseOptions, SseSource, } from '@avijs/http';
|
|
20
20
|
export { createToken } from '@avijs/di';
|
|
21
21
|
export type { Class, ClassProvider, Constructor, FactoryProvider, InjectionToken, Provider, ResolveTokens, Scope, Token, TokenType, ValueProvider, } from '@avijs/di';
|
|
22
|
+
export type { Endpoint, Jsonify, MethodEndpoint, ResponseBody, RouteEndpoint } from './endpoint.js';
|
|
22
23
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,iBAAiB,CAAC;AAEzB,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACjD,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACxD,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,YAAY,EACV,cAAc,EACd,qBAAqB,EACrB,aAAa,EACb,YAAY,GACb,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC5F,OAAO,EACL,UAAU,EACV,MAAM,EACN,GAAG,EACH,IAAI,EACJ,UAAU,EACV,MAAM,EACN,OAAO,EACP,KAAK,EACL,IAAI,EACJ,GAAG,EACH,SAAS,EACT,aAAa,GACd,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACvE,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,YAAY,EACV,UAAU,EACV,QAAQ,EACR,eAAe,EACf,aAAa,EACb,KAAK,EACL,YAAY,EACZ,SAAS,EACT,UAAU,GACX,MAAM,eAAe,CAAC;AACvB,YAAY,EACV,UAAU,EACV,WAAW,EACX,OAAO,EACP,UAAU,EACV,WAAW,EACX,gBAAgB,EAChB,eAAe,GAChB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAC3F,YAAY,EACV,QAAQ,EACR,OAAO,EACP,YAAY,EACZ,KAAK,EACL,OAAO,EACP,gBAAgB,EAChB,UAAU,EACV,iBAAiB,EACjB,SAAS,EACT,kBAAkB,EAClB,MAAM,EACN,UAAU,EACV,IAAI,EACJ,OAAO,EACP,MAAM,EACN,KAAK,EACL,SAAS,EACT,WAAW,EACX,gBAAgB,EAChB,YAAY,EACZ,eAAe,EACf,eAAe,EACf,UAAU,EACV,SAAS,GACV,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,YAAY,EACV,KAAK,EACL,aAAa,EACb,WAAW,EACX,eAAe,EACf,cAAc,EACd,QAAQ,EACR,aAAa,EACb,KAAK,EACL,KAAK,EACL,SAAS,EACT,aAAa,GACd,MAAM,WAAW,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,iBAAiB,CAAC;AAEzB,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACjD,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACxD,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,YAAY,EACV,cAAc,EACd,qBAAqB,EACrB,aAAa,EACb,YAAY,GACb,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC5F,OAAO,EACL,UAAU,EACV,MAAM,EACN,GAAG,EACH,IAAI,EACJ,UAAU,EACV,MAAM,EACN,OAAO,EACP,KAAK,EACL,IAAI,EACJ,GAAG,EACH,SAAS,EACT,aAAa,GACd,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACvE,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,YAAY,EACV,UAAU,EACV,QAAQ,EACR,eAAe,EACf,aAAa,EACb,KAAK,EACL,YAAY,EACZ,SAAS,EACT,OAAO,EACP,UAAU,GACX,MAAM,eAAe,CAAC;AACvB,YAAY,EACV,UAAU,EACV,WAAW,EACX,OAAO,EACP,UAAU,EACV,WAAW,EACX,gBAAgB,EAChB,eAAe,GAChB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAC3F,YAAY,EACV,QAAQ,EACR,OAAO,EACP,YAAY,EACZ,KAAK,EACL,OAAO,EACP,gBAAgB,EAChB,UAAU,EACV,iBAAiB,EACjB,SAAS,EACT,kBAAkB,EAClB,MAAM,EACN,UAAU,EACV,IAAI,EACJ,OAAO,EACP,MAAM,EACN,KAAK,EACL,SAAS,EACT,WAAW,EACX,gBAAgB,EAChB,YAAY,EACZ,eAAe,EACf,eAAe,EACf,UAAU,EACV,SAAS,GACV,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,YAAY,EACV,KAAK,EACL,aAAa,EACb,WAAW,EACX,eAAe,EACf,cAAc,EACd,QAAQ,EACR,aAAa,EACb,KAAK,EACL,KAAK,EACL,SAAS,EACT,aAAa,GACd,MAAM,WAAW,CAAC;AACnB,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,iBAAiB,CAAC;AAEzB,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAEjD,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAExD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAQ5C,OAAO,EACL,UAAU,EACV,MAAM,EACN,GAAG,EACH,IAAI,EACJ,UAAU,EACV,MAAM,EACN,OAAO,EACP,KAAK,EACL,IAAI,EACJ,GAAG,EACH,SAAS,EACT,aAAa,GACd,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,iBAAiB,CAAC;AAEzB,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAEjD,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAExD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAQ5C,OAAO,EACL,UAAU,EACV,MAAM,EACN,GAAG,EACH,IAAI,EACJ,UAAU,EACV,MAAM,EACN,OAAO,EACP,KAAK,EACL,IAAI,EACJ,GAAG,EACH,SAAS,EACT,aAAa,GACd,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAsBvC,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AA2B3F,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC"}
|
package/dist/pipeline.d.ts
CHANGED
|
@@ -37,22 +37,33 @@ export interface RouteDocs {
|
|
|
37
37
|
* schema once and use it in both places: `@Post('/', { schema: create })` and
|
|
38
38
|
* `create(ctx: RouteContext<typeof create>)`.
|
|
39
39
|
*/
|
|
40
|
-
export type RouteContext<S extends RouteSchema> = Context<InputOf<S
|
|
40
|
+
export type RouteContext<S extends RouteSchema> = Context<InputOf<S>> & {
|
|
41
|
+
/** Type-only: lets `avi client` find the schema from the handler. Never set. */
|
|
42
|
+
readonly '~schema'?: S;
|
|
43
|
+
};
|
|
41
44
|
/** A route whose handler is typed from its path and schema. Created with `route()`. */
|
|
42
|
-
export interface TypedRoute<P extends string, S extends RouteSchema
|
|
45
|
+
export interface TypedRoute<P extends string, S extends RouteSchema, R = ResultOf<S>> {
|
|
43
46
|
readonly method: HttpMethod;
|
|
44
47
|
readonly path: P;
|
|
45
48
|
readonly schema?: S;
|
|
46
49
|
readonly openapi?: RouteDocs;
|
|
47
50
|
readonly middleware?: readonly MiddlewareRef[];
|
|
48
51
|
readonly guards?: readonly GuardRef[];
|
|
49
|
-
readonly handler: (ctx: Context<InputOf<S>, PathParams<P>>) =>
|
|
52
|
+
readonly handler: (ctx: Context<InputOf<S>, PathParams<P>>) => R;
|
|
50
53
|
}
|
|
54
|
+
/** What `route()` returns: a plain `Route` that keeps its schema and result types. */
|
|
55
|
+
export type RouteOf<S extends RouteSchema, R> = Route & {
|
|
56
|
+
/** Type-only, for `avi client`. Never set. */
|
|
57
|
+
readonly '~types'?: {
|
|
58
|
+
readonly schema: S;
|
|
59
|
+
readonly result: R;
|
|
60
|
+
};
|
|
61
|
+
};
|
|
51
62
|
/**
|
|
52
63
|
* Declares a route with typed `ctx.params` (from the path) and `ctx.input` (from the schema).
|
|
53
64
|
* At runtime it returns the definition unchanged.
|
|
54
65
|
*/
|
|
55
|
-
export declare function route<const P extends string, S extends RouteSchema = NoInput>(definition: TypedRoute<P, S>):
|
|
66
|
+
export declare function route<const P extends string, S extends RouteSchema = NoInput, R extends ResultOf<S> = ResultOf<S>>(definition: TypedRoute<P, S, R>): RouteOf<S, R>;
|
|
56
67
|
export declare function isClass(value: unknown): boolean;
|
|
57
68
|
/** Validates a list of middleware or guard refs. `method` is `use` or `canActivate`. */
|
|
58
69
|
export declare function checkRefs<T>(refs: readonly T[] | undefined, method: string, where: string): readonly T[];
|
package/dist/pipeline.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../src/pipeline.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,KAAK,EACV,OAAO,EACP,KAAK,EACL,UAAU,EACV,UAAU,EACV,IAAI,EACJ,OAAO,EACP,eAAe,EAChB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEpF,iFAAiF;AACjF,MAAM,WAAW,eAAe;IAC9B,KAAK,GAAG,IAAI,EAAE,KAAK,EAAE,GAAG;QAAE,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAA;KAAE,CAAC;IACnE,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,KAAK,EAAE,CAAC;CACpC;AAED,8EAA8E;AAC9E,MAAM,WAAW,UAAU;IACzB,KAAK,GAAG,IAAI,EAAE,KAAK,EAAE,GAAG;QAAE,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;KAAE,CAAC;IAClF,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,KAAK,EAAE,CAAC;CACpC;AAED,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,eAAe,CAAC;AACzD,MAAM,MAAM,QAAQ,GAAG,KAAK,GAAG,UAAU,CAAC;AAE1C,wFAAwF;AACxF,MAAM,WAAW,KAAM,SAAQ,eAAe;IAC5C,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,aAAa,EAAE,CAAC;IAC/C,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,QAAQ,EAAE,CAAC;IACtC,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC;CAC9B;AAED,yEAAyE;AACzE,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED;;;;GAIG;AACH,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../src/pipeline.ts"],"names":[],"mappings":"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"}
|
package/dist/pipeline.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../src/pipeline.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../src/pipeline.ts"],"names":[],"mappings":"AAuEA;;;GAGG;AACH,MAAM,UAAU,KAAK,CAInB,UAA+B;IAC/B,OAAO,UAAsC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,KAAc;IACpC,OAAO,OAAO,KAAK,KAAK,UAAU,IAAI,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AACpG,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,SAAS,CACvB,IAA8B,EAC9B,MAAc,EACd,KAAa;IAEb,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IAClC,MAAM,IAAI,GAAY,IAAI,CAAC;IAC3B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,SAAS,CAAC,GAAG,KAAK,mBAAmB,CAAC,CAAC;IAC1E,IAAkB,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;QACrC,IAAI,OAAO,GAAG,KAAK,UAAU,EAAE,CAAC;YAC9B,MAAM,IAAI,SAAS,CACjB,GAAG,KAAK,IAAI,MAAM,CAAC,CAAC,CAAC,kCAAkC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,gCAAgC,CAAC,CAAC,CAAC,EAAE,EAAE,CACnH,CAAC;QACJ,CAAC;QACD,MAAM,EAAE,GAAG,GAA4D,CAAC;QACxE,IAAI,OAAO,CAAC,EAAE,CAAC,IAAI,OAAO,EAAE,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,KAAK,UAAU,EAAE,CAAC;YAChE,MAAM,IAAI,SAAS,CAAC,GAAG,EAAE,CAAC,IAAI,OAAO,KAAK,YAAY,MAAM,WAAW,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC,CAAC,CAAC;IACH,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;AAClC,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { AddressInfo } from 'node:net';
|
|
2
|
+
export type StartupStep = 'Dependency graph' | 'Providers' | 'Routes' | 'Manifest' | 'HTTP server';
|
|
3
|
+
/** What startup achieved, filled in step by step. */
|
|
4
|
+
export interface StartupReport {
|
|
5
|
+
readonly version: string;
|
|
6
|
+
modules?: number;
|
|
7
|
+
graphValidated?: boolean;
|
|
8
|
+
providers?: number;
|
|
9
|
+
/** Variables across all `defineConfig` tokens, when the app has any. */
|
|
10
|
+
configVariables?: number;
|
|
11
|
+
routes?: readonly {
|
|
12
|
+
readonly method: string;
|
|
13
|
+
readonly path: string;
|
|
14
|
+
readonly controller: string;
|
|
15
|
+
}[];
|
|
16
|
+
url?: string;
|
|
17
|
+
durationMs: number;
|
|
18
|
+
failure?: {
|
|
19
|
+
readonly step: StartupStep;
|
|
20
|
+
readonly message: string;
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
export declare function addressUrl({ address, port, family }: AddressInfo): string;
|
|
24
|
+
/** The block printed to a terminal. `colors` follows the terminal, including NO_COLOR. */
|
|
25
|
+
export declare function formatSummary(report: StartupReport, listRoutes: boolean, colors: boolean): string;
|
|
26
|
+
/** One line for logs that are not a terminal. */
|
|
27
|
+
export declare function summaryLine(report: StartupReport): string;
|
|
28
|
+
/** Fields for a structured logger. */
|
|
29
|
+
export declare function summaryFields(report: StartupReport): Record<string, unknown>;
|
|
30
|
+
//# sourceMappingURL=summary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"summary.d.ts","sourceRoot":"","sources":["../src/summary.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAG5C,MAAM,MAAM,WAAW,GAAG,kBAAkB,GAAG,WAAW,GAAG,QAAQ,GAAG,UAAU,GAAG,aAAa,CAAC;AAEnG,qDAAqD;AACrD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wEAAwE;IACxE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,MAAM,CAAC,EAAE,SAAS;QAChB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;KAC7B,EAAE,CAAC;IACJ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CACpE;AAED,wBAAgB,UAAU,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,WAAW,GAAG,MAAM,CAIzE;AAUD,0FAA0F;AAC1F,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAG,MAAM,CAkCjG;AAED,iDAAiD;AACjD,wBAAgB,WAAW,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAUzD;AAED,sCAAsC;AACtC,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAU5E"}
|
package/dist/summary.js
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { styleText } from 'node:util';
|
|
2
|
+
export function addressUrl({ address, port, family }) {
|
|
3
|
+
const any = address === '0.0.0.0' || address === '::';
|
|
4
|
+
const host = any ? 'localhost' : family === 'IPv6' ? `[${address}]` : address;
|
|
5
|
+
return `http://${host}:${String(port)}`;
|
|
6
|
+
}
|
|
7
|
+
function ms(value) {
|
|
8
|
+
return value < 10 ? `${value.toFixed(1)} ms` : `${String(Math.round(value))} ms`;
|
|
9
|
+
}
|
|
10
|
+
const plural = (count, word) => `${String(count)} ${word}${count === 1 ? '' : 's'}`;
|
|
11
|
+
/** The block printed to a terminal. `colors` follows the terminal, including NO_COLOR. */
|
|
12
|
+
export function formatSummary(report, listRoutes, colors) {
|
|
13
|
+
const paint = (style, text) => colors ? styleText(style, text, { validateStream: false }) : text;
|
|
14
|
+
const ok = paint('green', '✓');
|
|
15
|
+
const lines = [`${paint('bold', `AVI.JS ${report.version}`)} · Application bootstrap`, ''];
|
|
16
|
+
if (report.modules !== undefined)
|
|
17
|
+
lines.push(`${ok} ${plural(report.modules, 'module')} loaded`);
|
|
18
|
+
if (report.graphValidated)
|
|
19
|
+
lines.push(`${ok} Dependency graph validated`);
|
|
20
|
+
if (report.providers) {
|
|
21
|
+
lines.push(`${ok} ${plural(report.providers, 'provider')} resolved`);
|
|
22
|
+
}
|
|
23
|
+
if (report.configVariables !== undefined) {
|
|
24
|
+
lines.push(`${ok} Config validated (${plural(report.configVariables, 'variable')})`);
|
|
25
|
+
}
|
|
26
|
+
if (report.routes) {
|
|
27
|
+
lines.push(`${ok} ${plural(report.routes.length, 'route')} registered`);
|
|
28
|
+
if (listRoutes) {
|
|
29
|
+
const width = Math.max(0, ...report.routes.map((route) => route.path.length));
|
|
30
|
+
for (const route of report.routes) {
|
|
31
|
+
const method = paint('cyan', route.method.padEnd(7));
|
|
32
|
+
lines.push(` ${method} ${route.path.padEnd(width)} ${paint('dim', route.controller)}`);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
if (report.url)
|
|
37
|
+
lines.push(`${ok} HTTP server ready on ${paint('cyan', report.url)}`);
|
|
38
|
+
if (report.failure) {
|
|
39
|
+
const [first = '', ...rest] = report.failure.message.split('\n');
|
|
40
|
+
lines.push(`${paint('red', '✗')} ${report.failure.step}: ${first}`);
|
|
41
|
+
for (const line of rest)
|
|
42
|
+
lines.push(` ${line}`);
|
|
43
|
+
lines.push('', paint('red', `Startup failed after ${ms(report.durationMs)}`));
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
lines.push('', `Startup completed in ${paint('bold', ms(report.durationMs))}`);
|
|
47
|
+
}
|
|
48
|
+
return `\n${lines.join('\n')}\n\n`;
|
|
49
|
+
}
|
|
50
|
+
/** One line for logs that are not a terminal. */
|
|
51
|
+
export function summaryLine(report) {
|
|
52
|
+
const parts = [
|
|
53
|
+
plural(report.modules ?? 0, 'module'),
|
|
54
|
+
plural(report.providers ?? 0, 'provider'),
|
|
55
|
+
plural(report.routes?.length ?? 0, 'route'),
|
|
56
|
+
];
|
|
57
|
+
if (report.configVariables !== undefined) {
|
|
58
|
+
parts.push(`config validated (${plural(report.configVariables, 'variable')})`);
|
|
59
|
+
}
|
|
60
|
+
return `Avi.js ${report.version} started in ${ms(report.durationMs)}: ${parts.join(', ')}, listening on ${report.url ?? '?'}`;
|
|
61
|
+
}
|
|
62
|
+
/** Fields for a structured logger. */
|
|
63
|
+
export function summaryFields(report) {
|
|
64
|
+
return {
|
|
65
|
+
version: report.version,
|
|
66
|
+
modules: report.modules,
|
|
67
|
+
providers: report.providers,
|
|
68
|
+
routes: report.routes?.length,
|
|
69
|
+
configVariables: report.configVariables,
|
|
70
|
+
url: report.url,
|
|
71
|
+
durationMs: Math.round(report.durationMs * 100) / 100,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=summary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"summary.js","sourceRoot":"","sources":["../src/summary.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@avijs/core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "Avi.js public API: application factory, modules and controllers.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"avi",
|
|
@@ -43,9 +43,9 @@
|
|
|
43
43
|
"access": "public"
|
|
44
44
|
},
|
|
45
45
|
"dependencies": {
|
|
46
|
-
"@avijs/di": "0.
|
|
47
|
-
"@avijs/http": "0.
|
|
48
|
-
"@avijs/validation": "0.
|
|
46
|
+
"@avijs/di": "0.4.0",
|
|
47
|
+
"@avijs/http": "0.4.0",
|
|
48
|
+
"@avijs/validation": "0.4.0"
|
|
49
49
|
},
|
|
50
50
|
"devDependencies": {
|
|
51
51
|
"valibot": "1.5.0"
|
package/src/app.ts
CHANGED
|
@@ -12,7 +12,10 @@ import {
|
|
|
12
12
|
type ServerOptions,
|
|
13
13
|
} from '@avijs/http';
|
|
14
14
|
import { withValidation, type RouteSchema } from '@avijs/validation';
|
|
15
|
+
import { createRequire } from 'node:module';
|
|
15
16
|
import type { AddressInfo } from 'node:net';
|
|
17
|
+
import { performance } from 'node:perf_hooks';
|
|
18
|
+
import { isConfigToken } from './config.js';
|
|
16
19
|
import { joinPath, type ControllerDefinition } from './controller.js';
|
|
17
20
|
import { checkConsumers, injectOf } from './consumers.js';
|
|
18
21
|
import { describeModules, firstDifference, type AppDescription } from './describe.js';
|
|
@@ -33,6 +36,16 @@ import {
|
|
|
33
36
|
type RouteDocs,
|
|
34
37
|
} from './pipeline.js';
|
|
35
38
|
import { REQUEST, REQUEST_TOKENS } from './request.js';
|
|
39
|
+
import {
|
|
40
|
+
addressUrl,
|
|
41
|
+
formatSummary,
|
|
42
|
+
summaryFields,
|
|
43
|
+
summaryLine,
|
|
44
|
+
type StartupReport,
|
|
45
|
+
type StartupStep,
|
|
46
|
+
} from './summary.js';
|
|
47
|
+
|
|
48
|
+
const { version } = createRequire(import.meta.url)('../package.json') as { version: string };
|
|
36
49
|
|
|
37
50
|
export interface AviOptions extends ServerOptions {
|
|
38
51
|
/** Runs first, for every route. */
|
|
@@ -49,6 +62,12 @@ export interface AviOptions extends ServerOptions {
|
|
|
49
62
|
* An override that matches no provider is an error.
|
|
50
63
|
*/
|
|
51
64
|
overrides?: readonly Provider[];
|
|
65
|
+
/**
|
|
66
|
+
* What `listen()` reports once the app is up: modules, providers, config, routes and the
|
|
67
|
+
* startup time. `'routes'` also lists every route; `false` reports nothing. Default: on,
|
|
68
|
+
* except when `NODE_ENV` is `test`. A logger with `info` receives it as one structured entry.
|
|
69
|
+
*/
|
|
70
|
+
startupSummary?: boolean | 'routes';
|
|
52
71
|
}
|
|
53
72
|
|
|
54
73
|
export interface AviApp {
|
|
@@ -75,6 +94,13 @@ export interface RouteInfo {
|
|
|
75
94
|
readonly openapi: RouteDocs | undefined;
|
|
76
95
|
}
|
|
77
96
|
|
|
97
|
+
/** The error and its causes, one per line. */
|
|
98
|
+
function describeFailure(error: unknown, depth = 0): string {
|
|
99
|
+
if (!(error instanceof Error)) return String(error);
|
|
100
|
+
if (error.cause === undefined || depth === 4) return error.message;
|
|
101
|
+
return `${error.message}\n${describeFailure(error.cause, depth + 1)}`;
|
|
102
|
+
}
|
|
103
|
+
|
|
78
104
|
export function createAvi(options: AviOptions = {}): AviApp {
|
|
79
105
|
return new Application(options);
|
|
80
106
|
}
|
|
@@ -99,6 +125,10 @@ class Application implements AviApp {
|
|
|
99
125
|
readonly #manifest: AppDescription | undefined;
|
|
100
126
|
readonly #overrides: readonly Provider[];
|
|
101
127
|
readonly #logger: Logger;
|
|
128
|
+
readonly #summary: false | 'basic' | 'routes';
|
|
129
|
+
readonly #createdAt = performance.now();
|
|
130
|
+
readonly #report: StartupReport = { version, durationMs: 0 };
|
|
131
|
+
#step: StartupStep = 'Dependency graph';
|
|
102
132
|
#container: Container | undefined;
|
|
103
133
|
#routes: readonly RouteInfo[] | undefined;
|
|
104
134
|
#init: Promise<void> | undefined;
|
|
@@ -109,6 +139,8 @@ class Application implements AviApp {
|
|
|
109
139
|
this.#guards = checkRefs(options.guards, 'canActivate', 'App guards');
|
|
110
140
|
this.#manifest = options.manifest;
|
|
111
141
|
this.#overrides = options.overrides ?? [];
|
|
142
|
+
const summary = options.startupSummary ?? process.env['NODE_ENV'] !== 'test';
|
|
143
|
+
this.#summary = summary === 'routes' ? 'routes' : summary ? 'basic' : false;
|
|
112
144
|
this.#logger = options.logger ?? {
|
|
113
145
|
error(message, error, fields) {
|
|
114
146
|
console.error(fields?.requestId ? `${message} [${fields.requestId}]` : message, error);
|
|
@@ -130,8 +162,44 @@ class Application implements AviApp {
|
|
|
130
162
|
}
|
|
131
163
|
|
|
132
164
|
async listen(port: number, host?: string): Promise<AddressInfo> {
|
|
133
|
-
|
|
134
|
-
|
|
165
|
+
let address: AddressInfo;
|
|
166
|
+
try {
|
|
167
|
+
await this.init();
|
|
168
|
+
this.#step = 'HTTP server';
|
|
169
|
+
address = await this.#server.listen(port, host);
|
|
170
|
+
} catch (error) {
|
|
171
|
+
this.#announce({ step: this.#step, message: describeFailure(error) });
|
|
172
|
+
throw error;
|
|
173
|
+
}
|
|
174
|
+
this.#report.url = addressUrl(address);
|
|
175
|
+
this.#announce();
|
|
176
|
+
return address;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/** Prints the startup summary; see `startupSummary`. */
|
|
180
|
+
#announce(failure?: StartupReport['failure']): void {
|
|
181
|
+
if (!this.#summary) return;
|
|
182
|
+
const report = this.#report;
|
|
183
|
+
report.durationMs = performance.now() - this.#createdAt;
|
|
184
|
+
if (failure) report.failure = failure;
|
|
185
|
+
if (this.#routes) {
|
|
186
|
+
report.routes = this.#routes.map(({ method, path, controller }) => ({
|
|
187
|
+
method,
|
|
188
|
+
path,
|
|
189
|
+
controller,
|
|
190
|
+
}));
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
if (this.#logger.info) {
|
|
194
|
+
if (!failure) this.#logger.info('Application started', summaryFields(report));
|
|
195
|
+
} else if (process.stdout.isTTY) {
|
|
196
|
+
// isTTY can be set on a plain stream (tests do), which has no hasColors.
|
|
197
|
+
const { hasColors } = process.stdout as { hasColors?: () => boolean };
|
|
198
|
+
const colors = hasColors?.call(process.stdout) ?? false;
|
|
199
|
+
process.stdout.write(formatSummary(report, this.#summary === 'routes', colors));
|
|
200
|
+
} else if (!failure) {
|
|
201
|
+
console.log(summaryLine(report));
|
|
202
|
+
}
|
|
135
203
|
}
|
|
136
204
|
|
|
137
205
|
get<K extends Token>(token: K): TokenType<K> {
|
|
@@ -155,10 +223,17 @@ class Application implements AviApp {
|
|
|
155
223
|
requestTokens: REQUEST_TOKENS,
|
|
156
224
|
});
|
|
157
225
|
const modules = container.modules as AviModule[];
|
|
226
|
+
const report = this.#report;
|
|
227
|
+
report.modules = modules.length;
|
|
158
228
|
checkConsumers(container);
|
|
229
|
+
report.graphValidated = true;
|
|
159
230
|
|
|
231
|
+
this.#step = 'Providers';
|
|
160
232
|
await container.init();
|
|
233
|
+
report.providers = container.describe().reduce((sum, m) => sum + m.providers.length, 0);
|
|
234
|
+
report.configVariables = countConfig(container, modules);
|
|
161
235
|
try {
|
|
236
|
+
this.#step = 'Routes';
|
|
162
237
|
const appScope = new Pipeline((token) => container.get(token));
|
|
163
238
|
const appMiddleware = appScope.middleware(this.#middleware);
|
|
164
239
|
const appGuards = appScope.guards(this.#guards);
|
|
@@ -209,6 +284,7 @@ class Application implements AviApp {
|
|
|
209
284
|
this.#router.add(routes);
|
|
210
285
|
this.#routes = Object.freeze(infos);
|
|
211
286
|
if (this.#manifest) {
|
|
287
|
+
this.#step = 'Manifest';
|
|
212
288
|
const difference = firstDifference(this.#manifest, describeModules(container));
|
|
213
289
|
if (difference) {
|
|
214
290
|
throw new Error(
|
|
@@ -254,6 +330,24 @@ class Application implements AviApp {
|
|
|
254
330
|
}
|
|
255
331
|
}
|
|
256
332
|
|
|
333
|
+
/** Variables across the app's `defineConfig` tokens, or undefined when it has none. */
|
|
334
|
+
function countConfig(container: Container, modules: readonly AviModule[]): number | undefined {
|
|
335
|
+
const seen = new Set<unknown>();
|
|
336
|
+
let total: number | undefined;
|
|
337
|
+
for (const module of modules) {
|
|
338
|
+
for (const provider of module.providers) {
|
|
339
|
+
const token = typeof provider === 'object' ? provider.provide : undefined;
|
|
340
|
+
if (!isConfigToken(token) || seen.has(token)) continue;
|
|
341
|
+
seen.add(token);
|
|
342
|
+
const value: unknown = container.resolve(module, token);
|
|
343
|
+
total =
|
|
344
|
+
(total ?? 0) +
|
|
345
|
+
(typeof value === 'object' && value !== null ? Object.keys(value).length : 0);
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
return total;
|
|
349
|
+
}
|
|
350
|
+
|
|
257
351
|
function tokenLabel(token: Token): string {
|
|
258
352
|
return typeof token === 'function' ? token.name : token.description;
|
|
259
353
|
}
|
package/src/config.ts
CHANGED
|
@@ -26,6 +26,13 @@ export interface ConfigToken<T> extends InjectionToken<T> {
|
|
|
26
26
|
load(): Promise<T>;
|
|
27
27
|
}
|
|
28
28
|
|
|
29
|
+
const CONFIG = Symbol('avi.config');
|
|
30
|
+
|
|
31
|
+
/** True for tokens made by `defineConfig`. */
|
|
32
|
+
export function isConfigToken(value: unknown): value is ConfigToken<unknown> {
|
|
33
|
+
return typeof value === 'object' && value !== null && CONFIG in value;
|
|
34
|
+
}
|
|
35
|
+
|
|
29
36
|
/** Thrown when the environment does not match the config schema. Never contains the values. */
|
|
30
37
|
export class ConfigError extends Error {
|
|
31
38
|
constructor(
|
|
@@ -79,6 +86,7 @@ export function defineConfig<S extends StandardSchemaV1>(
|
|
|
79
86
|
};
|
|
80
87
|
config.provider = { provide: config, useFactory: load };
|
|
81
88
|
config.module = defineModule({ name, providers: [config.provider], exports: [config] });
|
|
89
|
+
Object.defineProperty(config, CONFIG, { value: true });
|
|
82
90
|
return Object.freeze(config);
|
|
83
91
|
}
|
|
84
92
|
|
package/src/controller.ts
CHANGED
|
@@ -3,7 +3,10 @@ import type { HttpMethod } from '@avijs/http';
|
|
|
3
3
|
import { checkRouteSchema } from '@avijs/validation';
|
|
4
4
|
import { checkRefs, type GuardRef, type MiddlewareRef, type Route } from './pipeline.js';
|
|
5
5
|
|
|
6
|
-
export interface ControllerOptions<
|
|
6
|
+
export interface ControllerOptions<
|
|
7
|
+
K extends readonly Token[] = [],
|
|
8
|
+
R extends readonly Route[] = readonly Route[],
|
|
9
|
+
> {
|
|
7
10
|
/** Used in manifests and error messages. Default: 'controller <prefix>'. */
|
|
8
11
|
name?: string;
|
|
9
12
|
/** Path prefix for every route. Default: `/`. */
|
|
@@ -14,7 +17,7 @@ export interface ControllerOptions<K extends readonly Token[] = []> {
|
|
|
14
17
|
middleware?: readonly MiddlewareRef[];
|
|
15
18
|
/** Checked for every route in this controller, after app and module guards. */
|
|
16
19
|
guards?: readonly GuardRef[];
|
|
17
|
-
routes:
|
|
20
|
+
routes: R | ((...deps: ResolveTokens<K>) => R);
|
|
18
21
|
}
|
|
19
22
|
|
|
20
23
|
/** The normalized shape both controller styles produce. */
|
|
@@ -23,7 +26,7 @@ export interface StaticRoute {
|
|
|
23
26
|
readonly path: string;
|
|
24
27
|
}
|
|
25
28
|
|
|
26
|
-
export interface ControllerDefinition {
|
|
29
|
+
export interface ControllerDefinition<R extends readonly Route[] = readonly Route[]> {
|
|
27
30
|
readonly name: string;
|
|
28
31
|
readonly prefix: string;
|
|
29
32
|
readonly inject: readonly Token[];
|
|
@@ -32,11 +35,14 @@ export interface ControllerDefinition {
|
|
|
32
35
|
/** Routes known without creating the controller; 'dynamic' for a routes factory. */
|
|
33
36
|
readonly staticRoutes: readonly StaticRoute[] | 'dynamic';
|
|
34
37
|
createRoutes(deps: readonly unknown[]): readonly Route[];
|
|
38
|
+
/** Type-only: the routes as written, for `avi client`. Never set. */
|
|
39
|
+
readonly '~routes'?: R;
|
|
35
40
|
}
|
|
36
41
|
|
|
37
|
-
export function defineController<
|
|
38
|
-
|
|
39
|
-
|
|
42
|
+
export function defineController<
|
|
43
|
+
const K extends readonly Token[] = [],
|
|
44
|
+
const R extends readonly Route[] = readonly Route[],
|
|
45
|
+
>(options: ControllerOptions<K, R>): ControllerDefinition<R> {
|
|
40
46
|
const prefix = options.prefix ?? '/';
|
|
41
47
|
if (!prefix.startsWith('/')) {
|
|
42
48
|
throw new TypeError(`Controller prefix must start with "/": ${prefix}`);
|
package/src/endpoint.ts
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import type { Readable } from 'node:stream';
|
|
2
|
+
import type { Reply } from '@avijs/http';
|
|
3
|
+
import type { InferInput, InferOutput, PathParams, StandardSchemaV1 } from '@avijs/validation';
|
|
4
|
+
import type { ControllerDefinition } from './controller.js';
|
|
5
|
+
|
|
6
|
+
// Types `avi client` uses to describe each route to a typed client. Type-only.
|
|
7
|
+
|
|
8
|
+
type Fn = (...args: never[]) => unknown;
|
|
9
|
+
// A route without a schema.
|
|
10
|
+
interface NoSchema {
|
|
11
|
+
readonly params?: never;
|
|
12
|
+
}
|
|
13
|
+
type Dropped = undefined | symbol | bigint | Fn;
|
|
14
|
+
|
|
15
|
+
type OptionalKeys<T> = { [K in keyof T]-?: undefined extends T[K] ? K : never }[keyof T];
|
|
16
|
+
type JsonKeys<T> = {
|
|
17
|
+
[K in keyof T]-?: K extends symbol ? never : [T[K]] extends [Dropped] ? never : K;
|
|
18
|
+
}[keyof T];
|
|
19
|
+
|
|
20
|
+
type JsonObject<T> = {
|
|
21
|
+
[K in Exclude<JsonKeys<T>, OptionalKeys<T>>]: Jsonify<T[K]>;
|
|
22
|
+
} & {
|
|
23
|
+
[K in Extract<JsonKeys<T>, OptionalKeys<T>>]?: Jsonify<Exclude<T[K], undefined>>;
|
|
24
|
+
} extends infer O
|
|
25
|
+
? { [K in keyof O]: O[K] }
|
|
26
|
+
: never;
|
|
27
|
+
|
|
28
|
+
/** The type of `JSON.parse(JSON.stringify(value))` for a value of type `T`. */
|
|
29
|
+
export type Jsonify<T> = unknown extends T
|
|
30
|
+
? T
|
|
31
|
+
: T extends string | number | boolean | null
|
|
32
|
+
? T
|
|
33
|
+
: T extends Dropped
|
|
34
|
+
? never
|
|
35
|
+
: T extends { toJSON(): infer J }
|
|
36
|
+
? Jsonify<J>
|
|
37
|
+
: T extends readonly unknown[]
|
|
38
|
+
? {
|
|
39
|
+
-readonly [K in keyof T]:
|
|
40
|
+
Jsonify<T[K]> | (Extract<T[K], Dropped> extends never ? never : null);
|
|
41
|
+
}
|
|
42
|
+
: T extends ReadonlyMap<unknown, unknown> | ReadonlySet<unknown>
|
|
43
|
+
? Record<string, never>
|
|
44
|
+
: JsonObject<T>;
|
|
45
|
+
|
|
46
|
+
/** What the client receives for a handler result `R`. */
|
|
47
|
+
export type ResponseBody<R> = unknown extends R
|
|
48
|
+
? unknown
|
|
49
|
+
: // eslint-disable-next-line @typescript-eslint/no-invalid-void-type -- handlers that return nothing
|
|
50
|
+
[R] extends [undefined | void]
|
|
51
|
+
? undefined
|
|
52
|
+
: R extends Reply<infer B>
|
|
53
|
+
? ResponseBody<B>
|
|
54
|
+
: R extends Uint8Array | ReadableStream | Readable
|
|
55
|
+
? Response
|
|
56
|
+
: R extends Response
|
|
57
|
+
? unknown
|
|
58
|
+
: Jsonify<R>;
|
|
59
|
+
|
|
60
|
+
type Input<S, K extends string> =
|
|
61
|
+
S extends Partial<Record<K, infer X>>
|
|
62
|
+
? X extends StandardSchemaV1
|
|
63
|
+
? InferInput<X>
|
|
64
|
+
: undefined
|
|
65
|
+
: undefined;
|
|
66
|
+
|
|
67
|
+
/** The endpoint for full path `P`, route schema `S` and handler result `R`. */
|
|
68
|
+
export interface Endpoint<P extends string, S, R> {
|
|
69
|
+
readonly params: Input<S, 'params'> extends undefined ? PathParams<P> : Input<S, 'params'>;
|
|
70
|
+
readonly query: Input<S, 'query'>;
|
|
71
|
+
readonly body: Input<S, 'body'>;
|
|
72
|
+
readonly response: S extends { readonly response?: infer X }
|
|
73
|
+
? X extends StandardSchemaV1
|
|
74
|
+
? Jsonify<InferOutput<X>>
|
|
75
|
+
: ResponseBody<Awaited<R>>
|
|
76
|
+
: ResponseBody<Awaited<R>>;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
type SchemaOf<C> = C extends { readonly '~schema'?: infer S }
|
|
80
|
+
? unknown extends S
|
|
81
|
+
? NoSchema
|
|
82
|
+
: S
|
|
83
|
+
: NoSchema;
|
|
84
|
+
|
|
85
|
+
/** The endpoint of a `@Get`/`@Post`/... method `H` at full path `P`. */
|
|
86
|
+
export type MethodEndpoint<P extends string, H> = H extends (...args: infer A) => infer R
|
|
87
|
+
? Endpoint<P, A extends readonly [infer C, ...unknown[]] ? SchemaOf<C> : NoSchema, R>
|
|
88
|
+
: never;
|
|
89
|
+
|
|
90
|
+
type RouteAt<C, I extends number> =
|
|
91
|
+
C extends ControllerDefinition<infer Routes> ? Routes[I] : never;
|
|
92
|
+
|
|
93
|
+
/** The endpoint of route number `I` in a `defineController` controller `C`, at full path `P`. */
|
|
94
|
+
export type RouteEndpoint<P extends string, C, I extends number> =
|
|
95
|
+
RouteAt<C, I> extends infer X
|
|
96
|
+
? X extends { readonly '~types'?: { readonly schema: infer S; readonly result: infer R } }
|
|
97
|
+
? unknown extends R
|
|
98
|
+
? PlainEndpoint<P, X>
|
|
99
|
+
: Endpoint<P, S, R>
|
|
100
|
+
: PlainEndpoint<P, X>
|
|
101
|
+
: never;
|
|
102
|
+
|
|
103
|
+
type PlainEndpoint<P extends string, X> = X extends {
|
|
104
|
+
readonly handler: (...args: never[]) => infer R;
|
|
105
|
+
}
|
|
106
|
+
? Endpoint<P, X extends { readonly schema?: infer S } ? S : NoSchema, R>
|
|
107
|
+
: never;
|
package/src/index.ts
CHANGED
|
@@ -40,6 +40,7 @@ export type {
|
|
|
40
40
|
Route,
|
|
41
41
|
RouteContext,
|
|
42
42
|
RouteDocs,
|
|
43
|
+
RouteOf,
|
|
43
44
|
TypedRoute,
|
|
44
45
|
} from './pipeline.js';
|
|
45
46
|
export type {
|
|
@@ -93,3 +94,4 @@ export type {
|
|
|
93
94
|
TokenType,
|
|
94
95
|
ValueProvider,
|
|
95
96
|
} from '@avijs/di';
|
|
97
|
+
export type { Endpoint, Jsonify, MethodEndpoint, ResponseBody, RouteEndpoint } from './endpoint.js';
|
package/src/pipeline.ts
CHANGED
|
@@ -47,27 +47,38 @@ export interface RouteDocs {
|
|
|
47
47
|
* schema once and use it in both places: `@Post('/', { schema: create })` and
|
|
48
48
|
* `create(ctx: RouteContext<typeof create>)`.
|
|
49
49
|
*/
|
|
50
|
-
export type RouteContext<S extends RouteSchema> = Context<InputOf<S
|
|
50
|
+
export type RouteContext<S extends RouteSchema> = Context<InputOf<S>> & {
|
|
51
|
+
/** Type-only: lets `avi client` find the schema from the handler. Never set. */
|
|
52
|
+
readonly '~schema'?: S;
|
|
53
|
+
};
|
|
51
54
|
|
|
52
55
|
/** A route whose handler is typed from its path and schema. Created with `route()`. */
|
|
53
|
-
export interface TypedRoute<P extends string, S extends RouteSchema
|
|
56
|
+
export interface TypedRoute<P extends string, S extends RouteSchema, R = ResultOf<S>> {
|
|
54
57
|
readonly method: HttpMethod;
|
|
55
58
|
readonly path: P;
|
|
56
59
|
readonly schema?: S;
|
|
57
60
|
readonly openapi?: RouteDocs;
|
|
58
61
|
readonly middleware?: readonly MiddlewareRef[];
|
|
59
62
|
readonly guards?: readonly GuardRef[];
|
|
60
|
-
readonly handler: (ctx: Context<InputOf<S>, PathParams<P>>) =>
|
|
63
|
+
readonly handler: (ctx: Context<InputOf<S>, PathParams<P>>) => R;
|
|
61
64
|
}
|
|
62
65
|
|
|
66
|
+
/** What `route()` returns: a plain `Route` that keeps its schema and result types. */
|
|
67
|
+
export type RouteOf<S extends RouteSchema, R> = Route & {
|
|
68
|
+
/** Type-only, for `avi client`. Never set. */
|
|
69
|
+
readonly '~types'?: { readonly schema: S; readonly result: R };
|
|
70
|
+
};
|
|
71
|
+
|
|
63
72
|
/**
|
|
64
73
|
* Declares a route with typed `ctx.params` (from the path) and `ctx.input` (from the schema).
|
|
65
74
|
* At runtime it returns the definition unchanged.
|
|
66
75
|
*/
|
|
67
|
-
export function route<
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
76
|
+
export function route<
|
|
77
|
+
const P extends string,
|
|
78
|
+
S extends RouteSchema = NoInput,
|
|
79
|
+
R extends ResultOf<S> = ResultOf<S>,
|
|
80
|
+
>(definition: TypedRoute<P, S, R>): RouteOf<S, R> {
|
|
81
|
+
return definition as unknown as RouteOf<S, R>;
|
|
71
82
|
}
|
|
72
83
|
|
|
73
84
|
export function isClass(value: unknown): boolean {
|
package/src/summary.ts
ADDED
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import type { AddressInfo } from 'node:net';
|
|
2
|
+
import { styleText } from 'node:util';
|
|
3
|
+
|
|
4
|
+
export type StartupStep = 'Dependency graph' | 'Providers' | 'Routes' | 'Manifest' | 'HTTP server';
|
|
5
|
+
|
|
6
|
+
/** What startup achieved, filled in step by step. */
|
|
7
|
+
export interface StartupReport {
|
|
8
|
+
readonly version: string;
|
|
9
|
+
modules?: number;
|
|
10
|
+
graphValidated?: boolean;
|
|
11
|
+
providers?: number;
|
|
12
|
+
/** Variables across all `defineConfig` tokens, when the app has any. */
|
|
13
|
+
configVariables?: number;
|
|
14
|
+
routes?: readonly {
|
|
15
|
+
readonly method: string;
|
|
16
|
+
readonly path: string;
|
|
17
|
+
readonly controller: string;
|
|
18
|
+
}[];
|
|
19
|
+
url?: string;
|
|
20
|
+
durationMs: number;
|
|
21
|
+
failure?: { readonly step: StartupStep; readonly message: string };
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export function addressUrl({ address, port, family }: AddressInfo): string {
|
|
25
|
+
const any = address === '0.0.0.0' || address === '::';
|
|
26
|
+
const host = any ? 'localhost' : family === 'IPv6' ? `[${address}]` : address;
|
|
27
|
+
return `http://${host}:${String(port)}`;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function ms(value: number): string {
|
|
31
|
+
return value < 10 ? `${value.toFixed(1)} ms` : `${String(Math.round(value))} ms`;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const plural = (count: number, word: string) => `${String(count)} ${word}${count === 1 ? '' : 's'}`;
|
|
35
|
+
|
|
36
|
+
type Style = Parameters<typeof styleText>[0];
|
|
37
|
+
|
|
38
|
+
/** The block printed to a terminal. `colors` follows the terminal, including NO_COLOR. */
|
|
39
|
+
export function formatSummary(report: StartupReport, listRoutes: boolean, colors: boolean): string {
|
|
40
|
+
const paint = (style: Style, text: string) =>
|
|
41
|
+
colors ? styleText(style, text, { validateStream: false }) : text;
|
|
42
|
+
const ok = paint('green', '✓');
|
|
43
|
+
const lines = [`${paint('bold', `AVI.JS ${report.version}`)} · Application bootstrap`, ''];
|
|
44
|
+
if (report.modules !== undefined) lines.push(`${ok} ${plural(report.modules, 'module')} loaded`);
|
|
45
|
+
if (report.graphValidated) lines.push(`${ok} Dependency graph validated`);
|
|
46
|
+
if (report.providers) {
|
|
47
|
+
lines.push(`${ok} ${plural(report.providers, 'provider')} resolved`);
|
|
48
|
+
}
|
|
49
|
+
if (report.configVariables !== undefined) {
|
|
50
|
+
lines.push(`${ok} Config validated (${plural(report.configVariables, 'variable')})`);
|
|
51
|
+
}
|
|
52
|
+
if (report.routes) {
|
|
53
|
+
lines.push(`${ok} ${plural(report.routes.length, 'route')} registered`);
|
|
54
|
+
if (listRoutes) {
|
|
55
|
+
const width = Math.max(0, ...report.routes.map((route) => route.path.length));
|
|
56
|
+
for (const route of report.routes) {
|
|
57
|
+
const method = paint('cyan', route.method.padEnd(7));
|
|
58
|
+
lines.push(` ${method} ${route.path.padEnd(width)} ${paint('dim', route.controller)}`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
if (report.url) lines.push(`${ok} HTTP server ready on ${paint('cyan', report.url)}`);
|
|
63
|
+
|
|
64
|
+
if (report.failure) {
|
|
65
|
+
const [first = '', ...rest] = report.failure.message.split('\n');
|
|
66
|
+
lines.push(`${paint('red', '✗')} ${report.failure.step}: ${first}`);
|
|
67
|
+
for (const line of rest) lines.push(` ${line}`);
|
|
68
|
+
lines.push('', paint('red', `Startup failed after ${ms(report.durationMs)}`));
|
|
69
|
+
} else {
|
|
70
|
+
lines.push('', `Startup completed in ${paint('bold', ms(report.durationMs))}`);
|
|
71
|
+
}
|
|
72
|
+
return `\n${lines.join('\n')}\n\n`;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/** One line for logs that are not a terminal. */
|
|
76
|
+
export function summaryLine(report: StartupReport): string {
|
|
77
|
+
const parts = [
|
|
78
|
+
plural(report.modules ?? 0, 'module'),
|
|
79
|
+
plural(report.providers ?? 0, 'provider'),
|
|
80
|
+
plural(report.routes?.length ?? 0, 'route'),
|
|
81
|
+
];
|
|
82
|
+
if (report.configVariables !== undefined) {
|
|
83
|
+
parts.push(`config validated (${plural(report.configVariables, 'variable')})`);
|
|
84
|
+
}
|
|
85
|
+
return `Avi.js ${report.version} started in ${ms(report.durationMs)}: ${parts.join(', ')}, listening on ${report.url ?? '?'}`;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/** Fields for a structured logger. */
|
|
89
|
+
export function summaryFields(report: StartupReport): Record<string, unknown> {
|
|
90
|
+
return {
|
|
91
|
+
version: report.version,
|
|
92
|
+
modules: report.modules,
|
|
93
|
+
providers: report.providers,
|
|
94
|
+
routes: report.routes?.length,
|
|
95
|
+
configVariables: report.configVariables,
|
|
96
|
+
url: report.url,
|
|
97
|
+
durationMs: Math.round(report.durationMs * 100) / 100,
|
|
98
|
+
};
|
|
99
|
+
}
|