@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.
Files changed (54) hide show
  1. package/README.md +23 -0
  2. package/dist/app/app.d.ts.map +1 -1
  3. package/dist/app/app.js +17 -0
  4. package/dist/app/app.js.map +1 -1
  5. package/dist/config/config.d.ts +57 -0
  6. package/dist/config/config.d.ts.map +1 -0
  7. package/dist/config/config.js +72 -0
  8. package/dist/config/config.js.map +1 -0
  9. package/dist/config/index.d.ts +9 -0
  10. package/dist/config/index.d.ts.map +1 -0
  11. package/dist/config/index.js +7 -0
  12. package/dist/config/index.js.map +1 -0
  13. package/dist/config/module.d.ts +29 -0
  14. package/dist/config/module.d.ts.map +1 -0
  15. package/dist/config/module.js +28 -0
  16. package/dist/config/module.js.map +1 -0
  17. package/dist/di/container.d.ts +2 -0
  18. package/dist/di/container.d.ts.map +1 -1
  19. package/dist/di/container.js +9 -0
  20. package/dist/di/container.js.map +1 -1
  21. package/dist/http/decorators.d.ts +6 -1
  22. package/dist/http/decorators.d.ts.map +1 -1
  23. package/dist/http/decorators.js.map +1 -1
  24. package/dist/http/index.d.ts +2 -2
  25. package/dist/http/index.d.ts.map +1 -1
  26. package/dist/http/index.js.map +1 -1
  27. package/dist/http/routes.d.ts +10 -1
  28. package/dist/http/routes.d.ts.map +1 -1
  29. package/dist/http/routes.js +4 -1
  30. package/dist/http/routes.js.map +1 -1
  31. package/dist/http/schema.d.ts +2 -0
  32. package/dist/http/schema.d.ts.map +1 -1
  33. package/dist/http/schema.js +2 -1
  34. package/dist/http/schema.js.map +1 -1
  35. package/dist/index.d.ts +1 -0
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/index.js +1 -0
  38. package/dist/index.js.map +1 -1
  39. package/dist/logger/console-logger.d.ts +12 -4
  40. package/dist/logger/console-logger.d.ts.map +1 -1
  41. package/dist/logger/console-logger.js +47 -17
  42. package/dist/logger/console-logger.js.map +1 -1
  43. package/package.json +1 -1
  44. package/src/app/app.ts +24 -1
  45. package/src/config/config.ts +88 -0
  46. package/src/config/index.ts +9 -0
  47. package/src/config/module.ts +40 -0
  48. package/src/di/container.ts +14 -0
  49. package/src/http/decorators.ts +9 -2
  50. package/src/http/index.ts +2 -1
  51. package/src/http/routes.ts +17 -2
  52. package/src/http/schema.ts +2 -1
  53. package/src/index.ts +1 -0
  54. package/src/logger/console-logger.ts +62 -18
@@ -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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"}
@@ -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;AA6BrE;;;;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"}
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"}
@@ -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
- const formatIssues = (issues, prefix) => {
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) {
@@ -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;IAC3F,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"}
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
@@ -31,6 +31,7 @@
31
31
  * ```
32
32
  */
33
33
  export * from './app/index.ts';
34
+ export * from './config/index.ts';
34
35
  export * from './di/index.ts';
35
36
  export * from './http/index.ts';
36
37
  export * from './logger/index.ts';
@@ -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
@@ -31,6 +31,7 @@
31
31
  * ```
32
32
  */
33
33
  export * from './app/index.js';
34
+ export * from './config/index.js';
34
35
  export * from './di/index.js';
35
36
  export * from './http/index.js';
36
37
  export * from './logger/index.js';
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
- * 2026-11-13T17:20:03.120Z LOG [UsersService] User created {"id":7}
7
- * {"time":"2026-11-13T17:20:03.120Z","level":"log","context":"UsersService","message":"User created","id":7}
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`: a minimum level, a JSON mode for log
11
- * collectors; `error` and `fatal` go to stderr, the rest to stdout.
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;;;;;;;;;;;GAWG;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;CAC1D;AAkDD,qBAAa,aAAc,SAAQ,MAAM;;IAKvC,YAAY,OAAO,GAAE,oBAAyB,EAK7C;IAED,KAAK,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CAQ3B;CAyBF"}
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
- * 2026-11-13T17:20:03.120Z LOG [UsersService] User created {"id":7}
7
- * {"time":"2026-11-13T17:20:03.120Z","level":"log","context":"UsersService","message":"User created","id":7}
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`: a minimum level, a JSON mode for log
11
- * collectors; `error` and `fatal` go to stderr, the rest to stdout.
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 time = new Date().toISOString();
65
- this.#output(this.#json ? this.#formatJson(entry, time) : this.#formatText(entry, time), entry.level);
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, time) {
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, time) {
72
- const context = entry.context === undefined ? '' : `[${entry.context}] `;
73
- let line = `${time} ${entry.level.toUpperCase().padEnd(7)} ${context}${entry.message}`;
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
- if (entry.data !== undefined) {
76
- line += ` ${stringify(entry.data, 'brief')}`;
77
- // Stacks are read better on their own lines than inside the JSON.
78
- for (const value of Object.values(entry.data)) {
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":"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"}
1
+ {"version":3,"file":"console-logger.js","sourceRoot":"","sources":["../../src/logger/console-logger.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@getsoda/core",
3
- "version": "0.2.0",
3
+ "version": "0.2.2",
4
4
  "description": "Class-based web framework for Bun: modules, dependency injection and decorators like Nest, on Bun's native router",
5
5
  "keywords": [
6
6
  "bun",
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
+ }
@@ -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 {
@@ -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 RouteHandlerMethod<This, P>>(
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'
@@ -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
  /**
@@ -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
- const formatIssues = (issues: readonly StandardSchemaV1.Issue[], prefix: string): string[] => {
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
 
package/src/index.ts CHANGED
@@ -32,6 +32,7 @@
32
32
  */
33
33
 
34
34
  export * from './app/index.ts'
35
+ export * from './config/index.ts'
35
36
  export * from './di/index.ts'
36
37
  export * from './http/index.ts'
37
38
  export * from './logger/index.ts'