@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 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;AACrE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAG5C,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;AAGvB,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;CACjC;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;AAED,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"}
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
- await this.init();
59
- return this.#server.listen(port, host);
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 {
@@ -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,CAkC7B"}
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) {
@@ -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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"}
@@ -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: readonly Route[] | ((...deps: ResolveTokens<K>) => readonly Route[]);
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;
@@ -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;IAChE,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,SAAS,KAAK,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,KAAK,SAAS,KAAK,EAAE,CAAC,CAAC;CAC9E;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;IACnC,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;CAC1D;AAED,wBAAgB,gBAAgB,CAAC,KAAK,CAAC,CAAC,SAAS,SAAS,KAAK,EAAE,GAAG,EAAE,EACpE,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAC5B,oBAAoB,CAsCtB;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"}
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"}
@@ -1 +1 @@
1
- {"version":3,"file":"controller.js","sourceRoot":"","sources":["../src/controller.ts"],"names":[],"mappings":"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"}
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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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=endpoint.js.map
@@ -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
@@ -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;AAqBvC,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"}
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"}
@@ -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>>) => ResultOf<S>;
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>): Route;
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[];
@@ -1 +1 @@
1
- {"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../src/pipeline.ts"],"names":[],"mappings":"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"}
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,GAAG;IACtE,gFAAgF;IAChF,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;CACxB,CAAC;AAEF,uFAAuF;AACvF,MAAM,WAAW,UAAU,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,WAAW,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;IAClF,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IACjB,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACpB,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC;IAC7B,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,aAAa,EAAE,CAAC;IAC/C,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,QAAQ,EAAE,CAAC;IACtC,QAAQ,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;CAClE;AAED,sFAAsF;AACtF,MAAM,MAAM,OAAO,CAAC,CAAC,SAAS,WAAW,EAAE,CAAC,IAAI,KAAK,GAAG;IACtD,8CAA8C;IAC9C,QAAQ,CAAC,QAAQ,CAAC,EAAE;QAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAA;KAAE,CAAC;CAChE,CAAC;AAEF;;;GAGG;AACH,wBAAgB,KAAK,CACnB,KAAK,CAAC,CAAC,SAAS,MAAM,EACtB,CAAC,SAAS,WAAW,GAAG,OAAO,EAC/B,CAAC,SAAS,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,EACnC,UAAU,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAEhD;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAE/C;AAED,wFAAwF;AACxF,wBAAgB,SAAS,CAAC,CAAC,EACzB,IAAI,EAAE,SAAS,CAAC,EAAE,GAAG,SAAS,EAC9B,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ,SAAS,CAAC,EAAE,CAgBd"}
@@ -1 +1 @@
1
- {"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../src/pipeline.ts"],"names":[],"mappings":"AA8DA;;;GAGG;AACH,MAAM,UAAU,KAAK,CACnB,UAA4B;IAE5B,OAAO,UAA8B,CAAC;AACxC,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"}
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"}
@@ -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.2.1",
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.2.1",
47
- "@avijs/http": "0.2.1",
48
- "@avijs/validation": "0.2.1"
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
- await this.init();
134
- return this.#server.listen(port, host);
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<K extends readonly Token[] = []> {
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: readonly Route[] | ((...deps: ResolveTokens<K>) => readonly Route[]);
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<const K extends readonly Token[] = []>(
38
- options: ControllerOptions<K>,
39
- ): ControllerDefinition {
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}`);
@@ -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>>) => ResultOf<S>;
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<const P extends string, S extends RouteSchema = NoInput>(
68
- definition: TypedRoute<P, S>,
69
- ): Route {
70
- return definition as unknown as Route;
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
+ }