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 @@
1
+ {"version":3,"file":"request-target.js","sourceRoot":"","sources":["../../src/utils/request-target.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * `JSON.parse` contra prototype pollution (S-08).
3
+ *
4
+ * O `JSON.parse` cria `"__proto__"` como propriedade própria, o que é inofensivo sozinho. O risco
5
+ * aparece depois, quando o objeto passa por um merge recursivo ou por `Object.assign` em código do
6
+ * usuário ou de bibliotecas. Por isso, o body é conferido logo na entrada:
7
+ * - `__proto__` em qualquer nível;
8
+ * - `constructor` cujo valor é um objeto com `prototype` (o outro caminho até o protótipo).
9
+ *
10
+ * A conferência só percorre o objeto quando o texto pode conter essas chaves, inclusive com escapes
11
+ * `\u`. Bodies comuns seguem pelo caminho rápido.
12
+ */
13
+ export type ProtoPoisoning = 'error' | 'remove';
14
+ export declare class ProtoPoisoningError extends Error {
15
+ readonly key: string;
16
+ constructor(key: string);
17
+ }
18
+ export declare function parseJson(text: string, mode?: ProtoPoisoning): unknown;
19
+ /**
20
+ * A mesma proteção do `parseJson` (S-08) para o valor de um parser próprio (F-12). Diferente do JSON, um parser
21
+ * (YAML com âncoras, por exemplo) pode devolver referências repetidas ou circulares: cada objeto é visitado uma vez.
22
+ */
23
+ export declare function scrubParsed(root: unknown, mode?: ProtoPoisoning): void;
24
+ //# sourceMappingURL=safe-json.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safe-json.d.ts","sourceRoot":"","sources":["../../src/utils/safe-json.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEhD,qBAAa,mBAAoB,SAAQ,KAAK;IAChC,QAAQ,CAAC,GAAG,EAAE,MAAM;IAAhC,YAAqB,GAAG,EAAE,MAAM,EAE/B;CACF;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,cAAwB,GAAG,OAAO,CAK/E;AAwBD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,GAAE,cAAwB,GAAG,IAAI,CAsB/E"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * `JSON.parse` contra prototype pollution (S-08).
3
+ *
4
+ * O `JSON.parse` cria `"__proto__"` como propriedade própria, o que é inofensivo sozinho. O risco
5
+ * aparece depois, quando o objeto passa por um merge recursivo ou por `Object.assign` em código do
6
+ * usuário ou de bibliotecas. Por isso, o body é conferido logo na entrada:
7
+ * - `__proto__` em qualquer nível;
8
+ * - `constructor` cujo valor é um objeto com `prototype` (o outro caminho até o protótipo).
9
+ *
10
+ * A conferência só percorre o objeto quando o texto pode conter essas chaves, inclusive com escapes
11
+ * `\u`. Bodies comuns seguem pelo caminho rápido.
12
+ */
13
+ export class ProtoPoisoningError extends Error {
14
+ key;
15
+ constructor(key) {
16
+ super(`Object contains forbidden key "${key}"`);
17
+ this.key = key;
18
+ }
19
+ }
20
+ export function parseJson(text, mode = 'error') {
21
+ const value = JSON.parse(text);
22
+ if (!text.includes('proto') && !text.includes('constructor') && !text.includes('\\u'))
23
+ return value;
24
+ scrub(value, mode);
25
+ return value;
26
+ }
27
+ function scrub(root, mode) {
28
+ const stack = [root];
29
+ while (stack.length > 0) {
30
+ const node = stack.pop();
31
+ if (typeof node !== 'object' || node === null)
32
+ continue;
33
+ const obj = node;
34
+ if (Object.hasOwn(obj, '__proto__')) {
35
+ if (mode === 'error')
36
+ throw new ProtoPoisoningError('__proto__');
37
+ // biome-ignore lint/suspicious/noProto: é exatamente a chave própria que está sendo removida.
38
+ delete obj['__proto__'];
39
+ }
40
+ if (Object.hasOwn(obj, 'constructor')) {
41
+ const ctor = obj['constructor'];
42
+ if (typeof ctor === 'object' && ctor !== null && Object.hasOwn(ctor, 'prototype')) {
43
+ if (mode === 'error')
44
+ throw new ProtoPoisoningError('constructor.prototype');
45
+ delete obj['constructor'];
46
+ }
47
+ }
48
+ for (const key of Object.keys(obj))
49
+ stack.push(obj[key]);
50
+ }
51
+ }
52
+ /**
53
+ * A mesma proteção do `parseJson` (S-08) para o valor de um parser próprio (F-12). Diferente do JSON, um parser
54
+ * (YAML com âncoras, por exemplo) pode devolver referências repetidas ou circulares: cada objeto é visitado uma vez.
55
+ */
56
+ export function scrubParsed(root, mode = 'error') {
57
+ const seen = new WeakSet();
58
+ const stack = [root];
59
+ while (stack.length > 0) {
60
+ const node = stack.pop();
61
+ if (typeof node !== 'object' || node === null || seen.has(node))
62
+ continue;
63
+ seen.add(node);
64
+ const obj = node;
65
+ if (Object.hasOwn(obj, '__proto__')) {
66
+ if (mode === 'error')
67
+ throw new ProtoPoisoningError('__proto__');
68
+ // biome-ignore lint/suspicious/noProto: é exatamente a chave própria que está sendo removida.
69
+ delete obj['__proto__'];
70
+ }
71
+ if (Object.hasOwn(obj, 'constructor')) {
72
+ const ctor = obj['constructor'];
73
+ if (typeof ctor === 'object' && ctor !== null && Object.hasOwn(ctor, 'prototype')) {
74
+ if (mode === 'error')
75
+ throw new ProtoPoisoningError('constructor.prototype');
76
+ delete obj['constructor'];
77
+ }
78
+ }
79
+ for (const key of Object.keys(obj))
80
+ stack.push(obj[key]);
81
+ }
82
+ }
83
+ //# sourceMappingURL=safe-json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safe-json.js","sourceRoot":"","sources":["../../src/utils/safe-json.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /** Contexto de trace W3C recebido (`traceparent`/`tracestate`), em `ctx.trace` (F-38). */
2
+ export interface TraceContext {
3
+ /** 32 caracteres hex. */
4
+ readonly traceId: string;
5
+ /** Span de quem chamou: 16 caracteres hex. */
6
+ readonly parentSpanId: string;
7
+ /** Flag `sampled` de quem chamou. */
8
+ readonly sampled: boolean;
9
+ /** `tracestate` recebido, se válido. */
10
+ readonly tracestate?: string;
11
+ }
12
+ /**
13
+ * Valida o `traceparent` pela especificação W3C: versão `ff` é inválida, ids zerados também, e a versão `00`
14
+ * não admite campos extras (versões futuras admitem). Maiúsculas são rejeitadas, como manda a especificação.
15
+ */
16
+ export declare function parseTraceparent(traceparent: unknown, tracestate?: unknown): TraceContext | undefined;
17
+ //# sourceMappingURL=trace-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace-context.d.ts","sourceRoot":"","sources":["../../src/utils/trace-context.ts"],"names":[],"mappings":"AAAA,0FAA0F;AAC1F,MAAM,WAAW,YAAY;IAC3B,yBAAyB;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,8CAA8C;IAC9C,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,qCAAqC;IACrC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,wCAAwC;IACxC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AASD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,OAAO,GAAG,YAAY,GAAG,SAAS,CAcrG"}
@@ -0,0 +1,30 @@
1
+ // https://www.w3.org/TR/trace-context/#traceparent-header-field-values
2
+ const TRACEPARENT = /^([0-9a-f]{2})-([0-9a-f]{32})-([0-9a-f]{16})-([0-9a-f]{2})(-.*)?$/;
3
+ const ZERO_TRACE = '0'.repeat(32);
4
+ const ZERO_SPAN = '0'.repeat(16);
5
+ /** Lista de `chave=valor` separados por vírgula, só com ASCII imprimível; até 512 caracteres. */
6
+ const TRACESTATE = /^[\x20-\x7e]{1,512}$/;
7
+ /**
8
+ * Valida o `traceparent` pela especificação W3C: versão `ff` é inválida, ids zerados também, e a versão `00`
9
+ * não admite campos extras (versões futuras admitem). Maiúsculas são rejeitadas, como manda a especificação.
10
+ */
11
+ export function parseTraceparent(traceparent, tracestate) {
12
+ if (typeof traceparent !== 'string' || traceparent.length > 512)
13
+ return undefined;
14
+ const m = TRACEPARENT.exec(traceparent.trim());
15
+ if (!m)
16
+ return undefined;
17
+ const [, version, traceId, parentSpanId, flags, extra] = m;
18
+ if (version === 'ff' || (version === '00' && extra !== undefined))
19
+ return undefined;
20
+ if (traceId === ZERO_TRACE || parentSpanId === ZERO_SPAN)
21
+ return undefined;
22
+ const state = typeof tracestate === 'string' && TRACESTATE.test(tracestate) ? tracestate : undefined;
23
+ return Object.freeze({
24
+ traceId,
25
+ parentSpanId,
26
+ sampled: (Number.parseInt(flags, 16) & 1) === 1,
27
+ ...(state === undefined ? {} : { tracestate: state }),
28
+ });
29
+ }
30
+ //# sourceMappingURL=trace-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace-context.js","sourceRoot":"","sources":["../../src/utils/trace-context.ts"],"names":[],"mappings":"AAYA,uEAAuE;AACvE,MAAM,WAAW,GAAG,mEAAmE,CAAC;AACxF,MAAM,UAAU,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAClC,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AACjC,iGAAiG;AACjG,MAAM,UAAU,GAAG,sBAAsB,CAAC;AAE1C;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,WAAoB,EAAE,UAAoB;IACzE,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,WAAW,CAAC,MAAM,GAAG,GAAG;QAAE,OAAO,SAAS,CAAC;IAClF,MAAM,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;IAC/C,IAAI,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IACzB,MAAM,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAiE,CAAC;IAC3H,IAAI,OAAO,KAAK,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,CAAC;QAAE,OAAO,SAAS,CAAC;IACpF,IAAI,OAAO,KAAK,UAAU,IAAI,YAAY,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC3E,MAAM,KAAK,GAAG,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;IACrG,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,OAAO;QACP,YAAY;QACZ,OAAO,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;QAC/C,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;KACtD,CAAC,CAAC;AACL,CAAC"}
package/package.json CHANGED
@@ -1,9 +1,88 @@
1
1
  {
2
2
  "name": "flowingts",
3
- "version": "0.0.0",
4
- "description": "Flowing: framework de APIs em TypeScript com decorators, contratos por rota e o básico de produção pronto. Nome reservado; a primeira versão funcional sai em breve.",
5
- "license": "MIT",
3
+ "version": "0.19.0",
4
+ "description": "Micro-framework HTTP para Node.js com decorators TC39 nativos, schema-first (TypeBox + Ajv) e defaults seguros.",
5
+ "keywords": [
6
+ "http",
7
+ "framework",
8
+ "decorators",
9
+ "tc39",
10
+ "typescript",
11
+ "typebox",
12
+ "ajv",
13
+ "schema",
14
+ "api",
15
+ "rest"
16
+ ],
6
17
  "author": "Caio Fernandes",
7
- "repository": { "type": "git", "url": "git+https://github.com/code-cfernandes/sashiko.git" },
8
- "files": ["README.md"]
9
- }
18
+ "license": "ISC",
19
+ "repository": {
20
+ "type": "git",
21
+ "url": "git+https://github.com/code-cfernandes/flowing.git"
22
+ },
23
+ "homepage": "https://github.com/code-cfernandes/flowing#readme",
24
+ "bugs": {
25
+ "url": "https://github.com/code-cfernandes/flowing/issues"
26
+ },
27
+ "type": "module",
28
+ "main": "./dist/index.js",
29
+ "types": "./dist/index.d.ts",
30
+ "exports": {
31
+ ".": {
32
+ "types": "./dist/index.d.ts",
33
+ "import": "./dist/index.js",
34
+ "default": "./dist/index.js"
35
+ }
36
+ },
37
+ "files": [
38
+ "dist"
39
+ ],
40
+ "sideEffects": [
41
+ "./dist/index.js",
42
+ "./dist/core/index.js",
43
+ "./dist/core/app.js",
44
+ "./dist/shims/*.js"
45
+ ],
46
+ "engines": {
47
+ "node": ">=22"
48
+ },
49
+ "devEngines": {
50
+ "packageManager": {
51
+ "name": "pnpm",
52
+ "version": "^12.16.1",
53
+ "onFail": "download"
54
+ }
55
+ },
56
+ "devDependencies": {
57
+ "@biomejs/biome": "2.6.5",
58
+ "@types/node": "^26.0.0",
59
+ "@types/qs": "^6.15.1",
60
+ "qs": "^6.17.1",
61
+ "tsx": "^4.23.15",
62
+ "typescript": "^7.0.2",
63
+ "zod": "^4.6.7"
64
+ },
65
+ "dependencies": {
66
+ "@fastify/busboy": "^3.2.5",
67
+ "@sinclair/typebox": "^0.34.52",
68
+ "ajv": "^8.20.0",
69
+ "ajv-formats": "^3.0.1",
70
+ "fast-json-stringify": "^7.2.1",
71
+ "find-my-way": "^9.10.0",
72
+ "magic-bytes.js": "^1.13.1"
73
+ },
74
+ "scripts": {
75
+ "dev": "tsx watch examples/app-users/server.ts",
76
+ "example:users": "tsx examples/app-users/server.ts",
77
+ "test:examples": "node --import tsx --test --test-timeout=20000 --test-reporter=spec 'examples/*/app.test.ts'",
78
+ "build": "tsc -p tsconfig.build.json",
79
+ "typecheck": "tsc --noEmit",
80
+ "lint": "biome lint .",
81
+ "format": "biome format --write .",
82
+ "check": "biome check .",
83
+ "test": "node --import tsx --test --test-timeout=10000 --test-reporter=spec 'test/**/*.test.ts'",
84
+ "test:watch": "node --import tsx --test --test-timeout=10000 --watch 'test/**/*.test.ts'",
85
+ "test:coverage": "node --import tsx --test --test-timeout=10000 --experimental-test-coverage --test-coverage-include='src/**' --test-coverage-lines=95 --test-coverage-branches=85 --test-coverage-functions=90 'test/**/*.test.ts'",
86
+ "clean": "rm -rf dist"
87
+ }
88
+ }