@warlock.js/core 5.29.0 → 5.31.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 (1818) hide show
  1. package/CHANGELOG.md +168 -4
  2. package/README.md +28 -23
  3. package/bin/source-load-hook.mjs +63 -0
  4. package/bin/warlock.js +102 -42
  5. package/esm/application/app.d.mts +1 -1
  6. package/esm/application/app.d.mts.map +1 -1
  7. package/esm/application/app.mjs +1 -1
  8. package/esm/application/app.mjs.map +1 -1
  9. package/esm/application/application-config-types.d.mts +1 -1
  10. package/esm/application/application-config-types.d.mts.map +1 -1
  11. package/esm/application/application.d.mts +1 -1
  12. package/esm/application/application.d.mts.map +1 -1
  13. package/esm/application/application.mjs +1 -1
  14. package/esm/application/application.mjs.map +1 -1
  15. package/esm/application/boot-signal.d.mts +1 -1
  16. package/esm/application/boot-signal.d.mts.map +1 -1
  17. package/esm/application/boot-signal.mjs +1 -1
  18. package/esm/application/boot-signal.mjs.map +1 -1
  19. package/esm/application/public-url.d.mts +1 -1
  20. package/esm/application/public-url.d.mts.map +1 -1
  21. package/esm/application/public-url.mjs +1 -1
  22. package/esm/application/public-url.mjs.map +1 -1
  23. package/esm/application/roles.d.mts +1 -1
  24. package/esm/application/roles.d.mts.map +1 -1
  25. package/esm/application/roles.mjs +1 -1
  26. package/esm/application/roles.mjs.map +1 -1
  27. package/esm/benchmark/benchmark-snapshots.d.mts +1 -1
  28. package/esm/benchmark/benchmark-snapshots.d.mts.map +1 -1
  29. package/esm/benchmark/benchmark-snapshots.mjs +1 -1
  30. package/esm/benchmark/benchmark-snapshots.mjs.map +1 -1
  31. package/esm/benchmark/benchmark.d.mts +1 -1
  32. package/esm/benchmark/benchmark.d.mts.map +1 -1
  33. package/esm/benchmark/benchmark.mjs +1 -1
  34. package/esm/benchmark/benchmark.mjs.map +1 -1
  35. package/esm/benchmark/channels/console.channel.d.mts +1 -1
  36. package/esm/benchmark/channels/console.channel.d.mts.map +1 -1
  37. package/esm/benchmark/channels/console.channel.mjs +1 -1
  38. package/esm/benchmark/channels/console.channel.mjs.map +1 -1
  39. package/esm/benchmark/channels/noop.channel.d.mts +1 -1
  40. package/esm/benchmark/channels/noop.channel.d.mts.map +1 -1
  41. package/esm/benchmark/channels/noop.channel.mjs +1 -1
  42. package/esm/benchmark/channels/noop.channel.mjs.map +1 -1
  43. package/esm/benchmark/profiler.d.mts +1 -1
  44. package/esm/benchmark/profiler.d.mts.map +1 -1
  45. package/esm/benchmark/profiler.mjs +1 -1
  46. package/esm/benchmark/profiler.mjs.map +1 -1
  47. package/esm/benchmark/types.d.mts +1 -1
  48. package/esm/benchmark/types.d.mts.map +1 -1
  49. package/esm/bootstrap/setup.d.mts +1 -1
  50. package/esm/bootstrap/setup.d.mts.map +1 -1
  51. package/esm/bootstrap/setup.mjs +1 -1
  52. package/esm/bootstrap/setup.mjs.map +1 -1
  53. package/esm/bootstrap.d.mts +1 -1
  54. package/esm/bootstrap.d.mts.map +1 -1
  55. package/esm/bootstrap.mjs +1 -1
  56. package/esm/bootstrap.mjs.map +1 -1
  57. package/esm/cache/database-cache-driver.d.mts +1 -1
  58. package/esm/cache/database-cache-driver.d.mts.map +1 -1
  59. package/esm/cache/database-cache-driver.mjs +1 -1
  60. package/esm/cache/database-cache-driver.mjs.map +1 -1
  61. package/esm/cache/index.mjs +1 -1
  62. package/esm/cache/index.mjs.map +1 -1
  63. package/esm/cli/cli-commands.manager.mjs +1 -1
  64. package/esm/cli/cli-commands.manager.mjs.map +1 -1
  65. package/esm/cli/cli-commands.utils.mjs +1 -1
  66. package/esm/cli/cli-commands.utils.mjs.map +1 -1
  67. package/esm/cli/commands/add.command.mjs +5 -3
  68. package/esm/cli/commands/add.command.mjs.map +1 -1
  69. package/esm/cli/commands/agents-md/agents-md-command.action.mjs +69 -0
  70. package/esm/cli/commands/agents-md/agents-md-command.action.mjs.map +1 -0
  71. package/esm/cli/commands/agents-md.command.mjs +38 -0
  72. package/esm/cli/commands/agents-md.command.mjs.map +1 -0
  73. package/esm/cli/commands/board/board-command.action.mjs +279 -0
  74. package/esm/cli/commands/board/board-command.action.mjs.map +1 -0
  75. package/esm/cli/commands/board.command.mjs +78 -0
  76. package/esm/cli/commands/board.command.mjs.map +1 -0
  77. package/esm/cli/commands/build.command.mjs +7 -2
  78. package/esm/cli/commands/build.command.mjs.map +1 -1
  79. package/esm/cli/commands/check/check-command.action.mjs +57 -0
  80. package/esm/cli/commands/check/check-command.action.mjs.map +1 -0
  81. package/esm/cli/commands/check/child-typecheck.mjs +66 -0
  82. package/esm/cli/commands/check/child-typecheck.mjs.map +1 -0
  83. package/esm/cli/commands/check/format-problems.mjs +43 -0
  84. package/esm/cli/commands/check/format-problems.mjs.map +1 -0
  85. package/esm/cli/commands/check/typecheck-command.action.mjs +61 -0
  86. package/esm/cli/commands/check/typecheck-command.action.mjs.map +1 -0
  87. package/esm/cli/commands/check.command.mjs +50 -0
  88. package/esm/cli/commands/check.command.mjs.map +1 -0
  89. package/esm/cli/commands/create-database.command.mjs +1 -1
  90. package/esm/cli/commands/create-database.command.mjs.map +1 -1
  91. package/esm/cli/commands/dev-server.command.mjs +10 -2
  92. package/esm/cli/commands/dev-server.command.mjs.map +1 -1
  93. package/esm/cli/commands/doctor/boot-for-diagnostics.mjs +9 -4
  94. package/esm/cli/commands/doctor/boot-for-diagnostics.mjs.map +1 -1
  95. package/esm/cli/commands/doctor/check.types.d.mts +76 -0
  96. package/esm/cli/commands/doctor/check.types.d.mts.map +1 -0
  97. package/esm/cli/commands/doctor/checks/config.check.mjs +2 -1
  98. package/esm/cli/commands/doctor/checks/config.check.mjs.map +1 -1
  99. package/esm/cli/commands/doctor/checks/connectors.check.mjs +3 -1
  100. package/esm/cli/commands/doctor/checks/connectors.check.mjs.map +1 -1
  101. package/esm/cli/commands/doctor/checks/handler-signature.check.mjs +2 -1
  102. package/esm/cli/commands/doctor/checks/handler-signature.check.mjs.map +1 -1
  103. package/esm/cli/commands/doctor/checks/health.check.mjs +4 -1
  104. package/esm/cli/commands/doctor/checks/health.check.mjs.map +1 -1
  105. package/esm/cli/commands/doctor/checks/index.mjs +1 -1
  106. package/esm/cli/commands/doctor/checks/index.mjs.map +1 -1
  107. package/esm/cli/commands/doctor/checks/jwt-secret.check.mjs +2 -1
  108. package/esm/cli/commands/doctor/checks/jwt-secret.check.mjs.map +1 -1
  109. package/esm/cli/commands/doctor/checks/locales-ts-deprecated.check.mjs +2 -1
  110. package/esm/cli/commands/doctor/checks/locales-ts-deprecated.check.mjs.map +1 -1
  111. package/esm/cli/commands/doctor/checks/optional-peers.check.mjs +2 -1
  112. package/esm/cli/commands/doctor/checks/optional-peers.check.mjs.map +1 -1
  113. package/esm/cli/commands/doctor/checks/release-hygiene.check.mjs +5 -1
  114. package/esm/cli/commands/doctor/checks/release-hygiene.check.mjs.map +1 -1
  115. package/esm/cli/commands/doctor/checks/routes.check.mjs +4 -1
  116. package/esm/cli/commands/doctor/checks/routes.check.mjs.map +1 -1
  117. package/esm/cli/commands/doctor/doctor-command.action.mjs +15 -7
  118. package/esm/cli/commands/doctor/doctor-command.action.mjs.map +1 -1
  119. package/esm/cli/commands/doctor/format-report.mjs +31 -3
  120. package/esm/cli/commands/doctor/format-report.mjs.map +1 -1
  121. package/esm/cli/commands/doctor/run-checks.mjs +1 -1
  122. package/esm/cli/commands/doctor/run-checks.mjs.map +1 -1
  123. package/esm/cli/commands/doctor.command.mjs +5 -1
  124. package/esm/cli/commands/doctor.command.mjs.map +1 -1
  125. package/esm/cli/commands/drop-tables.command.mjs +1 -1
  126. package/esm/cli/commands/drop-tables.command.mjs.map +1 -1
  127. package/esm/cli/commands/explain/explain-command.action.mjs +64 -0
  128. package/esm/cli/commands/explain/explain-command.action.mjs.map +1 -0
  129. package/esm/cli/commands/explain.command.mjs +23 -0
  130. package/esm/cli/commands/explain.command.mjs.map +1 -0
  131. package/esm/cli/commands/generate/generate.command.mjs +125 -125
  132. package/esm/cli/commands/generate/generate.command.mjs.map +1 -1
  133. package/esm/cli/commands/generate/generators/column-dsl-parser.mjs +1 -1
  134. package/esm/cli/commands/generate/generators/column-dsl-parser.mjs.map +1 -1
  135. package/esm/cli/commands/generate/generators/controller.generator.mjs +1 -1
  136. package/esm/cli/commands/generate/generators/controller.generator.mjs.map +1 -1
  137. package/esm/cli/commands/generate/generators/endpoint.generator.mjs +311 -0
  138. package/esm/cli/commands/generate/generators/endpoint.generator.mjs.map +1 -0
  139. package/esm/cli/commands/generate/generators/migration.generator.mjs +2 -2
  140. package/esm/cli/commands/generate/generators/migration.generator.mjs.map +1 -1
  141. package/esm/cli/commands/generate/generators/model.generator.mjs +2 -2
  142. package/esm/cli/commands/generate/generators/model.generator.mjs.map +1 -1
  143. package/esm/cli/commands/generate/generators/module.generator.mjs +1 -1
  144. package/esm/cli/commands/generate/generators/module.generator.mjs.map +1 -1
  145. package/esm/cli/commands/generate/generators/repository.generator.mjs +1 -1
  146. package/esm/cli/commands/generate/generators/repository.generator.mjs.map +1 -1
  147. package/esm/cli/commands/generate/generators/resource.generator.mjs +1 -1
  148. package/esm/cli/commands/generate/generators/resource.generator.mjs.map +1 -1
  149. package/esm/cli/commands/generate/generators/service.generator.mjs +1 -1
  150. package/esm/cli/commands/generate/generators/service.generator.mjs.map +1 -1
  151. package/esm/cli/commands/generate/generators/use-case.generator.mjs +1 -1
  152. package/esm/cli/commands/generate/generators/use-case.generator.mjs.map +1 -1
  153. package/esm/cli/commands/generate/templates/endpoint-stubs.mjs +341 -0
  154. package/esm/cli/commands/generate/templates/endpoint-stubs.mjs.map +1 -0
  155. package/esm/cli/commands/generate/templates/stubs.mjs +20 -7
  156. package/esm/cli/commands/generate/templates/stubs.mjs.map +1 -1
  157. package/esm/cli/commands/generate/utils/endpoint-schema.mjs +137 -0
  158. package/esm/cli/commands/generate/utils/endpoint-schema.mjs.map +1 -0
  159. package/esm/cli/commands/generate/utils/name-parser.mjs +2 -2
  160. package/esm/cli/commands/generate/utils/name-parser.mjs.map +1 -1
  161. package/esm/cli/commands/generate/utils/path-resolver.mjs +1 -1
  162. package/esm/cli/commands/generate/utils/path-resolver.mjs.map +1 -1
  163. package/esm/cli/commands/generate/utils/prompt.mjs +1 -1
  164. package/esm/cli/commands/generate/utils/prompt.mjs.map +1 -1
  165. package/esm/cli/commands/generate/utils/writer.mjs +39 -14
  166. package/esm/cli/commands/generate/utils/writer.mjs.map +1 -1
  167. package/esm/cli/commands/inspect/inspect-command.action.mjs +72 -0
  168. package/esm/cli/commands/inspect/inspect-command.action.mjs.map +1 -0
  169. package/esm/cli/commands/inspect.command.mjs +39 -0
  170. package/esm/cli/commands/inspect.command.mjs.map +1 -0
  171. package/esm/cli/commands/mcp/mcp-command.action.mjs +103 -0
  172. package/esm/cli/commands/mcp/mcp-command.action.mjs.map +1 -0
  173. package/esm/cli/commands/mcp.command.mjs +76 -0
  174. package/esm/cli/commands/mcp.command.mjs.map +1 -0
  175. package/esm/cli/commands/migrate.command.mjs +1 -1
  176. package/esm/cli/commands/migrate.command.mjs.map +1 -1
  177. package/esm/cli/commands/openapi-generator.action.mjs +1 -1
  178. package/esm/cli/commands/openapi-generator.action.mjs.map +1 -1
  179. package/esm/cli/commands/openapi-generator.command.mjs +1 -1
  180. package/esm/cli/commands/openapi-generator.command.mjs.map +1 -1
  181. package/esm/cli/commands/postman-generator.action.mjs +1 -1
  182. package/esm/cli/commands/postman-generator.action.mjs.map +1 -1
  183. package/esm/cli/commands/postman-generator.command.mjs +1 -1
  184. package/esm/cli/commands/postman-generator.command.mjs.map +1 -1
  185. package/esm/cli/commands/routes/diff-page-routes.mjs +1 -1
  186. package/esm/cli/commands/routes/diff-page-routes.mjs.map +1 -1
  187. package/esm/cli/commands/routes/format-routes-table.mjs +1 -1
  188. package/esm/cli/commands/routes/format-routes-table.mjs.map +1 -1
  189. package/esm/cli/commands/routes/route-row.mjs +1 -1
  190. package/esm/cli/commands/routes/route-row.mjs.map +1 -1
  191. package/esm/cli/commands/routes/routes-command.action.mjs +1 -1
  192. package/esm/cli/commands/routes/routes-command.action.mjs.map +1 -1
  193. package/esm/cli/commands/routes/routes-diff.action.mjs +2 -2
  194. package/esm/cli/commands/routes/routes-diff.action.mjs.map +1 -1
  195. package/esm/cli/commands/routes/with-console-on-stderr.mjs +1 -1
  196. package/esm/cli/commands/routes/with-console-on-stderr.mjs.map +1 -1
  197. package/esm/cli/commands/routes.command.mjs +1 -1
  198. package/esm/cli/commands/routes.command.mjs.map +1 -1
  199. package/esm/cli/commands/seed.command.mjs +1 -1
  200. package/esm/cli/commands/seed.command.mjs.map +1 -1
  201. package/esm/cli/commands/start-production.command.mjs +1 -1
  202. package/esm/cli/commands/start-production.command.mjs.map +1 -1
  203. package/esm/cli/commands/storage-put.action.mjs +1 -1
  204. package/esm/cli/commands/storage-put.action.mjs.map +1 -1
  205. package/esm/cli/commands/storage-put.command.mjs +1 -1
  206. package/esm/cli/commands/storage-put.command.mjs.map +1 -1
  207. package/esm/cli/commands/test.command.mjs +131 -0
  208. package/esm/cli/commands/test.command.mjs.map +1 -0
  209. package/esm/cli/commands/trace/trace-command.action.mjs +145 -0
  210. package/esm/cli/commands/trace/trace-command.action.mjs.map +1 -0
  211. package/esm/cli/commands/trace.command.mjs +60 -0
  212. package/esm/cli/commands/trace.command.mjs.map +1 -0
  213. package/esm/cli/commands/typecheck.command.mjs +40 -0
  214. package/esm/cli/commands/typecheck.command.mjs.map +1 -0
  215. package/esm/cli/commands/typings-generator.command.mjs +1 -1
  216. package/esm/cli/commands/typings-generator.command.mjs.map +1 -1
  217. package/esm/cli/commands/update.command.mjs +1 -1
  218. package/esm/cli/commands/update.command.mjs.map +1 -1
  219. package/esm/cli/commands/upgrade.command.mjs +46 -0
  220. package/esm/cli/commands/upgrade.command.mjs.map +1 -0
  221. package/esm/cli/commands-loader.mjs +1 -1
  222. package/esm/cli/commands-loader.mjs.map +1 -1
  223. package/esm/cli/flush-and-exit.mjs +34 -0
  224. package/esm/cli/flush-and-exit.mjs.map +1 -0
  225. package/esm/cli/framework-cli-commands.mjs +24 -2
  226. package/esm/cli/framework-cli-commands.mjs.map +1 -1
  227. package/esm/cli/parse-cli-args.mjs +2 -1
  228. package/esm/cli/parse-cli-args.mjs.map +1 -1
  229. package/esm/cli/start.mjs +1 -1
  230. package/esm/cli/start.mjs.map +1 -1
  231. package/esm/cli/string-similarity.mjs +1 -1
  232. package/esm/cli/string-similarity.mjs.map +1 -1
  233. package/esm/commands/cli-command.d.mts +1 -1
  234. package/esm/commands/cli-command.d.mts.map +1 -1
  235. package/esm/commands/cli-command.mjs +1 -1
  236. package/esm/commands/cli-command.mjs.map +1 -1
  237. package/esm/commands/types.d.mts +1 -1
  238. package/esm/commands/types.d.mts.map +1 -1
  239. package/esm/config/config-getter.d.mts +1 -1
  240. package/esm/config/config-getter.d.mts.map +1 -1
  241. package/esm/config/config-getter.mjs +1 -1
  242. package/esm/config/config-getter.mjs.map +1 -1
  243. package/esm/config/config-handlers.d.mts +1 -1
  244. package/esm/config/config-handlers.d.mts.map +1 -1
  245. package/esm/config/config-handlers.mjs +1 -1
  246. package/esm/config/config-handlers.mjs.map +1 -1
  247. package/esm/config/config-key-from-path.mjs +1 -1
  248. package/esm/config/config-key-from-path.mjs.map +1 -1
  249. package/esm/config/config-loader.d.mts +1 -1
  250. package/esm/config/config-loader.d.mts.map +1 -1
  251. package/esm/config/config-loader.mjs +35 -14
  252. package/esm/config/config-loader.mjs.map +1 -1
  253. package/esm/config/config-manager.mjs +1 -1
  254. package/esm/config/config-manager.mjs.map +1 -1
  255. package/esm/config/config-schema.d.mts +67 -0
  256. package/esm/config/config-schema.d.mts.map +1 -0
  257. package/esm/config/config-schema.mjs +77 -0
  258. package/esm/config/config-schema.mjs.map +1 -0
  259. package/esm/config/config-setter.d.mts +1 -1
  260. package/esm/config/config-setter.d.mts.map +1 -1
  261. package/esm/config/config-setter.mjs +1 -1
  262. package/esm/config/config-setter.mjs.map +1 -1
  263. package/esm/config/config-special-handlers.d.mts +1 -1
  264. package/esm/config/config-special-handlers.d.mts.map +1 -1
  265. package/esm/config/config-special-handlers.mjs +1 -1
  266. package/esm/config/config-special-handlers.mjs.map +1 -1
  267. package/esm/config/index.d.mts +6 -0
  268. package/esm/config/index.mjs +1 -0
  269. package/esm/config/load-config-files.mjs +1 -1
  270. package/esm/config/load-config-files.mjs.map +1 -1
  271. package/esm/config/locale-configuration.mjs +1 -1
  272. package/esm/config/locale-configuration.mjs.map +1 -1
  273. package/esm/config/types.d.mts +1 -1
  274. package/esm/config/types.d.mts.map +1 -1
  275. package/esm/connectors/access-connector.d.mts +1 -1
  276. package/esm/connectors/access-connector.d.mts.map +1 -1
  277. package/esm/connectors/access-connector.mjs +1 -1
  278. package/esm/connectors/access-connector.mjs.map +1 -1
  279. package/esm/connectors/ai-connector.d.mts +1 -1
  280. package/esm/connectors/ai-connector.d.mts.map +1 -1
  281. package/esm/connectors/ai-connector.mjs +1 -1
  282. package/esm/connectors/ai-connector.mjs.map +1 -1
  283. package/esm/connectors/assert-no-reserved-connector-names.d.mts +1 -1
  284. package/esm/connectors/assert-no-reserved-connector-names.d.mts.map +1 -1
  285. package/esm/connectors/assert-no-reserved-connector-names.mjs +3 -2
  286. package/esm/connectors/assert-no-reserved-connector-names.mjs.map +1 -1
  287. package/esm/connectors/assert-unique-connector-names.d.mts +1 -1
  288. package/esm/connectors/assert-unique-connector-names.d.mts.map +1 -1
  289. package/esm/connectors/assert-unique-connector-names.mjs +27 -3
  290. package/esm/connectors/assert-unique-connector-names.mjs.map +1 -1
  291. package/esm/connectors/base-connector.d.mts +1 -1
  292. package/esm/connectors/base-connector.d.mts.map +1 -1
  293. package/esm/connectors/base-connector.mjs +1 -1
  294. package/esm/connectors/base-connector.mjs.map +1 -1
  295. package/esm/connectors/cache-connector.d.mts +1 -1
  296. package/esm/connectors/cache-connector.d.mts.map +1 -1
  297. package/esm/connectors/cache-connector.mjs +1 -1
  298. package/esm/connectors/cache-connector.mjs.map +1 -1
  299. package/esm/connectors/connectors-manager.d.mts +1 -1
  300. package/esm/connectors/connectors-manager.d.mts.map +1 -1
  301. package/esm/connectors/connectors-manager.mjs +2 -2
  302. package/esm/connectors/connectors-manager.mjs.map +1 -1
  303. package/esm/connectors/database-connector.d.mts +1 -1
  304. package/esm/connectors/database-connector.d.mts.map +1 -1
  305. package/esm/connectors/database-connector.mjs +1 -1
  306. package/esm/connectors/database-connector.mjs.map +1 -1
  307. package/esm/connectors/describe-server-address.mjs +1 -1
  308. package/esm/connectors/describe-server-address.mjs.map +1 -1
  309. package/esm/connectors/herald-connector.d.mts +1 -1
  310. package/esm/connectors/herald-connector.d.mts.map +1 -1
  311. package/esm/connectors/herald-connector.mjs +1 -1
  312. package/esm/connectors/herald-connector.mjs.map +1 -1
  313. package/esm/connectors/http-connector.d.mts +1 -1
  314. package/esm/connectors/http-connector.d.mts.map +1 -1
  315. package/esm/connectors/http-connector.mjs +4 -3
  316. package/esm/connectors/http-connector.mjs.map +1 -1
  317. package/esm/connectors/logger-connector.d.mts +1 -1
  318. package/esm/connectors/logger-connector.d.mts.map +1 -1
  319. package/esm/connectors/logger-connector.mjs +1 -1
  320. package/esm/connectors/logger-connector.mjs.map +1 -1
  321. package/esm/connectors/mail-connector.d.mts +1 -1
  322. package/esm/connectors/mail-connector.d.mts.map +1 -1
  323. package/esm/connectors/mail-connector.mjs +1 -1
  324. package/esm/connectors/mail-connector.mjs.map +1 -1
  325. package/esm/connectors/notifications-connector.d.mts +1 -1
  326. package/esm/connectors/notifications-connector.d.mts.map +1 -1
  327. package/esm/connectors/notifications-connector.mjs +1 -1
  328. package/esm/connectors/notifications-connector.mjs.map +1 -1
  329. package/esm/connectors/read-bound-port.mjs +1 -1
  330. package/esm/connectors/read-bound-port.mjs.map +1 -1
  331. package/esm/connectors/register-configured-connectors.d.mts +1 -1
  332. package/esm/connectors/register-configured-connectors.d.mts.map +1 -1
  333. package/esm/connectors/register-configured-connectors.mjs +1 -1
  334. package/esm/connectors/register-configured-connectors.mjs.map +1 -1
  335. package/esm/connectors/single-server-warnings.mjs +1 -1
  336. package/esm/connectors/single-server-warnings.mjs.map +1 -1
  337. package/esm/connectors/socket-connector.d.mts +1 -1
  338. package/esm/connectors/socket-connector.d.mts.map +1 -1
  339. package/esm/connectors/socket-connector.mjs +1 -1
  340. package/esm/connectors/socket-connector.mjs.map +1 -1
  341. package/esm/connectors/storage.connector.d.mts +1 -1
  342. package/esm/connectors/storage.connector.d.mts.map +1 -1
  343. package/esm/connectors/storage.connector.mjs +1 -1
  344. package/esm/connectors/storage.connector.mjs.map +1 -1
  345. package/esm/connectors/types.d.mts +1 -1
  346. package/esm/connectors/types.d.mts.map +1 -1
  347. package/esm/connectors/types.mjs +1 -1
  348. package/esm/connectors/types.mjs.map +1 -1
  349. package/esm/container/container-instance-registry.mjs +1 -1
  350. package/esm/container/container-instance-registry.mjs.map +1 -1
  351. package/esm/container/development-app-modules.d.mts +1 -1
  352. package/esm/container/development-app-modules.d.mts.map +1 -1
  353. package/esm/container/development-model-modules.d.mts +1 -1
  354. package/esm/container/development-model-modules.d.mts.map +1 -1
  355. package/esm/container/index.d.mts +1 -1
  356. package/esm/container/index.d.mts.map +1 -1
  357. package/esm/container/index.mjs +1 -1
  358. package/esm/container/index.mjs.map +1 -1
  359. package/esm/database/create-database-action.mjs +1 -1
  360. package/esm/database/create-database-action.mjs.map +1 -1
  361. package/esm/database/drop-tables-action.mjs +1 -1
  362. package/esm/database/drop-tables-action.mjs.map +1 -1
  363. package/esm/database/migrate-action.mjs +1 -1
  364. package/esm/database/migrate-action.mjs.map +1 -1
  365. package/esm/database/models/database-log/database-log.d.mts +3 -39
  366. package/esm/database/models/database-log/database-log.d.mts.map +1 -1
  367. package/esm/database/models/database-log/database-log.mjs +1 -1
  368. package/esm/database/models/database-log/database-log.mjs.map +1 -1
  369. package/esm/database/pending-exit-code.mjs +1 -1
  370. package/esm/database/pending-exit-code.mjs.map +1 -1
  371. package/esm/database/resolve-pending-migrations.mjs +1 -1
  372. package/esm/database/resolve-pending-migrations.mjs.map +1 -1
  373. package/esm/database/seed-command-action.mjs +1 -1
  374. package/esm/database/seed-command-action.mjs.map +1 -1
  375. package/esm/database/seeds/seed-records-table-migration.mjs +1 -1
  376. package/esm/database/seeds/seed-records-table-migration.mjs.map +1 -1
  377. package/esm/database/seeds/seeder.d.mts +1 -1
  378. package/esm/database/seeds/seeder.d.mts.map +1 -1
  379. package/esm/database/seeds/seeder.errors.d.mts +5 -1
  380. package/esm/database/seeds/seeder.errors.d.mts.map +1 -1
  381. package/esm/database/seeds/seeder.errors.mjs +3 -1
  382. package/esm/database/seeds/seeder.errors.mjs.map +1 -1
  383. package/esm/database/seeds/seeder.mjs +1 -1
  384. package/esm/database/seeds/seeder.mjs.map +1 -1
  385. package/esm/database/seeds/seeders.manager.mjs +1 -1
  386. package/esm/database/seeds/seeders.manager.mjs.map +1 -1
  387. package/esm/database/seeds/seeds-table-migration.mjs +1 -1
  388. package/esm/database/seeds/seeds-table-migration.mjs.map +1 -1
  389. package/esm/database/seeds/types.d.mts +1 -1
  390. package/esm/database/seeds/types.d.mts.map +1 -1
  391. package/esm/database/seeds/utils.mjs +1 -1
  392. package/esm/database/seeds/utils.mjs.map +1 -1
  393. package/esm/database/utils.d.mts +1 -1
  394. package/esm/database/utils.d.mts.map +1 -1
  395. package/esm/database/utils.mjs +1 -1
  396. package/esm/database/utils.mjs.map +1 -1
  397. package/esm/dev-server/app-module-registry.mjs +1 -1
  398. package/esm/dev-server/app-module-registry.mjs.map +1 -1
  399. package/esm/dev-server/boot-precondition-error.mjs +2 -1
  400. package/esm/dev-server/boot-precondition-error.mjs.map +1 -1
  401. package/esm/dev-server/build-development-openapi-document.mjs +1 -1
  402. package/esm/dev-server/build-development-openapi-document.mjs.map +1 -1
  403. package/esm/dev-server/check-for-updates.mjs +1 -1
  404. package/esm/dev-server/check-for-updates.mjs.map +1 -1
  405. package/esm/dev-server/collect-development-api-routes.mjs +1 -1
  406. package/esm/dev-server/collect-development-api-routes.mjs.map +1 -1
  407. package/esm/dev-server/create-worker.mjs +16 -10
  408. package/esm/dev-server/create-worker.mjs.map +1 -1
  409. package/esm/dev-server/dependency-graph.d.mts +1 -1
  410. package/esm/dev-server/dependency-graph.d.mts.map +1 -1
  411. package/esm/dev-server/dependency-graph.mjs +1 -1
  412. package/esm/dev-server/dependency-graph.mjs.map +1 -1
  413. package/esm/dev-server/dev-agent-tooling.mjs +135 -0
  414. package/esm/dev-server/dev-agent-tooling.mjs.map +1 -0
  415. package/esm/dev-server/dev-logger.mjs +1 -1
  416. package/esm/dev-server/dev-logger.mjs.map +1 -1
  417. package/esm/dev-server/development-server.mjs +9 -1
  418. package/esm/dev-server/development-server.mjs.map +1 -1
  419. package/esm/dev-server/events.mjs +1 -1
  420. package/esm/dev-server/events.mjs.map +1 -1
  421. package/esm/dev-server/extract-translation-keys.mjs +1 -1
  422. package/esm/dev-server/extract-translation-keys.mjs.map +1 -1
  423. package/esm/dev-server/file-event-handler.mjs +1 -1
  424. package/esm/dev-server/file-event-handler.mjs.map +1 -1
  425. package/esm/dev-server/file-manager.d.mts +1 -1
  426. package/esm/dev-server/file-manager.d.mts.map +1 -1
  427. package/esm/dev-server/file-manager.mjs +1 -1
  428. package/esm/dev-server/file-manager.mjs.map +1 -1
  429. package/esm/dev-server/file-operations.d.mts +1 -1
  430. package/esm/dev-server/file-operations.d.mts.map +1 -1
  431. package/esm/dev-server/file-operations.mjs +1 -1
  432. package/esm/dev-server/file-operations.mjs.map +1 -1
  433. package/esm/dev-server/files-orchestrator.mjs +22 -20
  434. package/esm/dev-server/files-orchestrator.mjs.map +1 -1
  435. package/esm/dev-server/files-watcher.mjs +2 -2
  436. package/esm/dev-server/files-watcher.mjs.map +1 -1
  437. package/esm/dev-server/flags.mjs +1 -1
  438. package/esm/dev-server/flags.mjs.map +1 -1
  439. package/esm/dev-server/health-checker/checkers/base-health-checker.mjs +1 -1
  440. package/esm/dev-server/health-checker/checkers/base-health-checker.mjs.map +1 -1
  441. package/esm/dev-server/health-checker/checkers/eslint-health-checker.mjs +3 -4
  442. package/esm/dev-server/health-checker/checkers/eslint-health-checker.mjs.map +1 -1
  443. package/esm/dev-server/health-checker/checkers/oxlint-health-checker.mjs +33 -0
  444. package/esm/dev-server/health-checker/checkers/oxlint-health-checker.mjs.map +1 -0
  445. package/esm/dev-server/health-checker/checkers/typescript-health-checker.mjs +1 -1
  446. package/esm/dev-server/health-checker/checkers/typescript-health-checker.mjs.map +1 -1
  447. package/esm/dev-server/health-checker/default-health-checkers.mjs +31 -0
  448. package/esm/dev-server/health-checker/default-health-checkers.mjs.map +1 -0
  449. package/esm/dev-server/health-checker/file-health-checker.contract.d.mts +10 -4
  450. package/esm/dev-server/health-checker/file-health-checker.contract.d.mts.map +1 -1
  451. package/esm/dev-server/health-checker/file-health-result.d.mts +1 -1
  452. package/esm/dev-server/health-checker/file-health-result.d.mts.map +1 -1
  453. package/esm/dev-server/health-checker/file-health-result.mjs +1 -1
  454. package/esm/dev-server/health-checker/file-health-result.mjs.map +1 -1
  455. package/esm/dev-server/health-checker/files-healthcare.manager.mjs +16 -5
  456. package/esm/dev-server/health-checker/files-healthcare.manager.mjs.map +1 -1
  457. package/esm/dev-server/health-checker/oxlint-runner.mjs +302 -0
  458. package/esm/dev-server/health-checker/oxlint-runner.mjs.map +1 -0
  459. package/esm/dev-server/health-checker/workers/eslint-health.worker.mjs +1 -1
  460. package/esm/dev-server/health-checker/workers/eslint-health.worker.mjs.map +1 -1
  461. package/esm/dev-server/health-checker/workers/oxlint-health.worker.d.mts +1 -0
  462. package/esm/dev-server/health-checker/workers/oxlint-health.worker.mjs +42 -0
  463. package/esm/dev-server/health-checker/workers/oxlint-health.worker.mjs.map +1 -0
  464. package/esm/dev-server/health-checker/workers/ts-health.worker.mjs +1 -1
  465. package/esm/dev-server/health-checker/workers/ts-health.worker.mjs.map +1 -1
  466. package/esm/dev-server/layer-executor.mjs +1 -1
  467. package/esm/dev-server/layer-executor.mjs.map +1 -1
  468. package/esm/dev-server/legacy-locales-warning.mjs +1 -1
  469. package/esm/dev-server/legacy-locales-warning.mjs.map +1 -1
  470. package/esm/dev-server/loader/build-transpile-init.mjs +1 -1
  471. package/esm/dev-server/loader/build-transpile-init.mjs.map +1 -1
  472. package/esm/dev-server/loader/hook-thread.d.mts +1 -1
  473. package/esm/dev-server/loader/hook-thread.d.mts.map +1 -1
  474. package/esm/dev-server/loader/hook-thread.mjs +1 -1
  475. package/esm/dev-server/loader/hook-thread.mjs.map +1 -1
  476. package/esm/dev-server/loader/load-hook.d.mts +1 -1
  477. package/esm/dev-server/loader/load-hook.d.mts.map +1 -1
  478. package/esm/dev-server/loader/load-hook.mjs +1 -1
  479. package/esm/dev-server/loader/load-hook.mjs.map +1 -1
  480. package/esm/dev-server/loader/loader-port-acks.mjs +34 -0
  481. package/esm/dev-server/loader/loader-port-acks.mjs.map +1 -0
  482. package/esm/dev-server/loader/own-resolver.mjs +1 -1
  483. package/esm/dev-server/loader/own-resolver.mjs.map +1 -1
  484. package/esm/dev-server/loader/register-loader.mjs +2 -2
  485. package/esm/dev-server/loader/register-loader.mjs.map +1 -1
  486. package/esm/dev-server/loader/resolve-capture.mjs +1 -1
  487. package/esm/dev-server/loader/resolve-capture.mjs.map +1 -1
  488. package/esm/dev-server/loader/resolve-hook.d.mts +1 -1
  489. package/esm/dev-server/loader/resolve-hook.d.mts.map +1 -1
  490. package/esm/dev-server/loader/resolve-hook.mjs +1 -1
  491. package/esm/dev-server/loader/resolve-hook.mjs.map +1 -1
  492. package/esm/dev-server/loader/source-slug.mjs +1 -1
  493. package/esm/dev-server/loader/source-slug.mjs.map +1 -1
  494. package/esm/dev-server/loader/transpile-cache.mjs +2 -2
  495. package/esm/dev-server/loader/transpile-cache.mjs.map +1 -1
  496. package/esm/dev-server/loader/version-registry.mjs +1 -1
  497. package/esm/dev-server/loader/version-registry.mjs.map +1 -1
  498. package/esm/dev-server/manifest-manager.d.mts +1 -1
  499. package/esm/dev-server/manifest-manager.d.mts.map +1 -1
  500. package/esm/dev-server/manifest-manager.mjs +1 -1
  501. package/esm/dev-server/manifest-manager.mjs.map +1 -1
  502. package/esm/dev-server/model-module-registry.mjs +1 -1
  503. package/esm/dev-server/model-module-registry.mjs.map +1 -1
  504. package/esm/dev-server/model-resource-typings.mjs +1 -1
  505. package/esm/dev-server/model-resource-typings.mjs.map +1 -1
  506. package/esm/dev-server/module-loader.mjs +2 -1
  507. package/esm/dev-server/module-loader.mjs.map +1 -1
  508. package/esm/dev-server/package-json-manager.mjs +1 -1
  509. package/esm/dev-server/package-json-manager.mjs.map +1 -1
  510. package/esm/dev-server/parse-imports.mjs +74 -7
  511. package/esm/dev-server/parse-imports.mjs.map +1 -1
  512. package/esm/dev-server/read-config-ast.mjs +1 -1
  513. package/esm/dev-server/read-config-ast.mjs.map +1 -1
  514. package/esm/dev-server/ready-block.mjs +1 -1
  515. package/esm/dev-server/ready-block.mjs.map +1 -1
  516. package/esm/dev-server/register-dev-shortcuts.mjs +1 -1
  517. package/esm/dev-server/register-dev-shortcuts.mjs.map +1 -1
  518. package/esm/dev-server/register-installed-devtools.mjs +1 -1
  519. package/esm/dev-server/register-installed-devtools.mjs.map +1 -1
  520. package/esm/dev-server/restart-dev-server.mjs +1 -1
  521. package/esm/dev-server/restart-dev-server.mjs.map +1 -1
  522. package/esm/dev-server/route-types-publisher.mjs +2 -2
  523. package/esm/dev-server/route-types-publisher.mjs.map +1 -1
  524. package/esm/dev-server/run-connector-typings.mjs +1 -1
  525. package/esm/dev-server/run-connector-typings.mjs.map +1 -1
  526. package/esm/dev-server/run-typings-generation.mjs +1 -1
  527. package/esm/dev-server/run-typings-generation.mjs.map +1 -1
  528. package/esm/dev-server/shortcuts.mjs +1 -1
  529. package/esm/dev-server/shortcuts.mjs.map +1 -1
  530. package/esm/dev-server/special-file-patterns.mjs +1 -1
  531. package/esm/dev-server/special-file-patterns.mjs.map +1 -1
  532. package/esm/dev-server/special-files-collector.d.mts +1 -1
  533. package/esm/dev-server/special-files-collector.d.mts.map +1 -1
  534. package/esm/dev-server/special-files-collector.mjs +1 -1
  535. package/esm/dev-server/special-files-collector.mjs.map +1 -1
  536. package/esm/dev-server/start-development-server.mjs +1 -1
  537. package/esm/dev-server/start-development-server.mjs.map +1 -1
  538. package/esm/dev-server/supervisor.mjs +1 -1
  539. package/esm/dev-server/supervisor.mjs.map +1 -1
  540. package/esm/dev-server/translation-keys-sources.mjs +2 -2
  541. package/esm/dev-server/translation-keys-sources.mjs.map +1 -1
  542. package/esm/dev-server/tsconfig-manager.mjs +1 -1
  543. package/esm/dev-server/tsconfig-manager.mjs.map +1 -1
  544. package/esm/dev-server/type-generator.mjs +33 -12
  545. package/esm/dev-server/type-generator.mjs.map +1 -1
  546. package/esm/dev-server/types.d.mts +1 -1
  547. package/esm/dev-server/types.d.mts.map +1 -1
  548. package/esm/dev-server/update-check-cache.mjs +1 -1
  549. package/esm/dev-server/update-check-cache.mjs.map +1 -1
  550. package/esm/dev-server/utils.mjs +1 -1
  551. package/esm/dev-server/utils.mjs.map +1 -1
  552. package/esm/encryption/encrypt.d.mts +1 -1
  553. package/esm/encryption/encrypt.d.mts.map +1 -1
  554. package/esm/encryption/encrypt.mjs +1 -1
  555. package/esm/encryption/encrypt.mjs.map +1 -1
  556. package/esm/encryption/hash.d.mts +1 -1
  557. package/esm/encryption/hash.d.mts.map +1 -1
  558. package/esm/encryption/hash.mjs +1 -1
  559. package/esm/encryption/hash.mjs.map +1 -1
  560. package/esm/encryption/password.d.mts +1 -1
  561. package/esm/encryption/password.d.mts.map +1 -1
  562. package/esm/encryption/password.mjs +1 -1
  563. package/esm/encryption/password.mjs.map +1 -1
  564. package/esm/encryption/types.d.mts +1 -1
  565. package/esm/encryption/types.d.mts.map +1 -1
  566. package/esm/errors/container-key-missing-error.mjs +2 -1
  567. package/esm/errors/container-key-missing-error.mjs.map +1 -1
  568. package/esm/errors/error-codes.d.mts +653 -0
  569. package/esm/errors/error-codes.d.mts.map +1 -0
  570. package/esm/errors/error-codes.mjs +634 -0
  571. package/esm/errors/error-codes.mjs.map +1 -0
  572. package/esm/errors/esbuild-binary-missing-error.mjs +2 -1
  573. package/esm/errors/esbuild-binary-missing-error.mjs.map +1 -1
  574. package/esm/errors/index.d.mts +4 -0
  575. package/esm/errors/index.mjs +5 -0
  576. package/esm/errors/unknown-locale-error.mjs +2 -1
  577. package/esm/errors/unknown-locale-error.mjs.map +1 -1
  578. package/esm/errors/warlock-error.d.mts +23 -0
  579. package/esm/errors/warlock-error.d.mts.map +1 -0
  580. package/esm/errors/warlock-error.mjs +22 -0
  581. package/esm/errors/warlock-error.mjs.map +1 -0
  582. package/esm/generations/add-command.action.mjs +48 -9
  583. package/esm/generations/add-command.action.mjs.map +1 -1
  584. package/esm/generations/features/access.feature.mjs +2 -2
  585. package/esm/generations/features/access.feature.mjs.map +1 -1
  586. package/esm/generations/features/ai-anthropic.feature.mjs +1 -1
  587. package/esm/generations/features/ai-anthropic.feature.mjs.map +1 -1
  588. package/esm/generations/features/ai-bedrock.feature.mjs +1 -1
  589. package/esm/generations/features/ai-bedrock.feature.mjs.map +1 -1
  590. package/esm/generations/features/ai-google.feature.mjs +1 -1
  591. package/esm/generations/features/ai-google.feature.mjs.map +1 -1
  592. package/esm/generations/features/ai-ollama.feature.mjs +1 -1
  593. package/esm/generations/features/ai-ollama.feature.mjs.map +1 -1
  594. package/esm/generations/features/ai-openai.feature.mjs +1 -1
  595. package/esm/generations/features/ai-openai.feature.mjs.map +1 -1
  596. package/esm/generations/features/ai-panoptic.feature.mjs +1 -1
  597. package/esm/generations/features/ai-panoptic.feature.mjs.map +1 -1
  598. package/esm/generations/features/ai-tools.feature.mjs +1 -1
  599. package/esm/generations/features/ai-tools.feature.mjs.map +1 -1
  600. package/esm/generations/features/ai-workspace.feature.mjs +1 -1
  601. package/esm/generations/features/ai-workspace.feature.mjs.map +1 -1
  602. package/esm/generations/features/ai.feature.mjs +1 -1
  603. package/esm/generations/features/ai.feature.mjs.map +1 -1
  604. package/esm/generations/features/auth-google.feature.mjs +1 -1
  605. package/esm/generations/features/auth-google.feature.mjs.map +1 -1
  606. package/esm/generations/features/auth-passkeys.feature.mjs +1 -1
  607. package/esm/generations/features/auth-passkeys.feature.mjs.map +1 -1
  608. package/esm/generations/features/bull-board.feature.mjs +2 -2
  609. package/esm/generations/features/bull-board.feature.mjs.map +1 -1
  610. package/esm/generations/features/devtools.feature.mjs +1 -1
  611. package/esm/generations/features/devtools.feature.mjs.map +1 -1
  612. package/esm/generations/features/herald.feature.mjs +1 -1
  613. package/esm/generations/features/herald.feature.mjs.map +1 -1
  614. package/esm/generations/features/image.feature.mjs +1 -1
  615. package/esm/generations/features/image.feature.mjs.map +1 -1
  616. package/esm/generations/features/index.mjs +1 -1
  617. package/esm/generations/features/index.mjs.map +1 -1
  618. package/esm/generations/features/mail.feature.mjs +1 -1
  619. package/esm/generations/features/mail.feature.mjs.map +1 -1
  620. package/esm/generations/features/mongodb.feature.mjs +1 -1
  621. package/esm/generations/features/mongodb.feature.mjs.map +1 -1
  622. package/esm/generations/features/mysql.feature.mjs +1 -1
  623. package/esm/generations/features/mysql.feature.mjs.map +1 -1
  624. package/esm/generations/features/notifications.feature.mjs +124 -17
  625. package/esm/generations/features/notifications.feature.mjs.map +1 -1
  626. package/esm/generations/features/postgres.feature.mjs +1 -1
  627. package/esm/generations/features/postgres.feature.mjs.map +1 -1
  628. package/esm/generations/features/queue.feature.mjs +2 -2
  629. package/esm/generations/features/queue.feature.mjs.map +1 -1
  630. package/esm/generations/features/react-email.feature.mjs +2 -2
  631. package/esm/generations/features/react-email.feature.mjs.map +1 -1
  632. package/esm/generations/features/react.feature.mjs +1 -1
  633. package/esm/generations/features/react.feature.mjs.map +1 -1
  634. package/esm/generations/features/redis.feature.mjs +1 -1
  635. package/esm/generations/features/redis.feature.mjs.map +1 -1
  636. package/esm/generations/features/s3.feature.mjs +1 -1
  637. package/esm/generations/features/s3.feature.mjs.map +1 -1
  638. package/esm/generations/features/scheduler.feature.mjs +1 -1
  639. package/esm/generations/features/scheduler.feature.mjs.map +1 -1
  640. package/esm/generations/features/ses.feature.mjs +1 -1
  641. package/esm/generations/features/ses.feature.mjs.map +1 -1
  642. package/esm/generations/features/shadcn.feature.mjs +2 -2
  643. package/esm/generations/features/shadcn.feature.mjs.map +1 -1
  644. package/esm/generations/features/shared/insert-connector-entry.mjs +1 -1
  645. package/esm/generations/features/shared/insert-connector-entry.mjs.map +1 -1
  646. package/esm/generations/features/shared/insert-queue-dashboard-block.mjs +1 -1
  647. package/esm/generations/features/shared/insert-queue-dashboard-block.mjs.map +1 -1
  648. package/esm/generations/features/shared/link-ai-package-import.mjs +2 -2
  649. package/esm/generations/features/shared/link-ai-package-import.mjs.map +1 -1
  650. package/esm/generations/features/shared/merge-web-sitemap-config.mjs +1 -1
  651. package/esm/generations/features/shared/merge-web-sitemap-config.mjs.map +1 -1
  652. package/esm/generations/features/shared/migration-timestamp.mjs +1 -1
  653. package/esm/generations/features/shared/migration-timestamp.mjs.map +1 -1
  654. package/esm/generations/features/shared/patch-tsconfig-include.mjs +2 -2
  655. package/esm/generations/features/shared/patch-tsconfig-include.mjs.map +1 -1
  656. package/esm/generations/features/shared/relocate-conflicting-home-route.mjs +2 -2
  657. package/esm/generations/features/shared/relocate-conflicting-home-route.mjs.map +1 -1
  658. package/esm/generations/features/shared/resolve-contact-scaffold.mjs +1 -1
  659. package/esm/generations/features/shared/resolve-contact-scaffold.mjs.map +1 -1
  660. package/esm/generations/features/sitemap.feature.mjs +2 -2
  661. package/esm/generations/features/sitemap.feature.mjs.map +1 -1
  662. package/esm/generations/features/socket.feature.mjs +1 -1
  663. package/esm/generations/features/socket.feature.mjs.map +1 -1
  664. package/esm/generations/features/tailwind.feature.mjs +2 -2
  665. package/esm/generations/features/tailwind.feature.mjs.map +1 -1
  666. package/esm/generations/features/test.feature.mjs +12 -7
  667. package/esm/generations/features/test.feature.mjs.map +1 -1
  668. package/esm/generations/features/types.mjs +1 -1
  669. package/esm/generations/features/types.mjs.map +1 -1
  670. package/esm/generations/features/web.feature.mjs +2 -2
  671. package/esm/generations/features/web.feature.mjs.map +1 -1
  672. package/esm/generations/generation-fs.mjs +73 -0
  673. package/esm/generations/generation-fs.mjs.map +1 -0
  674. package/esm/generations/generation-run.mjs +185 -0
  675. package/esm/generations/generation-run.mjs.map +1 -0
  676. package/esm/generations/pnpm-build-approvals.mjs +89 -3
  677. package/esm/generations/pnpm-build-approvals.mjs.map +1 -1
  678. package/esm/generations/stubs.mjs +327 -79
  679. package/esm/generations/stubs.mjs.map +1 -1
  680. package/esm/http/boot-port-preflight.d.mts +1 -1
  681. package/esm/http/boot-port-preflight.d.mts.map +1 -1
  682. package/esm/http/boot-port-preflight.mjs +1 -1
  683. package/esm/http/boot-port-preflight.mjs.map +1 -1
  684. package/esm/http/bounded-stream-queue.d.mts +10 -0
  685. package/esm/http/bounded-stream-queue.d.mts.map +1 -0
  686. package/esm/http/bounded-stream-queue.mjs +97 -0
  687. package/esm/http/bounded-stream-queue.mjs.map +1 -0
  688. package/esm/http/build-cors-options.mjs +1 -1
  689. package/esm/http/build-cors-options.mjs.map +1 -1
  690. package/esm/http/build-rate-limit-options.d.mts +35 -1
  691. package/esm/http/build-rate-limit-options.d.mts.map +1 -1
  692. package/esm/http/build-rate-limit-options.mjs +7 -1
  693. package/esm/http/build-rate-limit-options.mjs.map +1 -1
  694. package/esm/http/conditional-request.d.mts +86 -0
  695. package/esm/http/conditional-request.d.mts.map +1 -0
  696. package/esm/http/conditional-request.mjs +121 -0
  697. package/esm/http/conditional-request.mjs.map +1 -0
  698. package/esm/http/config.d.mts +1 -1
  699. package/esm/http/config.d.mts.map +1 -1
  700. package/esm/http/config.mjs +1 -1
  701. package/esm/http/config.mjs.map +1 -1
  702. package/esm/http/context/request-context.d.mts +1 -1
  703. package/esm/http/context/request-context.d.mts.map +1 -1
  704. package/esm/http/context/request-context.mjs +1 -1
  705. package/esm/http/context/request-context.mjs.map +1 -1
  706. package/esm/http/context/request-memo.d.mts +1 -1
  707. package/esm/http/context/request-memo.d.mts.map +1 -1
  708. package/esm/http/context/request-memo.mjs +1 -1
  709. package/esm/http/context/request-memo.mjs.map +1 -1
  710. package/esm/http/createHttpApplication.d.mts +1 -1
  711. package/esm/http/createHttpApplication.d.mts.map +1 -1
  712. package/esm/http/createHttpApplication.mjs +1 -1
  713. package/esm/http/createHttpApplication.mjs.map +1 -1
  714. package/esm/http/csp.d.mts +3 -1
  715. package/esm/http/csp.d.mts.map +1 -1
  716. package/esm/http/csp.mjs +2 -1
  717. package/esm/http/csp.mjs.map +1 -1
  718. package/esm/http/csrf-default-guard.d.mts +1 -1
  719. package/esm/http/csrf-default-guard.d.mts.map +1 -1
  720. package/esm/http/csrf-default-guard.mjs +1 -1
  721. package/esm/http/csrf-default-guard.mjs.map +1 -1
  722. package/esm/http/csrf-origin-policy.d.mts +1 -1
  723. package/esm/http/csrf-origin-policy.d.mts.map +1 -1
  724. package/esm/http/csrf-origin-policy.mjs +1 -1
  725. package/esm/http/csrf-origin-policy.mjs.map +1 -1
  726. package/esm/http/database/RequestLog.d.mts +27 -135
  727. package/esm/http/database/RequestLog.d.mts.map +1 -1
  728. package/esm/http/database/RequestLog.mjs +1 -1
  729. package/esm/http/database/RequestLog.mjs.map +1 -1
  730. package/esm/http/error-codes.d.mts +1 -1
  731. package/esm/http/error-codes.d.mts.map +1 -1
  732. package/esm/http/error-codes.mjs +1 -1
  733. package/esm/http/error-codes.mjs.map +1 -1
  734. package/esm/http/error-mapper.d.mts +48 -0
  735. package/esm/http/error-mapper.d.mts.map +1 -0
  736. package/esm/http/error-mapper.mjs +48 -0
  737. package/esm/http/error-mapper.mjs.map +1 -0
  738. package/esm/http/errors/errors.d.mts +3 -1
  739. package/esm/http/errors/errors.d.mts.map +1 -1
  740. package/esm/http/errors/errors.mjs +2 -1
  741. package/esm/http/errors/errors.mjs.map +1 -1
  742. package/esm/http/escape-header-value.d.mts +18 -0
  743. package/esm/http/escape-header-value.d.mts.map +1 -0
  744. package/esm/http/escape-header-value.mjs +27 -0
  745. package/esm/http/escape-header-value.mjs.map +1 -0
  746. package/esm/http/events.d.mts +1 -1
  747. package/esm/http/events.d.mts.map +1 -1
  748. package/esm/http/events.mjs +1 -1
  749. package/esm/http/events.mjs.map +1 -1
  750. package/esm/http/flush-pending-cookies.mjs +1 -1
  751. package/esm/http/flush-pending-cookies.mjs.map +1 -1
  752. package/esm/http/health.d.mts +1 -1
  753. package/esm/http/health.d.mts.map +1 -1
  754. package/esm/http/health.mjs +1 -1
  755. package/esm/http/health.mjs.map +1 -1
  756. package/esm/http/index.d.mts +13 -6
  757. package/esm/http/index.mjs +12 -6
  758. package/esm/http/lazy-static.mjs +194 -0
  759. package/esm/http/lazy-static.mjs.map +1 -0
  760. package/esm/http/middleware/cache-response-middleware.d.mts +1 -1
  761. package/esm/http/middleware/cache-response-middleware.d.mts.map +1 -1
  762. package/esm/http/middleware/cache-response-middleware.mjs +1 -1
  763. package/esm/http/middleware/cache-response-middleware.mjs.map +1 -1
  764. package/esm/http/middleware/concurrency-limit.middleware.d.mts +1 -1
  765. package/esm/http/middleware/concurrency-limit.middleware.d.mts.map +1 -1
  766. package/esm/http/middleware/concurrency-limit.middleware.mjs +1 -1
  767. package/esm/http/middleware/concurrency-limit.middleware.mjs.map +1 -1
  768. package/esm/http/middleware/idempotency.middleware.d.mts +1 -1
  769. package/esm/http/middleware/idempotency.middleware.d.mts.map +1 -1
  770. package/esm/http/middleware/idempotency.middleware.mjs +1 -1
  771. package/esm/http/middleware/idempotency.middleware.mjs.map +1 -1
  772. package/esm/http/middleware/inject-request-context.d.mts +1 -1
  773. package/esm/http/middleware/inject-request-context.d.mts.map +1 -1
  774. package/esm/http/middleware/inject-request-context.mjs +4 -2
  775. package/esm/http/middleware/inject-request-context.mjs.map +1 -1
  776. package/esm/http/middleware/ip-filter.middleware.d.mts +1 -1
  777. package/esm/http/middleware/ip-filter.middleware.d.mts.map +1 -1
  778. package/esm/http/middleware/ip-filter.middleware.mjs +1 -1
  779. package/esm/http/middleware/ip-filter.middleware.mjs.map +1 -1
  780. package/esm/http/middleware/maintenance.middleware.d.mts +1 -1
  781. package/esm/http/middleware/maintenance.middleware.d.mts.map +1 -1
  782. package/esm/http/middleware/maintenance.middleware.mjs +1 -1
  783. package/esm/http/middleware/maintenance.middleware.mjs.map +1 -1
  784. package/esm/http/middleware/max-body-size.middleware.d.mts +1 -1
  785. package/esm/http/middleware/max-body-size.middleware.d.mts.map +1 -1
  786. package/esm/http/middleware/max-body-size.middleware.mjs +1 -1
  787. package/esm/http/middleware/max-body-size.middleware.mjs.map +1 -1
  788. package/esm/http/middleware/middleware-list.d.mts +1 -1
  789. package/esm/http/middleware/middleware-list.d.mts.map +1 -1
  790. package/esm/http/middleware/middleware-list.mjs +1 -1
  791. package/esm/http/middleware/middleware-list.mjs.map +1 -1
  792. package/esm/http/middleware/rate-limit.middleware.d.mts +20 -5
  793. package/esm/http/middleware/rate-limit.middleware.d.mts.map +1 -1
  794. package/esm/http/middleware/rate-limit.middleware.mjs +34 -12
  795. package/esm/http/middleware/rate-limit.middleware.mjs.map +1 -1
  796. package/esm/http/middleware/utils/cidr-match.d.mts +1 -1
  797. package/esm/http/middleware/utils/cidr-match.d.mts.map +1 -1
  798. package/esm/http/middleware/utils/cidr-match.mjs +1 -1
  799. package/esm/http/middleware/utils/cidr-match.mjs.map +1 -1
  800. package/esm/http/middleware/utils/idempotency-key.d.mts +1 -1
  801. package/esm/http/middleware/utils/idempotency-key.d.mts.map +1 -1
  802. package/esm/http/middleware/utils/idempotency-key.mjs +1 -1
  803. package/esm/http/middleware/utils/idempotency-key.mjs.map +1 -1
  804. package/esm/http/middleware/utils/parse-size.d.mts +1 -1
  805. package/esm/http/middleware/utils/parse-size.d.mts.map +1 -1
  806. package/esm/http/middleware/utils/parse-size.mjs +1 -1
  807. package/esm/http/middleware/utils/parse-size.mjs.map +1 -1
  808. package/esm/http/parse-urlencoded-body.mjs +1 -1
  809. package/esm/http/parse-urlencoded-body.mjs.map +1 -1
  810. package/esm/http/plugins.d.mts +9 -2
  811. package/esm/http/plugins.d.mts.map +1 -1
  812. package/esm/http/plugins.mjs +23 -6
  813. package/esm/http/plugins.mjs.map +1 -1
  814. package/esm/http/port-preflight.d.mts +1 -1
  815. package/esm/http/port-preflight.d.mts.map +1 -1
  816. package/esm/http/port-preflight.mjs +1 -1
  817. package/esm/http/port-preflight.mjs.map +1 -1
  818. package/esm/http/rate-limit-cache-store.mjs +156 -0
  819. package/esm/http/rate-limit-cache-store.mjs.map +1 -0
  820. package/esm/http/ready-report.d.mts +1 -1
  821. package/esm/http/ready-report.d.mts.map +1 -1
  822. package/esm/http/ready-report.mjs +1 -1
  823. package/esm/http/ready-report.mjs.map +1 -1
  824. package/esm/http/request-controller.d.mts +1 -1
  825. package/esm/http/request-controller.d.mts.map +1 -1
  826. package/esm/http/request-controller.mjs +1 -1
  827. package/esm/http/request-controller.mjs.map +1 -1
  828. package/esm/http/request-log-snapshot.d.mts +130 -0
  829. package/esm/http/request-log-snapshot.d.mts.map +1 -0
  830. package/esm/http/request-log-snapshot.mjs +220 -0
  831. package/esm/http/request-log-snapshot.mjs.map +1 -0
  832. package/esm/http/request.d.mts +43 -4
  833. package/esm/http/request.d.mts.map +1 -1
  834. package/esm/http/request.mjs +70 -6
  835. package/esm/http/request.mjs.map +1 -1
  836. package/esm/http/resolve-bind-port.mjs +1 -1
  837. package/esm/http/resolve-bind-port.mjs.map +1 -1
  838. package/esm/http/response.d.mts +51 -9
  839. package/esm/http/response.d.mts.map +1 -1
  840. package/esm/http/response.mjs +301 -101
  841. package/esm/http/response.mjs.map +1 -1
  842. package/esm/http/safe-redirect.d.mts +51 -0
  843. package/esm/http/safe-redirect.d.mts.map +1 -0
  844. package/esm/http/safe-redirect.mjs +80 -0
  845. package/esm/http/safe-redirect.mjs.map +1 -0
  846. package/esm/http/serialized.d.mts +1 -1
  847. package/esm/http/serialized.d.mts.map +1 -1
  848. package/esm/http/server-rebuilt.d.mts +1 -1
  849. package/esm/http/server-rebuilt.d.mts.map +1 -1
  850. package/esm/http/server-rebuilt.mjs +1 -1
  851. package/esm/http/server-rebuilt.mjs.map +1 -1
  852. package/esm/http/server.d.mts +36 -6
  853. package/esm/http/server.d.mts.map +1 -1
  854. package/esm/http/server.mjs +80 -5
  855. package/esm/http/server.mjs.map +1 -1
  856. package/esm/http/stream-react-response.d.mts +1 -1
  857. package/esm/http/stream-react-response.d.mts.map +1 -1
  858. package/esm/http/stream-react-response.mjs +1 -1
  859. package/esm/http/stream-react-response.mjs.map +1 -1
  860. package/esm/http/stream-transport.mjs +77 -0
  861. package/esm/http/stream-transport.mjs.map +1 -0
  862. package/esm/http/tracing/trace-id.d.mts +1 -1
  863. package/esm/http/tracing/trace-id.d.mts.map +1 -1
  864. package/esm/http/tracing/trace-id.mjs +1 -1
  865. package/esm/http/tracing/trace-id.mjs.map +1 -1
  866. package/esm/http/tracing/tracing-dispatcher.d.mts +1 -1
  867. package/esm/http/tracing/tracing-dispatcher.d.mts.map +1 -1
  868. package/esm/http/tracing/tracing-dispatcher.mjs +1 -1
  869. package/esm/http/tracing/tracing-dispatcher.mjs.map +1 -1
  870. package/esm/http/tracing/tracing.type.d.mts +1 -1
  871. package/esm/http/tracing/tracing.type.d.mts.map +1 -1
  872. package/esm/http/types.d.mts +165 -7
  873. package/esm/http/types.d.mts.map +1 -1
  874. package/esm/http/uploaded-file.d.mts +2 -2
  875. package/esm/http/uploaded-file.d.mts.map +1 -1
  876. package/esm/http/uploaded-file.mjs +2 -2
  877. package/esm/http/uploaded-file.mjs.map +1 -1
  878. package/esm/http/uploads/detect-image-format.mjs +1 -1
  879. package/esm/http/uploads/detect-image-format.mjs.map +1 -1
  880. package/esm/http/uploads/generate-image-variant.mjs +2 -2
  881. package/esm/http/uploads/generate-image-variant.mjs.map +1 -1
  882. package/esm/http/uploads/generate-image-variants.d.mts +11 -8
  883. package/esm/http/uploads/generate-image-variants.d.mts.map +1 -1
  884. package/esm/http/uploads/generate-image-variants.mjs +75 -30
  885. package/esm/http/uploads/generate-image-variants.mjs.map +1 -1
  886. package/esm/http/uploads/image-variant-cache-entries.mjs +78 -0
  887. package/esm/http/uploads/image-variant-cache-entries.mjs.map +1 -0
  888. package/esm/http/uploads/image-variant-cache.mjs +185 -0
  889. package/esm/http/uploads/image-variant-cache.mjs.map +1 -0
  890. package/esm/http/uploads/image-variant-types.d.mts +3 -1
  891. package/esm/http/uploads/image-variant-types.d.mts.map +1 -1
  892. package/esm/http/uploads/image-variants-config-error.d.mts +4 -2
  893. package/esm/http/uploads/image-variants-config-error.d.mts.map +1 -1
  894. package/esm/http/uploads/image-variants-config-error.mjs +4 -3
  895. package/esm/http/uploads/image-variants-config-error.mjs.map +1 -1
  896. package/esm/http/uploads/index.d.mts +3 -1
  897. package/esm/http/uploads/index.mjs +3 -1
  898. package/esm/http/uploads/is-path-inside.mjs +1 -1
  899. package/esm/http/uploads/is-path-inside.mjs.map +1 -1
  900. package/esm/http/uploads/load-variant-source.mjs +2 -2
  901. package/esm/http/uploads/load-variant-source.mjs.map +1 -1
  902. package/esm/http/uploads/local-disk-root.mjs +24 -0
  903. package/esm/http/uploads/local-disk-root.mjs.map +1 -0
  904. package/esm/http/uploads/parse-uploaded-file-query.mjs +1 -1
  905. package/esm/http/uploads/parse-uploaded-file-query.mjs.map +1 -1
  906. package/esm/http/uploads/purge-image-variants.d.mts +37 -0
  907. package/esm/http/uploads/purge-image-variants.d.mts.map +1 -0
  908. package/esm/http/uploads/purge-image-variants.mjs +46 -0
  909. package/esm/http/uploads/purge-image-variants.mjs.map +1 -0
  910. package/esm/http/uploads/read-file-head.mjs +1 -1
  911. package/esm/http/uploads/read-file-head.mjs.map +1 -1
  912. package/esm/http/uploads/remote-variant-source.mjs +115 -0
  913. package/esm/http/uploads/remote-variant-source.mjs.map +1 -0
  914. package/esm/http/uploads/resolve-image-variant.d.mts +72 -0
  915. package/esm/http/uploads/resolve-image-variant.d.mts.map +1 -0
  916. package/esm/http/uploads/resolve-image-variant.mjs +99 -0
  917. package/esm/http/uploads/resolve-image-variant.mjs.map +1 -0
  918. package/esm/http/uploads/resolve-image-variants-config.mjs +6 -4
  919. package/esm/http/uploads/resolve-image-variants-config.mjs.map +1 -1
  920. package/esm/http/uploads/resolve-inline-image-content-type.mjs +1 -1
  921. package/esm/http/uploads/resolve-inline-image-content-type.mjs.map +1 -1
  922. package/esm/http/uploads/resolve-original-content-type.mjs +1 -1
  923. package/esm/http/uploads/resolve-original-content-type.mjs.map +1 -1
  924. package/esm/http/uploads/resolve-remote-image-variant.mjs +89 -0
  925. package/esm/http/uploads/resolve-remote-image-variant.mjs.map +1 -0
  926. package/esm/http/uploads/resolve-upload-path.mjs +3 -2
  927. package/esm/http/uploads/resolve-upload-path.mjs.map +1 -1
  928. package/esm/http/uploads/resolve-variant-candidate.mjs +1 -1
  929. package/esm/http/uploads/resolve-variant-candidate.mjs.map +1 -1
  930. package/esm/http/uploads/single-flight.mjs +1 -1
  931. package/esm/http/uploads/single-flight.mjs.map +1 -1
  932. package/esm/http/uploads/trim-image-variant-cache.mjs +193 -0
  933. package/esm/http/uploads/trim-image-variant-cache.mjs.map +1 -0
  934. package/esm/http/uploads/uploaded-file.controller.d.mts +27 -7
  935. package/esm/http/uploads/uploaded-file.controller.d.mts.map +1 -1
  936. package/esm/http/uploads/uploaded-file.controller.mjs +72 -92
  937. package/esm/http/uploads/uploaded-file.controller.mjs.map +1 -1
  938. package/esm/http/uploads/variant-cache-key.mjs +31 -6
  939. package/esm/http/uploads/variant-cache-key.mjs.map +1 -1
  940. package/esm/http/uploads/variant-generations.mjs +1 -1
  941. package/esm/http/uploads/variant-generations.mjs.map +1 -1
  942. package/esm/http/uploads-config.d.mts +1 -1
  943. package/esm/http/uploads-config.d.mts.map +1 -1
  944. package/esm/http/uploads-config.mjs +1 -1
  945. package/esm/http/uploads-config.mjs.map +1 -1
  946. package/esm/http/uploads-types.d.mts +7 -3
  947. package/esm/http/uploads-types.d.mts.map +1 -1
  948. package/esm/http/xmlable.d.mts +1 -1
  949. package/esm/http/xmlable.d.mts.map +1 -1
  950. package/esm/image/image.d.mts +1 -1
  951. package/esm/image/image.d.mts.map +1 -1
  952. package/esm/image/image.mjs +1 -1
  953. package/esm/image/image.mjs.map +1 -1
  954. package/esm/index.d.mts +27 -12
  955. package/esm/index.mjs +23 -9
  956. package/esm/loader/app-module-importer.d.mts +1 -1
  957. package/esm/loader/app-module-importer.d.mts.map +1 -1
  958. package/esm/loader/app-module-importer.mjs +1 -1
  959. package/esm/loader/app-module-importer.mjs.map +1 -1
  960. package/esm/localization/parse-locale-dictionary.d.mts +3 -1
  961. package/esm/localization/parse-locale-dictionary.d.mts.map +1 -1
  962. package/esm/localization/parse-locale-dictionary.mjs +2 -1
  963. package/esm/localization/parse-locale-dictionary.mjs.map +1 -1
  964. package/esm/localization/register-locale-dictionary.d.mts +1 -1
  965. package/esm/localization/register-locale-dictionary.d.mts.map +1 -1
  966. package/esm/localization/register-locale-dictionary.mjs +1 -1
  967. package/esm/localization/register-locale-dictionary.mjs.map +1 -1
  968. package/esm/logger/fatal-visibility.d.mts +1 -1
  969. package/esm/logger/fatal-visibility.d.mts.map +1 -1
  970. package/esm/logger/fatal-visibility.mjs +1 -1
  971. package/esm/logger/fatal-visibility.mjs.map +1 -1
  972. package/esm/logger/logger.d.mts +1 -1
  973. package/esm/logger/logger.d.mts.map +1 -1
  974. package/esm/logger/logger.mjs +1 -1
  975. package/esm/logger/logger.mjs.map +1 -1
  976. package/esm/logger/types.d.mts +1 -1
  977. package/esm/logger/types.d.mts.map +1 -1
  978. package/esm/mail/config.d.mts +13 -2
  979. package/esm/mail/config.d.mts.map +1 -1
  980. package/esm/mail/config.mjs +17 -2
  981. package/esm/mail/config.mjs.map +1 -1
  982. package/esm/mail/events.d.mts +1 -1
  983. package/esm/mail/events.d.mts.map +1 -1
  984. package/esm/mail/events.mjs +1 -1
  985. package/esm/mail/events.mjs.map +1 -1
  986. package/esm/mail/index.d.mts +1 -1
  987. package/esm/mail/index.mjs +1 -1
  988. package/esm/mail/mail.d.mts +1 -1
  989. package/esm/mail/mail.d.mts.map +1 -1
  990. package/esm/mail/mail.mjs +1 -1
  991. package/esm/mail/mail.mjs.map +1 -1
  992. package/esm/mail/mailer-pool.d.mts +1 -1
  993. package/esm/mail/mailer-pool.d.mts.map +1 -1
  994. package/esm/mail/mailer-pool.mjs +1 -1
  995. package/esm/mail/mailer-pool.mjs.map +1 -1
  996. package/esm/mail/react-mail.d.mts +1 -1
  997. package/esm/mail/react-mail.d.mts.map +1 -1
  998. package/esm/mail/react-mail.mjs +1 -1
  999. package/esm/mail/react-mail.mjs.map +1 -1
  1000. package/esm/mail/send-mail.d.mts +1 -1
  1001. package/esm/mail/send-mail.d.mts.map +1 -1
  1002. package/esm/mail/send-mail.mjs +7 -7
  1003. package/esm/mail/send-mail.mjs.map +1 -1
  1004. package/esm/mail/test-mailbox.d.mts +1 -1
  1005. package/esm/mail/test-mailbox.d.mts.map +1 -1
  1006. package/esm/mail/test-mailbox.mjs +1 -1
  1007. package/esm/mail/test-mailbox.mjs.map +1 -1
  1008. package/esm/mail/types.d.mts +1 -1
  1009. package/esm/mail/types.d.mts.map +1 -1
  1010. package/esm/mail/types.mjs +1 -1
  1011. package/esm/mail/types.mjs.map +1 -1
  1012. package/esm/manifest/manifest-manager.mjs +1 -1
  1013. package/esm/manifest/manifest-manager.mjs.map +1 -1
  1014. package/esm/net/index.d.mts +2 -0
  1015. package/esm/net/index.mjs +3 -0
  1016. package/esm/openapi/build-openapi-document.d.mts +1 -1
  1017. package/esm/openapi/build-openapi-document.d.mts.map +1 -1
  1018. package/esm/openapi/build-openapi-document.mjs +9 -6
  1019. package/esm/openapi/build-openapi-document.mjs.map +1 -1
  1020. package/esm/openapi/cast-schema.mjs +1 -1
  1021. package/esm/openapi/cast-schema.mjs.map +1 -1
  1022. package/esm/openapi/collect-openapi-document.mjs +1 -1
  1023. package/esm/openapi/collect-openapi-document.mjs.map +1 -1
  1024. package/esm/openapi/development-openapi-provider.d.mts +1 -1
  1025. package/esm/openapi/development-openapi-provider.d.mts.map +1 -1
  1026. package/esm/openapi/development-openapi-provider.mjs +1 -1
  1027. package/esm/openapi/development-openapi-provider.mjs.map +1 -1
  1028. package/esm/openapi/error-responses.mjs +29 -3
  1029. package/esm/openapi/error-responses.mjs.map +1 -1
  1030. package/esm/openapi/openapi-child-output.mjs +1 -1
  1031. package/esm/openapi/openapi-child-output.mjs.map +1 -1
  1032. package/esm/openapi/openapi-protocol.mjs +1 -1
  1033. package/esm/openapi/openapi-protocol.mjs.map +1 -1
  1034. package/esm/openapi/paths.mjs +1 -1
  1035. package/esm/openapi/paths.mjs.map +1 -1
  1036. package/esm/openapi/postman/build-request-body.mjs +1 -1
  1037. package/esm/openapi/postman/build-request-body.mjs.map +1 -1
  1038. package/esm/openapi/postman/build-request-url.mjs +1 -1
  1039. package/esm/openapi/postman/build-request-url.mjs.map +1 -1
  1040. package/esm/openapi/postman/build-saved-responses.mjs +1 -1
  1041. package/esm/openapi/postman/build-saved-responses.mjs.map +1 -1
  1042. package/esm/openapi/postman/example-from-schema.d.mts +1 -1
  1043. package/esm/openapi/postman/example-from-schema.d.mts.map +1 -1
  1044. package/esm/openapi/postman/example-from-schema.mjs +1 -1
  1045. package/esm/openapi/postman/example-from-schema.mjs.map +1 -1
  1046. package/esm/openapi/postman/http-status-text.mjs +1 -1
  1047. package/esm/openapi/postman/http-status-text.mjs.map +1 -1
  1048. package/esm/openapi/postman/openapi-to-postman-collection.d.mts +1 -1
  1049. package/esm/openapi/postman/openapi-to-postman-collection.d.mts.map +1 -1
  1050. package/esm/openapi/postman/openapi-to-postman-collection.mjs +1 -1
  1051. package/esm/openapi/postman/openapi-to-postman-collection.mjs.map +1 -1
  1052. package/esm/openapi/postman/postman-types.d.mts +1 -1
  1053. package/esm/openapi/postman/postman-types.d.mts.map +1 -1
  1054. package/esm/openapi/postman/resolve-operation-auth.mjs +1 -1
  1055. package/esm/openapi/postman/resolve-operation-auth.mjs.map +1 -1
  1056. package/esm/openapi/postman/schema-refs.d.mts +1 -1
  1057. package/esm/openapi/postman/schema-refs.d.mts.map +1 -1
  1058. package/esm/openapi/postman/schema-refs.mjs +1 -1
  1059. package/esm/openapi/postman/schema-refs.mjs.map +1 -1
  1060. package/esm/openapi/postman/uuid-v5.mjs +1 -1
  1061. package/esm/openapi/postman/uuid-v5.mjs.map +1 -1
  1062. package/esm/openapi/request-schemas.mjs +1 -1
  1063. package/esm/openapi/request-schemas.mjs.map +1 -1
  1064. package/esm/openapi/response-schemas.mjs +1 -1
  1065. package/esm/openapi/response-schemas.mjs.map +1 -1
  1066. package/esm/openapi/schema-registry.d.mts +1 -0
  1067. package/esm/openapi/schema-registry.mjs +1 -1
  1068. package/esm/openapi/schema-registry.mjs.map +1 -1
  1069. package/esm/openapi/security.mjs +1 -1
  1070. package/esm/openapi/security.mjs.map +1 -1
  1071. package/esm/openapi/types.d.mts +4 -3
  1072. package/esm/openapi/types.d.mts.map +1 -1
  1073. package/esm/production/assert-dist-ready-to-start.mjs +1 -1
  1074. package/esm/production/assert-dist-ready-to-start.mjs.map +1 -1
  1075. package/esm/production/assert-generated-imports.mjs +2 -1
  1076. package/esm/production/assert-generated-imports.mjs.map +1 -1
  1077. package/esm/production/build-app-production.mjs +1 -1
  1078. package/esm/production/build-app-production.mjs.map +1 -1
  1079. package/esm/production/build-contributions.mjs +1 -1
  1080. package/esm/production/build-contributions.mjs.map +1 -1
  1081. package/esm/production/bundle-framework-dependencies.mjs +1 -1
  1082. package/esm/production/bundle-framework-dependencies.mjs.map +1 -1
  1083. package/esm/production/dist-build-manifest.mjs +1 -1
  1084. package/esm/production/dist-build-manifest.mjs.map +1 -1
  1085. package/esm/production/esbuild-plugins.mjs +1 -1
  1086. package/esm/production/esbuild-plugins.mjs.map +1 -1
  1087. package/esm/production/esbuild-preflight.mjs +1 -1
  1088. package/esm/production/esbuild-preflight.mjs.map +1 -1
  1089. package/esm/production/production-builder.mjs +13 -5
  1090. package/esm/production/production-builder.mjs.map +1 -1
  1091. package/esm/production/production-supervisor.mjs +1 -1
  1092. package/esm/production/production-supervisor.mjs.map +1 -1
  1093. package/esm/production/promote-dist.mjs +1 -1
  1094. package/esm/production/promote-dist.mjs.map +1 -1
  1095. package/esm/production/registration-child-runner.mjs +1 -1
  1096. package/esm/production/registration-child-runner.mjs.map +1 -1
  1097. package/esm/production/resolve-build-config.d.mts +1 -1
  1098. package/esm/production/resolve-build-config.d.mts.map +1 -1
  1099. package/esm/production/resolve-build-config.mjs +2 -1
  1100. package/esm/production/resolve-build-config.mjs.map +1 -1
  1101. package/esm/production/route-registration-child.mjs +1 -1
  1102. package/esm/production/route-registration-child.mjs.map +1 -1
  1103. package/esm/production/route-registration-snapshot.mjs +1 -1
  1104. package/esm/production/route-registration-snapshot.mjs.map +1 -1
  1105. package/esm/production/tsconfig-path-aliases.mjs +1 -1
  1106. package/esm/production/tsconfig-path-aliases.mjs.map +1 -1
  1107. package/esm/react/index.d.mts +1 -1
  1108. package/esm/react/index.d.mts.map +1 -1
  1109. package/esm/react/index.mjs +1 -1
  1110. package/esm/react/index.mjs.map +1 -1
  1111. package/esm/repositories/adapters/cascade/cascade-adapter.d.mts +1 -1
  1112. package/esm/repositories/adapters/cascade/cascade-adapter.d.mts.map +1 -1
  1113. package/esm/repositories/adapters/cascade/cascade-adapter.mjs +1 -1
  1114. package/esm/repositories/adapters/cascade/cascade-adapter.mjs.map +1 -1
  1115. package/esm/repositories/adapters/cascade/cascade-query-builder.d.mts +1 -1
  1116. package/esm/repositories/adapters/cascade/cascade-query-builder.d.mts.map +1 -1
  1117. package/esm/repositories/adapters/cascade/cascade-query-builder.mjs +1 -1
  1118. package/esm/repositories/adapters/cascade/cascade-query-builder.mjs.map +1 -1
  1119. package/esm/repositories/adapters/cascade/filter-applicator.mjs +1 -1
  1120. package/esm/repositories/adapters/cascade/filter-applicator.mjs.map +1 -1
  1121. package/esm/repositories/contracts/query-builder.contract.d.mts +1 -1
  1122. package/esm/repositories/contracts/query-builder.contract.d.mts.map +1 -1
  1123. package/esm/repositories/contracts/repository-adapter.contract.d.mts +1 -1
  1124. package/esm/repositories/contracts/repository-adapter.contract.d.mts.map +1 -1
  1125. package/esm/repositories/contracts/types.d.mts +1 -1
  1126. package/esm/repositories/contracts/types.d.mts.map +1 -1
  1127. package/esm/repositories/repository.manager.d.mts +1 -1
  1128. package/esm/repositories/repository.manager.d.mts.map +1 -1
  1129. package/esm/repositories/repository.manager.mjs +1 -1
  1130. package/esm/repositories/repository.manager.mjs.map +1 -1
  1131. package/esm/resource/define-resource.d.mts +1 -1
  1132. package/esm/resource/define-resource.d.mts.map +1 -1
  1133. package/esm/resource/define-resource.mjs +1 -1
  1134. package/esm/resource/define-resource.mjs.map +1 -1
  1135. package/esm/resource/nullable-resource.d.mts +1 -1
  1136. package/esm/resource/nullable-resource.d.mts.map +1 -1
  1137. package/esm/resource/nullable-resource.mjs +1 -1
  1138. package/esm/resource/nullable-resource.mjs.map +1 -1
  1139. package/esm/resource/register-resource.d.mts +1 -1
  1140. package/esm/resource/register-resource.d.mts.map +1 -1
  1141. package/esm/resource/register-resource.mjs +1 -1
  1142. package/esm/resource/register-resource.mjs.map +1 -1
  1143. package/esm/resource/resource-field-builder.d.mts +1 -1
  1144. package/esm/resource/resource-field-builder.d.mts.map +1 -1
  1145. package/esm/resource/resource-field-builder.mjs +1 -1
  1146. package/esm/resource/resource-field-builder.mjs.map +1 -1
  1147. package/esm/resource/resource.d.mts +1 -1
  1148. package/esm/resource/resource.d.mts.map +1 -1
  1149. package/esm/resource/resource.mjs +1 -1
  1150. package/esm/resource/resource.mjs.map +1 -1
  1151. package/esm/resource/types.d.mts +1 -1
  1152. package/esm/resource/types.d.mts.map +1 -1
  1153. package/esm/restful/restful.d.mts +6 -6
  1154. package/esm/restful/restful.d.mts.map +1 -1
  1155. package/esm/restful/restful.mjs +1 -1
  1156. package/esm/restful/restful.mjs.map +1 -1
  1157. package/esm/router/build-route-rate-limit.mjs +1 -1
  1158. package/esm/router/build-route-rate-limit.mjs.map +1 -1
  1159. package/esm/router/describe-route-for-log.mjs +1 -1
  1160. package/esm/router/describe-route-for-log.mjs.map +1 -1
  1161. package/esm/router/dev-dispatch.mjs +32 -13
  1162. package/esm/router/dev-dispatch.mjs.map +1 -1
  1163. package/esm/router/index.d.mts +4 -2
  1164. package/esm/router/index.mjs +2 -0
  1165. package/esm/router/log-request-lifecycle.mjs +1 -1
  1166. package/esm/router/log-request-lifecycle.mjs.map +1 -1
  1167. package/esm/router/named-api-routes-with-responses.mjs +1 -1
  1168. package/esm/router/named-api-routes-with-responses.mjs.map +1 -1
  1169. package/esm/router/normalize-request-path.d.mts +1 -1
  1170. package/esm/router/normalize-request-path.d.mts.map +1 -1
  1171. package/esm/router/normalize-request-path.mjs +1 -1
  1172. package/esm/router/normalize-request-path.mjs.map +1 -1
  1173. package/esm/router/normalize-route-path.d.mts +1 -1
  1174. package/esm/router/normalize-route-path.d.mts.map +1 -1
  1175. package/esm/router/normalize-route-path.mjs +1 -1
  1176. package/esm/router/normalize-route-path.mjs.map +1 -1
  1177. package/esm/router/positional-handler-diagnostics.d.mts +1 -1
  1178. package/esm/router/positional-handler-diagnostics.d.mts.map +1 -1
  1179. package/esm/router/positional-handler-diagnostics.mjs +1 -1
  1180. package/esm/router/positional-handler-diagnostics.mjs.map +1 -1
  1181. package/esm/router/resolve-route-rate-limit.mjs +47 -0
  1182. package/esm/router/resolve-route-rate-limit.mjs.map +1 -0
  1183. package/esm/router/resolve-route-validation.mjs +19 -0
  1184. package/esm/router/resolve-route-validation.mjs.map +1 -0
  1185. package/esm/router/response-schema-types.mjs +1 -1
  1186. package/esm/router/response-schema-types.mjs.map +1 -1
  1187. package/esm/router/route-builder.d.mts +1 -1
  1188. package/esm/router/route-builder.d.mts.map +1 -1
  1189. package/esm/router/route-builder.mjs +1 -1
  1190. package/esm/router/route-builder.mjs.map +1 -1
  1191. package/esm/router/route-guard-names.mjs +30 -0
  1192. package/esm/router/route-guard-names.mjs.map +1 -0
  1193. package/esm/router/route-name-method-suffix.d.mts +1 -1
  1194. package/esm/router/route-name-method-suffix.d.mts.map +1 -1
  1195. package/esm/router/route-name-method-suffix.mjs +1 -1
  1196. package/esm/router/route-name-method-suffix.mjs.map +1 -1
  1197. package/esm/router/route-name-taken-error.d.mts +14 -0
  1198. package/esm/router/route-name-taken-error.d.mts.map +1 -0
  1199. package/esm/router/route-name-taken-error.mjs +18 -0
  1200. package/esm/router/route-name-taken-error.mjs.map +1 -0
  1201. package/esm/router/route-registry.d.mts +1 -1
  1202. package/esm/router/route-registry.d.mts.map +1 -1
  1203. package/esm/router/route-registry.mjs +1 -1
  1204. package/esm/router/route-registry.mjs.map +1 -1
  1205. package/esm/router/router.d.mts +35 -9
  1206. package/esm/router/router.d.mts.map +1 -1
  1207. package/esm/router/router.mjs +78 -40
  1208. package/esm/router/router.mjs.map +1 -1
  1209. package/esm/router/types.d.mts +150 -18
  1210. package/esm/router/types.d.mts.map +1 -1
  1211. package/esm/router/unguarded-route-diagnostics.d.mts +40 -0
  1212. package/esm/router/unguarded-route-diagnostics.d.mts.map +1 -0
  1213. package/esm/router/unguarded-route-diagnostics.mjs +95 -0
  1214. package/esm/router/unguarded-route-diagnostics.mjs.map +1 -0
  1215. package/esm/socket/types.d.mts +1 -1
  1216. package/esm/socket/types.d.mts.map +1 -1
  1217. package/esm/socket/utils.d.mts +1 -1
  1218. package/esm/socket/utils.d.mts.map +1 -1
  1219. package/esm/socket/utils.mjs +1 -1
  1220. package/esm/socket/utils.mjs.map +1 -1
  1221. package/esm/storage/config.d.mts +1 -1
  1222. package/esm/storage/config.d.mts.map +1 -1
  1223. package/esm/storage/config.mjs +1 -1
  1224. package/esm/storage/config.mjs.map +1 -1
  1225. package/esm/storage/context/storage-driver-context.d.mts +1 -1
  1226. package/esm/storage/context/storage-driver-context.d.mts.map +1 -1
  1227. package/esm/storage/context/storage-driver-context.mjs +1 -1
  1228. package/esm/storage/context/storage-driver-context.mjs.map +1 -1
  1229. package/esm/storage/drivers/cloud-driver.d.mts +1 -1
  1230. package/esm/storage/drivers/cloud-driver.d.mts.map +1 -1
  1231. package/esm/storage/drivers/cloud-driver.mjs +1 -1
  1232. package/esm/storage/drivers/cloud-driver.mjs.map +1 -1
  1233. package/esm/storage/drivers/do-spaces-driver.d.mts +1 -1
  1234. package/esm/storage/drivers/do-spaces-driver.d.mts.map +1 -1
  1235. package/esm/storage/drivers/do-spaces-driver.mjs +1 -1
  1236. package/esm/storage/drivers/do-spaces-driver.mjs.map +1 -1
  1237. package/esm/storage/drivers/local-driver.d.mts +12 -1
  1238. package/esm/storage/drivers/local-driver.d.mts.map +1 -1
  1239. package/esm/storage/drivers/local-driver.mjs +33 -1
  1240. package/esm/storage/drivers/local-driver.mjs.map +1 -1
  1241. package/esm/storage/drivers/r2-driver.d.mts +1 -1
  1242. package/esm/storage/drivers/r2-driver.d.mts.map +1 -1
  1243. package/esm/storage/drivers/r2-driver.mjs +1 -1
  1244. package/esm/storage/drivers/r2-driver.mjs.map +1 -1
  1245. package/esm/storage/drivers/s3-driver.d.mts +1 -1
  1246. package/esm/storage/drivers/s3-driver.d.mts.map +1 -1
  1247. package/esm/storage/drivers/s3-driver.mjs +1 -1
  1248. package/esm/storage/drivers/s3-driver.mjs.map +1 -1
  1249. package/esm/storage/index.d.mts +1 -1
  1250. package/esm/storage/local-disk-roots.mjs +24 -0
  1251. package/esm/storage/local-disk-roots.mjs.map +1 -0
  1252. package/esm/storage/scoped-storage.d.mts +1 -1
  1253. package/esm/storage/scoped-storage.d.mts.map +1 -1
  1254. package/esm/storage/scoped-storage.mjs +1 -1
  1255. package/esm/storage/scoped-storage.mjs.map +1 -1
  1256. package/esm/storage/storage-file.d.mts +1 -1
  1257. package/esm/storage/storage-file.d.mts.map +1 -1
  1258. package/esm/storage/storage-file.mjs +1 -1
  1259. package/esm/storage/storage-file.mjs.map +1 -1
  1260. package/esm/storage/storage.d.mts +17 -3
  1261. package/esm/storage/storage.d.mts.map +1 -1
  1262. package/esm/storage/storage.mjs +23 -1
  1263. package/esm/storage/storage.mjs.map +1 -1
  1264. package/esm/storage/types.d.mts +3 -2
  1265. package/esm/storage/types.d.mts.map +1 -1
  1266. package/esm/storage/utils/classify-ip-address.d.mts +1 -1
  1267. package/esm/storage/utils/classify-ip-address.d.mts.map +1 -1
  1268. package/esm/storage/utils/classify-ip-address.mjs +1 -1
  1269. package/esm/storage/utils/classify-ip-address.mjs.map +1 -1
  1270. package/esm/storage/utils/contain-path.d.mts +1 -1
  1271. package/esm/storage/utils/contain-path.d.mts.map +1 -1
  1272. package/esm/storage/utils/contain-path.mjs +1 -1
  1273. package/esm/storage/utils/contain-path.mjs.map +1 -1
  1274. package/esm/storage/utils/mime.d.mts +1 -1
  1275. package/esm/storage/utils/mime.d.mts.map +1 -1
  1276. package/esm/storage/utils/mime.mjs +1 -1
  1277. package/esm/storage/utils/mime.mjs.map +1 -1
  1278. package/esm/storage/utils/safe-fetch.d.mts +1 -1
  1279. package/esm/storage/utils/safe-fetch.d.mts.map +1 -1
  1280. package/esm/storage/utils/safe-fetch.mjs +1 -1
  1281. package/esm/storage/utils/safe-fetch.mjs.map +1 -1
  1282. package/esm/storage/utils/storage-capability-error.d.mts +1 -1
  1283. package/esm/storage/utils/storage-capability-error.d.mts.map +1 -1
  1284. package/esm/storage/utils/storage-capability-error.mjs +1 -1
  1285. package/esm/storage/utils/storage-capability-error.mjs.map +1 -1
  1286. package/esm/storage/utils/storage-error.d.mts +1 -1
  1287. package/esm/storage/utils/storage-error.d.mts.map +1 -1
  1288. package/esm/storage/utils/storage-error.mjs +1 -1
  1289. package/esm/storage/utils/storage-error.mjs.map +1 -1
  1290. package/esm/storage/utils/storage-not-initialized-error.d.mts +3 -1
  1291. package/esm/storage/utils/storage-not-initialized-error.d.mts.map +1 -1
  1292. package/esm/storage/utils/storage-not-initialized-error.mjs +2 -1
  1293. package/esm/storage/utils/storage-not-initialized-error.mjs.map +1 -1
  1294. package/esm/tests/authenticated-test-client.d.mts +32 -0
  1295. package/esm/tests/authenticated-test-client.d.mts.map +1 -0
  1296. package/esm/tests/authenticated-test-client.mjs +40 -0
  1297. package/esm/tests/authenticated-test-client.mjs.map +1 -0
  1298. package/esm/tests/factories.d.mts +59 -0
  1299. package/esm/tests/factories.d.mts.map +1 -0
  1300. package/esm/tests/factories.mjs +105 -0
  1301. package/esm/tests/factories.mjs.map +1 -0
  1302. package/esm/tests/fakes/cache-fake.d.mts +29 -0
  1303. package/esm/tests/fakes/cache-fake.d.mts.map +1 -0
  1304. package/esm/tests/fakes/cache-fake.mjs +79 -0
  1305. package/esm/tests/fakes/cache-fake.mjs.map +1 -0
  1306. package/esm/tests/fakes/clock-fake.d.mts +32 -0
  1307. package/esm/tests/fakes/clock-fake.d.mts.map +1 -0
  1308. package/esm/tests/fakes/clock-fake.mjs +69 -0
  1309. package/esm/tests/fakes/clock-fake.mjs.map +1 -0
  1310. package/esm/tests/fakes/fake-assertion-error.d.mts +13 -0
  1311. package/esm/tests/fakes/fake-assertion-error.d.mts.map +1 -0
  1312. package/esm/tests/fakes/fake-assertion-error.mjs +20 -0
  1313. package/esm/tests/fakes/fake-assertion-error.mjs.map +1 -0
  1314. package/esm/tests/fakes/ids-fake.d.mts +22 -0
  1315. package/esm/tests/fakes/ids-fake.d.mts.map +1 -0
  1316. package/esm/tests/fakes/ids-fake.mjs +57 -0
  1317. package/esm/tests/fakes/ids-fake.mjs.map +1 -0
  1318. package/esm/tests/fakes/index.d.mts +8 -0
  1319. package/esm/tests/fakes/index.mjs +10 -0
  1320. package/esm/tests/fakes/mail-fake.d.mts +41 -0
  1321. package/esm/tests/fakes/mail-fake.d.mts.map +1 -0
  1322. package/esm/tests/fakes/mail-fake.mjs +111 -0
  1323. package/esm/tests/fakes/mail-fake.mjs.map +1 -0
  1324. package/esm/tests/fakes/queue-fake.d.mts +48 -0
  1325. package/esm/tests/fakes/queue-fake.d.mts.map +1 -0
  1326. package/esm/tests/fakes/queue-fake.mjs +134 -0
  1327. package/esm/tests/fakes/queue-fake.mjs.map +1 -0
  1328. package/esm/tests/fakes/storage-fake.d.mts +31 -0
  1329. package/esm/tests/fakes/storage-fake.d.mts.map +1 -0
  1330. package/esm/tests/fakes/storage-fake.mjs +122 -0
  1331. package/esm/tests/fakes/storage-fake.mjs.map +1 -0
  1332. package/esm/tests/fakes/test-fakes.d.mts +39 -0
  1333. package/esm/tests/fakes/test-fakes.d.mts.map +1 -0
  1334. package/esm/tests/fakes/test-fakes.mjs +90 -0
  1335. package/esm/tests/fakes/test-fakes.mjs.map +1 -0
  1336. package/esm/tests/index.d.mts +14 -2
  1337. package/esm/tests/index.mjs +15 -2
  1338. package/esm/tests/snapshot-response.d.mts +34 -0
  1339. package/esm/tests/snapshot-response.d.mts.map +1 -0
  1340. package/esm/tests/snapshot-response.mjs +42 -0
  1341. package/esm/tests/snapshot-response.mjs.map +1 -0
  1342. package/esm/tests/start-http-development-server.d.mts +23 -1
  1343. package/esm/tests/start-http-development-server.d.mts.map +1 -1
  1344. package/esm/tests/start-http-development-server.mjs +37 -4
  1345. package/esm/tests/start-http-development-server.mjs.map +1 -1
  1346. package/esm/tests/test-connectors-selection.d.mts +1 -1
  1347. package/esm/tests/test-connectors-selection.d.mts.map +1 -1
  1348. package/esm/tests/test-connectors-selection.mjs +1 -1
  1349. package/esm/tests/test-connectors-selection.mjs.map +1 -1
  1350. package/esm/tests/test-helpers.d.mts +21 -2
  1351. package/esm/tests/test-helpers.d.mts.map +1 -1
  1352. package/esm/tests/test-helpers.mjs +41 -28
  1353. package/esm/tests/test-helpers.mjs.map +1 -1
  1354. package/esm/tests/test-http-server.d.mts +62 -0
  1355. package/esm/tests/test-http-server.d.mts.map +1 -0
  1356. package/esm/tests/test-http-server.mjs +119 -0
  1357. package/esm/tests/test-http-server.mjs.map +1 -0
  1358. package/esm/tests/test-lifecycle-state.mjs +1 -1
  1359. package/esm/tests/test-lifecycle-state.mjs.map +1 -1
  1360. package/esm/tests/test-server-port-channel.mjs +1 -1
  1361. package/esm/tests/test-server-port-channel.mjs.map +1 -1
  1362. package/esm/tests/test-setup-timeout.mjs +1 -1
  1363. package/esm/tests/test-setup-timeout.mjs.map +1 -1
  1364. package/esm/tests/vitest-setup.d.mts +12 -1
  1365. package/esm/tests/vitest-setup.d.mts.map +1 -1
  1366. package/esm/tests/vitest-setup.mjs +13 -5
  1367. package/esm/tests/vitest-setup.mjs.map +1 -1
  1368. package/esm/tooling/agents-md/agents-md-markers.d.mts +27 -0
  1369. package/esm/tooling/agents-md/agents-md-markers.d.mts.map +1 -0
  1370. package/esm/tooling/agents-md/agents-md-markers.mjs +59 -0
  1371. package/esm/tooling/agents-md/agents-md-markers.mjs.map +1 -0
  1372. package/esm/tooling/agents-md/agents-md-refresher.d.mts +36 -0
  1373. package/esm/tooling/agents-md/agents-md-refresher.d.mts.map +1 -0
  1374. package/esm/tooling/agents-md/agents-md-refresher.mjs +72 -0
  1375. package/esm/tooling/agents-md/agents-md-refresher.mjs.map +1 -0
  1376. package/esm/tooling/agents-md/index.mjs +7 -0
  1377. package/esm/tooling/agents-md/installed-skills.d.mts +30 -0
  1378. package/esm/tooling/agents-md/installed-skills.d.mts.map +1 -0
  1379. package/esm/tooling/agents-md/installed-skills.mjs +74 -0
  1380. package/esm/tooling/agents-md/installed-skills.mjs.map +1 -0
  1381. package/esm/tooling/agents-md/render-agents-md.d.mts +33 -0
  1382. package/esm/tooling/agents-md/render-agents-md.d.mts.map +1 -0
  1383. package/esm/tooling/agents-md/render-agents-md.mjs +195 -0
  1384. package/esm/tooling/agents-md/render-agents-md.mjs.map +1 -0
  1385. package/esm/tooling/agents-md/write-agents-md.d.mts +33 -0
  1386. package/esm/tooling/agents-md/write-agents-md.d.mts.map +1 -0
  1387. package/esm/tooling/agents-md/write-agents-md.mjs +49 -0
  1388. package/esm/tooling/agents-md/write-agents-md.mjs.map +1 -0
  1389. package/esm/tooling/board/board-message.d.mts +31 -0
  1390. package/esm/tooling/board/board-message.d.mts.map +1 -0
  1391. package/esm/tooling/board/board-message.mjs +86 -0
  1392. package/esm/tooling/board/board-message.mjs.map +1 -0
  1393. package/esm/tooling/board/board.d.mts +109 -0
  1394. package/esm/tooling/board/board.d.mts.map +1 -0
  1395. package/esm/tooling/board/board.mjs +406 -0
  1396. package/esm/tooling/board/board.mjs.map +1 -0
  1397. package/esm/tooling/board/board.types.d.mts +72 -0
  1398. package/esm/tooling/board/board.types.d.mts.map +1 -0
  1399. package/esm/tooling/board/board.types.mjs +54 -0
  1400. package/esm/tooling/board/board.types.mjs.map +1 -0
  1401. package/esm/tooling/check/changed-files.d.mts +33 -0
  1402. package/esm/tooling/check/changed-files.d.mts.map +1 -0
  1403. package/esm/tooling/check/changed-files.mjs +73 -0
  1404. package/esm/tooling/check/changed-files.mjs.map +1 -0
  1405. package/esm/tooling/check/check-report.types.d.mts +62 -0
  1406. package/esm/tooling/check/check-report.types.d.mts.map +1 -0
  1407. package/esm/tooling/check/check-report.types.mjs +37 -0
  1408. package/esm/tooling/check/check-report.types.mjs.map +1 -0
  1409. package/esm/tooling/check/code-style-conventions.mjs +106 -0
  1410. package/esm/tooling/check/code-style-conventions.mjs.map +1 -0
  1411. package/esm/tooling/check/conventions-step.d.mts +34 -0
  1412. package/esm/tooling/check/conventions-step.d.mts.map +1 -0
  1413. package/esm/tooling/check/conventions-step.mjs +184 -0
  1414. package/esm/tooling/check/conventions-step.mjs.map +1 -0
  1415. package/esm/tooling/check/environment-step.d.mts +18 -0
  1416. package/esm/tooling/check/environment-step.d.mts.map +1 -0
  1417. package/esm/tooling/check/environment-step.mjs +78 -0
  1418. package/esm/tooling/check/environment-step.mjs.map +1 -0
  1419. package/esm/tooling/check/index.d.mts +8 -0
  1420. package/esm/tooling/check/index.mjs +10 -0
  1421. package/esm/tooling/check/lint-step.d.mts +19 -0
  1422. package/esm/tooling/check/lint-step.d.mts.map +1 -0
  1423. package/esm/tooling/check/lint-step.mjs +111 -0
  1424. package/esm/tooling/check/lint-step.mjs.map +1 -0
  1425. package/esm/tooling/check/request-input.mjs +132 -0
  1426. package/esm/tooling/check/request-input.mjs.map +1 -0
  1427. package/esm/tooling/check/run-check.d.mts +35 -0
  1428. package/esm/tooling/check/run-check.d.mts.map +1 -0
  1429. package/esm/tooling/check/run-check.mjs +192 -0
  1430. package/esm/tooling/check/run-check.mjs.map +1 -0
  1431. package/esm/tooling/check/run-tests.d.mts +48 -0
  1432. package/esm/tooling/check/run-tests.d.mts.map +1 -0
  1433. package/esm/tooling/check/run-tests.mjs +93 -0
  1434. package/esm/tooling/check/run-tests.mjs.map +1 -0
  1435. package/esm/tooling/check/security-conventions.mjs +648 -0
  1436. package/esm/tooling/check/security-conventions.mjs.map +1 -0
  1437. package/esm/tooling/check/source-ast.mjs +195 -0
  1438. package/esm/tooling/check/source-ast.mjs.map +1 -0
  1439. package/esm/tooling/check/source-files.mjs +27 -0
  1440. package/esm/tooling/check/source-files.mjs.map +1 -0
  1441. package/esm/tooling/check/tests-step.d.mts +34 -0
  1442. package/esm/tooling/check/tests-step.d.mts.map +1 -0
  1443. package/esm/tooling/check/tests-step.mjs +177 -0
  1444. package/esm/tooling/check/tests-step.mjs.map +1 -0
  1445. package/esm/tooling/dev-state/dev-server-state.d.mts +39 -0
  1446. package/esm/tooling/dev-state/dev-server-state.d.mts.map +1 -0
  1447. package/esm/tooling/dev-state/dev-server-state.mjs +67 -0
  1448. package/esm/tooling/dev-state/dev-server-state.mjs.map +1 -0
  1449. package/esm/tooling/devtools/devtools-client.d.mts +91 -0
  1450. package/esm/tooling/devtools/devtools-client.d.mts.map +1 -0
  1451. package/esm/tooling/devtools/devtools-client.mjs +155 -0
  1452. package/esm/tooling/devtools/devtools-client.mjs.map +1 -0
  1453. package/esm/tooling/generate/generation.d.mts +78 -0
  1454. package/esm/tooling/generate/generation.d.mts.map +1 -0
  1455. package/esm/tooling/generate/generation.mjs +123 -0
  1456. package/esm/tooling/generate/generation.mjs.map +1 -0
  1457. package/esm/tooling/generate/generator-spec.d.mts +57 -0
  1458. package/esm/tooling/generate/generator-spec.d.mts.map +1 -0
  1459. package/esm/tooling/generate/generator-spec.mjs +102 -0
  1460. package/esm/tooling/generate/generator-spec.mjs.map +1 -0
  1461. package/esm/tooling/generate/index.mjs +6 -0
  1462. package/esm/tooling/generate/project-files.mjs +121 -0
  1463. package/esm/tooling/generate/project-files.mjs.map +1 -0
  1464. package/esm/tooling/generate/run-cli.d.mts +40 -0
  1465. package/esm/tooling/generate/run-cli.d.mts.map +1 -0
  1466. package/esm/tooling/generate/run-cli.mjs +93 -0
  1467. package/esm/tooling/generate/run-cli.mjs.map +1 -0
  1468. package/esm/tooling/generate/unified-diff.d.mts +37 -0
  1469. package/esm/tooling/generate/unified-diff.d.mts.map +1 -0
  1470. package/esm/tooling/generate/unified-diff.mjs +161 -0
  1471. package/esm/tooling/generate/unified-diff.mjs.map +1 -0
  1472. package/esm/tooling/index.d.mts +41 -0
  1473. package/esm/tooling/index.mjs +45 -0
  1474. package/esm/tooling/inspect/boot-for-inspect.d.mts +23 -0
  1475. package/esm/tooling/inspect/boot-for-inspect.d.mts.map +1 -0
  1476. package/esm/tooling/inspect/boot-for-inspect.mjs +63 -0
  1477. package/esm/tooling/inspect/boot-for-inspect.mjs.map +1 -0
  1478. package/esm/tooling/inspect/collect-config.mjs +77 -0
  1479. package/esm/tooling/inspect/collect-config.mjs.map +1 -0
  1480. package/esm/tooling/inspect/collect-models.d.mts +9 -0
  1481. package/esm/tooling/inspect/collect-models.d.mts.map +1 -0
  1482. package/esm/tooling/inspect/collect-models.mjs +154 -0
  1483. package/esm/tooling/inspect/collect-models.mjs.map +1 -0
  1484. package/esm/tooling/inspect/collect-packages.d.mts +10 -0
  1485. package/esm/tooling/inspect/collect-packages.d.mts.map +1 -0
  1486. package/esm/tooling/inspect/collect-packages.mjs +157 -0
  1487. package/esm/tooling/inspect/collect-packages.mjs.map +1 -0
  1488. package/esm/tooling/inspect/collect-pages.mjs +108 -0
  1489. package/esm/tooling/inspect/collect-pages.mjs.map +1 -0
  1490. package/esm/tooling/inspect/collect-routes.mjs +168 -0
  1491. package/esm/tooling/inspect/collect-routes.mjs.map +1 -0
  1492. package/esm/tooling/inspect/event-recorder.d.mts +37 -0
  1493. package/esm/tooling/inspect/event-recorder.d.mts.map +1 -0
  1494. package/esm/tooling/inspect/event-recorder.mjs +91 -0
  1495. package/esm/tooling/inspect/event-recorder.mjs.map +1 -0
  1496. package/esm/tooling/inspect/index.d.mts +7 -0
  1497. package/esm/tooling/inspect/index.mjs +7 -0
  1498. package/esm/tooling/inspect/inspect-app.d.mts +53 -0
  1499. package/esm/tooling/inspect/inspect-app.d.mts.map +1 -0
  1500. package/esm/tooling/inspect/inspect-app.mjs +92 -0
  1501. package/esm/tooling/inspect/inspect-app.mjs.map +1 -0
  1502. package/esm/tooling/inspect/inspect-report.schema.d.mts +15 -0
  1503. package/esm/tooling/inspect/inspect-report.schema.d.mts.map +1 -0
  1504. package/esm/tooling/inspect/inspect-report.schema.mjs +463 -0
  1505. package/esm/tooling/inspect/inspect-report.schema.mjs.map +1 -0
  1506. package/esm/tooling/inspect/inspect-report.types.d.mts +196 -0
  1507. package/esm/tooling/inspect/inspect-report.types.d.mts.map +1 -0
  1508. package/esm/tooling/inspect/inspect-report.types.mjs +33 -0
  1509. package/esm/tooling/inspect/inspect-report.types.mjs.map +1 -0
  1510. package/esm/tooling/mcp/create-mcp-context.d.mts +26 -0
  1511. package/esm/tooling/mcp/create-mcp-context.d.mts.map +1 -0
  1512. package/esm/tooling/mcp/create-mcp-context.mjs +75 -0
  1513. package/esm/tooling/mcp/create-mcp-context.mjs.map +1 -0
  1514. package/esm/tooling/mcp/db-schema.d.mts +49 -0
  1515. package/esm/tooling/mcp/db-schema.d.mts.map +1 -0
  1516. package/esm/tooling/mcp/db-schema.mjs +56 -0
  1517. package/esm/tooling/mcp/db-schema.mjs.map +1 -0
  1518. package/esm/tooling/mcp/docs-search.d.mts +72 -0
  1519. package/esm/tooling/mcp/docs-search.d.mts.map +1 -0
  1520. package/esm/tooling/mcp/docs-search.mjs +178 -0
  1521. package/esm/tooling/mcp/docs-search.mjs.map +1 -0
  1522. package/esm/tooling/mcp/index.mjs +9 -0
  1523. package/esm/tooling/mcp/load-ai-tools.d.mts +62 -0
  1524. package/esm/tooling/mcp/load-ai-tools.d.mts.map +1 -0
  1525. package/esm/tooling/mcp/load-ai-tools.mjs +44 -0
  1526. package/esm/tooling/mcp/load-ai-tools.mjs.map +1 -0
  1527. package/esm/tooling/mcp/mcp-tools.d.mts +60 -0
  1528. package/esm/tooling/mcp/mcp-tools.d.mts.map +1 -0
  1529. package/esm/tooling/mcp/mcp-tools.mjs +513 -0
  1530. package/esm/tooling/mcp/mcp-tools.mjs.map +1 -0
  1531. package/esm/tooling/mcp/start-mcp-server.d.mts +56 -0
  1532. package/esm/tooling/mcp/start-mcp-server.d.mts.map +1 -0
  1533. package/esm/tooling/mcp/start-mcp-server.mjs +126 -0
  1534. package/esm/tooling/mcp/start-mcp-server.mjs.map +1 -0
  1535. package/esm/tooling/mcp/tool-input.d.mts +75 -0
  1536. package/esm/tooling/mcp/tool-input.d.mts.map +1 -0
  1537. package/esm/tooling/mcp/tool-input.mjs +72 -0
  1538. package/esm/tooling/mcp/tool-input.mjs.map +1 -0
  1539. package/esm/tooling/problem.d.mts +45 -0
  1540. package/esm/tooling/problem.d.mts.map +1 -0
  1541. package/esm/tooling/problem.mjs +28 -0
  1542. package/esm/tooling/problem.mjs.map +1 -0
  1543. package/esm/tooling/trace/trace-report.types.d.mts +71 -0
  1544. package/esm/tooling/trace/trace-report.types.d.mts.map +1 -0
  1545. package/esm/tooling/trace/trace-report.types.mjs +7 -0
  1546. package/esm/tooling/trace/trace-report.types.mjs.map +1 -0
  1547. package/esm/tooling/trace/trace-request.d.mts +83 -0
  1548. package/esm/tooling/trace/trace-request.d.mts.map +1 -0
  1549. package/esm/tooling/trace/trace-request.mjs +241 -0
  1550. package/esm/tooling/trace/trace-request.mjs.map +1 -0
  1551. package/esm/tooling/typecheck/index.d.mts +1 -0
  1552. package/esm/tooling/typecheck/index.mjs +3 -0
  1553. package/esm/tooling/typecheck/run-typecheck.d.mts +59 -0
  1554. package/esm/tooling/typecheck/run-typecheck.d.mts.map +1 -0
  1555. package/esm/tooling/typecheck/run-typecheck.mjs +153 -0
  1556. package/esm/tooling/typecheck/run-typecheck.mjs.map +1 -0
  1557. package/esm/updater/package-manager.mjs +1 -1
  1558. package/esm/updater/package-manager.mjs.map +1 -1
  1559. package/esm/updater/update-warlock-packages.mjs +1 -1
  1560. package/esm/updater/update-warlock-packages.mjs.map +1 -1
  1561. package/esm/upgrade/codemods/head-viewport.mjs +46 -0
  1562. package/esm/upgrade/codemods/head-viewport.mjs.map +1 -0
  1563. package/esm/upgrade/codemods/helpers.mjs +81 -0
  1564. package/esm/upgrade/codemods/helpers.mjs.map +1 -0
  1565. package/esm/upgrade/codemods/index.mjs +34 -0
  1566. package/esm/upgrade/codemods/index.mjs.map +1 -0
  1567. package/esm/upgrade/codemods/logger-sync-calls.mjs +57 -0
  1568. package/esm/upgrade/codemods/logger-sync-calls.mjs.map +1 -0
  1569. package/esm/upgrade/codemods/package-json.mjs +122 -0
  1570. package/esm/upgrade/codemods/package-json.mjs.map +1 -0
  1571. package/esm/upgrade/codemods/request-log-snapshot.mjs +82 -0
  1572. package/esm/upgrade/codemods/request-log-snapshot.mjs.map +1 -0
  1573. package/esm/upgrade/codemods/review-sites.mjs +262 -0
  1574. package/esm/upgrade/codemods/review-sites.mjs.map +1 -0
  1575. package/esm/upgrade/diff.mjs +119 -0
  1576. package/esm/upgrade/diff.mjs.map +1 -0
  1577. package/esm/upgrade/format-upgrade-report.mjs +32 -0
  1578. package/esm/upgrade/format-upgrade-report.mjs.map +1 -0
  1579. package/esm/upgrade/load-ts-morph.mjs +48 -0
  1580. package/esm/upgrade/load-ts-morph.mjs.map +1 -0
  1581. package/esm/upgrade/notes.mjs +16 -0
  1582. package/esm/upgrade/notes.mjs.map +1 -0
  1583. package/esm/upgrade/run-upgrade.mjs +246 -0
  1584. package/esm/upgrade/run-upgrade.mjs.map +1 -0
  1585. package/esm/upgrade/upgrade-command.action.mjs +37 -0
  1586. package/esm/upgrade/upgrade-command.action.mjs.map +1 -0
  1587. package/esm/upgrade/version.mjs +39 -0
  1588. package/esm/upgrade/version.mjs.map +1 -0
  1589. package/esm/use-cases/types.d.mts +1 -1
  1590. package/esm/use-cases/types.d.mts.map +1 -1
  1591. package/esm/use-cases/use-case-broadcast.d.mts +1 -1
  1592. package/esm/use-cases/use-case-broadcast.d.mts.map +1 -1
  1593. package/esm/use-cases/use-case-broadcast.mjs +1 -1
  1594. package/esm/use-cases/use-case-broadcast.mjs.map +1 -1
  1595. package/esm/use-cases/use-case-events.d.mts +1 -1
  1596. package/esm/use-cases/use-case-events.d.mts.map +1 -1
  1597. package/esm/use-cases/use-case-events.mjs +1 -1
  1598. package/esm/use-cases/use-case-events.mjs.map +1 -1
  1599. package/esm/use-cases/use-case-pipeline.d.mts +1 -1
  1600. package/esm/use-cases/use-case-pipeline.d.mts.map +1 -1
  1601. package/esm/use-cases/use-case-pipeline.mjs +1 -1
  1602. package/esm/use-cases/use-case-pipeline.mjs.map +1 -1
  1603. package/esm/use-cases/use-case.d.mts +1 -1
  1604. package/esm/use-cases/use-case.d.mts.map +1 -1
  1605. package/esm/use-cases/use-case.errors.d.mts +1 -1
  1606. package/esm/use-cases/use-case.errors.d.mts.map +1 -1
  1607. package/esm/use-cases/use-case.errors.mjs +1 -1
  1608. package/esm/use-cases/use-case.errors.mjs.map +1 -1
  1609. package/esm/use-cases/use-case.mjs +1 -1
  1610. package/esm/use-cases/use-case.mjs.map +1 -1
  1611. package/esm/use-cases/use-cases-registry.d.mts +1 -1
  1612. package/esm/use-cases/use-cases-registry.d.mts.map +1 -1
  1613. package/esm/use-cases/use-cases-registry.mjs +1 -1
  1614. package/esm/use-cases/use-cases-registry.mjs.map +1 -1
  1615. package/esm/utils/app-log.d.mts +6 -6
  1616. package/esm/utils/app-log.d.mts.map +1 -1
  1617. package/esm/utils/app-log.mjs +1 -1
  1618. package/esm/utils/app-log.mjs.map +1 -1
  1619. package/esm/utils/clock.d.mts +33 -0
  1620. package/esm/utils/clock.d.mts.map +1 -0
  1621. package/esm/utils/clock.mjs +27 -0
  1622. package/esm/utils/clock.mjs.map +1 -0
  1623. package/esm/utils/database-log.d.mts +1 -1
  1624. package/esm/utils/database-log.d.mts.map +1 -1
  1625. package/esm/utils/database-log.mjs +1 -1
  1626. package/esm/utils/database-log.mjs.map +1 -1
  1627. package/esm/utils/detect-environment-overrides.mjs +1 -1
  1628. package/esm/utils/detect-environment-overrides.mjs.map +1 -1
  1629. package/esm/utils/environment.d.mts +1 -1
  1630. package/esm/utils/environment.d.mts.map +1 -1
  1631. package/esm/utils/environment.mjs +1 -1
  1632. package/esm/utils/environment.mjs.map +1 -1
  1633. package/esm/utils/framework-vesion.mjs +2 -2
  1634. package/esm/utils/framework-vesion.mjs.map +1 -1
  1635. package/esm/utils/get-localized.d.mts +1 -1
  1636. package/esm/utils/get-localized.d.mts.map +1 -1
  1637. package/esm/utils/get-localized.mjs +1 -1
  1638. package/esm/utils/get-localized.mjs.map +1 -1
  1639. package/esm/utils/ids.d.mts +32 -0
  1640. package/esm/utils/ids.d.mts.map +1 -0
  1641. package/esm/utils/ids.mjs +33 -0
  1642. package/esm/utils/ids.mjs.map +1 -0
  1643. package/esm/utils/index.d.mts +3 -0
  1644. package/esm/utils/index.mjs +3 -0
  1645. package/esm/utils/is-test-file.mjs +1 -1
  1646. package/esm/utils/is-test-file.mjs.map +1 -1
  1647. package/esm/utils/load-environment.mjs +1 -1
  1648. package/esm/utils/load-environment.mjs.map +1 -1
  1649. package/esm/utils/normalized-path.d.mts +1 -1
  1650. package/esm/utils/normalized-path.d.mts.map +1 -1
  1651. package/esm/utils/normalized-path.mjs +1 -1
  1652. package/esm/utils/normalized-path.mjs.map +1 -1
  1653. package/esm/utils/npm-registry.d.mts +1 -1
  1654. package/esm/utils/npm-registry.d.mts.map +1 -1
  1655. package/esm/utils/npm-registry.mjs +1 -1
  1656. package/esm/utils/npm-registry.mjs.map +1 -1
  1657. package/esm/utils/paths.d.mts +1 -1
  1658. package/esm/utils/paths.d.mts.map +1 -1
  1659. package/esm/utils/paths.mjs +1 -1
  1660. package/esm/utils/paths.mjs.map +1 -1
  1661. package/esm/utils/promise-all-object.d.mts +1 -1
  1662. package/esm/utils/promise-all-object.d.mts.map +1 -1
  1663. package/esm/utils/promise-all-object.mjs +1 -1
  1664. package/esm/utils/promise-all-object.mjs.map +1 -1
  1665. package/esm/utils/queue.d.mts +1 -1
  1666. package/esm/utils/queue.d.mts.map +1 -1
  1667. package/esm/utils/queue.mjs +1 -1
  1668. package/esm/utils/queue.mjs.map +1 -1
  1669. package/esm/utils/recorded-environment-overrides.mjs +1 -1
  1670. package/esm/utils/recorded-environment-overrides.mjs.map +1 -1
  1671. package/esm/utils/report-environment-overrides.mjs +1 -1
  1672. package/esm/utils/report-environment-overrides.mjs.map +1 -1
  1673. package/esm/utils/runtime.d.mts +59 -0
  1674. package/esm/utils/runtime.d.mts.map +1 -0
  1675. package/esm/utils/runtime.mjs +85 -0
  1676. package/esm/utils/runtime.mjs.map +1 -0
  1677. package/esm/utils/sleep.d.mts +1 -1
  1678. package/esm/utils/sleep.d.mts.map +1 -1
  1679. package/esm/utils/sleep.mjs +1 -1
  1680. package/esm/utils/sleep.mjs.map +1 -1
  1681. package/esm/utils/sluggable.d.mts +1 -1
  1682. package/esm/utils/sluggable.d.mts.map +1 -1
  1683. package/esm/utils/sluggable.mjs +1 -1
  1684. package/esm/utils/sluggable.mjs.map +1 -1
  1685. package/esm/utils/to-json.d.mts +1 -1
  1686. package/esm/utils/to-json.d.mts.map +1 -1
  1687. package/esm/utils/to-json.mjs +1 -1
  1688. package/esm/utils/to-json.mjs.map +1 -1
  1689. package/esm/utils/types.d.mts +1 -1
  1690. package/esm/utils/types.d.mts.map +1 -1
  1691. package/esm/utils/urls.d.mts +1 -1
  1692. package/esm/utils/urls.d.mts.map +1 -1
  1693. package/esm/utils/urls.mjs +1 -1
  1694. package/esm/utils/urls.mjs.map +1 -1
  1695. package/esm/utils/version-compare.d.mts +1 -1
  1696. package/esm/utils/version-compare.d.mts.map +1 -1
  1697. package/esm/utils/version-compare.mjs +1 -1
  1698. package/esm/utils/version-compare.mjs.map +1 -1
  1699. package/esm/validation/database/exists-except-current-id.d.mts +1 -1
  1700. package/esm/validation/database/exists-except-current-id.d.mts.map +1 -1
  1701. package/esm/validation/database/exists-except-current-id.mjs +1 -1
  1702. package/esm/validation/database/exists-except-current-id.mjs.map +1 -1
  1703. package/esm/validation/database/exists-except-current-user.d.mts +1 -1
  1704. package/esm/validation/database/exists-except-current-user.d.mts.map +1 -1
  1705. package/esm/validation/database/exists-except-current-user.mjs +1 -1
  1706. package/esm/validation/database/exists-except-current-user.mjs.map +1 -1
  1707. package/esm/validation/database/types.d.mts +1 -1
  1708. package/esm/validation/database/types.d.mts.map +1 -1
  1709. package/esm/validation/database/unique-except-current-id.d.mts +1 -1
  1710. package/esm/validation/database/unique-except-current-id.d.mts.map +1 -1
  1711. package/esm/validation/database/unique-except-current-id.mjs +1 -1
  1712. package/esm/validation/database/unique-except-current-id.mjs.map +1 -1
  1713. package/esm/validation/database/unique-except-current-user.d.mts +1 -1
  1714. package/esm/validation/database/unique-except-current-user.d.mts.map +1 -1
  1715. package/esm/validation/database/unique-except-current-user.mjs +1 -1
  1716. package/esm/validation/database/unique-except-current-user.mjs.map +1 -1
  1717. package/esm/validation/file/file.d.mts +1 -1
  1718. package/esm/validation/file/file.d.mts.map +1 -1
  1719. package/esm/validation/file/file.mjs +1 -1
  1720. package/esm/validation/file/file.mjs.map +1 -1
  1721. package/esm/validation/index.d.mts +1 -1
  1722. package/esm/validation/init.mjs +1 -1
  1723. package/esm/validation/init.mjs.map +1 -1
  1724. package/esm/validation/plugins/database-plugin.mjs +1 -1
  1725. package/esm/validation/plugins/database-plugin.mjs.map +1 -1
  1726. package/esm/validation/plugins/file-plugin.mjs +1 -1
  1727. package/esm/validation/plugins/file-plugin.mjs.map +1 -1
  1728. package/esm/validation/plugins/localized-plugin.mjs +1 -1
  1729. package/esm/validation/plugins/localized-plugin.mjs.map +1 -1
  1730. package/esm/validation/types.d.mts +58 -3
  1731. package/esm/validation/types.d.mts.map +1 -1
  1732. package/esm/validation/validateAll.mjs +20 -3
  1733. package/esm/validation/validateAll.mjs.map +1 -1
  1734. package/esm/validation/validation-failure-status.mjs +15 -0
  1735. package/esm/validation/validation-failure-status.mjs.map +1 -0
  1736. package/esm/validation/validators/file-validator.d.mts +28 -41
  1737. package/esm/validation/validators/file-validator.d.mts.map +1 -1
  1738. package/esm/validation/validators/file-validator.mjs +4 -1
  1739. package/esm/validation/validators/file-validator.mjs.map +1 -1
  1740. package/esm/vite/lower-stage3-decorators.d.mts +1 -1
  1741. package/esm/vite/lower-stage3-decorators.d.mts.map +1 -1
  1742. package/esm/vite/lower-stage3-decorators.mjs +1 -1
  1743. package/esm/vite/lower-stage3-decorators.mjs.map +1 -1
  1744. package/esm/warlock-config/bundle-config.mjs +148 -0
  1745. package/esm/warlock-config/bundle-config.mjs.map +1 -0
  1746. package/esm/warlock-config/default-configurations.mjs +1 -1
  1747. package/esm/warlock-config/default-configurations.mjs.map +1 -1
  1748. package/esm/warlock-config/define-config.d.mts +1 -1
  1749. package/esm/warlock-config/define-config.d.mts.map +1 -1
  1750. package/esm/warlock-config/define-config.mjs +1 -1
  1751. package/esm/warlock-config/define-config.mjs.map +1 -1
  1752. package/esm/warlock-config/index.d.mts +1 -1
  1753. package/esm/warlock-config/index.mjs +1 -1
  1754. package/esm/warlock-config/normalize-build-config.mjs +1 -1
  1755. package/esm/warlock-config/normalize-build-config.mjs.map +1 -1
  1756. package/esm/warlock-config/types.d.mts +28 -4
  1757. package/esm/warlock-config/types.d.mts.map +1 -1
  1758. package/esm/warlock-config/warlock-config.manager.d.mts +32 -7
  1759. package/esm/warlock-config/warlock-config.manager.d.mts.map +1 -1
  1760. package/esm/warlock-config/warlock-config.manager.mjs +94 -18
  1761. package/esm/warlock-config/warlock-config.manager.mjs.map +1 -1
  1762. package/esm/warlock-config/warn-deprecated-config.mjs +1 -1
  1763. package/esm/warlock-config/warn-deprecated-config.mjs.map +1 -1
  1764. package/llms-full.txt +3271 -784
  1765. package/llms.txt +16 -6
  1766. package/package.json +51 -14
  1767. package/schemas/inspect-report.schema.json +554 -0
  1768. package/skills/README.md +9 -0
  1769. package/skills/add-connector/SKILL.md +26 -38
  1770. package/skills/benchmark-code/SKILL.md +30 -24
  1771. package/skills/build-restful/SKILL.md +14 -14
  1772. package/skills/build-url/SKILL.md +18 -18
  1773. package/skills/configure-app/SKILL.md +129 -14
  1774. package/skills/create-controller/SKILL.md +29 -12
  1775. package/skills/create-module/SKILL.md +3 -3
  1776. package/skills/define-resource/SKILL.md +32 -29
  1777. package/skills/encrypt-data/SKILL.md +21 -19
  1778. package/skills/generate-openapi/SKILL.md +50 -24
  1779. package/skills/hash-password/SKILL.md +2 -2
  1780. package/skills/health-checks/SKILL.md +26 -7
  1781. package/skills/index.md +9 -4
  1782. package/skills/lower-stage3-decorators/SKILL.md +4 -4
  1783. package/skills/make-endpoint/SKILL.md +110 -0
  1784. package/skills/model-factories/SKILL.md +92 -0
  1785. package/skills/process-image/SKILL.md +32 -30
  1786. package/skills/register-route/SKILL.md +119 -10
  1787. package/skills/request-memo/SKILL.md +1 -1
  1788. package/skills/request-tracing/SKILL.md +4 -1
  1789. package/skills/resolve-path/SKILL.md +45 -44
  1790. package/skills/retry-operation/SKILL.md +20 -11
  1791. package/skills/run-app/SKILL.md +111 -20
  1792. package/skills/send-response/SKILL.md +189 -16
  1793. package/skills/store-file/SKILL.md +97 -53
  1794. package/skills/test-fakes/SKILL.md +123 -0
  1795. package/skills/test-http/SKILL.md +125 -21
  1796. package/skills/test-service/SKILL.md +41 -1
  1797. package/skills/update-packages/SKILL.md +29 -18
  1798. package/skills/upgrade-from-5-29/SKILL.md +413 -0
  1799. package/skills/upload-file/SKILL.md +31 -33
  1800. package/skills/use-app-context/SKILL.md +38 -31
  1801. package/skills/use-middleware/SKILL.md +46 -26
  1802. package/skills/use-model-transformers/SKILL.md +37 -28
  1803. package/skills/use-repository/SKILL.md +2 -2
  1804. package/skills/validate-input/SKILL.md +73 -29
  1805. package/skills/warlock-agents-md/SKILL.md +96 -0
  1806. package/skills/warlock-board/SKILL.md +123 -0
  1807. package/skills/warlock-check/SKILL.md +132 -0
  1808. package/skills/warlock-conventions/SKILL.md +115 -0
  1809. package/skills/warlock-doctor/SKILL.md +55 -22
  1810. package/skills/warlock-inspect/SKILL.md +134 -0
  1811. package/skills/warlock-mcp/SKILL.md +120 -0
  1812. package/skills/warlock-routes/SKILL.md +18 -11
  1813. package/skills/warlock-trace/SKILL.md +81 -0
  1814. package/skills/wire-socket/SKILL.md +8 -8
  1815. package/skills/write-seeder/SKILL.md +46 -32
  1816. package/skills/write-use-case/SKILL.md +40 -27
  1817. package/esm/http/uploads/matches-if-none-match.mjs +0 -13
  1818. package/esm/http/uploads/matches-if-none-match.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"flush-pending-cookies.mjs","names":[],"sources":["../../../../../../../core/src/http/flush-pending-cookies.ts"],"sourcesContent":["import { createRequire } from \"node:module\";\nimport path from \"node:path\";\nimport type { FastifyReply } from \"fastify\";\n\ntype ParkedCookie = { name: string; value: string; opts?: Record<string, unknown> };\n\n/** The installed `@fastify/cookie` version, or undefined when it can't be resolved. */\nfunction installedCookiePluginVersion(): string | undefined {\n try {\n const require = createRequire(path.join(process.cwd(), \"noop.js\"));\n\n return (require(require.resolve(\"@fastify/cookie/package.json\")) as { version?: string })\n .version;\n } catch {\n return undefined;\n }\n}\n\n/**\n * `@fastify/cookie` only parks cookies set via `reply.setCookie()` in a map\n * keyed by a private symbol; it serialises them in its own `onSend` hook.\n * Raw-path writers (`raw.writeHead`) bypass `onSend`, so they must call this\n * right before writing headers.\n *\n * Serialises the parked cookies, appends them to the `set-cookie` header\n * (skipping any value already present) and clears the map so a later `onSend`\n * cannot send them twice.\n *\n * Throws when the plugin is registered but its parked-cookie symbol cannot be\n * found: silently doing nothing would drop every cookie on raw paths. Does\n * nothing when the plugin is not registered.\n */\nexport function flushPendingCookies(reply: FastifyReply): void {\n const parkedSymbol = Object.getOwnPropertySymbols(reply).find(\n symbol => symbol.description === \"fastify.reply.setCookies\",\n );\n\n if (!parkedSymbol) {\n if (typeof (reply as { setCookie?: unknown }).setCookie !== \"function\") return;\n\n const version = installedCookiePluginVersion();\n\n throw new Error(\n `@fastify/cookie's internal cookie storage changed: reply.setCookie exists but the \"fastify.reply.setCookies\" symbol was not found${\n version ? ` (installed @fastify/cookie@${version})` : \"\"\n }. Cookies set before a raw-path response would be lost; update flushPendingCookies for this version.`,\n );\n }\n\n const parked = (reply as unknown as Record<symbol, Map<string, ParkedCookie> | null>)[\n parkedSymbol\n ];\n\n if (!parked || parked.size === 0) return;\n\n const serializeCookie = (\n reply.server as unknown as {\n serializeCookie?: (name: string, value: string, opts?: unknown) => string;\n }\n ).serializeCookie;\n\n if (!serializeCookie) return;\n\n const existing = reply.getHeader(\"set-cookie\");\n const cookies: string[] =\n existing === undefined ? [] : Array.isArray(existing) ? [...existing] : [String(existing)];\n\n for (const cookie of parked.values()) {\n const serialized = serializeCookie(cookie.name, cookie.value, cookie.opts);\n\n if (!cookies.includes(serialized)) {\n cookies.push(serialized);\n }\n }\n\n reply.removeHeader(\"set-cookie\");\n reply.header(\"set-cookie\", cookies);\n parked.clear();\n}\n"],"mappings":";;;;;AAOA,SAAS,+BAAmD;CAC1D,IAAI;EACF,MAAM,UAAU,cAAc,KAAK,KAAK,QAAQ,IAAI,GAAG,SAAS,CAAC;EAEjE,OAAQ,QAAQ,QAAQ,QAAQ,8BAA8B,CAAC,CAAC,CAC7D;CACL,QAAQ;EACN;CACF;AACF;;;;;;;;;;;;;;;AAgBA,SAAgB,oBAAoB,OAA2B;CAC7D,MAAM,eAAe,OAAO,sBAAsB,KAAK,CAAC,CAAC,MACvD,WAAU,OAAO,gBAAgB,0BACnC;CAEA,IAAI,CAAC,cAAc;EACjB,IAAI,OAAQ,MAAkC,cAAc,YAAY;EAExE,MAAM,UAAU,6BAA6B;EAE7C,MAAM,IAAI,MACR,oIACE,UAAU,+BAA+B,QAAQ,KAAK,GACvD,qGACH;CACF;CAEA,MAAM,SAAU,MACd;CAGF,IAAI,CAAC,UAAU,OAAO,SAAS,GAAG;CAElC,MAAM,kBACJ,MAAM,OAGN;CAEF,IAAI,CAAC,iBAAiB;CAEtB,MAAM,WAAW,MAAM,UAAU,YAAY;CAC7C,MAAM,UACJ,aAAa,SAAY,CAAC,IAAI,MAAM,QAAQ,QAAQ,IAAI,CAAC,GAAG,QAAQ,IAAI,CAAC,OAAO,QAAQ,CAAC;CAE3F,KAAK,MAAM,UAAU,OAAO,OAAO,GAAG;EACpC,MAAM,aAAa,gBAAgB,OAAO,MAAM,OAAO,OAAO,OAAO,IAAI;EAEzE,IAAI,CAAC,QAAQ,SAAS,UAAU,GAC9B,QAAQ,KAAK,UAAU;CAE3B;CAEA,MAAM,aAAa,YAAY;CAC/B,MAAM,OAAO,cAAc,OAAO;CAClC,OAAO,MAAM;AACf"}
1
+ {"version":3,"file":"flush-pending-cookies.mjs","names":[],"sources":["../../../../../../../../packages/core/src/http/flush-pending-cookies.ts"],"sourcesContent":["import { createRequire } from \"node:module\";\nimport path from \"node:path\";\nimport type { FastifyReply } from \"fastify\";\n\ntype ParkedCookie = { name: string; value: string; opts?: Record<string, unknown> };\n\n/** The installed `@fastify/cookie` version, or undefined when it can't be resolved. */\nfunction installedCookiePluginVersion(): string | undefined {\n try {\n const require = createRequire(path.join(process.cwd(), \"noop.js\"));\n\n return (require(require.resolve(\"@fastify/cookie/package.json\")) as { version?: string })\n .version;\n } catch {\n return undefined;\n }\n}\n\n/**\n * `@fastify/cookie` only parks cookies set via `reply.setCookie()` in a map\n * keyed by a private symbol; it serialises them in its own `onSend` hook.\n * Raw-path writers (`raw.writeHead`) bypass `onSend`, so they must call this\n * right before writing headers.\n *\n * Serialises the parked cookies, appends them to the `set-cookie` header\n * (skipping any value already present) and clears the map so a later `onSend`\n * cannot send them twice.\n *\n * Throws when the plugin is registered but its parked-cookie symbol cannot be\n * found: silently doing nothing would drop every cookie on raw paths. Does\n * nothing when the plugin is not registered.\n */\nexport function flushPendingCookies(reply: FastifyReply): void {\n const parkedSymbol = Object.getOwnPropertySymbols(reply).find(\n (symbol) => symbol.description === \"fastify.reply.setCookies\",\n );\n\n if (!parkedSymbol) {\n if (typeof (reply as { setCookie?: unknown }).setCookie !== \"function\") return;\n\n const version = installedCookiePluginVersion();\n\n throw new Error(\n `@fastify/cookie's internal cookie storage changed: reply.setCookie exists but the \"fastify.reply.setCookies\" symbol was not found${\n version ? ` (installed @fastify/cookie@${version})` : \"\"\n }. Cookies set before a raw-path response would be lost; update flushPendingCookies for this version.`,\n );\n }\n\n const parked = (reply as unknown as Record<symbol, Map<string, ParkedCookie> | null>)[\n parkedSymbol\n ];\n\n if (!parked || parked.size === 0) return;\n\n const serializeCookie = (\n reply.server as unknown as {\n serializeCookie?: (name: string, value: string, opts?: unknown) => string;\n }\n ).serializeCookie;\n\n if (!serializeCookie) return;\n\n const existing = reply.getHeader(\"set-cookie\");\n const cookies: string[] =\n existing === undefined ? [] : Array.isArray(existing) ? [...existing] : [String(existing)];\n\n for (const cookie of parked.values()) {\n const serialized = serializeCookie(cookie.name, cookie.value, cookie.opts);\n\n if (!cookies.includes(serialized)) {\n cookies.push(serialized);\n }\n }\n\n reply.removeHeader(\"set-cookie\");\n reply.header(\"set-cookie\", cookies);\n parked.clear();\n}\n"],"mappings":";;;;;AAOA,SAAS,+BAAmD;CAC1D,IAAI;EACF,MAAM,UAAU,cAAc,KAAK,KAAK,QAAQ,IAAI,GAAG,SAAS,CAAC;EAEjE,OAAQ,QAAQ,QAAQ,QAAQ,8BAA8B,CAAC,CAAC,CAC7D;CACL,QAAQ;EACN;CACF;AACF;;;;;;;;;;;;;;;AAgBA,SAAgB,oBAAoB,OAA2B;CAC7D,MAAM,eAAe,OAAO,sBAAsB,KAAK,CAAC,CAAC,MACtD,WAAW,OAAO,gBAAgB,0BACrC;CAEA,IAAI,CAAC,cAAc;EACjB,IAAI,OAAQ,MAAkC,cAAc,YAAY;EAExE,MAAM,UAAU,6BAA6B;EAE7C,MAAM,IAAI,MACR,oIACE,UAAU,+BAA+B,QAAQ,KAAK,GACvD,qGACH;CACF;CAEA,MAAM,SAAU,MACd;CAGF,IAAI,CAAC,UAAU,OAAO,SAAS,GAAG;CAElC,MAAM,kBACJ,MAAM,OAGN;CAEF,IAAI,CAAC,iBAAiB;CAEtB,MAAM,WAAW,MAAM,UAAU,YAAY;CAC7C,MAAM,UACJ,aAAa,SAAY,CAAC,IAAI,MAAM,QAAQ,QAAQ,IAAI,CAAC,GAAG,QAAQ,IAAI,CAAC,OAAO,QAAQ,CAAC;CAE3F,KAAK,MAAM,UAAU,OAAO,OAAO,GAAG;EACpC,MAAM,aAAa,gBAAgB,OAAO,MAAM,OAAO,OAAO,OAAO,IAAI;EAEzE,IAAI,CAAC,QAAQ,SAAS,UAAU,GAC9B,QAAQ,KAAK,UAAU;CAE3B;CAEA,MAAM,aAAa,YAAY;CAC/B,MAAM,OAAO,cAAc,OAAO;CAClC,OAAO,MAAM;AACf"}
@@ -1,4 +1,4 @@
1
- //#region ../core/src/http/health.d.ts
1
+ //#region ../../packages/core/src/http/health.d.ts
2
2
  /**
3
3
  * A readiness probe registered via `health.addCheck(...)`. Returns whether its
4
4
  * dependency is currently usable; throwing is treated as a failed check.
@@ -1 +1 @@
1
- {"version":3,"file":"health.d.mts","names":[],"sources":["../../../../../../../core/src/http/health.ts"],"mappings":";;AAMA;;;KAAY,WAAA,mBAA8B,OAAO;AAAA;AAMjD;;;AANiD,KAMrC,YAAA;EACV,MAAA;EACA,MAAA,GAAS,MAAM;AAAA;;AAAA;AACf;;;;;cASI,cAAA;EAAA,iBACa,MAAA;EA6BgB;;;EAxB1B,QAAA,CAAS,IAAA,UAAc,KAAA,EAAO,WAAA;EAArB;;;EAOT,WAAA,CAAY,IAAA;EAAA;;;;EAQZ,QAAA,IAAY,YAAA;EASe;;;;;EAArB,SAAA,IAAa,OAAA,CAAQ,YAAA;EA2CZ;AAYxB;;;;AAA0C;;;;;;;;EAtBjC,wBAAA,CAAyB,aAAA,gBAA6B,IAAA;;;;;;;UAU/C,QAAA;AAAA;;;;cAYH,MAAA,EAAM,cAAuB"}
1
+ {"version":3,"file":"health.d.mts","names":[],"sources":["../../../../../../../../packages/core/src/http/health.ts"],"mappings":";;AAMA;;;KAAY,WAAA,mBAA8B,OAAO;AAAA;AAMjD;;;AANiD,KAMrC,YAAA;EACV,MAAA;EACA,MAAA,GAAS,MAAM;AAAA;;AAAA;AACf;;;;;cASI,cAAA;EAAA,iBACa,MAAA;EA6BgB;;;EAxB1B,QAAA,CAAS,IAAA,UAAc,KAAA,EAAO,WAAA;EAArB;;;EAOT,WAAA,CAAY,IAAA;EAAA;;;;EAQZ,QAAA,IAAY,YAAA;EASe;;;;;EAArB,SAAA,IAAa,OAAA,CAAQ,YAAA;EA2CZ;AAYxB;;;;AAA0C;;;;;;;;EAtBjC,wBAAA,CAAyB,aAAA,gBAA6B,IAAA;;;;;;;UAU/C,QAAA;AAAA;;;;cAYH,MAAA,EAAM,cAAuB"}
@@ -1,7 +1,7 @@
1
1
  import { Application } from "../application/application.mjs";
2
2
  import "../application/index.mjs";
3
3
 
4
- //#region ../core/src/http/health.ts
4
+ //#region ../../packages/core/src/http/health.ts
5
5
  /**
6
6
  * Registry behind the built-in `/health` (liveness) and `/ready` (readiness)
7
7
  * endpoints. Liveness answers "is the process up?"; readiness answers "should
@@ -1 +1 @@
1
- {"version":3,"file":"health.mjs","names":[],"sources":["../../../../../../../core/src/http/health.ts"],"sourcesContent":["import { Application } from \"../application\";\n\n/**\n * A readiness probe registered via `health.addCheck(...)`. Returns whether its\n * dependency is currently usable; throwing is treated as a failed check.\n */\nexport type HealthCheck = () => boolean | Promise<boolean>;\n\n/**\n * Result of a liveness/readiness probe. `checks` is present on readiness only,\n * mapping each registered check name to its pass/fail.\n */\nexport type HealthStatus = {\n status: \"ok\" | \"error\";\n checks?: Record<string, boolean>;\n};\n\n/**\n * Registry behind the built-in `/health` (liveness) and `/ready` (readiness)\n * endpoints. Liveness answers \"is the process up?\"; readiness answers \"should\n * traffic be routed here?\" — booted, not shutting down, and every registered\n * dependency check passing. Connectors and app code register checks; the HTTP\n * connector exposes the endpoints.\n */\nclass HealthRegistry {\n private readonly checks = new Map<string, HealthCheck>();\n\n /**\n * Register (or replace) a readiness check by name — e.g. a database ping.\n */\n public addCheck(name: string, check: HealthCheck): void {\n this.checks.set(name, check);\n }\n\n /**\n * Remove a previously-registered readiness check.\n */\n public removeCheck(name: string): void {\n this.checks.delete(name);\n }\n\n /**\n * Liveness — the process is up and not tearing down. Orchestrators use it to\n * decide whether to RESTART the instance, so it ignores dependency checks.\n */\n public liveness(): HealthStatus {\n return { status: Application.isShuttingDown ? \"error\" : \"ok\" };\n }\n\n /**\n * Readiness — should this instance receive traffic? Requires a finished boot,\n * no in-progress shutdown, and every registered check passing. Load balancers\n * use it to decide whether to ROUTE to the instance.\n */\n public async readiness(): Promise<HealthStatus> {\n if (!Application.isBooted || Application.isShuttingDown) {\n return { status: \"error\" };\n }\n\n const checks: Record<string, boolean> = {};\n let allPassed = true;\n\n for (const [name, check] of this.checks) {\n const passed = await this.runCheck(check);\n checks[name] = passed;\n\n if (!passed) {\n allPassed = false;\n }\n }\n\n return { status: allPassed ? \"ok\" : \"error\", checks };\n }\n\n /**\n * Register a readiness check asserting the app has at least one route\n * registered. A booted HTTP app that ends up with zero routes almost always\n * means a route module failed to register silently, so the instance should\n * report not-ready (503) rather than 404 every request.\n *\n * The route count is passed in as a getter so this registry stays decoupled\n * from the router (no import cycle). The HTTP connector wires this in after\n * scanning routes; apps with no HTTP surface simply never register it.\n *\n * @param getRouteCount Returns the number of currently-registered routes.\n * @param name Override the check name (defaults to `\"routes\"`).\n */\n public addRoutesRegisteredCheck(getRouteCount: () => number, name = \"routes\"): void {\n this.addCheck(name, () => getRouteCount() > 0);\n }\n\n /**\n * Run one check. A thrown error counts as a failed check rather than crashing\n * the probe. The failure is surfaced in the readiness `checks` map and the\n * 503 status — not logged, since probes poll frequently and a failed check is\n * a normal signal, not an error event.\n */\n private async runCheck(check: HealthCheck): Promise<boolean> {\n try {\n return await check();\n } catch {\n return false;\n }\n }\n}\n\n/**\n * The application's health registry singleton.\n */\nexport const health = new HealthRegistry();\n"],"mappings":";;;;;;;;;;;AAwBA,IAAM,iBAAN,MAAqB;;gCACO,IAAI,IAAyB;;;;;CAKvD,AAAO,SAAS,MAAc,OAA0B;EACtD,KAAK,OAAO,IAAI,MAAM,KAAK;CAC7B;;;;CAKA,AAAO,YAAY,MAAoB;EACrC,KAAK,OAAO,OAAO,IAAI;CACzB;;;;;CAMA,AAAO,WAAyB;EAC9B,OAAO,EAAE,QAAQ,YAAY,iBAAiB,UAAU,KAAK;CAC/D;;;;;;CAOA,MAAa,YAAmC;EAC9C,IAAI,CAAC,YAAY,YAAY,YAAY,gBACvC,OAAO,EAAE,QAAQ,QAAQ;EAG3B,MAAM,SAAkC,CAAC;EACzC,IAAI,YAAY;EAEhB,KAAK,MAAM,CAAC,MAAM,UAAU,KAAK,QAAQ;GACvC,MAAM,SAAS,MAAM,KAAK,SAAS,KAAK;GACxC,OAAO,QAAQ;GAEf,IAAI,CAAC,QACH,YAAY;EAEhB;EAEA,OAAO;GAAE,QAAQ,YAAY,OAAO;GAAS;EAAO;CACtD;;;;;;;;;;;;;;CAeA,AAAO,yBAAyB,eAA6B,OAAO,UAAgB;EAClF,KAAK,SAAS,YAAY,cAAc,IAAI,CAAC;CAC/C;;;;;;;CAQA,MAAc,SAAS,OAAsC;EAC3D,IAAI;GACF,OAAO,MAAM,MAAM;EACrB,QAAQ;GACN,OAAO;EACT;CACF;AACF;;;;AAKA,MAAa,SAAS,IAAI,eAAe"}
1
+ {"version":3,"file":"health.mjs","names":[],"sources":["../../../../../../../../packages/core/src/http/health.ts"],"sourcesContent":["import { Application } from \"../application\";\n\n/**\n * A readiness probe registered via `health.addCheck(...)`. Returns whether its\n * dependency is currently usable; throwing is treated as a failed check.\n */\nexport type HealthCheck = () => boolean | Promise<boolean>;\n\n/**\n * Result of a liveness/readiness probe. `checks` is present on readiness only,\n * mapping each registered check name to its pass/fail.\n */\nexport type HealthStatus = {\n status: \"ok\" | \"error\";\n checks?: Record<string, boolean>;\n};\n\n/**\n * Registry behind the built-in `/health` (liveness) and `/ready` (readiness)\n * endpoints. Liveness answers \"is the process up?\"; readiness answers \"should\n * traffic be routed here?\" — booted, not shutting down, and every registered\n * dependency check passing. Connectors and app code register checks; the HTTP\n * connector exposes the endpoints.\n */\nclass HealthRegistry {\n private readonly checks = new Map<string, HealthCheck>();\n\n /**\n * Register (or replace) a readiness check by name — e.g. a database ping.\n */\n public addCheck(name: string, check: HealthCheck): void {\n this.checks.set(name, check);\n }\n\n /**\n * Remove a previously-registered readiness check.\n */\n public removeCheck(name: string): void {\n this.checks.delete(name);\n }\n\n /**\n * Liveness — the process is up and not tearing down. Orchestrators use it to\n * decide whether to RESTART the instance, so it ignores dependency checks.\n */\n public liveness(): HealthStatus {\n return { status: Application.isShuttingDown ? \"error\" : \"ok\" };\n }\n\n /**\n * Readiness — should this instance receive traffic? Requires a finished boot,\n * no in-progress shutdown, and every registered check passing. Load balancers\n * use it to decide whether to ROUTE to the instance.\n */\n public async readiness(): Promise<HealthStatus> {\n if (!Application.isBooted || Application.isShuttingDown) {\n return { status: \"error\" };\n }\n\n const checks: Record<string, boolean> = {};\n let allPassed = true;\n\n for (const [name, check] of this.checks) {\n const passed = await this.runCheck(check);\n checks[name] = passed;\n\n if (!passed) {\n allPassed = false;\n }\n }\n\n return { status: allPassed ? \"ok\" : \"error\", checks };\n }\n\n /**\n * Register a readiness check asserting the app has at least one route\n * registered. A booted HTTP app that ends up with zero routes almost always\n * means a route module failed to register silently, so the instance should\n * report not-ready (503) rather than 404 every request.\n *\n * The route count is passed in as a getter so this registry stays decoupled\n * from the router (no import cycle). The HTTP connector wires this in after\n * scanning routes; apps with no HTTP surface simply never register it.\n *\n * @param getRouteCount Returns the number of currently-registered routes.\n * @param name Override the check name (defaults to `\"routes\"`).\n */\n public addRoutesRegisteredCheck(getRouteCount: () => number, name = \"routes\"): void {\n this.addCheck(name, () => getRouteCount() > 0);\n }\n\n /**\n * Run one check. A thrown error counts as a failed check rather than crashing\n * the probe. The failure is surfaced in the readiness `checks` map and the\n * 503 status — not logged, since probes poll frequently and a failed check is\n * a normal signal, not an error event.\n */\n private async runCheck(check: HealthCheck): Promise<boolean> {\n try {\n return await check();\n } catch {\n return false;\n }\n }\n}\n\n/**\n * The application's health registry singleton.\n */\nexport const health = new HealthRegistry();\n"],"mappings":";;;;;;;;;;;AAwBA,IAAM,iBAAN,MAAqB;;gCACO,IAAI,IAAyB;;;;;CAKvD,AAAO,SAAS,MAAc,OAA0B;EACtD,KAAK,OAAO,IAAI,MAAM,KAAK;CAC7B;;;;CAKA,AAAO,YAAY,MAAoB;EACrC,KAAK,OAAO,OAAO,IAAI;CACzB;;;;;CAMA,AAAO,WAAyB;EAC9B,OAAO,EAAE,QAAQ,YAAY,iBAAiB,UAAU,KAAK;CAC/D;;;;;;CAOA,MAAa,YAAmC;EAC9C,IAAI,CAAC,YAAY,YAAY,YAAY,gBACvC,OAAO,EAAE,QAAQ,QAAQ;EAG3B,MAAM,SAAkC,CAAC;EACzC,IAAI,YAAY;EAEhB,KAAK,MAAM,CAAC,MAAM,UAAU,KAAK,QAAQ;GACvC,MAAM,SAAS,MAAM,KAAK,SAAS,KAAK;GACxC,OAAO,QAAQ;GAEf,IAAI,CAAC,QACH,YAAY;EAEhB;EAEA,OAAO;GAAE,QAAQ,YAAY,OAAO;GAAS;EAAO;CACtD;;;;;;;;;;;;;;CAeA,AAAO,yBAAyB,eAA6B,OAAO,UAAgB;EAClF,KAAK,SAAS,YAAY,cAAc,IAAI,CAAC;CAC/C;;;;;;;CAQA,MAAc,SAAS,OAAsC;EAC3D,IAAI;GACF,OAAO,MAAM,MAAM;EACrB,QAAQ;GACN,OAAO;EACT;CACF;AACF;;;;AAKA,MAAa,SAAS,IAAI,eAAe"}
@@ -1,12 +1,16 @@
1
+ import { BadRequestError, ConflictError, CookieJarUnavailableError, ForbiddenError, HttpError, NotAcceptableError, NotAllowedError, ResourceNotFoundError, ServerError, UnAuthorizedError } from "./errors/errors.mjs";
2
+ import { ConditionalRequestInput, ConditionalRequestOutcome, EntityTag, evaluateConditionalRequest, matchesIfMatch, matchesIfNoneMatch, parseEntityTag, parseEntityTagList, strongEntityTagMatch, weakEntityTagMatch } from "./conditional-request.mjs";
3
+ import { HttpLoggingConfig, PrivateRequestLoggingRule, RequestLogSnapshot, RequestLogSource, RequestLoggingOptions, URL_CREDENTIAL_PARAMS, buildRequestLogSnapshot, redactQueryCredentials, redactUrlCredentials, resolveRequestLoggingOptions } from "./request-log-snapshot.mjs";
1
4
  import { PipeableReactStream, StreamReactResponseOptions, streamReactResponse } from "./stream-react-response.mjs";
2
5
  import { XMLable } from "./xmlable.mjs";
3
- import { CookieOptions, Response, ResponseStatus, SendBufferOptions, SendFileOptions } from "./response.mjs";
6
+ import { CookieOptions, Response, ResponseStatus, SendBufferOptions, SendFileOptions, toSingleLineSseField } from "./response.mjs";
4
7
  import { FileNamingStrategy, ImageTransformCallback, ImageTransformConfig, ImageVariantDefinition, ImageVariantFit, ImageVariantOutputFormat, PrefixConfig, PrefixOptions, SaveAsOptions, SaveOptions, UploadedFileImageOptions, UploadsConfigurations, UploadsImagesConfigurations } from "./uploads-types.mjs";
5
8
  import { FileValidationOptions, UploadedFile, UploadedFileJson } from "./uploaded-file.mjs";
6
9
  import { Request, RequestTranslator } from "./request.mjs";
7
10
  import { CspConfig, DEFAULT_CSP_DIRECTIVES, InvalidCspDirectiveError, applyCspHeader, buildCspHeaderValue, mergeCspDirectives, resolveCspConfig, serializeCspDirectives, validateCspConfigAtBoot, validateCspDirectives } from "./csp.mjs";
11
+ import { HttpErrorMapper, HttpErrorMapping } from "./error-mapper.mjs";
8
12
  import { HttpTracingConfig, TracingContext, TracingHooks, TracingPhaseInfo, TracingRequestEndInfo } from "./tracing/tracing.type.mjs";
9
- import { DecodedAccessToken, HttpConfigurations, PartialMiddleware, RequestEvent, RequestLocals, ResponseEvent, ResponseSSEController, ResponseStreamController, ReturnedResponse } from "./types.mjs";
13
+ import { DecodedAccessToken, HttpConfigurations, HttpServerOptions, PartialMiddleware, RequestEvent, RequestLocals, ResponseEvent, ResponseSSEController, ResponseSSEMessageOptions, ResponseSSEOptions, ResponseStreamController, ResponseStreamOptions, ReturnedResponse } from "./types.mjs";
10
14
  import { defaultHttpConfigurations, httpConfig } from "./config.mjs";
11
15
  import { createHttpApplication, stopHttpApplication } from "./createHttpApplication.mjs";
12
16
  import { requiresDefaultCsrfGuard, runDefaultCsrfGuard } from "./csrf-default-guard.mjs";
@@ -20,8 +24,9 @@ import { UPLOADS_DEFAULTS, uploadsConfig } from "./uploads-config.mjs";
20
24
  import { DetectedImageFormat, GeneratedImageDescriptor, GeneratedImageVariant, ResolvedImageVariantsConfig, UploadedFileQuery, VariantOutputFormat, VariantSourceFormat } from "./uploads/image-variant-types.mjs";
21
25
  import { GenerateImageVariantsOptions, generateImageVariants } from "./uploads/generate-image-variants.mjs";
22
26
  import { ImageVariantsConfigError } from "./uploads/image-variants-config-error.mjs";
23
- import { uploadedFileController } from "./uploads/uploaded-file.controller.mjs";
24
- import { BadRequestError, ConflictError, CookieJarUnavailableError, ForbiddenError, HttpError, NotAcceptableError, NotAllowedError, ResourceNotFoundError, ServerError, UnAuthorizedError } from "./errors/errors.mjs";
27
+ import { PurgeImageVariantsOptions, purgeImageVariants } from "./uploads/purge-image-variants.mjs";
28
+ import { ResolveImageVariantInput, ResolvedImageVariant, resolveImageVariant } from "./uploads/resolve-image-variant.mjs";
29
+ import { UploadedFileControllerOptions, createUploadedFileController, uploadedFileController } from "./uploads/uploaded-file.controller.mjs";
25
30
  import { CacheMiddlewareOptions } from "./middleware/cache-response-middleware.mjs";
26
31
  import { ConcurrencyLimitOptions } from "./middleware/concurrency-limit.middleware.mjs";
27
32
  import { IdempotencyOptions } from "./middleware/idempotency.middleware.mjs";
@@ -33,12 +38,14 @@ import { createRequestStore, t } from "./middleware/inject-request-context.mjs";
33
38
  import { anyMatch, ipMatches } from "./middleware/utils/cidr-match.mjs";
34
39
  import { buildIdempotencyCacheKey, hashBody, isValidIdempotencyKey } from "./middleware/utils/idempotency-key.mjs";
35
40
  import { parseSize } from "./middleware/utils/parse-size.mjs";
36
- import { ClosableServer, FastifyInstance, closeServerWithTimeout, getHttpServer, startHttpServer } from "./server.mjs";
37
- import { registerHttpPlugins } from "./plugins.mjs";
41
+ import { ClosableServer, FastifyInstance, beginHttpDrain, closeServerWithTimeout, getHttpServer, startHttpServer, trackConnectionsForDrain } from "./server.mjs";
42
+ import { registerHttpPlugins, resolvePublicRoot } from "./plugins.mjs";
38
43
  import { assertConfiguredHttpPortIsFree, preflightConfiguredHttpPort, remedyLines, shouldPreflightHttpPort } from "./boot-port-preflight.mjs";
39
44
  import { PortInUseError, assertPortIsAvailable, isPortAvailable } from "./port-preflight.mjs";
40
45
  import { HttpReadyReport, getHttpReadyReport, resetHttpReadyReport, setHttpReadyReport } from "./ready-report.mjs";
41
46
  import { HttpServerRebuiltListener, notifyHttpServerRebuilt, onHttpServerRebuilt } from "./server-rebuilt.mjs";
47
+ import { escapeHeaderValue } from "./escape-header-value.mjs";
48
+ import { SafeRedirectOptions, isSafeRedirect, safeRedirect } from "./safe-redirect.mjs";
42
49
  import { deriveTraceId, parseTraceparentTraceId } from "./tracing/trace-id.mjs";
43
50
  import { TracingContextSource, buildTracingContext, dispatchPhase, dispatchRequestEnd, dispatchRequestStart, isTracingEnabled, registerTracingHooks, resetTracingConfigForTests, resolveTracingConfig } from "./tracing/tracing-dispatcher.mjs";
44
51
  import { RequestContextStore, requestContext, useCurrentUser, useRequest, useRequestStore } from "./context/request-context.mjs";
@@ -8,22 +8,26 @@ import { deriveTraceId, parseTraceparentTraceId } from "./tracing/trace-id.mjs";
8
8
  import { buildTracingContext, dispatchPhase, dispatchRequestEnd, dispatchRequestStart, isTracingEnabled, registerTracingHooks, resetTracingConfigForTests, resolveTracingConfig } from "./tracing/tracing-dispatcher.mjs";
9
9
  import "./tracing/index.mjs";
10
10
  import { createRequestStore, t } from "./middleware/inject-request-context.mjs";
11
+ import { evaluateConditionalRequest, matchesIfMatch, matchesIfNoneMatch, parseEntityTag, parseEntityTagList, strongEntityTagMatch, weakEntityTagMatch } from "./conditional-request.mjs";
11
12
  import { defaultHttpConfigurations, httpConfig } from "./config.mjs";
12
- import { streamReactResponse } from "./stream-react-response.mjs";
13
- import { Response, ResponseStatus } from "./response.mjs";
13
+ import { ImageVariantsConfigError } from "./uploads/image-variants-config-error.mjs";
14
14
  import { UPLOADS_DEFAULTS, uploadsConfig } from "./uploads-config.mjs";
15
+ import { streamReactResponse } from "./stream-react-response.mjs";
16
+ import { Response, ResponseStatus, toSingleLineSseField } from "./response.mjs";
15
17
  import { UploadedFile } from "./uploaded-file.mjs";
18
+ import { URL_CREDENTIAL_PARAMS, buildRequestLogSnapshot, redactQueryCredentials, redactUrlCredentials, resolveRequestLoggingOptions } from "./request-log-snapshot.mjs";
16
19
  import { Request } from "./request.mjs";
17
- import { registerHttpPlugins } from "./plugins.mjs";
18
- import { closeServerWithTimeout, getHttpServer, startHttpServer } from "./server.mjs";
20
+ import { registerHttpPlugins, resolvePublicRoot } from "./plugins.mjs";
21
+ import { beginHttpDrain, closeServerWithTimeout, getHttpServer, startHttpServer, trackConnectionsForDrain } from "./server.mjs";
19
22
  import { createHttpApplication, stopHttpApplication } from "./createHttpApplication.mjs";
20
23
  import { RequestLog } from "./database/RequestLog.mjs";
21
24
  import { logResponse, wrapResponseInDataKey } from "./events.mjs";
22
25
  import { health } from "./health.mjs";
23
26
  import { RequestController } from "./request-controller.mjs";
24
- import { ImageVariantsConfigError } from "./uploads/image-variants-config-error.mjs";
25
27
  import { generateImageVariants } from "./uploads/generate-image-variants.mjs";
26
- import { uploadedFileController } from "./uploads/uploaded-file.controller.mjs";
28
+ import { purgeImageVariants } from "./uploads/purge-image-variants.mjs";
29
+ import { resolveImageVariant } from "./uploads/resolve-image-variant.mjs";
30
+ import { createUploadedFileController, uploadedFileController } from "./uploads/uploaded-file.controller.mjs";
27
31
  import "./uploads/index.mjs";
28
32
  import { buildIdempotencyCacheKey, hashBody, isValidIdempotencyKey } from "./middleware/utils/idempotency-key.mjs";
29
33
  import { anyMatch, ipMatches } from "./middleware/utils/cidr-match.mjs";
@@ -34,6 +38,8 @@ import { PortInUseError, assertPortIsAvailable, isPortAvailable } from "./port-p
34
38
  import { assertConfiguredHttpPortIsFree, preflightConfiguredHttpPort, remedyLines, shouldPreflightHttpPort } from "./boot-port-preflight.mjs";
35
39
  import { getHttpReadyReport, resetHttpReadyReport, setHttpReadyReport } from "./ready-report.mjs";
36
40
  import { notifyHttpServerRebuilt, onHttpServerRebuilt } from "./server-rebuilt.mjs";
41
+ import { escapeHeaderValue } from "./escape-header-value.mjs";
42
+ import { isSafeRedirect, safeRedirect } from "./safe-redirect.mjs";
37
43
  import { requestMemo } from "./context/request-memo.mjs";
38
44
 
39
45
  export { };
@@ -0,0 +1,194 @@
1
+ import path from "node:path";
2
+ import { statSync } from "node:fs";
3
+ import { fileURLToPath } from "node:url";
4
+
5
+ //#region ../../packages/core/src/http/lazy-static.ts
6
+ function optionError(field, message, valueError = false) {
7
+ return Object.assign(valueError ? /* @__PURE__ */ new TypeError(`"${field}" option ${message}`) : /* @__PURE__ */ new Error(`"${field}" option ${message}`), {
8
+ code: valueError ? "FST_STATIC_INVALID_OPTION_VALUE" : "FST_STATIC_INVALID_OPTION",
9
+ statusCode: 500
10
+ });
11
+ }
12
+ /** Validate without importing the plugin's directory-listing module. */
13
+ function staticOptions(server, options) {
14
+ const root = options.root;
15
+ const normalize = (entry) => entry instanceof URL && entry.protocol === "file:" ? fileURLToPath(entry) : entry;
16
+ const normalized = Array.isArray(root) ? root.map(normalize) : root === void 0 ? void 0 : normalize(root);
17
+ if (options.serve !== false || normalized !== void 0) {
18
+ if (normalized === void 0) throw optionError("root", "is required");
19
+ if (Array.isArray(normalized) && normalized.length === 0) throw optionError("root", "array requires one or more paths");
20
+ if (Array.isArray(normalized) && new Set(normalized).size !== normalized.length) throw optionError("root", "array contains duplicate paths");
21
+ for (const entry of Array.isArray(normalized) ? normalized : [normalized]) {
22
+ if (typeof entry !== "string") throw optionError("root", "must be a string", true);
23
+ if (!path.isAbsolute(entry)) throw optionError("root", "must be an absolute path");
24
+ try {
25
+ if (!statSync(entry).isDirectory()) throw optionError("root", "must be a directory");
26
+ } catch (error) {
27
+ if (error.code !== "ENOENT") throw error;
28
+ if (!options.suppressWarning) server.log.warn(`"root" path "${entry}" must exist`);
29
+ }
30
+ }
31
+ }
32
+ if (options.setHeaders !== void 0 && typeof options.setHeaders !== "function") throw optionError("setHeaders", "must be a function", true);
33
+ if (options.serve !== false && options.wildcard && typeof options.wildcard !== "boolean") throw optionError("wildcard", "must be a boolean", true);
34
+ const list = options.list;
35
+ if (list) {
36
+ if (Array.isArray(normalized)) throw Object.assign(/* @__PURE__ */ new TypeError("multi-root with list option is not supported"), {
37
+ code: "FST_STATIC_MULTIROOT_LIST_CONFLICT",
38
+ statusCode: 500
39
+ });
40
+ if (typeof list === "object") {
41
+ if (list.format && list.format !== "json" && list.format !== "html") throw optionError("list.format", "must be json or html", true);
42
+ if (list.names && !Array.isArray(list.names)) throw optionError("list.names", "must be an array", true);
43
+ if (list.jsonFormat != null && list.jsonFormat !== "names" && list.jsonFormat !== "extended") throw optionError("list.jsonFormat", "must be names or extended", true);
44
+ if (list.format === "html" && typeof list.render !== "function") throw optionError("list.render", "must be a function and is required with html format", true);
45
+ }
46
+ }
47
+ return {
48
+ ...options,
49
+ root: normalized
50
+ };
51
+ }
52
+ /** Mirror the plugin's boot-time route snapshot for wildcard:false. */
53
+ async function fileRoutes(options, prefix) {
54
+ const { glob } = await import("glob");
55
+ const roots = Array.isArray(options.root) ? options.root : [options.root];
56
+ const routes = /* @__PURE__ */ new Map();
57
+ const indexes = new Set(options.index === void 0 ? ["index.html"] : options.index === false ? [] : [options.index].flat());
58
+ const indexDirectories = /* @__PURE__ */ new Map();
59
+ for (const root of roots) {
60
+ if (typeof root !== "string") continue;
61
+ const rootPath = root.split(path.win32.sep).join(path.posix.sep).replace(/\/?$/, "/");
62
+ const files = await glob("**/**", {
63
+ cwd: rootPath,
64
+ absolute: false,
65
+ follow: true,
66
+ nodir: true,
67
+ dot: options.serveDotFiles,
68
+ ignore: options.globIgnore
69
+ });
70
+ for (const fileName of files) {
71
+ const file = fileName.split(path.win32.sep).join(path.posix.sep);
72
+ const url = prefix + file;
73
+ if (routes.has(url)) continue;
74
+ routes.set(url, {
75
+ url,
76
+ file: `/${file}`,
77
+ rootPath
78
+ });
79
+ const key = path.posix.basename(url);
80
+ if (indexes.has(key) && !indexDirectories.has(key)) indexDirectories.set(path.posix.dirname(url), rootPath);
81
+ }
82
+ }
83
+ for (const [directory, rootPath] of indexDirectories) {
84
+ const url = directory + (directory.endsWith("/") ? "" : "/");
85
+ const file = "/" + url.replace(prefix, "");
86
+ routes.set(url, {
87
+ url,
88
+ file,
89
+ rootPath
90
+ });
91
+ if (options.redirect === true) routes.set(url.replace(/\/$/, ""), {
92
+ url: url.replace(/\/$/, ""),
93
+ file: file.replace(/\/$/, ""),
94
+ rootPath
95
+ });
96
+ }
97
+ return [...routes.values()];
98
+ }
99
+ /**
100
+ * Queue public routes after earlier plugins, and capture upstream handlers on the
101
+ * first file request. Only public Fastify methods are replaced on the facade;
102
+ * the listening application's route/decorator table never changes after ready.
103
+ */
104
+ function registerLazyStatic(server, input, mount = {}) {
105
+ const options = staticOptions(server, input);
106
+ server.register(Object.assign(async (instance) => prepareStatic(instance, options, mount), { [Symbol.for("skip-override")]: true }));
107
+ }
108
+ async function prepareStatic(server, options, mount) {
109
+ const originalPrefix = options.prefix ?? "/";
110
+ const prefix = options.prefixAvoidTrailingSlash || originalPrefix.endsWith("/") ? originalPrefix : `${originalPrefix}/`;
111
+ const handlers = /* @__PURE__ */ new Map();
112
+ const decorators = /* @__PURE__ */ new Map();
113
+ let initialized;
114
+ function initialize() {
115
+ return initialized ??= (async () => {
116
+ const facade = Object.create(server);
117
+ const capture = (route) => {
118
+ const url = route.url ?? route.path;
119
+ if (!url) throw new Error("Static plugin declared a route without a path.");
120
+ for (const method of [route.method].flat()) handlers.set(`${method} ${url}`, route.handler);
121
+ return facade;
122
+ };
123
+ Object.defineProperties(facade, {
124
+ route: { value: capture },
125
+ get: { value: (url, route, handler) => capture({
126
+ ...route,
127
+ url,
128
+ method: ["GET", "HEAD"],
129
+ handler
130
+ }) },
131
+ decorateReply: { value: (name, handler) => {
132
+ decorators.set(name, handler);
133
+ return facade;
134
+ } }
135
+ });
136
+ const { default: staticPlugin } = await import("@fastify/static");
137
+ await staticPlugin(facade, {
138
+ ...options,
139
+ decorateReply: true,
140
+ suppressWarning: true
141
+ });
142
+ })();
143
+ }
144
+ if (options.decorateReply !== false) for (const name of ["sendFile", "download"]) server.decorateReply(name, function(...args) {
145
+ initialize().then(() => {
146
+ const decorator = decorators.get(name);
147
+ if (!decorator) throw new Error(`Static plugin did not provide ${name}.`);
148
+ decorator.apply(this, args);
149
+ }).catch((error) => this.send(error));
150
+ return this;
151
+ });
152
+ if (options.serve === false) return;
153
+ const routes = options.wildcard === false ? await fileRoutes(options, prefix) : [{ url: prefix + "*" }];
154
+ if (options.wildcard !== false && options.redirect === true && prefix !== originalPrefix) routes.push({ url: originalPrefix });
155
+ const schema = { hide: options.schemaHide ?? true };
156
+ for (const route of routes) server.route({
157
+ url: route.url,
158
+ method: ["HEAD", "GET"],
159
+ constraints: options.constraints,
160
+ schema,
161
+ logLevel: options.logLevel,
162
+ config: {
163
+ ...route.file ? {
164
+ file: route.file,
165
+ rootPath: route.rootPath
166
+ } : {},
167
+ ...mount.rateLimit !== void 0 ? { rateLimit: mount.rateLimit } : {}
168
+ },
169
+ errorHandler(error, request, reply) {
170
+ if (error?.code === "ERR_STREAM_PREMATURE_CLOSE") {
171
+ reply.request.raw.destroy();
172
+ return;
173
+ }
174
+ return server.errorHandler(error, request, reply);
175
+ },
176
+ async handler(request, reply) {
177
+ await initialize();
178
+ const handler = handlers.get(`${request.method} ${route.url}`);
179
+ if (handler) {
180
+ await handler.call(server, request, reply);
181
+ return reply;
182
+ }
183
+ if (route.file) {
184
+ const sendFile = decorators.get("sendFile");
185
+ if (sendFile) return sendFile.call(reply, route.file, route.rootPath);
186
+ }
187
+ return reply.callNotFound();
188
+ }
189
+ });
190
+ }
191
+
192
+ //#endregion
193
+ export { registerLazyStatic };
194
+ //# sourceMappingURL=lazy-static.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lazy-static.mjs","names":[],"sources":["../../../../../../../../packages/core/src/http/lazy-static.ts"],"sourcesContent":["import type { FastifyStaticOptions } from \"@fastify/static\";\nimport { statSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type {\n FastifyInstance,\n FastifyReply,\n FastifyRequest,\n FastifySchema,\n RouteHandlerMethod,\n RouteOptions,\n} from \"fastify\";\n\ntype FileRoute = { url: string; file?: string; rootPath?: string };\ntype ReplyDecorator = (this: FastifyReply, ...args: unknown[]) => FastifyReply;\n\nfunction optionError(field: string, message: string, valueError = false): Error {\n return Object.assign(\n valueError\n ? new TypeError(`\"${field}\" option ${message}`)\n : new Error(`\"${field}\" option ${message}`),\n {\n code: valueError ? \"FST_STATIC_INVALID_OPTION_VALUE\" : \"FST_STATIC_INVALID_OPTION\",\n statusCode: 500,\n },\n );\n}\n\n/** Validate without importing the plugin's directory-listing module. */\nfunction staticOptions(\n server: FastifyInstance,\n options: FastifyStaticOptions,\n): FastifyStaticOptions {\n const root = options.root;\n const normalize = (entry: string | URL): string | URL =>\n entry instanceof URL && entry.protocol === \"file:\" ? fileURLToPath(entry) : entry;\n const normalized = Array.isArray(root)\n ? root.map(normalize)\n : root === undefined\n ? undefined\n : normalize(root);\n if (options.serve !== false || normalized !== undefined) {\n if (normalized === undefined) throw optionError(\"root\", \"is required\");\n if (Array.isArray(normalized) && normalized.length === 0)\n throw optionError(\"root\", \"array requires one or more paths\");\n if (Array.isArray(normalized) && new Set(normalized).size !== normalized.length)\n throw optionError(\"root\", \"array contains duplicate paths\");\n for (const entry of Array.isArray(normalized) ? normalized : [normalized]) {\n if (typeof entry !== \"string\") throw optionError(\"root\", \"must be a string\", true);\n if (!path.isAbsolute(entry)) throw optionError(\"root\", \"must be an absolute path\");\n try {\n if (!statSync(entry).isDirectory()) throw optionError(\"root\", \"must be a directory\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") throw error;\n if (!options.suppressWarning) server.log.warn(`\"root\" path \"${entry}\" must exist`);\n }\n }\n }\n if (options.setHeaders !== undefined && typeof options.setHeaders !== \"function\")\n throw optionError(\"setHeaders\", \"must be a function\", true);\n if (options.serve !== false && options.wildcard && typeof options.wildcard !== \"boolean\")\n throw optionError(\"wildcard\", \"must be a boolean\", true);\n const list = options.list;\n if (list) {\n if (Array.isArray(normalized))\n throw Object.assign(new TypeError(\"multi-root with list option is not supported\"), {\n code: \"FST_STATIC_MULTIROOT_LIST_CONFLICT\",\n statusCode: 500,\n });\n if (typeof list === \"object\") {\n if (list.format && list.format !== \"json\" && list.format !== \"html\")\n throw optionError(\"list.format\", \"must be json or html\", true);\n if (list.names && !Array.isArray(list.names))\n throw optionError(\"list.names\", \"must be an array\", true);\n if (list.jsonFormat != null && list.jsonFormat !== \"names\" && list.jsonFormat !== \"extended\")\n throw optionError(\"list.jsonFormat\", \"must be names or extended\", true);\n if (list.format === \"html\" && typeof list.render !== \"function\")\n throw optionError(\n \"list.render\",\n \"must be a function and is required with html format\",\n true,\n );\n }\n }\n return { ...options, root: normalized } as FastifyStaticOptions;\n}\n\n/** Mirror the plugin's boot-time route snapshot for wildcard:false. */\nasync function fileRoutes(options: FastifyStaticOptions, prefix: string): Promise<FileRoute[]> {\n const { glob } = await import(\"glob\");\n const roots = Array.isArray(options.root) ? options.root : [options.root];\n const routes = new Map<string, FileRoute>();\n const indexes = new Set(\n options.index === undefined\n ? [\"index.html\"]\n : options.index === false\n ? []\n : [options.index].flat(),\n );\n const indexDirectories = new Map<string, string>();\n for (const root of roots) {\n if (typeof root !== \"string\") continue;\n const rootPath = root.split(path.win32.sep).join(path.posix.sep).replace(/\\/?$/, \"/\");\n const files = await glob(\"**/**\", {\n cwd: rootPath,\n absolute: false,\n follow: true,\n nodir: true,\n dot: options.serveDotFiles,\n ignore: options.globIgnore,\n });\n for (const fileName of files) {\n const file = fileName.split(path.win32.sep).join(path.posix.sep);\n const url = prefix + file;\n if (routes.has(url)) continue;\n routes.set(url, { url, file: `/${file}`, rootPath });\n // Match upstream: distinct index filenames in later roots replace the\n // directory route, while duplicate file URLs keep the first root.\n const key = path.posix.basename(url);\n if (indexes.has(key) && !indexDirectories.has(key))\n indexDirectories.set(path.posix.dirname(url), rootPath);\n }\n }\n for (const [directory, rootPath] of indexDirectories) {\n const url = directory + (directory.endsWith(\"/\") ? \"\" : \"/\");\n const file = \"/\" + url.replace(prefix, \"\");\n routes.set(url, { url, file, rootPath });\n if (options.redirect === true)\n routes.set(url.replace(/\\/$/, \"\"), {\n url: url.replace(/\\/$/, \"\"),\n file: file.replace(/\\/$/, \"\"),\n rootPath,\n });\n }\n return [...routes.values()];\n}\n\n/**\n * Queue public routes after earlier plugins, and capture upstream handlers on the\n * first file request. Only public Fastify methods are replaced on the facade;\n * the listening application's route/decorator table never changes after ready.\n */\nexport function registerLazyStatic(\n server: FastifyInstance,\n input: FastifyStaticOptions,\n mount: LazyStaticMount = {},\n): void {\n const options = staticOptions(server, input);\n // Earlier plugins install onRoute hooks (including global rate limiting).\n // Keep the decorators on the calling scope, as @fastify/static does.\n server.register(\n Object.assign(async (instance: FastifyInstance) => prepareStatic(instance, options, mount), {\n [Symbol.for(\"skip-override\")]: true,\n }),\n );\n}\n\n/**\n * How the file routes of one static mount meet the rate limiter.\n */\nexport type LazyStaticMount = {\n /**\n * The `config.rateLimit` of every file route: `false` exempts the mount\n * from the global limiter, an object gives it its own limit, and\n * `undefined` leaves it under the global policy.\n */\n rateLimit?: false | Record<string, unknown>;\n};\n\nasync function prepareStatic(\n server: FastifyInstance,\n options: FastifyStaticOptions,\n mount: LazyStaticMount,\n): Promise<void> {\n const originalPrefix = options.prefix ?? \"/\";\n const prefix =\n options.prefixAvoidTrailingSlash || originalPrefix.endsWith(\"/\")\n ? originalPrefix\n : `${originalPrefix}/`;\n const handlers = new Map<string, RouteHandlerMethod>();\n const decorators = new Map<string, ReplyDecorator>();\n let initialized: Promise<void> | undefined;\n\n function initialize(): Promise<void> {\n return (initialized ??= (async () => {\n const facade = Object.create(server) as FastifyInstance;\n const capture = (route: RouteOptions): FastifyInstance => {\n const url = route.url ?? (route as RouteOptions & { path?: string }).path;\n if (!url) throw new Error(\"Static plugin declared a route without a path.\");\n for (const method of [route.method].flat()) handlers.set(`${method} ${url}`, route.handler);\n return facade;\n };\n Object.defineProperties(facade, {\n route: { value: capture },\n get: {\n value: (\n url: string,\n route: Omit<RouteOptions, \"method\" | \"url\" | \"handler\">,\n handler: RouteHandlerMethod,\n ) => capture({ ...route, url, method: [\"GET\", \"HEAD\"], handler }),\n },\n decorateReply: {\n value: (name: string, handler: ReplyDecorator) => {\n decorators.set(name, handler);\n return facade;\n },\n },\n });\n const { default: staticPlugin } = await import(\"@fastify/static\");\n await staticPlugin(facade, { ...options, decorateReply: true, suppressWarning: true });\n })());\n }\n\n if (options.decorateReply !== false) {\n for (const name of [\"sendFile\", \"download\"]) {\n server.decorateReply(name, function (this: FastifyReply, ...args: unknown[]) {\n void initialize()\n .then(() => {\n const decorator = decorators.get(name);\n if (!decorator) throw new Error(`Static plugin did not provide ${name}.`);\n decorator.apply(this, args);\n })\n .catch((error: unknown) => this.send(error));\n return this;\n });\n }\n }\n if (options.serve === false) return;\n const routes: FileRoute[] =\n options.wildcard === false ? await fileRoutes(options, prefix) : [{ url: prefix + \"*\" }];\n if (options.wildcard !== false && options.redirect === true && prefix !== originalPrefix)\n routes.push({ url: originalPrefix });\n const schema: FastifySchema & { hide: boolean } = { hide: options.schemaHide ?? true };\n for (const route of routes) {\n server.route({\n url: route.url,\n method: [\"HEAD\", \"GET\"],\n constraints: options.constraints,\n schema,\n logLevel: options.logLevel,\n config: {\n ...(route.file ? { file: route.file, rootPath: route.rootPath } : {}),\n ...(mount.rateLimit !== undefined ? { rateLimit: mount.rateLimit } : {}),\n },\n errorHandler(error, request, reply) {\n if (error?.code === \"ERR_STREAM_PREMATURE_CLOSE\") {\n reply.request.raw.destroy();\n return;\n }\n return server.errorHandler(error, request, reply);\n },\n async handler(request: FastifyRequest, reply: FastifyReply) {\n await initialize();\n const handler = handlers.get(`${request.method} ${route.url}`);\n if (handler) {\n await handler.call(server, request, reply);\n // Some upstream handlers start an async send without returning its\n // promise. Returning the real reply keeps Fastify from auto-sending.\n return reply;\n }\n // A wildcard:false file may disappear between boot and the first request.\n if (route.file) {\n const sendFile = decorators.get(\"sendFile\");\n if (sendFile) return sendFile.call(reply, route.file, route.rootPath);\n }\n return reply.callNotFound();\n },\n });\n }\n}\n"],"mappings":";;;;;AAgBA,SAAS,YAAY,OAAe,SAAiB,aAAa,OAAc;CAC9E,OAAO,OAAO,OACZ,6BACI,IAAI,UAAU,IAAI,MAAM,WAAW,SAAS,oBAC5C,IAAI,MAAM,IAAI,MAAM,WAAW,SAAS,GAC5C;EACE,MAAM,aAAa,oCAAoC;EACvD,YAAY;CACd,CACF;AACF;;AAGA,SAAS,cACP,QACA,SACsB;CACtB,MAAM,OAAO,QAAQ;CACrB,MAAM,aAAa,UACjB,iBAAiB,OAAO,MAAM,aAAa,UAAU,cAAc,KAAK,IAAI;CAC9E,MAAM,aAAa,MAAM,QAAQ,IAAI,IACjC,KAAK,IAAI,SAAS,IAClB,SAAS,SACP,SACA,UAAU,IAAI;CACpB,IAAI,QAAQ,UAAU,SAAS,eAAe,QAAW;EACvD,IAAI,eAAe,QAAW,MAAM,YAAY,QAAQ,aAAa;EACrE,IAAI,MAAM,QAAQ,UAAU,KAAK,WAAW,WAAW,GACrD,MAAM,YAAY,QAAQ,kCAAkC;EAC9D,IAAI,MAAM,QAAQ,UAAU,KAAK,IAAI,IAAI,UAAU,CAAC,CAAC,SAAS,WAAW,QACvE,MAAM,YAAY,QAAQ,gCAAgC;EAC5D,KAAK,MAAM,SAAS,MAAM,QAAQ,UAAU,IAAI,aAAa,CAAC,UAAU,GAAG;GACzE,IAAI,OAAO,UAAU,UAAU,MAAM,YAAY,QAAQ,oBAAoB,IAAI;GACjF,IAAI,CAAC,KAAK,WAAW,KAAK,GAAG,MAAM,YAAY,QAAQ,0BAA0B;GACjF,IAAI;IACF,IAAI,CAAC,SAAS,KAAK,CAAC,CAAC,YAAY,GAAG,MAAM,YAAY,QAAQ,qBAAqB;GACrF,SAAS,OAAO;IACd,IAAK,MAAgC,SAAS,UAAU,MAAM;IAC9D,IAAI,CAAC,QAAQ,iBAAiB,OAAO,IAAI,KAAK,gBAAgB,MAAM,aAAa;GACnF;EACF;CACF;CACA,IAAI,QAAQ,eAAe,UAAa,OAAO,QAAQ,eAAe,YACpE,MAAM,YAAY,cAAc,sBAAsB,IAAI;CAC5D,IAAI,QAAQ,UAAU,SAAS,QAAQ,YAAY,OAAO,QAAQ,aAAa,WAC7E,MAAM,YAAY,YAAY,qBAAqB,IAAI;CACzD,MAAM,OAAO,QAAQ;CACrB,IAAI,MAAM;EACR,IAAI,MAAM,QAAQ,UAAU,GAC1B,MAAM,OAAO,uBAAO,IAAI,UAAU,8CAA8C,GAAG;GACjF,MAAM;GACN,YAAY;EACd,CAAC;EACH,IAAI,OAAO,SAAS,UAAU;GAC5B,IAAI,KAAK,UAAU,KAAK,WAAW,UAAU,KAAK,WAAW,QAC3D,MAAM,YAAY,eAAe,wBAAwB,IAAI;GAC/D,IAAI,KAAK,SAAS,CAAC,MAAM,QAAQ,KAAK,KAAK,GACzC,MAAM,YAAY,cAAc,oBAAoB,IAAI;GAC1D,IAAI,KAAK,cAAc,QAAQ,KAAK,eAAe,WAAW,KAAK,eAAe,YAChF,MAAM,YAAY,mBAAmB,6BAA6B,IAAI;GACxE,IAAI,KAAK,WAAW,UAAU,OAAO,KAAK,WAAW,YACnD,MAAM,YACJ,eACA,uDACA,IACF;EACJ;CACF;CACA,OAAO;EAAE,GAAG;EAAS,MAAM;CAAW;AACxC;;AAGA,eAAe,WAAW,SAA+B,QAAsC;CAC7F,MAAM,EAAE,SAAS,MAAM,OAAO;CAC9B,MAAM,QAAQ,MAAM,QAAQ,QAAQ,IAAI,IAAI,QAAQ,OAAO,CAAC,QAAQ,IAAI;CACxE,MAAM,yBAAS,IAAI,IAAuB;CAC1C,MAAM,UAAU,IAAI,IAClB,QAAQ,UAAU,SACd,CAAC,YAAY,IACb,QAAQ,UAAU,QAChB,CAAC,IACD,CAAC,QAAQ,KAAK,CAAC,CAAC,KAAK,CAC7B;CACA,MAAM,mCAAmB,IAAI,IAAoB;CACjD,KAAK,MAAM,QAAQ,OAAO;EACxB,IAAI,OAAO,SAAS,UAAU;EAC9B,MAAM,WAAW,KAAK,MAAM,KAAK,MAAM,GAAG,CAAC,CAAC,KAAK,KAAK,MAAM,GAAG,CAAC,CAAC,QAAQ,QAAQ,GAAG;EACpF,MAAM,QAAQ,MAAM,KAAK,SAAS;GAChC,KAAK;GACL,UAAU;GACV,QAAQ;GACR,OAAO;GACP,KAAK,QAAQ;GACb,QAAQ,QAAQ;EAClB,CAAC;EACD,KAAK,MAAM,YAAY,OAAO;GAC5B,MAAM,OAAO,SAAS,MAAM,KAAK,MAAM,GAAG,CAAC,CAAC,KAAK,KAAK,MAAM,GAAG;GAC/D,MAAM,MAAM,SAAS;GACrB,IAAI,OAAO,IAAI,GAAG,GAAG;GACrB,OAAO,IAAI,KAAK;IAAE;IAAK,MAAM,IAAI;IAAQ;GAAS,CAAC;GAGnD,MAAM,MAAM,KAAK,MAAM,SAAS,GAAG;GACnC,IAAI,QAAQ,IAAI,GAAG,KAAK,CAAC,iBAAiB,IAAI,GAAG,GAC/C,iBAAiB,IAAI,KAAK,MAAM,QAAQ,GAAG,GAAG,QAAQ;EAC1D;CACF;CACA,KAAK,MAAM,CAAC,WAAW,aAAa,kBAAkB;EACpD,MAAM,MAAM,aAAa,UAAU,SAAS,GAAG,IAAI,KAAK;EACxD,MAAM,OAAO,MAAM,IAAI,QAAQ,QAAQ,EAAE;EACzC,OAAO,IAAI,KAAK;GAAE;GAAK;GAAM;EAAS,CAAC;EACvC,IAAI,QAAQ,aAAa,MACvB,OAAO,IAAI,IAAI,QAAQ,OAAO,EAAE,GAAG;GACjC,KAAK,IAAI,QAAQ,OAAO,EAAE;GAC1B,MAAM,KAAK,QAAQ,OAAO,EAAE;GAC5B;EACF,CAAC;CACL;CACA,OAAO,CAAC,GAAG,OAAO,OAAO,CAAC;AAC5B;;;;;;AAOA,SAAgB,mBACd,QACA,OACA,QAAyB,CAAC,GACpB;CACN,MAAM,UAAU,cAAc,QAAQ,KAAK;CAG3C,OAAO,SACL,OAAO,OAAO,OAAO,aAA8B,cAAc,UAAU,SAAS,KAAK,GAAG,GACzF,OAAO,IAAI,eAAe,IAAI,KACjC,CAAC,CACH;AACF;AAcA,eAAe,cACb,QACA,SACA,OACe;CACf,MAAM,iBAAiB,QAAQ,UAAU;CACzC,MAAM,SACJ,QAAQ,4BAA4B,eAAe,SAAS,GAAG,IAC3D,iBACA,GAAG,eAAe;CACxB,MAAM,2BAAW,IAAI,IAAgC;CACrD,MAAM,6BAAa,IAAI,IAA4B;CACnD,IAAI;CAEJ,SAAS,aAA4B;EACnC,OAAQ,iBAAiB,YAAY;GACnC,MAAM,SAAS,OAAO,OAAO,MAAM;GACnC,MAAM,WAAW,UAAyC;IACxD,MAAM,MAAM,MAAM,OAAQ,MAA2C;IACrE,IAAI,CAAC,KAAK,MAAM,IAAI,MAAM,gDAAgD;IAC1E,KAAK,MAAM,UAAU,CAAC,MAAM,MAAM,CAAC,CAAC,KAAK,GAAG,SAAS,IAAI,GAAG,OAAO,GAAG,OAAO,MAAM,OAAO;IAC1F,OAAO;GACT;GACA,OAAO,iBAAiB,QAAQ;IAC9B,OAAO,EAAE,OAAO,QAAQ;IACxB,KAAK,EACH,QACE,KACA,OACA,YACG,QAAQ;KAAE,GAAG;KAAO;KAAK,QAAQ,CAAC,OAAO,MAAM;KAAG;IAAQ,CAAC,EAClE;IACA,eAAe,EACb,QAAQ,MAAc,YAA4B;KAChD,WAAW,IAAI,MAAM,OAAO;KAC5B,OAAO;IACT,EACF;GACF,CAAC;GACD,MAAM,EAAE,SAAS,iBAAiB,MAAM,OAAO;GAC/C,MAAM,aAAa,QAAQ;IAAE,GAAG;IAAS,eAAe;IAAM,iBAAiB;GAAK,CAAC;EACvF,EAAC,CAAE;CACL;CAEA,IAAI,QAAQ,kBAAkB,OAC5B,KAAK,MAAM,QAAQ,CAAC,YAAY,UAAU,GACxC,OAAO,cAAc,MAAM,SAA8B,GAAG,MAAiB;EAC3E,AAAK,WAAW,CAAC,CACd,WAAW;GACV,MAAM,YAAY,WAAW,IAAI,IAAI;GACrC,IAAI,CAAC,WAAW,MAAM,IAAI,MAAM,iCAAiC,KAAK,EAAE;GACxE,UAAU,MAAM,MAAM,IAAI;EAC5B,CAAC,CAAC,CACD,OAAO,UAAmB,KAAK,KAAK,KAAK,CAAC;EAC7C,OAAO;CACT,CAAC;CAGL,IAAI,QAAQ,UAAU,OAAO;CAC7B,MAAM,SACJ,QAAQ,aAAa,QAAQ,MAAM,WAAW,SAAS,MAAM,IAAI,CAAC,EAAE,KAAK,SAAS,IAAI,CAAC;CACzF,IAAI,QAAQ,aAAa,SAAS,QAAQ,aAAa,QAAQ,WAAW,gBACxE,OAAO,KAAK,EAAE,KAAK,eAAe,CAAC;CACrC,MAAM,SAA4C,EAAE,MAAM,QAAQ,cAAc,KAAK;CACrF,KAAK,MAAM,SAAS,QAClB,OAAO,MAAM;EACX,KAAK,MAAM;EACX,QAAQ,CAAC,QAAQ,KAAK;EACtB,aAAa,QAAQ;EACrB;EACA,UAAU,QAAQ;EAClB,QAAQ;GACN,GAAI,MAAM,OAAO;IAAE,MAAM,MAAM;IAAM,UAAU,MAAM;GAAS,IAAI,CAAC;GACnE,GAAI,MAAM,cAAc,SAAY,EAAE,WAAW,MAAM,UAAU,IAAI,CAAC;EACxE;EACA,aAAa,OAAO,SAAS,OAAO;GAClC,IAAI,OAAO,SAAS,8BAA8B;IAChD,MAAM,QAAQ,IAAI,QAAQ;IAC1B;GACF;GACA,OAAO,OAAO,aAAa,OAAO,SAAS,KAAK;EAClD;EACA,MAAM,QAAQ,SAAyB,OAAqB;GAC1D,MAAM,WAAW;GACjB,MAAM,UAAU,SAAS,IAAI,GAAG,QAAQ,OAAO,GAAG,MAAM,KAAK;GAC7D,IAAI,SAAS;IACX,MAAM,QAAQ,KAAK,QAAQ,SAAS,KAAK;IAGzC,OAAO;GACT;GAEA,IAAI,MAAM,MAAM;IACd,MAAM,WAAW,WAAW,IAAI,UAAU;IAC1C,IAAI,UAAU,OAAO,SAAS,KAAK,OAAO,MAAM,MAAM,MAAM,QAAQ;GACtE;GACA,OAAO,MAAM,aAAa;EAC5B;CACF,CAAC;AAEL"}
@@ -1,7 +1,7 @@
1
1
  import { Request } from "../request.mjs";
2
2
  import { Middleware } from "../../router/types.mjs";
3
3
 
4
- //#region ../core/src/http/middleware/cache-response-middleware.d.ts
4
+ //#region ../../packages/core/src/http/middleware/cache-response-middleware.d.ts
5
5
  type CacheMiddlewareOptions = {
6
6
  /**
7
7
  * Cache key
@@ -1 +1 @@
1
- {"version":3,"file":"cache-response-middleware.d.mts","names":[],"sources":["../../../../../../../../core/src/http/middleware/cache-response-middleware.ts"],"mappings":";;;;KAsBY,sBAAA;;AAAZ;;EAIE,QAAA,aAAqB,OAAA,EAAS,OAAA,iBAAwB,OAAA,EAAS,OAAA,KAAY,OAAA;EAA7C;;;;;;EAO9B,UAAA;EAP8B;;;;;EAa9B,IAAA;EAAA;;;EAIA,GAAA;EAmB6B;;;AAAO;AA+DtC;;EA3EE,MAAA;EA2EgG;;;;;AAAA;;;;;;EA/DhG,IAAA,gBAAoB,OAAA,EAAS,OAAA;AAAA;AAAA,iBA+Df,eAAA,CAAgB,oBAAA,EAAsB,sBAAA,YAAkC,UAAU"}
1
+ {"version":3,"file":"cache-response-middleware.d.mts","names":[],"sources":["../../../../../../../../../packages/core/src/http/middleware/cache-response-middleware.ts"],"mappings":";;;;KAsBY,sBAAA;;AAAZ;;EAIE,QAAA,aAAqB,OAAA,EAAS,OAAA,iBAAwB,OAAA,EAAS,OAAA,KAAY,OAAA;EAA7C;;;;;;EAO9B,UAAA;EAP8B;;;;;EAa9B,IAAA;EAAA;;;EAIA,GAAA;EAmB6B;;;AAAO;AA+DtC;;EA3EE,MAAA;EA2EgG;;;;;AAAA;;;;;;EA/DhG,IAAA,gBAAoB,OAAA,EAAS,OAAA;AAAA;AAAA,iBA+Df,eAAA,CAAgB,oBAAA,EAAsB,sBAAA,YAAkC,UAAU"}
@@ -2,7 +2,7 @@ import { log } from "@warlock.js/logger";
2
2
  import { except } from "@mongez/reinforcements";
3
3
  import { cache } from "@warlock.js/cache";
4
4
 
5
- //#region ../core/src/http/middleware/cache-response-middleware.ts
5
+ //#region ../../packages/core/src/http/middleware/cache-response-middleware.ts
6
6
  const defaultCacheOptions = { withLocale: true };
7
7
  /**
8
8
  * Resolves `CacheMiddlewareOptions.tags` — a static list or a function of
@@ -1 +1 @@
1
- {"version":3,"file":"cache-response-middleware.mjs","names":[],"sources":["../../../../../../../../core/src/http/middleware/cache-response-middleware.ts"],"sourcesContent":["import { except } from \"@mongez/reinforcements\";\nimport { cache } from \"@warlock.js/cache\";\nimport { log } from \"@warlock.js/logger\";\nimport type { Middleware } from \"../../router/types\";\nimport type { Request } from \"./../request\";\nimport type { Response } from \"./../response\";\n\n/**\n * Shape persisted to the cache for a cached response. Stores the status and\n * content-type alongside the body so the HIT path can replay the response\n * faithfully via {@link Response.replay} instead of re-entering `send()`.\n */\ntype CachedResponsePayload = {\n status: number;\n data: unknown;\n contentType?: string;\n};\n\n// TODO: Add option to determine whether to cache the response or not\n// TODO: add option to determine what to be cached from the response\n// TODO: add cache middleware config options for example to set the default driver, ttl, etc\n\nexport type CacheMiddlewareOptions = {\n /**\n * Cache key\n */\n cacheKey: string | ((request: Request) => string) | ((request: Request) => Promise<string>);\n /**\n * If true, then the response will be cached based on the current locale code\n * This is useful when you have a multi-language website, and you want to cache the response based on the current locale\n *\n * @default true\n */\n withLocale?: boolean;\n /**\n * List of keys from the response object to omit from the cached response\n *\n * @default ['user']\n */\n omit?: string[];\n /**\n * Expires after number of seconds\n */\n ttl?: number;\n /**\n * Cache driver\n *\n * @see config/cache.ts: drivers object\n * @default cache manager\n */\n driver?: string;\n /**\n * Tags this cached response is stored under, mirroring `route.cache.tags`\n * on `@warlock.js/web`'s page cache (`PageCacheOptIn.tags`,\n * `web/src/routing/route-identity.ts`) so the two caches share one mental\n * model: `cache.tags([...]).invalidate()` from `@warlock.js/cache` evicts\n * a tagged API response the same way it evicts a tagged page. Either a\n * static list, or a function of the request — resolved once per request,\n * right before the response is stored.\n *\n * @default undefined (untagged — behaves exactly as before this option existed)\n */\n tags?: string[] | ((request: Request) => string[]);\n};\n\nconst defaultCacheOptions: Partial<CacheMiddlewareOptions> = {\n withLocale: true,\n};\n\ntype ParsedCacheOptions = Required<Omit<CacheMiddlewareOptions, \"tags\">> & {\n cacheKey: string;\n /** Resolved, concrete tag list — see {@link resolveCacheTags}. */\n tags: string[];\n};\n\n/**\n * Resolves `CacheMiddlewareOptions.tags` — a static list or a function of\n * the request — into a concrete list at store time. Mirrors\n * `resolveCacheTags` in `@warlock.js/web`'s `create-page-route-handler.ts`,\n * the equivalent seam for `route.cache.tags`.\n */\nfunction resolveCacheTags(tags: CacheMiddlewareOptions[\"tags\"], request: Request): string[] {\n if (tags === undefined) return [];\n\n return typeof tags === \"function\" ? tags(request) : tags;\n}\n\nasync function parseCacheOptions(cacheOptions: CacheMiddlewareOptions | string, request: Request) {\n if (typeof cacheOptions === \"string\") {\n cacheOptions = {\n cacheKey: cacheOptions,\n };\n }\n\n // Everything below resolves into a fresh per-request object; the options\n // the factory closed over are shared across all requests and users, so they\n // must never be written to.\n const resolvedCacheKey =\n typeof cacheOptions.cacheKey === \"function\"\n ? await cacheOptions.cacheKey(request)\n : cacheOptions.cacheKey;\n\n const tags = resolveCacheTags(cacheOptions.tags, request);\n\n const finalCacheOptions = {\n ...defaultCacheOptions,\n ...cacheOptions,\n cacheKey: resolvedCacheKey,\n tags: [...tags],\n omit: cacheOptions.omit ? [...cacheOptions.omit] : undefined,\n } as unknown as ParsedCacheOptions;\n\n if (finalCacheOptions.withLocale) {\n const locale = request.getLocaleCode();\n\n finalCacheOptions.cacheKey = `${finalCacheOptions.cacheKey}:${locale}`;\n }\n\n if (!finalCacheOptions.omit) {\n finalCacheOptions.omit = [\"user\", \"settings\"];\n }\n\n return finalCacheOptions;\n}\n\nexport function cacheMiddleware(responseCacheOptions: CacheMiddlewareOptions | string): Middleware {\n // The `Middleware` return annotation is load-bearing: without it, tsc never\n // checks this factory's calling convention, which is how the positional v4\n // shape survived an earlier refactor unnoticed.\n return async function ({ request, response }) {\n const { ttl, omit, cacheKey, driver, tags } = await parseCacheOptions(\n responseCacheOptions,\n request,\n );\n const cacheDriver = driver ? await cache.use(driver) : cache;\n\n const content = (await cacheDriver.get(cacheKey)) as CachedResponsePayload | null;\n\n if (content) {\n // Replay through the standard pipeline (status + content-type preserved)\n // instead of `baseResponse.send()`, which would re-enter Response.send()\n // on an already-sent reply, trip the double-send guard, and drop the\n // status / content-type.\n return response.replay({\n status: content.status ?? 200,\n body: content.data,\n contentType: content.contentType,\n });\n }\n\n response.onSent((response: Response) => {\n if (!response.isOk || response.request.path !== request.path) {\n return;\n }\n\n const sentContentType = response.contentType;\n\n const content: CachedResponsePayload = {\n status: response.statusCode,\n data: except(response.parsedBody, omit),\n contentType: typeof sentContentType === \"string\" ? sentContentType : undefined,\n };\n\n // `set` is fire-and-forget inside `onSent`; without a `.catch` a rejected\n // write (e.g. Redis down) would surface as an unhandledRejection.\n //\n // Tagged and untagged writes go through separate calls rather than a\n // shared branch-free path so an untagged route's write stays byte\n // identical to what it was before `tags` existed.\n const write =\n tags.length > 0\n ? cacheDriver.tags(tags).set(cacheKey, content, ttl)\n : cacheDriver.set(cacheKey, content, ttl);\n\n write.catch((error: unknown) => {\n log.error(\"cache-middleware\", \"set\", error);\n });\n });\n };\n}\n"],"mappings":";;;;;AAiEA,MAAM,sBAAuD,EAC3D,YAAY,KACd;;;;;;;AAcA,SAAS,iBAAiB,MAAsC,SAA4B;CAC1F,IAAI,SAAS,QAAW,OAAO,CAAC;CAEhC,OAAO,OAAO,SAAS,aAAa,KAAK,OAAO,IAAI;AACtD;AAEA,eAAe,kBAAkB,cAA+C,SAAkB;CAChG,IAAI,OAAO,iBAAiB,UAC1B,eAAe,EACb,UAAU,aACZ;CAMF,MAAM,mBACJ,OAAO,aAAa,aAAa,aAC7B,MAAM,aAAa,SAAS,OAAO,IACnC,aAAa;CAEnB,MAAM,OAAO,iBAAiB,aAAa,MAAM,OAAO;CAExD,MAAM,oBAAoB;EACxB,GAAG;EACH,GAAG;EACH,UAAU;EACV,MAAM,CAAC,GAAG,IAAI;EACd,MAAM,aAAa,OAAO,CAAC,GAAG,aAAa,IAAI,IAAI;CACrD;CAEA,IAAI,kBAAkB,YAAY;EAChC,MAAM,SAAS,QAAQ,cAAc;EAErC,kBAAkB,WAAW,GAAG,kBAAkB,SAAS,GAAG;CAChE;CAEA,IAAI,CAAC,kBAAkB,MACrB,kBAAkB,OAAO,CAAC,QAAQ,UAAU;CAG9C,OAAO;AACT;AAEA,SAAgB,gBAAgB,sBAAmE;CAIjG,OAAO,eAAgB,EAAE,SAAS,YAAY;EAC5C,MAAM,EAAE,KAAK,MAAM,UAAU,QAAQ,SAAS,MAAM,kBAClD,sBACA,OACF;EACA,MAAM,cAAc,SAAS,MAAM,MAAM,IAAI,MAAM,IAAI;EAEvD,MAAM,UAAW,MAAM,YAAY,IAAI,QAAQ;EAE/C,IAAI,SAKF,OAAO,SAAS,OAAO;GACrB,QAAQ,QAAQ,UAAU;GAC1B,MAAM,QAAQ;GACd,aAAa,QAAQ;EACvB,CAAC;EAGH,SAAS,QAAQ,aAAuB;GACtC,IAAI,CAAC,SAAS,QAAQ,SAAS,QAAQ,SAAS,QAAQ,MACtD;GAGF,MAAM,kBAAkB,SAAS;GAEjC,MAAM,UAAiC;IACrC,QAAQ,SAAS;IACjB,MAAM,OAAO,SAAS,YAAY,IAAI;IACtC,aAAa,OAAO,oBAAoB,WAAW,kBAAkB;GACvE;GAaA,CAJE,KAAK,SAAS,IACV,YAAY,KAAK,IAAI,CAAC,CAAC,IAAI,UAAU,SAAS,GAAG,IACjD,YAAY,IAAI,UAAU,SAAS,GAAG,EAEvC,CAAC,OAAO,UAAmB;IAC9B,IAAI,MAAM,oBAAoB,OAAO,KAAK;GAC5C,CAAC;EACH,CAAC;CACH;AACF"}
1
+ {"version":3,"file":"cache-response-middleware.mjs","names":[],"sources":["../../../../../../../../../packages/core/src/http/middleware/cache-response-middleware.ts"],"sourcesContent":["import { except } from \"@mongez/reinforcements\";\nimport { cache } from \"@warlock.js/cache\";\nimport { log } from \"@warlock.js/logger\";\nimport type { Middleware } from \"../../router/types\";\nimport type { Request } from \"./../request\";\nimport type { Response } from \"./../response\";\n\n/**\n * Shape persisted to the cache for a cached response. Stores the status and\n * content-type alongside the body so the HIT path can replay the response\n * faithfully via {@link Response.replay} instead of re-entering `send()`.\n */\ntype CachedResponsePayload = {\n status: number;\n data: unknown;\n contentType?: string;\n};\n\n// TODO: Add option to determine whether to cache the response or not\n// TODO: add option to determine what to be cached from the response\n// TODO: add cache middleware config options for example to set the default driver, ttl, etc\n\nexport type CacheMiddlewareOptions = {\n /**\n * Cache key\n */\n cacheKey: string | ((request: Request) => string) | ((request: Request) => Promise<string>);\n /**\n * If true, then the response will be cached based on the current locale code\n * This is useful when you have a multi-language website, and you want to cache the response based on the current locale\n *\n * @default true\n */\n withLocale?: boolean;\n /**\n * List of keys from the response object to omit from the cached response\n *\n * @default ['user']\n */\n omit?: string[];\n /**\n * Expires after number of seconds\n */\n ttl?: number;\n /**\n * Cache driver\n *\n * @see config/cache.ts: drivers object\n * @default cache manager\n */\n driver?: string;\n /**\n * Tags this cached response is stored under, mirroring `route.cache.tags`\n * on `@warlock.js/web`'s page cache (`PageCacheOptIn.tags`,\n * `web/src/routing/route-identity.ts`) so the two caches share one mental\n * model: `cache.tags([...]).invalidate()` from `@warlock.js/cache` evicts\n * a tagged API response the same way it evicts a tagged page. Either a\n * static list, or a function of the request — resolved once per request,\n * right before the response is stored.\n *\n * @default undefined (untagged — behaves exactly as before this option existed)\n */\n tags?: string[] | ((request: Request) => string[]);\n};\n\nconst defaultCacheOptions: Partial<CacheMiddlewareOptions> = {\n withLocale: true,\n};\n\ntype ParsedCacheOptions = Required<Omit<CacheMiddlewareOptions, \"tags\">> & {\n cacheKey: string;\n /** Resolved, concrete tag list — see {@link resolveCacheTags}. */\n tags: string[];\n};\n\n/**\n * Resolves `CacheMiddlewareOptions.tags` — a static list or a function of\n * the request — into a concrete list at store time. Mirrors\n * `resolveCacheTags` in `@warlock.js/web`'s `create-page-route-handler.ts`,\n * the equivalent seam for `route.cache.tags`.\n */\nfunction resolveCacheTags(tags: CacheMiddlewareOptions[\"tags\"], request: Request): string[] {\n if (tags === undefined) return [];\n\n return typeof tags === \"function\" ? tags(request) : tags;\n}\n\nasync function parseCacheOptions(cacheOptions: CacheMiddlewareOptions | string, request: Request) {\n if (typeof cacheOptions === \"string\") {\n cacheOptions = {\n cacheKey: cacheOptions,\n };\n }\n\n // Everything below resolves into a fresh per-request object; the options\n // the factory closed over are shared across all requests and users, so they\n // must never be written to.\n const resolvedCacheKey =\n typeof cacheOptions.cacheKey === \"function\"\n ? await cacheOptions.cacheKey(request)\n : cacheOptions.cacheKey;\n\n const tags = resolveCacheTags(cacheOptions.tags, request);\n\n const finalCacheOptions = {\n ...defaultCacheOptions,\n ...cacheOptions,\n cacheKey: resolvedCacheKey,\n tags: [...tags],\n omit: cacheOptions.omit ? [...cacheOptions.omit] : undefined,\n } as unknown as ParsedCacheOptions;\n\n if (finalCacheOptions.withLocale) {\n const locale = request.getLocaleCode();\n\n finalCacheOptions.cacheKey = `${finalCacheOptions.cacheKey}:${locale}`;\n }\n\n if (!finalCacheOptions.omit) {\n finalCacheOptions.omit = [\"user\", \"settings\"];\n }\n\n return finalCacheOptions;\n}\n\nexport function cacheMiddleware(responseCacheOptions: CacheMiddlewareOptions | string): Middleware {\n // The `Middleware` return annotation is load-bearing: without it, tsc never\n // checks this factory's calling convention, which is how the positional v4\n // shape survived an earlier refactor unnoticed.\n return async function ({ request, response }) {\n const { ttl, omit, cacheKey, driver, tags } = await parseCacheOptions(\n responseCacheOptions,\n request,\n );\n const cacheDriver = driver ? await cache.use(driver) : cache;\n\n const content = (await cacheDriver.get(cacheKey)) as CachedResponsePayload | null;\n\n if (content) {\n // Replay through the standard pipeline (status + content-type preserved)\n // instead of `baseResponse.send()`, which would re-enter Response.send()\n // on an already-sent reply, trip the double-send guard, and drop the\n // status / content-type.\n return response.replay({\n status: content.status ?? 200,\n body: content.data,\n contentType: content.contentType,\n });\n }\n\n response.onSent((response: Response) => {\n if (!response.isOk || response.request.path !== request.path) {\n return;\n }\n\n const sentContentType = response.contentType;\n\n const content: CachedResponsePayload = {\n status: response.statusCode,\n data: except(response.parsedBody, omit),\n contentType: typeof sentContentType === \"string\" ? sentContentType : undefined,\n };\n\n // `set` is fire-and-forget inside `onSent`; without a `.catch` a rejected\n // write (e.g. Redis down) would surface as an unhandledRejection.\n //\n // Tagged and untagged writes go through separate calls rather than a\n // shared branch-free path so an untagged route's write stays byte\n // identical to what it was before `tags` existed.\n const write =\n tags.length > 0\n ? cacheDriver.tags(tags).set(cacheKey, content, ttl)\n : cacheDriver.set(cacheKey, content, ttl);\n\n write.catch((error: unknown) => {\n log.error(\"cache-middleware\", \"set\", error);\n });\n });\n };\n}\n"],"mappings":";;;;;AAiEA,MAAM,sBAAuD,EAC3D,YAAY,KACd;;;;;;;AAcA,SAAS,iBAAiB,MAAsC,SAA4B;CAC1F,IAAI,SAAS,QAAW,OAAO,CAAC;CAEhC,OAAO,OAAO,SAAS,aAAa,KAAK,OAAO,IAAI;AACtD;AAEA,eAAe,kBAAkB,cAA+C,SAAkB;CAChG,IAAI,OAAO,iBAAiB,UAC1B,eAAe,EACb,UAAU,aACZ;CAMF,MAAM,mBACJ,OAAO,aAAa,aAAa,aAC7B,MAAM,aAAa,SAAS,OAAO,IACnC,aAAa;CAEnB,MAAM,OAAO,iBAAiB,aAAa,MAAM,OAAO;CAExD,MAAM,oBAAoB;EACxB,GAAG;EACH,GAAG;EACH,UAAU;EACV,MAAM,CAAC,GAAG,IAAI;EACd,MAAM,aAAa,OAAO,CAAC,GAAG,aAAa,IAAI,IAAI;CACrD;CAEA,IAAI,kBAAkB,YAAY;EAChC,MAAM,SAAS,QAAQ,cAAc;EAErC,kBAAkB,WAAW,GAAG,kBAAkB,SAAS,GAAG;CAChE;CAEA,IAAI,CAAC,kBAAkB,MACrB,kBAAkB,OAAO,CAAC,QAAQ,UAAU;CAG9C,OAAO;AACT;AAEA,SAAgB,gBAAgB,sBAAmE;CAIjG,OAAO,eAAgB,EAAE,SAAS,YAAY;EAC5C,MAAM,EAAE,KAAK,MAAM,UAAU,QAAQ,SAAS,MAAM,kBAClD,sBACA,OACF;EACA,MAAM,cAAc,SAAS,MAAM,MAAM,IAAI,MAAM,IAAI;EAEvD,MAAM,UAAW,MAAM,YAAY,IAAI,QAAQ;EAE/C,IAAI,SAKF,OAAO,SAAS,OAAO;GACrB,QAAQ,QAAQ,UAAU;GAC1B,MAAM,QAAQ;GACd,aAAa,QAAQ;EACvB,CAAC;EAGH,SAAS,QAAQ,aAAuB;GACtC,IAAI,CAAC,SAAS,QAAQ,SAAS,QAAQ,SAAS,QAAQ,MACtD;GAGF,MAAM,kBAAkB,SAAS;GAEjC,MAAM,UAAiC;IACrC,QAAQ,SAAS;IACjB,MAAM,OAAO,SAAS,YAAY,IAAI;IACtC,aAAa,OAAO,oBAAoB,WAAW,kBAAkB;GACvE;GAaA,CAJE,KAAK,SAAS,IACV,YAAY,KAAK,IAAI,CAAC,CAAC,IAAI,UAAU,SAAS,GAAG,IACjD,YAAY,IAAI,UAAU,SAAS,GAAG,EAEvC,CAAC,OAAO,UAAmB;IAC9B,IAAI,MAAM,oBAAoB,OAAO,KAAK;GAC5C,CAAC;EACH,CAAC;CACH;AACF"}
@@ -1,6 +1,6 @@
1
1
  import { Request } from "../request.mjs";
2
2
  import { Middleware } from "../../router/types.mjs";
3
- //#region ../core/src/http/middleware/concurrency-limit.middleware.d.ts
3
+ //#region ../../packages/core/src/http/middleware/concurrency-limit.middleware.d.ts
4
4
  /**
5
5
  * Options for the concurrency limit middleware.
6
6
  */
@@ -1 +1 @@
1
- {"version":3,"file":"concurrency-limit.middleware.d.mts","names":[],"sources":["../../../../../../../../core/src/http/middleware/concurrency-limit.middleware.ts"],"mappings":";;;;;;KASY,uBAAA;EAAuB;;;;;;;;EASjC,YAAA,IAAgB,OAAA,EAAS,OAAO;EAiDlB;;;EA7Cd,YAAA;AAAA;;;;;AAgDW;;;;;;;;;;;;;;;;;;;;;;;;iBAHG,0BAAA,CACd,GAAA,UACA,OAAA,GAAS,uBAAA,GACR,UAAU"}
1
+ {"version":3,"file":"concurrency-limit.middleware.d.mts","names":[],"sources":["../../../../../../../../../packages/core/src/http/middleware/concurrency-limit.middleware.ts"],"mappings":";;;;;;KASY,uBAAA;EAAuB;;;;;;;;EASjC,YAAA,IAAgB,OAAA,EAAS,OAAO;EAiDlB;;;EA7Cd,YAAA;AAAA;;;;;AAgDW;;;;;;;;;;;;;;;;;;;;;;;;iBAHG,0BAAA,CACd,GAAA,UACA,OAAA,GAAS,uBAAA,GACR,UAAU"}
@@ -1,7 +1,7 @@
1
1
  import { HttpErrorCodes } from "../error-codes.mjs";
2
2
  import { t } from "./inject-request-context.mjs";
3
3
 
4
- //#region ../core/src/http/middleware/concurrency-limit.middleware.ts
4
+ //#region ../../packages/core/src/http/middleware/concurrency-limit.middleware.ts
5
5
  const counters = /* @__PURE__ */ new Map();
6
6
  function release(key) {
7
7
  const after = (counters.get(key) || 1) - 1;
@@ -1 +1 @@
1
- {"version":3,"file":"concurrency-limit.middleware.mjs","names":[],"sources":["../../../../../../../../core/src/http/middleware/concurrency-limit.middleware.ts"],"sourcesContent":["import type { Middleware } from \"../../router\";\nimport { HttpErrorCodes } from \"../error-codes\";\nimport type { Request } from \"../request\";\nimport type { Response } from \"../response\";\nimport { t } from \"./inject-request-context\";\n\n/**\n * Options for the concurrency limit middleware.\n */\nexport type ConcurrencyLimitOptions = {\n /**\n * Group key generator. Defaults to `request.route.path` — i.e. the cap\n * applies across all callers of that route. Override to scope per-user\n * or per-tenant.\n *\n * @example\n * keyGenerator: (request) => `${request.route.path}:${request.locals.user?.id ?? request.ip}`,\n */\n keyGenerator?: (request: Request) => string;\n /**\n * Override the default error message.\n */\n errorMessage?: string;\n};\n\nconst counters = new Map<string, number>();\n\nfunction release(key: string) {\n const after = (counters.get(key) || 1) - 1;\n\n if (after <= 0) {\n counters.delete(key);\n\n return;\n }\n\n counters.set(key, after);\n}\n\n/**\n * Cap the number of in-flight requests against a route. Above the cap, new\n * requests get a fast 429 + `Retry-After: 1` — no queue, no timeout.\n *\n * Use for endpoints whose cost is unbounded per-request: report generation,\n * AI completions, image processing, expensive aggregations. Different from\n * `rateLimit()` — rate-limit caps requests-per-time, concurrency caps\n * in-flight requests at any instant.\n *\n * The counter is process-local. With `N` replicas the effective cap is\n * `N × max`. Document this in the route's behavior; if you need shared\n * concurrency across replicas, reach for a `@warlock.js/cache` lock instead.\n *\n * @example\n * import { middleware } from \"@warlock.js/core\";\n *\n * router.post(\"/reports/generate\", reportController, {\n * middleware: [middleware.concurrencyLimit(3)],\n * });\n *\n * router.post(\"/ai/summarize\", summarizeController, {\n * middleware: [\n * middleware.concurrencyLimit(10, {\n * keyGenerator: (request) => `ai:${request.locals.user?.id ?? request.ip}`,\n * }),\n * ],\n * });\n */\nexport function concurrencyLimitMiddleware(\n max: number,\n options: ConcurrencyLimitOptions = {},\n): Middleware {\n return ({ request, response }) => {\n const key = options.keyGenerator?.(request) || request.route.path;\n const current = counters.get(key) || 0;\n\n if (current >= max) {\n response.header(\"Retry-After\", 1);\n\n return response.tooManyRequests({\n error: options.errorMessage || t(\"http.concurrencyLimitReached\"),\n errorCode: HttpErrorCodes.ConcurrencyLimitReached,\n limit: max,\n });\n }\n\n counters.set(key, current + 1);\n\n let released = false;\n\n const releaseOnce = () => {\n if (released) {\n return;\n }\n\n released = true;\n release(key);\n };\n\n // `onSent` only fires from Response.send()/stream().end()/sse().end().\n // Bare-reply paths (noContent, redirect, sendFile, download, sendBuffer,\n // raw send) never trigger it, so the slot would leak and the route would\n // permanently 429 after `max` such requests. Bind to the raw socket\n // lifecycle as well so the slot frees regardless of response path —\n // `releaseOnce` is idempotent, so double-firing is harmless.\n response.onSent((_sentResponse: Response) => releaseOnce());\n response.baseResponse.raw.once(\"finish\", releaseOnce);\n response.baseResponse.raw.once(\"close\", releaseOnce);\n };\n}\n"],"mappings":";;;;AAyBA,MAAM,2BAAW,IAAI,IAAoB;AAEzC,SAAS,QAAQ,KAAa;CAC5B,MAAM,SAAS,SAAS,IAAI,GAAG,KAAK,KAAK;CAEzC,IAAI,SAAS,GAAG;EACd,SAAS,OAAO,GAAG;EAEnB;CACF;CAEA,SAAS,IAAI,KAAK,KAAK;AACzB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BA,SAAgB,2BACd,KACA,UAAmC,CAAC,GACxB;CACZ,QAAQ,EAAE,SAAS,eAAe;EAChC,MAAM,MAAM,QAAQ,eAAe,OAAO,KAAK,QAAQ,MAAM;EAC7D,MAAM,UAAU,SAAS,IAAI,GAAG,KAAK;EAErC,IAAI,WAAW,KAAK;GAClB,SAAS,OAAO,eAAe,CAAC;GAEhC,OAAO,SAAS,gBAAgB;IAC9B,OAAO,QAAQ,gBAAgB,EAAE,8BAA8B;IAC/D;IACA,OAAO;GACT,CAAC;EACH;EAEA,SAAS,IAAI,KAAK,UAAU,CAAC;EAE7B,IAAI,WAAW;EAEf,MAAM,oBAAoB;GACxB,IAAI,UACF;GAGF,WAAW;GACX,QAAQ,GAAG;EACb;EAQA,SAAS,QAAQ,kBAA4B,YAAY,CAAC;EAC1D,SAAS,aAAa,IAAI,KAAK,UAAU,WAAW;EACpD,SAAS,aAAa,IAAI,KAAK,SAAS,WAAW;CACrD;AACF"}
1
+ {"version":3,"file":"concurrency-limit.middleware.mjs","names":[],"sources":["../../../../../../../../../packages/core/src/http/middleware/concurrency-limit.middleware.ts"],"sourcesContent":["import type { Middleware } from \"../../router\";\nimport { HttpErrorCodes } from \"../error-codes\";\nimport type { Request } from \"../request\";\nimport type { Response } from \"../response\";\nimport { t } from \"./inject-request-context\";\n\n/**\n * Options for the concurrency limit middleware.\n */\nexport type ConcurrencyLimitOptions = {\n /**\n * Group key generator. Defaults to `request.route.path` — i.e. the cap\n * applies across all callers of that route. Override to scope per-user\n * or per-tenant.\n *\n * @example\n * keyGenerator: (request) => `${request.route.path}:${request.locals.user?.id ?? request.ip}`,\n */\n keyGenerator?: (request: Request) => string;\n /**\n * Override the default error message.\n */\n errorMessage?: string;\n};\n\nconst counters = new Map<string, number>();\n\nfunction release(key: string) {\n const after = (counters.get(key) || 1) - 1;\n\n if (after <= 0) {\n counters.delete(key);\n\n return;\n }\n\n counters.set(key, after);\n}\n\n/**\n * Cap the number of in-flight requests against a route. Above the cap, new\n * requests get a fast 429 + `Retry-After: 1` — no queue, no timeout.\n *\n * Use for endpoints whose cost is unbounded per-request: report generation,\n * AI completions, image processing, expensive aggregations. Different from\n * `rateLimit()` — rate-limit caps requests-per-time, concurrency caps\n * in-flight requests at any instant.\n *\n * The counter is process-local. With `N` replicas the effective cap is\n * `N × max`. Document this in the route's behavior; if you need shared\n * concurrency across replicas, reach for a `@warlock.js/cache` lock instead.\n *\n * @example\n * import { middleware } from \"@warlock.js/core\";\n *\n * router.post(\"/reports/generate\", reportController, {\n * middleware: [middleware.concurrencyLimit(3)],\n * });\n *\n * router.post(\"/ai/summarize\", summarizeController, {\n * middleware: [\n * middleware.concurrencyLimit(10, {\n * keyGenerator: (request) => `ai:${request.locals.user?.id ?? request.ip}`,\n * }),\n * ],\n * });\n */\nexport function concurrencyLimitMiddleware(\n max: number,\n options: ConcurrencyLimitOptions = {},\n): Middleware {\n return ({ request, response }) => {\n const key = options.keyGenerator?.(request) || request.route.path;\n const current = counters.get(key) || 0;\n\n if (current >= max) {\n response.header(\"Retry-After\", 1);\n\n return response.tooManyRequests({\n error: options.errorMessage || t(\"http.concurrencyLimitReached\"),\n errorCode: HttpErrorCodes.ConcurrencyLimitReached,\n limit: max,\n });\n }\n\n counters.set(key, current + 1);\n\n let released = false;\n\n const releaseOnce = () => {\n if (released) {\n return;\n }\n\n released = true;\n release(key);\n };\n\n // `onSent` only fires from Response.send()/stream().end()/sse().end().\n // Bare-reply paths (noContent, redirect, sendFile, download, sendBuffer,\n // raw send) never trigger it, so the slot would leak and the route would\n // permanently 429 after `max` such requests. Bind to the raw socket\n // lifecycle as well so the slot frees regardless of response path —\n // `releaseOnce` is idempotent, so double-firing is harmless.\n response.onSent((_sentResponse: Response) => releaseOnce());\n response.baseResponse.raw.once(\"finish\", releaseOnce);\n response.baseResponse.raw.once(\"close\", releaseOnce);\n };\n}\n"],"mappings":";;;;AAyBA,MAAM,2BAAW,IAAI,IAAoB;AAEzC,SAAS,QAAQ,KAAa;CAC5B,MAAM,SAAS,SAAS,IAAI,GAAG,KAAK,KAAK;CAEzC,IAAI,SAAS,GAAG;EACd,SAAS,OAAO,GAAG;EAEnB;CACF;CAEA,SAAS,IAAI,KAAK,KAAK;AACzB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BA,SAAgB,2BACd,KACA,UAAmC,CAAC,GACxB;CACZ,QAAQ,EAAE,SAAS,eAAe;EAChC,MAAM,MAAM,QAAQ,eAAe,OAAO,KAAK,QAAQ,MAAM;EAC7D,MAAM,UAAU,SAAS,IAAI,GAAG,KAAK;EAErC,IAAI,WAAW,KAAK;GAClB,SAAS,OAAO,eAAe,CAAC;GAEhC,OAAO,SAAS,gBAAgB;IAC9B,OAAO,QAAQ,gBAAgB,EAAE,8BAA8B;IAC/D;IACA,OAAO;GACT,CAAC;EACH;EAEA,SAAS,IAAI,KAAK,UAAU,CAAC;EAE7B,IAAI,WAAW;EAEf,MAAM,oBAAoB;GACxB,IAAI,UACF;GAGF,WAAW;GACX,QAAQ,GAAG;EACb;EAQA,SAAS,QAAQ,kBAA4B,YAAY,CAAC;EAC1D,SAAS,aAAa,IAAI,KAAK,UAAU,WAAW;EACpD,SAAS,aAAa,IAAI,KAAK,SAAS,WAAW;CACrD;AACF"}
@@ -1,5 +1,5 @@
1
1
  import { Middleware } from "../../router/types.mjs";
2
- //#region ../core/src/http/middleware/idempotency.middleware.d.ts
2
+ //#region ../../packages/core/src/http/middleware/idempotency.middleware.d.ts
3
3
  /**
4
4
  * Options for the idempotency middleware.
5
5
  */
@@ -1 +1 @@
1
- {"version":3,"file":"idempotency.middleware.d.mts","names":[],"sources":["../../../../../../../../core/src/http/middleware/idempotency.middleware.ts"],"mappings":";;;;;KAYY,kBAAA;EAAkB;;;EAI5B,GAAA;EAKA;;;;EAAA,cAAA;EAgBM;AA+CR;;;EA1DE,UAAA;EA0D6C;;;;AAAoC;EApDjF,OAAA;;;;;EAKA,MAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA+Cc,qBAAA,CAAsB,OAAA,GAAS,kBAAA,GAA0B,UAAU"}
1
+ {"version":3,"file":"idempotency.middleware.d.mts","names":[],"sources":["../../../../../../../../../packages/core/src/http/middleware/idempotency.middleware.ts"],"mappings":";;;;;KAYY,kBAAA;EAAkB;;;EAI5B,GAAA;EAKA;;;;EAAA,cAAA;EAgBM;AA+CR;;;EA1DE,UAAA;EA0D6C;;;;AAAoC;EApDjF,OAAA;;;;;EAKA,MAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA+Cc,qBAAA,CAAsB,OAAA,GAAS,kBAAA,GAA0B,UAAU"}
@@ -5,7 +5,7 @@ import config from "@mongez/config";
5
5
  import { log } from "@warlock.js/logger";
6
6
  import { cache } from "@warlock.js/cache";
7
7
 
8
- //#region ../core/src/http/middleware/idempotency.middleware.ts
8
+ //#region ../../packages/core/src/http/middleware/idempotency.middleware.ts
9
9
  const DEFAULT_METHODS = [
10
10
  "POST",
11
11
  "PUT",
@@ -1 +1 @@
1
- {"version":3,"file":"idempotency.middleware.mjs","names":[],"sources":["../../../../../../../../core/src/http/middleware/idempotency.middleware.ts"],"sourcesContent":["import config from \"@mongez/config\";\nimport { cache } from \"@warlock.js/cache\";\nimport { log } from \"@warlock.js/logger\";\nimport type { Middleware } from \"../../router\";\nimport { HttpErrorCodes } from \"../error-codes\";\nimport type { Response } from \"../response\";\nimport { t } from \"./inject-request-context\";\nimport { buildIdempotencyCacheKey, hashBody, isValidIdempotencyKey } from \"./utils/idempotency-key\";\n\n/**\n * Options for the idempotency middleware.\n */\nexport type IdempotencyOptions = {\n /**\n * Cache TTL in seconds. Falls back to `http.idempotency.ttl`, then `86400` (24h).\n */\n ttl?: number;\n /**\n * TTL in seconds of the in-flight reservation held while the handler runs.\n * Falls back to `http.idempotency.reservationTtl`, then `60`.\n */\n reservationTtl?: number;\n /**\n * Header name carrying the client's key. Falls back to\n * `http.idempotency.headerName`, then `\"Idempotency-Key\"`.\n */\n headerName?: string;\n /**\n * HTTP methods eligible for idempotency. Falls back to\n * `http.idempotency.methods`, then `[\"POST\",\"PUT\",\"PATCH\",\"DELETE\"]`.\n * Safe methods (GET/HEAD) are skipped regardless.\n */\n methods?: string[];\n /**\n * Cache driver name. Falls back to `http.idempotency.driver`, then the\n * default driver of the cache manager.\n */\n driver?: string;\n};\n\ntype CachedResponse = {\n status: number;\n body: unknown;\n bodyHash: string;\n contentType?: string;\n};\n\ntype InFlightReservation = {\n state: \"in-flight\";\n startedAt: number;\n};\n\nconst DEFAULT_METHODS = [\"POST\", \"PUT\", \"PATCH\", \"DELETE\"];\n\n/**\n * Dedupe non-idempotent writes by an `Idempotency-Key` header — same key,\n * same body, within TTL → cached replay; same key, different body → 422\n * `IdempotencyKeyConflict`.\n *\n * **Must run after `authMiddleware`** — the cache key is scoped per-user\n * (`idem:{userType}:{userId}:{key}`) so user A can't replay user B's key.\n * Anonymous requests fall back to IP scope.\n *\n * The replay sets `Idempotent-Replay: true` on the response for easy\n * client-side / observability detection.\n *\n * Eligible methods default to POST/PUT/PATCH/DELETE. GET/HEAD pass through\n * even with the header set (RFC: safe methods are already idempotent).\n *\n * @example\n * import { authMiddleware } from \"@warlock.js/auth\";\n * import { middleware } from \"@warlock.js/core\";\n *\n * router.post(\"/orders\", createOrderController, {\n * middleware: [authMiddleware(\"client\"), middleware.idempotency()],\n * });\n *\n * router.post(\"/ai/summarize\", summarizeController, {\n * middleware: [\n * authMiddleware(\"client\"),\n * middleware.idempotency({ ttl: 60 * 60 }), // 1h is enough for client retries\n * ],\n * });\n */\nexport function idempotencyMiddleware(options: IdempotencyOptions = {}): Middleware {\n return async ({ request, response }) => {\n const headerName =\n options.headerName || config.get(\"http.idempotency.headerName\", \"Idempotency-Key\");\n const methods = options.methods || config.get(\"http.idempotency.methods\", DEFAULT_METHODS);\n const ttl = options.ttl || config.get(\"http.idempotency.ttl\", 86400);\n const reservationTtl =\n options.reservationTtl || config.get(\"http.idempotency.reservationTtl\", 60);\n const driverName = options.driver || config.get(\"http.idempotency.driver\");\n\n if (!methods.includes(request.method.toUpperCase())) return;\n\n const idempotencyKey = request.header(headerName.toLowerCase());\n\n if (!idempotencyKey) return;\n\n if (!isValidIdempotencyKey(idempotencyKey)) {\n return response.badRequest({\n error: t(\"http.idempotencyKeyInvalid\"),\n errorCode: HttpErrorCodes.IdempotencyKeyInvalid,\n });\n }\n\n const cacheDriver = driverName ? await cache.use(driverName) : cache;\n const cacheKey = buildIdempotencyCacheKey(request, idempotencyKey);\n const bodyHash = hashBody(request.body);\n\n const respondToExisting = (existing: CachedResponse | InFlightReservation | undefined | null) => {\n if (!existing || (existing as InFlightReservation).state === \"in-flight\") {\n response.header(\"Retry-After\", \"1\");\n\n return response.conflict({\n error: \"A request with this Idempotency-Key is already in progress\",\n errorCode: HttpErrorCodes.IdempotencyKeyConflict,\n });\n }\n\n const cached = existing as CachedResponse;\n\n if (cached.bodyHash !== bodyHash) {\n return response.unprocessableEntity({\n error: t(\"http.idempotencyKeyConflict\"),\n errorCode: HttpErrorCodes.IdempotencyKeyConflict,\n });\n }\n\n response.header(\"Idempotent-Replay\", \"true\");\n\n return response.replay({\n status: cached.status,\n body: cached.body,\n contentType: cached.contentType,\n });\n };\n\n // Fast path: a finished (or in-flight) request is already recorded.\n let existing: CachedResponse | InFlightReservation | null = null;\n\n try {\n existing = (await cacheDriver.get(cacheKey)) as CachedResponse | InFlightReservation | null;\n } catch (error) {\n // The cache is an optimisation of idempotency, not a gate on writes:\n // when it is down, fail open (the handler runs) and log it.\n log.error(\"idempotency-middleware\", \"get\", error);\n }\n\n if (existing) return respondToExisting(existing);\n\n // Reserve the key atomically before the handler runs, so concurrent\n // requests with the same key can't both execute it.\n try {\n const reservation = (await cacheDriver.set(\n cacheKey,\n { state: \"in-flight\", startedAt: Date.now() } satisfies InFlightReservation,\n { onConflict: \"create\", ttl: reservationTtl },\n )) as { wasSet?: boolean; existing?: CachedResponse | InFlightReservation } | undefined;\n\n if (reservation && reservation.wasSet === false) {\n return respondToExisting(reservation.existing);\n }\n } catch (error) {\n log.error(\"idempotency-middleware\", \"reserve\", error);\n }\n\n response.onSent((sentResponse: Response) => {\n // Don't cache server errors — clients should be able to retry past a 5xx.\n // 4xx are deterministic outcomes of the request, so caching is fine.\n // Free the reservation so a retry can run.\n if (sentResponse.statusCode >= 500) {\n // Wrapped so a synchronous throw is caught as well as a rejection.\n Promise.resolve()\n .then(() => cacheDriver.remove(cacheKey))\n .catch((error: unknown) => {\n log.error(\"idempotency-middleware\", \"remove\", error);\n });\n\n return;\n }\n\n const sentContentType = sentResponse.contentType;\n\n // `set` is fire-and-forget inside `onSent`; without a `.catch` a rejected\n // write (e.g. Redis down) would surface as an unhandledRejection.\n cacheDriver\n .set(\n cacheKey,\n {\n status: sentResponse.statusCode,\n body: sentResponse.parsedBody,\n bodyHash,\n contentType: typeof sentContentType === \"string\" ? sentContentType : undefined,\n },\n ttl,\n )\n .catch((error: unknown) => {\n log.error(\"idempotency-middleware\", \"set\", error);\n });\n });\n };\n}\n"],"mappings":";;;;;;;;AAoDA,MAAM,kBAAkB;CAAC;CAAQ;CAAO;CAAS;AAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCzD,SAAgB,sBAAsB,UAA8B,CAAC,GAAe;CAClF,OAAO,OAAO,EAAE,SAAS,eAAe;EACtC,MAAM,aACJ,QAAQ,cAAc,OAAO,IAAI,+BAA+B,iBAAiB;EACnF,MAAM,UAAU,QAAQ,WAAW,OAAO,IAAI,4BAA4B,eAAe;EACzF,MAAM,MAAM,QAAQ,OAAO,OAAO,IAAI,wBAAwB,KAAK;EACnE,MAAM,iBACJ,QAAQ,kBAAkB,OAAO,IAAI,mCAAmC,EAAE;EAC5E,MAAM,aAAa,QAAQ,UAAU,OAAO,IAAI,yBAAyB;EAEzE,IAAI,CAAC,QAAQ,SAAS,QAAQ,OAAO,YAAY,CAAC,GAAG;EAErD,MAAM,iBAAiB,QAAQ,OAAO,WAAW,YAAY,CAAC;EAE9D,IAAI,CAAC,gBAAgB;EAErB,IAAI,CAAC,sBAAsB,cAAc,GACvC,OAAO,SAAS,WAAW;GACzB,OAAO,EAAE,4BAA4B;GACrC;EACF,CAAC;EAGH,MAAM,cAAc,aAAa,MAAM,MAAM,IAAI,UAAU,IAAI;EAC/D,MAAM,WAAW,yBAAyB,SAAS,cAAc;EACjE,MAAM,WAAW,SAAS,QAAQ,IAAI;EAEtC,MAAM,qBAAqB,aAAsE;GAC/F,IAAI,CAAC,YAAa,SAAiC,UAAU,aAAa;IACxE,SAAS,OAAO,eAAe,GAAG;IAElC,OAAO,SAAS,SAAS;KACvB,OAAO;KACP;IACF,CAAC;GACH;GAEA,MAAM,SAAS;GAEf,IAAI,OAAO,aAAa,UACtB,OAAO,SAAS,oBAAoB;IAClC,OAAO,EAAE,6BAA6B;IACtC;GACF,CAAC;GAGH,SAAS,OAAO,qBAAqB,MAAM;GAE3C,OAAO,SAAS,OAAO;IACrB,QAAQ,OAAO;IACf,MAAM,OAAO;IACb,aAAa,OAAO;GACtB,CAAC;EACH;EAGA,IAAI,WAAwD;EAE5D,IAAI;GACF,WAAY,MAAM,YAAY,IAAI,QAAQ;EAC5C,SAAS,OAAO;GAGd,IAAI,MAAM,0BAA0B,OAAO,KAAK;EAClD;EAEA,IAAI,UAAU,OAAO,kBAAkB,QAAQ;EAI/C,IAAI;GACF,MAAM,cAAe,MAAM,YAAY,IACrC,UACA;IAAE,OAAO;IAAa,WAAW,KAAK,IAAI;GAAE,GAC5C;IAAE,YAAY;IAAU,KAAK;GAAe,CAC9C;GAEA,IAAI,eAAe,YAAY,WAAW,OACxC,OAAO,kBAAkB,YAAY,QAAQ;EAEjD,SAAS,OAAO;GACd,IAAI,MAAM,0BAA0B,WAAW,KAAK;EACtD;EAEA,SAAS,QAAQ,iBAA2B;GAI1C,IAAI,aAAa,cAAc,KAAK;IAElC,QAAQ,QAAQ,CAAC,CACd,WAAW,YAAY,OAAO,QAAQ,CAAC,CAAC,CACxC,OAAO,UAAmB;KACzB,IAAI,MAAM,0BAA0B,UAAU,KAAK;IACrD,CAAC;IAEH;GACF;GAEA,MAAM,kBAAkB,aAAa;GAIrC,YACG,IACC,UACA;IACE,QAAQ,aAAa;IACrB,MAAM,aAAa;IACnB;IACA,aAAa,OAAO,oBAAoB,WAAW,kBAAkB;GACvE,GACA,GACF,CAAC,CACA,OAAO,UAAmB;IACzB,IAAI,MAAM,0BAA0B,OAAO,KAAK;GAClD,CAAC;EACL,CAAC;CACH;AACF"}
1
+ {"version":3,"file":"idempotency.middleware.mjs","names":[],"sources":["../../../../../../../../../packages/core/src/http/middleware/idempotency.middleware.ts"],"sourcesContent":["import config from \"@mongez/config\";\nimport { cache } from \"@warlock.js/cache\";\nimport { log } from \"@warlock.js/logger\";\nimport type { Middleware } from \"../../router\";\nimport { HttpErrorCodes } from \"../error-codes\";\nimport type { Response } from \"../response\";\nimport { t } from \"./inject-request-context\";\nimport { buildIdempotencyCacheKey, hashBody, isValidIdempotencyKey } from \"./utils/idempotency-key\";\n\n/**\n * Options for the idempotency middleware.\n */\nexport type IdempotencyOptions = {\n /**\n * Cache TTL in seconds. Falls back to `http.idempotency.ttl`, then `86400` (24h).\n */\n ttl?: number;\n /**\n * TTL in seconds of the in-flight reservation held while the handler runs.\n * Falls back to `http.idempotency.reservationTtl`, then `60`.\n */\n reservationTtl?: number;\n /**\n * Header name carrying the client's key. Falls back to\n * `http.idempotency.headerName`, then `\"Idempotency-Key\"`.\n */\n headerName?: string;\n /**\n * HTTP methods eligible for idempotency. Falls back to\n * `http.idempotency.methods`, then `[\"POST\",\"PUT\",\"PATCH\",\"DELETE\"]`.\n * Safe methods (GET/HEAD) are skipped regardless.\n */\n methods?: string[];\n /**\n * Cache driver name. Falls back to `http.idempotency.driver`, then the\n * default driver of the cache manager.\n */\n driver?: string;\n};\n\ntype CachedResponse = {\n status: number;\n body: unknown;\n bodyHash: string;\n contentType?: string;\n};\n\ntype InFlightReservation = {\n state: \"in-flight\";\n startedAt: number;\n};\n\nconst DEFAULT_METHODS = [\"POST\", \"PUT\", \"PATCH\", \"DELETE\"];\n\n/**\n * Dedupe non-idempotent writes by an `Idempotency-Key` header — same key,\n * same body, within TTL → cached replay; same key, different body → 422\n * `IdempotencyKeyConflict`.\n *\n * **Must run after `authMiddleware`** — the cache key is scoped per-user\n * (`idem:{userType}:{userId}:{key}`) so user A can't replay user B's key.\n * Anonymous requests fall back to IP scope.\n *\n * The replay sets `Idempotent-Replay: true` on the response for easy\n * client-side / observability detection.\n *\n * Eligible methods default to POST/PUT/PATCH/DELETE. GET/HEAD pass through\n * even with the header set (RFC: safe methods are already idempotent).\n *\n * @example\n * import { authMiddleware } from \"@warlock.js/auth\";\n * import { middleware } from \"@warlock.js/core\";\n *\n * router.post(\"/orders\", createOrderController, {\n * middleware: [authMiddleware(\"client\"), middleware.idempotency()],\n * });\n *\n * router.post(\"/ai/summarize\", summarizeController, {\n * middleware: [\n * authMiddleware(\"client\"),\n * middleware.idempotency({ ttl: 60 * 60 }), // 1h is enough for client retries\n * ],\n * });\n */\nexport function idempotencyMiddleware(options: IdempotencyOptions = {}): Middleware {\n return async ({ request, response }) => {\n const headerName =\n options.headerName || config.get(\"http.idempotency.headerName\", \"Idempotency-Key\");\n const methods = options.methods || config.get(\"http.idempotency.methods\", DEFAULT_METHODS);\n const ttl = options.ttl || config.get(\"http.idempotency.ttl\", 86400);\n const reservationTtl =\n options.reservationTtl || config.get(\"http.idempotency.reservationTtl\", 60);\n const driverName = options.driver || config.get(\"http.idempotency.driver\");\n\n if (!methods.includes(request.method.toUpperCase())) return;\n\n const idempotencyKey = request.header(headerName.toLowerCase());\n\n if (!idempotencyKey) return;\n\n if (!isValidIdempotencyKey(idempotencyKey)) {\n return response.badRequest({\n error: t(\"http.idempotencyKeyInvalid\"),\n errorCode: HttpErrorCodes.IdempotencyKeyInvalid,\n });\n }\n\n const cacheDriver = driverName ? await cache.use(driverName) : cache;\n const cacheKey = buildIdempotencyCacheKey(request, idempotencyKey);\n const bodyHash = hashBody(request.body);\n\n const respondToExisting = (\n existing: CachedResponse | InFlightReservation | undefined | null,\n ) => {\n if (!existing || (existing as InFlightReservation).state === \"in-flight\") {\n response.header(\"Retry-After\", \"1\");\n\n return response.conflict({\n error: \"A request with this Idempotency-Key is already in progress\",\n errorCode: HttpErrorCodes.IdempotencyKeyConflict,\n });\n }\n\n const cached = existing as CachedResponse;\n\n if (cached.bodyHash !== bodyHash) {\n return response.unprocessableEntity({\n error: t(\"http.idempotencyKeyConflict\"),\n errorCode: HttpErrorCodes.IdempotencyKeyConflict,\n });\n }\n\n response.header(\"Idempotent-Replay\", \"true\");\n\n return response.replay({\n status: cached.status,\n body: cached.body,\n contentType: cached.contentType,\n });\n };\n\n // Fast path: a finished (or in-flight) request is already recorded.\n let existing: CachedResponse | InFlightReservation | null = null;\n\n try {\n existing = (await cacheDriver.get(cacheKey)) as CachedResponse | InFlightReservation | null;\n } catch (error) {\n // The cache is an optimisation of idempotency, not a gate on writes:\n // when it is down, fail open (the handler runs) and log it.\n log.error(\"idempotency-middleware\", \"get\", error);\n }\n\n if (existing) return respondToExisting(existing);\n\n // Reserve the key atomically before the handler runs, so concurrent\n // requests with the same key can't both execute it.\n try {\n const reservation = (await cacheDriver.set(\n cacheKey,\n { state: \"in-flight\", startedAt: Date.now() } satisfies InFlightReservation,\n { onConflict: \"create\", ttl: reservationTtl },\n )) as { wasSet?: boolean; existing?: CachedResponse | InFlightReservation } | undefined;\n\n if (reservation && reservation.wasSet === false) {\n return respondToExisting(reservation.existing);\n }\n } catch (error) {\n log.error(\"idempotency-middleware\", \"reserve\", error);\n }\n\n response.onSent((sentResponse: Response) => {\n // Don't cache server errors — clients should be able to retry past a 5xx.\n // 4xx are deterministic outcomes of the request, so caching is fine.\n // Free the reservation so a retry can run.\n if (sentResponse.statusCode >= 500) {\n // Wrapped so a synchronous throw is caught as well as a rejection.\n Promise.resolve()\n .then(() => cacheDriver.remove(cacheKey))\n .catch((error: unknown) => {\n log.error(\"idempotency-middleware\", \"remove\", error);\n });\n\n return;\n }\n\n const sentContentType = sentResponse.contentType;\n\n // `set` is fire-and-forget inside `onSent`; without a `.catch` a rejected\n // write (e.g. Redis down) would surface as an unhandledRejection.\n cacheDriver\n .set(\n cacheKey,\n {\n status: sentResponse.statusCode,\n body: sentResponse.parsedBody,\n bodyHash,\n contentType: typeof sentContentType === \"string\" ? sentContentType : undefined,\n },\n ttl,\n )\n .catch((error: unknown) => {\n log.error(\"idempotency-middleware\", \"set\", error);\n });\n });\n };\n}\n"],"mappings":";;;;;;;;AAoDA,MAAM,kBAAkB;CAAC;CAAQ;CAAO;CAAS;AAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCzD,SAAgB,sBAAsB,UAA8B,CAAC,GAAe;CAClF,OAAO,OAAO,EAAE,SAAS,eAAe;EACtC,MAAM,aACJ,QAAQ,cAAc,OAAO,IAAI,+BAA+B,iBAAiB;EACnF,MAAM,UAAU,QAAQ,WAAW,OAAO,IAAI,4BAA4B,eAAe;EACzF,MAAM,MAAM,QAAQ,OAAO,OAAO,IAAI,wBAAwB,KAAK;EACnE,MAAM,iBACJ,QAAQ,kBAAkB,OAAO,IAAI,mCAAmC,EAAE;EAC5E,MAAM,aAAa,QAAQ,UAAU,OAAO,IAAI,yBAAyB;EAEzE,IAAI,CAAC,QAAQ,SAAS,QAAQ,OAAO,YAAY,CAAC,GAAG;EAErD,MAAM,iBAAiB,QAAQ,OAAO,WAAW,YAAY,CAAC;EAE9D,IAAI,CAAC,gBAAgB;EAErB,IAAI,CAAC,sBAAsB,cAAc,GACvC,OAAO,SAAS,WAAW;GACzB,OAAO,EAAE,4BAA4B;GACrC;EACF,CAAC;EAGH,MAAM,cAAc,aAAa,MAAM,MAAM,IAAI,UAAU,IAAI;EAC/D,MAAM,WAAW,yBAAyB,SAAS,cAAc;EACjE,MAAM,WAAW,SAAS,QAAQ,IAAI;EAEtC,MAAM,qBACJ,aACG;GACH,IAAI,CAAC,YAAa,SAAiC,UAAU,aAAa;IACxE,SAAS,OAAO,eAAe,GAAG;IAElC,OAAO,SAAS,SAAS;KACvB,OAAO;KACP;IACF,CAAC;GACH;GAEA,MAAM,SAAS;GAEf,IAAI,OAAO,aAAa,UACtB,OAAO,SAAS,oBAAoB;IAClC,OAAO,EAAE,6BAA6B;IACtC;GACF,CAAC;GAGH,SAAS,OAAO,qBAAqB,MAAM;GAE3C,OAAO,SAAS,OAAO;IACrB,QAAQ,OAAO;IACf,MAAM,OAAO;IACb,aAAa,OAAO;GACtB,CAAC;EACH;EAGA,IAAI,WAAwD;EAE5D,IAAI;GACF,WAAY,MAAM,YAAY,IAAI,QAAQ;EAC5C,SAAS,OAAO;GAGd,IAAI,MAAM,0BAA0B,OAAO,KAAK;EAClD;EAEA,IAAI,UAAU,OAAO,kBAAkB,QAAQ;EAI/C,IAAI;GACF,MAAM,cAAe,MAAM,YAAY,IACrC,UACA;IAAE,OAAO;IAAa,WAAW,KAAK,IAAI;GAAE,GAC5C;IAAE,YAAY;IAAU,KAAK;GAAe,CAC9C;GAEA,IAAI,eAAe,YAAY,WAAW,OACxC,OAAO,kBAAkB,YAAY,QAAQ;EAEjD,SAAS,OAAO;GACd,IAAI,MAAM,0BAA0B,WAAW,KAAK;EACtD;EAEA,SAAS,QAAQ,iBAA2B;GAI1C,IAAI,aAAa,cAAc,KAAK;IAElC,QAAQ,QAAQ,CAAC,CACd,WAAW,YAAY,OAAO,QAAQ,CAAC,CAAC,CACxC,OAAO,UAAmB;KACzB,IAAI,MAAM,0BAA0B,UAAU,KAAK;IACrD,CAAC;IAEH;GACF;GAEA,MAAM,kBAAkB,aAAa;GAIrC,YACG,IACC,UACA;IACE,QAAQ,aAAa;IACrB,MAAM,aAAa;IACnB;IACA,aAAa,OAAO,oBAAoB,WAAW,kBAAkB;GACvE,GACA,GACF,CAAC,CACA,OAAO,UAAmB;IACzB,IAAI,MAAM,0BAA0B,OAAO,KAAK;GAClD,CAAC;EACL,CAAC;CACH;AACF"}
@@ -2,7 +2,7 @@ import { Response } from "../response.mjs";
2
2
  import { Request } from "../request.mjs";
3
3
  import { ReturnedResponse } from "../types.mjs";
4
4
 
5
- //#region ../core/src/http/middleware/inject-request-context.d.ts
5
+ //#region ../../packages/core/src/http/middleware/inject-request-context.d.ts
6
6
  /**
7
7
  * Create request store and execute middleware + handler
8
8
  *