flowingts 0.0.0 → 0.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (259) hide show
  1. package/LICENSE +15 -0
  2. package/README.md +74 -3
  3. package/dist/core/abort.d.ts +23 -0
  4. package/dist/core/abort.d.ts.map +1 -0
  5. package/dist/core/abort.js +23 -0
  6. package/dist/core/abort.js.map +1 -0
  7. package/dist/core/app/core.d.ts +35 -0
  8. package/dist/core/app/core.d.ts.map +1 -0
  9. package/dist/core/app/core.js +2 -0
  10. package/dist/core/app/core.js.map +1 -0
  11. package/dist/core/app/options.d.ts +178 -0
  12. package/dist/core/app/options.d.ts.map +1 -0
  13. package/dist/core/app/options.js +2 -0
  14. package/dist/core/app/options.js.map +1 -0
  15. package/dist/core/app.d.ts +143 -0
  16. package/dist/core/app.d.ts.map +1 -0
  17. package/dist/core/app.js +283 -0
  18. package/dist/core/app.js.map +1 -0
  19. package/dist/core/body-parser.d.ts +14 -0
  20. package/dist/core/body-parser.d.ts.map +1 -0
  21. package/dist/core/body-parser.js +76 -0
  22. package/dist/core/body-parser.js.map +1 -0
  23. package/dist/core/compiler.d.ts +104 -0
  24. package/dist/core/compiler.d.ts.map +1 -0
  25. package/dist/core/compiler.js +151 -0
  26. package/dist/core/compiler.js.map +1 -0
  27. package/dist/core/compose.d.ts +16 -0
  28. package/dist/core/compose.d.ts.map +1 -0
  29. package/dist/core/compose.js +41 -0
  30. package/dist/core/compose.js.map +1 -0
  31. package/dist/core/context.d.ts +290 -0
  32. package/dist/core/context.d.ts.map +1 -0
  33. package/dist/core/context.js +460 -0
  34. package/dist/core/context.js.map +1 -0
  35. package/dist/core/contracts.d.ts +76 -0
  36. package/dist/core/contracts.d.ts.map +1 -0
  37. package/dist/core/contracts.js +87 -0
  38. package/dist/core/contracts.js.map +1 -0
  39. package/dist/core/errors.d.ts +50 -0
  40. package/dist/core/errors.d.ts.map +1 -0
  41. package/dist/core/errors.js +25 -0
  42. package/dist/core/errors.js.map +1 -0
  43. package/dist/core/guard.d.ts +10 -0
  44. package/dist/core/guard.d.ts.map +1 -0
  45. package/dist/core/guard.js +14 -0
  46. package/dist/core/guard.js.map +1 -0
  47. package/dist/core/health.d.ts +37 -0
  48. package/dist/core/health.d.ts.map +1 -0
  49. package/dist/core/health.js +68 -0
  50. package/dist/core/health.js.map +1 -0
  51. package/dist/core/hooks.d.ts +34 -0
  52. package/dist/core/hooks.d.ts.map +1 -0
  53. package/dist/core/hooks.js +27 -0
  54. package/dist/core/hooks.js.map +1 -0
  55. package/dist/core/index.d.ts +30 -0
  56. package/dist/core/index.d.ts.map +1 -0
  57. package/dist/core/index.js +11 -0
  58. package/dist/core/index.js.map +1 -0
  59. package/dist/core/infer.d.ts +68 -0
  60. package/dist/core/infer.d.ts.map +1 -0
  61. package/dist/core/infer.js +2 -0
  62. package/dist/core/infer.js.map +1 -0
  63. package/dist/core/inject.d.ts +27 -0
  64. package/dist/core/inject.d.ts.map +1 -0
  65. package/dist/core/inject.js +85 -0
  66. package/dist/core/inject.js.map +1 -0
  67. package/dist/core/logger.d.ts +57 -0
  68. package/dist/core/logger.d.ts.map +1 -0
  69. package/dist/core/logger.js +134 -0
  70. package/dist/core/logger.js.map +1 -0
  71. package/dist/core/metadata.d.ts +83 -0
  72. package/dist/core/metadata.d.ts.map +1 -0
  73. package/dist/core/metadata.js +91 -0
  74. package/dist/core/metadata.js.map +1 -0
  75. package/dist/core/mounted-group.d.ts +77 -0
  76. package/dist/core/mounted-group.d.ts.map +1 -0
  77. package/dist/core/mounted-group.js +131 -0
  78. package/dist/core/mounted-group.js.map +1 -0
  79. package/dist/core/registry/framework-routes.d.ts +28 -0
  80. package/dist/core/registry/framework-routes.d.ts.map +1 -0
  81. package/dist/core/registry/framework-routes.js +83 -0
  82. package/dist/core/registry/framework-routes.js.map +1 -0
  83. package/dist/core/registry/registry.d.ts +58 -0
  84. package/dist/core/registry/registry.d.ts.map +1 -0
  85. package/dist/core/registry/registry.js +208 -0
  86. package/dist/core/registry/registry.js.map +1 -0
  87. package/dist/core/registry/route-program.d.ts +16 -0
  88. package/dist/core/registry/route-program.d.ts.map +1 -0
  89. package/dist/core/registry/route-program.js +62 -0
  90. package/dist/core/registry/route-program.js.map +1 -0
  91. package/dist/core/request-validation.d.ts +15 -0
  92. package/dist/core/request-validation.d.ts.map +1 -0
  93. package/dist/core/request-validation.js +67 -0
  94. package/dist/core/request-validation.js.map +1 -0
  95. package/dist/core/response/pipeline.d.ts +51 -0
  96. package/dist/core/response/pipeline.d.ts.map +1 -0
  97. package/dist/core/response/pipeline.js +169 -0
  98. package/dist/core/response/pipeline.js.map +1 -0
  99. package/dist/core/route-table.d.ts +58 -0
  100. package/dist/core/route-table.d.ts.map +1 -0
  101. package/dist/core/route-table.js +108 -0
  102. package/dist/core/route-table.js.map +1 -0
  103. package/dist/core/runtime/observer.d.ts +47 -0
  104. package/dist/core/runtime/observer.d.ts.map +1 -0
  105. package/dist/core/runtime/observer.js +125 -0
  106. package/dist/core/runtime/observer.js.map +1 -0
  107. package/dist/core/runtime/request-handler.d.ts +62 -0
  108. package/dist/core/runtime/request-handler.d.ts.map +1 -0
  109. package/dist/core/runtime/request-handler.js +256 -0
  110. package/dist/core/runtime/request-handler.js.map +1 -0
  111. package/dist/core/runtime/server.d.ts +59 -0
  112. package/dist/core/runtime/server.d.ts.map +1 -0
  113. package/dist/core/runtime/server.js +180 -0
  114. package/dist/core/runtime/server.js.map +1 -0
  115. package/dist/core/shutdown.d.ts +41 -0
  116. package/dist/core/shutdown.d.ts.map +1 -0
  117. package/dist/core/shutdown.js +53 -0
  118. package/dist/core/shutdown.js.map +1 -0
  119. package/dist/core/streaming/sse.d.ts +35 -0
  120. package/dist/core/streaming/sse.d.ts.map +1 -0
  121. package/dist/core/streaming/sse.js +121 -0
  122. package/dist/core/streaming/sse.js.map +1 -0
  123. package/dist/core/symbols.d.ts +28 -0
  124. package/dist/core/symbols.d.ts.map +1 -0
  125. package/dist/core/symbols.js +28 -0
  126. package/dist/core/symbols.js.map +1 -0
  127. package/dist/core/telemetry.d.ts +83 -0
  128. package/dist/core/telemetry.d.ts.map +1 -0
  129. package/dist/core/telemetry.js +96 -0
  130. package/dist/core/telemetry.js.map +1 -0
  131. package/dist/core/uploads/receive.d.ts +63 -0
  132. package/dist/core/uploads/receive.d.ts.map +1 -0
  133. package/dist/core/uploads/receive.js +342 -0
  134. package/dist/core/uploads/receive.js.map +1 -0
  135. package/dist/core/uploads/types.d.ts +79 -0
  136. package/dist/core/uploads/types.d.ts.map +1 -0
  137. package/dist/core/uploads/types.js +2 -0
  138. package/dist/core/uploads/types.js.map +1 -0
  139. package/dist/decorators/hooks.d.ts +25 -0
  140. package/dist/decorators/hooks.d.ts.map +1 -0
  141. package/dist/decorators/hooks.js +36 -0
  142. package/dist/decorators/hooks.js.map +1 -0
  143. package/dist/decorators/http.d.ts +21 -0
  144. package/dist/decorators/http.d.ts.map +1 -0
  145. package/dist/decorators/http.js +21 -0
  146. package/dist/decorators/http.js.map +1 -0
  147. package/dist/decorators/index.d.ts +7 -0
  148. package/dist/decorators/index.d.ts.map +1 -0
  149. package/dist/decorators/index.js +7 -0
  150. package/dist/decorators/index.js.map +1 -0
  151. package/dist/decorators/log.d.ts +10 -0
  152. package/dist/decorators/log.d.ts.map +1 -0
  153. package/dist/decorators/log.js +32 -0
  154. package/dist/decorators/log.js.map +1 -0
  155. package/dist/decorators/middlewares.d.ts +28 -0
  156. package/dist/decorators/middlewares.d.ts.map +1 -0
  157. package/dist/decorators/middlewares.js +40 -0
  158. package/dist/decorators/middlewares.js.map +1 -0
  159. package/dist/decorators/router.d.ts +12 -0
  160. package/dist/decorators/router.d.ts.map +1 -0
  161. package/dist/decorators/router.js +20 -0
  162. package/dist/decorators/router.js.map +1 -0
  163. package/dist/decorators/schema.d.ts +8 -0
  164. package/dist/decorators/schema.d.ts.map +1 -0
  165. package/dist/decorators/schema.js +14 -0
  166. package/dist/decorators/schema.js.map +1 -0
  167. package/dist/index.d.ts +7 -0
  168. package/dist/index.d.ts.map +1 -0
  169. package/dist/index.js +10 -0
  170. package/dist/index.js.map +1 -0
  171. package/dist/middlewares/auth.d.ts +41 -0
  172. package/dist/middlewares/auth.d.ts.map +1 -0
  173. package/dist/middlewares/auth.js +74 -0
  174. package/dist/middlewares/auth.js.map +1 -0
  175. package/dist/middlewares/cors.d.ts +30 -0
  176. package/dist/middlewares/cors.d.ts.map +1 -0
  177. package/dist/middlewares/cors.js +69 -0
  178. package/dist/middlewares/cors.js.map +1 -0
  179. package/dist/middlewares/csrf.d.ts +42 -0
  180. package/dist/middlewares/csrf.d.ts.map +1 -0
  181. package/dist/middlewares/csrf.js +70 -0
  182. package/dist/middlewares/csrf.js.map +1 -0
  183. package/dist/middlewares/index.d.ts +6 -0
  184. package/dist/middlewares/index.d.ts.map +1 -0
  185. package/dist/middlewares/index.js +6 -0
  186. package/dist/middlewares/index.js.map +1 -0
  187. package/dist/middlewares/rate-limit.d.ts +35 -0
  188. package/dist/middlewares/rate-limit.d.ts.map +1 -0
  189. package/dist/middlewares/rate-limit.js +45 -0
  190. package/dist/middlewares/rate-limit.js.map +1 -0
  191. package/dist/middlewares/security-headers.d.ts +28 -0
  192. package/dist/middlewares/security-headers.d.ts.map +1 -0
  193. package/dist/middlewares/security-headers.js +42 -0
  194. package/dist/middlewares/security-headers.js.map +1 -0
  195. package/dist/openapi/generate.d.ts +51 -0
  196. package/dist/openapi/generate.d.ts.map +1 -0
  197. package/dist/openapi/generate.js +175 -0
  198. package/dist/openapi/generate.js.map +1 -0
  199. package/dist/schema/serialization.d.ts +2 -0
  200. package/dist/schema/serialization.d.ts.map +1 -0
  201. package/dist/schema/serialization.js +11 -0
  202. package/dist/schema/serialization.js.map +1 -0
  203. package/dist/schema/validation.d.ts +22 -0
  204. package/dist/schema/validation.d.ts.map +1 -0
  205. package/dist/schema/validation.js +68 -0
  206. package/dist/schema/validation.js.map +1 -0
  207. package/dist/server/static.d.ts +45 -0
  208. package/dist/server/static.d.ts.map +1 -0
  209. package/dist/server/static.js +204 -0
  210. package/dist/server/static.js.map +1 -0
  211. package/dist/server/tls.d.ts +48 -0
  212. package/dist/server/tls.d.ts.map +1 -0
  213. package/dist/server/tls.js +60 -0
  214. package/dist/server/tls.js.map +1 -0
  215. package/dist/shims/symbol-metadata.d.ts +2 -0
  216. package/dist/shims/symbol-metadata.d.ts.map +1 -0
  217. package/dist/shims/symbol-metadata.js +8 -0
  218. package/dist/shims/symbol-metadata.js.map +1 -0
  219. package/dist/utils/content-type.d.ts +13 -0
  220. package/dist/utils/content-type.d.ts.map +1 -0
  221. package/dist/utils/content-type.js +75 -0
  222. package/dist/utils/content-type.js.map +1 -0
  223. package/dist/utils/cookie.d.ts +34 -0
  224. package/dist/utils/cookie.d.ts.map +1 -0
  225. package/dist/utils/cookie.js +94 -0
  226. package/dist/utils/cookie.js.map +1 -0
  227. package/dist/utils/index.d.ts +7 -0
  228. package/dist/utils/index.d.ts.map +1 -0
  229. package/dist/utils/index.js +7 -0
  230. package/dist/utils/index.js.map +1 -0
  231. package/dist/utils/mime.d.ts +2 -0
  232. package/dist/utils/mime.d.ts.map +1 -0
  233. package/dist/utils/mime.js +52 -0
  234. package/dist/utils/mime.js.map +1 -0
  235. package/dist/utils/origin-match.d.ts +58 -0
  236. package/dist/utils/origin-match.d.ts.map +1 -0
  237. package/dist/utils/origin-match.js +194 -0
  238. package/dist/utils/origin-match.js.map +1 -0
  239. package/dist/utils/path.d.ts +10 -0
  240. package/dist/utils/path.d.ts.map +1 -0
  241. package/dist/utils/path.js +60 -0
  242. package/dist/utils/path.js.map +1 -0
  243. package/dist/utils/query.d.ts +28 -0
  244. package/dist/utils/query.d.ts.map +1 -0
  245. package/dist/utils/query.js +67 -0
  246. package/dist/utils/query.js.map +1 -0
  247. package/dist/utils/request-target.d.ts +31 -0
  248. package/dist/utils/request-target.d.ts.map +1 -0
  249. package/dist/utils/request-target.js +80 -0
  250. package/dist/utils/request-target.js.map +1 -0
  251. package/dist/utils/safe-json.d.ts +24 -0
  252. package/dist/utils/safe-json.d.ts.map +1 -0
  253. package/dist/utils/safe-json.js +83 -0
  254. package/dist/utils/safe-json.js.map +1 -0
  255. package/dist/utils/trace-context.d.ts +17 -0
  256. package/dist/utils/trace-context.d.ts.map +1 -0
  257. package/dist/utils/trace-context.js +30 -0
  258. package/dist/utils/trace-context.js.map +1 -0
  259. package/package.json +85 -6
@@ -0,0 +1,32 @@
1
+ import { performance } from 'node:perf_hooks';
2
+ /**
3
+ * Mede o tempo do handler, inclusive de handlers `async` (B-04).
4
+ * Uso: `@timer()` ou `@timer({ log: (msg, ms) => logger.info({ ms }, msg) })`.
5
+ */
6
+ export function timer(opts = {}) {
7
+ const log = opts.log ?? ((msg) => console.debug(msg));
8
+ return (target, context) => {
9
+ const name = String(context.name);
10
+ const report = (start) => {
11
+ const ms = performance.now() - start;
12
+ log(`${name} took ${ms.toFixed(2)}ms`, ms);
13
+ };
14
+ return function (...args) {
15
+ const start = performance.now();
16
+ let result;
17
+ try {
18
+ result = target.call(this, ...args);
19
+ }
20
+ catch (err) {
21
+ report(start);
22
+ throw err;
23
+ }
24
+ if (result instanceof Promise) {
25
+ return result.finally(() => report(start));
26
+ }
27
+ report(start);
28
+ return result;
29
+ };
30
+ };
31
+ }
32
+ //# sourceMappingURL=log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log.js","sourceRoot":"","sources":["../../src/decorators/log.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAO9C;;;GAGG;AACH,MAAM,UAAU,KAAK,CAAC,IAAI,GAAiB,EAAE;IAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IAE9D,OAAO,CACL,MAA6C,EAC7C,OAAiF,EACjF,EAAE;QACF,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,MAAM,GAAG,CAAC,KAAa,EAAE,EAAE;YAC/B,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;YACrC,GAAG,CAAC,GAAG,IAAI,SAAS,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC7C,CAAC,CAAC;QAEF,OAAO,UAAsB,GAAG,IAAU;YACxC,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;YAChC,IAAI,MAAc,CAAC;YACnB,IAAI,CAAC;gBACH,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC;YACtC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,CAAC,KAAK,CAAC,CAAC;gBACd,MAAM,GAAG,CAAC;YACZ,CAAC;YACD,IAAI,MAAM,YAAY,OAAO,EAAE,CAAC;gBAC9B,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAW,CAAC;YACvD,CAAC;YACD,MAAM,CAAC,KAAK,CAAC,CAAC;YACd,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,28 @@
1
+ import type { Middleware } from '../core/compose.ts';
2
+ import type { Guard } from '../core/guard.ts';
3
+ type ClassOrMethodContext = ClassDecoratorContext | ClassMethodDecoratorContext;
4
+ /**
5
+ * Middlewares para todas as rotas da classe ou para um método (F-01, F-30). Rodam depois dos globais
6
+ * e dos `middlewares` do `mount`, e antes dos guards. É o mesmo nome da opção `middlewares`.
7
+ *
8
+ * ```ts
9
+ * @Middlewares(rateLimit({ max: 10 })) // todas as rotas da classe
10
+ * @Router('/auth')
11
+ * class AuthRoutes {
12
+ * @Middlewares(audit) @Post('/login') login() {}
13
+ * }
14
+ * ```
15
+ */
16
+ export declare function Middlewares(...middlewares: Middleware[]): (_value: unknown, context: ClassOrMethodContext) => void;
17
+ /**
18
+ * Guards para todas as rotas da classe ou para um método (F-01, F-30). Rodam antes da validação;
19
+ * `false` responde 403. É o mesmo nome da opção `guards`.
20
+ *
21
+ * ```ts
22
+ * const isAdmin: Guard = (ctx) => ctx.state.user?.role === 'admin';
23
+ * @Guards(isAdmin) @Delete('/:id') remove() {}
24
+ * ```
25
+ */
26
+ export declare function Guards(...guards: Guard[]): (_value: unknown, context: ClassOrMethodContext) => void;
27
+ export {};
28
+ //# sourceMappingURL=middlewares.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middlewares.d.ts","sourceRoot":"","sources":["../../src/decorators/middlewares.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAG9C,KAAK,oBAAoB,GAAG,qBAAqB,GAAG,2BAA2B,CAAC;AAchF;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,CAAC,GAAG,WAAW,EAAE,UAAU,EAAE,YAnBtC,OAAO,WAAW,oBAAoB,KAAG,IAAI,CAqB9D;AAED;;;;;;;;GAQG;AACH,wBAAgB,MAAM,CAAC,GAAG,MAAM,EAAE,KAAK,EAAE,YAhCvB,OAAO,WAAW,oBAAoB,KAAG,IAAI,CAkC9D"}
@@ -0,0 +1,40 @@
1
+ import { getOrCreateMethod, metadataFor } from '../core/metadata.js';
2
+ /**
3
+ * Aplica `items` na classe (todas as rotas) ou no método. Decorators são avaliados de baixo para
4
+ * cima; inserimos no início para que a ordem de execução siga a ordem de leitura (de cima para baixo).
5
+ */
6
+ function register(decorator, pick, items) {
7
+ return (_value, context) => {
8
+ const meta = metadataFor(context, decorator);
9
+ const target = context.kind === 'class' ? meta : getOrCreateMethod(meta, context.name);
10
+ target[pick].unshift(...items);
11
+ };
12
+ }
13
+ /**
14
+ * Middlewares para todas as rotas da classe ou para um método (F-01, F-30). Rodam depois dos globais
15
+ * e dos `middlewares` do `mount`, e antes dos guards. É o mesmo nome da opção `middlewares`.
16
+ *
17
+ * ```ts
18
+ * @Middlewares(rateLimit({ max: 10 })) // todas as rotas da classe
19
+ * @Router('/auth')
20
+ * class AuthRoutes {
21
+ * @Middlewares(audit) @Post('/login') login() {}
22
+ * }
23
+ * ```
24
+ */
25
+ export function Middlewares(...middlewares) {
26
+ return register('Middlewares', 'middlewares', middlewares);
27
+ }
28
+ /**
29
+ * Guards para todas as rotas da classe ou para um método (F-01, F-30). Rodam antes da validação;
30
+ * `false` responde 403. É o mesmo nome da opção `guards`.
31
+ *
32
+ * ```ts
33
+ * const isAdmin: Guard = (ctx) => ctx.state.user?.role === 'admin';
34
+ * @Guards(isAdmin) @Delete('/:id') remove() {}
35
+ * ```
36
+ */
37
+ export function Guards(...guards) {
38
+ return register('Guards', 'guards', guards);
39
+ }
40
+ //# sourceMappingURL=middlewares.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middlewares.js","sourceRoot":"","sources":["../../src/decorators/middlewares.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAIrE;;;GAGG;AACH,SAAS,QAAQ,CAAC,SAAiB,EAAE,IAA8B,EAAE,KAAyB;IAC5F,OAAO,CAAC,MAAe,EAAE,OAA6B,EAAQ,EAAE;QAC9D,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QACtF,MAAM,CAAC,IAAI,CAAe,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC;IAChD,CAAC,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,WAAW,CAAC,GAAG,WAAyB;IACtD,OAAO,QAAQ,CAAC,aAAa,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC;AAC7D,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,MAAM,CAAC,GAAG,MAAe;IACvC,OAAO,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;AAC9C,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Marca a classe como um grupo de rotas que o app pode registrar com `app.mount()` (F-28)
3
+ * e define o prefixo padrão. Sem `@Router` próprio, a classe é recusada.
4
+ *
5
+ * ```ts
6
+ * @Router('/users')
7
+ * class UserRoutes { @Get('/:id') getById() {} }
8
+ * app.mount(UserRoutes);
9
+ * ```
10
+ */
11
+ export declare function Router(prefix?: string): <T extends abstract new (...args: any[]) => object>(_value: T, context: ClassDecoratorContext<T>) => void;
12
+ //# sourceMappingURL=router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/decorators/router.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AACH,wBAAgB,MAAM,CAAC,MAAM,SAAK,IAExB,CAAC,SAAS,QAAQ,MAAM,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,MAAM,UAAU,CAAC,WAAW,qBAAqB,CAAC,CAAC,CAAC,UAKxG"}
@@ -0,0 +1,20 @@
1
+ import { metadataFor } from '../core/metadata.js';
2
+ /**
3
+ * Marca a classe como um grupo de rotas que o app pode registrar com `app.mount()` (F-28)
4
+ * e define o prefixo padrão. Sem `@Router` próprio, a classe é recusada.
5
+ *
6
+ * ```ts
7
+ * @Router('/users')
8
+ * class UserRoutes { @Get('/:id') getById() {} }
9
+ * app.mount(UserRoutes);
10
+ * ```
11
+ */
12
+ export function Router(prefix = '') {
13
+ // biome-ignore lint/suspicious/noExplicitAny: aceita classes com qualquer construtor (instâncias com dependências).
14
+ return (_value, context) => {
15
+ const meta = metadataFor(context, 'Router');
16
+ meta.isRouter = true;
17
+ meta.prefix = prefix;
18
+ };
19
+ }
20
+ //# sourceMappingURL=router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/decorators/router.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAElD;;;;;;;;;GASG;AACH,MAAM,UAAU,MAAM,CAAC,MAAM,GAAG,EAAE;IAChC,oHAAoH;IACpH,OAAO,CAAoD,MAAS,EAAE,OAAiC,EAAE,EAAE;QACzG,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC5C,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { type RouteSchemas } from '../core/metadata.ts';
2
+ /**
3
+ * Schemas da rota em um decorator separado, para quem prefere manter o verbo enxuto.
4
+ * Equivale ao segundo argumento de `@Get`/`@Post`/…; as duas formas podem conviver no mesmo método,
5
+ * desde que não declarem a mesma parte (ex.: `body`) duas vezes.
6
+ */
7
+ export declare function Schema(schemas: RouteSchemas): <This, Args extends [any, ...unknown[]], Return>(_target: (this: This, ...args: Args) => Return, context: ClassMethodDecoratorContext<This, (this: This, ...args: Args) => Return>) => void;
8
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/decorators/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgD,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEtG;;;;GAIG;AACH,wBAAgB,MAAM,CAAC,OAAO,EAAE,YAAY,IAElC,IAAI,EAAE,IAAI,SAAS,CAAC,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC,EAAE,MAAM,WAC3C,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,IAAI,KAAK,MAAM,WACrC,2BAA2B,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC,UAKpF"}
@@ -0,0 +1,14 @@
1
+ import { getOrCreateMethod, mergeSchemas, metadataFor } from '../core/metadata.js';
2
+ /**
3
+ * Schemas da rota em um decorator separado, para quem prefere manter o verbo enxuto.
4
+ * Equivale ao segundo argumento de `@Get`/`@Post`/…; as duas formas podem conviver no mesmo método,
5
+ * desde que não declarem a mesma parte (ex.: `body`) duas vezes.
6
+ */
7
+ export function Schema(schemas) {
8
+ // biome-ignore lint/suspicious/noExplicitAny: o primeiro parâmetro precisa ser bivariante para aceitar Context<S> de qualquer S.
9
+ return (_target, context) => {
10
+ const meta = metadataFor(context, 'Schema');
11
+ mergeSchemas(getOrCreateMethod(meta, context.name), schemas, '@Schema');
12
+ };
13
+ }
14
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/decorators/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,WAAW,EAAqB,MAAM,qBAAqB,CAAC;AAEtG;;;;GAIG;AACH,MAAM,UAAU,MAAM,CAAC,OAAqB;IAC1C,iIAAiI;IACjI,OAAO,CACL,OAA8C,EAC9C,OAAiF,EACjF,EAAE;QACF,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC5C,YAAY,CAAC,iBAAiB,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IAC1E,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ import './shims/symbol-metadata.ts';
2
+ export * from './core/index.ts';
3
+ export * from './decorators/index.ts';
4
+ export * from './middlewares/index.ts';
5
+ export { toOpenAPIPath, type OpenAPIOptions } from './openapi/generate.ts';
6
+ export { Type, type Static, type TSchema } from '@sinclair/typebox';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,4BAA4B,CAAC;AAEpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAG3E,OAAO,EAAE,IAAI,EAAE,KAAK,MAAM,EAAE,KAAK,OAAO,EAAE,MAAM,mBAAmB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,10 @@
1
+ // Ponto de entrada público do FlowingTS.
2
+ // O shim precisa ser avaliado antes de qualquer decorator rodar.
3
+ import './shims/symbol-metadata.js';
4
+ export * from './core/index.js';
5
+ export * from './decorators/index.js';
6
+ export * from './middlewares/index.js';
7
+ export { toOpenAPIPath } from './openapi/generate.js';
8
+ // Re-exporta TypeBox para que os usuários não precisem instalar como dependência separada
9
+ export { Type } from '@sinclair/typebox';
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,iEAAiE;AACjE,OAAO,4BAA4B,CAAC;AAEpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,OAAO,EAAE,aAAa,EAAuB,MAAM,uBAAuB,CAAC;AAE3E,0FAA0F;AAC1F,OAAO,EAAE,IAAI,EAA6B,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,41 @@
1
+ import type { Context } from '../core/context.ts';
2
+ import type { Guard } from '../core/guard.ts';
3
+ /**
4
+ * Compara dois segredos em tempo constante (S-10). Os dois lados passam por SHA-256 antes, então o
5
+ * tempo também não revela o tamanho do segredo esperado.
6
+ */
7
+ export declare function safeEqual(a: string, b: string): boolean;
8
+ /** O que o `verify` devolve: o usuário autenticado (vai para `ctx.state.user`), ou `false`/`undefined` para recusar. */
9
+ type Verified<U> = U | false | null | undefined;
10
+ export interface BearerAuthOptions<U> {
11
+ /**
12
+ * Confere o token e devolve o usuário (ou `true`). A verificação é sua: JWT com a biblioteca da
13
+ * sua escolha, consulta ao banco, lista de chaves comparadas com {@link safeEqual}…
14
+ */
15
+ verify: (token: string, ctx: Context) => Verified<U> | Promise<Verified<U>>;
16
+ /** Vai no `WWW-Authenticate` do 401. Padrão: `'api'`. */
17
+ realm?: string;
18
+ }
19
+ export interface BasicAuthOptions<U> {
20
+ /** Confere usuário e senha (compare com {@link safeEqual}) e devolve o usuário (ou `true`). */
21
+ verify: (username: string, password: string, ctx: Context) => Verified<U> | Promise<Verified<U>>;
22
+ /** Padrão: `'api'`. */
23
+ realm?: string;
24
+ }
25
+ /**
26
+ * Guard de `Authorization: Bearer <token>` (S-10). Sem token, ou com token recusado, responde 401 com
27
+ * `WWW-Authenticate`. O usuário devolvido pelo `verify` fica em `ctx.state.user`.
28
+ *
29
+ * ```ts
30
+ * const auth = bearerAuth({ verify: (token) => sessions.get(token) });
31
+ * app.group({ guards: [auth] }, (g) => g.mount(UserRoutes));
32
+ * ```
33
+ */
34
+ export declare function bearerAuth<U>(opts: BearerAuthOptions<U>): Guard;
35
+ /**
36
+ * Guard de `Authorization: Basic` (S-10), para painéis internos e integrações simples. Use só sobre
37
+ * HTTPS: a senha vai em base64, que não é criptografia.
38
+ */
39
+ export declare function basicAuth<U>(opts: BasicAuthOptions<U>): Guard;
40
+ export {};
41
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/middlewares/auth.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAE9C;;;GAGG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAIvD;AAED,wHAAwH;AACxH,KAAK,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,KAAK,GAAG,IAAI,GAAG,SAAS,CAAC;AAEhD,MAAM,WAAW,iBAAiB,CAAC,CAAC;IAClC;;;OAGG;IACH,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5E,yDAAyD;IACzD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB,CAAC,CAAC;IACjC,+FAA+F;IAC/F,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACjG,uBAAuB;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAwBD;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,KAAK,CAS/D;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG,KAAK,CAY7D"}
@@ -0,0 +1,74 @@
1
+ import { createHash, timingSafeEqual } from 'node:crypto';
2
+ import { HttpError } from '../core/errors.js';
3
+ /**
4
+ * Compara dois segredos em tempo constante (S-10). Os dois lados passam por SHA-256 antes, então o
5
+ * tempo também não revela o tamanho do segredo esperado.
6
+ */
7
+ export function safeEqual(a, b) {
8
+ const x = createHash('sha256').update(a).digest();
9
+ const y = createHash('sha256').update(b).digest();
10
+ return timingSafeEqual(x, y) && a.length === b.length;
11
+ }
12
+ const quote = (realm) => `"${realm.replace(/["\\\r\n]/g, '')}"`;
13
+ /** 401 padronizado: a mesma resposta para credencial ausente, malformada ou inválida, sem revelar o motivo. */
14
+ function deny(ctx, scheme, realm) {
15
+ ctx.res.setHeader('WWW-Authenticate', `${scheme} realm=${quote(realm)}${scheme === 'Basic' ? ', charset="UTF-8"' : ''}`);
16
+ throw new HttpError(401, 'Unauthorized', 'UNAUTHORIZED');
17
+ }
18
+ function credentials(ctx, scheme) {
19
+ const header = ctx.get('authorization');
20
+ if (!header)
21
+ return undefined;
22
+ const space = header.indexOf(' ');
23
+ if (space === -1 || header.slice(0, space).toLowerCase() !== scheme.toLowerCase())
24
+ return undefined;
25
+ return header.slice(space + 1).trim() || undefined;
26
+ }
27
+ function accept(ctx, user) {
28
+ if (user === true)
29
+ return true;
30
+ ctx.state.user = user;
31
+ return true;
32
+ }
33
+ /**
34
+ * Guard de `Authorization: Bearer <token>` (S-10). Sem token, ou com token recusado, responde 401 com
35
+ * `WWW-Authenticate`. O usuário devolvido pelo `verify` fica em `ctx.state.user`.
36
+ *
37
+ * ```ts
38
+ * const auth = bearerAuth({ verify: (token) => sessions.get(token) });
39
+ * app.group({ guards: [auth] }, (g) => g.mount(UserRoutes));
40
+ * ```
41
+ */
42
+ export function bearerAuth(opts) {
43
+ const realm = opts.realm ?? 'api';
44
+ return async (ctx) => {
45
+ const token = credentials(ctx, 'Bearer');
46
+ if (!token)
47
+ deny(ctx, 'Bearer', realm);
48
+ const user = await opts.verify(token, ctx);
49
+ if (user === false || user === null || user === undefined)
50
+ deny(ctx, 'Bearer', realm);
51
+ return accept(ctx, user);
52
+ };
53
+ }
54
+ /**
55
+ * Guard de `Authorization: Basic` (S-10), para painéis internos e integrações simples. Use só sobre
56
+ * HTTPS: a senha vai em base64, que não é criptografia.
57
+ */
58
+ export function basicAuth(opts) {
59
+ const realm = opts.realm ?? 'api';
60
+ return async (ctx) => {
61
+ const encoded = credentials(ctx, 'Basic');
62
+ if (!encoded)
63
+ deny(ctx, 'Basic', realm);
64
+ const decoded = Buffer.from(encoded, 'base64').toString('utf8');
65
+ const colon = decoded.indexOf(':');
66
+ if (colon === -1)
67
+ deny(ctx, 'Basic', realm);
68
+ const user = await opts.verify(decoded.slice(0, colon), decoded.slice(colon + 1), ctx);
69
+ if (user === false || user === null || user === undefined)
70
+ deny(ctx, 'Basic', realm);
71
+ return accept(ctx, user);
72
+ };
73
+ }
74
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/middlewares/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { Middleware } from '../core/compose.ts';
2
+ export type CorsOrigin = '*' | string | RegExp | readonly (string | RegExp)[] | ((origin: string) => boolean | Promise<boolean>);
3
+ export interface CorsOptions {
4
+ /**
5
+ * Origens permitidas. Obrigatório: não existe default permissivo.
6
+ * - `'https://app.exemplo.com'`: igualdade exata depois de normalizar (esquema, host e porta);
7
+ * - `'https://*.exemplo.dev'`: só subdomínios, nunca o domínio em si nem `exemplo.dev.atacante.com`;
8
+ * - RegExp: precisa casar a origem **inteira** (como se tivesse `^…$`); prefira o curinga;
9
+ * - função: lógica própria, sob sua responsabilidade.
10
+ */
11
+ origin: CorsOrigin;
12
+ methods?: readonly string[];
13
+ allowedHeaders?: readonly string[];
14
+ exposedHeaders?: readonly string[];
15
+ /** Envia `Access-Control-Allow-Credentials: true`. Proibido com `origin: '*'`. */
16
+ credentials?: boolean;
17
+ /** Cache do preflight em segundos. Padrão: 600. */
18
+ maxAge?: number;
19
+ }
20
+ /**
21
+ * Middleware de CORS (S-01). Uso: `app.use(cors({ origin: 'https://app.exemplo.com' }))`.
22
+ *
23
+ * - Preflight (`OPTIONS` + `Access-Control-Request-Method`) é respondido com 204.
24
+ * - A origem só é refletida se estiver na lista permitida; `Vary: Origin` sempre que
25
+ * a resposta depende da origem.
26
+ * - `origin: '*'` + `credentials: true` é rejeitado na criação (o navegador também recusaria,
27
+ * e refletir qualquer origem com credenciais permitiria que qualquer site lesse dados do usuário).
28
+ */
29
+ export declare function cors(opts: CorsOptions): Middleware;
30
+ //# sourceMappingURL=cors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cors.d.ts","sourceRoot":"","sources":["../../src/middlewares/cors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGrD,MAAM,MAAM,UAAU,GAAG,GAAG,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;AAEjI,MAAM,WAAW,WAAW;IAC1B;;;;;;OAMG;IACH,MAAM,EAAE,UAAU,CAAC;IACnB,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,kFAAkF;IAClF,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,mDAAmD;IACnD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAKD;;;;;;;;GAQG;AACH,wBAAgB,IAAI,CAAC,IAAI,EAAE,WAAW,GAAG,UAAU,CA0ClD"}
@@ -0,0 +1,69 @@
1
+ import { compileOriginMatcher } from '../utils/origin-match.js';
2
+ const DEFAULT_METHODS = ['GET', 'HEAD', 'POST', 'PUT', 'PATCH', 'DELETE'];
3
+ const DEFAULT_HEADERS = ['Content-Type', 'Authorization'];
4
+ /**
5
+ * Middleware de CORS (S-01). Uso: `app.use(cors({ origin: 'https://app.exemplo.com' }))`.
6
+ *
7
+ * - Preflight (`OPTIONS` + `Access-Control-Request-Method`) é respondido com 204.
8
+ * - A origem só é refletida se estiver na lista permitida; `Vary: Origin` sempre que
9
+ * a resposta depende da origem.
10
+ * - `origin: '*'` + `credentials: true` é rejeitado na criação (o navegador também recusaria,
11
+ * e refletir qualquer origem com credenciais permitiria que qualquer site lesse dados do usuário).
12
+ */
13
+ export function cors(opts) {
14
+ if (opts.origin === '*' && opts.credentials) {
15
+ throw new Error("cors: `origin: '*'` cannot be combined with `credentials: true`. List the allowed origins.");
16
+ }
17
+ const wildcard = opts.origin === '*';
18
+ // `'*'` não passa pelo compilador de regras: é o modo "qualquer origem", tratado à parte.
19
+ const isAllowed = wildcard ? () => true : buildMatcher(opts.origin);
20
+ const methods = (opts.methods ?? DEFAULT_METHODS).join(', ');
21
+ const allowedHeaders = opts.allowedHeaders?.join(', ');
22
+ const exposed = opts.exposedHeaders?.join(', ');
23
+ const maxAge = String(opts.maxAge ?? 600);
24
+ return async (ctx, next) => {
25
+ const origin = ctx.req.headers.origin;
26
+ const res = ctx.res;
27
+ if (!wildcard)
28
+ res.appendHeader('Vary', 'Origin');
29
+ const preflight = ctx.method === 'OPTIONS' && ctx.req.headers['access-control-request-method'] !== undefined;
30
+ if (!origin)
31
+ return preflight ? void ctx.status(204).res.end() : next();
32
+ const allowed = wildcard || (await isAllowed(origin));
33
+ if (!allowed) {
34
+ // Sem headers CORS o navegador bloqueia a leitura; a requisição em si segue normalmente.
35
+ return preflight ? void ctx.status(204).res.end() : next();
36
+ }
37
+ res.setHeader('Access-Control-Allow-Origin', wildcard ? '*' : origin);
38
+ if (opts.credentials)
39
+ res.setHeader('Access-Control-Allow-Credentials', 'true');
40
+ if (preflight) {
41
+ res.setHeader('Access-Control-Allow-Methods', methods);
42
+ const requested = ctx.req.headers['access-control-request-headers'];
43
+ const headers = allowedHeaders ?? (typeof requested === 'string' ? filterHeaders(requested) : DEFAULT_HEADERS.join(', '));
44
+ if (headers)
45
+ res.setHeader('Access-Control-Allow-Headers', headers);
46
+ res.setHeader('Access-Control-Max-Age', maxAge);
47
+ return void ctx.status(204).res.end();
48
+ }
49
+ if (exposed)
50
+ res.setHeader('Access-Control-Expose-Headers', exposed);
51
+ await next();
52
+ };
53
+ }
54
+ /** Sem lista explícita, aceita apenas os headers padrão entre os pedidos pelo navegador. */
55
+ function filterHeaders(requested) {
56
+ const safe = new Set(DEFAULT_HEADERS.map((h) => h.toLowerCase()));
57
+ return requested
58
+ .split(',')
59
+ .map((h) => h.trim())
60
+ .filter((h) => safe.has(h.toLowerCase()))
61
+ .join(', ');
62
+ }
63
+ function buildMatcher(origin) {
64
+ if (typeof origin === 'function')
65
+ return origin;
66
+ const list = Array.isArray(origin) ? origin : [origin];
67
+ return compileOriginMatcher(list);
68
+ }
69
+ //# sourceMappingURL=cors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cors.js","sourceRoot":"","sources":["../../src/middlewares/cors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import type { Middleware } from '../core/compose.ts';
2
+ import { type CookieOptions } from '../utils/cookie.ts';
3
+ import { type MatchRule } from '../utils/origin-match.ts';
4
+ declare module '../core/context.ts' {
5
+ interface ContextState {
6
+ /** Token CSRF da requisição, com `csrf({ token: true })`. Envie-o ao front no header configurado. */
7
+ csrfToken?: string;
8
+ }
9
+ }
10
+ export interface CsrfTokenOptions {
11
+ /** Padrão: `'__Host-csrf'`, que não pode ser definido por subdomínios. */
12
+ cookieName?: string;
13
+ /** Header onde o cliente devolve o token. Padrão: `'X-CSRF-Token'`. */
14
+ headerName?: string;
15
+ /** Atributos do cookie. `httpOnly` é sempre `false` (o front precisa ler) e `SameSite` padrão é `Strict`. */
16
+ cookie?: Omit<CookieOptions, 'httpOnly'>;
17
+ }
18
+ export interface CsrfOptions {
19
+ /**
20
+ * Outras origens confiáveis além da própria (`ctx.protocol://ctx.host`), com as mesmas regras do
21
+ * `cors()`: `'https://app.exemplo.com'`, `'https://*.exemplo.dev'` ou RegExp de casamento inteiro.
22
+ */
23
+ trustedOrigins?: readonly MatchRule[];
24
+ /** Ativa também o double-submit token. `true` usa os padrões de {@link CsrfTokenOptions}. */
25
+ token?: boolean | CsrfTokenOptions;
26
+ }
27
+ /**
28
+ * Proteção contra CSRF. Use sempre que a autenticação for por cookie.
29
+ *
30
+ * Métodos que alteram estado (todos menos GET, HEAD e OPTIONS) são recusados com 403 quando vêm de
31
+ * outra origem:
32
+ * 1. `Sec-Fetch-Site: same-origin` ou `none` (navegação do próprio usuário) passa; `same-site` e
33
+ * `cross-site` só passam se o `Origin` estiver em `trustedOrigins`;
34
+ * 2. sem `Sec-Fetch-Site`, o `Origin` precisa ser a própria origem ou uma confiável;
35
+ * 3. sem nenhum dos dois, a requisição não veio de um navegador (curl, servidor a servidor) e passa,
36
+ * porque CSRF depende de um navegador que anexe os cookies da vítima.
37
+ *
38
+ * Com `token`, além disso, exige o double-submit: o valor do header deve ser igual ao do cookie.
39
+ * Por isso, rotas GET nunca devem alterar estado.
40
+ */
41
+ export declare function csrf(opts?: CsrfOptions): Middleware;
42
+ //# sourceMappingURL=csrf.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"csrf.d.ts","sourceRoot":"","sources":["../../src/middlewares/csrf.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGrD,OAAO,EAAmB,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACzE,OAAO,EAAyC,KAAK,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAEjG,OAAO,QAAQ,oBAAoB,CAAC;IAClC,UAAU,YAAY;QACpB,qGAAqG;QACrG,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB;CACF;AAED,MAAM,WAAW,gBAAgB;IAC/B,0EAA0E;IAC1E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uEAAuE;IACvE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,6GAA6G;IAC7G,MAAM,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;CAC1C;AAED,MAAM,WAAW,WAAW;IAC1B;;;OAGG;IACH,cAAc,CAAC,EAAE,SAAS,SAAS,EAAE,CAAC;IACtC,6FAA6F;IAC7F,KAAK,CAAC,EAAE,OAAO,GAAG,gBAAgB,CAAC;CACpC;AAID;;;;;;;;;;;;;GAaG;AACH,wBAAgB,IAAI,CAAC,IAAI,GAAE,WAAgB,GAAG,UAAU,CAgCvD"}
@@ -0,0 +1,70 @@
1
+ import { randomBytes, timingSafeEqual } from 'node:crypto';
2
+ import { HttpError } from '../core/errors.js';
3
+ import { serializeCookie } from '../utils/cookie.js';
4
+ import { compileOriginMatcher, normalizeOrigin } from '../utils/origin-match.js';
5
+ const SAFE_METHODS = new Set(['GET', 'HEAD', 'OPTIONS']);
6
+ /**
7
+ * Proteção contra CSRF. Use sempre que a autenticação for por cookie.
8
+ *
9
+ * Métodos que alteram estado (todos menos GET, HEAD e OPTIONS) são recusados com 403 quando vêm de
10
+ * outra origem:
11
+ * 1. `Sec-Fetch-Site: same-origin` ou `none` (navegação do próprio usuário) passa; `same-site` e
12
+ * `cross-site` só passam se o `Origin` estiver em `trustedOrigins`;
13
+ * 2. sem `Sec-Fetch-Site`, o `Origin` precisa ser a própria origem ou uma confiável;
14
+ * 3. sem nenhum dos dois, a requisição não veio de um navegador (curl, servidor a servidor) e passa,
15
+ * porque CSRF depende de um navegador que anexe os cookies da vítima.
16
+ *
17
+ * Com `token`, além disso, exige o double-submit: o valor do header deve ser igual ao do cookie.
18
+ * Por isso, rotas GET nunca devem alterar estado.
19
+ */
20
+ export function csrf(opts = {}) {
21
+ const trusted = compileOriginMatcher(opts.trustedOrigins ?? []);
22
+ const token = opts.token ? (opts.token === true ? {} : opts.token) : undefined;
23
+ const cookieName = token?.cookieName ?? '__Host-csrf';
24
+ const headerName = (token?.headerName ?? 'X-CSRF-Token').toLowerCase();
25
+ const cookieOpts = { sameSite: 'Strict', ...token?.cookie, httpOnly: false };
26
+ // Valida nome e atributos já na criação, e não na primeira requisição.
27
+ if (token)
28
+ serializeCookie(cookieName, 'x', cookieOpts);
29
+ return async (ctx, next) => {
30
+ const safe = SAFE_METHODS.has(ctx.method);
31
+ if (!safe && !originAllowed(ctx, trusted)) {
32
+ throw new HttpError(403, 'Cross-origin request blocked', 'CSRF_ORIGIN');
33
+ }
34
+ if (token) {
35
+ const current = ctx.cookies[cookieName];
36
+ if (!safe) {
37
+ const sent = ctx.get(headerName);
38
+ if (!current || !sent || !equal(current, sent)) {
39
+ throw new HttpError(403, 'Invalid CSRF token', 'CSRF_TOKEN');
40
+ }
41
+ }
42
+ if (current && current.length >= 32) {
43
+ ctx.state.csrfToken = current;
44
+ }
45
+ else {
46
+ ctx.state.csrfToken = randomBytes(32).toString('base64url');
47
+ ctx.setCookie(cookieName, ctx.state.csrfToken, cookieOpts);
48
+ }
49
+ }
50
+ await next();
51
+ };
52
+ }
53
+ function originAllowed(ctx, trusted) {
54
+ const origin = ctx.get('origin');
55
+ const site = ctx.get('sec-fetch-site');
56
+ if (site === 'same-origin' || site === 'none')
57
+ return true;
58
+ if (site !== undefined)
59
+ return origin !== undefined && trusted(origin);
60
+ if (origin === undefined)
61
+ return true;
62
+ const own = ctx.host ? normalizeOrigin(`${ctx.protocol}://${ctx.host}`) : undefined;
63
+ return (own !== undefined && normalizeOrigin(origin) === own) || trusted(origin);
64
+ }
65
+ function equal(a, b) {
66
+ const x = Buffer.from(a);
67
+ const y = Buffer.from(b);
68
+ return x.length === y.length && timingSafeEqual(x, y);
69
+ }
70
+ //# sourceMappingURL=csrf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"csrf.js","sourceRoot":"","sources":["../../src/middlewares/csrf.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export { cors, type CorsOptions, type CorsOrigin } from './cors.ts';
2
+ export { MemoryRateLimitStore, rateLimit, type RateLimitOptions, type RateLimitStore } from './rate-limit.ts';
3
+ export { buildSecurityHeaders, type SecurityHeadersOptions, type SecurityPreset } from './security-headers.ts';
4
+ export { csrf, type CsrfOptions, type CsrfTokenOptions } from './csrf.ts';
5
+ export { basicAuth, bearerAuth, safeEqual, type BasicAuthOptions, type BearerAuthOptions } from './auth.ts';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/middlewares/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,MAAM,WAAW,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,SAAS,EAAE,KAAK,gBAAgB,EAAE,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAC9G,OAAO,EAAE,oBAAoB,EAAE,KAAK,sBAAsB,EAAE,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC/G,OAAO,EAAE,IAAI,EAAE,KAAK,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC1E,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,gBAAgB,EAAE,KAAK,iBAAiB,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,6 @@
1
+ export { cors } from './cors.js';
2
+ export { MemoryRateLimitStore, rateLimit } from './rate-limit.js';
3
+ export { buildSecurityHeaders } from './security-headers.js';
4
+ export { csrf } from './csrf.js';
5
+ export { basicAuth, bearerAuth, safeEqual } from './auth.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/middlewares/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAqC,MAAM,WAAW,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,SAAS,EAA8C,MAAM,iBAAiB,CAAC;AAC9G,OAAO,EAAE,oBAAoB,EAAoD,MAAM,uBAAuB,CAAC;AAC/G,OAAO,EAAE,IAAI,EAA2C,MAAM,WAAW,CAAC;AAC1E,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAiD,MAAM,WAAW,CAAC"}