@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,13 +1,19 @@
1
1
  import { HttpRateLimitConfig } from "./build-rate-limit-options.mjs";
2
+ import { StreamQueueOptions } from "./bounded-stream-queue.mjs";
3
+ import { HttpLoggingConfig } from "./request-log-snapshot.mjs";
2
4
  import { Response } from "./response.mjs";
3
5
  import { CspConfig } from "./csp.mjs";
6
+ import { HttpErrorMapper } from "./error-mapper.mjs";
4
7
  import { HttpTracingConfig } from "./tracing/tracing.type.mjs";
5
8
  import { Middleware } from "../router/types.mjs";
9
+ import { FastifyHttpOptions } from "fastify";
6
10
  import { CookieSerializeOptions } from "@fastify/cookie";
7
11
  import { FastifyCorsOptions } from "@fastify/cors";
12
+ import { Server } from "node:http";
13
+ import { SecureServerOptions } from "node:http2";
8
14
  import React from "react";
9
15
 
10
- //#region ../core/src/http/types.d.ts
16
+ //#region ../../packages/core/src/http/types.d.ts
11
17
  type RequestEvent = "executingMiddleware" | "executedMiddleware" | "executingAction" | "executedAction";
12
18
  /**
13
19
  * Private, server-only, per-request data bag — `request.locals`.
@@ -175,10 +181,43 @@ interface PartialMiddleware {
175
181
  */
176
182
  middleware: Middleware[];
177
183
  }
184
+ /**
185
+ * Options for the underlying Fastify server, passed through by
186
+ * `http.serverOptions`. Includes `http`, the options Node's
187
+ * `http.createServer()` receives (for example `maxHeaderSize`).
188
+ *
189
+ * Framework-owned settings (`trustProxy`, `bodyLimit`,
190
+ * `gracefulShutdown.forceCloseConnections`) have their own `http.*` keys;
191
+ * setting them here as well overrides those keys.
192
+ */
193
+ type HttpServerOptions = Omit<FastifyHttpOptions<Server>, "http2"> & {
194
+ /** Enable HTTP/2 while retaining the framework's HTTP-compatible reply API. */http2?: boolean;
195
+ https?: SecureServerOptions;
196
+ http2SessionTimeout?: number;
197
+ };
178
198
  /**
179
199
  * Http Configurations list
180
200
  */
181
201
  interface HttpConfigurations {
202
+ /**
203
+ * Options for the underlying Fastify server, applied when it is created.
204
+ *
205
+ * Node's own HTTP server options go under `http`. The request header size
206
+ * limit, for example, is `serverOptions.http.maxHeaderSize` (Node's default
207
+ * is 16KB); a top-level `maxHeaderSize` is not a Fastify option and is
208
+ * ignored.
209
+ *
210
+ * @example
211
+ * ```ts
212
+ * const httpConfigurations: HttpConfigurations = {
213
+ * serverOptions: {
214
+ * http: { maxHeaderSize: 32 * 1024 },
215
+ * keepAliveTimeout: 10_000,
216
+ * },
217
+ * };
218
+ * ```
219
+ */
220
+ serverOptions?: HttpServerOptions;
182
221
  /**
183
222
  * Status used when a Cascade model fails validation during a database write.
184
223
  * The default is 500 because request input has already been validated before
@@ -188,6 +227,21 @@ interface HttpConfigurations {
188
227
  * @default 500
189
228
  */
190
229
  modelValidationErrorStatus?: number;
230
+ /**
231
+ * Map errors that are not an `HttpError` to an HTTP status (and optional
232
+ * message/payload), so domain errors shared with non-HTTP processes need not
233
+ * extend Core's error classes. Return `undefined` to keep the default
234
+ * handling. See {@link HttpErrorMapper}.
235
+ */
236
+ errorMapper?: HttpErrorMapper;
237
+ /**
238
+ * In `warlock dev`, warn once per route about POST/PUT/PATCH/DELETE routes
239
+ * that have no auth middleware and no `public: true`. Development only;
240
+ * production never checks. Set `false` to silence the warning entirely.
241
+ *
242
+ * @default true
243
+ */
244
+ warnUnguardedRoutes?: boolean;
191
245
  /**
192
246
  * Server port
193
247
  */
@@ -196,6 +250,13 @@ interface HttpConfigurations {
196
250
  * Log requests
197
251
  */
198
252
  log?: boolean;
253
+ /**
254
+ * What request log entries carry of each request's input. Entries carry a
255
+ * bounded `RequestLogSnapshot`, never the `Request`/`Response`
256
+ * instances; credential-bearing query values are masked in its URL.
257
+ * A route's own `logging` option overrides these defaults.
258
+ */
259
+ logging?: HttpLoggingConfig;
199
260
  /**
200
261
  * Cors configurations
201
262
  */
@@ -406,6 +467,13 @@ interface HttpConfigurations {
406
467
  * @default "/ready"
407
468
  */
408
469
  readinessPath?: string;
470
+ /**
471
+ * Include built-in liveness/readiness probes in the global rate-limit policy.
472
+ * Leave false so client traffic cannot exhaust infrastructure probe quotas.
473
+ *
474
+ * @default false
475
+ */
476
+ rateLimit?: boolean;
409
477
  };
410
478
  /**
411
479
  * Host
@@ -435,32 +503,122 @@ interface HttpConfigurations {
435
503
  */
436
504
  tracing?: HttpTracingConfig;
437
505
  }
506
+ /**
507
+ * Options for `response.stream()`.
508
+ */
509
+ type ResponseStreamOptions = StreamQueueOptions & {
510
+ /** Application/cache headers override defaults before flushing; framing and connection headers are ignored. */headers?: Record<string, string>;
511
+ /**
512
+ * How many of the most recent chunks (from `send()`, `write()` and
513
+ * `render()`) to keep on `response.body` after `end()`, for logging and
514
+ * debugging. Written chunks are otherwise not kept, so a long-lived stream
515
+ * does not grow with its own history.
516
+ *
517
+ * @default 0
518
+ */
519
+ retainChunks?: number;
520
+ };
438
521
  type ResponseStreamController = {
439
522
  /**
440
- * Send data to the client
523
+ * Send data to the client. Does not wait for the client; for long-lived or
524
+ * high-volume streams use `write()` (or `drain()`) so the producer slows
525
+ * down to the client's pace instead of buffering. A silent no-op after the
526
+ * client disconnected; throws after `end()`.
527
+ */
528
+ send: (data: string | Uint8Array) => void; /** Bounded synchronous write; false when closed or overflow rejects this chunk. */
529
+ enqueue: (data: string | Uint8Array) => boolean;
530
+ /**
531
+ * Send data and wait until the transport can take more. Resolves `true`
532
+ * when it can, `false` when the stream ended or the client disconnected —
533
+ * stop producing then. In drop mode, true means the stream is ready to continue;
534
+ * inspect dropped to detect rejected output and schedule a resync.
441
535
  */
442
- send: (data: string) => void;
536
+ write: (data: string | Uint8Array) => Promise<boolean>;
443
537
  /**
444
538
  * Render a view and send it to the client
445
539
  */
446
540
  render: (view: React.ReactNode) => void;
541
+ /**
542
+ * Wait until output buffered for the client has been flushed. Resolves
543
+ * `true` immediately when nothing is backed up, `false` when the stream
544
+ * ended or the client disconnected.
545
+ */
546
+ drain: () => Promise<boolean>;
447
547
  /**
448
548
  * End the stream
449
549
  */
450
550
  end: () => void;
451
551
  /**
452
- * Detect whether stream is ended
552
+ * Register a handler to be called when the client disconnects
553
+ */
554
+ onDisconnect: (handler: () => void) => ResponseStreamController;
555
+ /**
556
+ * Aborted when the client disconnects (not when `end()` is called). Pass it
557
+ * to the work feeding the stream.
558
+ */
559
+ signal: AbortSignal;
560
+ /**
561
+ * Whether the transport is currently holding more than its high-water mark.
562
+ */
563
+ backpressured: boolean; /** Chunks/events/comments rejected by onOverflow: "drop", including send/write/render paths. */
564
+ readonly dropped: number;
565
+ /**
566
+ * Detect whether stream is ended (by `end()` or a client disconnect)
453
567
  */
454
568
  ended: boolean;
455
569
  };
570
+ /**
571
+ * Options for `response.sse()`.
572
+ */
573
+ type ResponseSSEOptions = StreamQueueOptions & {
574
+ /** Application/cache headers override defaults before flushing; framing and connection headers are ignored. */headers?: Record<string, string>;
575
+ /**
576
+ * How many of the most recent events to keep on `response.body` after
577
+ * `end()`, for logging and debugging. Sent events are otherwise not kept,
578
+ * so a long-lived stream does not grow with its own history.
579
+ *
580
+ * @default 0
581
+ */
582
+ retainEvents?: number;
583
+ };
584
+ /** Wire serialization for one SSE event. Raw strings are split into safe data lines. */
585
+ type ResponseSSEMessageOptions = {
586
+ raw?: boolean;
587
+ };
456
588
  type ResponseSSEController = {
457
589
  /**
458
- * Send an SSE event to the client
590
+ * Send an SSE event to the client. Does not wait for the client; for
591
+ * long-lived or high-volume streams use `write()` (or `drain()`) so the
592
+ * producer slows down to the client's pace instead of buffering.
459
593
  * @param event - Event name
460
594
  * @param data - Event data (will be JSON stringified)
461
595
  * @param id - Optional event ID for client-side Last-Event-ID tracking
462
596
  */
463
- send: (event: string, data: any, id?: string) => ResponseSSEController;
597
+ send: (event: string | undefined, data: any, id?: string, options?: ResponseSSEMessageOptions) => ResponseSSEController; /** Bounded synchronous event; undefined event omits the event field. */
598
+ enqueue: (event: string | undefined, data: unknown, id?: string, options?: ResponseSSEMessageOptions) => boolean;
599
+ /**
600
+ * Send an SSE event and wait until the transport can take more.
601
+ * Resolves `true` when it can, `false` when the stream ended or the client
602
+ * disconnected — stop producing then. In drop mode, true means ready to continue;
603
+ * inspect dropped to detect rejected output and schedule a resync.
604
+ */
605
+ write: (event: string | undefined, data: any, id?: string, options?: ResponseSSEMessageOptions) => Promise<boolean>;
606
+ /**
607
+ * Wait until output buffered for the client has been flushed. Resolves
608
+ * `true` immediately when nothing is backed up, `false` when the stream
609
+ * ended or the client disconnected.
610
+ */
611
+ drain: () => Promise<boolean>;
612
+ /**
613
+ * Aborted when the client disconnects (not when `end()` is called). Pass it
614
+ * to the work feeding the stream.
615
+ */
616
+ signal: AbortSignal;
617
+ /**
618
+ * Whether the transport is currently holding more than its high-water mark.
619
+ */
620
+ backpressured: boolean; /** Chunks/events/comments rejected by onOverflow: "drop", including send/write/render paths. */
621
+ readonly dropped: number;
464
622
  /**
465
623
  * Send a comment to keep the connection alive (invisible to client)
466
624
  */
@@ -480,5 +638,5 @@ type ResponseSSEController = {
480
638
  ended: boolean;
481
639
  };
482
640
  //#endregion
483
- export { DecodedAccessToken, HttpConfigurations, PartialMiddleware, RequestEvent, RequestLocals, ResponseEvent, ResponseSSEController, ResponseStreamController, ReturnedResponse };
641
+ export { DecodedAccessToken, HttpConfigurations, HttpServerOptions, PartialMiddleware, RequestEvent, RequestLocals, ResponseEvent, ResponseSSEController, ResponseSSEMessageOptions, ResponseSSEOptions, ResponseStreamController, ResponseStreamOptions, ReturnedResponse };
484
642
  //# sourceMappingURL=types.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.mts","names":[],"sources":["../../../../../../../core/src/http/types.ts"],"mappings":";;;;;;;;;;KASY,YAAA;;;AAAZ;;;;AAAwB;AA0BxB;;;;AAca;AAeb;;;;AACU;AAMV;;;;;;UApCiB,aAAA;EAoDL;;;;;;;;;;;;;EAtCV,WAAW;AAAA;;;;AAmDY;AAiEzB;;;;;;;;KArGY,kBAAA;EACV,QAAQ;AAAA;;;;KAME,gBAAA;;;;AAIR;;;;EAIA,OAAA,CAAQ,QAAA;;;;EAIR,MAAA;;;;EAIA,OAAA,CAAQ,MAAA;;;;;;;;EAQR,OAAA;;;;KAKQ,aAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqViB;AAG7B;;;;;;;;;;;;;;AAmBA;;;AAAA;;;;;;;;;;;;UA1SiB,iBAAA;EAqTe;;;;EAhT9B,MAAA;EAyTuC;;;AAIlC;;EAvTL,WAAA;;;;EAIA,UAAA,EAAY,UAAU;AAAA;;;;UAMP,kBAAA;;;;;;;;;EASf,0BAAA;;;;EAIA,IAAA;;;;EAIA,GAAA;;;;EAIA,IAAA,GAAO,kBAAA;;;;;;EAMP,eAAA;;;;;EAKA,SAAA;;;;;;IAME,KAAA;;;;;;IAMA,MAAA;;;;;;IAMA,SAAA;EAAA;;;;;;;;;;EAWF,SAAA;;;;;;;;;;;;;;;;;;;;EAoBA,UAAA,mCAA6C,OAAA,UAAiB,GAAA;EAC9D,OAAA;;;;IAIE,MAAA;;;;IAIA,OAAA,GAAU,sBAAA;EAAA;;;;;;;;;;EAWZ,GAAA,GAAM,SAAA;;;;EAIN,SAAA,GAAY,mBAAA;;;;;;;;EAQZ,SAAA;;;;;;IAME,MAAA;;;;IAIA,SAAA;;;;;;;IAOA,OAAA;EAAA;;;;EAKF,WAAA;;;;;;IAME,GAAA;;;;;;IAMA,UAAA;;;;;;;IAOA,OAAA;;;;IAIA,MAAA;EAAA;;;;EAKF,WAAA;;;;;;;IAOE,OAAA;;;;;;IAMA,SAAA;;;;;;IAMA,UAAA;EAAA;;;;EAKF,gBAAA;;;;;;;IAOE,OAAA;;;;;;;;IAQA,qBAAA;EAAA;;;;EAKF,MAAA;;;;;;IAME,OAAA;;;;;;;IAOA,IAAA;;;;;;;IAOA,aAAA;EAAA;;;;EAKF,IAAA;;;;EAIA,UAAA;;;;IAIE,GAAA,GAAM,UAAA;;;;IAIN,IAAA,GAAO,iBAAA;;;;IAIP,MAAA,GAAS,iBAAA;EAAA;;;;;;EAOX,OAAA,GAAU,iBAAA;AAAA;AAAA,KAGA,wBAAA;;;;EAIV,IAAA,GAAO,IAAA;;;;EAIP,MAAA,GAAS,IAAA,EAAM,KAAA,CAAM,SAAS;;;;EAI9B,GAAA;;;;EAIA,KAAA;AAAA;AAAA,KAGU,qBAAA;;;;;;;EAOV,IAAA,GAAO,KAAA,UAAe,IAAA,OAAW,EAAA,cAAgB,qBAAA;;;;EAIjD,OAAA,GAAU,OAAA,aAAoB,qBAAA;;;;EAI9B,GAAA,QAAW,qBAAA;;;;;EAKX,YAAA,GAAe,OAAA,iBAAwB,qBAAA;;;;EAIvC,KAAA;AAAA"}
1
+ {"version":3,"file":"types.d.mts","names":[],"sources":["../../../../../../../../packages/core/src/http/types.ts"],"mappings":"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"}
@@ -1,12 +1,12 @@
1
1
  import { StorageFile } from "../storage/storage-file.mjs";
2
- import { StorageDriverName } from "../storage/types.mjs";
3
2
  import { ScopedStorage } from "../storage/scoped-storage.mjs";
3
+ import { StorageDriverName } from "../storage/types.mjs";
4
4
  import { storage } from "../storage/storage.mjs";
5
5
  import { Image, ImageFormat, ImageTransformOptions } from "../image/image.mjs";
6
6
  import { ImageTransformCallback, PrefixConfig, SaveAsOptions, SaveOptions, UploadedFileImageOptions } from "./uploads-types.mjs";
7
7
  import { MultipartFile } from "@fastify/multipart";
8
8
 
9
- //#region ../core/src/http/uploaded-file.d.ts
9
+ //#region ../../packages/core/src/http/uploaded-file.d.ts
10
10
  type UploadedFileMetadata = {
11
11
  name: string;
12
12
  mimeType: string;
@@ -1 +1 @@
1
- {"version":3,"file":"uploaded-file.d.mts","names":[],"sources":["../../../../../../../core/src/http/uploaded-file.ts"],"mappings":"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"}
1
+ {"version":3,"file":"uploaded-file.d.mts","names":[],"sources":["../../../../../../../../packages/core/src/http/uploaded-file.ts"],"mappings":"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"}
@@ -1,14 +1,14 @@
1
1
  import { sanitizePath } from "../utils/paths.mjs";
2
+ import { uploadsConfig } from "./uploads-config.mjs";
2
3
  import { storage } from "../storage/storage.mjs";
3
4
  import "../storage/index.mjs";
4
5
  import { Image } from "../image/image.mjs";
5
6
  import "../image/index.mjs";
6
- import { uploadsConfig } from "./uploads-config.mjs";
7
7
  import path from "path";
8
8
  import { Random } from "@mongez/reinforcements";
9
9
  import dayjs from "dayjs";
10
10
 
11
- //#region ../core/src/http/uploaded-file.ts
11
+ //#region ../../packages/core/src/http/uploaded-file.ts
12
12
  /**
13
13
  * UploadedFile - Handles multipart file uploads with storage and image integration
14
14
  *
@@ -1 +1 @@
1
- {"version":3,"file":"uploaded-file.mjs","names":[],"sources":["../../../../../../../core/src/http/uploaded-file.ts"],"sourcesContent":["import type { MultipartFile } from \"@fastify/multipart\";\nimport { Random } from \"@mongez/reinforcements\";\nimport dayjs from \"dayjs\";\nimport path from \"path\";\nimport { Image, type ImageFormat, type ImageTransformOptions } from \"../image\";\nimport { storage, type ScopedStorage, type StorageDriverName, type StorageFile } from \"../storage\";\nimport { sanitizePath } from \"../utils/paths\";\nimport { uploadsConfig } from \"./uploads-config\";\nimport type {\n FileNamingStrategy,\n ImageTransformCallback,\n PrefixConfig,\n SaveAsOptions,\n SaveOptions,\n UploadedFileImageOptions,\n} from \"./uploads-types\";\n\ntype UploadedFileMetadata = {\n name: string;\n mimeType: string;\n extension: string;\n size: number;\n width?: number;\n height?: number;\n};\n\n/**\n * What an `UploadedFile` looks like on the wire.\n *\n * Every member is knowable **without reading the file**, which is what lets\n * {@link UploadedFile.toJSON} be synchronous — see the note there. `size` is\n * the one exception and it is optional for exactly that reason: present when\n * the file has already been buffered, absent otherwise, never guessed.\n */\nexport type UploadedFileJson = {\n name: string;\n mimeType: string;\n extension: string;\n isImage: boolean;\n isVideo: boolean;\n isAudio: boolean;\n size?: number;\n};\n\n/**\n * Options for validating file before saving\n */\nexport type FileValidationOptions = {\n /**\n * List of allowed MIME types\n *\n * @example [\"image/jpeg\", \"image/png\", \"image/webp\"]\n */\n allowedMimeTypes?: string[];\n\n /**\n * List of allowed file extensions (without dot)\n *\n * @example [\"jpg\", \"jpeg\", \"png\", \"webp\"]\n */\n allowedExtensions?: string[];\n\n /**\n * Maximum file size in bytes\n *\n * @example 5 * 1024 * 1024 // 5MB\n */\n maxSize?: number;\n};\n\n/**\n * UploadedFile - Handles multipart file uploads with storage and image integration\n *\n * Provides a fluent API for validating, transforming, and saving uploaded files\n * to various storage drivers (local, S3, R2, etc.).\n *\n * @example\n * ```typescript\n * // Simple save with random name\n * const file = await uploadedFile.save(\"avatars\");\n *\n * // Original name with date prefix\n * const file = await uploadedFile.save(\"avatars\", {\n * name: \"original\",\n * prefix: { format: \"yyyy/mm/dd\", as: \"directory\" }\n * });\n *\n * // With image transformations\n * const file = await uploadedFile\n * .resize(800, 600)\n * .quality(85)\n * .format(\"webp\")\n * .save(\"avatars\");\n *\n * // Different storage driver\n * const file = await uploadedFile.use(\"s3\").save(\"avatars\");\n * ```\n */\nexport class UploadedFile {\n /**\n * File buffered content\n * @internal\n */\n protected bufferedFileContent?: Buffer;\n\n /**\n * Upload file hash (SHA-256)\n *\n * Populated after file is saved.\n */\n public hash = \"\";\n\n /**\n * Selected storage driver\n * @internal\n */\n protected _storage: ScopedStorage = storage;\n\n /**\n * Saved StorageFile reference\n * @internal\n */\n protected _storageFile?: StorageFile;\n\n /**\n * Queued image options (high-level API)\n * @internal\n */\n protected _imageOptions: UploadedFileImageOptions = {};\n\n /**\n * Full transform options or callback\n * @internal\n */\n protected _transformConfig?: ImageTransformOptions | ImageTransformCallback;\n\n /**\n * Create a new UploadedFile instance\n *\n * @param fileData - Multipart file data from Fastify\n * @throws Error if file data is invalid\n */\n public constructor(protected readonly fileData: MultipartFile) {\n if (!fileData?.filename) {\n throw new Error(\"Invalid file data: filename is required\");\n }\n }\n\n // ============================================================\n // File Properties\n // ============================================================\n\n /**\n * Get file name (sanitized)\n *\n * Returns the original filename with special characters removed/replaced.\n */\n public get name(): string {\n return sanitizePath(this.fileData.filename);\n }\n\n /**\n * Get file MIME type\n *\n * @example \"image/jpeg\", \"application/pdf\"\n */\n public get mimeType(): string {\n return this.fileData.mimetype;\n }\n\n /**\n * Get file extension (lowercase, without dot)\n *\n * @example \"jpg\", \"png\", \"pdf\"\n */\n public get extension(): string {\n return path.extname(this.fileData.filename).replace(\".\", \"\").toLowerCase();\n }\n\n /**\n * Get file metadata\n */\n public async metadata(): Promise<UploadedFileMetadata> {\n const data: UploadedFileMetadata = {\n name: this.name,\n mimeType: this.mimeType,\n extension: this.extension,\n size: await this.size(),\n };\n\n if (this.isImage) {\n const dimensions = await this.dimensions();\n data.width = dimensions.width;\n data.height = dimensions.height;\n }\n\n return data;\n }\n\n /**\n * Get file size in bytes\n *\n * Buffers the file content if not already buffered.\n */\n public async size(): Promise<number> {\n const file = await this.buffer();\n return file.length;\n }\n\n /**\n * Get file buffer\n *\n * Caches the buffer after first call for efficiency.\n */\n public async buffer(): Promise<Buffer> {\n if (this.bufferedFileContent) {\n return this.bufferedFileContent;\n }\n\n this.bufferedFileContent = await this.fileData.toBuffer();\n return this.bufferedFileContent;\n }\n\n // ============================================================\n // File Type Checks\n // ============================================================\n\n /**\n * Check if file is an image based on MIME type\n */\n public get isImage(): boolean {\n return this.mimeType.startsWith(\"image\");\n }\n\n /**\n * Check if file is a video based on MIME type\n */\n public get isVideo(): boolean {\n return this.mimeType.startsWith(\"video\");\n }\n\n /**\n * Check if file is an audio based on MIME type\n */\n public get isAudio(): boolean {\n return this.mimeType.startsWith(\"audio\");\n }\n\n // ============================================================\n // Storage Driver Selection\n // ============================================================\n\n /**\n * Select a specific storage driver for this upload\n *\n * Returns this instance for chaining. The driver is used\n * when `save()` or `saveAs()` is called.\n *\n * @param driver - Driver name from storage configuration\n * @returns This instance for chaining\n *\n * @example\n * ```typescript\n * await file.use(\"s3\").save(\"avatars\");\n * await file.use(\"r2\").save(\"cdn/images\");\n * ```\n */\n public use(driver: StorageDriverName): this {\n this._storage = storage.use(driver) as ScopedStorage;\n return this;\n }\n\n // ============================================================\n // High-Level Image Transform API\n // ============================================================\n\n /**\n * Resize the image before saving\n *\n * Only applies to image files. Non-image files ignore this.\n *\n * @param width - Target width in pixels\n * @param height - Optional target height (maintains aspect ratio if omitted)\n * @returns This instance for chaining\n *\n * @example\n * ```typescript\n * await file.resize(800).save(\"thumbnails\");\n * await file.resize(400, 400).save(\"avatars\");\n * ```\n */\n public resize(width: number, height?: number): this {\n this._imageOptions.resize = { width, height };\n return this;\n }\n\n /**\n * Set image output quality\n *\n * Quality affects file size and visual fidelity.\n * Only applies to formats that support quality (JPEG, WebP, AVIF).\n *\n * @param value - Quality value (1-100)\n * @returns This instance for chaining\n *\n * @example\n * ```typescript\n * await file.quality(85).save(\"images\");\n * ```\n */\n public quality(value: number): this {\n if (value < 1 || value > 100) {\n throw new Error(\"Quality must be between 1 and 100\");\n }\n this._imageOptions.quality = value;\n return this;\n }\n\n /**\n * Convert image to a specific format\n *\n * Changes the output format and updates the file extension accordingly.\n *\n * @param format - Target image format (jpeg, png, webp, avif, etc.)\n * @returns This instance for chaining\n *\n * @example\n * ```typescript\n * await file.format(\"webp\").save(\"images\");\n * await file.resize(800).format(\"avif\").quality(80).save(\"optimized\");\n * ```\n */\n public format(format: ImageFormat): this {\n this._imageOptions.format = format;\n return this;\n }\n\n /**\n * Rotate the image\n *\n * @param degrees - Rotation angle in degrees (positive = clockwise)\n * @returns This instance for chaining\n *\n * @example\n * ```typescript\n * await file.rotate(90).save(\"rotated\");\n * ```\n */\n public rotate(degrees: number): this {\n this._imageOptions.rotate = degrees;\n return this;\n }\n\n /**\n * Apply blur effect to the image\n *\n * @param sigma - Blur intensity (default: 3, minimum: 0.3)\n * @returns This instance for chaining\n *\n * @example\n * ```typescript\n * await file.blur(5).save(\"blurred\");\n * ```\n */\n public blur(sigma = 3): this {\n if (sigma < 0.3) {\n throw new Error(\"Blur sigma must be at least 0.3\");\n }\n this._imageOptions.blur = sigma;\n return this;\n }\n\n /**\n * Convert image to grayscale (black and white)\n *\n * @returns This instance for chaining\n *\n * @example\n * ```typescript\n * await file.grayscale().save(\"bw-images\");\n * ```\n */\n public grayscale(): this {\n this._imageOptions.grayscale = true;\n return this;\n }\n\n // ============================================================\n // Full Transform Control\n // ============================================================\n\n /**\n * Apply full image transformations\n *\n * Provides complete control over image processing. Can be used with:\n * - An options object for predefined transforms\n * - A callback function for chained operations\n *\n * @param config - Transform options or callback function\n * @returns This instance for chaining\n *\n * @example\n * ```typescript\n * // Using options object\n * await file.transform({\n * resize: { width: 800, fit: \"inside\" },\n * quality: 85\n * }).save(\"images\");\n *\n * // Using callback for full control\n * await file.transform(img =>\n * img.resize({ width: 800 })\n * .watermark(\"logo.png\", { gravity: \"southeast\" })\n * .sharpen()\n * ).save(\"products\");\n * ```\n */\n public transform(config: ImageTransformOptions | ImageTransformCallback): this {\n this._transformConfig = config;\n return this;\n }\n\n /**\n * Get an Image instance for advanced manipulation\n *\n * Returns an Image instance from the file buffer for manual processing.\n * Use this when you need operations not covered by the fluent API.\n *\n * @returns Promise resolving to Image instance\n *\n * @example\n * ```typescript\n * const img = await file.toImage();\n * await img\n * .resize({ width: 800 })\n * .watermark(\"logo.png\", { gravity: \"southeast\" })\n * .save(\"path/to/output.jpg\");\n * ```\n */\n public async toImage(): Promise<Image> {\n return new Image(await this.buffer());\n }\n\n // ============================================================\n // Image Metadata\n // ============================================================\n\n /**\n * Get file width and height (only for images)\n *\n * @returns Dimensions object, or empty object if not an image\n */\n public async dimensions(): Promise<{ width?: number; height?: number }> {\n if (!this.isImage) {\n return {};\n }\n\n return new Image(await this.buffer()).dimensions();\n }\n\n // ============================================================\n // Validation\n // ============================================================\n\n /**\n * Validate file against the given options\n *\n * @param options - Validation rules\n * @throws Error if validation fails\n *\n * @example\n * ```typescript\n * await file.validate({\n * allowedMimeTypes: [\"image/jpeg\", \"image/png\"],\n * maxSize: 5 * 1024 * 1024 // 5MB\n * });\n * ```\n */\n public async validate(options: FileValidationOptions): Promise<void> {\n const { allowedMimeTypes, allowedExtensions, maxSize } = options;\n\n if (allowedMimeTypes && !allowedMimeTypes.includes(this.mimeType)) {\n throw new Error(\n `Invalid file type: ${this.mimeType}. Allowed types: ${allowedMimeTypes.join(\", \")}`,\n );\n }\n\n if (allowedExtensions && !allowedExtensions.includes(this.extension)) {\n throw new Error(\n `Invalid file extension: ${this.extension}. Allowed extensions: ${allowedExtensions.join(\", \")}`,\n );\n }\n\n if (maxSize) {\n const fileSize = await this.size();\n if (fileSize > maxSize) {\n throw new Error(`File too large: ${fileSize} bytes. Maximum allowed: ${maxSize} bytes`);\n }\n }\n }\n\n // ============================================================\n // Save Operations\n // ============================================================\n\n /**\n * Save the file to a directory with automatic naming\n * Keep in mind to use only relative path to the root of storage\n * If you are using local driver\n * Uses the configured naming strategy and prefix options to generate\n * the final path. Returns a StorageFile for accessing file metadata.\n *\n * @param directory - Target directory path\n * @param options - Save options (name, prefix, driver, validate)\n * @returns StorageFile instance with file metadata and operations\n *\n * @example\n * ```typescript\n * // Random name (default)\n * await file.save(\"avatars\");\n * // → avatars/x7k9m2p4.jpg\n *\n * // Original name\n * await file.save(\"avatars\", { name: \"original\" });\n * // → avatars/photo.jpg\n *\n * // With date directory\n * await file.save(\"avatars\", {\n * prefix: { format: \"yyyy/mm/dd\", as: \"directory\" }\n * });\n * // → avatars/2025/12/21/x7k9m2p4.jpg\n *\n * // Original name with datetime prefix\n * await file.save(\"avatars\", { name: \"original\", prefix: true });\n * // → avatars/21-12-2025-16-45-30-photo.jpg\n * ```\n */\n public async save(directory: string, options?: SaveOptions): Promise<StorageFile> {\n // Validate if requested\n if (options?.validate) {\n await this.validate(options.validate);\n }\n\n // Resolve filename and prefix\n const filename = this.resolveFilename(options);\n const prefix = this.resolvePrefix(options?.prefix);\n const location = this.buildLocation(directory, prefix, filename);\n\n return this.saveToLocation(location, options?.driver);\n }\n\n /**\n * Save the file to an explicit path\n *\n * Unlike `save()`, this method uses the exact path you provide.\n * No automatic naming or prefix is applied.\n *\n * @param location - Full file path (directory + filename)\n * @param options - Save options (driver, validate)\n * @returns StorageFile instance with file metadata\n *\n * @example\n * ```typescript\n * await file.saveAs(\"avatars/profile-123.png\");\n * await file.saveAs(\"products/2025/featured-image.webp\");\n * ```\n */\n public async saveAs(location: string, options?: SaveAsOptions): Promise<StorageFile> {\n // Validate if requested\n if (options?.validate) {\n await this.validate(options.validate);\n }\n\n return this.saveToLocation(location, options?.driver);\n }\n\n /**\n * Get the StorageFile reference if file has been saved\n *\n * Returns undefined if file hasn't been saved yet.\n */\n public get storageFile(): StorageFile | undefined {\n return this._storageFile;\n }\n\n // ============================================================\n // Internal Helpers\n // ============================================================\n\n /**\n * Execute save to the specified location\n * @internal\n */\n protected async saveToLocation(\n location: string,\n driver?: StorageDriverName,\n ): Promise<StorageFile> {\n // Get file content (apply transforms if image)\n const content = await this.getProcessedContent();\n\n // Select storage\n const storageInstance = this.resolveStorage(driver);\n\n // Determine final location (adjust extension if format changed)\n const finalLocation = this.adjustLocationForFormat(location);\n\n // Save to storage\n this._storageFile = await storageInstance.put(content, finalLocation, {\n mimeType: this.getFinalMimeType(),\n });\n\n // Store hash from StorageFile\n const info = await this._storageFile.data();\n this.hash = info.hash || \"\";\n\n return this._storageFile;\n }\n\n /**\n * Get processed content (with transforms applied if applicable)\n * @internal\n */\n protected async getProcessedContent(): Promise<Buffer> {\n const content = await this.buffer();\n\n // If not an image or no transforms, return as-is\n if (!this.isImage || !this.hasTransforms()) {\n return content;\n }\n\n // Create Image and apply transforms\n let img = new Image(content);\n\n // Apply transform callback or options\n if (typeof this._transformConfig === \"function\") {\n img = this._transformConfig(img);\n } else if (this._transformConfig) {\n img = img.apply(this._transformConfig);\n }\n\n // Apply high-level options on top\n img = this.applyImageOptions(img);\n\n return img.toBuffer();\n }\n\n /**\n * Apply high-level image options\n * @internal\n */\n protected applyImageOptions(img: Image): Image {\n const opts = this._imageOptions;\n\n if (opts.resize) {\n img = img.resize({ width: opts.resize.width, height: opts.resize.height });\n }\n\n if (opts.rotate !== undefined) {\n img = img.rotate(opts.rotate);\n }\n\n if (opts.blur !== undefined) {\n img = img.blur(opts.blur);\n }\n\n if (opts.grayscale) {\n img = img.grayscale();\n }\n\n if (opts.quality !== undefined) {\n img = img.quality(opts.quality);\n }\n\n if (opts.format) {\n img = img.format(opts.format);\n }\n\n return img;\n }\n\n /**\n * Check if any transforms are queued\n * @internal\n */\n protected hasTransforms(): boolean {\n return this._transformConfig !== undefined || Object.keys(this._imageOptions).length > 0;\n }\n\n /**\n * Resolve storage instance to use\n * @internal\n */\n protected resolveStorage(driver?: StorageDriverName): ScopedStorage | typeof storage {\n if (driver) {\n return storage.use(driver) as ScopedStorage;\n }\n\n return this._storage || storage;\n }\n\n /**\n * Resolve the filename based on options and config\n * @internal\n */\n protected resolveFilename(options?: SaveOptions): string {\n const namingStrategy: FileNamingStrategy = options?.name ?? uploadsConfig(\"name\") ?? \"random\";\n let baseName: string;\n\n if (namingStrategy === \"original\") {\n baseName = path.basename(this.name, path.extname(this.name));\n } else if (namingStrategy === \"random\") {\n const length = uploadsConfig(\"randomLength\");\n baseName = Random.string(length);\n } else {\n // Custom name - strip extension if provided, we'll add it\n baseName = path.basename(namingStrategy, path.extname(namingStrategy));\n }\n\n // Get extension (may be changed by format transform)\n const ext = this.getFinalExtension();\n\n return `${baseName}.${ext}`;\n }\n\n /**\n * Resolve prefix based on options and config\n * @internal\n */\n protected resolvePrefix(prefix?: PrefixConfig): string {\n // No prefix\n if (prefix === false || prefix === undefined) {\n const configPrefix = uploadsConfig(\"prefix\");\n if (!configPrefix) {\n return \"\";\n }\n // Use config prefix if no explicit prefix provided\n prefix = configPrefix;\n }\n\n // Boolean true = use default format\n if (prefix === true) {\n const format = uploadsConfig(\"defaultPrefixFormat\")!;\n return this.formatDatePrefix(format, \"file\");\n }\n\n // String = static prefix\n if (typeof prefix === \"string\") {\n return prefix;\n }\n\n // PrefixOptions object\n const parts: string[] = [];\n\n // Add date format if specified\n if (prefix.format) {\n parts.push(this.formatDate(prefix.format));\n }\n\n // Add random string if specified\n if (prefix.randomLength) {\n parts.push(Random.string(prefix.randomLength));\n }\n\n const combined = parts.join(\"-\");\n const as = prefix.as ?? \"file\";\n\n if (as === \"directory\") {\n return combined ? `${combined}/` : \"\";\n }\n\n return combined ? `${combined}-` : \"\";\n }\n\n /**\n * Format a date prefix with the given format\n * @internal\n */\n protected formatDatePrefix(format: string, as: \"file\" | \"directory\"): string {\n const formatted = this.formatDate(format);\n return as === \"directory\" ? `${formatted}/` : `${formatted}-`;\n }\n\n /**\n * Format current date using token-based format string\n * @internal\n */\n protected formatDate(format: string): string {\n return dayjs().format(format);\n }\n\n /**\n * Build final location from directory, prefix, and filename\n * @internal\n */\n protected buildLocation(directory: string, prefix: string, filename: string): string {\n // Clean up directory (remove trailing slash)\n const dir = directory.replace(/\\/$/, \"\");\n\n // If prefix ends with /, it's a directory\n if (prefix.endsWith(\"/\")) {\n return `${dir}/${prefix}${filename}`;\n }\n\n // Otherwise prefix is part of filename\n return `${dir}/${prefix}${filename}`;\n }\n\n /**\n * Get final extension (accounting for format changes)\n * @internal\n */\n protected getFinalExtension(): string {\n if (this._imageOptions.format) {\n // Map formats to extensions\n const format = this._imageOptions.format;\n\n if (format === \"jpeg\") return \"jpg\";\n\n return format;\n }\n\n return this.extension;\n }\n\n /**\n * Get final MIME type (accounting for format changes)\n * @internal\n */\n protected getFinalMimeType(): string {\n if (this._imageOptions.format) {\n const format = this._imageOptions.format;\n\n if (format === \"jpeg\" || format === \"jpg\") return \"image/jpeg\";\n\n return `image/${format}`;\n }\n\n return this.mimeType;\n }\n\n /**\n * Adjust location to use correct extension if format changed\n * @internal\n */\n protected adjustLocationForFormat(location: string): string {\n if (!this._imageOptions.format) {\n return location;\n }\n\n const ext = this.getFinalExtension();\n const currentExt = path.extname(location);\n\n if (currentExt) {\n return location.replace(currentExt, `.${ext}`);\n }\n\n return `${location}.${ext}`;\n }\n\n // ============================================================\n // Serialization\n // ============================================================\n\n /**\n * Convert to JSON representation.\n *\n * **Synchronous, and that is the whole point.** `toJSON` is not an ordinary\n * method name — it is the hook `JSON.stringify` calls, and `JSON.stringify`\n * does not await. While this was `async`, every implicit serialization of an\n * upload produced `{}`: no base64, no size, not even the filename.\n *\n * Two call sites in core awaited it and worked (`http/response.ts:304`,\n * `utils/to-json.ts:9`). The ones that could not were the ones that mattered:\n * `cascade`'s model serializer calls `toJSON()` without awaiting, and\n * `Resource.toJSON()` is itself synchronous. Those paths were silently\n * broken. See canon `cd60b894`.\n *\n * **What is NOT here, and why.** `base64` forced the async — `buffer()` is\n * async — and it also put the entire file, inflated by a third, into any\n * response that happened to carry an upload. It is opt-in now via\n * {@link UploadedFile.toBase64}. `dimensions` costs an image decode; ask for\n * it with {@link UploadedFile.dimensions} when you want it.\n *\n * `size` is reported **only when the file has already been read**. Reading it\n * here would make the method async again, and guessing would be worse than\n * omitting: a wrong number is believed, an absent one is asked about. In\n * practice validation or `save()` has usually buffered the file long before\n * anything serializes it.\n */\n public toJSON(): UploadedFileJson {\n return {\n name: this.name,\n mimeType: this.mimeType,\n extension: this.extension,\n isImage: this.isImage,\n isVideo: this.isVideo,\n isAudio: this.isAudio,\n size: this.bufferedFileContent?.length,\n };\n }\n\n /**\n * The file's contents as base64.\n *\n * Explicit because it is expensive: it reads the whole file into memory and\n * grows it by a third. This used to happen on every serialization.\n */\n public async toBase64(): Promise<string> {\n return (await this.buffer()).toString(\"base64\");\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"uploaded-file.mjs","names":[],"sources":["../../../../../../../../packages/core/src/http/uploaded-file.ts"],"sourcesContent":["import type { MultipartFile } from \"@fastify/multipart\";\nimport { Random } from \"@mongez/reinforcements\";\nimport dayjs from \"dayjs\";\nimport path from \"path\";\nimport { Image, type ImageFormat, type ImageTransformOptions } from \"../image\";\nimport { storage, type ScopedStorage, type StorageDriverName, type StorageFile } from \"../storage\";\nimport { sanitizePath } from \"../utils/paths\";\nimport { uploadsConfig } from \"./uploads-config\";\nimport type {\n FileNamingStrategy,\n ImageTransformCallback,\n PrefixConfig,\n SaveAsOptions,\n SaveOptions,\n UploadedFileImageOptions,\n} from \"./uploads-types\";\n\ntype UploadedFileMetadata = {\n name: string;\n mimeType: string;\n extension: string;\n size: number;\n width?: number;\n height?: number;\n};\n\n/**\n * What an `UploadedFile` looks like on the wire.\n *\n * Every member is knowable **without reading the file**, which is what lets\n * {@link UploadedFile.toJSON} be synchronous — see the note there. `size` is\n * the one exception and it is optional for exactly that reason: present when\n * the file has already been buffered, absent otherwise, never guessed.\n */\nexport type UploadedFileJson = {\n name: string;\n mimeType: string;\n extension: string;\n isImage: boolean;\n isVideo: boolean;\n isAudio: boolean;\n size?: number;\n};\n\n/**\n * Options for validating file before saving\n */\nexport type FileValidationOptions = {\n /**\n * List of allowed MIME types\n *\n * @example [\"image/jpeg\", \"image/png\", \"image/webp\"]\n */\n allowedMimeTypes?: string[];\n\n /**\n * List of allowed file extensions (without dot)\n *\n * @example [\"jpg\", \"jpeg\", \"png\", \"webp\"]\n */\n allowedExtensions?: string[];\n\n /**\n * Maximum file size in bytes\n *\n * @example 5 * 1024 * 1024 // 5MB\n */\n maxSize?: number;\n};\n\n/**\n * UploadedFile - Handles multipart file uploads with storage and image integration\n *\n * Provides a fluent API for validating, transforming, and saving uploaded files\n * to various storage drivers (local, S3, R2, etc.).\n *\n * @example\n * ```typescript\n * // Simple save with random name\n * const file = await uploadedFile.save(\"avatars\");\n *\n * // Original name with date prefix\n * const file = await uploadedFile.save(\"avatars\", {\n * name: \"original\",\n * prefix: { format: \"yyyy/mm/dd\", as: \"directory\" }\n * });\n *\n * // With image transformations\n * const file = await uploadedFile\n * .resize(800, 600)\n * .quality(85)\n * .format(\"webp\")\n * .save(\"avatars\");\n *\n * // Different storage driver\n * const file = await uploadedFile.use(\"s3\").save(\"avatars\");\n * ```\n */\nexport class UploadedFile {\n /**\n * File buffered content\n * @internal\n */\n protected bufferedFileContent?: Buffer;\n\n /**\n * Upload file hash (SHA-256)\n *\n * Populated after file is saved.\n */\n public hash = \"\";\n\n /**\n * Selected storage driver\n * @internal\n */\n protected _storage: ScopedStorage = storage;\n\n /**\n * Saved StorageFile reference\n * @internal\n */\n protected _storageFile?: StorageFile;\n\n /**\n * Queued image options (high-level API)\n * @internal\n */\n protected _imageOptions: UploadedFileImageOptions = {};\n\n /**\n * Full transform options or callback\n * @internal\n */\n protected _transformConfig?: ImageTransformOptions | ImageTransformCallback;\n\n /**\n * Create a new UploadedFile instance\n *\n * @param fileData - Multipart file data from Fastify\n * @throws Error if file data is invalid\n */\n public constructor(protected readonly fileData: MultipartFile) {\n if (!fileData?.filename) {\n throw new Error(\"Invalid file data: filename is required\");\n }\n }\n\n // ============================================================\n // File Properties\n // ============================================================\n\n /**\n * Get file name (sanitized)\n *\n * Returns the original filename with special characters removed/replaced.\n */\n public get name(): string {\n return sanitizePath(this.fileData.filename);\n }\n\n /**\n * Get file MIME type\n *\n * @example \"image/jpeg\", \"application/pdf\"\n */\n public get mimeType(): string {\n return this.fileData.mimetype;\n }\n\n /**\n * Get file extension (lowercase, without dot)\n *\n * @example \"jpg\", \"png\", \"pdf\"\n */\n public get extension(): string {\n return path.extname(this.fileData.filename).replace(\".\", \"\").toLowerCase();\n }\n\n /**\n * Get file metadata\n */\n public async metadata(): Promise<UploadedFileMetadata> {\n const data: UploadedFileMetadata = {\n name: this.name,\n mimeType: this.mimeType,\n extension: this.extension,\n size: await this.size(),\n };\n\n if (this.isImage) {\n const dimensions = await this.dimensions();\n data.width = dimensions.width;\n data.height = dimensions.height;\n }\n\n return data;\n }\n\n /**\n * Get file size in bytes\n *\n * Buffers the file content if not already buffered.\n */\n public async size(): Promise<number> {\n const file = await this.buffer();\n return file.length;\n }\n\n /**\n * Get file buffer\n *\n * Caches the buffer after first call for efficiency.\n */\n public async buffer(): Promise<Buffer> {\n if (this.bufferedFileContent) {\n return this.bufferedFileContent;\n }\n\n this.bufferedFileContent = await this.fileData.toBuffer();\n return this.bufferedFileContent;\n }\n\n // ============================================================\n // File Type Checks\n // ============================================================\n\n /**\n * Check if file is an image based on MIME type\n */\n public get isImage(): boolean {\n return this.mimeType.startsWith(\"image\");\n }\n\n /**\n * Check if file is a video based on MIME type\n */\n public get isVideo(): boolean {\n return this.mimeType.startsWith(\"video\");\n }\n\n /**\n * Check if file is an audio based on MIME type\n */\n public get isAudio(): boolean {\n return this.mimeType.startsWith(\"audio\");\n }\n\n // ============================================================\n // Storage Driver Selection\n // ============================================================\n\n /**\n * Select a specific storage driver for this upload\n *\n * Returns this instance for chaining. The driver is used\n * when `save()` or `saveAs()` is called.\n *\n * @param driver - Driver name from storage configuration\n * @returns This instance for chaining\n *\n * @example\n * ```typescript\n * await file.use(\"s3\").save(\"avatars\");\n * await file.use(\"r2\").save(\"cdn/images\");\n * ```\n */\n public use(driver: StorageDriverName): this {\n this._storage = storage.use(driver) as ScopedStorage;\n return this;\n }\n\n // ============================================================\n // High-Level Image Transform API\n // ============================================================\n\n /**\n * Resize the image before saving\n *\n * Only applies to image files. Non-image files ignore this.\n *\n * @param width - Target width in pixels\n * @param height - Optional target height (maintains aspect ratio if omitted)\n * @returns This instance for chaining\n *\n * @example\n * ```typescript\n * await file.resize(800).save(\"thumbnails\");\n * await file.resize(400, 400).save(\"avatars\");\n * ```\n */\n public resize(width: number, height?: number): this {\n this._imageOptions.resize = { width, height };\n return this;\n }\n\n /**\n * Set image output quality\n *\n * Quality affects file size and visual fidelity.\n * Only applies to formats that support quality (JPEG, WebP, AVIF).\n *\n * @param value - Quality value (1-100)\n * @returns This instance for chaining\n *\n * @example\n * ```typescript\n * await file.quality(85).save(\"images\");\n * ```\n */\n public quality(value: number): this {\n if (value < 1 || value > 100) {\n throw new Error(\"Quality must be between 1 and 100\");\n }\n this._imageOptions.quality = value;\n return this;\n }\n\n /**\n * Convert image to a specific format\n *\n * Changes the output format and updates the file extension accordingly.\n *\n * @param format - Target image format (jpeg, png, webp, avif, etc.)\n * @returns This instance for chaining\n *\n * @example\n * ```typescript\n * await file.format(\"webp\").save(\"images\");\n * await file.resize(800).format(\"avif\").quality(80).save(\"optimized\");\n * ```\n */\n public format(format: ImageFormat): this {\n this._imageOptions.format = format;\n return this;\n }\n\n /**\n * Rotate the image\n *\n * @param degrees - Rotation angle in degrees (positive = clockwise)\n * @returns This instance for chaining\n *\n * @example\n * ```typescript\n * await file.rotate(90).save(\"rotated\");\n * ```\n */\n public rotate(degrees: number): this {\n this._imageOptions.rotate = degrees;\n return this;\n }\n\n /**\n * Apply blur effect to the image\n *\n * @param sigma - Blur intensity (default: 3, minimum: 0.3)\n * @returns This instance for chaining\n *\n * @example\n * ```typescript\n * await file.blur(5).save(\"blurred\");\n * ```\n */\n public blur(sigma = 3): this {\n if (sigma < 0.3) {\n throw new Error(\"Blur sigma must be at least 0.3\");\n }\n this._imageOptions.blur = sigma;\n return this;\n }\n\n /**\n * Convert image to grayscale (black and white)\n *\n * @returns This instance for chaining\n *\n * @example\n * ```typescript\n * await file.grayscale().save(\"bw-images\");\n * ```\n */\n public grayscale(): this {\n this._imageOptions.grayscale = true;\n return this;\n }\n\n // ============================================================\n // Full Transform Control\n // ============================================================\n\n /**\n * Apply full image transformations\n *\n * Provides complete control over image processing. Can be used with:\n * - An options object for predefined transforms\n * - A callback function for chained operations\n *\n * @param config - Transform options or callback function\n * @returns This instance for chaining\n *\n * @example\n * ```typescript\n * // Using options object\n * await file.transform({\n * resize: { width: 800, fit: \"inside\" },\n * quality: 85\n * }).save(\"images\");\n *\n * // Using callback for full control\n * await file.transform(img =>\n * img.resize({ width: 800 })\n * .watermark(\"logo.png\", { gravity: \"southeast\" })\n * .sharpen()\n * ).save(\"products\");\n * ```\n */\n public transform(config: ImageTransformOptions | ImageTransformCallback): this {\n this._transformConfig = config;\n return this;\n }\n\n /**\n * Get an Image instance for advanced manipulation\n *\n * Returns an Image instance from the file buffer for manual processing.\n * Use this when you need operations not covered by the fluent API.\n *\n * @returns Promise resolving to Image instance\n *\n * @example\n * ```typescript\n * const img = await file.toImage();\n * await img\n * .resize({ width: 800 })\n * .watermark(\"logo.png\", { gravity: \"southeast\" })\n * .save(\"path/to/output.jpg\");\n * ```\n */\n public async toImage(): Promise<Image> {\n return new Image(await this.buffer());\n }\n\n // ============================================================\n // Image Metadata\n // ============================================================\n\n /**\n * Get file width and height (only for images)\n *\n * @returns Dimensions object, or empty object if not an image\n */\n public async dimensions(): Promise<{ width?: number; height?: number }> {\n if (!this.isImage) {\n return {};\n }\n\n return new Image(await this.buffer()).dimensions();\n }\n\n // ============================================================\n // Validation\n // ============================================================\n\n /**\n * Validate file against the given options\n *\n * @param options - Validation rules\n * @throws Error if validation fails\n *\n * @example\n * ```typescript\n * await file.validate({\n * allowedMimeTypes: [\"image/jpeg\", \"image/png\"],\n * maxSize: 5 * 1024 * 1024 // 5MB\n * });\n * ```\n */\n public async validate(options: FileValidationOptions): Promise<void> {\n const { allowedMimeTypes, allowedExtensions, maxSize } = options;\n\n if (allowedMimeTypes && !allowedMimeTypes.includes(this.mimeType)) {\n throw new Error(\n `Invalid file type: ${this.mimeType}. Allowed types: ${allowedMimeTypes.join(\", \")}`,\n );\n }\n\n if (allowedExtensions && !allowedExtensions.includes(this.extension)) {\n throw new Error(\n `Invalid file extension: ${this.extension}. Allowed extensions: ${allowedExtensions.join(\", \")}`,\n );\n }\n\n if (maxSize) {\n const fileSize = await this.size();\n if (fileSize > maxSize) {\n throw new Error(`File too large: ${fileSize} bytes. Maximum allowed: ${maxSize} bytes`);\n }\n }\n }\n\n // ============================================================\n // Save Operations\n // ============================================================\n\n /**\n * Save the file to a directory with automatic naming\n * Keep in mind to use only relative path to the root of storage\n * If you are using local driver\n * Uses the configured naming strategy and prefix options to generate\n * the final path. Returns a StorageFile for accessing file metadata.\n *\n * @param directory - Target directory path\n * @param options - Save options (name, prefix, driver, validate)\n * @returns StorageFile instance with file metadata and operations\n *\n * @example\n * ```typescript\n * // Random name (default)\n * await file.save(\"avatars\");\n * // → avatars/x7k9m2p4.jpg\n *\n * // Original name\n * await file.save(\"avatars\", { name: \"original\" });\n * // → avatars/photo.jpg\n *\n * // With date directory\n * await file.save(\"avatars\", {\n * prefix: { format: \"yyyy/mm/dd\", as: \"directory\" }\n * });\n * // → avatars/2025/12/21/x7k9m2p4.jpg\n *\n * // Original name with datetime prefix\n * await file.save(\"avatars\", { name: \"original\", prefix: true });\n * // → avatars/21-12-2025-16-45-30-photo.jpg\n * ```\n */\n public async save(directory: string, options?: SaveOptions): Promise<StorageFile> {\n // Validate if requested\n if (options?.validate) {\n await this.validate(options.validate);\n }\n\n // Resolve filename and prefix\n const filename = this.resolveFilename(options);\n const prefix = this.resolvePrefix(options?.prefix);\n const location = this.buildLocation(directory, prefix, filename);\n\n return this.saveToLocation(location, options?.driver);\n }\n\n /**\n * Save the file to an explicit path\n *\n * Unlike `save()`, this method uses the exact path you provide.\n * No automatic naming or prefix is applied.\n *\n * @param location - Full file path (directory + filename)\n * @param options - Save options (driver, validate)\n * @returns StorageFile instance with file metadata\n *\n * @example\n * ```typescript\n * await file.saveAs(\"avatars/profile-123.png\");\n * await file.saveAs(\"products/2025/featured-image.webp\");\n * ```\n */\n public async saveAs(location: string, options?: SaveAsOptions): Promise<StorageFile> {\n // Validate if requested\n if (options?.validate) {\n await this.validate(options.validate);\n }\n\n return this.saveToLocation(location, options?.driver);\n }\n\n /**\n * Get the StorageFile reference if file has been saved\n *\n * Returns undefined if file hasn't been saved yet.\n */\n public get storageFile(): StorageFile | undefined {\n return this._storageFile;\n }\n\n // ============================================================\n // Internal Helpers\n // ============================================================\n\n /**\n * Execute save to the specified location\n * @internal\n */\n protected async saveToLocation(\n location: string,\n driver?: StorageDriverName,\n ): Promise<StorageFile> {\n // Get file content (apply transforms if image)\n const content = await this.getProcessedContent();\n\n // Select storage\n const storageInstance = this.resolveStorage(driver);\n\n // Determine final location (adjust extension if format changed)\n const finalLocation = this.adjustLocationForFormat(location);\n\n // Save to storage\n this._storageFile = await storageInstance.put(content, finalLocation, {\n mimeType: this.getFinalMimeType(),\n });\n\n // Store hash from StorageFile\n const info = await this._storageFile.data();\n this.hash = info.hash || \"\";\n\n return this._storageFile;\n }\n\n /**\n * Get processed content (with transforms applied if applicable)\n * @internal\n */\n protected async getProcessedContent(): Promise<Buffer> {\n const content = await this.buffer();\n\n // If not an image or no transforms, return as-is\n if (!this.isImage || !this.hasTransforms()) {\n return content;\n }\n\n // Create Image and apply transforms\n let img = new Image(content);\n\n // Apply transform callback or options\n if (typeof this._transformConfig === \"function\") {\n img = this._transformConfig(img);\n } else if (this._transformConfig) {\n img = img.apply(this._transformConfig);\n }\n\n // Apply high-level options on top\n img = this.applyImageOptions(img);\n\n return img.toBuffer();\n }\n\n /**\n * Apply high-level image options\n * @internal\n */\n protected applyImageOptions(img: Image): Image {\n const opts = this._imageOptions;\n\n if (opts.resize) {\n img = img.resize({ width: opts.resize.width, height: opts.resize.height });\n }\n\n if (opts.rotate !== undefined) {\n img = img.rotate(opts.rotate);\n }\n\n if (opts.blur !== undefined) {\n img = img.blur(opts.blur);\n }\n\n if (opts.grayscale) {\n img = img.grayscale();\n }\n\n if (opts.quality !== undefined) {\n img = img.quality(opts.quality);\n }\n\n if (opts.format) {\n img = img.format(opts.format);\n }\n\n return img;\n }\n\n /**\n * Check if any transforms are queued\n * @internal\n */\n protected hasTransforms(): boolean {\n return this._transformConfig !== undefined || Object.keys(this._imageOptions).length > 0;\n }\n\n /**\n * Resolve storage instance to use\n * @internal\n */\n protected resolveStorage(driver?: StorageDriverName): ScopedStorage | typeof storage {\n if (driver) {\n return storage.use(driver) as ScopedStorage;\n }\n\n return this._storage || storage;\n }\n\n /**\n * Resolve the filename based on options and config\n * @internal\n */\n protected resolveFilename(options?: SaveOptions): string {\n const namingStrategy: FileNamingStrategy = options?.name ?? uploadsConfig(\"name\") ?? \"random\";\n let baseName: string;\n\n if (namingStrategy === \"original\") {\n baseName = path.basename(this.name, path.extname(this.name));\n } else if (namingStrategy === \"random\") {\n const length = uploadsConfig(\"randomLength\");\n baseName = Random.string(length);\n } else {\n // Custom name - strip extension if provided, we'll add it\n baseName = path.basename(namingStrategy, path.extname(namingStrategy));\n }\n\n // Get extension (may be changed by format transform)\n const ext = this.getFinalExtension();\n\n return `${baseName}.${ext}`;\n }\n\n /**\n * Resolve prefix based on options and config\n * @internal\n */\n protected resolvePrefix(prefix?: PrefixConfig): string {\n // No prefix\n if (prefix === false || prefix === undefined) {\n const configPrefix = uploadsConfig(\"prefix\");\n if (!configPrefix) {\n return \"\";\n }\n // Use config prefix if no explicit prefix provided\n prefix = configPrefix;\n }\n\n // Boolean true = use default format\n if (prefix === true) {\n const format = uploadsConfig(\"defaultPrefixFormat\")!;\n return this.formatDatePrefix(format, \"file\");\n }\n\n // String = static prefix\n if (typeof prefix === \"string\") {\n return prefix;\n }\n\n // PrefixOptions object\n const parts: string[] = [];\n\n // Add date format if specified\n if (prefix.format) {\n parts.push(this.formatDate(prefix.format));\n }\n\n // Add random string if specified\n if (prefix.randomLength) {\n parts.push(Random.string(prefix.randomLength));\n }\n\n const combined = parts.join(\"-\");\n const as = prefix.as ?? \"file\";\n\n if (as === \"directory\") {\n return combined ? `${combined}/` : \"\";\n }\n\n return combined ? `${combined}-` : \"\";\n }\n\n /**\n * Format a date prefix with the given format\n * @internal\n */\n protected formatDatePrefix(format: string, as: \"file\" | \"directory\"): string {\n const formatted = this.formatDate(format);\n return as === \"directory\" ? `${formatted}/` : `${formatted}-`;\n }\n\n /**\n * Format current date using token-based format string\n * @internal\n */\n protected formatDate(format: string): string {\n return dayjs().format(format);\n }\n\n /**\n * Build final location from directory, prefix, and filename\n * @internal\n */\n protected buildLocation(directory: string, prefix: string, filename: string): string {\n // Clean up directory (remove trailing slash)\n const dir = directory.replace(/\\/$/, \"\");\n\n // If prefix ends with /, it's a directory\n if (prefix.endsWith(\"/\")) {\n return `${dir}/${prefix}${filename}`;\n }\n\n // Otherwise prefix is part of filename\n return `${dir}/${prefix}${filename}`;\n }\n\n /**\n * Get final extension (accounting for format changes)\n * @internal\n */\n protected getFinalExtension(): string {\n if (this._imageOptions.format) {\n // Map formats to extensions\n const format = this._imageOptions.format;\n\n if (format === \"jpeg\") return \"jpg\";\n\n return format;\n }\n\n return this.extension;\n }\n\n /**\n * Get final MIME type (accounting for format changes)\n * @internal\n */\n protected getFinalMimeType(): string {\n if (this._imageOptions.format) {\n const format = this._imageOptions.format;\n\n if (format === \"jpeg\" || format === \"jpg\") return \"image/jpeg\";\n\n return `image/${format}`;\n }\n\n return this.mimeType;\n }\n\n /**\n * Adjust location to use correct extension if format changed\n * @internal\n */\n protected adjustLocationForFormat(location: string): string {\n if (!this._imageOptions.format) {\n return location;\n }\n\n const ext = this.getFinalExtension();\n const currentExt = path.extname(location);\n\n if (currentExt) {\n return location.replace(currentExt, `.${ext}`);\n }\n\n return `${location}.${ext}`;\n }\n\n // ============================================================\n // Serialization\n // ============================================================\n\n /**\n * Convert to JSON representation.\n *\n * **Synchronous, and that is the whole point.** `toJSON` is not an ordinary\n * method name — it is the hook `JSON.stringify` calls, and `JSON.stringify`\n * does not await. While this was `async`, every implicit serialization of an\n * upload produced `{}`: no base64, no size, not even the filename.\n *\n * Two call sites in core awaited it and worked (`http/response.ts:304`,\n * `utils/to-json.ts:9`). The ones that could not were the ones that mattered:\n * `cascade`'s model serializer calls `toJSON()` without awaiting, and\n * `Resource.toJSON()` is itself synchronous. Those paths were silently\n * broken. See canon `cd60b894`.\n *\n * **What is NOT here, and why.** `base64` forced the async — `buffer()` is\n * async — and it also put the entire file, inflated by a third, into any\n * response that happened to carry an upload. It is opt-in now via\n * {@link UploadedFile.toBase64}. `dimensions` costs an image decode; ask for\n * it with {@link UploadedFile.dimensions} when you want it.\n *\n * `size` is reported **only when the file has already been read**. Reading it\n * here would make the method async again, and guessing would be worse than\n * omitting: a wrong number is believed, an absent one is asked about. In\n * practice validation or `save()` has usually buffered the file long before\n * anything serializes it.\n */\n public toJSON(): UploadedFileJson {\n return {\n name: this.name,\n mimeType: this.mimeType,\n extension: this.extension,\n isImage: this.isImage,\n isVideo: this.isVideo,\n isAudio: this.isAudio,\n size: this.bufferedFileContent?.length,\n };\n }\n\n /**\n * The file's contents as base64.\n *\n * Explicit because it is expensive: it reads the whole file into memory and\n * grows it by a third. This used to happen on every serialization.\n */\n public async toBase64(): Promise<string> {\n return (await this.buffer()).toString(\"base64\");\n }\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- //#region ../core/src/http/uploads/detect-image-format.ts
1
+ //#region ../../packages/core/src/http/uploads/detect-image-format.ts
2
2
  /**
3
3
  * Bytes `detectImageFormat` needs to see
4
4
  */
@@ -1 +1 @@
1
- {"version":3,"file":"detect-image-format.mjs","names":[],"sources":["../../../../../../../../core/src/http/uploads/detect-image-format.ts"],"sourcesContent":["import type { DetectedImageFormat, VariantSourceFormat } from \"./image-variant-types\";\n\n/**\n * Bytes `detectImageFormat` needs to see\n */\nexport const IMAGE_SIGNATURE_BYTES = 512;\n\nfunction startsWith(buffer: Buffer, signature: number[], offset = 0): boolean {\n return signature.every((byte, index) => buffer[offset + index] === byte);\n}\n\nfunction ascii(buffer: Buffer, start: number, end: number): string {\n return buffer.subarray(start, end).toString(\"latin1\");\n}\n\n/**\n * Detect an image format from its magic bytes, never from the file name.\n *\n * Recognises the variant sources (jpeg, png, webp, still avif) and the formats\n * that are refused but worth naming (gif, svg). An animated avif sequence\n * (`avis` brand) is not reported as avif.\n *\n * @returns the format, or `undefined` for anything else\n */\nexport function detectImageFormat(buffer: Buffer): DetectedImageFormat | undefined {\n if (startsWith(buffer, [0xff, 0xd8, 0xff])) return \"jpeg\";\n\n if (startsWith(buffer, [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a])) return \"png\";\n\n if (ascii(buffer, 0, 4) === \"RIFF\" && ascii(buffer, 8, 12) === \"WEBP\") return \"webp\";\n\n if (ascii(buffer, 0, 6) === \"GIF87a\" || ascii(buffer, 0, 6) === \"GIF89a\") return \"gif\";\n\n if (ascii(buffer, 4, 8) === \"ftyp\" && ascii(buffer, 8, 12) === \"avif\") return \"avif\";\n\n const head = buffer\n .subarray(0, IMAGE_SIGNATURE_BYTES)\n .toString(\"utf8\")\n .replace(/^/, \"\")\n .trimStart()\n .toLowerCase();\n\n if (head.startsWith(\"<svg\") || (head.startsWith(\"<?xml\") && head.includes(\"<svg\"))) return \"svg\";\n\n return undefined;\n}\n\nconst VARIANT_SOURCE_FORMATS: readonly DetectedImageFormat[] = [\"jpeg\", \"png\", \"webp\", \"avif\"];\n\n/**\n * Whether a detected format can be the source of a variant. gif is refused\n * (animation is ambiguous) and svg is refused (not a raster).\n */\nexport function isVariantSourceFormat(\n format: DetectedImageFormat | undefined,\n): format is VariantSourceFormat {\n return format !== undefined && VARIANT_SOURCE_FORMATS.includes(format);\n}\n"],"mappings":";;;;AAKA,MAAa,wBAAwB;AAErC,SAAS,WAAW,QAAgB,WAAqB,SAAS,GAAY;CAC5E,OAAO,UAAU,OAAO,MAAM,UAAU,OAAO,SAAS,WAAW,IAAI;AACzE;AAEA,SAAS,MAAM,QAAgB,OAAe,KAAqB;CACjE,OAAO,OAAO,SAAS,OAAO,GAAG,CAAC,CAAC,SAAS,QAAQ;AACtD;;;;;;;;;;AAWA,SAAgB,kBAAkB,QAAiD;CACjF,IAAI,WAAW,QAAQ;EAAC;EAAM;EAAM;CAAI,CAAC,GAAG,OAAO;CAEnD,IAAI,WAAW,QAAQ;EAAC;EAAM;EAAM;EAAM;EAAM;EAAM;EAAM;EAAM;CAAI,CAAC,GAAG,OAAO;CAEjF,IAAI,MAAM,QAAQ,GAAG,CAAC,MAAM,UAAU,MAAM,QAAQ,GAAG,EAAE,MAAM,QAAQ,OAAO;CAE9E,IAAI,MAAM,QAAQ,GAAG,CAAC,MAAM,YAAY,MAAM,QAAQ,GAAG,CAAC,MAAM,UAAU,OAAO;CAEjF,IAAI,MAAM,QAAQ,GAAG,CAAC,MAAM,UAAU,MAAM,QAAQ,GAAG,EAAE,MAAM,QAAQ,OAAO;CAE9E,MAAM,OAAO,OACV,SAAS,MAAwB,CAAC,CAClC,SAAS,MAAM,CAAC,CAChB,QAAQ,MAAM,EAAE,CAAC,CACjB,UAAU,CAAC,CACX,YAAY;CAEf,IAAI,KAAK,WAAW,MAAM,KAAM,KAAK,WAAW,OAAO,KAAK,KAAK,SAAS,MAAM,GAAI,OAAO;AAG7F;AAEA,MAAM,yBAAyD;CAAC;CAAQ;CAAO;CAAQ;AAAM;;;;;AAM7F,SAAgB,sBACd,QAC+B;CAC/B,OAAO,WAAW,UAAa,uBAAuB,SAAS,MAAM;AACvE"}
1
+ {"version":3,"file":"detect-image-format.mjs","names":[],"sources":["../../../../../../../../../packages/core/src/http/uploads/detect-image-format.ts"],"sourcesContent":["import type { DetectedImageFormat, VariantSourceFormat } from \"./image-variant-types\";\n\n/**\n * Bytes `detectImageFormat` needs to see\n */\nexport const IMAGE_SIGNATURE_BYTES = 512;\n\nfunction startsWith(buffer: Buffer, signature: number[], offset = 0): boolean {\n return signature.every((byte, index) => buffer[offset + index] === byte);\n}\n\nfunction ascii(buffer: Buffer, start: number, end: number): string {\n return buffer.subarray(start, end).toString(\"latin1\");\n}\n\n/**\n * Detect an image format from its magic bytes, never from the file name.\n *\n * Recognises the variant sources (jpeg, png, webp, still avif) and the formats\n * that are refused but worth naming (gif, svg). An animated avif sequence\n * (`avis` brand) is not reported as avif.\n *\n * @returns the format, or `undefined` for anything else\n */\nexport function detectImageFormat(buffer: Buffer): DetectedImageFormat | undefined {\n if (startsWith(buffer, [0xff, 0xd8, 0xff])) return \"jpeg\";\n\n if (startsWith(buffer, [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a])) return \"png\";\n\n if (ascii(buffer, 0, 4) === \"RIFF\" && ascii(buffer, 8, 12) === \"WEBP\") return \"webp\";\n\n if (ascii(buffer, 0, 6) === \"GIF87a\" || ascii(buffer, 0, 6) === \"GIF89a\") return \"gif\";\n\n if (ascii(buffer, 4, 8) === \"ftyp\" && ascii(buffer, 8, 12) === \"avif\") return \"avif\";\n\n const head = buffer\n .subarray(0, IMAGE_SIGNATURE_BYTES)\n .toString(\"utf8\")\n .replace(/^/, \"\")\n .trimStart()\n .toLowerCase();\n\n if (head.startsWith(\"<svg\") || (head.startsWith(\"<?xml\") && head.includes(\"<svg\"))) return \"svg\";\n\n return undefined;\n}\n\nconst VARIANT_SOURCE_FORMATS: readonly DetectedImageFormat[] = [\"jpeg\", \"png\", \"webp\", \"avif\"];\n\n/**\n * Whether a detected format can be the source of a variant. gif is refused\n * (animation is ambiguous) and svg is refused (not a raster).\n */\nexport function isVariantSourceFormat(\n format: DetectedImageFormat | undefined,\n): format is VariantSourceFormat {\n return format !== undefined && VARIANT_SOURCE_FORMATS.includes(format);\n}\n"],"mappings":";;;;AAKA,MAAa,wBAAwB;AAErC,SAAS,WAAW,QAAgB,WAAqB,SAAS,GAAY;CAC5E,OAAO,UAAU,OAAO,MAAM,UAAU,OAAO,SAAS,WAAW,IAAI;AACzE;AAEA,SAAS,MAAM,QAAgB,OAAe,KAAqB;CACjE,OAAO,OAAO,SAAS,OAAO,GAAG,CAAC,CAAC,SAAS,QAAQ;AACtD;;;;;;;;;;AAWA,SAAgB,kBAAkB,QAAiD;CACjF,IAAI,WAAW,QAAQ;EAAC;EAAM;EAAM;CAAI,CAAC,GAAG,OAAO;CAEnD,IAAI,WAAW,QAAQ;EAAC;EAAM;EAAM;EAAM;EAAM;EAAM;EAAM;EAAM;CAAI,CAAC,GAAG,OAAO;CAEjF,IAAI,MAAM,QAAQ,GAAG,CAAC,MAAM,UAAU,MAAM,QAAQ,GAAG,EAAE,MAAM,QAAQ,OAAO;CAE9E,IAAI,MAAM,QAAQ,GAAG,CAAC,MAAM,YAAY,MAAM,QAAQ,GAAG,CAAC,MAAM,UAAU,OAAO;CAEjF,IAAI,MAAM,QAAQ,GAAG,CAAC,MAAM,UAAU,MAAM,QAAQ,GAAG,EAAE,MAAM,QAAQ,OAAO;CAE9E,MAAM,OAAO,OACV,SAAS,MAAwB,CAAC,CAClC,SAAS,MAAM,CAAC,CAChB,QAAQ,MAAM,EAAE,CAAC,CACjB,UAAU,CAAC,CACX,YAAY;CAEf,IAAI,KAAK,WAAW,MAAM,KAAM,KAAK,WAAW,OAAO,KAAK,KAAK,SAAS,MAAM,GAAI,OAAO;AAG7F;AAEA,MAAM,yBAAyD;CAAC;CAAQ;CAAO;CAAQ;AAAM;;;;;AAM7F,SAAgB,sBACd,QAC+B;CAC/B,OAAO,WAAW,UAAa,uBAAuB,SAAS,MAAM;AACvE"}
@@ -1,8 +1,8 @@
1
- import path from "node:path";
2
1
  import { randomBytes } from "node:crypto";
2
+ import path from "node:path";
3
3
  import fs from "node:fs/promises";
4
4
 
5
- //#region ../core/src/http/uploads/generate-image-variant.ts
5
+ //#region ../../packages/core/src/http/uploads/generate-image-variant.ts
6
6
  async function fileExists(target) {
7
7
  try {
8
8
  await fs.access(target);
@@ -1 +1 @@
1
- {"version":3,"file":"generate-image-variant.mjs","names":[],"sources":["../../../../../../../../core/src/http/uploads/generate-image-variant.ts"],"sourcesContent":["import { randomBytes } from \"node:crypto\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { Image } from \"../../image\";\nimport type { ImageVariantDefinition } from \"../uploads-types\";\nimport type { VariantOutputFormat } from \"./image-variant-types\";\n\n/**\n * Inputs of one derivative generation\n */\nexport type GenerateImageVariantOptions = {\n image: Image;\n variant: ImageVariantDefinition;\n format: VariantOutputFormat;\n targetPath: string;\n};\n\nasync function fileExists(target: string): Promise<boolean> {\n try {\n await fs.access(target);\n\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Render a derivative and write it atomically.\n *\n * The image is written to `<target>.tmp-<random>` and then renamed onto the\n * target, so a reader sees no file or a complete one, never a partial one. On\n * any failure the temp file is removed before the error is rethrown.\n */\nexport async function generateImageVariant({\n image,\n variant,\n format,\n targetPath,\n}: GenerateImageVariantOptions): Promise<void> {\n image.resize({\n width: variant.width,\n height: variant.height,\n fit: variant.fit,\n withoutEnlargement: variant.enlarge !== true,\n });\n image.format(format);\n\n if (variant.quality !== undefined) {\n image.quality(variant.quality);\n }\n\n await fs.mkdir(path.dirname(targetPath), { recursive: true });\n\n const temporaryPath = `${targetPath}.tmp-${randomBytes(8).toString(\"hex\")}`;\n\n try {\n await image.save(temporaryPath);\n\n try {\n await fs.rename(temporaryPath, targetPath);\n } catch (error) {\n // Another process won the race and its file is being read (win32 refuses\n // to replace an open file). Same key, same bytes: theirs will do.\n if (!(await fileExists(targetPath))) throw error;\n }\n } finally {\n await fs.rm(temporaryPath, { force: true });\n }\n}\n"],"mappings":";;;;;AAiBA,eAAe,WAAW,QAAkC;CAC1D,IAAI;EACF,MAAM,GAAG,OAAO,MAAM;EAEtB,OAAO;CACT,QAAQ;EACN,OAAO;CACT;AACF;;;;;;;;AASA,eAAsB,qBAAqB,EACzC,OACA,SACA,QACA,cAC6C;CAC7C,MAAM,OAAO;EACX,OAAO,QAAQ;EACf,QAAQ,QAAQ;EAChB,KAAK,QAAQ;EACb,oBAAoB,QAAQ,YAAY;CAC1C,CAAC;CACD,MAAM,OAAO,MAAM;CAEnB,IAAI,QAAQ,YAAY,QACtB,MAAM,QAAQ,QAAQ,OAAO;CAG/B,MAAM,GAAG,MAAM,KAAK,QAAQ,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;CAE5D,MAAM,gBAAgB,GAAG,WAAW,OAAO,YAAY,CAAC,CAAC,CAAC,SAAS,KAAK;CAExE,IAAI;EACF,MAAM,MAAM,KAAK,aAAa;EAE9B,IAAI;GACF,MAAM,GAAG,OAAO,eAAe,UAAU;EAC3C,SAAS,OAAO;GAGd,IAAI,CAAE,MAAM,WAAW,UAAU,GAAI,MAAM;EAC7C;CACF,UAAU;EACR,MAAM,GAAG,GAAG,eAAe,EAAE,OAAO,KAAK,CAAC;CAC5C;AACF"}
1
+ {"version":3,"file":"generate-image-variant.mjs","names":[],"sources":["../../../../../../../../../packages/core/src/http/uploads/generate-image-variant.ts"],"sourcesContent":["import { randomBytes } from \"node:crypto\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { Image } from \"../../image\";\nimport type { ImageVariantDefinition } from \"../uploads-types\";\nimport type { VariantOutputFormat } from \"./image-variant-types\";\n\n/**\n * Inputs of one derivative generation\n */\nexport type GenerateImageVariantOptions = {\n image: Image;\n variant: ImageVariantDefinition;\n format: VariantOutputFormat;\n targetPath: string;\n};\n\nasync function fileExists(target: string): Promise<boolean> {\n try {\n await fs.access(target);\n\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Render a derivative and write it atomically.\n *\n * The image is written to `<target>.tmp-<random>` and then renamed onto the\n * target, so a reader sees no file or a complete one, never a partial one. On\n * any failure the temp file is removed before the error is rethrown.\n */\nexport async function generateImageVariant({\n image,\n variant,\n format,\n targetPath,\n}: GenerateImageVariantOptions): Promise<void> {\n image.resize({\n width: variant.width,\n height: variant.height,\n fit: variant.fit,\n withoutEnlargement: variant.enlarge !== true,\n });\n image.format(format);\n\n if (variant.quality !== undefined) {\n image.quality(variant.quality);\n }\n\n await fs.mkdir(path.dirname(targetPath), { recursive: true });\n\n const temporaryPath = `${targetPath}.tmp-${randomBytes(8).toString(\"hex\")}`;\n\n try {\n await image.save(temporaryPath);\n\n try {\n await fs.rename(temporaryPath, targetPath);\n } catch (error) {\n // Another process won the race and its file is being read (win32 refuses\n // to replace an open file). Same key, same bytes: theirs will do.\n if (!(await fileExists(targetPath))) throw error;\n }\n } finally {\n await fs.rm(temporaryPath, { force: true });\n }\n}\n"],"mappings":";;;;;AAiBA,eAAe,WAAW,QAAkC;CAC1D,IAAI;EACF,MAAM,GAAG,OAAO,MAAM;EAEtB,OAAO;CACT,QAAQ;EACN,OAAO;CACT;AACF;;;;;;;;AASA,eAAsB,qBAAqB,EACzC,OACA,SACA,QACA,cAC6C;CAC7C,MAAM,OAAO;EACX,OAAO,QAAQ;EACf,QAAQ,QAAQ;EAChB,KAAK,QAAQ;EACb,oBAAoB,QAAQ,YAAY;CAC1C,CAAC;CACD,MAAM,OAAO,MAAM;CAEnB,IAAI,QAAQ,YAAY,QACtB,MAAM,QAAQ,QAAQ,OAAO;CAG/B,MAAM,GAAG,MAAM,KAAK,QAAQ,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;CAE5D,MAAM,gBAAgB,GAAG,WAAW,OAAO,YAAY,CAAC,CAAC,CAAC,SAAS,KAAK;CAExE,IAAI;EACF,MAAM,MAAM,KAAK,aAAa;EAE9B,IAAI;GACF,MAAM,GAAG,OAAO,eAAe,UAAU;EAC3C,SAAS,OAAO;GAGd,IAAI,CAAE,MAAM,WAAW,UAAU,GAAI,MAAM;EAC7C;CACF,UAAU;EACR,MAAM,GAAG,GAAG,eAAe,EAAE,OAAO,KAAK,CAAC;CAC5C;AACF"}
@@ -1,6 +1,7 @@
1
+ import { StorageDriverName } from "../../storage/types.mjs";
1
2
  import { GeneratedImageDescriptor } from "./image-variant-types.mjs";
2
3
 
3
- //#region ../core/src/http/uploads/generate-image-variants.d.ts
4
+ //#region ../../packages/core/src/http/uploads/generate-image-variants.d.ts
4
5
  /**
5
6
  * Options for `generateImageVariants`
6
7
  */
@@ -9,7 +10,9 @@ type GenerateImageVariantsOptions = {
9
10
  * Limit generation to these variant names, instead of every variant in
10
11
  * `uploads.images.variants`.
11
12
  */
12
- variants?: readonly string[];
13
+ variants?: readonly string[]; /** Disk holding the source; defaults to the active disk. */
14
+ disk?: StorageDriverName; /** Route prefix serving variants of this disk (and originals for local disks). Default /uploads. */
15
+ urlPrefix?: string;
13
16
  };
14
17
  /**
15
18
  * Render every configured variant of one uploaded image, right after it is
@@ -25,15 +28,15 @@ type GenerateImageVariantsOptions = {
25
28
  * The returned descriptor is plain JSON, safe to store next to the record
26
29
  * that owns the image, or to carry through loader data. On local storage the
27
30
  * `url`/`urls` already point at `uploadedFileController`; an app serving
28
- * uploads from object storage or a CDN should not proxy the remote files
29
- * through this route at all — store the descriptor once generation runs
30
- * against the same bucket the CDN serves from, or resolve its URLs through a
31
- * custom `ImageLoader` on the client instead.
31
+ * uploads from object storage use the driver URL for the original, and
32
+ * `options.urlPrefix` for the route serving locally cached derivatives.
33
+ * Ingest downloads a remote source once for all variants and formats.
34
+ * On-demand cache hits use ETag metadata; sources without ETags are hashed.
32
35
  *
33
36
  * @param relativePath - path of the saved upload, relative to the storage root
34
37
  * @param options.variants - limit generation to these variant names
35
- * @throws ImageVariantsConfigError when there is no local storage root, or
36
- * `uploads.images` is not configured — both are server misconfiguration, not
38
+ * @throws ImageVariantsConfigError when `uploads.images` is not
39
+ * configured — this is server misconfiguration, not
37
40
  * a bad request
38
41
  * @throws HttpError(400) when a name in `options.variants` is not declared in
39
42
  * `uploads.images.variants`
@@ -1 +1 @@
1
- {"version":3,"file":"generate-image-variants.d.mts","names":[],"sources":["../../../../../../../../core/src/http/uploads/generate-image-variants.ts"],"mappings":";;;;;AAsBA;KAAY,4BAAA;;;AAKF;AA8EV;EA9EE,QAAQ;AAAA;;;;;;;;;;;;AAiFyB;;;;;;;;;;;;;;;;;;;;;iBAHb,qBAAA,CACpB,YAAA,UACA,OAAA,GAAS,4BAAA,GACR,OAAA,CAAQ,wBAAA"}
1
+ {"version":3,"file":"generate-image-variants.d.mts","names":[],"sources":["../../../../../../../../../packages/core/src/http/uploads/generate-image-variants.ts"],"mappings":";;;;;;AAqCA;KAAY,4BAAA;;;;;EAKV,QAAA,sBAMA;EAHA,IAAA,GAAO,iBAAiB,EAGf;EAAT,SAAA;AAAA;;;;;;;;;;;;;AAuEiC;;;;;;;;;;;;;;;;;;;;iBAHb,qBAAA,CACpB,YAAA,UACA,OAAA,GAAS,4BAAA,GACR,OAAA,CAAQ,wBAAA"}