@c9up/ream 0.1.25 → 0.1.26

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 (172) hide show
  1. package/dist/ConfigLoader.d.ts +46 -5
  2. package/dist/ConfigLoader.d.ts.map +1 -1
  3. package/dist/ConfigLoader.js +60 -9
  4. package/dist/ConfigLoader.js.map +1 -1
  5. package/dist/HttpKernel.d.ts.map +1 -1
  6. package/dist/HttpKernel.js +46 -6
  7. package/dist/HttpKernel.js.map +1 -1
  8. package/dist/Ignitor.d.ts.map +1 -1
  9. package/dist/Ignitor.js +21 -3
  10. package/dist/Ignitor.js.map +1 -1
  11. package/dist/container/Container.d.ts +23 -3
  12. package/dist/container/Container.d.ts.map +1 -1
  13. package/dist/container/Container.js +139 -60
  14. package/dist/container/Container.js.map +1 -1
  15. package/dist/env/Env.d.ts +29 -4
  16. package/dist/env/Env.d.ts.map +1 -1
  17. package/dist/env/Env.js +27 -4
  18. package/dist/env/Env.js.map +1 -1
  19. package/dist/env/Secret.d.ts +11 -0
  20. package/dist/env/Secret.d.ts.map +1 -0
  21. package/dist/env/Secret.js +36 -0
  22. package/dist/env/Secret.js.map +1 -0
  23. package/dist/env/interpolate.d.ts +26 -0
  24. package/dist/env/interpolate.d.ts.map +1 -0
  25. package/dist/env/interpolate.js +48 -0
  26. package/dist/env/interpolate.js.map +1 -0
  27. package/dist/env/loadEnvFiles.d.ts.map +1 -1
  28. package/dist/env/loadEnvFiles.js +14 -4
  29. package/dist/env/loadEnvFiles.js.map +1 -1
  30. package/dist/env/schema.d.ts +23 -6
  31. package/dist/env/schema.d.ts.map +1 -1
  32. package/dist/env/schema.js +67 -33
  33. package/dist/env/schema.js.map +1 -1
  34. package/dist/events/Emitter.d.ts +1 -1
  35. package/dist/events/Emitter.d.ts.map +1 -1
  36. package/dist/events/Emitter.js +1 -1
  37. package/dist/events/Emitter.js.map +1 -1
  38. package/dist/events/EventsProvider.d.ts +2 -2
  39. package/dist/events/EventsProvider.d.ts.map +1 -1
  40. package/dist/events/EventsProvider.js +3 -3
  41. package/dist/events/EventsProvider.js.map +1 -1
  42. package/dist/graphql/GraphQLEngine.d.ts +1 -1
  43. package/dist/graphql/GraphQLEngine.d.ts.map +1 -1
  44. package/dist/graphql/GraphQLEngine.js +2 -2
  45. package/dist/graphql/GraphQLEngine.js.map +1 -1
  46. package/dist/graphql/GraphQLProvider.d.ts.map +1 -1
  47. package/dist/graphql/GraphQLProvider.js +7 -3
  48. package/dist/graphql/GraphQLProvider.js.map +1 -1
  49. package/dist/http/Exception.d.ts +63 -1
  50. package/dist/http/Exception.d.ts.map +1 -1
  51. package/dist/http/Exception.js +185 -48
  52. package/dist/http/Exception.js.map +1 -1
  53. package/dist/http/HttpContext.d.ts +53 -7
  54. package/dist/http/HttpContext.d.ts.map +1 -1
  55. package/dist/http/HttpContext.js +56 -15
  56. package/dist/http/HttpContext.js.map +1 -1
  57. package/dist/http/RedirectBuilder.d.ts.map +1 -1
  58. package/dist/http/RedirectBuilder.js +4 -1
  59. package/dist/http/RedirectBuilder.js.map +1 -1
  60. package/dist/http/Request.d.ts +141 -10
  61. package/dist/http/Request.d.ts.map +1 -1
  62. package/dist/http/Request.js +244 -34
  63. package/dist/http/Request.js.map +1 -1
  64. package/dist/http/Response.d.ts +176 -9
  65. package/dist/http/Response.d.ts.map +1 -1
  66. package/dist/http/Response.js +404 -16
  67. package/dist/http/Response.js.map +1 -1
  68. package/dist/index.d.ts +5 -4
  69. package/dist/index.d.ts.map +1 -1
  70. package/dist/index.js +4 -3
  71. package/dist/index.js.map +1 -1
  72. package/dist/middleware/Pipeline.js +1 -1
  73. package/dist/middleware/Pipeline.js.map +1 -1
  74. package/dist/openapi/OpenApiProvider.js +4 -4
  75. package/dist/openapi/OpenApiProvider.js.map +1 -1
  76. package/dist/router/Router.d.ts +223 -31
  77. package/dist/router/Router.d.ts.map +1 -1
  78. package/dist/router/Router.js +520 -102
  79. package/dist/router/Router.js.map +1 -1
  80. package/dist/rpc/RpcProvider.d.ts +1 -0
  81. package/dist/rpc/RpcProvider.d.ts.map +1 -1
  82. package/dist/rpc/RpcProvider.js +7 -3
  83. package/dist/rpc/RpcProvider.js.map +1 -1
  84. package/dist/rpc/RpcRouter.d.ts +2 -2
  85. package/dist/rpc/RpcRouter.d.ts.map +1 -1
  86. package/dist/rpc/RpcRouter.js +5 -4
  87. package/dist/rpc/RpcRouter.js.map +1 -1
  88. package/dist/scheduler/ScheduleProvider.d.ts.map +1 -1
  89. package/dist/scheduler/ScheduleProvider.js +7 -15
  90. package/dist/scheduler/ScheduleProvider.js.map +1 -1
  91. package/dist/server/Server.d.ts +17 -4
  92. package/dist/server/Server.d.ts.map +1 -1
  93. package/dist/server/Server.js +41 -7
  94. package/dist/server/Server.js.map +1 -1
  95. package/dist/session/SessionMiddleware.js +3 -3
  96. package/dist/session/SessionMiddleware.js.map +1 -1
  97. package/dist/storage/StaticProvider.js +1 -1
  98. package/dist/storage/StaticProvider.js.map +1 -1
  99. package/dist/testing/RequestBuilder.d.ts +60 -0
  100. package/dist/testing/RequestBuilder.d.ts.map +1 -1
  101. package/dist/testing/RequestBuilder.js +180 -1
  102. package/dist/testing/RequestBuilder.js.map +1 -1
  103. package/dist/testing/TestClient.d.ts +22 -1
  104. package/dist/testing/TestClient.d.ts.map +1 -1
  105. package/dist/testing/TestClient.js +40 -0
  106. package/dist/testing/TestClient.js.map +1 -1
  107. package/dist/utils/Macroable.d.ts +30 -0
  108. package/dist/utils/Macroable.d.ts.map +1 -0
  109. package/dist/utils/Macroable.js +43 -0
  110. package/dist/utils/Macroable.js.map +1 -0
  111. package/dist/utils/inflect.d.ts +17 -0
  112. package/dist/utils/inflect.d.ts.map +1 -0
  113. package/dist/utils/inflect.js +32 -0
  114. package/dist/utils/inflect.js.map +1 -0
  115. package/dist/utils/objectPath.d.ts +57 -0
  116. package/dist/utils/objectPath.d.ts.map +1 -0
  117. package/dist/utils/objectPath.js +141 -0
  118. package/dist/utils/objectPath.js.map +1 -0
  119. package/events.darwin-arm64.node +0 -0
  120. package/events.darwin-x64.node +0 -0
  121. package/events.linux-arm64-gnu.node +0 -0
  122. package/events.linux-x64-gnu.node +0 -0
  123. package/events.win32-x64-msvc.node +0 -0
  124. package/index.darwin-arm64.node +0 -0
  125. package/index.darwin-x64.node +0 -0
  126. package/index.linux-arm64-gnu.node +0 -0
  127. package/index.linux-x64-gnu.node +0 -0
  128. package/index.win32-x64-msvc.node +0 -0
  129. package/package.json +6 -1
  130. package/scheduler.darwin-arm64.node +0 -0
  131. package/scheduler.darwin-x64.node +0 -0
  132. package/scheduler.linux-arm64-gnu.node +0 -0
  133. package/scheduler.linux-x64-gnu.node +0 -0
  134. package/scheduler.win32-x64-msvc.node +0 -0
  135. package/src/ConfigLoader.ts +72 -9
  136. package/src/HttpKernel.ts +53 -15
  137. package/src/Ignitor.ts +24 -3
  138. package/src/container/Container.ts +145 -61
  139. package/src/env/Env.ts +49 -5
  140. package/src/env/Secret.ts +41 -0
  141. package/src/env/interpolate.ts +54 -0
  142. package/src/env/loadEnvFiles.ts +12 -4
  143. package/src/env/schema.ts +109 -35
  144. package/src/events/Emitter.ts +2 -2
  145. package/src/events/EventsProvider.ts +5 -5
  146. package/src/graphql/GraphQLEngine.ts +4 -4
  147. package/src/graphql/GraphQLProvider.ts +7 -3
  148. package/src/http/Exception.ts +214 -37
  149. package/src/http/HttpContext.ts +87 -18
  150. package/src/http/RedirectBuilder.ts +4 -1
  151. package/src/http/Request.ts +264 -34
  152. package/src/http/Response.ts +478 -27
  153. package/src/index.ts +11 -2
  154. package/src/middleware/Pipeline.ts +1 -1
  155. package/src/openapi/OpenApiProvider.ts +4 -4
  156. package/src/router/Router.ts +631 -113
  157. package/src/rpc/RpcProvider.ts +6 -2
  158. package/src/rpc/RpcRouter.ts +7 -6
  159. package/src/scheduler/ScheduleProvider.ts +7 -15
  160. package/src/server/Server.ts +49 -10
  161. package/src/session/SessionMiddleware.ts +4 -4
  162. package/src/storage/StaticProvider.ts +1 -1
  163. package/src/testing/RequestBuilder.ts +218 -1
  164. package/src/testing/TestClient.ts +57 -1
  165. package/src/utils/Macroable.ts +54 -0
  166. package/src/utils/inflect.ts +29 -0
  167. package/src/utils/objectPath.ts +142 -0
  168. package/dist/decorators/Lazy.d.ts +0 -19
  169. package/dist/decorators/Lazy.d.ts.map +0 -1
  170. package/dist/decorators/Lazy.js +0 -53
  171. package/dist/decorators/Lazy.js.map +0 -1
  172. package/src/decorators/Lazy.ts +0 -57
@@ -19,6 +19,7 @@ import { Provider } from '../Provider.js';
19
19
  import { GraphQLEngine } from './GraphQLEngine.js';
20
20
  export class GraphQLProvider extends Provider {
21
21
  #engine;
22
+ #registered = false;
22
23
  constructor(app, options = {}) {
23
24
  super(app);
24
25
  this.#engine = options.engine;
@@ -34,9 +35,11 @@ export class GraphQLProvider extends Provider {
34
35
  return; // GraphQL not configured — opt-out.
35
36
  const container = this.app.container;
36
37
  if (container.has('graphql')) {
37
- if (container.resolve('graphql') === engine) {
38
+ // Idempotent re-register: tracked with a flag rather than
39
+ // `container.resolve('graphql')` because resolution is now async.
40
+ if (this.#registered) {
38
41
  this.#engine = engine;
39
- return; // re-register is idempotent
42
+ return;
40
43
  }
41
44
  throw new ReamError('GRAPHQL_PROVIDER_ALREADY_REGISTERED', "Container token 'graphql' is already bound to a different instance", {
42
45
  hint: 'Only one GraphQLProvider can own the graphql binding. Remove the duplicate provider from your reamrc.ts.',
@@ -45,12 +48,13 @@ export class GraphQLProvider extends Provider {
45
48
  engine.useContainer(container);
46
49
  this.#engine = engine;
47
50
  container.singleton('graphql', () => engine);
51
+ this.#registered = true;
48
52
  }
49
53
  async boot() {
50
54
  const engine = this.#engine;
51
55
  if (!engine)
52
56
  return;
53
- const router = this.app.container.make('router');
57
+ const router = await this.app.container.make('router');
54
58
  // GraphQLEngine.handle() serves the playground on GET and executes queries
55
59
  // on POST, so mount the same path for both verbs.
56
60
  router.get(engine.path, (ctx) => engine.handle(ctx));
@@ -1 +1 @@
1
- {"version":3,"file":"GraphQLProvider.js","sourceRoot":"","sources":["../../src/graphql/GraphQLProvider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAElD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAEzC,OAAO,EAAsB,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAOtE,MAAM,OAAO,eAAgB,SAAQ,QAAQ;IAC3C,OAAO,CAAgB;IAEvB,YAAY,GAAe,EAAE,UAAkC,EAAE;QAC/D,KAAK,CAAC,GAAG,CAAC,CAAA;QACV,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,MAAM,CAAA;IAC/B,CAAC;IAED,qEAAqE;IACrE,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;IAEQ,QAAQ;QACf,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAgB,SAAS,CAAC,CAAA;QAC5D,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;QAC3F,IAAI,CAAC,MAAM;YAAE,OAAM,CAAC,oCAAoC;QACxD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAA;QACpC,IAAI,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7B,IAAI,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,MAAM,EAAE,CAAC;gBAC5C,IAAI,CAAC,OAAO,GAAG,MAAM,CAAA;gBACrB,OAAM,CAAC,4BAA4B;YACrC,CAAC;YACD,MAAM,IAAI,SAAS,CACjB,qCAAqC,EACrC,oEAAoE,EACpE;gBACE,IAAI,EAAE,0GAA0G;aACjH,CACF,CAAA;QACH,CAAC;QACD,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,CAAA;QAC9B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAA;QACrB,SAAS,CAAC,SAAS,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,CAAA;IAC9C,CAAC;IAEQ,KAAK,CAAC,IAAI;QACjB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAA;QAC3B,IAAI,CAAC,MAAM;YAAE,OAAM;QACnB,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAS,QAAQ,CAAC,CAAA;QACxD,2EAA2E;QAC3E,kDAAkD;QAClD,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;QACpD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;IACvD,CAAC;CACF;AAED,2KAA2K;AAC3K,eAAe,eAAe,CAAA"}
1
+ {"version":3,"file":"GraphQLProvider.js","sourceRoot":"","sources":["../../src/graphql/GraphQLProvider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAElD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAEzC,OAAO,EAAsB,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAOtE,MAAM,OAAO,eAAgB,SAAQ,QAAQ;IAC3C,OAAO,CAAgB;IACvB,WAAW,GAAG,KAAK,CAAA;IAEnB,YAAY,GAAe,EAAE,UAAkC,EAAE;QAC/D,KAAK,CAAC,GAAG,CAAC,CAAA;QACV,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,MAAM,CAAA;IAC/B,CAAC;IAED,qEAAqE;IACrE,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;IAEQ,QAAQ;QACf,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAgB,SAAS,CAAC,CAAA;QAC5D,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;QAC3F,IAAI,CAAC,MAAM;YAAE,OAAM,CAAC,oCAAoC;QACxD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAA;QACpC,IAAI,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7B,0DAA0D;YAC1D,kEAAkE;YAClE,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;gBACrB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAA;gBACrB,OAAM;YACR,CAAC;YACD,MAAM,IAAI,SAAS,CACjB,qCAAqC,EACrC,oEAAoE,EACpE;gBACE,IAAI,EAAE,0GAA0G;aACjH,CACF,CAAA;QACH,CAAC;QACD,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,CAAA;QAC9B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAA;QACrB,SAAS,CAAC,SAAS,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,CAAA;QAC5C,IAAI,CAAC,WAAW,GAAG,IAAI,CAAA;IACzB,CAAC;IAEQ,KAAK,CAAC,IAAI;QACjB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAA;QAC3B,IAAI,CAAC,MAAM;YAAE,OAAM;QACnB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAS,QAAQ,CAAC,CAAA;QAC9D,2EAA2E;QAC3E,kDAAkD;QAClD,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;QACpD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;IACvD,CAAC;CACF;AAED,2KAA2K;AAC3K,eAAe,eAAe,CAAA"}
@@ -5,6 +5,7 @@
5
5
  * - ExceptionHandler: global exception handler with content negotiation
6
6
  * - Built-in E_* exceptions
7
7
  */
8
+ import { Macroable } from '../utils/Macroable.js';
8
9
  import type { HttpContext } from './HttpContext.js';
9
10
  /**
10
11
  * Base exception class. Extend this to create self-handling exceptions.
@@ -27,8 +28,12 @@ import type { HttpContext } from './HttpContext.js';
27
28
  export declare class Exception extends Error {
28
29
  static status: number;
29
30
  static code: string;
31
+ /** Optional static remediation hint, copied onto instances (AdonisJS `Exception.help`). */
32
+ static help?: string;
30
33
  status: number;
31
34
  code: string;
35
+ /** Human-readable remediation hint surfaced in debug output (AdonisJS `error.help`). */
36
+ help?: string;
32
37
  constructor(message: string, options?: {
33
38
  status?: number;
34
39
  code?: string;
@@ -38,6 +43,30 @@ export declare class Exception extends Error {
38
43
  /** Override to report the exception (logging, monitoring). Never send HTTP from here. */
39
44
  report?(error: this, ctx: HttpContext): Promise<void> | void;
40
45
  }
46
+ /** A concrete Exception subclass produced by {@link createError}. */
47
+ export interface ExceptionConstructor {
48
+ new (...args: unknown[]): Exception;
49
+ status: number;
50
+ code: string;
51
+ }
52
+ /**
53
+ * Build a reusable Exception subclass in one line (AdonisJS `createError`).
54
+ * `message` may contain `util.format` placeholders (`%s`, `%d`) filled by the
55
+ * constructor args:
56
+ *
57
+ * const E_RESOURCE_MISSING = createError('Resource %s not found', 'E_RESOURCE_MISSING', 404)
58
+ * throw new E_RESOURCE_MISSING('user-42') // → "Resource user-42 not found"
59
+ */
60
+ export declare function createError(message: string, code: string, status?: number): ExceptionConstructor;
61
+ /** A generic 500 runtime error (AdonisJS `RuntimeException`). */
62
+ export declare class RuntimeException extends Exception {
63
+ static status: number;
64
+ static code: string;
65
+ }
66
+ /** Raised when a function receives invalid arguments (AdonisJS `InvalidArgumentsException`). */
67
+ export declare class InvalidArgumentsException extends RuntimeException {
68
+ static code: string;
69
+ }
41
70
  export declare class E_ROUTE_NOT_FOUND extends Exception {
42
71
  static status: number;
43
72
  static code: string;
@@ -72,6 +101,18 @@ export declare class E_ROW_NOT_FOUND extends Exception {
72
101
  export declare class E_HTTP_EXCEPTION extends Exception {
73
102
  constructor(message: string, status: number);
74
103
  }
104
+ /**
105
+ * Thrown by `response.abort()` / `response.abortIf()` (AdonisJS parity). Carries
106
+ * an arbitrary body that {@link handle} renders as-is — a string verbatim,
107
+ * anything else as JSON.
108
+ */
109
+ export declare class E_HTTP_REQUEST_ABORTED extends Exception {
110
+ static status: number;
111
+ static code: string;
112
+ readonly body: unknown;
113
+ constructor(body: unknown, status?: number);
114
+ handle(_error: this, ctx: HttpContext): void;
115
+ }
75
116
  /**
76
117
  * Global exception handler — catches all unhandled exceptions and converts
77
118
  * them to HTTP responses.
@@ -87,12 +128,32 @@ export declare class E_HTTP_EXCEPTION extends Exception {
87
128
  * 2. Else → this.handle() → content negotiation (JSON or HTML)
88
129
  * 3. Then → this.report() → logging/monitoring
89
130
  */
90
- export declare class ExceptionHandler {
131
+ /** Renders an HTML error page for a status (AdonisJS `StatusPageRenderer`). */
132
+ export type StatusPageRenderer = (error: unknown, ctx: HttpContext) => Promise<string> | string;
133
+ /** A constructor usable in `instanceof` for {@link ExceptionHandler.ignoreExceptions}. */
134
+ export type ExceptionClass = new (...args: never[]) => Error;
135
+ /** Reporting log level, keyed to `console` (AdonisJS levels: error/warn/info). */
136
+ type LogLevel = 'error' | 'warn' | 'info';
137
+ export declare class ExceptionHandler extends Macroable {
91
138
  #private;
92
139
  protected debug: boolean;
140
+ /** Render `statusPages` (browser HTML). Defaults to production only (AdonisJS). */
141
+ protected renderStatusPages: boolean;
142
+ /** Status → HTML renderer, keys may be single codes or `'500..599'` ranges. */
143
+ protected statusPages: Record<string, StatusPageRenderer>;
144
+ /** Master reporting switch (AdonisJS `reportErrors`). */
145
+ protected reportErrors: boolean;
93
146
  protected ignoreStatuses: number[];
94
147
  protected ignoreCodes: string[];
148
+ /** Exception classes never reported (AdonisJS `ignoreExceptions`). */
149
+ protected ignoreExceptions: ExceptionClass[];
95
150
  constructor(debug?: boolean);
151
+ /** Whether debug detail is exposed for this request (AdonisJS — override per-ctx). */
152
+ protected isDebuggingEnabled(_ctx: HttpContext): boolean;
153
+ /** Log level for an error by status: 5xx→error, 4xx→warn, else info (AdonisJS). */
154
+ protected getErrorLogLevel(status: number): LogLevel;
155
+ /** Whether an error should be reported — honours every ignore list (AdonisJS `shouldReport`). */
156
+ protected shouldReport(error: unknown): boolean;
96
157
  /** Convert an exception to an HTTP response. */
97
158
  handle(error: unknown, ctx: HttpContext): Promise<void>;
98
159
  /** Log/report an exception. Override for custom monitoring. */
@@ -100,4 +161,5 @@ export declare class ExceptionHandler {
100
161
  /** Provide additional context for error reports. Override for custom data. */
101
162
  protected context(ctx: HttpContext): Record<string, unknown>;
102
163
  }
164
+ export {};
103
165
  //# sourceMappingURL=Exception.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Exception.d.ts","sourceRoot":"","sources":["../../src/http/Exception.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAEnD;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,SAAU,SAAQ,KAAK;IAClC,MAAM,CAAC,MAAM,SAAM;IACnB,MAAM,CAAC,IAAI,SAAc;IAEzB,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;gBAEA,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE;IASzE,wEAAwE;IACxE,MAAM,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAE5D,yFAAyF;IACzF,MAAM,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;CAC7D;AAID,qBAAa,iBAAkB,SAAQ,SAAS;IAC9C,OAAgB,MAAM,SAAM;IAC5B,OAAgB,IAAI,SAAsB;gBAE9B,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;CAGzC;AAED,qBAAa,cAAe,SAAQ,SAAS;IAC3C,OAAgB,MAAM,SAAM;IAC5B,OAAgB,IAAI,SAAmB;gBAE3B,OAAO,SAA4B;IAItC,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI;CAGtD;AAED,qBAAa,WAAY,SAAQ,SAAS;IACxC,OAAgB,MAAM,SAAM;IAC5B,OAAgB,IAAI,SAAgB;IAEpC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;gBAEP,OAAO,SAA6B,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE;IAK5D,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI;CAStD;AAED,qBAAa,kBAAmB,SAAQ,SAAS;IAC/C,OAAgB,MAAM,SAAM;IAC5B,OAAgB,IAAI,SAAuB;IAE3C,MAAM,EAAE,OAAO,EAAE,CAAA;gBAEL,MAAM,EAAE,OAAO,EAAE;IAKpB,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI;CAGtD;AAED,qBAAa,eAAgB,SAAQ,SAAS;IAC5C,OAAgB,MAAM,SAAM;IAC5B,OAAgB,IAAI,SAAoB;gBAE5B,KAAK,CAAC,EAAE,MAAM;IAOjB,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI;CAGtD;AAED,qBAAa,gBAAiB,SAAQ,SAAS;gBACjC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;CAG5C;AAID;;;;;;;;;;;;;;GAcG;AACH,qBAAa,gBAAgB;;IAC3B,SAAS,CAAC,KAAK,EAAE,OAAO,CAAA;IACxB,SAAS,CAAC,cAAc,EAAE,MAAM,EAAE,CAAuB;IACzD,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,CAAK;gBAExB,KAAK,UAAQ;IAIzB,gDAAgD;IAC1C,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IA+C7D,+DAA+D;IACzD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAqB7D,8EAA8E;IAC9E,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAQ7D"}
1
+ {"version":3,"file":"Exception.d.ts","sourceRoot":"","sources":["../../src/http/Exception.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,8 @@
5
5
  * - ExceptionHandler: global exception handler with content negotiation
6
6
  * - Built-in E_* exceptions
7
7
  */
8
+ import { format } from 'node:util';
9
+ import { Macroable } from '../utils/Macroable.js';
8
10
  /**
9
11
  * Base exception class. Extend this to create self-handling exceptions.
10
12
  *
@@ -26,8 +28,12 @@
26
28
  export class Exception extends Error {
27
29
  static status = 500;
28
30
  static code = 'E_UNKNOWN';
31
+ /** Optional static remediation hint, copied onto instances (AdonisJS `Exception.help`). */
32
+ static help;
29
33
  status;
30
34
  code;
35
+ /** Human-readable remediation hint surfaced in debug output (AdonisJS `error.help`). */
36
+ help;
31
37
  constructor(message, options) {
32
38
  super(message);
33
39
  this.name = this.constructor.name;
@@ -35,8 +41,36 @@ export class Exception extends Error {
35
41
  const ctor = this.constructor;
36
42
  this.status = options?.status ?? ctor.status;
37
43
  this.code = options?.code ?? ctor.code;
44
+ if (ctor.help !== undefined)
45
+ this.help = ctor.help;
38
46
  }
39
47
  }
48
+ /**
49
+ * Build a reusable Exception subclass in one line (AdonisJS `createError`).
50
+ * `message` may contain `util.format` placeholders (`%s`, `%d`) filled by the
51
+ * constructor args:
52
+ *
53
+ * const E_RESOURCE_MISSING = createError('Resource %s not found', 'E_RESOURCE_MISSING', 404)
54
+ * throw new E_RESOURCE_MISSING('user-42') // → "Resource user-42 not found"
55
+ */
56
+ export function createError(message, code, status = 500) {
57
+ return class extends Exception {
58
+ static status = status;
59
+ static code = code;
60
+ constructor(...args) {
61
+ super(format(message, ...args), { status, code });
62
+ }
63
+ };
64
+ }
65
+ /** A generic 500 runtime error (AdonisJS `RuntimeException`). */
66
+ export class RuntimeException extends Exception {
67
+ static status = 500;
68
+ static code = 'E_RUNTIME_EXCEPTION';
69
+ }
70
+ /** Raised when a function receives invalid arguments (AdonisJS `InvalidArgumentsException`). */
71
+ export class InvalidArgumentsException extends RuntimeException {
72
+ static code = 'E_INVALID_ARGUMENTS';
73
+ }
40
74
  // ─── Built-in exceptions ──────────────────────────────────
41
75
  export class E_ROUTE_NOT_FOUND extends Exception {
42
76
  static status = 404;
@@ -103,61 +137,144 @@ export class E_HTTP_EXCEPTION extends Exception {
103
137
  super(message, { status, code: 'E_HTTP_EXCEPTION' });
104
138
  }
105
139
  }
106
- // ─── ExceptionHandler ─────────────────────────────────────
107
140
  /**
108
- * Global exception handler — catches all unhandled exceptions and converts
109
- * them to HTTP responses.
110
- *
111
- * Extend this in your app:
112
- * export default class Handler extends ExceptionHandler {
113
- * protected debug = app.inDev
114
- * protected ignoreStatuses = [400, 401, 404, 422]
115
- * }
116
- *
117
- * Flow:
118
- * 1. If exception has handle() → self-handled (bypass global)
119
- * 2. Else → this.handle() → content negotiation (JSON or HTML)
120
- * 3. Then → this.report() → logging/monitoring
141
+ * Thrown by `response.abort()` / `response.abortIf()` (AdonisJS parity). Carries
142
+ * an arbitrary body that {@link handle} renders as-is — a string verbatim,
143
+ * anything else as JSON.
121
144
  */
122
- export class ExceptionHandler {
145
+ export class E_HTTP_REQUEST_ABORTED extends Exception {
146
+ static status = 400;
147
+ static code = 'E_HTTP_REQUEST_ABORTED';
148
+ body;
149
+ constructor(body, status = 400) {
150
+ super(typeof body === 'string' ? body : 'Request aborted', {
151
+ status,
152
+ code: 'E_HTTP_REQUEST_ABORTED',
153
+ });
154
+ this.body = body;
155
+ }
156
+ handle(_error, ctx) {
157
+ if (typeof this.body === 'string') {
158
+ ctx.response.status(this.status).send(this.body);
159
+ }
160
+ else {
161
+ ctx.response.status(this.status).json(this.body);
162
+ }
163
+ }
164
+ }
165
+ export class ExceptionHandler extends Macroable {
123
166
  debug;
167
+ /** Render `statusPages` (browser HTML). Defaults to production only (AdonisJS). */
168
+ renderStatusPages = process.env.NODE_ENV === 'production';
169
+ /** Status → HTML renderer, keys may be single codes or `'500..599'` ranges. */
170
+ statusPages = {};
171
+ /** Master reporting switch (AdonisJS `reportErrors`). */
172
+ reportErrors = true;
124
173
  ignoreStatuses = [400, 401, 404, 422];
125
174
  ignoreCodes = [];
175
+ /** Exception classes never reported (AdonisJS `ignoreExceptions`). */
176
+ ignoreExceptions = [];
177
+ #expandedStatusPages;
126
178
  constructor(debug = false) {
179
+ super();
127
180
  this.debug = debug;
128
181
  }
182
+ /** Whether debug detail is exposed for this request (AdonisJS — override per-ctx). */
183
+ isDebuggingEnabled(_ctx) {
184
+ return this.debug;
185
+ }
186
+ /** Log level for an error by status: 5xx→error, 4xx→warn, else info (AdonisJS). */
187
+ getErrorLogLevel(status) {
188
+ if (status >= 500)
189
+ return 'error';
190
+ if (status >= 400)
191
+ return 'warn';
192
+ return 'info';
193
+ }
194
+ /** Whether an error should be reported — honours every ignore list (AdonisJS `shouldReport`). */
195
+ shouldReport(error) {
196
+ if (!this.reportErrors)
197
+ return false;
198
+ const { status, code } = extractErrorMeta(error);
199
+ if (this.ignoreStatuses.includes(status))
200
+ return false;
201
+ if (this.ignoreCodes.includes(code))
202
+ return false;
203
+ if (this.ignoreExceptions.some((exception) => error instanceof exception))
204
+ return false;
205
+ return true;
206
+ }
207
+ /** Expand `statusPages` range keys (`'500..599'`) into a per-code lookup (cached). */
208
+ #expandStatusPages() {
209
+ if (!this.#expandedStatusPages) {
210
+ const expanded = {};
211
+ for (const range of Object.keys(this.statusPages)) {
212
+ Object.assign(expanded, parseStatusRange(range, this.statusPages[range]));
213
+ }
214
+ this.#expandedStatusPages = expanded;
215
+ }
216
+ return this.#expandedStatusPages;
217
+ }
129
218
  /** Convert an exception to an HTTP response. */
130
219
  async handle(error, ctx) {
131
- // Self-handled exceptions take over entirely.
132
- if (error instanceof Exception && typeof error.handle === 'function') {
220
+ // Self-handled errors take over entirely (duck-typed, per AdonisJS — any
221
+ // thrown value exposing a `handle()` method, not just `Exception` instances).
222
+ if (isSelfHandling(error)) {
133
223
  await error.handle(error, ctx);
134
224
  return;
135
225
  }
136
- const { status, code } = extractErrorMeta(error);
137
- const message = this.#errorMessage(error);
138
- if (wantsJson(ctx)) {
139
- this.#sendJsonError(ctx, status, code, message, error);
140
- }
141
- else {
142
- this.#sendHtmlError(ctx, status, message);
226
+ // Negotiation. DEVIATION (named): ream lists `json` FIRST, so a request
227
+ // with no/`*/*` Accept defaults to JSON (API-first). AdonisJS lists `html`
228
+ // first (full-stack default). Explicit `text/html` / `vnd.api+json` are
229
+ // honoured identically.
230
+ switch (ctx.request.accepts(['json', 'html', 'application/vnd.api+json'])) {
231
+ case 'application/vnd.api+json':
232
+ this.#sendJsonApiError(error, ctx);
233
+ return;
234
+ case 'html':
235
+ await this.#sendHtmlError(error, ctx);
236
+ return;
237
+ default:
238
+ this.#sendJsonError(error, ctx);
143
239
  }
144
240
  }
145
241
  /** Pick the user-facing message — full detail only in debug mode. */
146
- #errorMessage(error) {
147
- if (this.debug && error instanceof Error)
242
+ #errorMessage(error, ctx) {
243
+ if (this.isDebuggingEnabled(ctx) && error instanceof Error)
148
244
  return error.message;
149
245
  if (error instanceof Exception)
150
246
  return error.message;
151
247
  return 'An internal error occurred';
152
248
  }
153
- #sendJsonError(ctx, status, code, message, error) {
154
- const errorPayload = { code, message };
155
- if (this.debug && error instanceof Error && error.stack) {
156
- errorPayload.stack = error.stack;
249
+ #sendJsonError(error, ctx) {
250
+ const { status, code } = extractErrorMeta(error);
251
+ const payload = { code, message: this.#errorMessage(error, ctx) };
252
+ if (error instanceof Exception && error.help)
253
+ payload.help = error.help;
254
+ if (this.isDebuggingEnabled(ctx) && error instanceof Error && error.stack) {
255
+ payload.stack = error.stack;
157
256
  }
158
- ctx.response.status(status).json({ error: errorPayload });
257
+ ctx.response.status(status).json({ error: payload });
159
258
  }
160
- #sendHtmlError(ctx, status, message) {
259
+ #sendJsonApiError(error, ctx) {
260
+ const { status, code } = extractErrorMeta(error);
261
+ ctx.response
262
+ .status(status)
263
+ .type('application/vnd.api+json')
264
+ .json({ errors: [{ title: this.#errorMessage(error, ctx), code, status: String(status) }] });
265
+ }
266
+ async #sendHtmlError(error, ctx) {
267
+ const { status } = extractErrorMeta(error);
268
+ // A registered status page wins (production browser error pages).
269
+ if (this.renderStatusPages) {
270
+ const renderer = this.#expandStatusPages()[status];
271
+ if (renderer) {
272
+ const html = await renderer(error, ctx);
273
+ ctx.response.status(status).type('text/html; charset=utf-8').send(html);
274
+ return;
275
+ }
276
+ }
277
+ const message = this.#errorMessage(error, ctx);
161
278
  ctx.response
162
279
  .status(status)
163
280
  .type('text/html; charset=utf-8')
@@ -166,24 +283,22 @@ export class ExceptionHandler {
166
283
  }
167
284
  /** Log/report an exception. Override for custom monitoring. */
168
285
  async report(error, ctx) {
169
- if (error instanceof Exception) {
170
- if (this.ignoreStatuses.includes(error.status))
171
- return;
172
- if (this.ignoreCodes.includes(error.code))
173
- return;
174
- }
175
- // Self-reported exceptions
176
- if (error instanceof Exception && typeof error.report === 'function') {
286
+ if (!this.shouldReport(error))
287
+ return;
288
+ // Self-reported exceptions handle their own reporting.
289
+ if (isSelfReporting(error)) {
177
290
  await error.report(error, ctx);
178
291
  return;
179
292
  }
180
- // Default: log to stderr
293
+ // Default: log at the status-appropriate level.
294
+ const { status } = extractErrorMeta(error);
295
+ const level = this.getErrorLogLevel(status);
181
296
  const context = this.context(ctx);
182
297
  if (error instanceof Error) {
183
- console.error(`[${new Date().toISOString()}] ${error.message}`, context, error.stack);
298
+ console[level](`[${new Date().toISOString()}] ${error.message}`, context, error.stack);
184
299
  }
185
300
  else {
186
- console.error(`[${new Date().toISOString()}] Unknown error:`, error, context);
301
+ console[level](`[${new Date().toISOString()}] Unknown error:`, error, context);
187
302
  }
188
303
  }
189
304
  /** Provide additional context for error reports. Override for custom data. */
@@ -212,11 +327,33 @@ function extractErrorMeta(error) {
212
327
  }
213
328
  return { status, code };
214
329
  }
215
- /** Content negotiation: JSON unless the client explicitly prefers HTML. */
216
- function wantsJson(ctx) {
217
- return (ctx.request.accepts(['json', 'html']) === 'json' ||
218
- (ctx.request.header('accept')?.includes('application/json') ?? false) ||
219
- !ctx.request.header('accept')?.includes('text/html'));
330
+ /** True when a thrown value self-handles via a `handle()` method (AdonisJS duck-type). */
331
+ function isSelfHandling(error) {
332
+ return (error !== null &&
333
+ typeof error === 'object' &&
334
+ 'handle' in error &&
335
+ typeof error.handle === 'function');
336
+ }
337
+ /** True when a thrown value self-reports via a `report()` method. */
338
+ function isSelfReporting(error) {
339
+ return (error !== null &&
340
+ typeof error === 'object' &&
341
+ 'report' in error &&
342
+ typeof error.report === 'function');
343
+ }
344
+ /** Expand a status-page key into a per-code map: `'500..599'` → {500,…,599}, `'404'` → {404}. */
345
+ function parseStatusRange(range, renderer) {
346
+ const parts = range.split('..');
347
+ const min = Number(parts[0]);
348
+ const max = Number(parts[1]);
349
+ if (parts.length === 1 && !Number.isNaN(min))
350
+ return { [min]: renderer };
351
+ if (Number.isNaN(min) || Number.isNaN(max))
352
+ return {};
353
+ const result = {};
354
+ for (let status = min; status <= max; status += 1)
355
+ result[status] = renderer;
356
+ return result;
220
357
  }
221
358
  function escapeHtml(str) {
222
359
  return str
@@ -1 +1 @@
1
- {"version":3,"file":"Exception.js","sourceRoot":"","sources":["../../src/http/Exception.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Exception.js","sourceRoot":"","sources":["../../src/http/Exception.ts"],"names":[],"mappings":"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"}
@@ -8,13 +8,21 @@
8
8
  */
9
9
  import type { ServiceToken } from '../container/types.js';
10
10
  import type { Emitter } from '../events/Emitter.js';
11
+ import type { CookieSigner } from '../security/CookieSigner.js';
12
+ import type { SignedUrl } from '../security/SignedUrl.js';
11
13
  import type { Session } from '../session/Session.js';
14
+ import { Macroable } from '../utils/Macroable.js';
12
15
  import type { RouteUrlResolver } from './RedirectBuilder.js';
13
16
  import type { RawRequest } from './Request.js';
14
17
  import { Request } from './Request.js';
15
18
  import { Response } from './Response.js';
16
19
  export interface AuthState {
17
- authenticated: boolean;
20
+ /**
21
+ * Whether the request carries an authenticated user (AdonisJS `auth.isAuthenticated`
22
+ * parity, renamed from `authenticated`). Always present — Ream defaults it to
23
+ * `false`; an auth provider (e.g. `@c9up/warden`'s Authenticator) sets it true.
24
+ */
25
+ isAuthenticated: boolean;
18
26
  user?: {
19
27
  id: string;
20
28
  email?: string;
@@ -24,6 +32,21 @@ export interface AuthState {
24
32
  };
25
33
  roles?: string[];
26
34
  permissions?: string[];
35
+ /**
36
+ * Optional AdonisJS `Authenticator` surface — present when an auth provider
37
+ * (Warden) fills the slot with a per-request authenticator, absent for the
38
+ * bare `{ isAuthenticated: false }` default. Methods are OPTIONAL so Ream stays
39
+ * agnostic: a non-Warden host, or the default state, remains a valid AuthState.
40
+ */
41
+ authenticate?(): Promise<void>;
42
+ check?(): Promise<boolean>;
43
+ authenticateUsing?(guards?: string[], options?: {
44
+ loginRoute?: string;
45
+ }): Promise<void>;
46
+ getUserOrFail?(): AuthState['user'];
47
+ use?(name: string): unknown;
48
+ readonly authenticationAttempted?: boolean;
49
+ readonly authenticatedViaGuard?: string;
27
50
  }
28
51
  /**
29
52
  * Per-request authorization entry point — populated by an authorization
@@ -55,8 +78,8 @@ export interface Authorizer {
55
78
  * aligned so a future scoped resolver is a non-breaking swap.
56
79
  */
57
80
  interface ContainerResolver {
58
- /** Resolve/construct a service by token (class, string, or symbol). */
59
- make<T>(token: ServiceToken): T;
81
+ /** Resolve/construct a service by token (class, string, or symbol). Async (AdonisJS parity). */
82
+ make<T>(token: ServiceToken): Promise<T>;
60
83
  }
61
84
  /**
62
85
  * Per-request logger contract (AdonisJS `ctx.logger`). Structural so Ream stays
@@ -71,6 +94,13 @@ export interface ContextLogger {
71
94
  error(message: string, data?: Record<string, unknown>): void;
72
95
  fatal(message: string, data?: Record<string, unknown>): void;
73
96
  }
97
+ /** A logger that can spawn a request-scoped child (e.g. spectrum's `child()`). */
98
+ export interface ChildLoggerSource extends ContextLogger {
99
+ child?(options: {
100
+ correlationId?: string;
101
+ module?: string;
102
+ }): ContextLogger;
103
+ }
74
104
  export interface RouteInfo {
75
105
  pattern: string;
76
106
  name?: string;
@@ -86,7 +116,7 @@ export interface RouteInfo {
86
116
  controller?: object;
87
117
  action?: string;
88
118
  }
89
- export declare class HttpContext {
119
+ export declare class HttpContext extends Macroable {
90
120
  #private;
91
121
  /**
92
122
  * @internal Run `fn` with `ctx` as the ambient HttpContext, so code deep in
@@ -99,6 +129,12 @@ export declare class HttpContext {
99
129
  static get(): HttpContext | undefined;
100
130
  /** The ambient HttpContext, or throw outside a request (AdonisJS `HttpContext.getOrFail()`). */
101
131
  static getOrFail(): HttpContext;
132
+ /**
133
+ * Run `fn` with the ambient HttpContext temporarily cleared (AdonisJS
134
+ * `HttpContext.runOutsideContext`) — e.g. to detach background work so it
135
+ * doesn't inherit and pin the request's context.
136
+ */
137
+ static runOutsideContext<T>(fn: () => T): T;
102
138
  /** Unique request/correlation ID. */
103
139
  readonly id: string;
104
140
  /** Typed HTTP request. */
@@ -147,11 +183,21 @@ export declare class HttpContext {
147
183
  */
148
184
  readonly containerResolver?: ContainerResolver;
149
185
  /**
150
- * Per-request logger (AdonisJS `ctx.logger`). Resolves the container `'logger'`
151
- * (e.g. `@c9up/spectrum`) child-scoped to this request's `id`, or falls back to
152
- * a console logger when none is registered. Built once, on first access.
186
+ * Per-request logger (AdonisJS `ctx.logger`) — the injected app logger (e.g.
187
+ * `@c9up/spectrum`) child-scoped to this request's `id`, or a console logger
188
+ * when none is registered. Built once, on first access.
153
189
  */
154
190
  get logger(): ContextLogger;
191
+ /** @internal Inject the app base logger (resolved async by HttpKernel). */
192
+ setBaseLogger(logger: ChildLoggerSource): void;
193
+ /** @internal Inject the APP_KEY cookie signer into request + response (from HttpKernel). */
194
+ setCookieSigner(signer: CookieSigner): void;
195
+ /** @internal Inject the APP_KEY signed-URL helper into the request (from HttpKernel). */
196
+ setSignedUrl(signedUrl: SignedUrl): void;
197
+ /** Subdomains of the request host (AdonisJS `ctx.subdomains`). */
198
+ get subdomains(): string[];
199
+ /** Stable identifier for the matched route (`METHOD-pattern`) — AdonisJS `ctx.routeKey`. */
200
+ get routeKey(): string;
155
201
  constructor(id: string, rawRequest: RawRequest, params: Record<string, string>, route: RouteInfo, containerResolver?: ContainerResolver);
156
202
  /** @internal Set the route URL resolver (injected by HttpKernel from Router). */
157
203
  setRouteUrlResolver(resolver: RouteUrlResolver): void;