@getsoda/core 0.2.0 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +23 -0
- package/dist/app/app.d.ts.map +1 -1
- package/dist/app/app.js +17 -0
- package/dist/app/app.js.map +1 -1
- package/dist/config/config.d.ts +57 -0
- package/dist/config/config.d.ts.map +1 -0
- package/dist/config/config.js +72 -0
- package/dist/config/config.js.map +1 -0
- package/dist/config/index.d.ts +9 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +7 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/module.d.ts +29 -0
- package/dist/config/module.d.ts.map +1 -0
- package/dist/config/module.js +28 -0
- package/dist/config/module.js.map +1 -0
- package/dist/di/container.d.ts +2 -0
- package/dist/di/container.d.ts.map +1 -1
- package/dist/di/container.js +9 -0
- package/dist/di/container.js.map +1 -1
- package/dist/http/decorators.d.ts +6 -1
- package/dist/http/decorators.d.ts.map +1 -1
- package/dist/http/decorators.js.map +1 -1
- package/dist/http/index.d.ts +2 -2
- package/dist/http/index.d.ts.map +1 -1
- package/dist/http/index.js.map +1 -1
- package/dist/http/routes.d.ts +10 -1
- package/dist/http/routes.d.ts.map +1 -1
- package/dist/http/routes.js +4 -1
- package/dist/http/routes.js.map +1 -1
- package/dist/http/schema.d.ts +2 -0
- package/dist/http/schema.d.ts.map +1 -1
- package/dist/http/schema.js +2 -1
- package/dist/http/schema.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/logger/console-logger.d.ts +12 -4
- package/dist/logger/console-logger.d.ts.map +1 -1
- package/dist/logger/console-logger.js +47 -17
- package/dist/logger/console-logger.js.map +1 -1
- package/package.json +1 -1
- package/src/app/app.ts +24 -1
- package/src/config/config.ts +88 -0
- package/src/config/index.ts +9 -0
- package/src/config/module.ts +40 -0
- package/src/di/container.ts +14 -0
- package/src/http/decorators.ts +9 -2
- package/src/http/index.ts +2 -1
- package/src/http/routes.ts +17 -2
- package/src/http/schema.ts +2 -1
- package/src/index.ts +1 -0
- package/src/logger/console-logger.ts +62 -18
package/dist/http/routes.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routes.js","sourceRoot":"","sources":["../../src/http/routes.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"routes.js","sourceRoot":"","sources":["../../src/http/routes.ts"],"names":[],"mappings":"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"}
|
package/dist/http/schema.d.ts
CHANGED
|
@@ -47,6 +47,8 @@ export declare namespace StandardSchemaV1 {
|
|
|
47
47
|
export type InferOutput<S extends StandardSchemaV1> = NonNullable<S['~standard']['types']>['output'];
|
|
48
48
|
/** `true` for a Standard Schema. */
|
|
49
49
|
export declare const isStandardSchema: (value: unknown) => value is StandardSchemaV1;
|
|
50
|
+
/** Messages of `issues`, each with the path of its value under `prefix`. */
|
|
51
|
+
export declare const formatIssues: (issues: readonly StandardSchemaV1.Issue[], prefix: string) => string[];
|
|
50
52
|
/**
|
|
51
53
|
* Validates `value`; returns the schema's output (schemas may transform) or
|
|
52
54
|
* throws `BadRequestException` with the issues. `prefix` names the value in
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/http/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,gDAAgD;AAChD,MAAM,WAAW,gBAAgB,CAAC,KAAK,GAAG,OAAO,EAAE,MAAM,GAAG,KAAK;IAC/D,QAAQ,CAAC,WAAW,EAAE,gBAAgB,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;CAC5D;AAED,MAAM,CAAC,OAAO,WAAW,gBAAgB,CAAC;IACxC,UAAU,KAAK,CAAC,KAAK,GAAG,OAAO,EAAE,MAAM,GAAG,KAAK;QAC7C,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAA;QACnB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;QACvB,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAA;QAClG,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,SAAS,CAAA;KAClD;IAED,UAAU,OAAO;QACf,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAA;KAC9D;IAED,KAAK,MAAM,CAAC,MAAM,IAAI,aAAa,CAAC,MAAM,CAAC,GAAG,aAAa,CAAA;IAE3D,UAAU,aAAa,CAAC,MAAM;QAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;QACtB,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAA;KAC5B;IAED,UAAU,aAAa;QACrB,QAAQ,CAAC,MAAM,EAAE,SAAS,KAAK,EAAE,CAAA;KAClC;IAED,UAAU,KAAK;QACb,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;QACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC,WAAW,GAAG,WAAW,CAAC,EAAE,GAAG,SAAS,CAAA;KACnE;IAED,UAAU,WAAW;QACnB,QAAQ,CAAC,GAAG,EAAE,WAAW,CAAA;KAC1B;IAED,UAAU,KAAK,CAAC,KAAK,GAAG,OAAO,EAAE,MAAM,GAAG,KAAK;QAC7C,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAA;QACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;KACxB;CACF;AAED,8BAA8B;AAC9B,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,gBAAgB,IAAI,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAA;AAMpG,oCAAoC;AACpC,eAAO,MAAM,gBAAgB,UAAW,OAAO,KAAG,KAAK,IAAI,gBACU,CAAA;
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/http/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,gDAAgD;AAChD,MAAM,WAAW,gBAAgB,CAAC,KAAK,GAAG,OAAO,EAAE,MAAM,GAAG,KAAK;IAC/D,QAAQ,CAAC,WAAW,EAAE,gBAAgB,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;CAC5D;AAED,MAAM,CAAC,OAAO,WAAW,gBAAgB,CAAC;IACxC,UAAU,KAAK,CAAC,KAAK,GAAG,OAAO,EAAE,MAAM,GAAG,KAAK;QAC7C,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAA;QACnB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;QACvB,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAA;QAClG,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,SAAS,CAAA;KAClD;IAED,UAAU,OAAO;QACf,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAA;KAC9D;IAED,KAAK,MAAM,CAAC,MAAM,IAAI,aAAa,CAAC,MAAM,CAAC,GAAG,aAAa,CAAA;IAE3D,UAAU,aAAa,CAAC,MAAM;QAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;QACtB,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAA;KAC5B;IAED,UAAU,aAAa;QACrB,QAAQ,CAAC,MAAM,EAAE,SAAS,KAAK,EAAE,CAAA;KAClC;IAED,UAAU,KAAK;QACb,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;QACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC,WAAW,GAAG,WAAW,CAAC,EAAE,GAAG,SAAS,CAAA;KACnE;IAED,UAAU,WAAW;QACnB,QAAQ,CAAC,GAAG,EAAE,WAAW,CAAA;KAC1B;IAED,UAAU,KAAK,CAAC,KAAK,GAAG,OAAO,EAAE,MAAM,GAAG,KAAK;QAC7C,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAA;QACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;KACxB;CACF;AAED,8BAA8B;AAC9B,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,gBAAgB,IAAI,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAA;AAMpG,oCAAoC;AACpC,eAAO,MAAM,gBAAgB,UAAW,OAAO,KAAG,KAAK,IAAI,gBACU,CAAA;AAErE,4EAA4E;AAC5E,eAAO,MAAM,YAAY,WAAY,SAAS,gBAAgB,CAAC,KAAK,EAAE,UAAU,MAAM,KAAG,MAAM,EAyB9F,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,QAAQ,GAAI,CAAC,SAAS,gBAAgB,UACzC,CAAC,SACF,OAAO,UACN,MAAM,KACb,WAAW,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAYzC,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,YAAY,GAAI,CAAC,SAAS,gBAAgB,UAAU,CAAC,SAAS,OAAO,UAAU,MAAM,KAAG,WAAW,CAAC,CAAC,CAQjH,CAAA"}
|
package/dist/http/schema.js
CHANGED
|
@@ -16,7 +16,8 @@ const MAX_MESSAGES_LENGTH = 1_000_000;
|
|
|
16
16
|
const OMITTED = 'Further validation errors were omitted';
|
|
17
17
|
/** `true` for a Standard Schema. */
|
|
18
18
|
export const isStandardSchema = (value) => typeof value === 'object' && value !== null && '~standard' in value;
|
|
19
|
-
|
|
19
|
+
/** Messages of `issues`, each with the path of its value under `prefix`. */
|
|
20
|
+
export const formatIssues = (issues, prefix) => {
|
|
20
21
|
const messages = [];
|
|
21
22
|
let remaining = MAX_MESSAGES_LENGTH;
|
|
22
23
|
for (const issue of issues) {
|
package/dist/http/schema.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/http/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AAgDrD,qEAAqE;AACrE,MAAM,mBAAmB,GAAG,SAAS,CAAA;AACrC,MAAM,OAAO,GAAG,wCAAwC,CAAA;AAExD,oCAAoC;AACpC,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,KAAc,EAA6B,EAAE,CAC5E,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,WAAW,IAAI,KAAK,CAAA;AAErE,MAAM,YAAY,GAAG,CAAC,MAAyC,EAAE,MAAc,EAAY,EAAE;
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/http/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AAgDrD,qEAAqE;AACrE,MAAM,mBAAmB,GAAG,SAAS,CAAA;AACrC,MAAM,OAAO,GAAG,wCAAwC,CAAA;AAExD,oCAAoC;AACpC,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,KAAc,EAA6B,EAAE,CAC5E,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,WAAW,IAAI,KAAK,CAAA;AAErE,4EAA4E;AAC5E,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,MAAyC,EAAE,MAAc,EAAY,EAAE;IAClG,MAAM,QAAQ,GAAa,EAAE,CAAA;IAC7B,IAAI,SAAS,GAAG,mBAAmB,CAAA;IAEnC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;YACnB,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YACtB,MAAK;QACP,CAAC;QAED,IAAI,IAAI,GAAG,MAAM,CAAA;QAEjB,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;YACvC,MAAM,GAAG,GAAG,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAA;YAE/D,IAAI,GAAG,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAA;QAC7D,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,CAAA;QAEzE,SAAS,IAAI,OAAO,CAAC,MAAM,CAAA;QAC3B,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACxB,CAAC;IAED,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CACtB,MAAS,EACT,KAAc,EACd,MAAc,EAC4B,EAAE;IAC5C,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;IAElD,MAAM,MAAM,GAAG,CAAC,OAAyC,EAAkB,EAAE;QAC3E,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACjC,MAAM,IAAI,mBAAmB,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;QACrE,CAAC;QAED,OAAO,OAAO,CAAC,KAAuB,CAAA;IACxC,CAAC,CAAA;IAED,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;AACnF,CAAC,CAAA;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAA6B,MAAS,EAAE,KAAc,EAAE,MAAc,EAAkB,EAAE;IACpH,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAA;IAE9C,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,SAAS,CAAC,mBAAmB,MAAM,mEAAmE,CAAC,CAAA;IACnH,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC,CAAA"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,cAAc,gBAAgB,CAAA;AAC9B,cAAc,eAAe,CAAA;AAC7B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,mBAAmB,CAAA;AACjC,cAAc,oBAAoB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,cAAc,gBAAgB,CAAA;AAC9B,cAAc,mBAAmB,CAAA;AACjC,cAAc,eAAe,CAAA;AAC7B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,mBAAmB,CAAA;AACjC,cAAc,oBAAoB,CAAA"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,cAAc,gBAAgB,CAAA;AAC9B,cAAc,eAAe,CAAA;AAC7B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,mBAAmB,CAAA;AACjC,cAAc,oBAAoB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,cAAc,gBAAgB,CAAA;AAC9B,cAAc,mBAAmB,CAAA;AACjC,cAAc,eAAe,CAAA;AAC7B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,mBAAmB,CAAA;AACjC,cAAc,oBAAoB,CAAA"}
|
|
@@ -3,12 +3,13 @@
|
|
|
3
3
|
* Logger writing to stdout and stderr, readable for people or as JSON lines.
|
|
4
4
|
*
|
|
5
5
|
* ```
|
|
6
|
-
*
|
|
7
|
-
* {"time":"2026-11-
|
|
6
|
+
* [Soda] 41250 - 11/14/2026, 12:22:09 AM LOG [UsersService] User created {"id":7} +3ms
|
|
7
|
+
* {"time":"2026-11-13T21:22:09.120Z","level":"log","context":"UsersService","message":"User created","id":7}
|
|
8
8
|
* ```
|
|
9
9
|
*
|
|
10
|
-
* Like Nest's `ConsoleLogger`:
|
|
11
|
-
*
|
|
10
|
+
* Like Nest's `ConsoleLogger`: the same line layout, colored by level in a
|
|
11
|
+
* terminal, with the time since the previous line; a minimum level; a JSON
|
|
12
|
+
* mode for log collectors. `error` and `fatal` go to stderr, the rest to stdout.
|
|
12
13
|
*/
|
|
13
14
|
import { Logger } from './logger.ts';
|
|
14
15
|
import type { LogEntry, LogLevel } from './logger.ts';
|
|
@@ -19,6 +20,13 @@ export interface ConsoleLoggerOptions {
|
|
|
19
20
|
readonly json?: boolean;
|
|
20
21
|
/** Where lines go. Defaults to stderr for `error` and `fatal`, stdout otherwise. */
|
|
21
22
|
readonly output?: (line: string, level: LogLevel) => void;
|
|
23
|
+
/**
|
|
24
|
+
* Colors by level. Defaults to on when writing to a terminal without
|
|
25
|
+
* `NO_COLOR`, off with a custom `output`.
|
|
26
|
+
*/
|
|
27
|
+
readonly colors?: boolean;
|
|
28
|
+
/** Name starting each readable line. Defaults to `Soda`. */
|
|
29
|
+
readonly prefix?: string;
|
|
22
30
|
}
|
|
23
31
|
export declare class ConsoleLogger extends Logger {
|
|
24
32
|
#private;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"console-logger.d.ts","sourceRoot":"","sources":["../../src/logger/console-logger.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"console-logger.d.ts","sourceRoot":"","sources":["../../src/logger/console-logger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAErD,MAAM,WAAW,oBAAoB;IACnC,qDAAqD;IACrD,QAAQ,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAA;IACzB,yEAAyE;IACzE,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAA;IACvB,oFAAoF;IACpF,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAA;IACzD;;;OAGG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAA;IACzB,4DAA4D;IAC5D,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CACzB;AA2ED,qBAAa,aAAc,SAAQ,MAAM;;IASvC,YAAY,OAAO,GAAE,oBAAyB,EAO7C;IAED,KAAK,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CAS3B;CA6BF"}
|
|
@@ -3,15 +3,35 @@
|
|
|
3
3
|
* Logger writing to stdout and stderr, readable for people or as JSON lines.
|
|
4
4
|
*
|
|
5
5
|
* ```
|
|
6
|
-
*
|
|
7
|
-
* {"time":"2026-11-
|
|
6
|
+
* [Soda] 41250 - 11/14/2026, 12:22:09 AM LOG [UsersService] User created {"id":7} +3ms
|
|
7
|
+
* {"time":"2026-11-13T21:22:09.120Z","level":"log","context":"UsersService","message":"User created","id":7}
|
|
8
8
|
* ```
|
|
9
9
|
*
|
|
10
|
-
* Like Nest's `ConsoleLogger`:
|
|
11
|
-
*
|
|
10
|
+
* Like Nest's `ConsoleLogger`: the same line layout, colored by level in a
|
|
11
|
+
* terminal, with the time since the previous line; a minimum level; a JSON
|
|
12
|
+
* mode for log collectors. `error` and `fatal` go to stderr, the rest to stdout.
|
|
12
13
|
*/
|
|
13
14
|
import { Logger } from './logger.js';
|
|
14
15
|
const SEVERITY = { verbose: 0, debug: 1, log: 2, warn: 3, error: 4, fatal: 5 };
|
|
16
|
+
const color = (code) => (text) => `\u001B[${code}m${text}\u001B[0m`;
|
|
17
|
+
const LEVEL_COLORS = {
|
|
18
|
+
verbose: color('96'),
|
|
19
|
+
debug: color('95'),
|
|
20
|
+
log: color('32'),
|
|
21
|
+
warn: color('33'),
|
|
22
|
+
error: color('31'),
|
|
23
|
+
fatal: color('1;31'),
|
|
24
|
+
};
|
|
25
|
+
const yellow = color('38;5;3');
|
|
26
|
+
const plain = (text) => text;
|
|
27
|
+
const dateTime = new Intl.DateTimeFormat(undefined, {
|
|
28
|
+
year: 'numeric',
|
|
29
|
+
month: '2-digit',
|
|
30
|
+
day: '2-digit',
|
|
31
|
+
hour: 'numeric',
|
|
32
|
+
minute: '2-digit',
|
|
33
|
+
second: '2-digit',
|
|
34
|
+
});
|
|
15
35
|
const writeToConsole = (line, level) => {
|
|
16
36
|
const stream = level === 'error' || level === 'fatal' ? process.stderr : process.stdout;
|
|
17
37
|
stream.write(`${line}\n`);
|
|
@@ -51,34 +71,44 @@ export class ConsoleLogger extends Logger {
|
|
|
51
71
|
#minimum;
|
|
52
72
|
#json;
|
|
53
73
|
#output;
|
|
74
|
+
#colors;
|
|
75
|
+
#prefix;
|
|
76
|
+
/** When the previous line was written, for the `+3ms` at the end of the next. */
|
|
77
|
+
#last;
|
|
54
78
|
constructor(options = {}) {
|
|
55
79
|
super();
|
|
56
80
|
this.#minimum = SEVERITY[options.level ?? 'log'];
|
|
57
81
|
this.#json = options.json === true;
|
|
58
82
|
this.#output = options.output ?? writeToConsole;
|
|
83
|
+
this.#colors = options.colors ?? (options.output === undefined && process.stdout.isTTY === true && process.env.NO_COLOR === undefined);
|
|
84
|
+
this.#prefix = options.prefix ?? 'Soda';
|
|
59
85
|
}
|
|
60
86
|
write(entry) {
|
|
61
87
|
if (SEVERITY[entry.level] < this.#minimum) {
|
|
62
88
|
return;
|
|
63
89
|
}
|
|
64
|
-
const
|
|
65
|
-
this.#output(this.#json ? this.#formatJson(entry,
|
|
90
|
+
const now = Date.now();
|
|
91
|
+
this.#output(this.#json ? this.#formatJson(entry, now) : this.#formatText(entry, now), entry.level);
|
|
92
|
+
this.#last = now;
|
|
66
93
|
}
|
|
67
|
-
#formatJson(entry,
|
|
94
|
+
#formatJson(entry, now) {
|
|
95
|
+
const time = new Date(now).toISOString();
|
|
68
96
|
// Fixed fields last: data cannot overwrite them.
|
|
69
97
|
return stringify({ ...entry.data, time, level: entry.level, context: entry.context, message: entry.message }, 'full');
|
|
70
98
|
}
|
|
71
|
-
#formatText(entry,
|
|
72
|
-
const
|
|
73
|
-
|
|
99
|
+
#formatText(entry, now) {
|
|
100
|
+
const level = this.#colors ? LEVEL_COLORS[entry.level] : plain;
|
|
101
|
+
const accent = this.#colors ? yellow : plain;
|
|
102
|
+
const context = entry.context === undefined ? '' : accent(`[${entry.context}] `);
|
|
103
|
+
const since = this.#last === undefined ? '' : accent(` +${now - this.#last}ms`);
|
|
104
|
+
const data = entry.data === undefined ? '' : ` ${stringify(entry.data, 'brief')}`;
|
|
105
|
+
const line = `${level(`[${this.#prefix}] ${process.pid} - `)}${dateTime.format(now)} ${level(entry.level.toUpperCase().padStart(7))} ` +
|
|
106
|
+
`${context}${level(entry.message)}${data}${since}`;
|
|
74
107
|
let stacks = '';
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
if (value instanceof Error && value.stack !== undefined) {
|
|
80
|
-
stacks += `\n${value.stack}`;
|
|
81
|
-
}
|
|
108
|
+
// Stacks are read better on their own lines than inside the JSON.
|
|
109
|
+
for (const value of Object.values(entry.data ?? {})) {
|
|
110
|
+
if (value instanceof Error && value.stack !== undefined) {
|
|
111
|
+
stacks += `\n${value.stack}`;
|
|
82
112
|
}
|
|
83
113
|
}
|
|
84
114
|
return line + stacks;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"console-logger.js","sourceRoot":"","sources":["../../src/logger/console-logger.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"console-logger.js","sourceRoot":"","sources":["../../src/logger/console-logger.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/app/app.ts
CHANGED
|
@@ -23,7 +23,7 @@ import { createContainer, provide } from '../di/index.ts'
|
|
|
23
23
|
import type { Container, ContainerOptions, ModuleImport } from '../di/index.ts'
|
|
24
24
|
import { destroyAll, initializeAll } from '../di/lifecycle.ts'
|
|
25
25
|
import { buildRoutes } from '../http/index.ts'
|
|
26
|
-
import type { ControllerRoutesOptions, Middleware } from '../http/index.ts'
|
|
26
|
+
import type { ControllerRoutesOptions, MappedController, Middleware } from '../http/index.ts'
|
|
27
27
|
import { errorResponse } from '../http/exceptions.ts'
|
|
28
28
|
import { applyMiddleware, resolveMiddleware } from '../http/middleware.ts'
|
|
29
29
|
import { ConsoleLogger, Logger, SilentLogger } from '../logger/index.ts'
|
|
@@ -245,6 +245,24 @@ const destroyEverything = async (enhancers: readonly unknown[], container: Conta
|
|
|
245
245
|
}
|
|
246
246
|
}
|
|
247
247
|
|
|
248
|
+
/** What Nest logs at startup: the modules, then each controller and its routes. */
|
|
249
|
+
const logStartup = (logger: Logger, container: Container, controllers: readonly MappedController[]): void => {
|
|
250
|
+
const modules = logger.child('Container')
|
|
251
|
+
const routes = logger.child('Routes')
|
|
252
|
+
|
|
253
|
+
for (const module of container.modules) {
|
|
254
|
+
modules.log(`${module.name} dependencies initialized`)
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
for (const { controller, path, routes: mapped } of controllers) {
|
|
258
|
+
routes.log(`${controller.name} {${path}}:`)
|
|
259
|
+
|
|
260
|
+
for (const route of mapped) {
|
|
261
|
+
routes.log(`Mapped {${route.path}, ${route.method}} route`)
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
|
|
248
266
|
/**
|
|
249
267
|
* Creates the container and the routes, and runs every `onInit` hook.
|
|
250
268
|
*
|
|
@@ -259,6 +277,9 @@ export const createApp = async (root: ModuleImport, options: AppOptions = {}): P
|
|
|
259
277
|
options.onError ??
|
|
260
278
|
((error: unknown, req: Request) =>
|
|
261
279
|
own.error('Unhandled error while handling a request', { error, method: req.method, url: req.url }))
|
|
280
|
+
|
|
281
|
+
own.log('Starting application')
|
|
282
|
+
|
|
262
283
|
const container = await createContainer(root, {
|
|
263
284
|
...options,
|
|
264
285
|
providers: [...(options.providers ?? []), provide(Logger, { useValue: logger })],
|
|
@@ -272,8 +293,10 @@ export const createApp = async (root: ModuleImport, options: AppOptions = {}): P
|
|
|
272
293
|
})
|
|
273
294
|
const built = buildRoutes(container, { ...options, onError })
|
|
274
295
|
|
|
296
|
+
logStartup(logger, container, built.controllers)
|
|
275
297
|
enhancers.push(...built.enhancers)
|
|
276
298
|
await initializeAll(enhancers)
|
|
299
|
+
own.log('Application started')
|
|
277
300
|
|
|
278
301
|
const compiled = compileRoutes(built.routes, options)
|
|
279
302
|
const routes = applyMiddleware(middleware, compiled.routes, compiled.fetch, (error, req) =>
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module
|
|
3
|
+
* Configuration typed by a schema and validated at startup.
|
|
4
|
+
*
|
|
5
|
+
* What `@nestjs/config` does with `registerAs()` and a `validationSchema`,
|
|
6
|
+
* typed by the schema instead of read with string keys. Bun already loads
|
|
7
|
+
* `.env`, `.env.local` and `.env.<NODE_ENV>` into `process.env`.
|
|
8
|
+
*
|
|
9
|
+
* ```ts
|
|
10
|
+
* export const AppConfig = defineConfig('app', z.object({
|
|
11
|
+
* PORT: z.coerce.number().default(3000),
|
|
12
|
+
* JWT_SECRET: z.string().min(32),
|
|
13
|
+
* }))
|
|
14
|
+
*
|
|
15
|
+
* @Module({ imports: [ConfigModule.forRoot({ load: [AppConfig], global: true })] })
|
|
16
|
+
* class AppModule {}
|
|
17
|
+
*
|
|
18
|
+
* class AuthService {
|
|
19
|
+
* readonly #config = inject(AppConfig) // { PORT: number; JWT_SECRET: string }
|
|
20
|
+
* }
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
import { InjectionToken } from '../di/token.ts'
|
|
25
|
+
import { formatIssues } from '../http/schema.ts'
|
|
26
|
+
import type { InferOutput, StandardSchemaV1 } from '../http/schema.ts'
|
|
27
|
+
|
|
28
|
+
/** Environment variables, as in `process.env`. */
|
|
29
|
+
export type Environment = Readonly<Record<string, string | undefined>>
|
|
30
|
+
|
|
31
|
+
/** A configuration that does not match its schema; `issues` lists every problem. */
|
|
32
|
+
export class ConfigError extends Error {
|
|
33
|
+
override readonly name = 'ConfigError'
|
|
34
|
+
|
|
35
|
+
constructor(
|
|
36
|
+
readonly config: string,
|
|
37
|
+
readonly issues: readonly string[]
|
|
38
|
+
) {
|
|
39
|
+
super(`Invalid configuration "${config}":\n ${issues.join('\n ')}`)
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* A configuration, and the DI token of its value: `inject(AppConfig)`.
|
|
45
|
+
* `ConfigModule.forRoot()` loads it at startup; `load()` works without DI.
|
|
46
|
+
*/
|
|
47
|
+
export class Config<T> extends InjectionToken<T> {
|
|
48
|
+
readonly #schema: StandardSchemaV1<unknown, T>
|
|
49
|
+
readonly #source: (env: Environment) => unknown
|
|
50
|
+
|
|
51
|
+
constructor(name: string, schema: StandardSchemaV1<unknown, T>, source: (env: Environment) => unknown) {
|
|
52
|
+
super(name)
|
|
53
|
+
this.#schema = schema
|
|
54
|
+
this.#source = source
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/** The value read from `env` and validated; throws a {@link ConfigError} listing every issue. */
|
|
58
|
+
async load(env: Environment = process.env): Promise<T> {
|
|
59
|
+
const result = await this.#schema['~standard'].validate(this.#source(env))
|
|
60
|
+
|
|
61
|
+
if (result.issues !== undefined) {
|
|
62
|
+
throw new ConfigError(this.description, formatIssues(result.issues, ''))
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
return result.value
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
override toString(): string {
|
|
69
|
+
return `Config(${this.description})`
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Defines a configuration validated by `schema`. Its input is the environment,
|
|
75
|
+
* or what `source` builds from it, for a nested configuration:
|
|
76
|
+
*
|
|
77
|
+
* ```ts
|
|
78
|
+
* const DatabaseConfig = defineConfig('database', DatabaseSchema, (env) => ({
|
|
79
|
+
* url: env.DATABASE_URL,
|
|
80
|
+
* pool: { max: env.DATABASE_POOL_MAX },
|
|
81
|
+
* }))
|
|
82
|
+
* ```
|
|
83
|
+
*/
|
|
84
|
+
export const defineConfig = <S extends StandardSchemaV1>(
|
|
85
|
+
name: string,
|
|
86
|
+
schema: S,
|
|
87
|
+
source: (env: Environment) => unknown = (env) => env
|
|
88
|
+
): Config<InferOutput<S>> => new Config(name, schema as StandardSchemaV1<unknown, InferOutput<S>>, source)
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module
|
|
3
|
+
* Configuration typed by a schema and validated at startup.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
export { Config, ConfigError, defineConfig } from './config.ts'
|
|
7
|
+
export type { Environment } from './config.ts'
|
|
8
|
+
export { ConfigModule } from './module.ts'
|
|
9
|
+
export type { ConfigModuleOptions } from './module.ts'
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module
|
|
3
|
+
* `ConfigModule`: loads configurations at startup, like `ConfigModule.forRoot()` of `@nestjs/config`.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { Module, provide } from '../di/index.ts'
|
|
7
|
+
import type { DynamicModule } from '../di/index.ts'
|
|
8
|
+
import type { Config, Environment } from './config.ts'
|
|
9
|
+
|
|
10
|
+
export interface ConfigModuleOptions {
|
|
11
|
+
/** Configurations to load and provide. */
|
|
12
|
+
readonly load: readonly Config<unknown>[]
|
|
13
|
+
/** Makes them injectable in every module. Defaults to `false`, as in Nest. */
|
|
14
|
+
readonly global?: boolean
|
|
15
|
+
/** Where variables come from, read when the container starts. Defaults to `process.env`. */
|
|
16
|
+
readonly env?: Environment
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* ```ts
|
|
21
|
+
* @Module({ imports: [ConfigModule.forRoot({ load: [AppConfig, DatabaseConfig], global: true })] })
|
|
22
|
+
* class AppModule {}
|
|
23
|
+
* ```
|
|
24
|
+
*
|
|
25
|
+
* Each configuration is loaded when the container starts; an invalid one
|
|
26
|
+
* fails the startup with a `ConfigError` listing all its issues. Tests
|
|
27
|
+
* replace a value with `overrides: [provide(AppConfig, { useValue })]`, and
|
|
28
|
+
* the replaced configuration is not loaded.
|
|
29
|
+
*/
|
|
30
|
+
@Module({})
|
|
31
|
+
export class ConfigModule {
|
|
32
|
+
static forRoot(options: ConfigModuleOptions): DynamicModule {
|
|
33
|
+
return {
|
|
34
|
+
module: ConfigModule,
|
|
35
|
+
global: options.global ?? false,
|
|
36
|
+
providers: options.load.map((config) => provide(config, { useFactory: () => config.load(options.env) })),
|
|
37
|
+
exports: options.load,
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
package/src/di/container.ts
CHANGED
|
@@ -102,6 +102,8 @@ export interface Container {
|
|
|
102
102
|
runInContext<R>(fn: () => R, options?: ResolveOptions): R
|
|
103
103
|
/** Every controller, in module order. */
|
|
104
104
|
readonly controllers: readonly ControllerEntry[]
|
|
105
|
+
/** Every module, imports before importers. */
|
|
106
|
+
readonly modules: readonly ModuleClass[]
|
|
105
107
|
/**
|
|
106
108
|
* Calls `onDestroy` in reverse creation order, then releases every instance.
|
|
107
109
|
* Calling it again, even from an `onDestroy` hook, returns the same promise.
|
|
@@ -419,6 +421,18 @@ class StartedContainer implements Container {
|
|
|
419
421
|
this.controllers = controllers
|
|
420
422
|
}
|
|
421
423
|
|
|
424
|
+
get modules(): readonly ModuleClass[] {
|
|
425
|
+
const modules: ModuleClass[] = []
|
|
426
|
+
|
|
427
|
+
for (const node of this.#graph.modules) {
|
|
428
|
+
if (node.moduleClass !== ContainerProvidersModule) {
|
|
429
|
+
modules.push(node.moduleClass)
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
return modules
|
|
434
|
+
}
|
|
435
|
+
|
|
422
436
|
get<T>(token: Token<T>, options?: ResolveOptions & { readonly optional?: false }): T
|
|
423
437
|
get<T>(token: Token<T>, options: ResolveOptions & { readonly optional: true }): T | undefined
|
|
424
438
|
get<T>(token: Token<T>, options: ResolveOptions & { readonly optional?: boolean } = {}): T | undefined {
|
package/src/http/decorators.ts
CHANGED
|
@@ -65,11 +65,18 @@ export type RouteHandlerMethod<This, P extends string> =
|
|
|
65
65
|
/**
|
|
66
66
|
* Decorator of a route without argument list: `@Get(':id')`.
|
|
67
67
|
*/
|
|
68
|
-
export type RouteDecorator<P extends string> = <This, M extends
|
|
69
|
-
method: M,
|
|
68
|
+
export type RouteDecorator<P extends string> = <This, M extends (this: This, ...args: any[]) => unknown>(
|
|
69
|
+
method: M extends RouteHandlerMethod<This, P> ? M : RouteHandlerHint<P>,
|
|
70
70
|
context: ClassMethodDecoratorContext<This, M>
|
|
71
71
|
) => void
|
|
72
72
|
|
|
73
|
+
/**
|
|
74
|
+
* What the compiler shows for a method that does not fit a route without
|
|
75
|
+
* argument list, such as `findOne(id: string)` under `@Get(':id')`.
|
|
76
|
+
*/
|
|
77
|
+
export type RouteHandlerHint<P extends string> =
|
|
78
|
+
`Without an argument list, the method receives the context: (ctx: Context<'${P}'>). To receive values, list them: @Get('${P}', [param('name')]).`
|
|
79
|
+
|
|
73
80
|
/**
|
|
74
81
|
* Decorator of a route with an argument list: `@Get(':id', [param('id', int())])`.
|
|
75
82
|
* The method must accept the values of the arguments, in order.
|
package/src/http/index.ts
CHANGED
|
@@ -16,6 +16,7 @@ export type {
|
|
|
16
16
|
MethodRouteDecoratorFactory,
|
|
17
17
|
RouteDecorator,
|
|
18
18
|
RouteDecoratorFactory,
|
|
19
|
+
RouteHandlerHint,
|
|
19
20
|
RouteHandlerMethod,
|
|
20
21
|
} from './decorators.ts'
|
|
21
22
|
export { ControllerError } from './errors.ts'
|
|
@@ -38,7 +39,7 @@ export type { HttpExceptionBody, HttpExceptionOptions } from './exceptions.ts'
|
|
|
38
39
|
export { boolean, int, number, uuid } from './parsers.ts'
|
|
39
40
|
export type { Parsed, Parser, ParserOptions, ValueParser } from './parsers.ts'
|
|
40
41
|
export { buildRoutes, controllerRoutes } from './routes.ts'
|
|
41
|
-
export type { BuiltRoutes, ControllerRoutesOptions } from './routes.ts'
|
|
42
|
+
export type { BuiltRoutes, ControllerRoutesOptions, MappedController } from './routes.ts'
|
|
42
43
|
export type { InferOutput, StandardSchemaV1 } from './schema.ts'
|
|
43
44
|
export type { AnyParams, PathParams } from './types.ts'
|
|
44
45
|
export { Catch, createDecorator, UseFilters, UseGuards, UseInterceptors } from './enhancers.ts'
|
package/src/http/routes.ts
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* ```
|
|
12
12
|
*/
|
|
13
13
|
|
|
14
|
-
import type { Container, ControllerEntry, ModuleClass } from '../di/index.ts'
|
|
14
|
+
import type { Constructor, Container, ControllerEntry, ModuleClass } from '../di/index.ts'
|
|
15
15
|
import type { RouteDefinition } from '../routing/index.ts'
|
|
16
16
|
import { parsePath } from '../routing/path.ts'
|
|
17
17
|
import { isThenable } from '../utils/promise.ts'
|
|
@@ -156,6 +156,7 @@ const resolveAll = <T, S>(
|
|
|
156
156
|
*/
|
|
157
157
|
class RoutesBuilder {
|
|
158
158
|
readonly routes: RouteDefinition[] = []
|
|
159
|
+
readonly controllers: MappedController[] = []
|
|
159
160
|
/** Guards, interceptors and filters created from classes, in creation order. */
|
|
160
161
|
readonly enhancers: unknown[] = []
|
|
161
162
|
readonly #options: ControllerRoutesOptions
|
|
@@ -184,10 +185,14 @@ class RoutesBuilder {
|
|
|
184
185
|
|
|
185
186
|
const basePath = joinPaths(this.#options.prefix ?? '', controllerPath)
|
|
186
187
|
|
|
188
|
+
const start = this.routes.length
|
|
189
|
+
|
|
187
190
|
// The most derived function: an override without route decorators has no metadata.
|
|
188
191
|
for (const name of methodNames(entry.instance as object)) {
|
|
189
192
|
this.#addMethod(entry, basePath, name)
|
|
190
193
|
}
|
|
194
|
+
|
|
195
|
+
this.controllers.push({ controller: entry.controller, path: basePath, routes: this.routes.slice(start) })
|
|
191
196
|
}
|
|
192
197
|
|
|
193
198
|
#resolverOf(entry: ControllerEntry): EnhancerResolver {
|
|
@@ -251,12 +256,22 @@ class RoutesBuilder {
|
|
|
251
256
|
}
|
|
252
257
|
}
|
|
253
258
|
|
|
259
|
+
/** A controller and the routes made from it, as `createApp` logs them at startup. */
|
|
260
|
+
export interface MappedController {
|
|
261
|
+
readonly controller: Constructor<unknown>
|
|
262
|
+
/** Path of the controller, with the global prefix. */
|
|
263
|
+
readonly path: string
|
|
264
|
+
readonly routes: readonly RouteDefinition[]
|
|
265
|
+
}
|
|
266
|
+
|
|
254
267
|
/**
|
|
255
268
|
* Routes of every controller, and the guards, interceptors and filters created
|
|
256
269
|
* for them from classes (whose lifecycle hooks the application runs).
|
|
257
270
|
*/
|
|
258
271
|
export interface BuiltRoutes {
|
|
259
272
|
readonly routes: RouteDefinition[]
|
|
273
|
+
/** In module order. */
|
|
274
|
+
readonly controllers: readonly MappedController[]
|
|
260
275
|
/** In creation order. */
|
|
261
276
|
readonly enhancers: readonly unknown[]
|
|
262
277
|
}
|
|
@@ -271,7 +286,7 @@ export const buildRoutes = (container: Container, options: ControllerRoutesOptio
|
|
|
271
286
|
builder.addController(entry)
|
|
272
287
|
}
|
|
273
288
|
|
|
274
|
-
return { routes: builder.routes, enhancers: builder.enhancers }
|
|
289
|
+
return { routes: builder.routes, controllers: builder.controllers, enhancers: builder.enhancers }
|
|
275
290
|
}
|
|
276
291
|
|
|
277
292
|
/**
|
package/src/http/schema.ts
CHANGED
|
@@ -67,7 +67,8 @@ const OMITTED = 'Further validation errors were omitted'
|
|
|
67
67
|
export const isStandardSchema = (value: unknown): value is StandardSchemaV1 =>
|
|
68
68
|
typeof value === 'object' && value !== null && '~standard' in value
|
|
69
69
|
|
|
70
|
-
|
|
70
|
+
/** Messages of `issues`, each with the path of its value under `prefix`. */
|
|
71
|
+
export const formatIssues = (issues: readonly StandardSchemaV1.Issue[], prefix: string): string[] => {
|
|
71
72
|
const messages: string[] = []
|
|
72
73
|
let remaining = MAX_MESSAGES_LENGTH
|
|
73
74
|
|