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,151 @@
1
+ import { readOwnMetadata } from './metadata.js';
2
+ import { joinPaths, pathParams } from '../utils/path.js';
3
+ import { compileRouteHost } from '../utils/origin-match.js';
4
+ import { concatHooks, emptyHooks, hookOptions, routeHooks } from './hooks.js';
5
+ export function compileHostOption(host) {
6
+ if (host === undefined)
7
+ return [];
8
+ const list = Array.isArray(host) ? host : [host];
9
+ if (list.length === 0)
10
+ throw new Error('[flowing] host: the list cannot be empty.');
11
+ return list.map(compileRouteHost);
12
+ }
13
+ export const ROOT_SCOPE = { prefix: '', middlewares: [], guards: [], hooks: emptyHooks(), hosts: [] };
14
+ /** Host herdado do grupo ou definido aqui; os dois ao mesmo tempo seria ambíguo (F-35). */
15
+ function scopedHosts(where, inherited, own) {
16
+ if (own === undefined)
17
+ return inherited;
18
+ if (inherited.length > 0) {
19
+ throw new Error(`[flowing] ${where}: "host" is already set by an outer group (${inherited.map((h) => h.label).join(', ')}); ` +
20
+ 'set it in only one place.');
21
+ }
22
+ return compileHostOption(own);
23
+ }
24
+ /** Prefixo de um grupo dentro de outro, sem barras duplicadas; vazio não altera nada. */
25
+ export function joinPrefix(outer, inner) {
26
+ if (!outer)
27
+ return inner;
28
+ if (!inner)
29
+ return outer;
30
+ return joinPaths(outer, inner);
31
+ }
32
+ /** Escopo de um grupo aninhado em `parent`. */
33
+ export function childScope(parent, opts) {
34
+ return {
35
+ token: { open: true },
36
+ hosts: scopedHosts('app.group()', parent.hosts, opts.host),
37
+ prefix: joinPrefix(parent.prefix, opts.prefix ?? ''),
38
+ middlewares: [...parent.middlewares, ...(opts.middlewares ?? [])],
39
+ guards: [...parent.guards, ...(opts.guards ?? [])],
40
+ hooks: concatHooks(parent.hooks, hookOptions(opts.hooks)),
41
+ };
42
+ }
43
+ export function createGroup(ref, options = {}, scope = ROOT_SCOPE) {
44
+ const isClass = typeof ref === 'function';
45
+ const Class = (isClass ? ref : ref.constructor);
46
+ const meta = readOwnMetadata(Class);
47
+ if (!meta?.isRouter) {
48
+ throw new Error(`[flowing] Class ${Class.name} is not decorated with @Router('/prefix'). ` + `Add it to register the class with app.mount().`);
49
+ }
50
+ if (options.only && options.except) {
51
+ throw new Error(`[flowing] app.mount(${Class.name}): use either "only" or "except", not both.`);
52
+ }
53
+ // Instâncias permitem injetar dependências pelo construtor: app.mount(new UserRoutes(repo))
54
+ const instance = isClass ? new Class() : ref;
55
+ const hosts = scopedHosts(`app.mount(${Class.name})`, scope.hosts, options.host);
56
+ return { name: Class.name, instance, meta, prefix: joinPrefix(scope.prefix, options.prefix ?? meta.prefix), options, scope, hosts };
57
+ }
58
+ /** Rotas declaradas na classe (`@Get`, `@Post`…), filtradas por `only`/`except` e `auto`. */
59
+ export function compileAutoRoutes(group) {
60
+ const { meta, options } = group;
61
+ if (options.auto === false)
62
+ return [];
63
+ const declared = [...meta.methods].filter(([, m]) => m.method && m.path).map(([name]) => name);
64
+ const pick = (selector, label) => new Set(selector(group.instance).map((fn) => resolveMethod(group, fn, label, declared)));
65
+ const excluded = options.except ? pick(options.except, 'except') : new Set();
66
+ const selected = options.only ? pick(options.only, 'only') : new Set(declared.filter((n) => !excluded.has(n)));
67
+ return declared
68
+ .filter((name) => selected.has(name))
69
+ .map((name) => {
70
+ const m = meta.methods.get(name);
71
+ return buildRoute(group, name, m, m.method, m.path);
72
+ });
73
+ }
74
+ /** Rota mapeada no app: `.get('/legacy/:id', (r) => r.getUser, opts)` (F-30). */
75
+ export function compileManualRoute(group, httpMethod, path, selector, options = {}) {
76
+ const name = resolveMethod(group, selector(group.instance), `.${httpMethod.toLowerCase()}('${path}')`);
77
+ return buildRoute(group, name, group.meta.methods.get(name), httpMethod, path, options);
78
+ }
79
+ function buildRoute(group, name, methodMeta, httpMethod, path, manual = {}) {
80
+ const fn = group.instance[name];
81
+ const { meta, options, instance, scope } = group;
82
+ const fullPath = joinPaths(group.prefix, path);
83
+ checkPath(`${group.name}.${String(name)}`, httpMethod, fullPath, methodMeta.schemas.params);
84
+ return {
85
+ method: httpMethod,
86
+ path: fullPath,
87
+ owner: group.name,
88
+ handlerName: String(name),
89
+ hosts: group.hosts,
90
+ handler: (ctx) => fn.call(instance, ctx),
91
+ schemas: methodMeta.schemas,
92
+ // Ordem: grupos → mount → classe → método → rota manual (F-01, F-28, F-30)
93
+ middlewares: [
94
+ ...scope.middlewares,
95
+ ...(options.middlewares ?? []),
96
+ ...meta.middlewares,
97
+ ...methodMeta.middlewares,
98
+ ...(manual.middlewares ?? []),
99
+ ],
100
+ guards: [...scope.guards, ...(options.guards ?? []), ...meta.guards, ...methodMeta.guards, ...(manual.guards ?? [])],
101
+ hooks: routeHooks(concatHooks(scope.hooks, hookOptions(options.hooks), meta.hooks, methodMeta.hooks, hookOptions(manual.hooks))),
102
+ };
103
+ }
104
+ /**
105
+ * Descobre o nome do método a partir da função devolvida pelo seletor.
106
+ * Só aceita métodos com algum decorator do FlowingTS (a "permissão" no nível do método).
107
+ */
108
+ function resolveMethod(group, fn, where, allowed = [...group.meta.methods.keys()]) {
109
+ const target = group.instance;
110
+ const name = typeof fn === 'function' ? allowed.find((n) => target[n] === fn) : undefined;
111
+ if (name !== undefined)
112
+ return name;
113
+ const label = typeof fn === 'function' && fn.name ? `"${fn.name}"` : 'the selected value';
114
+ const available = allowed.map(String).join(', ') || '(none)';
115
+ const decorated = typeof fn === 'function' && [...group.meta.methods.keys()].some((n) => target[n] === fn);
116
+ const isMethod = typeof fn === 'function' && Object.values(Object.getOwnPropertyDescriptors(Object.getPrototypeOf(target))).some((d) => d.value === fn);
117
+ const reason = decorated
118
+ ? `${label} has no HTTP verb decorator, so it is not an automatic route; map it manually with .get()/.post()…`
119
+ : isMethod
120
+ ? `${label} has no FlowingTS decorator (@Get, @Schema, @Middlewares, @Guards…), so it cannot be exposed`
121
+ : `${label} is not a method of ${group.name}`;
122
+ const at = where.startsWith('.') ? where : ` ${where}`;
123
+ throw new Error(`[flowing] app.mount(${group.name})${at}: ${reason}. Available: ${available}.`);
124
+ }
125
+ /**
126
+ * Valida o path no registro e confere as chaves do schema de `params` contra os parâmetros do path,
127
+ * já com o prefixo do `@Router`/`mount` (F-29). Schemas sem `properties` (não JSON Schema) não são conferidos.
128
+ */
129
+ function checkPath(where, method, path, params) {
130
+ let names;
131
+ try {
132
+ names = pathParams(path);
133
+ }
134
+ catch (err) {
135
+ throw new Error(`[flowing] ${where} (${method} ${path}): ${err.message}.`);
136
+ }
137
+ const props = params?.properties;
138
+ if (!props || typeof props !== 'object')
139
+ return;
140
+ const keys = Object.keys(props);
141
+ const missing = names.filter((n) => !keys.includes(n));
142
+ const extra = keys.filter((k) => !names.includes(k));
143
+ if (missing.length === 0 && extra.length === 0)
144
+ return;
145
+ const parts = [
146
+ missing.length ? `missing in params schema: ${missing.map((n) => `"${n}"`).join(', ')}` : '',
147
+ extra.length ? `not in path: ${extra.map((n) => `"${n}"`).join(', ')}` : '',
148
+ ].filter(Boolean);
149
+ throw new Error(`[flowing] ${where} (${method} ${path}): params schema does not match the path; ${parts.join('; ')}.`);
150
+ }
151
+ //# sourceMappingURL=compiler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compiler.js","sourceRoot":"","sources":["../../src/core/compiler.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAA4C,MAAM,eAAe,CAAC;AAE1F,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAsC,MAAM,0BAA0B,CAAC;AAChG,OAAO,EAAE,WAAW,EAAE,UAAU,EAAoB,WAAW,EAAmB,UAAU,EAAoB,MAAM,YAAY,CAAC;AAmBnI,MAAM,UAAU,iBAAiB,CAAC,IAA4B;IAC5D,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IAClC,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAiB,CAAC,CAAC;IAC9D,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IACpF,OAAO,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;AACpC,CAAC;AAmED,MAAM,CAAC,MAAM,UAAU,GAAe,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;AAElH,2FAA2F;AAC3F,SAAS,WAAW,CAAC,KAAa,EAAE,SAAmC,EAAE,GAA2B;IAClG,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACxC,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CACb,aAAa,KAAK,8CAA8C,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK;YAC3G,2BAA2B,CAC9B,CAAC;IACJ,CAAC;IACD,OAAO,iBAAiB,CAAC,GAAG,CAAC,CAAC;AAChC,CAAC;AAED,yFAAyF;AACzF,MAAM,UAAU,UAAU,CAAC,KAAa,EAAE,KAAa;IACrD,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACzB,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACzB,OAAO,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AACjC,CAAC;AAED,+CAA+C;AAC/C,MAAM,UAAU,UAAU,CAAC,MAAkB,EAAE,IAAkB;IAC/D,OAAO;QACL,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE;QACrB,KAAK,EAAE,WAAW,CAAC,aAAa,EAAE,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC;QAC1D,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC;QACpD,WAAW,EAAE,CAAC,GAAG,MAAM,CAAC,WAAW,EAAE,GAAG,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;QACjE,MAAM,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;QAClD,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;KAC1D,CAAC;AACJ,CAAC;AAaD,MAAM,UAAU,WAAW,CAAC,GAAc,EAAE,OAAO,GAAiB,EAAE,EAAE,KAAK,GAAe,UAAU;IACpG,MAAM,OAAO,GAAG,OAAO,GAAG,KAAK,UAAU,CAAC;IAC1C,MAAM,KAAK,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAqB,CAAC;IACpE,MAAM,IAAI,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IACpC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CACb,mBAAmB,KAAK,CAAC,IAAI,6CAA6C,GAAG,gDAAgD,CAC9H,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,uBAAuB,KAAK,CAAC,IAAI,6CAA6C,CAAC,CAAC;IAClG,CAAC;IACD,4FAA4F;IAC5F,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;IAC7C,MAAM,KAAK,GAAG,WAAW,CAAC,aAAa,KAAK,CAAC,IAAI,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACjF,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AACtI,CAAC;AAED,6FAA6F;AAC7F,MAAM,UAAU,iBAAiB,CAAC,KAAiB;IACjD,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IAChC,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK;QAAE,OAAO,EAAE,CAAC;IAEtC,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;IAC/F,MAAM,IAAI,GAAG,CAAC,QAAiC,EAAE,KAAa,EAAE,EAAE,CAChE,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,aAAa,CAAC,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;IAE3F,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,EAAmB,CAAC;IAC9F,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE/G,OAAO,QAAQ;SACZ,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;SACpC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACZ,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC;QAClC,OAAO,UAAU,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,MAAO,EAAE,CAAC,CAAC,IAAK,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;AACP,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,kBAAkB,CAChC,KAAiB,EACjB,UAAkB,EAClB,IAAY,EACZ,QAAgC,EAChC,OAAO,GAAuB,EAAE;IAEhC,MAAM,IAAI,GAAG,aAAa,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,IAAI,UAAU,CAAC,WAAW,EAAE,KAAK,IAAI,IAAI,CAAC,CAAC;IACvG,OAAO,UAAU,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAE,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;AAC3F,CAAC;AAED,SAAS,UAAU,CACjB,KAAiB,EACjB,IAAqB,EACrB,UAA0B,EAC1B,UAAkB,EAClB,IAAY,EACZ,MAAM,GAAuB,EAAE;IAE/B,MAAM,EAAE,GAAI,KAAK,CAAC,QAA6C,CAAC,IAAI,CAA8B,CAAC;IACnG,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;IACjD,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC/C,SAAS,CAAC,GAAG,KAAK,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5F,OAAO;QACL,MAAM,EAAE,UAAU;QAClB,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,KAAK,CAAC,IAAI;QACjB,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC;QACzB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,OAAO,EAAE,CAAC,GAAY,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC;QACjD,OAAO,EAAE,UAAU,CAAC,OAAO;QAC3B,2EAA2E;QAC3E,WAAW,EAAE;YACX,GAAG,KAAK,CAAC,WAAW;YACpB,GAAG,CAAC,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC;YAC9B,GAAG,IAAI,CAAC,WAAW;YACnB,GAAG,UAAU,CAAC,WAAW;YACzB,GAAG,CAAC,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC;SAC9B;QACD,MAAM,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;QACpH,KAAK,EAAE,UAAU,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;KACjI,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAS,aAAa,CACpB,KAAiB,EACjB,EAAW,EACX,KAAa,EACb,OAAO,GAAiC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IAEtE,MAAM,MAAM,GAAG,KAAK,CAAC,QAA4C,CAAC;IAClE,MAAM,IAAI,GAAG,OAAO,EAAE,KAAK,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC1F,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAEpC,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,UAAU,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,oBAAoB,CAAC;IAC1F,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC;IAC7D,MAAM,SAAS,GAAG,OAAO,EAAE,KAAK,UAAU,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IAC3G,MAAM,QAAQ,GACZ,OAAO,EAAE,KAAK,UAAU,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,yBAAyB,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC;IACzI,MAAM,MAAM,GAAG,SAAS;QACtB,CAAC,CAAC,GAAG,KAAK,oGAAoG;QAC9G,CAAC,CAAC,QAAQ;YACR,CAAC,CAAC,GAAG,KAAK,8FAA8F;YACxG,CAAC,CAAC,GAAG,KAAK,uBAAuB,KAAK,CAAC,IAAI,EAAE,CAAC;IAClD,MAAM,EAAE,GAAG,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC;IACvD,MAAM,IAAI,KAAK,CAAC,uBAAuB,KAAK,CAAC,IAAI,IAAI,EAAE,KAAK,MAAM,gBAAgB,SAAS,GAAG,CAAC,CAAC;AAClG,CAAC;AAED;;;GAGG;AACH,SAAS,SAAS,CAAC,KAAa,EAAE,MAAc,EAAE,IAAY,EAAE,MAA0B;IACxF,IAAI,KAAe,CAAC;IACpB,IAAI,CAAC;QACH,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,aAAa,KAAK,KAAK,MAAM,IAAI,IAAI,MAAO,GAAa,CAAC,OAAO,GAAG,CAAC,CAAC;IACxF,CAAC;IACD,MAAM,KAAK,GAAI,MAA+C,EAAE,UAAU,CAAC;IAC3E,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO;IAChD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChC,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACvD,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACrD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IACvD,MAAM,KAAK,GAAG;QACZ,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,6BAA6B,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;QAC5F,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,gBAAgB,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;KAC5E,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAClB,MAAM,IAAI,KAAK,CAAC,aAAa,KAAK,KAAK,MAAM,IAAI,IAAI,6CAA6C,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzH,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { Context } from './context.ts';
2
+ export type Middleware = (ctx: Context, next: () => Promise<void>) => Promise<void> | void;
3
+ export declare function compose(ctx: Context, fns: Middleware[]): Promise<void>;
4
+ /** Uma etapa do pipeline: `undefined` quando terminou de forma síncrona, ou a Promise do que é assíncrono. */
5
+ export type Step = Promise<void> | undefined;
6
+ /** Se `value` é uma Promise (ou um thenable), para decidir entre o caminho síncrono e o assíncrono. */
7
+ export declare function isPromiseLike(value: unknown): value is PromiseLike<unknown>;
8
+ /**
9
+ * Cadeia pré-compilada (Chain of Responsibility, F-39): monta, uma vez, a função que executa `fns` no modelo
10
+ * onion e termina em `terminal`. Sem camadas, a cadeia é o próprio terminal, que pode terminar de forma
11
+ * síncrona (F-41). Com camadas, os middlewares são assíncronos por contrato (`await next()`).
12
+ *
13
+ * Como no `compose`, chamar `next()` de novo depois que a cadeia seguinte já rodou não a executa outra vez.
14
+ */
15
+ export declare function compileChain(fns: readonly Middleware[], terminal: (ctx: Context) => Step): (ctx: Context) => Step;
16
+ //# sourceMappingURL=compose.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compose.d.ts","sourceRoot":"","sources":["../../src/core/compose.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C,MAAM,MAAM,UAAU,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAE3F,wBAAsB,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ5E;AAED,8GAA8G;AAC9G,MAAM,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC;AAK7C,uGAAuG;AACvG,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,WAAW,CAAC,OAAO,CAAC,CAI3E;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,SAAS,UAAU,EAAE,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,GAAG,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAejH"}
@@ -0,0 +1,41 @@
1
+ export async function compose(ctx, fns) {
2
+ let i = 0;
3
+ const dispatch = async () => {
4
+ if (i >= fns.length)
5
+ return;
6
+ const fn = fns[i++];
7
+ await fn(ctx, dispatch);
8
+ };
9
+ await dispatch();
10
+ }
11
+ /** Promise já resolvida, compartilhada: `next()` de uma etapa síncrona devolve esta, sem alocar (F-41). */
12
+ const DONE = Promise.resolve();
13
+ /** Se `value` é uma Promise (ou um thenable), para decidir entre o caminho síncrono e o assíncrono. */
14
+ export function isPromiseLike(value) {
15
+ return (value !== null && (typeof value === 'object' || typeof value === 'function') && typeof value.then === 'function');
16
+ }
17
+ /**
18
+ * Cadeia pré-compilada (Chain of Responsibility, F-39): monta, uma vez, a função que executa `fns` no modelo
19
+ * onion e termina em `terminal`. Sem camadas, a cadeia é o próprio terminal, que pode terminar de forma
20
+ * síncrona (F-41). Com camadas, os middlewares são assíncronos por contrato (`await next()`).
21
+ *
22
+ * Como no `compose`, chamar `next()` de novo depois que a cadeia seguinte já rodou não a executa outra vez.
23
+ */
24
+ export function compileChain(fns, terminal) {
25
+ let run = terminal;
26
+ for (let i = fns.length - 1; i >= 0; i--) {
27
+ const fn = fns[i];
28
+ const inner = run;
29
+ run = async (ctx) => {
30
+ let called = false;
31
+ await fn(ctx, () => {
32
+ if (called)
33
+ return DONE;
34
+ called = true;
35
+ return inner(ctx) ?? DONE;
36
+ });
37
+ };
38
+ }
39
+ return run;
40
+ }
41
+ //# sourceMappingURL=compose.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compose.js","sourceRoot":"","sources":["../../src/core/compose.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,GAAY,EAAE,GAAiB;IAC3D,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,MAAM,QAAQ,GAAG,KAAK,IAAmB,EAAE;QACzC,IAAI,CAAC,IAAI,GAAG,CAAC,MAAM;YAAE,OAAO;QAC5B,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,EAAE,CAAE,CAAC;QACrB,MAAM,EAAE,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC1B,CAAC,CAAC;IACF,MAAM,QAAQ,EAAE,CAAC;AACnB,CAAC;AAKD,2GAA2G;AAC3G,MAAM,IAAI,GAAkB,OAAO,CAAC,OAAO,EAAE,CAAC;AAE9C,uGAAuG;AACvG,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,OAAO,CACL,KAAK,KAAK,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,UAAU,CAAC,IAAI,OAAQ,KAA4B,CAAC,IAAI,KAAK,UAAU,CACzI,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,GAA0B,EAAE,QAAgC;IACvF,IAAI,GAAG,GAAG,QAAQ,CAAC;IACnB,KAAK,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAAE,CAAC;QACnB,MAAM,KAAK,GAAG,GAAG,CAAC;QAClB,GAAG,GAAG,KAAK,EAAE,GAAG,EAAE,EAAE;YAClB,IAAI,MAAM,GAAG,KAAK,CAAC;YACnB,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE;gBACjB,IAAI,MAAM;oBAAE,OAAO,IAAI,CAAC;gBACxB,MAAM,GAAG,IAAI,CAAC;gBACd,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;YAC5B,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,290 @@
1
+ import type { IncomingMessage, OutgoingHttpHeader, ServerResponse } from 'node:http';
2
+ import { Readable } from 'node:stream';
3
+ import { type QueryParser } from '../utils/query.ts';
4
+ import { type CookieOptions } from '../utils/cookie.ts';
5
+ import { type Logger } from './logger.ts';
6
+ import type { InferBody, InferParams, InferQuery, InferResponse, ParamsOf } from './infer.ts';
7
+ import type { RouteSchemas } from './metadata.ts';
8
+ import type { FileField, UploadedFile } from './uploads/types.ts';
9
+ import { type ResponsePlan } from './response/pipeline.ts';
10
+ import { type AbortCode, type ErrorPhase } from './abort.ts';
11
+ import type { RouteInfo } from './route-table.ts';
12
+ import { type TraceContext } from '../utils/trace-context.ts';
13
+ import { kAbort, kBindResponse, kContracts, kError, kPendingSend, kPhase, kRawSend, kRoute, kRouted, kTelemetry, kFiles } from './symbols.ts';
14
+ import { type SendFileOptions } from '../server/static.ts';
15
+ import { type SseOptions, type SseStream } from './streaming/sse.ts';
16
+ import { type Contracts } from './contracts.ts';
17
+ export type { SseEvent, SseOptions, SseStream } from './streaming/sse.ts';
18
+ export { kAbort, kBindResponse, kPendingSend, kRawSend } from './symbols.ts';
19
+ type RawBody = string | Uint8Array | Readable;
20
+ /** Corpo e tipo de uma resposta prestes a ser escrita (F-04). */
21
+ export interface SendPayload {
22
+ body: string | Uint8Array;
23
+ contentType: string;
24
+ }
25
+ /**
26
+ * Roda imediatamente antes de escrever uma resposta com corpo (exceto streams), inclusive em
27
+ * erros e 404. É síncrono; pode alterar headers e devolver outro payload (F-04).
28
+ */
29
+ export type OnSendHook = (ctx: Context, payload: SendPayload) => SendPayload | void;
30
+ /** Status aceitos por `ctx.status()`: os declarados no schema de resposta, ou qualquer um sem schema (F-32). */
31
+ export type DeclaredStatus<S extends RouteSchemas> = S['response'] extends Record<number, unknown> ? keyof S['response'] & number : number;
32
+ /** Corpo esperado para o status `St`: o do schema, ou qualquer valor sem schema (F-32). */
33
+ export type BodyFor<S extends RouteSchemas, St extends number> = S['response'] extends Record<number, unknown> ? InferResponse<S, St> : unknown;
34
+ /**
35
+ * Contexto depois de `ctx.status(St)`: `json()` e `send()` exigem o corpo do status escolhido (F-32).
36
+ *
37
+ * ```ts
38
+ * return ctx.status(202).json({ jobId }); // o TypeScript confere o corpo contra o schema do 202
39
+ * ```
40
+ */
41
+ export type StatusContext<S extends RouteSchemas | string, St extends number> = Omit<Context<S>, 'json' | 'send'> & {
42
+ json(body: BodyFor<SchemasOf<S>, St>): Context<S>;
43
+ send(body: BodyFor<SchemasOf<S>, St> | RawBody, contentType?: string): Context<S>;
44
+ };
45
+ /** Um path no lugar dos schemas (`Context<'/:id'>`) equivale a uma rota sem schemas (F-29). */
46
+ export type SchemasOf<S extends RouteSchemas | string> = S extends string ? {} : S;
47
+ /** `ctx.params`: pelo path (`Context<'/:id'>`) ou pelo schema `params`. */
48
+ export type ParamsFor<S extends RouteSchemas | string> = S extends string ? ParamsOf<S> : InferParams<SchemasOf<S>>;
49
+ /**
50
+ * Estado por requisição, compartilhado entre middlewares, guards e handlers.
51
+ * Estenda com declaration merging para ter tipos (F-01):
52
+ *
53
+ * ```ts
54
+ * declare module 'flowingts' {
55
+ * interface ContextState { user?: { id: string; role: 'admin' | 'user' } }
56
+ * }
57
+ * ```
58
+ */
59
+ export interface ContextState {
60
+ [key: string]: unknown;
61
+ }
62
+ export interface ContextOptions {
63
+ queryMaxKeys?: number | undefined;
64
+ /** O motor dos contratos do app (F-27); sem ele, o nativo. */
65
+ contracts?: Contracts | undefined;
66
+ /** Parser de query próprio (F-26); sem ele, o padrão com `queryMaxKeys`. */
67
+ queryParser?: QueryParser | undefined;
68
+ /** Id da requisição; o app gera ou reaproveita o header recebido (F-06). */
69
+ id?: string | undefined;
70
+ /** Logger do app; o contexto cria um filho com o `reqId`. */
71
+ logger?: Logger | undefined;
72
+ /** Confiança nos headers `X-Forwarded-*` (S-09). Padrão: `false`. */
73
+ trustProxy?: boolean | number | undefined;
74
+ /** Hooks `onSend` do app (F-04). */
75
+ onSend?: readonly OnSendHook[] | undefined;
76
+ /**
77
+ * Ids do span desta requisição, para o `ctx.log` (F-38). Quem fornece é o `telemetry`; o `Context` não
78
+ * depende dele.
79
+ */
80
+ spanIds?: ((ctx: Context) => {
81
+ traceId: string;
82
+ spanId: string;
83
+ } | undefined) | undefined;
84
+ /** Avisado quando a resposta vira stream, para o `close()` do app cancelar streams abertos. */
85
+ onStream?: ((ctx: Context) => void) | undefined;
86
+ }
87
+ /**
88
+ * Contexto da requisição. Passe os schemas da rota no genérico para tipar
89
+ * `params`, `query` e `body` a partir do `@Schema` (F-02):
90
+ *
91
+ * ```ts
92
+ * const create = { body: CreateUserSchema, response: { 201: UserSchema } } satisfies RouteSchemas;
93
+ * @Post('/') @Schema(create) createUser(ctx: Context<typeof create>) { ctx.body.name }
94
+ * @Get('/:id') get(ctx: Context<'/:id'>) { ctx.params.id }
95
+ * ```
96
+ */
97
+ /** Arquivo de um campo: obrigatório → sempre presente (F-46). */
98
+ type FileOf<S extends RouteSchemas, K extends string> = NonNullable<S['files']>[K] extends {
99
+ required: true;
100
+ } ? UploadedFile : UploadedFile | undefined;
101
+ export declare class Context<S extends RouteSchemas | string = RouteSchemas> {
102
+ readonly req: IncomingMessage;
103
+ readonly res: ServerResponse;
104
+ readonly method: string;
105
+ readonly path: string;
106
+ /** Id da requisição, também enviado no header `X-Request-Id` (F-06). */
107
+ readonly id: string;
108
+ /** Parâmetros de rota; tipados pelo schema `params` quando informado em `Context<S>`. */
109
+ get params(): ParamsFor<S>;
110
+ set params(value: ParamsFor<S>);
111
+ private routeParams;
112
+ /**
113
+ * A rota que atende esta requisição (F-38): template com o prefixo, classe, método e a regra de host que
114
+ * venceu. `undefined` antes do roteamento e quando nenhuma rota atende (404, 405, healthcheck, OpenAPI).
115
+ * Use `ctx.route.path` como rótulo de métrica, nunca `ctx.path`.
116
+ */
117
+ get route(): RouteInfo | undefined;
118
+ /** @internal */
119
+ [kRoute]: RouteInfo | undefined;
120
+ /** @internal O motor dos contratos do app (F-27). */
121
+ get [kContracts](): Contracts;
122
+ /** @internal Etapa atual do pipeline, para a fase do `onError` (F-38). */
123
+ [kPhase]: ErrorPhase;
124
+ /** @internal A cadeia global chegou ao roteamento (o último middleware chamou `next()`). */
125
+ [kRouted]: boolean;
126
+ /** @internal O erro tratado pelo pipeline de erros, para o `onResponse` (F-38). */
127
+ [kError]: unknown;
128
+ /** @internal Estado do `telemetry` desta requisição; só o módulo do telemetry lê e escreve (F-38). */
129
+ [kTelemetry]: unknown;
130
+ /** @internal Arquivos do upload (F-46); definido só nas rotas com `files`, e então o body veio de um formulário. */
131
+ [kFiles]: ReadonlyMap<string, readonly UploadedFile[]> | undefined;
132
+ /** Query string; tipada pelo schema `query` (já com coerção e defaults aplicados). Lida no primeiro acesso. */
133
+ get query(): InferQuery<SchemasOf<S>>;
134
+ set query(value: InferQuery<SchemasOf<S>>);
135
+ /** URL completa da requisição, com o host validado (S-09). Criada no primeiro acesso. */
136
+ get url(): URL;
137
+ /** Logger da requisição, já com `reqId` (F-06). Criado no primeiro acesso. */
138
+ get log(): Logger;
139
+ /**
140
+ * Contexto de trace W3C recebido no `traceparent` (F-38), já validado: `{ traceId, parentSpanId, sampled,
141
+ * tracestate }`, ou `undefined` se não veio ou é inválido. Os logs do `ctx.log` levam o `traceId`.
142
+ */
143
+ get trace(): TraceContext | undefined;
144
+ private traceContext;
145
+ /**
146
+ * Configuração do app, **a mesma referência** para todas as requisições (Flyweight, F-41): o `Context` lê
147
+ * dela em vez de copiar `trustProxy`, `onSend`, `queryMaxKeys` e o logger campo a campo.
148
+ */
149
+ private readonly opts;
150
+ private readonly target;
151
+ private parsedQuery;
152
+ private fullUrl;
153
+ private requestLog;
154
+ private memoHost;
155
+ private memoHostname;
156
+ private memoProtocol;
157
+ /**
158
+ * Um arquivo do upload, já recebido e validado pelo contrato `files` (F-46). Com `required: true`, nunca é
159
+ * `undefined`. Para campos com `maxCount` maior que 1, use `files()`.
160
+ */
161
+ file<K extends FileField<SchemasOf<S>>>(name: K): FileOf<SchemasOf<S>, K>;
162
+ /** Todos os arquivos de um campo do upload (F-46), na ordem em que chegaram; vazio se nenhum veio. */
163
+ files<K extends FileField<SchemasOf<S>>>(name: K): readonly UploadedFile[];
164
+ /** Body; tipado pelo schema `body`. */
165
+ body: InferBody<SchemasOf<S>>;
166
+ /** Estado por requisição, criado no primeiro acesso (F-41). */
167
+ get state(): ContextState;
168
+ set state(value: ContextState);
169
+ private requestState;
170
+ /** `true` quando o handler chamou `ctx.status()`. Usado para escolher o schema de resposta (B-05). */
171
+ statusExplicit: boolean;
172
+ private streaming;
173
+ private abortController;
174
+ /**
175
+ * Cancelado quando o cliente desconecta antes do fim da resposta, ou quando o app está encerrando
176
+ * (F-13). Passe para consultas e `fetch` longos: `db.query(sql, { signal: ctx.signal })`.
177
+ */
178
+ get signal(): AbortSignal;
179
+ /**
180
+ * Por que esta requisição foi cancelada (`CLIENT_DISCONNECTED`, `SHUTDOWN`), ou `undefined` se não foi.
181
+ * Atalho tipado para `ctx.signal.reason.code` (F-38).
182
+ */
183
+ get abortReason(): AbortCode | undefined;
184
+ /** @internal `true` em respostas de streaming (SSE, NDJSON, `Readable`) já iniciadas. */
185
+ get streamingResponse(): boolean;
186
+ private markStreaming;
187
+ /** @internal */
188
+ [kAbort](code: AbortCode): void;
189
+ /**
190
+ * Abre uma conexão de Server-Sent Events (F-13). A resposta fica aberta até `close()`, a desconexão do
191
+ * cliente ou o encerramento do app, que fecha estas conexões primeiro para o shutdown não esperar por elas.
192
+ *
193
+ * ```ts
194
+ * const stream = ctx.sse();
195
+ * const off = bus.on('order', (o) => stream.send({ event: 'order', id: o.id, data: o }));
196
+ * stream.onClose(off);
197
+ * ```
198
+ */
199
+ sse(opts?: SseOptions): SseStream;
200
+ /**
201
+ * Envia um arquivo com `Content-Type`, `ETag`/`Last-Modified` (304) e `Range` (206), em stream (F-13).
202
+ * Com `root`, o path é relativo e não pode sair dela; sem `root`, precisa ser absoluto.
203
+ * Arquivo inexistente responde 404.
204
+ */
205
+ sendFile(path: string, opts?: SendFileOptions): Promise<void>;
206
+ /** @internal */
207
+ [kPendingSend]: Promise<void> | undefined;
208
+ /**
209
+ * Corpo exatamente como foi escrito (F-04), depois do envio. Fica `undefined` em streams e em
210
+ * respostas sem corpo. Útil para cache: `await next(); store.set(key, ctx.sentBody)`.
211
+ */
212
+ get sentBody(): Buffer | undefined;
213
+ set sentBody(value: Buffer | undefined);
214
+ private sentRaw;
215
+ private sentBuffer;
216
+ /** `Content-Type` da resposta enviada, junto com `sentBody`. */
217
+ sentType: string | undefined;
218
+ private bound;
219
+ /**
220
+ * @param opts configuração; o app passa **o mesmo objeto** para todas as requisições (Flyweight), e o
221
+ * que muda por requisição (`id`) vem à parte.
222
+ */
223
+ constructor(req: IncomingMessage, res: ServerResponse, opts?: ContextOptions, id?: string);
224
+ /**
225
+ * IP do cliente. Por padrão, o do socket. Com `trustProxy`, vem do `X-Forwarded-For`, que só deve
226
+ * ser ligado atrás de um proxy que reescreve esse header (S-09).
227
+ */
228
+ get ip(): string;
229
+ /**
230
+ * Host da requisição (`api.exemplo.com:8080`), **validado**: um valor inválido vira `''`.
231
+ * Com `trustProxy`, vem do `X-Forwarded-Host`. Para links absolutos, prefira uma URL base
232
+ * configurada em vez do host pedido pelo cliente (S-09).
233
+ */
234
+ get host(): string;
235
+ /** `host` sem a porta. */
236
+ get hostname(): string;
237
+ /** `https` se a conexão for TLS ou, com `trustProxy`, se o `X-Forwarded-Proto` disser; senão `http`. */
238
+ get protocol(): 'http' | 'https';
239
+ /**
240
+ * Define o status. Com schemas de resposta, aceita só os status declarados e o encadeamento tipa o
241
+ * corpo: `ctx.status(202).json({ jobId })` (F-32).
242
+ */
243
+ status<const St extends DeclaredStatus<SchemasOf<S>>>(code: St): StatusContext<S, St>;
244
+ /**
245
+ * `true` quando a resposta já foi enviada (ou está sendo, no caso de streams).
246
+ * Depois disso o framework não escreve mais nada na resposta.
247
+ */
248
+ get sent(): boolean;
249
+ /** Lê um header da requisição (case-insensitive). Headers repetidos são unidos com `, `. */
250
+ get(name: string): string | undefined;
251
+ private parsedCookies;
252
+ /** Cookies da requisição (objeto sem protótipo; em nomes repetidos vale o primeiro). */
253
+ get cookies(): Readonly<Record<string, string>>;
254
+ /**
255
+ * Adiciona um `Set-Cookie`. Padrões: `HttpOnly`, `Secure`, `SameSite=Lax` e `Path=/`.
256
+ * Se usar cookies para autenticar, ative também o middleware `csrf()`.
257
+ */
258
+ setCookie(name: string, value: string, opts?: CookieOptions): this;
259
+ /** Remove um cookie. Informe o mesmo `path` e `domain` usados ao criá-lo. */
260
+ clearCookie(name: string, opts?: Omit<CookieOptions, 'maxAge' | 'expires'>): this;
261
+ /** Define um header da resposta. */
262
+ header(name: string, value: OutgoingHttpHeader): this;
263
+ /**
264
+ * Envia JSON. No handler, passa pelo mesmo pipeline do `return`: schema do status, remoção de
265
+ * campos não declarados e status padrão (F-32).
266
+ */
267
+ json(data: unknown): this;
268
+ /** Resposta em texto puro (`text/plain; charset=utf-8`), pelo mesmo pipeline do `return`. */
269
+ text(data: string): this;
270
+ /**
271
+ * Envia o corpo pelo mesmo pipeline do `return` (F-32): com `contentType` informado, usa esse tipo;
272
+ * senão, a negociação do `Accept` ou o tipo do valor (string, Buffer, stream, objeto → JSON).
273
+ * Para HTML, faça o escape do conteúdo dinâmico antes: o framework não faz isso por você (S-02).
274
+ */
275
+ send(body: unknown, contentType?: string): this;
276
+ private dispatch;
277
+ /** @internal Liga os schemas de resposta da rota (o app chama antes do handler). */
278
+ [kBindResponse](plan: ResponsePlan): void;
279
+ /** @internal Envio cru, sem schema: string, bytes ou stream. */
280
+ [kRawSend](body: RawBody, contentType?: string): this;
281
+ /** Aplica os `onSend` do app e depois os da rota (F-43); se algum lançar, loga e envia o payload original (F-04). */
282
+ private runOnSend;
283
+ /**
284
+ * Redireciona (padrão 302). Não use `url` vinda do usuário sem validar: isso abre um
285
+ * open redirect. Prefira caminhos relativos ou uma lista de destinos permitidos.
286
+ */
287
+ redirect(url: string, status?: 301 | 302 | 303 | 307 | 308): this;
288
+ throw(status: number, message: string, code?: string): never;
289
+ }
290
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/core/context.ts"],"names":[],"mappings":"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"}