@c9up/ream 0.1.6 → 0.1.8

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 (163) hide show
  1. package/dist/Application.d.ts +9 -1
  2. package/dist/Application.d.ts.map +1 -1
  3. package/dist/Application.js +35 -5
  4. package/dist/Application.js.map +1 -1
  5. package/dist/GracefulShutdown.d.ts.map +1 -1
  6. package/dist/GracefulShutdown.js +13 -7
  7. package/dist/GracefulShutdown.js.map +1 -1
  8. package/dist/HttpKernel.d.ts.map +1 -1
  9. package/dist/HttpKernel.js +43 -14
  10. package/dist/HttpKernel.js.map +1 -1
  11. package/dist/Ignitor.d.ts +10 -10
  12. package/dist/Ignitor.d.ts.map +1 -1
  13. package/dist/Ignitor.js +104 -32
  14. package/dist/Ignitor.js.map +1 -1
  15. package/dist/bodyparser/BodyParserMiddleware.d.ts +3 -0
  16. package/dist/bodyparser/BodyParserMiddleware.d.ts.map +1 -1
  17. package/dist/bodyparser/BodyParserMiddleware.js +32 -16
  18. package/dist/bodyparser/BodyParserMiddleware.js.map +1 -1
  19. package/dist/bodyparser/parseSize.d.ts +2 -1
  20. package/dist/bodyparser/parseSize.d.ts.map +1 -1
  21. package/dist/bodyparser/parseSize.js +2 -1
  22. package/dist/bodyparser/parseSize.js.map +1 -1
  23. package/dist/container/Container.d.ts.map +1 -1
  24. package/dist/container/Container.js +6 -7
  25. package/dist/container/Container.js.map +1 -1
  26. package/dist/decorators/Service.d.ts +4 -6
  27. package/dist/decorators/Service.d.ts.map +1 -1
  28. package/dist/decorators/Service.js +0 -1
  29. package/dist/decorators/Service.js.map +1 -1
  30. package/dist/events/Emitter.d.ts +16 -6
  31. package/dist/events/Emitter.d.ts.map +1 -1
  32. package/dist/events/Emitter.js +32 -25
  33. package/dist/events/Emitter.js.map +1 -1
  34. package/dist/events/EventsProvider.d.ts +1 -0
  35. package/dist/events/EventsProvider.d.ts.map +1 -1
  36. package/dist/events/EventsProvider.js +6 -4
  37. package/dist/events/EventsProvider.js.map +1 -1
  38. package/dist/graphql/GraphQLEngine.d.ts +16 -0
  39. package/dist/graphql/GraphQLEngine.d.ts.map +1 -1
  40. package/dist/graphql/GraphQLEngine.js +122 -4
  41. package/dist/graphql/GraphQLEngine.js.map +1 -1
  42. package/dist/graphql/GraphQLProvider.d.ts.map +1 -1
  43. package/dist/graphql/GraphQLProvider.js +13 -2
  44. package/dist/graphql/GraphQLProvider.js.map +1 -1
  45. package/dist/http/HttpContext.d.ts +27 -1
  46. package/dist/http/HttpContext.d.ts.map +1 -1
  47. package/dist/http/HttpContext.js +20 -1
  48. package/dist/http/HttpContext.js.map +1 -1
  49. package/dist/http/RedirectBuilder.d.ts +5 -1
  50. package/dist/http/RedirectBuilder.d.ts.map +1 -1
  51. package/dist/http/RedirectBuilder.js +26 -3
  52. package/dist/http/RedirectBuilder.js.map +1 -1
  53. package/dist/http/Request.d.ts +13 -0
  54. package/dist/http/Request.d.ts.map +1 -1
  55. package/dist/http/Request.js +18 -0
  56. package/dist/http/Request.js.map +1 -1
  57. package/dist/index.d.ts +2 -2
  58. package/dist/index.d.ts.map +1 -1
  59. package/dist/index.js +1 -1
  60. package/dist/middleware/Pipeline.d.ts +13 -0
  61. package/dist/middleware/Pipeline.d.ts.map +1 -1
  62. package/dist/middleware/Pipeline.js +43 -7
  63. package/dist/middleware/Pipeline.js.map +1 -1
  64. package/dist/router/Router.d.ts +21 -2
  65. package/dist/router/Router.d.ts.map +1 -1
  66. package/dist/router/Router.js +53 -8
  67. package/dist/router/Router.js.map +1 -1
  68. package/dist/rpc/RpcProvider.d.ts.map +1 -1
  69. package/dist/rpc/RpcProvider.js +11 -2
  70. package/dist/rpc/RpcProvider.js.map +1 -1
  71. package/dist/rpc/RpcRouter.d.ts +11 -3
  72. package/dist/rpc/RpcRouter.d.ts.map +1 -1
  73. package/dist/rpc/RpcRouter.js +92 -8
  74. package/dist/rpc/RpcRouter.js.map +1 -1
  75. package/dist/scheduler/ScheduleProvider.d.ts.map +1 -1
  76. package/dist/scheduler/ScheduleProvider.js +10 -0
  77. package/dist/scheduler/ScheduleProvider.js.map +1 -1
  78. package/dist/scheduler/locks/MemoryLockBackend.d.ts +0 -1
  79. package/dist/scheduler/locks/MemoryLockBackend.d.ts.map +1 -1
  80. package/dist/scheduler/locks/MemoryLockBackend.js +0 -1
  81. package/dist/scheduler/locks/MemoryLockBackend.js.map +1 -1
  82. package/dist/services/app.d.ts +6 -0
  83. package/dist/services/app.d.ts.map +1 -1
  84. package/dist/services/app.js +9 -0
  85. package/dist/services/app.js.map +1 -1
  86. package/dist/services/router.d.ts +5 -0
  87. package/dist/services/router.d.ts.map +1 -1
  88. package/dist/services/router.js +8 -0
  89. package/dist/services/router.js.map +1 -1
  90. package/dist/services/server.d.ts +5 -0
  91. package/dist/services/server.d.ts.map +1 -1
  92. package/dist/services/server.js +8 -0
  93. package/dist/services/server.js.map +1 -1
  94. package/dist/session/SessionMiddleware.d.ts.map +1 -1
  95. package/dist/session/SessionMiddleware.js +4 -0
  96. package/dist/session/SessionMiddleware.js.map +1 -1
  97. package/dist/session/drivers/MemoryDriver.d.ts +1 -1
  98. package/dist/session/drivers/MemoryDriver.d.ts.map +1 -1
  99. package/dist/session/drivers/MemoryDriver.js +14 -6
  100. package/dist/session/drivers/MemoryDriver.js.map +1 -1
  101. package/dist/testing/TestClient.d.ts +11 -5
  102. package/dist/testing/TestClient.d.ts.map +1 -1
  103. package/dist/testing/TestClient.js +9 -4
  104. package/dist/testing/TestClient.js.map +1 -1
  105. package/events.darwin-arm64.node +0 -0
  106. package/events.darwin-x64.node +0 -0
  107. package/events.linux-arm64-gnu.node +0 -0
  108. package/events.linux-x64-gnu.node +0 -0
  109. package/events.win32-x64-msvc.node +0 -0
  110. package/index.darwin-arm64.node +0 -0
  111. package/index.darwin-x64.node +0 -0
  112. package/index.linux-arm64-gnu.node +0 -0
  113. package/index.linux-x64-gnu.node +0 -0
  114. package/index.win32-x64-msvc.node +0 -0
  115. package/package.json +29 -1
  116. package/scheduler.darwin-arm64.node +0 -0
  117. package/scheduler.darwin-x64.node +0 -0
  118. package/scheduler.linux-arm64-gnu.node +0 -0
  119. package/scheduler.linux-x64-gnu.node +0 -0
  120. package/scheduler.win32-x64-msvc.node +0 -0
  121. package/src/Application.ts +36 -5
  122. package/src/GracefulShutdown.ts +15 -7
  123. package/src/HttpKernel.ts +52 -17
  124. package/src/Ignitor.ts +106 -34
  125. package/src/bodyparser/BodyParserMiddleware.ts +43 -16
  126. package/src/bodyparser/parseSize.ts +2 -1
  127. package/src/container/Container.ts +6 -9
  128. package/src/decorators/Service.ts +4 -6
  129. package/src/events/Emitter.ts +36 -28
  130. package/src/events/EventsProvider.ts +6 -4
  131. package/src/graphql/GraphQLEngine.ts +139 -3
  132. package/src/graphql/GraphQLProvider.ts +17 -2
  133. package/src/http/HttpContext.ts +38 -1
  134. package/src/http/RedirectBuilder.ts +23 -3
  135. package/src/http/Request.ts +20 -0
  136. package/src/index.ts +2 -2
  137. package/src/middleware/Pipeline.ts +61 -8
  138. package/src/router/Router.ts +53 -8
  139. package/src/rpc/RpcProvider.ts +14 -2
  140. package/src/rpc/RpcRouter.ts +115 -11
  141. package/src/scheduler/ScheduleProvider.ts +10 -0
  142. package/src/scheduler/locks/MemoryLockBackend.ts +0 -2
  143. package/src/services/app.ts +9 -0
  144. package/src/services/router.ts +8 -0
  145. package/src/services/server.ts +8 -0
  146. package/src/session/SessionMiddleware.ts +6 -0
  147. package/src/session/drivers/MemoryDriver.ts +14 -6
  148. package/src/testing/TestClient.ts +18 -7
  149. package/dist/server/HyperServer.d.ts +0 -64
  150. package/dist/server/HyperServer.d.ts.map +0 -1
  151. package/dist/server/HyperServer.js +0 -54
  152. package/dist/server/HyperServer.js.map +0 -1
  153. package/dist/storage/S3Driver.d.ts +0 -27
  154. package/dist/storage/S3Driver.d.ts.map +0 -1
  155. package/dist/storage/S3Driver.js +0 -135
  156. package/dist/storage/S3Driver.js.map +0 -1
  157. package/dist/storage/StorageManager.d.ts +0 -31
  158. package/dist/storage/StorageManager.d.ts.map +0 -1
  159. package/dist/storage/StorageManager.js +0 -120
  160. package/dist/storage/StorageManager.js.map +0 -1
  161. package/src/server/HyperServer.ts +0 -121
  162. package/src/storage/S3Driver.ts +0 -171
  163. package/src/storage/StorageManager.ts +0 -142
@@ -1 +1 @@
1
- {"version":3,"file":"EventsProvider.js","sourceRoot":"","sources":["../../src/events/EventsProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAsB/C,MAAM,CAAC,OAAO,OAAO,cAAc;IACX;IAAtB,YAAsB,GAAqB;QAArB,QAAG,GAAH,GAAG,CAAkB;IAAG,CAAC;IAE/C,QAAQ;QACN,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,QAAQ,EAAE,CAAC,CAAA;QAC5D,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAW,QAAQ,CAAC,CAAC,CAAA;QAEzF,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,EAAE;YACzC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAW,QAAQ,CAAC,CAAA;YAC1D,yDAAyD;YACzD,8DAA8D;YAC9D,2DAA2D;YAC3D,gCAAgC;YAChC,MAAM,QAAQ,GACZ,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,KAAK,UAAU;gBAC3C,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE;gBAC5D,CAAC,CAAC,SAAS,CAAA;YACf,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAA;QACnC,CAAC,CAAC,CAAA;QACF,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAU,OAAO,CAAC,CAAC,CAAA;QAC3F,yEAAyE;QACzE,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAU,OAAO,CAAC,CAAC,CAAA;IAC5F,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAU,OAAO,CAAC,CAAA;QAC5D,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,CAAA;QAC7B,UAAU,CAAC,OAAO,CAAC,CAAA;IACrB,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,SAAS,CAAC,YAAY,EAAE,CAAA;IAC1B,CAAC;CACF"}
1
+ {"version":3,"file":"EventsProvider.js","sourceRoot":"","sources":["../../src/events/EventsProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAsB/C,MAAM,CAAC,OAAO,OAAO,cAAc;IAGX;IAFtB,QAAQ,CAAqB;IAE7B,YAAsB,GAAqB;QAArB,QAAG,GAAH,GAAG,CAAkB;IAAG,CAAC;IAE/C,QAAQ;QACN,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,QAAQ,EAAE,CAAC,CAAA;QAC5D,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAW,QAAQ,CAAC,CAAC,CAAA;QAEzF,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,EAAE;YACzC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAW,QAAQ,CAAC,CAAA;YAC1D,yDAAyD;YACzD,8DAA8D;YAC9D,2DAA2D;YAC3D,gCAAgC;YAChC,MAAM,QAAQ,GACZ,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,KAAK,UAAU;gBAC3C,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE;gBAC5D,CAAC,CAAC,SAAS,CAAA;YACf,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAA;QACnC,CAAC,CAAC,CAAA;QACF,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAU,OAAO,CAAC,CAAC,CAAA;QAC3F,yEAAyE;QACzE,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAU,OAAO,CAAC,CAAC,CAAA;IAC5F,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAU,OAAO,CAAC,CAAA;QAC5D,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACnC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IAC3B,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,IAAI,IAAI,CAAC,QAAQ;YAAE,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IAC1D,CAAC;CACF"}
@@ -28,6 +28,22 @@ export interface GraphQLConfig {
28
28
  path?: string;
29
29
  /** Enable playground/introspection in dev (default: true when NODE_ENV !== 'production'). */
30
30
  playground?: boolean;
31
+ /**
32
+ * Reject a query string longer than this many characters BEFORE parsing —
33
+ * caps the work the parser does on a hostile payload (default: 100_000).
34
+ */
35
+ maxQueryBytes?: number;
36
+ /**
37
+ * Reject a query whose selection set nests deeper than this — bounds
38
+ * resolver recursion / amplification (default: 12).
39
+ */
40
+ maxDepth?: number;
41
+ /**
42
+ * Reject a query selecting more than this many fields in total (aliases
43
+ * count) — bounds fan-out where a client repeats an expensive resolver
44
+ * (default: 1000).
45
+ */
46
+ maxComplexity?: number;
31
47
  }
32
48
  export interface ResolverOptions {
33
49
  guard?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"GraphQLEngine.d.ts","sourceRoot":"","sources":["../../src/graphql/GraphQLEngine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AAoDzD,MAAM,WAAW,aAAa;IAC5B,oCAAoC;IACpC,UAAU,EAAE,MAAM,CAAA;IAClB,yCAAyC;IACzC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,6FAA6F;IAC7F,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;IAChB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;CACvB;AAgBD,+DAA+D;AAC/D,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC7B,SAAS,EAAE,cAAc,EAAE,CAAA;CAC5B;AAED,qBAAa,aAAa;;IAIxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;gBAGT,MAAM,EAAE,aAAa;IASjC,oDAAoD;IACpD,YAAY,CAAC,SAAS,EAAE;QAAE,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,CAAA;KAAE,GAAG,IAAI;IAIpF,4CAA4C;IAC5C,QAAQ,CACN,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,KAAK,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,EACzF,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,eAAe,GACxB,IAAI;IAWP,qCAAqC;IAC/B,MAAM,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAoN7C,mDAAmD;IACnD,eAAe,IAAI,MAAM;CAG1B;AA8BD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,OAAO,CAWrF"}
1
+ {"version":3,"file":"GraphQLEngine.d.ts","sourceRoot":"","sources":["../../src/graphql/GraphQLEngine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AA0HzD,MAAM,WAAW,aAAa;IAC5B,oCAAoC;IACpC,UAAU,EAAE,MAAM,CAAA;IAClB,yCAAyC;IACzC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,6FAA6F;IAC7F,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;IAChB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;CACvB;AAgBD,+DAA+D;AAC/D,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC7B,SAAS,EAAE,cAAc,EAAE,CAAA;CAC5B;AAED,qBAAa,aAAa;;IAIxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;gBAqBT,MAAM,EAAE,aAAa;IAYjC,oDAAoD;IACpD,YAAY,CAAC,SAAS,EAAE;QAAE,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,CAAA;KAAE,GAAG,IAAI;IAIpF,4CAA4C;IAC5C,QAAQ,CACN,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,KAAK,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,EACzF,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,eAAe,GACxB,IAAI;IAWP,qCAAqC;IAC/B,MAAM,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAiP7C,mDAAmD;IACnD,eAAe,IAAI,MAAM;CAG1B;AA8BD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,OAAO,CAWrF"}
@@ -22,6 +22,47 @@
22
22
  */
23
23
  import * as fs from 'node:fs';
24
24
  import { loadNapi } from '../helpers/napi-loader.js';
25
+ /**
26
+ * Coerce an argument value to its schema-declared scalar type. GraphQL input
27
+ * coercion: a string literal `"5"` for an `Int` arg becomes the number `5`, a
28
+ * number for an `ID` becomes its string form, etc. Arrays coerce element-wise.
29
+ * Unknown / custom / enum types pass through untouched.
30
+ */
31
+ function coerceScalar(value, type) {
32
+ if (value === null || value === undefined)
33
+ return value;
34
+ if (Array.isArray(value))
35
+ return value.map((v) => coerceScalar(v, type));
36
+ switch (type) {
37
+ case 'Int':
38
+ if (typeof value === 'number')
39
+ return value;
40
+ if (typeof value === 'string' && value.trim() !== '' && Number.isInteger(Number(value))) {
41
+ return Number(value);
42
+ }
43
+ return value;
44
+ case 'Float':
45
+ if (typeof value === 'number')
46
+ return value;
47
+ if (typeof value === 'string' && value.trim() !== '' && !Number.isNaN(Number(value))) {
48
+ return Number(value);
49
+ }
50
+ return value;
51
+ case 'Boolean':
52
+ if (typeof value === 'boolean')
53
+ return value;
54
+ if (value === 'true')
55
+ return true;
56
+ if (value === 'false')
57
+ return false;
58
+ return value;
59
+ case 'ID':
60
+ return typeof value === 'number' ? String(value) : value;
61
+ default:
62
+ // String, custom scalars, enums, input objects — left as the client sent.
63
+ return value;
64
+ }
65
+ }
25
66
  let graphqlNativeCache;
26
67
  /**
27
68
  * Lazily load the Rust GraphQL parser from the `index` NAPI binary. There is no
@@ -43,6 +84,35 @@ const OPERATION_TYPE = {
43
84
  mutation: 'Mutation',
44
85
  subscription: 'Subscription',
45
86
  };
87
+ /**
88
+ * Bound a parsed selection tree's depth and total field count. Iterative (explicit
89
+ * stack) so a pathological deeply-nested query can't overflow the JS call stack
90
+ * during the check itself, and short-circuits as soon as a limit is crossed.
91
+ * Returns an error message, or `null` when the query is within limits.
92
+ */
93
+ function checkSelectionLimits(fields, maxDepth, maxComplexity) {
94
+ let count = 0;
95
+ const stack = fields.map((field) => ({
96
+ field,
97
+ depth: 1,
98
+ }));
99
+ while (stack.length > 0) {
100
+ const top = stack.pop();
101
+ if (!top)
102
+ break;
103
+ if (top.depth > maxDepth) {
104
+ return `Query is too deep (max depth ${maxDepth})`;
105
+ }
106
+ count += 1;
107
+ if (count > maxComplexity) {
108
+ return `Query is too complex (max ${maxComplexity} fields)`;
109
+ }
110
+ for (const child of top.field.selection) {
111
+ stack.push({ field: child, depth: top.depth + 1 });
112
+ }
113
+ }
114
+ return null;
115
+ }
46
116
  /** Map a Rust `ParsedField` (sub_fields) onto the engine's `SelectionField` (selection). */
47
117
  function mapRustField(f) {
48
118
  return {
@@ -58,6 +128,24 @@ export class GraphQLEngine {
58
128
  #container;
59
129
  path;
60
130
  #playground;
131
+ #maxQueryBytes;
132
+ #maxDepth;
133
+ #maxComplexity;
134
+ /** Lazily-parsed `Type.field → argName → scalarType` map for input coercion. */
135
+ #argTypes;
136
+ /** Parse (once) the schema's argument types from the SDL for coercion. */
137
+ #schemaArgTypes() {
138
+ if (this.#argTypes === undefined) {
139
+ try {
140
+ this.#argTypes = JSON.parse(graphqlNative().graphqlSchemaArgTypes(this.#schemaSource));
141
+ }
142
+ catch {
143
+ // Native unavailable or schema unparseable → coercion becomes a no-op.
144
+ this.#argTypes = {};
145
+ }
146
+ }
147
+ return this.#argTypes ?? {};
148
+ }
61
149
  constructor(config) {
62
150
  if (!fs.existsSync(config.schemaPath)) {
63
151
  throw new Error(`GraphQL schema not found: ${config.schemaPath}`);
@@ -65,6 +153,9 @@ export class GraphQLEngine {
65
153
  this.#schemaSource = fs.readFileSync(config.schemaPath, 'utf8');
66
154
  this.path = config.path ?? '/graphql';
67
155
  this.#playground = config.playground ?? process.env.NODE_ENV !== 'production';
156
+ this.#maxQueryBytes = config.maxQueryBytes ?? 100_000;
157
+ this.#maxDepth = config.maxDepth ?? 12;
158
+ this.#maxComplexity = config.maxComplexity ?? 1000;
68
159
  }
69
160
  /** Set IoC container for resolver instantiation. */
70
161
  useContainer(container) {
@@ -113,11 +204,25 @@ export class GraphQLEngine {
113
204
  }
114
205
  /** Execute a GraphQL query against registered resolvers. */
115
206
  async #execute(request, ctx) {
207
+ // DoS guard 1 — cap the raw query size BEFORE handing it to the parser, so a
208
+ // hostile multi-MB payload can't tie up the native parser.
209
+ if (request.query.length > this.#maxQueryBytes) {
210
+ return {
211
+ errors: [{ message: `Query exceeds the maximum size of ${this.#maxQueryBytes} bytes` }],
212
+ };
213
+ }
116
214
  // Parse the query to extract operation type and fields
117
215
  const parsed = this.#parseQuery(request.query);
118
216
  if (parsed.errors) {
119
217
  return { errors: parsed.errors };
120
218
  }
219
+ // DoS guard 2 — bound the selection tree's depth and total field count
220
+ // (aliases included) before resolving anything. Iterative walk so the check
221
+ // itself can't blow the stack on a deeply nested query.
222
+ const limitError = checkSelectionLimits(parsed.fields, this.#maxDepth, this.#maxComplexity);
223
+ if (limitError) {
224
+ return { errors: [{ message: limitError }] };
225
+ }
121
226
  const data = {};
122
227
  const errors = [];
123
228
  for (const field of parsed.fields) {
@@ -163,7 +268,7 @@ export class GraphQLEngine {
163
268
  },
164
269
  };
165
270
  }
166
- const args = this.#buildArgs(field, request.variables);
271
+ const args = this.#buildArgs(field, request.variables, typeName);
167
272
  const result = await handler.call(instance, null, args, ctx);
168
273
  // Prune to the client's selection set: a resolver returning a rich
169
274
  // object (ORM entity, etc.) must not leak fields the client did not
@@ -179,7 +284,7 @@ export class GraphQLEngine {
179
284
  * Build the resolver argument bag: `$variable` references resolve against
180
285
  * `request.variables`, then any unreferenced variables are merged in.
181
286
  */
182
- #buildArgs(field, variables) {
287
+ #buildArgs(field, variables, typeName) {
183
288
  const args = {};
184
289
  for (const [k, v] of Object.entries(field.args)) {
185
290
  if (typeof v === 'string' && v.startsWith('$') && variables) {
@@ -195,6 +300,16 @@ export class GraphQLEngine {
195
300
  args[k] = v;
196
301
  }
197
302
  }
303
+ // Coerce each argument to its schema-declared scalar type (Int/Float/Boolean/
304
+ // ID). A literal `task(id: "5")` or a string variable thus reaches the
305
+ // resolver as the right runtime type instead of being silently mistyped.
306
+ const argTypes = this.#schemaArgTypes()[`${typeName}.${field.name}`];
307
+ if (argTypes) {
308
+ for (const [k, declaredType] of Object.entries(argTypes)) {
309
+ if (k in args)
310
+ args[k] = coerceScalar(args[k], declaredType);
311
+ }
312
+ }
198
313
  return args;
199
314
  }
200
315
  /** Enforce guard/role/permission on a resolver. */
@@ -206,14 +321,17 @@ export class GraphQLEngine {
206
321
  if (needsAuth && !ctx.auth?.authenticated) {
207
322
  return 'Unauthorized';
208
323
  }
324
+ // Read roles/permissions from the top level OR nested under `user` — the
325
+ // auth provider (e.g. warden) sets `ctx.auth.user.roles`, not the top level.
326
+ // Mirrors the HTTP guard middleware fix.
209
327
  if (roles.length > 0) {
210
- const userRoles = ctx.auth?.roles ?? [];
328
+ const userRoles = ctx.auth?.roles ?? ctx.auth?.user?.roles ?? [];
211
329
  if (!roles.some((r) => userRoles.includes(r))) {
212
330
  return 'Insufficient role';
213
331
  }
214
332
  }
215
333
  if (permissions.length > 0) {
216
- const userPerms = ctx.auth?.permissions ?? [];
334
+ const userPerms = ctx.auth?.permissions ?? ctx.auth?.user?.permissions ?? [];
217
335
  if (!permissions.every((p) => userPerms.includes(p))) {
218
336
  return 'Insufficient permissions';
219
337
  }
@@ -1 +1 @@
1
- {"version":3,"file":"GraphQLEngine.js","sourceRoot":"","sources":["../../src/graphql/GraphQLEngine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAA;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAA;AAoBpD,IAAI,kBAA6C,CAAA;AACjD;;;;GAIG;AACH,SAAS,aAAa;IACpB,IAAI,kBAAkB,KAAK,SAAS,EAAE,CAAC;QACrC,kBAAkB,GAAG,QAAQ,CAAgB;YAC3C,UAAU,EAAE,OAAO;YACnB,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG;YAC9B,eAAe,EAAE,SAAS;SAC3B,CAAC,CAAA;IACJ,CAAC;IACD,OAAO,kBAAkB,CAAA;AAC3B,CAAC;AAED,MAAM,cAAc,GAA2B;IAC7C,KAAK,EAAE,OAAO;IACd,QAAQ,EAAE,UAAU;IACpB,YAAY,EAAE,cAAc;CAC7B,CAAA;AAED,4FAA4F;AAC5F,SAAS,YAAY,CAAC,CAAkB;IACtC,OAAO;QACL,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,SAAS;QAC3B,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,SAAS,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC;KAC1C,CAAA;AACH,CAAC;AAyCD,MAAM,OAAO,aAAa;IACxB,aAAa,CAAQ;IACrB,UAAU,GAA+B,IAAI,GAAG,EAAE,CAAA;IAClD,UAAU,CAAwD;IACzD,IAAI,CAAQ;IACrB,WAAW,CAAS;IAEpB,YAAY,MAAqB;QAC/B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CAAC,6BAA6B,MAAM,CAAC,UAAU,EAAE,CAAC,CAAA;QACnE,CAAC;QACD,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAA;QAC/D,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,UAAU,CAAA;QACrC,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,CAAA;IAC/E,CAAC;IAED,oDAAoD;IACpD,YAAY,CAAC,SAAgE;QAC3E,IAAI,CAAC,UAAU,GAAG,SAAS,CAAA;IAC7B,CAAC;IAED,4CAA4C;IAC5C,QAAQ,CACN,QAAgB,EAChB,SAAiB,EACjB,YAAyF,EACzF,UAAkB,EAClB,OAAyB;QAEzB,MAAM,GAAG,GAAG,GAAG,QAAQ,IAAI,SAAS,EAAE,CAAA;QACtC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE;YACvB,QAAQ;YACR,SAAS;YACT,YAAY;YACZ,UAAU;YACV,OAAO,EAAE,OAAO,IAAI,EAAE;SACvB,CAAC,CAAA;IACJ,CAAC;IAED,qCAAqC;IACrC,KAAK,CAAC,MAAM,CAAC,GAAgB;QAC3B,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,CAAA;QAEnC,aAAa;QACb,IAAI,MAAM,KAAK,KAAK,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACzC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,cAAc,EAAE,WAAW,CAAC,CAAA;YAChD,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAA;YACvD,OAAM;QACR,CAAC;QAED,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YACtB,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,oBAAoB,EAAE,CAAC,EAAE,CAAC,CAAA;YAC9E,OAAM;QACR,CAAC;QAED,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAA;QAClC,MAAM,IAAI,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAA;QACtC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,0BAA0B,EAAE,CAAC,EAAE,CAAC,CAAA;YACpF,OAAM;QACR,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;YAC7C,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACvC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,GACX,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,IAAI,GAAG,YAAY,KAAK;gBAC3D,CAAC,CAAC,GAAG,CAAC,OAAO;gBACb,CAAC,CAAC,uBAAuB,CAAA;YAC7B,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAA;QAC1D,CAAC;IACH,CAAC;IAED,4DAA4D;IAC5D,KAAK,CAAC,QAAQ,CACZ,OAAuB,EACvB,GAAgB;QAKhB,uDAAuD;QACvD,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QAC9C,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClB,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAA;QAClC,CAAC;QAED,MAAM,IAAI,GAA4B,EAAE,CAAA;QACxC,MAAM,MAAM,GAAgD,EAAE,CAAA;QAE9D,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,CAAC,CAAA;YAC9E,IAAI,OAAO,CAAC,EAAE,EAAE,CAAC;gBACf,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,KAAK,CAAA;YACjD,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;YAC5B,CAAC;QACH,CAAC;QAED,OAAO;YACL,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;YACrD,MAAM,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;SAC/C,CAAA;IACH,CAAC;IAED,qEAAqE;IACrE,KAAK,CAAC,aAAa,CACjB,KAAqB,EACrB,QAAgB,EAChB,OAAuB,EACvB,GAAgB;QAIhB,MAAM,GAAG,GAAG,GAAG,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAA;QACvC,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACtC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE,EAAE,OAAO,EAAE,mBAAmB,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;aACjE,CAAA;QACH,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;QAC1D,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,CAAA;QAC1E,CAAC;QAED,IAAI,CAAC;YACH,mDAAmD;YACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU;gBAC9B,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC;gBAC1C,CAAC,CAAC,IAAI,KAAK,CAAC,YAAY,EAAE,CAAA;YAE5B,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;YAC1C,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE,CAAC;gBAClC,OAAO;oBACL,EAAE,EAAE,KAAK;oBACT,KAAK,EAAE;wBACL,OAAO,EAAE,mBAAmB,KAAK,CAAC,UAAU,YAAY;wBACxD,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;qBACnB;iBACF,CAAA;YACH,CAAC;YAED,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC,CAAA;YACtD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,CAAA;YAC5D,mEAAmE;YACnE,oEAAoE;YACpE,mEAAmE;YACnE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,gBAAgB,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,EAAE,CAAA;QACvE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAA;YACjE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,CAAA;QACnE,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,UAAU,CACR,KAAqB,EACrB,SAA8C;QAE9C,MAAM,IAAI,GAA4B,EAAE,CAAA;QACxC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YAChD,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,SAAS,EAAE,CAAC;gBAC5D,IAAI,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;YACjC,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;YACb,CAAC;QACH,CAAC;QACD,IAAI,SAAS,EAAE,CAAC;YACd,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC/C,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;oBAAE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;YAC/B,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IAED,mDAAmD;IACnD,cAAc,CAAC,OAAwB,EAAE,GAAgB;QACvD,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;QACrF,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;QACjF,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,EAAE,CAAA;QAE7C,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,CAAA;QACjF,IAAI,SAAS,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,aAAa,EAAE,CAAC;YAC1C,OAAO,cAAc,CAAA;QACvB,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE,CAAA;YACvC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC9C,OAAO,mBAAmB,CAAA;YAC5B,CAAC;QACH,CAAC;QAED,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI,EAAE,WAAW,IAAI,EAAE,CAAA;YAC7C,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACrD,OAAO,0BAA0B,CAAA;YACnC,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAA;IACb,CAAC;IAED;;;OAGG;IACH,WAAW,CAAC,KAAa;QAKvB,sEAAsE;QACtE,4EAA4E;QAC5E,wEAAwE;QACxE,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAoB,CAAA;QAC9E,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,OAAO,CAAA;QAC9D,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,CAAA;QACrF,CAAC;QACD,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAA;IAC3D,CAAC;IAED,iBAAiB;QACf,OAAO;;;;;;;;;;;;;;+CAcoC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;;;;QAIhE,CAAA;IACN,CAAC;IAED,mDAAmD;IACnD,eAAe;QACb,OAAO,IAAI,CAAC,aAAa,CAAA;IAC3B,CAAC;CACF;AAED,8EAA8E;AAC9E,SAAS,gBAAgB,CAAC,IAAa;IACrC,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAA;IACzE,oFAAoF;IACpF,MAAM,CAAC,GAAG,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAA;IAClD,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAA;IAEtC,IAAI,SAA8C,CAAA;IAClD,IACE,WAAW,IAAI,IAAI;QACnB,IAAI,CAAC,SAAS,KAAK,IAAI;QACvB,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ;QAClC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAC9B,CAAC;QACD,gIAAgI;QAChI,SAAS,GAAG,IAAI,CAAC,SAA2C,CAAA;IAC9D,CAAC;IAED,MAAM,SAAS,GAAG,eAAe,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAA;IAC1E,MAAM,aAAa,GAAG,OAAO,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAA;IAE3E,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,SAAS,EAAE,aAAa,EAAE,CAAA;AAC/C,CAAC;AAED,SAAS,QAAQ,CAAC,CAAU;IAC1B,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;AACjE,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAc,EAAE,SAA2B;IAC1E,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAA;IACxC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAA;IACjF,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAA;IAClC,MAAM,GAAG,GAA4B,EAAE,CAAA;IACvC,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;QAC9B,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,EAAE,CAAC;YACxB,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,CAAA;QACvF,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC"}
1
+ {"version":3,"file":"GraphQLEngine.js","sourceRoot":"","sources":["../../src/graphql/GraphQLEngine.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"GraphQLProvider.d.ts","sourceRoot":"","sources":["../../src/graphql/GraphQLProvider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAEzC,OAAO,EAAsB,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAEtE,MAAM,WAAW,sBAAsB;IACrC,6DAA6D;IAC7D,MAAM,CAAC,EAAE,aAAa,CAAA;CACvB;AAED,qBAAa,eAAgB,SAAQ,QAAQ;;gBAG/B,GAAG,EAAE,UAAU,EAAE,OAAO,GAAE,sBAA2B;IAKjE,qEAAqE;IACrE,IAAI,MAAM,IAAI,aAAa,GAAG,SAAS,CAEtC;IAEQ,QAAQ,IAAI,IAAI;IASV,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CASrC"}
1
+ {"version":3,"file":"GraphQLProvider.d.ts","sourceRoot":"","sources":["../../src/graphql/GraphQLProvider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAEzC,OAAO,EAAsB,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAEtE,MAAM,WAAW,sBAAsB;IACrC,6DAA6D;IAC7D,MAAM,CAAC,EAAE,aAAa,CAAA;CACvB;AAED,qBAAa,eAAgB,SAAQ,QAAQ;;gBAG/B,GAAG,EAAE,UAAU,EAAE,OAAO,GAAE,sBAA2B;IAKjE,qEAAqE;IACrE,IAAI,MAAM,IAAI,aAAa,GAAG,SAAS,CAEtC;IAEQ,QAAQ,IAAI,IAAI;IAuBV,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CASrC"}
@@ -14,6 +14,7 @@
14
14
  *
15
15
  * @implements Story 24.5
16
16
  */
17
+ import { ReamError } from '../errors/ReamError.js';
17
18
  import { Provider } from '../Provider.js';
18
19
  import { GraphQLEngine } from './GraphQLEngine.js';
19
20
  export class GraphQLProvider extends Provider {
@@ -31,9 +32,19 @@ export class GraphQLProvider extends Provider {
31
32
  const engine = this.#engine ?? (config?.schemaPath ? new GraphQLEngine(config) : undefined);
32
33
  if (!engine)
33
34
  return; // GraphQL not configured — opt-out.
34
- engine.useContainer(this.app.container);
35
+ const container = this.app.container;
36
+ if (container.has('graphql')) {
37
+ if (container.resolve('graphql') === engine) {
38
+ this.#engine = engine;
39
+ return; // re-register is idempotent
40
+ }
41
+ throw new ReamError('GRAPHQL_PROVIDER_ALREADY_REGISTERED', "Container token 'graphql' is already bound to a different instance", {
42
+ hint: 'Only one GraphQLProvider can own the graphql binding. Remove the duplicate provider from your reamrc.ts.',
43
+ });
44
+ }
45
+ engine.useContainer(container);
35
46
  this.#engine = engine;
36
- this.app.container.singleton('graphql', () => engine);
47
+ container.singleton('graphql', () => engine);
37
48
  }
38
49
  async boot() {
39
50
  const engine = this.#engine;
@@ -1 +1 @@
1
- {"version":3,"file":"GraphQLProvider.js","sourceRoot":"","sources":["../../src/graphql/GraphQLProvider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,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,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QACvC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAA;QACrB,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,CAAA;IACvD,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"}
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"}
@@ -23,6 +23,22 @@ export interface AuthState {
23
23
  roles?: string[];
24
24
  permissions?: string[];
25
25
  }
26
+ /**
27
+ * Per-request authorization entry point — populated by an authorization
28
+ * middleware (e.g. `@c9up/warden`'s Bouncer initializer). A structural
29
+ * contract only: Ream stays agnostic of any concrete authorization package,
30
+ * exactly as `auth` is a slot that Warden fills. A handler authorizes via
31
+ * `await ctx.bouncer?.authorize('post.edit', post)` (throws on denial, mapped
32
+ * to 403 by the ExceptionHandler) or branches on `ctx.bouncer?.allows(...)`.
33
+ */
34
+ export interface Authorizer {
35
+ /** True iff the action is authorized. Never throws on denial. */
36
+ allows(ability: string, ...args: unknown[]): Promise<boolean>;
37
+ /** Boolean negation of {@link allows}. Never throws on denial. */
38
+ denies(ability: string, ...args: unknown[]): Promise<boolean>;
39
+ /** Resolves on allow; throws an authorization failure (status 403) on deny. */
40
+ authorize(ability: string, ...args: unknown[]): Promise<void>;
41
+ }
26
42
  export interface RouteInfo {
27
43
  pattern: string;
28
44
  name?: string;
@@ -52,7 +68,11 @@ export declare class HttpContext {
52
68
  readonly route: RouteInfo;
53
69
  /** Authentication state — populated by auth middleware. */
54
70
  auth: AuthState;
55
- /** Detected locale. */
71
+ /**
72
+ * Request locale — the primary subtag of the first `Accept-Language` entry
73
+ * (e.g. `fr-CH,fr;q=0.9` → `fr`), defaulting to `en`. Middleware (or i18n)
74
+ * may override it; it's a plain mutable field.
75
+ */
56
76
  locale: string;
57
77
  /** Per-request key-value store (for middleware to pass data downstream). */
58
78
  readonly store: Map<string, unknown>;
@@ -62,6 +82,12 @@ export declare class HttpContext {
62
82
  * `ctx.events?.emit('user:updated', user)`. Undefined when events aren't wired.
63
83
  */
64
84
  events?: Emitter;
85
+ /**
86
+ * Per-request authorization entry point, when an authorization middleware
87
+ * is wired (e.g. `@c9up/warden`'s Bouncer initializer). Undefined when no
88
+ * such middleware ran. See {@link Authorizer}.
89
+ */
90
+ bouncer?: Authorizer;
65
91
  constructor(id: string, rawRequest: RawRequest, params: Record<string, string>, route: RouteInfo);
66
92
  /** @internal Set the route URL resolver (injected by HttpKernel from Router). */
67
93
  setRouteUrlResolver(resolver: RouteUrlResolver): void;
@@ -1 +1 @@
1
- {"version":3,"file":"HttpContext.d.ts","sourceRoot":"","sources":["../../src/http/HttpContext.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AACnD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAE5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAExC,MAAM,WAAW,SAAS;IACxB,aAAa,EAAE,OAAO,CAAA;IACtB,IAAI,CAAC,EAAE;QACL,EAAE,EAAE,MAAM,CAAA;QACV,KAAK,CAAC,EAAE,MAAM,CAAA;QACd,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;QAChB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;QACtB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KACvB,CAAA;IACD,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;IAChB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;CACvB;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB;;;;;;;OAOG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,qBAAa,WAAW;;IACtB,qCAAqC;IACrC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IAEnB,0BAA0B;IAC1B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IAEzB,mCAAmC;IACnC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAA;IAE3B,uDAAuD;IACvD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAEvC,2CAA2C;IAC3C,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAA;IAEzB,2DAA2D;IAC3D,IAAI,EAAE,SAAS,CAA2B;IAE1C,uBAAuB;IACvB,MAAM,SAAO;IAEb,4EAA4E;IAC5E,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAY;IAEhD;;;;OAIG;IACH,MAAM,CAAC,EAAE,OAAO,CAAA;gBAMd,EAAE,EAAE,MAAM,EACV,UAAU,EAAE,UAAU,EACtB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC9B,KAAK,EAAE,SAAS;IAmBlB,iFAAiF;IACjF,mBAAmB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI;CAGtD"}
1
+ {"version":3,"file":"HttpContext.d.ts","sourceRoot":"","sources":["../../src/http/HttpContext.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AACnD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAE5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAExC,MAAM,WAAW,SAAS;IACxB,aAAa,EAAE,OAAO,CAAA;IACtB,IAAI,CAAC,EAAE;QACL,EAAE,EAAE,MAAM,CAAA;QACV,KAAK,CAAC,EAAE,MAAM,CAAA;QACd,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;QAChB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;QACtB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KACvB,CAAA;IACD,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;IAChB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;CACvB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,UAAU;IACzB,iEAAiE;IACjE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAC7D,kEAAkE;IAClE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAC7D,+EAA+E;IAC/E,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAC9D;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB;;;;;;;OAOG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,qBAAa,WAAW;;IACtB,qCAAqC;IACrC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IAEnB,0BAA0B;IAC1B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IAEzB,mCAAmC;IACnC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAA;IAE3B,uDAAuD;IACvD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAEvC,2CAA2C;IAC3C,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAA;IAEzB,2DAA2D;IAC3D,IAAI,EAAE,SAAS,CAA2B;IAE1C;;;;OAIG;IACH,MAAM,SAAO;IAEb,4EAA4E;IAC5E,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAY;IAEhD;;;;OAIG;IACH,MAAM,CAAC,EAAE,OAAO,CAAA;IAEhB;;;;OAIG;IACH,OAAO,CAAC,EAAE,UAAU,CAAA;gBAMlB,EAAE,EAAE,MAAM,EACV,UAAU,EAAE,UAAU,EACtB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC9B,KAAK,EAAE,SAAS;IAoBlB,iFAAiF;IACjF,mBAAmB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI;CAGtD"}
@@ -22,7 +22,11 @@ export class HttpContext {
22
22
  route;
23
23
  /** Authentication state — populated by auth middleware. */
24
24
  auth = { authenticated: false };
25
- /** Detected locale. */
25
+ /**
26
+ * Request locale — the primary subtag of the first `Accept-Language` entry
27
+ * (e.g. `fr-CH,fr;q=0.9` → `fr`), defaulting to `en`. Middleware (or i18n)
28
+ * may override it; it's a plain mutable field.
29
+ */
26
30
  locale = 'en';
27
31
  /** Per-request key-value store (for middleware to pass data downstream). */
28
32
  store = new Map();
@@ -32,6 +36,12 @@ export class HttpContext {
32
36
  * `ctx.events?.emit('user:updated', user)`. Undefined when events aren't wired.
33
37
  */
34
38
  events;
39
+ /**
40
+ * Per-request authorization entry point, when an authorization middleware
41
+ * is wired (e.g. `@c9up/warden`'s Bouncer initializer). Undefined when no
42
+ * such middleware ran. See {@link Authorizer}.
43
+ */
44
+ bouncer;
35
45
  /** Route URL resolver for redirect().toRoute(). */
36
46
  #routeUrlResolver;
37
47
  constructor(id, rawRequest, params, route) {
@@ -40,6 +50,7 @@ export class HttpContext {
40
50
  this.route = route;
41
51
  this.request = new Request(rawRequest, params);
42
52
  this.response = new Response();
53
+ this.locale = parseAcceptLanguage(this.request.header('accept-language')) ?? 'en';
43
54
  // Wire redirect builder with request context
44
55
  this.response.setRedirectFactory(() => new RedirectBuilder(this.response, {
45
56
  requestUrl: this.request.url(),
@@ -52,4 +63,12 @@ export class HttpContext {
52
63
  this.#routeUrlResolver = resolver;
53
64
  }
54
65
  }
66
+ /** Primary subtag of the first Accept-Language entry: `fr-CH,fr;q=0.9` → `fr`. */
67
+ function parseAcceptLanguage(header) {
68
+ if (!header)
69
+ return undefined;
70
+ const first = header.split(',')[0]?.trim().split(';')[0]?.trim();
71
+ const primary = first?.split('-')[0]?.toLowerCase();
72
+ return primary || undefined;
73
+ }
55
74
  //# sourceMappingURL=HttpContext.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"HttpContext.js","sourceRoot":"","sources":["../../src/http/HttpContext.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAEtD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AA+BxC,MAAM,OAAO,WAAW;IACtB,qCAAqC;IAC5B,EAAE,CAAQ;IAEnB,0BAA0B;IACjB,OAAO,CAAS;IAEzB,mCAAmC;IAC1B,QAAQ,CAAU;IAE3B,uDAAuD;IAC9C,MAAM,CAAwB;IAEvC,2CAA2C;IAClC,KAAK,CAAW;IAEzB,2DAA2D;IAC3D,IAAI,GAAc,EAAE,aAAa,EAAE,KAAK,EAAE,CAAA;IAE1C,uBAAuB;IACvB,MAAM,GAAG,IAAI,CAAA;IAEb,4EAA4E;IACnE,KAAK,GAAyB,IAAI,GAAG,EAAE,CAAA;IAEhD;;;;OAIG;IACH,MAAM,CAAU;IAEhB,mDAAmD;IACnD,iBAAiB,CAAmB;IAEpC,YACE,EAAU,EACV,UAAsB,EACtB,MAA8B,EAC9B,KAAgB;QAEhB,IAAI,CAAC,EAAE,GAAG,EAAE,CAAA;QACZ,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;QAClB,IAAI,CAAC,OAAO,GAAG,IAAI,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,CAAA;QAC9C,IAAI,CAAC,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAA;QAE9B,6CAA6C;QAC7C,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAC9B,GAAG,EAAE,CACH,IAAI,eAAe,CAAC,IAAI,CAAC,QAAQ,EAAE;YACjC,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE;YAC9B,cAAc,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC;YAC9C,gBAAgB,EAAE,IAAI,CAAC,iBAAiB;SACzC,CAAC,CACL,CAAA;IACH,CAAC;IAED,iFAAiF;IACjF,mBAAmB,CAAC,QAA0B;QAC5C,IAAI,CAAC,iBAAiB,GAAG,QAAQ,CAAA;IACnC,CAAC;CACF"}
1
+ {"version":3,"file":"HttpContext.js","sourceRoot":"","sources":["../../src/http/HttpContext.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAEtD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAgDxC,MAAM,OAAO,WAAW;IACtB,qCAAqC;IAC5B,EAAE,CAAQ;IAEnB,0BAA0B;IACjB,OAAO,CAAS;IAEzB,mCAAmC;IAC1B,QAAQ,CAAU;IAE3B,uDAAuD;IAC9C,MAAM,CAAwB;IAEvC,2CAA2C;IAClC,KAAK,CAAW;IAEzB,2DAA2D;IAC3D,IAAI,GAAc,EAAE,aAAa,EAAE,KAAK,EAAE,CAAA;IAE1C;;;;OAIG;IACH,MAAM,GAAG,IAAI,CAAA;IAEb,4EAA4E;IACnE,KAAK,GAAyB,IAAI,GAAG,EAAE,CAAA;IAEhD;;;;OAIG;IACH,MAAM,CAAU;IAEhB;;;;OAIG;IACH,OAAO,CAAa;IAEpB,mDAAmD;IACnD,iBAAiB,CAAmB;IAEpC,YACE,EAAU,EACV,UAAsB,EACtB,MAA8B,EAC9B,KAAgB;QAEhB,IAAI,CAAC,EAAE,GAAG,EAAE,CAAA;QACZ,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;QAClB,IAAI,CAAC,OAAO,GAAG,IAAI,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,CAAA;QAC9C,IAAI,CAAC,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAA;QAC9B,IAAI,CAAC,MAAM,GAAG,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,IAAI,IAAI,CAAA;QAEjF,6CAA6C;QAC7C,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAC9B,GAAG,EAAE,CACH,IAAI,eAAe,CAAC,IAAI,CAAC,QAAQ,EAAE;YACjC,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE;YAC9B,cAAc,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC;YAC9C,gBAAgB,EAAE,IAAI,CAAC,iBAAiB;SACzC,CAAC,CACL,CAAA;IACH,CAAC;IAED,iFAAiF;IACjF,mBAAmB,CAAC,QAA0B;QAC5C,IAAI,CAAC,iBAAiB,GAAG,QAAQ,CAAA;IACnC,CAAC;CACF;AAED,kFAAkF;AAClF,SAAS,mBAAmB,CAAC,MAA0B;IACrD,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAA;IAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAA;IAChE,MAAM,OAAO,GAAG,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAA;IACnD,OAAO,OAAO,IAAI,SAAS,CAAA;AAC7B,CAAC"}
@@ -25,7 +25,11 @@ export declare class RedirectBuilder {
25
25
  toPath(path: string): void;
26
26
  /** Redirect to a named route. */
27
27
  toRoute(name: string, params?: Record<string, string>): void;
28
- /** Redirect back to the previous page (Referer header). */
28
+ /**
29
+ * Redirect back to the previous page (Referer header).
30
+ * Only trusts same-origin or relative referers — external URLs fall back
31
+ * to `fallback` to prevent open redirect attacks.
32
+ */
29
33
  back(fallback?: string): void;
30
34
  }
31
35
  //# sourceMappingURL=RedirectBuilder.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"RedirectBuilder.d.ts","sourceRoot":"","sources":["../../src/http/RedirectBuilder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAE7C,MAAM,MAAM,gBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,MAAM,CAAA;AAExF,qBAAa,eAAe;;gBAUxB,QAAQ,EAAE,QAAQ,EAClB,OAAO,CAAC,EAAE;QACR,UAAU,CAAC,EAAE,MAAM,CAAA;QACnB,cAAc,CAAC,EAAE,MAAM,CAAA;QACvB,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;KACpC;IAQH,gCAAgC;IAChC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAK1B,2DAA2D;IAC3D,MAAM,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IASzC,gDAAgD;IAChD,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAO1B,iCAAiC;IACjC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAQ5D,2DAA2D;IAC3D,IAAI,CAAC,QAAQ,SAAM,GAAG,IAAI;CAgB3B"}
1
+ {"version":3,"file":"RedirectBuilder.d.ts","sourceRoot":"","sources":["../../src/http/RedirectBuilder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAE7C,MAAM,MAAM,gBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,MAAM,CAAA;AAcxF,qBAAa,eAAe;;gBAUxB,QAAQ,EAAE,QAAQ,EAClB,OAAO,CAAC,EAAE;QACR,UAAU,CAAC,EAAE,MAAM,CAAA;QACnB,cAAc,CAAC,EAAE,MAAM,CAAA;QACvB,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;KACpC;IAQH,gCAAgC;IAChC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAK1B,2DAA2D;IAC3D,MAAM,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IASzC,gDAAgD;IAChD,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAO1B,iCAAiC;IACjC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAQ5D;;;;OAIG;IACH,IAAI,CAAC,QAAQ,SAAM,GAAG,IAAI;CAoB3B"}
@@ -8,6 +8,20 @@
8
8
  * response.redirect().withQs({ page: '2' }).toPath('/results')
9
9
  * response.redirect().toRoute('posts.show', { id: '42' })
10
10
  */
11
+ function isSameOriginOrRelative(referer, requestUrl) {
12
+ if (referer.startsWith('/') && !referer.startsWith('//'))
13
+ return true;
14
+ if (!requestUrl)
15
+ return false;
16
+ try {
17
+ const ref = new URL(referer);
18
+ const req = new URL(requestUrl);
19
+ return ref.origin === req.origin;
20
+ }
21
+ catch {
22
+ return false;
23
+ }
24
+ }
11
25
  export class RedirectBuilder {
12
26
  #response;
13
27
  #status = 302;
@@ -52,10 +66,19 @@ export class RedirectBuilder {
52
66
  const path = this.#routeUrlResolver(name, params);
53
67
  this.toPath(path);
54
68
  }
55
- /** Redirect back to the previous page (Referer header). */
69
+ /**
70
+ * Redirect back to the previous page (Referer header).
71
+ * Only trusts same-origin or relative referers — external URLs fall back
72
+ * to `fallback` to prevent open redirect attacks.
73
+ */
56
74
  back(fallback = '/') {
57
- const referer = this.#requestReferer ?? fallback;
58
- this.toPath(referer);
75
+ const referer = this.#requestReferer;
76
+ if (referer && isSameOriginOrRelative(referer, this.#requestUrl)) {
77
+ this.toPath(referer);
78
+ }
79
+ else {
80
+ this.toPath(fallback);
81
+ }
59
82
  }
60
83
  #appendQs(path) {
61
84
  let qs = '';
@@ -1 +1 @@
1
- {"version":3,"file":"RedirectBuilder.js","sourceRoot":"","sources":["../../src/http/RedirectBuilder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH,MAAM,OAAO,eAAe;IAC1B,SAAS,CAAU;IACnB,OAAO,GAAG,GAAG,CAAA;IACb,GAAG,GAAkC,IAAI,CAAA;IACzC,UAAU,GAAG,KAAK,CAAA;IAClB,WAAW,CAAS;IACpB,eAAe,CAAS;IACxB,iBAAiB,CAAmB;IAEpC,YACE,QAAkB,EAClB,OAIC;QAED,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAA;QACzB,IAAI,CAAC,WAAW,GAAG,OAAO,EAAE,UAAU,CAAA;QACtC,IAAI,CAAC,eAAe,GAAG,OAAO,EAAE,cAAc,CAAA;QAC9C,IAAI,CAAC,iBAAiB,GAAG,OAAO,EAAE,gBAAgB,CAAA;IACpD,CAAC;IAED,gCAAgC;IAChC,MAAM,CAAC,IAAY;QACjB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAA;QACnB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,2DAA2D;IAC3D,MAAM,CAAC,EAA2B;QAChC,IAAI,EAAE,EAAE,CAAC;YACP,IAAI,CAAC,GAAG,GAAG,EAAE,CAAA;QACf,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,UAAU,GAAG,IAAI,CAAA;QACxB,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IAED,gDAAgD;IAChD,MAAM,CAAC,IAAY;QACjB,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;QAChC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACnC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,EAAE,GAAG,CAAC,CAAA;QACtC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IAC5B,CAAC;IAED,iCAAiC;IACjC,OAAO,CAAC,IAAY,EAAE,MAA+B;QACnD,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,oEAAoE,CAAC,CAAA;QACvF,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;QACjD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IACnB,CAAC;IAED,2DAA2D;IAC3D,IAAI,CAAC,QAAQ,GAAG,GAAG;QACjB,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,IAAI,QAAQ,CAAA;QAChD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IACtB,CAAC;IAED,SAAS,CAAC,IAAY;QACpB,IAAI,EAAE,GAAG,EAAE,CAAA;QACX,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;YACb,EAAE,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAA;QAC/C,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;YAC3C,IAAI,KAAK,KAAK,CAAC,CAAC;gBAAE,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAA;QAC1D,CAAC;QACD,IAAI,CAAC,EAAE;YAAE,OAAO,IAAI,CAAA;QACpB,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,EAAE,EAAE,CAAA;IAC/D,CAAC;CACF"}
1
+ {"version":3,"file":"RedirectBuilder.js","sourceRoot":"","sources":["../../src/http/RedirectBuilder.ts"],"names":[],"mappings":"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"}
@@ -156,5 +156,18 @@ export declare class Request {
156
156
  setFiles(files: import('../bodyparser/MultipartFile.js').MultipartFile[]): void;
157
157
  /** @internal Set the parsed body (called by BodyParser middleware). */
158
158
  setParsedBody(body: Dict<unknown>): void;
159
+ /**
160
+ * @internal Store the validated + transformed payload (called by the
161
+ * validation middleware after a route validator passes).
162
+ */
163
+ setValidated(data: unknown): void;
164
+ /**
165
+ * The validated + coerced payload produced by the route's `.validate()`
166
+ * validator, or `undefined` when the route declares no validator. Prefer
167
+ * this over `body()` in a validated handler — it carries the sanitized,
168
+ * type-coerced values, not the raw input. Returns `unknown`; narrow it at
169
+ * the call site (the validator already guaranteed the shape).
170
+ */
171
+ validated(): unknown;
159
172
  }
160
173
  //# sourceMappingURL=Request.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Request.d.ts","sourceRoot":"","sources":["../../src/http/Request.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Request.d.ts","sourceRoot":"","sources":["../../src/http/Request.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAE/C,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,IAAI,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,YAAY,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAA;IAChC,6DAA6D;IAC7D,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB;;;;;OAKG;IACH,EAAE,CAAC,EAAE,MAAM,CAAA;IACX;;;;OAIG;IACH,SAAS,CAAC,EAAE;QACV,MAAM,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;QAC9C,KAAK,EAAE,KAAK,CAAC;YACX,SAAS,EAAE,MAAM,CAAA;YACjB,UAAU,EAAE,MAAM,CAAA;YAClB,WAAW,EAAE,MAAM,CAAA;YACnB,IAAI,EAAE,MAAM,CAAA;YACZ,UAAU,EAAE,MAAM,CAAA;SACnB,CAAC,CAAA;KACH,CAAA;IACD;;;;OAIG;IACH,OAAO,CAAC,EAAE,IAAI,CAAA;CACf;AAED,qBAAa,OAAO;;IASlB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;gBAEN,GAAG,EAAE,UAAU,EAAE,MAAM,GAAE,IAAS;IAO9C,qCAAqC;IACrC,MAAM,IAAI,MAAM;IAIhB,yCAAyC;IACzC,GAAG,CAAC,SAAS,UAAO,GAAG,MAAM;IAO7B,2CAA2C;IAC3C,IAAI,IAAI,MAAM;IAId;;;;;;;;;;;;;;;OAeG;IACH,EAAE,IAAI,MAAM;IAKZ;;;;;;OAMG;IACH,OAAO,IAAI,IAAI;IAqBf,8DAA8D;IAC9D,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAKnC,oEAAoE;IACpE,GAAG,IAAI,MAAM;IAOb,kFAAkF;IAClF,SAAS,IAAI,MAAM;IASnB,sDAAsD;IACtD,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIvC,+BAA+B;IAC/B,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC;IAMzB,oCAAoC;IACpC,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAI7D,gCAAgC;IAChC,MAAM,IAAI,QAAQ,CAAC,IAAI,CAAC;IAMxB,4CAA4C;IAC5C,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC;IASnB,mCAAmC;IACnC,IAAI,IAAI,OAAO;IAOf,0DAA0D;IAC1D,KAAK,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC;IAUpD,qDAAqD;IACrD,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC;IAQpB,4CAA4C;IAC5C,IAAI,CAAC,CAAC,SAAS,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAW9D,0CAA0C;IAC1C,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;IAYrC,wEAAwE;IACxE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,IAAI;IAYlC;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,IAAI;IAiBvC;;;;;OAKG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,IAAI;IAoBxC,0CAA0C;IAC1C,IAAI,CACF,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,OAAO,gCAAgC,EAAE,qBAAqB,GACvE,OAAO,gCAAgC,EAAE,aAAa,GAAG,IAAI;IAQhE,+CAA+C;IAC/C,KAAK,CACH,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,OAAO,gCAAgC,EAAE,qBAAqB,GACvE,OAAO,gCAAgC,EAAE,aAAa,EAAE;IAQ3D,8BAA8B;IAC9B,QAAQ,IAAI,GAAG,CAAC,MAAM,EAAE,OAAO,gCAAgC,EAAE,aAAa,EAAE,CAAC;IAIjF;;;;;;OAMG;IACH,SAAS,IAAI,WAAW,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,GAAG,SAAS;IAI7D,6DAA6D;IAC7D,QAAQ,CAAC,KAAK,EAAE,OAAO,gCAAgC,EAAE,aAAa,EAAE,GAAG,IAAI;IAW/E,uEAAuE;IACvE,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI;IAKxC;;;OAGG;IACH,YAAY,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI;IAIjC;;;;;;OAMG;IACH,SAAS,IAAI,OAAO;CAkBrB"}
@@ -13,6 +13,7 @@ export class Request {
13
13
  #parsedQs;
14
14
  #merged;
15
15
  #files = new Map();
16
+ #validated;
16
17
  /**
17
18
  * CSRF token for this request (AdonisJS idiom: `request.csrfToken`). Seeded
18
19
  * by the `@c9up/blackhole` middleware when CSRF is enabled; `undefined`
@@ -308,6 +309,23 @@ export class Request {
308
309
  this.#parsedBody = body;
309
310
  this.#merged = undefined; // reset merged cache
310
311
  }
312
+ /**
313
+ * @internal Store the validated + transformed payload (called by the
314
+ * validation middleware after a route validator passes).
315
+ */
316
+ setValidated(data) {
317
+ this.#validated = data;
318
+ }
319
+ /**
320
+ * The validated + coerced payload produced by the route's `.validate()`
321
+ * validator, or `undefined` when the route declares no validator. Prefer
322
+ * this over `body()` in a validated handler — it carries the sanitized,
323
+ * type-coerced values, not the raw input. Returns `unknown`; narrow it at
324
+ * the call site (the validator already guaranteed the shape).
325
+ */
326
+ validated() {
327
+ return this.#validated;
328
+ }
311
329
  #ensureParsedBody() {
312
330
  if (this.#parsedBody !== undefined)
313
331
  return;