@warlock.js/core 5.29.0 → 5.31.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1818) hide show
  1. package/CHANGELOG.md +168 -4
  2. package/README.md +28 -23
  3. package/bin/source-load-hook.mjs +63 -0
  4. package/bin/warlock.js +102 -42
  5. package/esm/application/app.d.mts +1 -1
  6. package/esm/application/app.d.mts.map +1 -1
  7. package/esm/application/app.mjs +1 -1
  8. package/esm/application/app.mjs.map +1 -1
  9. package/esm/application/application-config-types.d.mts +1 -1
  10. package/esm/application/application-config-types.d.mts.map +1 -1
  11. package/esm/application/application.d.mts +1 -1
  12. package/esm/application/application.d.mts.map +1 -1
  13. package/esm/application/application.mjs +1 -1
  14. package/esm/application/application.mjs.map +1 -1
  15. package/esm/application/boot-signal.d.mts +1 -1
  16. package/esm/application/boot-signal.d.mts.map +1 -1
  17. package/esm/application/boot-signal.mjs +1 -1
  18. package/esm/application/boot-signal.mjs.map +1 -1
  19. package/esm/application/public-url.d.mts +1 -1
  20. package/esm/application/public-url.d.mts.map +1 -1
  21. package/esm/application/public-url.mjs +1 -1
  22. package/esm/application/public-url.mjs.map +1 -1
  23. package/esm/application/roles.d.mts +1 -1
  24. package/esm/application/roles.d.mts.map +1 -1
  25. package/esm/application/roles.mjs +1 -1
  26. package/esm/application/roles.mjs.map +1 -1
  27. package/esm/benchmark/benchmark-snapshots.d.mts +1 -1
  28. package/esm/benchmark/benchmark-snapshots.d.mts.map +1 -1
  29. package/esm/benchmark/benchmark-snapshots.mjs +1 -1
  30. package/esm/benchmark/benchmark-snapshots.mjs.map +1 -1
  31. package/esm/benchmark/benchmark.d.mts +1 -1
  32. package/esm/benchmark/benchmark.d.mts.map +1 -1
  33. package/esm/benchmark/benchmark.mjs +1 -1
  34. package/esm/benchmark/benchmark.mjs.map +1 -1
  35. package/esm/benchmark/channels/console.channel.d.mts +1 -1
  36. package/esm/benchmark/channels/console.channel.d.mts.map +1 -1
  37. package/esm/benchmark/channels/console.channel.mjs +1 -1
  38. package/esm/benchmark/channels/console.channel.mjs.map +1 -1
  39. package/esm/benchmark/channels/noop.channel.d.mts +1 -1
  40. package/esm/benchmark/channels/noop.channel.d.mts.map +1 -1
  41. package/esm/benchmark/channels/noop.channel.mjs +1 -1
  42. package/esm/benchmark/channels/noop.channel.mjs.map +1 -1
  43. package/esm/benchmark/profiler.d.mts +1 -1
  44. package/esm/benchmark/profiler.d.mts.map +1 -1
  45. package/esm/benchmark/profiler.mjs +1 -1
  46. package/esm/benchmark/profiler.mjs.map +1 -1
  47. package/esm/benchmark/types.d.mts +1 -1
  48. package/esm/benchmark/types.d.mts.map +1 -1
  49. package/esm/bootstrap/setup.d.mts +1 -1
  50. package/esm/bootstrap/setup.d.mts.map +1 -1
  51. package/esm/bootstrap/setup.mjs +1 -1
  52. package/esm/bootstrap/setup.mjs.map +1 -1
  53. package/esm/bootstrap.d.mts +1 -1
  54. package/esm/bootstrap.d.mts.map +1 -1
  55. package/esm/bootstrap.mjs +1 -1
  56. package/esm/bootstrap.mjs.map +1 -1
  57. package/esm/cache/database-cache-driver.d.mts +1 -1
  58. package/esm/cache/database-cache-driver.d.mts.map +1 -1
  59. package/esm/cache/database-cache-driver.mjs +1 -1
  60. package/esm/cache/database-cache-driver.mjs.map +1 -1
  61. package/esm/cache/index.mjs +1 -1
  62. package/esm/cache/index.mjs.map +1 -1
  63. package/esm/cli/cli-commands.manager.mjs +1 -1
  64. package/esm/cli/cli-commands.manager.mjs.map +1 -1
  65. package/esm/cli/cli-commands.utils.mjs +1 -1
  66. package/esm/cli/cli-commands.utils.mjs.map +1 -1
  67. package/esm/cli/commands/add.command.mjs +5 -3
  68. package/esm/cli/commands/add.command.mjs.map +1 -1
  69. package/esm/cli/commands/agents-md/agents-md-command.action.mjs +69 -0
  70. package/esm/cli/commands/agents-md/agents-md-command.action.mjs.map +1 -0
  71. package/esm/cli/commands/agents-md.command.mjs +38 -0
  72. package/esm/cli/commands/agents-md.command.mjs.map +1 -0
  73. package/esm/cli/commands/board/board-command.action.mjs +279 -0
  74. package/esm/cli/commands/board/board-command.action.mjs.map +1 -0
  75. package/esm/cli/commands/board.command.mjs +78 -0
  76. package/esm/cli/commands/board.command.mjs.map +1 -0
  77. package/esm/cli/commands/build.command.mjs +7 -2
  78. package/esm/cli/commands/build.command.mjs.map +1 -1
  79. package/esm/cli/commands/check/check-command.action.mjs +57 -0
  80. package/esm/cli/commands/check/check-command.action.mjs.map +1 -0
  81. package/esm/cli/commands/check/child-typecheck.mjs +66 -0
  82. package/esm/cli/commands/check/child-typecheck.mjs.map +1 -0
  83. package/esm/cli/commands/check/format-problems.mjs +43 -0
  84. package/esm/cli/commands/check/format-problems.mjs.map +1 -0
  85. package/esm/cli/commands/check/typecheck-command.action.mjs +61 -0
  86. package/esm/cli/commands/check/typecheck-command.action.mjs.map +1 -0
  87. package/esm/cli/commands/check.command.mjs +50 -0
  88. package/esm/cli/commands/check.command.mjs.map +1 -0
  89. package/esm/cli/commands/create-database.command.mjs +1 -1
  90. package/esm/cli/commands/create-database.command.mjs.map +1 -1
  91. package/esm/cli/commands/dev-server.command.mjs +10 -2
  92. package/esm/cli/commands/dev-server.command.mjs.map +1 -1
  93. package/esm/cli/commands/doctor/boot-for-diagnostics.mjs +9 -4
  94. package/esm/cli/commands/doctor/boot-for-diagnostics.mjs.map +1 -1
  95. package/esm/cli/commands/doctor/check.types.d.mts +76 -0
  96. package/esm/cli/commands/doctor/check.types.d.mts.map +1 -0
  97. package/esm/cli/commands/doctor/checks/config.check.mjs +2 -1
  98. package/esm/cli/commands/doctor/checks/config.check.mjs.map +1 -1
  99. package/esm/cli/commands/doctor/checks/connectors.check.mjs +3 -1
  100. package/esm/cli/commands/doctor/checks/connectors.check.mjs.map +1 -1
  101. package/esm/cli/commands/doctor/checks/handler-signature.check.mjs +2 -1
  102. package/esm/cli/commands/doctor/checks/handler-signature.check.mjs.map +1 -1
  103. package/esm/cli/commands/doctor/checks/health.check.mjs +4 -1
  104. package/esm/cli/commands/doctor/checks/health.check.mjs.map +1 -1
  105. package/esm/cli/commands/doctor/checks/index.mjs +1 -1
  106. package/esm/cli/commands/doctor/checks/index.mjs.map +1 -1
  107. package/esm/cli/commands/doctor/checks/jwt-secret.check.mjs +2 -1
  108. package/esm/cli/commands/doctor/checks/jwt-secret.check.mjs.map +1 -1
  109. package/esm/cli/commands/doctor/checks/locales-ts-deprecated.check.mjs +2 -1
  110. package/esm/cli/commands/doctor/checks/locales-ts-deprecated.check.mjs.map +1 -1
  111. package/esm/cli/commands/doctor/checks/optional-peers.check.mjs +2 -1
  112. package/esm/cli/commands/doctor/checks/optional-peers.check.mjs.map +1 -1
  113. package/esm/cli/commands/doctor/checks/release-hygiene.check.mjs +5 -1
  114. package/esm/cli/commands/doctor/checks/release-hygiene.check.mjs.map +1 -1
  115. package/esm/cli/commands/doctor/checks/routes.check.mjs +4 -1
  116. package/esm/cli/commands/doctor/checks/routes.check.mjs.map +1 -1
  117. package/esm/cli/commands/doctor/doctor-command.action.mjs +15 -7
  118. package/esm/cli/commands/doctor/doctor-command.action.mjs.map +1 -1
  119. package/esm/cli/commands/doctor/format-report.mjs +31 -3
  120. package/esm/cli/commands/doctor/format-report.mjs.map +1 -1
  121. package/esm/cli/commands/doctor/run-checks.mjs +1 -1
  122. package/esm/cli/commands/doctor/run-checks.mjs.map +1 -1
  123. package/esm/cli/commands/doctor.command.mjs +5 -1
  124. package/esm/cli/commands/doctor.command.mjs.map +1 -1
  125. package/esm/cli/commands/drop-tables.command.mjs +1 -1
  126. package/esm/cli/commands/drop-tables.command.mjs.map +1 -1
  127. package/esm/cli/commands/explain/explain-command.action.mjs +64 -0
  128. package/esm/cli/commands/explain/explain-command.action.mjs.map +1 -0
  129. package/esm/cli/commands/explain.command.mjs +23 -0
  130. package/esm/cli/commands/explain.command.mjs.map +1 -0
  131. package/esm/cli/commands/generate/generate.command.mjs +125 -125
  132. package/esm/cli/commands/generate/generate.command.mjs.map +1 -1
  133. package/esm/cli/commands/generate/generators/column-dsl-parser.mjs +1 -1
  134. package/esm/cli/commands/generate/generators/column-dsl-parser.mjs.map +1 -1
  135. package/esm/cli/commands/generate/generators/controller.generator.mjs +1 -1
  136. package/esm/cli/commands/generate/generators/controller.generator.mjs.map +1 -1
  137. package/esm/cli/commands/generate/generators/endpoint.generator.mjs +311 -0
  138. package/esm/cli/commands/generate/generators/endpoint.generator.mjs.map +1 -0
  139. package/esm/cli/commands/generate/generators/migration.generator.mjs +2 -2
  140. package/esm/cli/commands/generate/generators/migration.generator.mjs.map +1 -1
  141. package/esm/cli/commands/generate/generators/model.generator.mjs +2 -2
  142. package/esm/cli/commands/generate/generators/model.generator.mjs.map +1 -1
  143. package/esm/cli/commands/generate/generators/module.generator.mjs +1 -1
  144. package/esm/cli/commands/generate/generators/module.generator.mjs.map +1 -1
  145. package/esm/cli/commands/generate/generators/repository.generator.mjs +1 -1
  146. package/esm/cli/commands/generate/generators/repository.generator.mjs.map +1 -1
  147. package/esm/cli/commands/generate/generators/resource.generator.mjs +1 -1
  148. package/esm/cli/commands/generate/generators/resource.generator.mjs.map +1 -1
  149. package/esm/cli/commands/generate/generators/service.generator.mjs +1 -1
  150. package/esm/cli/commands/generate/generators/service.generator.mjs.map +1 -1
  151. package/esm/cli/commands/generate/generators/use-case.generator.mjs +1 -1
  152. package/esm/cli/commands/generate/generators/use-case.generator.mjs.map +1 -1
  153. package/esm/cli/commands/generate/templates/endpoint-stubs.mjs +341 -0
  154. package/esm/cli/commands/generate/templates/endpoint-stubs.mjs.map +1 -0
  155. package/esm/cli/commands/generate/templates/stubs.mjs +20 -7
  156. package/esm/cli/commands/generate/templates/stubs.mjs.map +1 -1
  157. package/esm/cli/commands/generate/utils/endpoint-schema.mjs +137 -0
  158. package/esm/cli/commands/generate/utils/endpoint-schema.mjs.map +1 -0
  159. package/esm/cli/commands/generate/utils/name-parser.mjs +2 -2
  160. package/esm/cli/commands/generate/utils/name-parser.mjs.map +1 -1
  161. package/esm/cli/commands/generate/utils/path-resolver.mjs +1 -1
  162. package/esm/cli/commands/generate/utils/path-resolver.mjs.map +1 -1
  163. package/esm/cli/commands/generate/utils/prompt.mjs +1 -1
  164. package/esm/cli/commands/generate/utils/prompt.mjs.map +1 -1
  165. package/esm/cli/commands/generate/utils/writer.mjs +39 -14
  166. package/esm/cli/commands/generate/utils/writer.mjs.map +1 -1
  167. package/esm/cli/commands/inspect/inspect-command.action.mjs +72 -0
  168. package/esm/cli/commands/inspect/inspect-command.action.mjs.map +1 -0
  169. package/esm/cli/commands/inspect.command.mjs +39 -0
  170. package/esm/cli/commands/inspect.command.mjs.map +1 -0
  171. package/esm/cli/commands/mcp/mcp-command.action.mjs +103 -0
  172. package/esm/cli/commands/mcp/mcp-command.action.mjs.map +1 -0
  173. package/esm/cli/commands/mcp.command.mjs +76 -0
  174. package/esm/cli/commands/mcp.command.mjs.map +1 -0
  175. package/esm/cli/commands/migrate.command.mjs +1 -1
  176. package/esm/cli/commands/migrate.command.mjs.map +1 -1
  177. package/esm/cli/commands/openapi-generator.action.mjs +1 -1
  178. package/esm/cli/commands/openapi-generator.action.mjs.map +1 -1
  179. package/esm/cli/commands/openapi-generator.command.mjs +1 -1
  180. package/esm/cli/commands/openapi-generator.command.mjs.map +1 -1
  181. package/esm/cli/commands/postman-generator.action.mjs +1 -1
  182. package/esm/cli/commands/postman-generator.action.mjs.map +1 -1
  183. package/esm/cli/commands/postman-generator.command.mjs +1 -1
  184. package/esm/cli/commands/postman-generator.command.mjs.map +1 -1
  185. package/esm/cli/commands/routes/diff-page-routes.mjs +1 -1
  186. package/esm/cli/commands/routes/diff-page-routes.mjs.map +1 -1
  187. package/esm/cli/commands/routes/format-routes-table.mjs +1 -1
  188. package/esm/cli/commands/routes/format-routes-table.mjs.map +1 -1
  189. package/esm/cli/commands/routes/route-row.mjs +1 -1
  190. package/esm/cli/commands/routes/route-row.mjs.map +1 -1
  191. package/esm/cli/commands/routes/routes-command.action.mjs +1 -1
  192. package/esm/cli/commands/routes/routes-command.action.mjs.map +1 -1
  193. package/esm/cli/commands/routes/routes-diff.action.mjs +2 -2
  194. package/esm/cli/commands/routes/routes-diff.action.mjs.map +1 -1
  195. package/esm/cli/commands/routes/with-console-on-stderr.mjs +1 -1
  196. package/esm/cli/commands/routes/with-console-on-stderr.mjs.map +1 -1
  197. package/esm/cli/commands/routes.command.mjs +1 -1
  198. package/esm/cli/commands/routes.command.mjs.map +1 -1
  199. package/esm/cli/commands/seed.command.mjs +1 -1
  200. package/esm/cli/commands/seed.command.mjs.map +1 -1
  201. package/esm/cli/commands/start-production.command.mjs +1 -1
  202. package/esm/cli/commands/start-production.command.mjs.map +1 -1
  203. package/esm/cli/commands/storage-put.action.mjs +1 -1
  204. package/esm/cli/commands/storage-put.action.mjs.map +1 -1
  205. package/esm/cli/commands/storage-put.command.mjs +1 -1
  206. package/esm/cli/commands/storage-put.command.mjs.map +1 -1
  207. package/esm/cli/commands/test.command.mjs +131 -0
  208. package/esm/cli/commands/test.command.mjs.map +1 -0
  209. package/esm/cli/commands/trace/trace-command.action.mjs +145 -0
  210. package/esm/cli/commands/trace/trace-command.action.mjs.map +1 -0
  211. package/esm/cli/commands/trace.command.mjs +60 -0
  212. package/esm/cli/commands/trace.command.mjs.map +1 -0
  213. package/esm/cli/commands/typecheck.command.mjs +40 -0
  214. package/esm/cli/commands/typecheck.command.mjs.map +1 -0
  215. package/esm/cli/commands/typings-generator.command.mjs +1 -1
  216. package/esm/cli/commands/typings-generator.command.mjs.map +1 -1
  217. package/esm/cli/commands/update.command.mjs +1 -1
  218. package/esm/cli/commands/update.command.mjs.map +1 -1
  219. package/esm/cli/commands/upgrade.command.mjs +46 -0
  220. package/esm/cli/commands/upgrade.command.mjs.map +1 -0
  221. package/esm/cli/commands-loader.mjs +1 -1
  222. package/esm/cli/commands-loader.mjs.map +1 -1
  223. package/esm/cli/flush-and-exit.mjs +34 -0
  224. package/esm/cli/flush-and-exit.mjs.map +1 -0
  225. package/esm/cli/framework-cli-commands.mjs +24 -2
  226. package/esm/cli/framework-cli-commands.mjs.map +1 -1
  227. package/esm/cli/parse-cli-args.mjs +2 -1
  228. package/esm/cli/parse-cli-args.mjs.map +1 -1
  229. package/esm/cli/start.mjs +1 -1
  230. package/esm/cli/start.mjs.map +1 -1
  231. package/esm/cli/string-similarity.mjs +1 -1
  232. package/esm/cli/string-similarity.mjs.map +1 -1
  233. package/esm/commands/cli-command.d.mts +1 -1
  234. package/esm/commands/cli-command.d.mts.map +1 -1
  235. package/esm/commands/cli-command.mjs +1 -1
  236. package/esm/commands/cli-command.mjs.map +1 -1
  237. package/esm/commands/types.d.mts +1 -1
  238. package/esm/commands/types.d.mts.map +1 -1
  239. package/esm/config/config-getter.d.mts +1 -1
  240. package/esm/config/config-getter.d.mts.map +1 -1
  241. package/esm/config/config-getter.mjs +1 -1
  242. package/esm/config/config-getter.mjs.map +1 -1
  243. package/esm/config/config-handlers.d.mts +1 -1
  244. package/esm/config/config-handlers.d.mts.map +1 -1
  245. package/esm/config/config-handlers.mjs +1 -1
  246. package/esm/config/config-handlers.mjs.map +1 -1
  247. package/esm/config/config-key-from-path.mjs +1 -1
  248. package/esm/config/config-key-from-path.mjs.map +1 -1
  249. package/esm/config/config-loader.d.mts +1 -1
  250. package/esm/config/config-loader.d.mts.map +1 -1
  251. package/esm/config/config-loader.mjs +35 -14
  252. package/esm/config/config-loader.mjs.map +1 -1
  253. package/esm/config/config-manager.mjs +1 -1
  254. package/esm/config/config-manager.mjs.map +1 -1
  255. package/esm/config/config-schema.d.mts +67 -0
  256. package/esm/config/config-schema.d.mts.map +1 -0
  257. package/esm/config/config-schema.mjs +77 -0
  258. package/esm/config/config-schema.mjs.map +1 -0
  259. package/esm/config/config-setter.d.mts +1 -1
  260. package/esm/config/config-setter.d.mts.map +1 -1
  261. package/esm/config/config-setter.mjs +1 -1
  262. package/esm/config/config-setter.mjs.map +1 -1
  263. package/esm/config/config-special-handlers.d.mts +1 -1
  264. package/esm/config/config-special-handlers.d.mts.map +1 -1
  265. package/esm/config/config-special-handlers.mjs +1 -1
  266. package/esm/config/config-special-handlers.mjs.map +1 -1
  267. package/esm/config/index.d.mts +6 -0
  268. package/esm/config/index.mjs +1 -0
  269. package/esm/config/load-config-files.mjs +1 -1
  270. package/esm/config/load-config-files.mjs.map +1 -1
  271. package/esm/config/locale-configuration.mjs +1 -1
  272. package/esm/config/locale-configuration.mjs.map +1 -1
  273. package/esm/config/types.d.mts +1 -1
  274. package/esm/config/types.d.mts.map +1 -1
  275. package/esm/connectors/access-connector.d.mts +1 -1
  276. package/esm/connectors/access-connector.d.mts.map +1 -1
  277. package/esm/connectors/access-connector.mjs +1 -1
  278. package/esm/connectors/access-connector.mjs.map +1 -1
  279. package/esm/connectors/ai-connector.d.mts +1 -1
  280. package/esm/connectors/ai-connector.d.mts.map +1 -1
  281. package/esm/connectors/ai-connector.mjs +1 -1
  282. package/esm/connectors/ai-connector.mjs.map +1 -1
  283. package/esm/connectors/assert-no-reserved-connector-names.d.mts +1 -1
  284. package/esm/connectors/assert-no-reserved-connector-names.d.mts.map +1 -1
  285. package/esm/connectors/assert-no-reserved-connector-names.mjs +3 -2
  286. package/esm/connectors/assert-no-reserved-connector-names.mjs.map +1 -1
  287. package/esm/connectors/assert-unique-connector-names.d.mts +1 -1
  288. package/esm/connectors/assert-unique-connector-names.d.mts.map +1 -1
  289. package/esm/connectors/assert-unique-connector-names.mjs +27 -3
  290. package/esm/connectors/assert-unique-connector-names.mjs.map +1 -1
  291. package/esm/connectors/base-connector.d.mts +1 -1
  292. package/esm/connectors/base-connector.d.mts.map +1 -1
  293. package/esm/connectors/base-connector.mjs +1 -1
  294. package/esm/connectors/base-connector.mjs.map +1 -1
  295. package/esm/connectors/cache-connector.d.mts +1 -1
  296. package/esm/connectors/cache-connector.d.mts.map +1 -1
  297. package/esm/connectors/cache-connector.mjs +1 -1
  298. package/esm/connectors/cache-connector.mjs.map +1 -1
  299. package/esm/connectors/connectors-manager.d.mts +1 -1
  300. package/esm/connectors/connectors-manager.d.mts.map +1 -1
  301. package/esm/connectors/connectors-manager.mjs +2 -2
  302. package/esm/connectors/connectors-manager.mjs.map +1 -1
  303. package/esm/connectors/database-connector.d.mts +1 -1
  304. package/esm/connectors/database-connector.d.mts.map +1 -1
  305. package/esm/connectors/database-connector.mjs +1 -1
  306. package/esm/connectors/database-connector.mjs.map +1 -1
  307. package/esm/connectors/describe-server-address.mjs +1 -1
  308. package/esm/connectors/describe-server-address.mjs.map +1 -1
  309. package/esm/connectors/herald-connector.d.mts +1 -1
  310. package/esm/connectors/herald-connector.d.mts.map +1 -1
  311. package/esm/connectors/herald-connector.mjs +1 -1
  312. package/esm/connectors/herald-connector.mjs.map +1 -1
  313. package/esm/connectors/http-connector.d.mts +1 -1
  314. package/esm/connectors/http-connector.d.mts.map +1 -1
  315. package/esm/connectors/http-connector.mjs +4 -3
  316. package/esm/connectors/http-connector.mjs.map +1 -1
  317. package/esm/connectors/logger-connector.d.mts +1 -1
  318. package/esm/connectors/logger-connector.d.mts.map +1 -1
  319. package/esm/connectors/logger-connector.mjs +1 -1
  320. package/esm/connectors/logger-connector.mjs.map +1 -1
  321. package/esm/connectors/mail-connector.d.mts +1 -1
  322. package/esm/connectors/mail-connector.d.mts.map +1 -1
  323. package/esm/connectors/mail-connector.mjs +1 -1
  324. package/esm/connectors/mail-connector.mjs.map +1 -1
  325. package/esm/connectors/notifications-connector.d.mts +1 -1
  326. package/esm/connectors/notifications-connector.d.mts.map +1 -1
  327. package/esm/connectors/notifications-connector.mjs +1 -1
  328. package/esm/connectors/notifications-connector.mjs.map +1 -1
  329. package/esm/connectors/read-bound-port.mjs +1 -1
  330. package/esm/connectors/read-bound-port.mjs.map +1 -1
  331. package/esm/connectors/register-configured-connectors.d.mts +1 -1
  332. package/esm/connectors/register-configured-connectors.d.mts.map +1 -1
  333. package/esm/connectors/register-configured-connectors.mjs +1 -1
  334. package/esm/connectors/register-configured-connectors.mjs.map +1 -1
  335. package/esm/connectors/single-server-warnings.mjs +1 -1
  336. package/esm/connectors/single-server-warnings.mjs.map +1 -1
  337. package/esm/connectors/socket-connector.d.mts +1 -1
  338. package/esm/connectors/socket-connector.d.mts.map +1 -1
  339. package/esm/connectors/socket-connector.mjs +1 -1
  340. package/esm/connectors/socket-connector.mjs.map +1 -1
  341. package/esm/connectors/storage.connector.d.mts +1 -1
  342. package/esm/connectors/storage.connector.d.mts.map +1 -1
  343. package/esm/connectors/storage.connector.mjs +1 -1
  344. package/esm/connectors/storage.connector.mjs.map +1 -1
  345. package/esm/connectors/types.d.mts +1 -1
  346. package/esm/connectors/types.d.mts.map +1 -1
  347. package/esm/connectors/types.mjs +1 -1
  348. package/esm/connectors/types.mjs.map +1 -1
  349. package/esm/container/container-instance-registry.mjs +1 -1
  350. package/esm/container/container-instance-registry.mjs.map +1 -1
  351. package/esm/container/development-app-modules.d.mts +1 -1
  352. package/esm/container/development-app-modules.d.mts.map +1 -1
  353. package/esm/container/development-model-modules.d.mts +1 -1
  354. package/esm/container/development-model-modules.d.mts.map +1 -1
  355. package/esm/container/index.d.mts +1 -1
  356. package/esm/container/index.d.mts.map +1 -1
  357. package/esm/container/index.mjs +1 -1
  358. package/esm/container/index.mjs.map +1 -1
  359. package/esm/database/create-database-action.mjs +1 -1
  360. package/esm/database/create-database-action.mjs.map +1 -1
  361. package/esm/database/drop-tables-action.mjs +1 -1
  362. package/esm/database/drop-tables-action.mjs.map +1 -1
  363. package/esm/database/migrate-action.mjs +1 -1
  364. package/esm/database/migrate-action.mjs.map +1 -1
  365. package/esm/database/models/database-log/database-log.d.mts +3 -39
  366. package/esm/database/models/database-log/database-log.d.mts.map +1 -1
  367. package/esm/database/models/database-log/database-log.mjs +1 -1
  368. package/esm/database/models/database-log/database-log.mjs.map +1 -1
  369. package/esm/database/pending-exit-code.mjs +1 -1
  370. package/esm/database/pending-exit-code.mjs.map +1 -1
  371. package/esm/database/resolve-pending-migrations.mjs +1 -1
  372. package/esm/database/resolve-pending-migrations.mjs.map +1 -1
  373. package/esm/database/seed-command-action.mjs +1 -1
  374. package/esm/database/seed-command-action.mjs.map +1 -1
  375. package/esm/database/seeds/seed-records-table-migration.mjs +1 -1
  376. package/esm/database/seeds/seed-records-table-migration.mjs.map +1 -1
  377. package/esm/database/seeds/seeder.d.mts +1 -1
  378. package/esm/database/seeds/seeder.d.mts.map +1 -1
  379. package/esm/database/seeds/seeder.errors.d.mts +5 -1
  380. package/esm/database/seeds/seeder.errors.d.mts.map +1 -1
  381. package/esm/database/seeds/seeder.errors.mjs +3 -1
  382. package/esm/database/seeds/seeder.errors.mjs.map +1 -1
  383. package/esm/database/seeds/seeder.mjs +1 -1
  384. package/esm/database/seeds/seeder.mjs.map +1 -1
  385. package/esm/database/seeds/seeders.manager.mjs +1 -1
  386. package/esm/database/seeds/seeders.manager.mjs.map +1 -1
  387. package/esm/database/seeds/seeds-table-migration.mjs +1 -1
  388. package/esm/database/seeds/seeds-table-migration.mjs.map +1 -1
  389. package/esm/database/seeds/types.d.mts +1 -1
  390. package/esm/database/seeds/types.d.mts.map +1 -1
  391. package/esm/database/seeds/utils.mjs +1 -1
  392. package/esm/database/seeds/utils.mjs.map +1 -1
  393. package/esm/database/utils.d.mts +1 -1
  394. package/esm/database/utils.d.mts.map +1 -1
  395. package/esm/database/utils.mjs +1 -1
  396. package/esm/database/utils.mjs.map +1 -1
  397. package/esm/dev-server/app-module-registry.mjs +1 -1
  398. package/esm/dev-server/app-module-registry.mjs.map +1 -1
  399. package/esm/dev-server/boot-precondition-error.mjs +2 -1
  400. package/esm/dev-server/boot-precondition-error.mjs.map +1 -1
  401. package/esm/dev-server/build-development-openapi-document.mjs +1 -1
  402. package/esm/dev-server/build-development-openapi-document.mjs.map +1 -1
  403. package/esm/dev-server/check-for-updates.mjs +1 -1
  404. package/esm/dev-server/check-for-updates.mjs.map +1 -1
  405. package/esm/dev-server/collect-development-api-routes.mjs +1 -1
  406. package/esm/dev-server/collect-development-api-routes.mjs.map +1 -1
  407. package/esm/dev-server/create-worker.mjs +16 -10
  408. package/esm/dev-server/create-worker.mjs.map +1 -1
  409. package/esm/dev-server/dependency-graph.d.mts +1 -1
  410. package/esm/dev-server/dependency-graph.d.mts.map +1 -1
  411. package/esm/dev-server/dependency-graph.mjs +1 -1
  412. package/esm/dev-server/dependency-graph.mjs.map +1 -1
  413. package/esm/dev-server/dev-agent-tooling.mjs +135 -0
  414. package/esm/dev-server/dev-agent-tooling.mjs.map +1 -0
  415. package/esm/dev-server/dev-logger.mjs +1 -1
  416. package/esm/dev-server/dev-logger.mjs.map +1 -1
  417. package/esm/dev-server/development-server.mjs +9 -1
  418. package/esm/dev-server/development-server.mjs.map +1 -1
  419. package/esm/dev-server/events.mjs +1 -1
  420. package/esm/dev-server/events.mjs.map +1 -1
  421. package/esm/dev-server/extract-translation-keys.mjs +1 -1
  422. package/esm/dev-server/extract-translation-keys.mjs.map +1 -1
  423. package/esm/dev-server/file-event-handler.mjs +1 -1
  424. package/esm/dev-server/file-event-handler.mjs.map +1 -1
  425. package/esm/dev-server/file-manager.d.mts +1 -1
  426. package/esm/dev-server/file-manager.d.mts.map +1 -1
  427. package/esm/dev-server/file-manager.mjs +1 -1
  428. package/esm/dev-server/file-manager.mjs.map +1 -1
  429. package/esm/dev-server/file-operations.d.mts +1 -1
  430. package/esm/dev-server/file-operations.d.mts.map +1 -1
  431. package/esm/dev-server/file-operations.mjs +1 -1
  432. package/esm/dev-server/file-operations.mjs.map +1 -1
  433. package/esm/dev-server/files-orchestrator.mjs +22 -20
  434. package/esm/dev-server/files-orchestrator.mjs.map +1 -1
  435. package/esm/dev-server/files-watcher.mjs +2 -2
  436. package/esm/dev-server/files-watcher.mjs.map +1 -1
  437. package/esm/dev-server/flags.mjs +1 -1
  438. package/esm/dev-server/flags.mjs.map +1 -1
  439. package/esm/dev-server/health-checker/checkers/base-health-checker.mjs +1 -1
  440. package/esm/dev-server/health-checker/checkers/base-health-checker.mjs.map +1 -1
  441. package/esm/dev-server/health-checker/checkers/eslint-health-checker.mjs +3 -4
  442. package/esm/dev-server/health-checker/checkers/eslint-health-checker.mjs.map +1 -1
  443. package/esm/dev-server/health-checker/checkers/oxlint-health-checker.mjs +33 -0
  444. package/esm/dev-server/health-checker/checkers/oxlint-health-checker.mjs.map +1 -0
  445. package/esm/dev-server/health-checker/checkers/typescript-health-checker.mjs +1 -1
  446. package/esm/dev-server/health-checker/checkers/typescript-health-checker.mjs.map +1 -1
  447. package/esm/dev-server/health-checker/default-health-checkers.mjs +31 -0
  448. package/esm/dev-server/health-checker/default-health-checkers.mjs.map +1 -0
  449. package/esm/dev-server/health-checker/file-health-checker.contract.d.mts +10 -4
  450. package/esm/dev-server/health-checker/file-health-checker.contract.d.mts.map +1 -1
  451. package/esm/dev-server/health-checker/file-health-result.d.mts +1 -1
  452. package/esm/dev-server/health-checker/file-health-result.d.mts.map +1 -1
  453. package/esm/dev-server/health-checker/file-health-result.mjs +1 -1
  454. package/esm/dev-server/health-checker/file-health-result.mjs.map +1 -1
  455. package/esm/dev-server/health-checker/files-healthcare.manager.mjs +16 -5
  456. package/esm/dev-server/health-checker/files-healthcare.manager.mjs.map +1 -1
  457. package/esm/dev-server/health-checker/oxlint-runner.mjs +302 -0
  458. package/esm/dev-server/health-checker/oxlint-runner.mjs.map +1 -0
  459. package/esm/dev-server/health-checker/workers/eslint-health.worker.mjs +1 -1
  460. package/esm/dev-server/health-checker/workers/eslint-health.worker.mjs.map +1 -1
  461. package/esm/dev-server/health-checker/workers/oxlint-health.worker.d.mts +1 -0
  462. package/esm/dev-server/health-checker/workers/oxlint-health.worker.mjs +42 -0
  463. package/esm/dev-server/health-checker/workers/oxlint-health.worker.mjs.map +1 -0
  464. package/esm/dev-server/health-checker/workers/ts-health.worker.mjs +1 -1
  465. package/esm/dev-server/health-checker/workers/ts-health.worker.mjs.map +1 -1
  466. package/esm/dev-server/layer-executor.mjs +1 -1
  467. package/esm/dev-server/layer-executor.mjs.map +1 -1
  468. package/esm/dev-server/legacy-locales-warning.mjs +1 -1
  469. package/esm/dev-server/legacy-locales-warning.mjs.map +1 -1
  470. package/esm/dev-server/loader/build-transpile-init.mjs +1 -1
  471. package/esm/dev-server/loader/build-transpile-init.mjs.map +1 -1
  472. package/esm/dev-server/loader/hook-thread.d.mts +1 -1
  473. package/esm/dev-server/loader/hook-thread.d.mts.map +1 -1
  474. package/esm/dev-server/loader/hook-thread.mjs +1 -1
  475. package/esm/dev-server/loader/hook-thread.mjs.map +1 -1
  476. package/esm/dev-server/loader/load-hook.d.mts +1 -1
  477. package/esm/dev-server/loader/load-hook.d.mts.map +1 -1
  478. package/esm/dev-server/loader/load-hook.mjs +1 -1
  479. package/esm/dev-server/loader/load-hook.mjs.map +1 -1
  480. package/esm/dev-server/loader/loader-port-acks.mjs +34 -0
  481. package/esm/dev-server/loader/loader-port-acks.mjs.map +1 -0
  482. package/esm/dev-server/loader/own-resolver.mjs +1 -1
  483. package/esm/dev-server/loader/own-resolver.mjs.map +1 -1
  484. package/esm/dev-server/loader/register-loader.mjs +2 -2
  485. package/esm/dev-server/loader/register-loader.mjs.map +1 -1
  486. package/esm/dev-server/loader/resolve-capture.mjs +1 -1
  487. package/esm/dev-server/loader/resolve-capture.mjs.map +1 -1
  488. package/esm/dev-server/loader/resolve-hook.d.mts +1 -1
  489. package/esm/dev-server/loader/resolve-hook.d.mts.map +1 -1
  490. package/esm/dev-server/loader/resolve-hook.mjs +1 -1
  491. package/esm/dev-server/loader/resolve-hook.mjs.map +1 -1
  492. package/esm/dev-server/loader/source-slug.mjs +1 -1
  493. package/esm/dev-server/loader/source-slug.mjs.map +1 -1
  494. package/esm/dev-server/loader/transpile-cache.mjs +2 -2
  495. package/esm/dev-server/loader/transpile-cache.mjs.map +1 -1
  496. package/esm/dev-server/loader/version-registry.mjs +1 -1
  497. package/esm/dev-server/loader/version-registry.mjs.map +1 -1
  498. package/esm/dev-server/manifest-manager.d.mts +1 -1
  499. package/esm/dev-server/manifest-manager.d.mts.map +1 -1
  500. package/esm/dev-server/manifest-manager.mjs +1 -1
  501. package/esm/dev-server/manifest-manager.mjs.map +1 -1
  502. package/esm/dev-server/model-module-registry.mjs +1 -1
  503. package/esm/dev-server/model-module-registry.mjs.map +1 -1
  504. package/esm/dev-server/model-resource-typings.mjs +1 -1
  505. package/esm/dev-server/model-resource-typings.mjs.map +1 -1
  506. package/esm/dev-server/module-loader.mjs +2 -1
  507. package/esm/dev-server/module-loader.mjs.map +1 -1
  508. package/esm/dev-server/package-json-manager.mjs +1 -1
  509. package/esm/dev-server/package-json-manager.mjs.map +1 -1
  510. package/esm/dev-server/parse-imports.mjs +74 -7
  511. package/esm/dev-server/parse-imports.mjs.map +1 -1
  512. package/esm/dev-server/read-config-ast.mjs +1 -1
  513. package/esm/dev-server/read-config-ast.mjs.map +1 -1
  514. package/esm/dev-server/ready-block.mjs +1 -1
  515. package/esm/dev-server/ready-block.mjs.map +1 -1
  516. package/esm/dev-server/register-dev-shortcuts.mjs +1 -1
  517. package/esm/dev-server/register-dev-shortcuts.mjs.map +1 -1
  518. package/esm/dev-server/register-installed-devtools.mjs +1 -1
  519. package/esm/dev-server/register-installed-devtools.mjs.map +1 -1
  520. package/esm/dev-server/restart-dev-server.mjs +1 -1
  521. package/esm/dev-server/restart-dev-server.mjs.map +1 -1
  522. package/esm/dev-server/route-types-publisher.mjs +2 -2
  523. package/esm/dev-server/route-types-publisher.mjs.map +1 -1
  524. package/esm/dev-server/run-connector-typings.mjs +1 -1
  525. package/esm/dev-server/run-connector-typings.mjs.map +1 -1
  526. package/esm/dev-server/run-typings-generation.mjs +1 -1
  527. package/esm/dev-server/run-typings-generation.mjs.map +1 -1
  528. package/esm/dev-server/shortcuts.mjs +1 -1
  529. package/esm/dev-server/shortcuts.mjs.map +1 -1
  530. package/esm/dev-server/special-file-patterns.mjs +1 -1
  531. package/esm/dev-server/special-file-patterns.mjs.map +1 -1
  532. package/esm/dev-server/special-files-collector.d.mts +1 -1
  533. package/esm/dev-server/special-files-collector.d.mts.map +1 -1
  534. package/esm/dev-server/special-files-collector.mjs +1 -1
  535. package/esm/dev-server/special-files-collector.mjs.map +1 -1
  536. package/esm/dev-server/start-development-server.mjs +1 -1
  537. package/esm/dev-server/start-development-server.mjs.map +1 -1
  538. package/esm/dev-server/supervisor.mjs +1 -1
  539. package/esm/dev-server/supervisor.mjs.map +1 -1
  540. package/esm/dev-server/translation-keys-sources.mjs +2 -2
  541. package/esm/dev-server/translation-keys-sources.mjs.map +1 -1
  542. package/esm/dev-server/tsconfig-manager.mjs +1 -1
  543. package/esm/dev-server/tsconfig-manager.mjs.map +1 -1
  544. package/esm/dev-server/type-generator.mjs +33 -12
  545. package/esm/dev-server/type-generator.mjs.map +1 -1
  546. package/esm/dev-server/types.d.mts +1 -1
  547. package/esm/dev-server/types.d.mts.map +1 -1
  548. package/esm/dev-server/update-check-cache.mjs +1 -1
  549. package/esm/dev-server/update-check-cache.mjs.map +1 -1
  550. package/esm/dev-server/utils.mjs +1 -1
  551. package/esm/dev-server/utils.mjs.map +1 -1
  552. package/esm/encryption/encrypt.d.mts +1 -1
  553. package/esm/encryption/encrypt.d.mts.map +1 -1
  554. package/esm/encryption/encrypt.mjs +1 -1
  555. package/esm/encryption/encrypt.mjs.map +1 -1
  556. package/esm/encryption/hash.d.mts +1 -1
  557. package/esm/encryption/hash.d.mts.map +1 -1
  558. package/esm/encryption/hash.mjs +1 -1
  559. package/esm/encryption/hash.mjs.map +1 -1
  560. package/esm/encryption/password.d.mts +1 -1
  561. package/esm/encryption/password.d.mts.map +1 -1
  562. package/esm/encryption/password.mjs +1 -1
  563. package/esm/encryption/password.mjs.map +1 -1
  564. package/esm/encryption/types.d.mts +1 -1
  565. package/esm/encryption/types.d.mts.map +1 -1
  566. package/esm/errors/container-key-missing-error.mjs +2 -1
  567. package/esm/errors/container-key-missing-error.mjs.map +1 -1
  568. package/esm/errors/error-codes.d.mts +653 -0
  569. package/esm/errors/error-codes.d.mts.map +1 -0
  570. package/esm/errors/error-codes.mjs +634 -0
  571. package/esm/errors/error-codes.mjs.map +1 -0
  572. package/esm/errors/esbuild-binary-missing-error.mjs +2 -1
  573. package/esm/errors/esbuild-binary-missing-error.mjs.map +1 -1
  574. package/esm/errors/index.d.mts +4 -0
  575. package/esm/errors/index.mjs +5 -0
  576. package/esm/errors/unknown-locale-error.mjs +2 -1
  577. package/esm/errors/unknown-locale-error.mjs.map +1 -1
  578. package/esm/errors/warlock-error.d.mts +23 -0
  579. package/esm/errors/warlock-error.d.mts.map +1 -0
  580. package/esm/errors/warlock-error.mjs +22 -0
  581. package/esm/errors/warlock-error.mjs.map +1 -0
  582. package/esm/generations/add-command.action.mjs +48 -9
  583. package/esm/generations/add-command.action.mjs.map +1 -1
  584. package/esm/generations/features/access.feature.mjs +2 -2
  585. package/esm/generations/features/access.feature.mjs.map +1 -1
  586. package/esm/generations/features/ai-anthropic.feature.mjs +1 -1
  587. package/esm/generations/features/ai-anthropic.feature.mjs.map +1 -1
  588. package/esm/generations/features/ai-bedrock.feature.mjs +1 -1
  589. package/esm/generations/features/ai-bedrock.feature.mjs.map +1 -1
  590. package/esm/generations/features/ai-google.feature.mjs +1 -1
  591. package/esm/generations/features/ai-google.feature.mjs.map +1 -1
  592. package/esm/generations/features/ai-ollama.feature.mjs +1 -1
  593. package/esm/generations/features/ai-ollama.feature.mjs.map +1 -1
  594. package/esm/generations/features/ai-openai.feature.mjs +1 -1
  595. package/esm/generations/features/ai-openai.feature.mjs.map +1 -1
  596. package/esm/generations/features/ai-panoptic.feature.mjs +1 -1
  597. package/esm/generations/features/ai-panoptic.feature.mjs.map +1 -1
  598. package/esm/generations/features/ai-tools.feature.mjs +1 -1
  599. package/esm/generations/features/ai-tools.feature.mjs.map +1 -1
  600. package/esm/generations/features/ai-workspace.feature.mjs +1 -1
  601. package/esm/generations/features/ai-workspace.feature.mjs.map +1 -1
  602. package/esm/generations/features/ai.feature.mjs +1 -1
  603. package/esm/generations/features/ai.feature.mjs.map +1 -1
  604. package/esm/generations/features/auth-google.feature.mjs +1 -1
  605. package/esm/generations/features/auth-google.feature.mjs.map +1 -1
  606. package/esm/generations/features/auth-passkeys.feature.mjs +1 -1
  607. package/esm/generations/features/auth-passkeys.feature.mjs.map +1 -1
  608. package/esm/generations/features/bull-board.feature.mjs +2 -2
  609. package/esm/generations/features/bull-board.feature.mjs.map +1 -1
  610. package/esm/generations/features/devtools.feature.mjs +1 -1
  611. package/esm/generations/features/devtools.feature.mjs.map +1 -1
  612. package/esm/generations/features/herald.feature.mjs +1 -1
  613. package/esm/generations/features/herald.feature.mjs.map +1 -1
  614. package/esm/generations/features/image.feature.mjs +1 -1
  615. package/esm/generations/features/image.feature.mjs.map +1 -1
  616. package/esm/generations/features/index.mjs +1 -1
  617. package/esm/generations/features/index.mjs.map +1 -1
  618. package/esm/generations/features/mail.feature.mjs +1 -1
  619. package/esm/generations/features/mail.feature.mjs.map +1 -1
  620. package/esm/generations/features/mongodb.feature.mjs +1 -1
  621. package/esm/generations/features/mongodb.feature.mjs.map +1 -1
  622. package/esm/generations/features/mysql.feature.mjs +1 -1
  623. package/esm/generations/features/mysql.feature.mjs.map +1 -1
  624. package/esm/generations/features/notifications.feature.mjs +124 -17
  625. package/esm/generations/features/notifications.feature.mjs.map +1 -1
  626. package/esm/generations/features/postgres.feature.mjs +1 -1
  627. package/esm/generations/features/postgres.feature.mjs.map +1 -1
  628. package/esm/generations/features/queue.feature.mjs +2 -2
  629. package/esm/generations/features/queue.feature.mjs.map +1 -1
  630. package/esm/generations/features/react-email.feature.mjs +2 -2
  631. package/esm/generations/features/react-email.feature.mjs.map +1 -1
  632. package/esm/generations/features/react.feature.mjs +1 -1
  633. package/esm/generations/features/react.feature.mjs.map +1 -1
  634. package/esm/generations/features/redis.feature.mjs +1 -1
  635. package/esm/generations/features/redis.feature.mjs.map +1 -1
  636. package/esm/generations/features/s3.feature.mjs +1 -1
  637. package/esm/generations/features/s3.feature.mjs.map +1 -1
  638. package/esm/generations/features/scheduler.feature.mjs +1 -1
  639. package/esm/generations/features/scheduler.feature.mjs.map +1 -1
  640. package/esm/generations/features/ses.feature.mjs +1 -1
  641. package/esm/generations/features/ses.feature.mjs.map +1 -1
  642. package/esm/generations/features/shadcn.feature.mjs +2 -2
  643. package/esm/generations/features/shadcn.feature.mjs.map +1 -1
  644. package/esm/generations/features/shared/insert-connector-entry.mjs +1 -1
  645. package/esm/generations/features/shared/insert-connector-entry.mjs.map +1 -1
  646. package/esm/generations/features/shared/insert-queue-dashboard-block.mjs +1 -1
  647. package/esm/generations/features/shared/insert-queue-dashboard-block.mjs.map +1 -1
  648. package/esm/generations/features/shared/link-ai-package-import.mjs +2 -2
  649. package/esm/generations/features/shared/link-ai-package-import.mjs.map +1 -1
  650. package/esm/generations/features/shared/merge-web-sitemap-config.mjs +1 -1
  651. package/esm/generations/features/shared/merge-web-sitemap-config.mjs.map +1 -1
  652. package/esm/generations/features/shared/migration-timestamp.mjs +1 -1
  653. package/esm/generations/features/shared/migration-timestamp.mjs.map +1 -1
  654. package/esm/generations/features/shared/patch-tsconfig-include.mjs +2 -2
  655. package/esm/generations/features/shared/patch-tsconfig-include.mjs.map +1 -1
  656. package/esm/generations/features/shared/relocate-conflicting-home-route.mjs +2 -2
  657. package/esm/generations/features/shared/relocate-conflicting-home-route.mjs.map +1 -1
  658. package/esm/generations/features/shared/resolve-contact-scaffold.mjs +1 -1
  659. package/esm/generations/features/shared/resolve-contact-scaffold.mjs.map +1 -1
  660. package/esm/generations/features/sitemap.feature.mjs +2 -2
  661. package/esm/generations/features/sitemap.feature.mjs.map +1 -1
  662. package/esm/generations/features/socket.feature.mjs +1 -1
  663. package/esm/generations/features/socket.feature.mjs.map +1 -1
  664. package/esm/generations/features/tailwind.feature.mjs +2 -2
  665. package/esm/generations/features/tailwind.feature.mjs.map +1 -1
  666. package/esm/generations/features/test.feature.mjs +12 -7
  667. package/esm/generations/features/test.feature.mjs.map +1 -1
  668. package/esm/generations/features/types.mjs +1 -1
  669. package/esm/generations/features/types.mjs.map +1 -1
  670. package/esm/generations/features/web.feature.mjs +2 -2
  671. package/esm/generations/features/web.feature.mjs.map +1 -1
  672. package/esm/generations/generation-fs.mjs +73 -0
  673. package/esm/generations/generation-fs.mjs.map +1 -0
  674. package/esm/generations/generation-run.mjs +185 -0
  675. package/esm/generations/generation-run.mjs.map +1 -0
  676. package/esm/generations/pnpm-build-approvals.mjs +89 -3
  677. package/esm/generations/pnpm-build-approvals.mjs.map +1 -1
  678. package/esm/generations/stubs.mjs +327 -79
  679. package/esm/generations/stubs.mjs.map +1 -1
  680. package/esm/http/boot-port-preflight.d.mts +1 -1
  681. package/esm/http/boot-port-preflight.d.mts.map +1 -1
  682. package/esm/http/boot-port-preflight.mjs +1 -1
  683. package/esm/http/boot-port-preflight.mjs.map +1 -1
  684. package/esm/http/bounded-stream-queue.d.mts +10 -0
  685. package/esm/http/bounded-stream-queue.d.mts.map +1 -0
  686. package/esm/http/bounded-stream-queue.mjs +97 -0
  687. package/esm/http/bounded-stream-queue.mjs.map +1 -0
  688. package/esm/http/build-cors-options.mjs +1 -1
  689. package/esm/http/build-cors-options.mjs.map +1 -1
  690. package/esm/http/build-rate-limit-options.d.mts +35 -1
  691. package/esm/http/build-rate-limit-options.d.mts.map +1 -1
  692. package/esm/http/build-rate-limit-options.mjs +7 -1
  693. package/esm/http/build-rate-limit-options.mjs.map +1 -1
  694. package/esm/http/conditional-request.d.mts +86 -0
  695. package/esm/http/conditional-request.d.mts.map +1 -0
  696. package/esm/http/conditional-request.mjs +121 -0
  697. package/esm/http/conditional-request.mjs.map +1 -0
  698. package/esm/http/config.d.mts +1 -1
  699. package/esm/http/config.d.mts.map +1 -1
  700. package/esm/http/config.mjs +1 -1
  701. package/esm/http/config.mjs.map +1 -1
  702. package/esm/http/context/request-context.d.mts +1 -1
  703. package/esm/http/context/request-context.d.mts.map +1 -1
  704. package/esm/http/context/request-context.mjs +1 -1
  705. package/esm/http/context/request-context.mjs.map +1 -1
  706. package/esm/http/context/request-memo.d.mts +1 -1
  707. package/esm/http/context/request-memo.d.mts.map +1 -1
  708. package/esm/http/context/request-memo.mjs +1 -1
  709. package/esm/http/context/request-memo.mjs.map +1 -1
  710. package/esm/http/createHttpApplication.d.mts +1 -1
  711. package/esm/http/createHttpApplication.d.mts.map +1 -1
  712. package/esm/http/createHttpApplication.mjs +1 -1
  713. package/esm/http/createHttpApplication.mjs.map +1 -1
  714. package/esm/http/csp.d.mts +3 -1
  715. package/esm/http/csp.d.mts.map +1 -1
  716. package/esm/http/csp.mjs +2 -1
  717. package/esm/http/csp.mjs.map +1 -1
  718. package/esm/http/csrf-default-guard.d.mts +1 -1
  719. package/esm/http/csrf-default-guard.d.mts.map +1 -1
  720. package/esm/http/csrf-default-guard.mjs +1 -1
  721. package/esm/http/csrf-default-guard.mjs.map +1 -1
  722. package/esm/http/csrf-origin-policy.d.mts +1 -1
  723. package/esm/http/csrf-origin-policy.d.mts.map +1 -1
  724. package/esm/http/csrf-origin-policy.mjs +1 -1
  725. package/esm/http/csrf-origin-policy.mjs.map +1 -1
  726. package/esm/http/database/RequestLog.d.mts +27 -135
  727. package/esm/http/database/RequestLog.d.mts.map +1 -1
  728. package/esm/http/database/RequestLog.mjs +1 -1
  729. package/esm/http/database/RequestLog.mjs.map +1 -1
  730. package/esm/http/error-codes.d.mts +1 -1
  731. package/esm/http/error-codes.d.mts.map +1 -1
  732. package/esm/http/error-codes.mjs +1 -1
  733. package/esm/http/error-codes.mjs.map +1 -1
  734. package/esm/http/error-mapper.d.mts +48 -0
  735. package/esm/http/error-mapper.d.mts.map +1 -0
  736. package/esm/http/error-mapper.mjs +48 -0
  737. package/esm/http/error-mapper.mjs.map +1 -0
  738. package/esm/http/errors/errors.d.mts +3 -1
  739. package/esm/http/errors/errors.d.mts.map +1 -1
  740. package/esm/http/errors/errors.mjs +2 -1
  741. package/esm/http/errors/errors.mjs.map +1 -1
  742. package/esm/http/escape-header-value.d.mts +18 -0
  743. package/esm/http/escape-header-value.d.mts.map +1 -0
  744. package/esm/http/escape-header-value.mjs +27 -0
  745. package/esm/http/escape-header-value.mjs.map +1 -0
  746. package/esm/http/events.d.mts +1 -1
  747. package/esm/http/events.d.mts.map +1 -1
  748. package/esm/http/events.mjs +1 -1
  749. package/esm/http/events.mjs.map +1 -1
  750. package/esm/http/flush-pending-cookies.mjs +1 -1
  751. package/esm/http/flush-pending-cookies.mjs.map +1 -1
  752. package/esm/http/health.d.mts +1 -1
  753. package/esm/http/health.d.mts.map +1 -1
  754. package/esm/http/health.mjs +1 -1
  755. package/esm/http/health.mjs.map +1 -1
  756. package/esm/http/index.d.mts +13 -6
  757. package/esm/http/index.mjs +12 -6
  758. package/esm/http/lazy-static.mjs +194 -0
  759. package/esm/http/lazy-static.mjs.map +1 -0
  760. package/esm/http/middleware/cache-response-middleware.d.mts +1 -1
  761. package/esm/http/middleware/cache-response-middleware.d.mts.map +1 -1
  762. package/esm/http/middleware/cache-response-middleware.mjs +1 -1
  763. package/esm/http/middleware/cache-response-middleware.mjs.map +1 -1
  764. package/esm/http/middleware/concurrency-limit.middleware.d.mts +1 -1
  765. package/esm/http/middleware/concurrency-limit.middleware.d.mts.map +1 -1
  766. package/esm/http/middleware/concurrency-limit.middleware.mjs +1 -1
  767. package/esm/http/middleware/concurrency-limit.middleware.mjs.map +1 -1
  768. package/esm/http/middleware/idempotency.middleware.d.mts +1 -1
  769. package/esm/http/middleware/idempotency.middleware.d.mts.map +1 -1
  770. package/esm/http/middleware/idempotency.middleware.mjs +1 -1
  771. package/esm/http/middleware/idempotency.middleware.mjs.map +1 -1
  772. package/esm/http/middleware/inject-request-context.d.mts +1 -1
  773. package/esm/http/middleware/inject-request-context.d.mts.map +1 -1
  774. package/esm/http/middleware/inject-request-context.mjs +4 -2
  775. package/esm/http/middleware/inject-request-context.mjs.map +1 -1
  776. package/esm/http/middleware/ip-filter.middleware.d.mts +1 -1
  777. package/esm/http/middleware/ip-filter.middleware.d.mts.map +1 -1
  778. package/esm/http/middleware/ip-filter.middleware.mjs +1 -1
  779. package/esm/http/middleware/ip-filter.middleware.mjs.map +1 -1
  780. package/esm/http/middleware/maintenance.middleware.d.mts +1 -1
  781. package/esm/http/middleware/maintenance.middleware.d.mts.map +1 -1
  782. package/esm/http/middleware/maintenance.middleware.mjs +1 -1
  783. package/esm/http/middleware/maintenance.middleware.mjs.map +1 -1
  784. package/esm/http/middleware/max-body-size.middleware.d.mts +1 -1
  785. package/esm/http/middleware/max-body-size.middleware.d.mts.map +1 -1
  786. package/esm/http/middleware/max-body-size.middleware.mjs +1 -1
  787. package/esm/http/middleware/max-body-size.middleware.mjs.map +1 -1
  788. package/esm/http/middleware/middleware-list.d.mts +1 -1
  789. package/esm/http/middleware/middleware-list.d.mts.map +1 -1
  790. package/esm/http/middleware/middleware-list.mjs +1 -1
  791. package/esm/http/middleware/middleware-list.mjs.map +1 -1
  792. package/esm/http/middleware/rate-limit.middleware.d.mts +20 -5
  793. package/esm/http/middleware/rate-limit.middleware.d.mts.map +1 -1
  794. package/esm/http/middleware/rate-limit.middleware.mjs +34 -12
  795. package/esm/http/middleware/rate-limit.middleware.mjs.map +1 -1
  796. package/esm/http/middleware/utils/cidr-match.d.mts +1 -1
  797. package/esm/http/middleware/utils/cidr-match.d.mts.map +1 -1
  798. package/esm/http/middleware/utils/cidr-match.mjs +1 -1
  799. package/esm/http/middleware/utils/cidr-match.mjs.map +1 -1
  800. package/esm/http/middleware/utils/idempotency-key.d.mts +1 -1
  801. package/esm/http/middleware/utils/idempotency-key.d.mts.map +1 -1
  802. package/esm/http/middleware/utils/idempotency-key.mjs +1 -1
  803. package/esm/http/middleware/utils/idempotency-key.mjs.map +1 -1
  804. package/esm/http/middleware/utils/parse-size.d.mts +1 -1
  805. package/esm/http/middleware/utils/parse-size.d.mts.map +1 -1
  806. package/esm/http/middleware/utils/parse-size.mjs +1 -1
  807. package/esm/http/middleware/utils/parse-size.mjs.map +1 -1
  808. package/esm/http/parse-urlencoded-body.mjs +1 -1
  809. package/esm/http/parse-urlencoded-body.mjs.map +1 -1
  810. package/esm/http/plugins.d.mts +9 -2
  811. package/esm/http/plugins.d.mts.map +1 -1
  812. package/esm/http/plugins.mjs +23 -6
  813. package/esm/http/plugins.mjs.map +1 -1
  814. package/esm/http/port-preflight.d.mts +1 -1
  815. package/esm/http/port-preflight.d.mts.map +1 -1
  816. package/esm/http/port-preflight.mjs +1 -1
  817. package/esm/http/port-preflight.mjs.map +1 -1
  818. package/esm/http/rate-limit-cache-store.mjs +156 -0
  819. package/esm/http/rate-limit-cache-store.mjs.map +1 -0
  820. package/esm/http/ready-report.d.mts +1 -1
  821. package/esm/http/ready-report.d.mts.map +1 -1
  822. package/esm/http/ready-report.mjs +1 -1
  823. package/esm/http/ready-report.mjs.map +1 -1
  824. package/esm/http/request-controller.d.mts +1 -1
  825. package/esm/http/request-controller.d.mts.map +1 -1
  826. package/esm/http/request-controller.mjs +1 -1
  827. package/esm/http/request-controller.mjs.map +1 -1
  828. package/esm/http/request-log-snapshot.d.mts +130 -0
  829. package/esm/http/request-log-snapshot.d.mts.map +1 -0
  830. package/esm/http/request-log-snapshot.mjs +220 -0
  831. package/esm/http/request-log-snapshot.mjs.map +1 -0
  832. package/esm/http/request.d.mts +43 -4
  833. package/esm/http/request.d.mts.map +1 -1
  834. package/esm/http/request.mjs +70 -6
  835. package/esm/http/request.mjs.map +1 -1
  836. package/esm/http/resolve-bind-port.mjs +1 -1
  837. package/esm/http/resolve-bind-port.mjs.map +1 -1
  838. package/esm/http/response.d.mts +51 -9
  839. package/esm/http/response.d.mts.map +1 -1
  840. package/esm/http/response.mjs +301 -101
  841. package/esm/http/response.mjs.map +1 -1
  842. package/esm/http/safe-redirect.d.mts +51 -0
  843. package/esm/http/safe-redirect.d.mts.map +1 -0
  844. package/esm/http/safe-redirect.mjs +80 -0
  845. package/esm/http/safe-redirect.mjs.map +1 -0
  846. package/esm/http/serialized.d.mts +1 -1
  847. package/esm/http/serialized.d.mts.map +1 -1
  848. package/esm/http/server-rebuilt.d.mts +1 -1
  849. package/esm/http/server-rebuilt.d.mts.map +1 -1
  850. package/esm/http/server-rebuilt.mjs +1 -1
  851. package/esm/http/server-rebuilt.mjs.map +1 -1
  852. package/esm/http/server.d.mts +36 -6
  853. package/esm/http/server.d.mts.map +1 -1
  854. package/esm/http/server.mjs +80 -5
  855. package/esm/http/server.mjs.map +1 -1
  856. package/esm/http/stream-react-response.d.mts +1 -1
  857. package/esm/http/stream-react-response.d.mts.map +1 -1
  858. package/esm/http/stream-react-response.mjs +1 -1
  859. package/esm/http/stream-react-response.mjs.map +1 -1
  860. package/esm/http/stream-transport.mjs +77 -0
  861. package/esm/http/stream-transport.mjs.map +1 -0
  862. package/esm/http/tracing/trace-id.d.mts +1 -1
  863. package/esm/http/tracing/trace-id.d.mts.map +1 -1
  864. package/esm/http/tracing/trace-id.mjs +1 -1
  865. package/esm/http/tracing/trace-id.mjs.map +1 -1
  866. package/esm/http/tracing/tracing-dispatcher.d.mts +1 -1
  867. package/esm/http/tracing/tracing-dispatcher.d.mts.map +1 -1
  868. package/esm/http/tracing/tracing-dispatcher.mjs +1 -1
  869. package/esm/http/tracing/tracing-dispatcher.mjs.map +1 -1
  870. package/esm/http/tracing/tracing.type.d.mts +1 -1
  871. package/esm/http/tracing/tracing.type.d.mts.map +1 -1
  872. package/esm/http/types.d.mts +165 -7
  873. package/esm/http/types.d.mts.map +1 -1
  874. package/esm/http/uploaded-file.d.mts +2 -2
  875. package/esm/http/uploaded-file.d.mts.map +1 -1
  876. package/esm/http/uploaded-file.mjs +2 -2
  877. package/esm/http/uploaded-file.mjs.map +1 -1
  878. package/esm/http/uploads/detect-image-format.mjs +1 -1
  879. package/esm/http/uploads/detect-image-format.mjs.map +1 -1
  880. package/esm/http/uploads/generate-image-variant.mjs +2 -2
  881. package/esm/http/uploads/generate-image-variant.mjs.map +1 -1
  882. package/esm/http/uploads/generate-image-variants.d.mts +11 -8
  883. package/esm/http/uploads/generate-image-variants.d.mts.map +1 -1
  884. package/esm/http/uploads/generate-image-variants.mjs +75 -30
  885. package/esm/http/uploads/generate-image-variants.mjs.map +1 -1
  886. package/esm/http/uploads/image-variant-cache-entries.mjs +78 -0
  887. package/esm/http/uploads/image-variant-cache-entries.mjs.map +1 -0
  888. package/esm/http/uploads/image-variant-cache.mjs +185 -0
  889. package/esm/http/uploads/image-variant-cache.mjs.map +1 -0
  890. package/esm/http/uploads/image-variant-types.d.mts +3 -1
  891. package/esm/http/uploads/image-variant-types.d.mts.map +1 -1
  892. package/esm/http/uploads/image-variants-config-error.d.mts +4 -2
  893. package/esm/http/uploads/image-variants-config-error.d.mts.map +1 -1
  894. package/esm/http/uploads/image-variants-config-error.mjs +4 -3
  895. package/esm/http/uploads/image-variants-config-error.mjs.map +1 -1
  896. package/esm/http/uploads/index.d.mts +3 -1
  897. package/esm/http/uploads/index.mjs +3 -1
  898. package/esm/http/uploads/is-path-inside.mjs +1 -1
  899. package/esm/http/uploads/is-path-inside.mjs.map +1 -1
  900. package/esm/http/uploads/load-variant-source.mjs +2 -2
  901. package/esm/http/uploads/load-variant-source.mjs.map +1 -1
  902. package/esm/http/uploads/local-disk-root.mjs +24 -0
  903. package/esm/http/uploads/local-disk-root.mjs.map +1 -0
  904. package/esm/http/uploads/parse-uploaded-file-query.mjs +1 -1
  905. package/esm/http/uploads/parse-uploaded-file-query.mjs.map +1 -1
  906. package/esm/http/uploads/purge-image-variants.d.mts +37 -0
  907. package/esm/http/uploads/purge-image-variants.d.mts.map +1 -0
  908. package/esm/http/uploads/purge-image-variants.mjs +46 -0
  909. package/esm/http/uploads/purge-image-variants.mjs.map +1 -0
  910. package/esm/http/uploads/read-file-head.mjs +1 -1
  911. package/esm/http/uploads/read-file-head.mjs.map +1 -1
  912. package/esm/http/uploads/remote-variant-source.mjs +115 -0
  913. package/esm/http/uploads/remote-variant-source.mjs.map +1 -0
  914. package/esm/http/uploads/resolve-image-variant.d.mts +72 -0
  915. package/esm/http/uploads/resolve-image-variant.d.mts.map +1 -0
  916. package/esm/http/uploads/resolve-image-variant.mjs +99 -0
  917. package/esm/http/uploads/resolve-image-variant.mjs.map +1 -0
  918. package/esm/http/uploads/resolve-image-variants-config.mjs +6 -4
  919. package/esm/http/uploads/resolve-image-variants-config.mjs.map +1 -1
  920. package/esm/http/uploads/resolve-inline-image-content-type.mjs +1 -1
  921. package/esm/http/uploads/resolve-inline-image-content-type.mjs.map +1 -1
  922. package/esm/http/uploads/resolve-original-content-type.mjs +1 -1
  923. package/esm/http/uploads/resolve-original-content-type.mjs.map +1 -1
  924. package/esm/http/uploads/resolve-remote-image-variant.mjs +89 -0
  925. package/esm/http/uploads/resolve-remote-image-variant.mjs.map +1 -0
  926. package/esm/http/uploads/resolve-upload-path.mjs +3 -2
  927. package/esm/http/uploads/resolve-upload-path.mjs.map +1 -1
  928. package/esm/http/uploads/resolve-variant-candidate.mjs +1 -1
  929. package/esm/http/uploads/resolve-variant-candidate.mjs.map +1 -1
  930. package/esm/http/uploads/single-flight.mjs +1 -1
  931. package/esm/http/uploads/single-flight.mjs.map +1 -1
  932. package/esm/http/uploads/trim-image-variant-cache.mjs +193 -0
  933. package/esm/http/uploads/trim-image-variant-cache.mjs.map +1 -0
  934. package/esm/http/uploads/uploaded-file.controller.d.mts +27 -7
  935. package/esm/http/uploads/uploaded-file.controller.d.mts.map +1 -1
  936. package/esm/http/uploads/uploaded-file.controller.mjs +72 -92
  937. package/esm/http/uploads/uploaded-file.controller.mjs.map +1 -1
  938. package/esm/http/uploads/variant-cache-key.mjs +31 -6
  939. package/esm/http/uploads/variant-cache-key.mjs.map +1 -1
  940. package/esm/http/uploads/variant-generations.mjs +1 -1
  941. package/esm/http/uploads/variant-generations.mjs.map +1 -1
  942. package/esm/http/uploads-config.d.mts +1 -1
  943. package/esm/http/uploads-config.d.mts.map +1 -1
  944. package/esm/http/uploads-config.mjs +1 -1
  945. package/esm/http/uploads-config.mjs.map +1 -1
  946. package/esm/http/uploads-types.d.mts +7 -3
  947. package/esm/http/uploads-types.d.mts.map +1 -1
  948. package/esm/http/xmlable.d.mts +1 -1
  949. package/esm/http/xmlable.d.mts.map +1 -1
  950. package/esm/image/image.d.mts +1 -1
  951. package/esm/image/image.d.mts.map +1 -1
  952. package/esm/image/image.mjs +1 -1
  953. package/esm/image/image.mjs.map +1 -1
  954. package/esm/index.d.mts +27 -12
  955. package/esm/index.mjs +23 -9
  956. package/esm/loader/app-module-importer.d.mts +1 -1
  957. package/esm/loader/app-module-importer.d.mts.map +1 -1
  958. package/esm/loader/app-module-importer.mjs +1 -1
  959. package/esm/loader/app-module-importer.mjs.map +1 -1
  960. package/esm/localization/parse-locale-dictionary.d.mts +3 -1
  961. package/esm/localization/parse-locale-dictionary.d.mts.map +1 -1
  962. package/esm/localization/parse-locale-dictionary.mjs +2 -1
  963. package/esm/localization/parse-locale-dictionary.mjs.map +1 -1
  964. package/esm/localization/register-locale-dictionary.d.mts +1 -1
  965. package/esm/localization/register-locale-dictionary.d.mts.map +1 -1
  966. package/esm/localization/register-locale-dictionary.mjs +1 -1
  967. package/esm/localization/register-locale-dictionary.mjs.map +1 -1
  968. package/esm/logger/fatal-visibility.d.mts +1 -1
  969. package/esm/logger/fatal-visibility.d.mts.map +1 -1
  970. package/esm/logger/fatal-visibility.mjs +1 -1
  971. package/esm/logger/fatal-visibility.mjs.map +1 -1
  972. package/esm/logger/logger.d.mts +1 -1
  973. package/esm/logger/logger.d.mts.map +1 -1
  974. package/esm/logger/logger.mjs +1 -1
  975. package/esm/logger/logger.mjs.map +1 -1
  976. package/esm/logger/types.d.mts +1 -1
  977. package/esm/logger/types.d.mts.map +1 -1
  978. package/esm/mail/config.d.mts +13 -2
  979. package/esm/mail/config.d.mts.map +1 -1
  980. package/esm/mail/config.mjs +17 -2
  981. package/esm/mail/config.mjs.map +1 -1
  982. package/esm/mail/events.d.mts +1 -1
  983. package/esm/mail/events.d.mts.map +1 -1
  984. package/esm/mail/events.mjs +1 -1
  985. package/esm/mail/events.mjs.map +1 -1
  986. package/esm/mail/index.d.mts +1 -1
  987. package/esm/mail/index.mjs +1 -1
  988. package/esm/mail/mail.d.mts +1 -1
  989. package/esm/mail/mail.d.mts.map +1 -1
  990. package/esm/mail/mail.mjs +1 -1
  991. package/esm/mail/mail.mjs.map +1 -1
  992. package/esm/mail/mailer-pool.d.mts +1 -1
  993. package/esm/mail/mailer-pool.d.mts.map +1 -1
  994. package/esm/mail/mailer-pool.mjs +1 -1
  995. package/esm/mail/mailer-pool.mjs.map +1 -1
  996. package/esm/mail/react-mail.d.mts +1 -1
  997. package/esm/mail/react-mail.d.mts.map +1 -1
  998. package/esm/mail/react-mail.mjs +1 -1
  999. package/esm/mail/react-mail.mjs.map +1 -1
  1000. package/esm/mail/send-mail.d.mts +1 -1
  1001. package/esm/mail/send-mail.d.mts.map +1 -1
  1002. package/esm/mail/send-mail.mjs +7 -7
  1003. package/esm/mail/send-mail.mjs.map +1 -1
  1004. package/esm/mail/test-mailbox.d.mts +1 -1
  1005. package/esm/mail/test-mailbox.d.mts.map +1 -1
  1006. package/esm/mail/test-mailbox.mjs +1 -1
  1007. package/esm/mail/test-mailbox.mjs.map +1 -1
  1008. package/esm/mail/types.d.mts +1 -1
  1009. package/esm/mail/types.d.mts.map +1 -1
  1010. package/esm/mail/types.mjs +1 -1
  1011. package/esm/mail/types.mjs.map +1 -1
  1012. package/esm/manifest/manifest-manager.mjs +1 -1
  1013. package/esm/manifest/manifest-manager.mjs.map +1 -1
  1014. package/esm/net/index.d.mts +2 -0
  1015. package/esm/net/index.mjs +3 -0
  1016. package/esm/openapi/build-openapi-document.d.mts +1 -1
  1017. package/esm/openapi/build-openapi-document.d.mts.map +1 -1
  1018. package/esm/openapi/build-openapi-document.mjs +9 -6
  1019. package/esm/openapi/build-openapi-document.mjs.map +1 -1
  1020. package/esm/openapi/cast-schema.mjs +1 -1
  1021. package/esm/openapi/cast-schema.mjs.map +1 -1
  1022. package/esm/openapi/collect-openapi-document.mjs +1 -1
  1023. package/esm/openapi/collect-openapi-document.mjs.map +1 -1
  1024. package/esm/openapi/development-openapi-provider.d.mts +1 -1
  1025. package/esm/openapi/development-openapi-provider.d.mts.map +1 -1
  1026. package/esm/openapi/development-openapi-provider.mjs +1 -1
  1027. package/esm/openapi/development-openapi-provider.mjs.map +1 -1
  1028. package/esm/openapi/error-responses.mjs +29 -3
  1029. package/esm/openapi/error-responses.mjs.map +1 -1
  1030. package/esm/openapi/openapi-child-output.mjs +1 -1
  1031. package/esm/openapi/openapi-child-output.mjs.map +1 -1
  1032. package/esm/openapi/openapi-protocol.mjs +1 -1
  1033. package/esm/openapi/openapi-protocol.mjs.map +1 -1
  1034. package/esm/openapi/paths.mjs +1 -1
  1035. package/esm/openapi/paths.mjs.map +1 -1
  1036. package/esm/openapi/postman/build-request-body.mjs +1 -1
  1037. package/esm/openapi/postman/build-request-body.mjs.map +1 -1
  1038. package/esm/openapi/postman/build-request-url.mjs +1 -1
  1039. package/esm/openapi/postman/build-request-url.mjs.map +1 -1
  1040. package/esm/openapi/postman/build-saved-responses.mjs +1 -1
  1041. package/esm/openapi/postman/build-saved-responses.mjs.map +1 -1
  1042. package/esm/openapi/postman/example-from-schema.d.mts +1 -1
  1043. package/esm/openapi/postman/example-from-schema.d.mts.map +1 -1
  1044. package/esm/openapi/postman/example-from-schema.mjs +1 -1
  1045. package/esm/openapi/postman/example-from-schema.mjs.map +1 -1
  1046. package/esm/openapi/postman/http-status-text.mjs +1 -1
  1047. package/esm/openapi/postman/http-status-text.mjs.map +1 -1
  1048. package/esm/openapi/postman/openapi-to-postman-collection.d.mts +1 -1
  1049. package/esm/openapi/postman/openapi-to-postman-collection.d.mts.map +1 -1
  1050. package/esm/openapi/postman/openapi-to-postman-collection.mjs +1 -1
  1051. package/esm/openapi/postman/openapi-to-postman-collection.mjs.map +1 -1
  1052. package/esm/openapi/postman/postman-types.d.mts +1 -1
  1053. package/esm/openapi/postman/postman-types.d.mts.map +1 -1
  1054. package/esm/openapi/postman/resolve-operation-auth.mjs +1 -1
  1055. package/esm/openapi/postman/resolve-operation-auth.mjs.map +1 -1
  1056. package/esm/openapi/postman/schema-refs.d.mts +1 -1
  1057. package/esm/openapi/postman/schema-refs.d.mts.map +1 -1
  1058. package/esm/openapi/postman/schema-refs.mjs +1 -1
  1059. package/esm/openapi/postman/schema-refs.mjs.map +1 -1
  1060. package/esm/openapi/postman/uuid-v5.mjs +1 -1
  1061. package/esm/openapi/postman/uuid-v5.mjs.map +1 -1
  1062. package/esm/openapi/request-schemas.mjs +1 -1
  1063. package/esm/openapi/request-schemas.mjs.map +1 -1
  1064. package/esm/openapi/response-schemas.mjs +1 -1
  1065. package/esm/openapi/response-schemas.mjs.map +1 -1
  1066. package/esm/openapi/schema-registry.d.mts +1 -0
  1067. package/esm/openapi/schema-registry.mjs +1 -1
  1068. package/esm/openapi/schema-registry.mjs.map +1 -1
  1069. package/esm/openapi/security.mjs +1 -1
  1070. package/esm/openapi/security.mjs.map +1 -1
  1071. package/esm/openapi/types.d.mts +4 -3
  1072. package/esm/openapi/types.d.mts.map +1 -1
  1073. package/esm/production/assert-dist-ready-to-start.mjs +1 -1
  1074. package/esm/production/assert-dist-ready-to-start.mjs.map +1 -1
  1075. package/esm/production/assert-generated-imports.mjs +2 -1
  1076. package/esm/production/assert-generated-imports.mjs.map +1 -1
  1077. package/esm/production/build-app-production.mjs +1 -1
  1078. package/esm/production/build-app-production.mjs.map +1 -1
  1079. package/esm/production/build-contributions.mjs +1 -1
  1080. package/esm/production/build-contributions.mjs.map +1 -1
  1081. package/esm/production/bundle-framework-dependencies.mjs +1 -1
  1082. package/esm/production/bundle-framework-dependencies.mjs.map +1 -1
  1083. package/esm/production/dist-build-manifest.mjs +1 -1
  1084. package/esm/production/dist-build-manifest.mjs.map +1 -1
  1085. package/esm/production/esbuild-plugins.mjs +1 -1
  1086. package/esm/production/esbuild-plugins.mjs.map +1 -1
  1087. package/esm/production/esbuild-preflight.mjs +1 -1
  1088. package/esm/production/esbuild-preflight.mjs.map +1 -1
  1089. package/esm/production/production-builder.mjs +13 -5
  1090. package/esm/production/production-builder.mjs.map +1 -1
  1091. package/esm/production/production-supervisor.mjs +1 -1
  1092. package/esm/production/production-supervisor.mjs.map +1 -1
  1093. package/esm/production/promote-dist.mjs +1 -1
  1094. package/esm/production/promote-dist.mjs.map +1 -1
  1095. package/esm/production/registration-child-runner.mjs +1 -1
  1096. package/esm/production/registration-child-runner.mjs.map +1 -1
  1097. package/esm/production/resolve-build-config.d.mts +1 -1
  1098. package/esm/production/resolve-build-config.d.mts.map +1 -1
  1099. package/esm/production/resolve-build-config.mjs +2 -1
  1100. package/esm/production/resolve-build-config.mjs.map +1 -1
  1101. package/esm/production/route-registration-child.mjs +1 -1
  1102. package/esm/production/route-registration-child.mjs.map +1 -1
  1103. package/esm/production/route-registration-snapshot.mjs +1 -1
  1104. package/esm/production/route-registration-snapshot.mjs.map +1 -1
  1105. package/esm/production/tsconfig-path-aliases.mjs +1 -1
  1106. package/esm/production/tsconfig-path-aliases.mjs.map +1 -1
  1107. package/esm/react/index.d.mts +1 -1
  1108. package/esm/react/index.d.mts.map +1 -1
  1109. package/esm/react/index.mjs +1 -1
  1110. package/esm/react/index.mjs.map +1 -1
  1111. package/esm/repositories/adapters/cascade/cascade-adapter.d.mts +1 -1
  1112. package/esm/repositories/adapters/cascade/cascade-adapter.d.mts.map +1 -1
  1113. package/esm/repositories/adapters/cascade/cascade-adapter.mjs +1 -1
  1114. package/esm/repositories/adapters/cascade/cascade-adapter.mjs.map +1 -1
  1115. package/esm/repositories/adapters/cascade/cascade-query-builder.d.mts +1 -1
  1116. package/esm/repositories/adapters/cascade/cascade-query-builder.d.mts.map +1 -1
  1117. package/esm/repositories/adapters/cascade/cascade-query-builder.mjs +1 -1
  1118. package/esm/repositories/adapters/cascade/cascade-query-builder.mjs.map +1 -1
  1119. package/esm/repositories/adapters/cascade/filter-applicator.mjs +1 -1
  1120. package/esm/repositories/adapters/cascade/filter-applicator.mjs.map +1 -1
  1121. package/esm/repositories/contracts/query-builder.contract.d.mts +1 -1
  1122. package/esm/repositories/contracts/query-builder.contract.d.mts.map +1 -1
  1123. package/esm/repositories/contracts/repository-adapter.contract.d.mts +1 -1
  1124. package/esm/repositories/contracts/repository-adapter.contract.d.mts.map +1 -1
  1125. package/esm/repositories/contracts/types.d.mts +1 -1
  1126. package/esm/repositories/contracts/types.d.mts.map +1 -1
  1127. package/esm/repositories/repository.manager.d.mts +1 -1
  1128. package/esm/repositories/repository.manager.d.mts.map +1 -1
  1129. package/esm/repositories/repository.manager.mjs +1 -1
  1130. package/esm/repositories/repository.manager.mjs.map +1 -1
  1131. package/esm/resource/define-resource.d.mts +1 -1
  1132. package/esm/resource/define-resource.d.mts.map +1 -1
  1133. package/esm/resource/define-resource.mjs +1 -1
  1134. package/esm/resource/define-resource.mjs.map +1 -1
  1135. package/esm/resource/nullable-resource.d.mts +1 -1
  1136. package/esm/resource/nullable-resource.d.mts.map +1 -1
  1137. package/esm/resource/nullable-resource.mjs +1 -1
  1138. package/esm/resource/nullable-resource.mjs.map +1 -1
  1139. package/esm/resource/register-resource.d.mts +1 -1
  1140. package/esm/resource/register-resource.d.mts.map +1 -1
  1141. package/esm/resource/register-resource.mjs +1 -1
  1142. package/esm/resource/register-resource.mjs.map +1 -1
  1143. package/esm/resource/resource-field-builder.d.mts +1 -1
  1144. package/esm/resource/resource-field-builder.d.mts.map +1 -1
  1145. package/esm/resource/resource-field-builder.mjs +1 -1
  1146. package/esm/resource/resource-field-builder.mjs.map +1 -1
  1147. package/esm/resource/resource.d.mts +1 -1
  1148. package/esm/resource/resource.d.mts.map +1 -1
  1149. package/esm/resource/resource.mjs +1 -1
  1150. package/esm/resource/resource.mjs.map +1 -1
  1151. package/esm/resource/types.d.mts +1 -1
  1152. package/esm/resource/types.d.mts.map +1 -1
  1153. package/esm/restful/restful.d.mts +6 -6
  1154. package/esm/restful/restful.d.mts.map +1 -1
  1155. package/esm/restful/restful.mjs +1 -1
  1156. package/esm/restful/restful.mjs.map +1 -1
  1157. package/esm/router/build-route-rate-limit.mjs +1 -1
  1158. package/esm/router/build-route-rate-limit.mjs.map +1 -1
  1159. package/esm/router/describe-route-for-log.mjs +1 -1
  1160. package/esm/router/describe-route-for-log.mjs.map +1 -1
  1161. package/esm/router/dev-dispatch.mjs +32 -13
  1162. package/esm/router/dev-dispatch.mjs.map +1 -1
  1163. package/esm/router/index.d.mts +4 -2
  1164. package/esm/router/index.mjs +2 -0
  1165. package/esm/router/log-request-lifecycle.mjs +1 -1
  1166. package/esm/router/log-request-lifecycle.mjs.map +1 -1
  1167. package/esm/router/named-api-routes-with-responses.mjs +1 -1
  1168. package/esm/router/named-api-routes-with-responses.mjs.map +1 -1
  1169. package/esm/router/normalize-request-path.d.mts +1 -1
  1170. package/esm/router/normalize-request-path.d.mts.map +1 -1
  1171. package/esm/router/normalize-request-path.mjs +1 -1
  1172. package/esm/router/normalize-request-path.mjs.map +1 -1
  1173. package/esm/router/normalize-route-path.d.mts +1 -1
  1174. package/esm/router/normalize-route-path.d.mts.map +1 -1
  1175. package/esm/router/normalize-route-path.mjs +1 -1
  1176. package/esm/router/normalize-route-path.mjs.map +1 -1
  1177. package/esm/router/positional-handler-diagnostics.d.mts +1 -1
  1178. package/esm/router/positional-handler-diagnostics.d.mts.map +1 -1
  1179. package/esm/router/positional-handler-diagnostics.mjs +1 -1
  1180. package/esm/router/positional-handler-diagnostics.mjs.map +1 -1
  1181. package/esm/router/resolve-route-rate-limit.mjs +47 -0
  1182. package/esm/router/resolve-route-rate-limit.mjs.map +1 -0
  1183. package/esm/router/resolve-route-validation.mjs +19 -0
  1184. package/esm/router/resolve-route-validation.mjs.map +1 -0
  1185. package/esm/router/response-schema-types.mjs +1 -1
  1186. package/esm/router/response-schema-types.mjs.map +1 -1
  1187. package/esm/router/route-builder.d.mts +1 -1
  1188. package/esm/router/route-builder.d.mts.map +1 -1
  1189. package/esm/router/route-builder.mjs +1 -1
  1190. package/esm/router/route-builder.mjs.map +1 -1
  1191. package/esm/router/route-guard-names.mjs +30 -0
  1192. package/esm/router/route-guard-names.mjs.map +1 -0
  1193. package/esm/router/route-name-method-suffix.d.mts +1 -1
  1194. package/esm/router/route-name-method-suffix.d.mts.map +1 -1
  1195. package/esm/router/route-name-method-suffix.mjs +1 -1
  1196. package/esm/router/route-name-method-suffix.mjs.map +1 -1
  1197. package/esm/router/route-name-taken-error.d.mts +14 -0
  1198. package/esm/router/route-name-taken-error.d.mts.map +1 -0
  1199. package/esm/router/route-name-taken-error.mjs +18 -0
  1200. package/esm/router/route-name-taken-error.mjs.map +1 -0
  1201. package/esm/router/route-registry.d.mts +1 -1
  1202. package/esm/router/route-registry.d.mts.map +1 -1
  1203. package/esm/router/route-registry.mjs +1 -1
  1204. package/esm/router/route-registry.mjs.map +1 -1
  1205. package/esm/router/router.d.mts +35 -9
  1206. package/esm/router/router.d.mts.map +1 -1
  1207. package/esm/router/router.mjs +78 -40
  1208. package/esm/router/router.mjs.map +1 -1
  1209. package/esm/router/types.d.mts +150 -18
  1210. package/esm/router/types.d.mts.map +1 -1
  1211. package/esm/router/unguarded-route-diagnostics.d.mts +40 -0
  1212. package/esm/router/unguarded-route-diagnostics.d.mts.map +1 -0
  1213. package/esm/router/unguarded-route-diagnostics.mjs +95 -0
  1214. package/esm/router/unguarded-route-diagnostics.mjs.map +1 -0
  1215. package/esm/socket/types.d.mts +1 -1
  1216. package/esm/socket/types.d.mts.map +1 -1
  1217. package/esm/socket/utils.d.mts +1 -1
  1218. package/esm/socket/utils.d.mts.map +1 -1
  1219. package/esm/socket/utils.mjs +1 -1
  1220. package/esm/socket/utils.mjs.map +1 -1
  1221. package/esm/storage/config.d.mts +1 -1
  1222. package/esm/storage/config.d.mts.map +1 -1
  1223. package/esm/storage/config.mjs +1 -1
  1224. package/esm/storage/config.mjs.map +1 -1
  1225. package/esm/storage/context/storage-driver-context.d.mts +1 -1
  1226. package/esm/storage/context/storage-driver-context.d.mts.map +1 -1
  1227. package/esm/storage/context/storage-driver-context.mjs +1 -1
  1228. package/esm/storage/context/storage-driver-context.mjs.map +1 -1
  1229. package/esm/storage/drivers/cloud-driver.d.mts +1 -1
  1230. package/esm/storage/drivers/cloud-driver.d.mts.map +1 -1
  1231. package/esm/storage/drivers/cloud-driver.mjs +1 -1
  1232. package/esm/storage/drivers/cloud-driver.mjs.map +1 -1
  1233. package/esm/storage/drivers/do-spaces-driver.d.mts +1 -1
  1234. package/esm/storage/drivers/do-spaces-driver.d.mts.map +1 -1
  1235. package/esm/storage/drivers/do-spaces-driver.mjs +1 -1
  1236. package/esm/storage/drivers/do-spaces-driver.mjs.map +1 -1
  1237. package/esm/storage/drivers/local-driver.d.mts +12 -1
  1238. package/esm/storage/drivers/local-driver.d.mts.map +1 -1
  1239. package/esm/storage/drivers/local-driver.mjs +33 -1
  1240. package/esm/storage/drivers/local-driver.mjs.map +1 -1
  1241. package/esm/storage/drivers/r2-driver.d.mts +1 -1
  1242. package/esm/storage/drivers/r2-driver.d.mts.map +1 -1
  1243. package/esm/storage/drivers/r2-driver.mjs +1 -1
  1244. package/esm/storage/drivers/r2-driver.mjs.map +1 -1
  1245. package/esm/storage/drivers/s3-driver.d.mts +1 -1
  1246. package/esm/storage/drivers/s3-driver.d.mts.map +1 -1
  1247. package/esm/storage/drivers/s3-driver.mjs +1 -1
  1248. package/esm/storage/drivers/s3-driver.mjs.map +1 -1
  1249. package/esm/storage/index.d.mts +1 -1
  1250. package/esm/storage/local-disk-roots.mjs +24 -0
  1251. package/esm/storage/local-disk-roots.mjs.map +1 -0
  1252. package/esm/storage/scoped-storage.d.mts +1 -1
  1253. package/esm/storage/scoped-storage.d.mts.map +1 -1
  1254. package/esm/storage/scoped-storage.mjs +1 -1
  1255. package/esm/storage/scoped-storage.mjs.map +1 -1
  1256. package/esm/storage/storage-file.d.mts +1 -1
  1257. package/esm/storage/storage-file.d.mts.map +1 -1
  1258. package/esm/storage/storage-file.mjs +1 -1
  1259. package/esm/storage/storage-file.mjs.map +1 -1
  1260. package/esm/storage/storage.d.mts +17 -3
  1261. package/esm/storage/storage.d.mts.map +1 -1
  1262. package/esm/storage/storage.mjs +23 -1
  1263. package/esm/storage/storage.mjs.map +1 -1
  1264. package/esm/storage/types.d.mts +3 -2
  1265. package/esm/storage/types.d.mts.map +1 -1
  1266. package/esm/storage/utils/classify-ip-address.d.mts +1 -1
  1267. package/esm/storage/utils/classify-ip-address.d.mts.map +1 -1
  1268. package/esm/storage/utils/classify-ip-address.mjs +1 -1
  1269. package/esm/storage/utils/classify-ip-address.mjs.map +1 -1
  1270. package/esm/storage/utils/contain-path.d.mts +1 -1
  1271. package/esm/storage/utils/contain-path.d.mts.map +1 -1
  1272. package/esm/storage/utils/contain-path.mjs +1 -1
  1273. package/esm/storage/utils/contain-path.mjs.map +1 -1
  1274. package/esm/storage/utils/mime.d.mts +1 -1
  1275. package/esm/storage/utils/mime.d.mts.map +1 -1
  1276. package/esm/storage/utils/mime.mjs +1 -1
  1277. package/esm/storage/utils/mime.mjs.map +1 -1
  1278. package/esm/storage/utils/safe-fetch.d.mts +1 -1
  1279. package/esm/storage/utils/safe-fetch.d.mts.map +1 -1
  1280. package/esm/storage/utils/safe-fetch.mjs +1 -1
  1281. package/esm/storage/utils/safe-fetch.mjs.map +1 -1
  1282. package/esm/storage/utils/storage-capability-error.d.mts +1 -1
  1283. package/esm/storage/utils/storage-capability-error.d.mts.map +1 -1
  1284. package/esm/storage/utils/storage-capability-error.mjs +1 -1
  1285. package/esm/storage/utils/storage-capability-error.mjs.map +1 -1
  1286. package/esm/storage/utils/storage-error.d.mts +1 -1
  1287. package/esm/storage/utils/storage-error.d.mts.map +1 -1
  1288. package/esm/storage/utils/storage-error.mjs +1 -1
  1289. package/esm/storage/utils/storage-error.mjs.map +1 -1
  1290. package/esm/storage/utils/storage-not-initialized-error.d.mts +3 -1
  1291. package/esm/storage/utils/storage-not-initialized-error.d.mts.map +1 -1
  1292. package/esm/storage/utils/storage-not-initialized-error.mjs +2 -1
  1293. package/esm/storage/utils/storage-not-initialized-error.mjs.map +1 -1
  1294. package/esm/tests/authenticated-test-client.d.mts +32 -0
  1295. package/esm/tests/authenticated-test-client.d.mts.map +1 -0
  1296. package/esm/tests/authenticated-test-client.mjs +40 -0
  1297. package/esm/tests/authenticated-test-client.mjs.map +1 -0
  1298. package/esm/tests/factories.d.mts +59 -0
  1299. package/esm/tests/factories.d.mts.map +1 -0
  1300. package/esm/tests/factories.mjs +105 -0
  1301. package/esm/tests/factories.mjs.map +1 -0
  1302. package/esm/tests/fakes/cache-fake.d.mts +29 -0
  1303. package/esm/tests/fakes/cache-fake.d.mts.map +1 -0
  1304. package/esm/tests/fakes/cache-fake.mjs +79 -0
  1305. package/esm/tests/fakes/cache-fake.mjs.map +1 -0
  1306. package/esm/tests/fakes/clock-fake.d.mts +32 -0
  1307. package/esm/tests/fakes/clock-fake.d.mts.map +1 -0
  1308. package/esm/tests/fakes/clock-fake.mjs +69 -0
  1309. package/esm/tests/fakes/clock-fake.mjs.map +1 -0
  1310. package/esm/tests/fakes/fake-assertion-error.d.mts +13 -0
  1311. package/esm/tests/fakes/fake-assertion-error.d.mts.map +1 -0
  1312. package/esm/tests/fakes/fake-assertion-error.mjs +20 -0
  1313. package/esm/tests/fakes/fake-assertion-error.mjs.map +1 -0
  1314. package/esm/tests/fakes/ids-fake.d.mts +22 -0
  1315. package/esm/tests/fakes/ids-fake.d.mts.map +1 -0
  1316. package/esm/tests/fakes/ids-fake.mjs +57 -0
  1317. package/esm/tests/fakes/ids-fake.mjs.map +1 -0
  1318. package/esm/tests/fakes/index.d.mts +8 -0
  1319. package/esm/tests/fakes/index.mjs +10 -0
  1320. package/esm/tests/fakes/mail-fake.d.mts +41 -0
  1321. package/esm/tests/fakes/mail-fake.d.mts.map +1 -0
  1322. package/esm/tests/fakes/mail-fake.mjs +111 -0
  1323. package/esm/tests/fakes/mail-fake.mjs.map +1 -0
  1324. package/esm/tests/fakes/queue-fake.d.mts +48 -0
  1325. package/esm/tests/fakes/queue-fake.d.mts.map +1 -0
  1326. package/esm/tests/fakes/queue-fake.mjs +134 -0
  1327. package/esm/tests/fakes/queue-fake.mjs.map +1 -0
  1328. package/esm/tests/fakes/storage-fake.d.mts +31 -0
  1329. package/esm/tests/fakes/storage-fake.d.mts.map +1 -0
  1330. package/esm/tests/fakes/storage-fake.mjs +122 -0
  1331. package/esm/tests/fakes/storage-fake.mjs.map +1 -0
  1332. package/esm/tests/fakes/test-fakes.d.mts +39 -0
  1333. package/esm/tests/fakes/test-fakes.d.mts.map +1 -0
  1334. package/esm/tests/fakes/test-fakes.mjs +90 -0
  1335. package/esm/tests/fakes/test-fakes.mjs.map +1 -0
  1336. package/esm/tests/index.d.mts +14 -2
  1337. package/esm/tests/index.mjs +15 -2
  1338. package/esm/tests/snapshot-response.d.mts +34 -0
  1339. package/esm/tests/snapshot-response.d.mts.map +1 -0
  1340. package/esm/tests/snapshot-response.mjs +42 -0
  1341. package/esm/tests/snapshot-response.mjs.map +1 -0
  1342. package/esm/tests/start-http-development-server.d.mts +23 -1
  1343. package/esm/tests/start-http-development-server.d.mts.map +1 -1
  1344. package/esm/tests/start-http-development-server.mjs +37 -4
  1345. package/esm/tests/start-http-development-server.mjs.map +1 -1
  1346. package/esm/tests/test-connectors-selection.d.mts +1 -1
  1347. package/esm/tests/test-connectors-selection.d.mts.map +1 -1
  1348. package/esm/tests/test-connectors-selection.mjs +1 -1
  1349. package/esm/tests/test-connectors-selection.mjs.map +1 -1
  1350. package/esm/tests/test-helpers.d.mts +21 -2
  1351. package/esm/tests/test-helpers.d.mts.map +1 -1
  1352. package/esm/tests/test-helpers.mjs +41 -28
  1353. package/esm/tests/test-helpers.mjs.map +1 -1
  1354. package/esm/tests/test-http-server.d.mts +62 -0
  1355. package/esm/tests/test-http-server.d.mts.map +1 -0
  1356. package/esm/tests/test-http-server.mjs +119 -0
  1357. package/esm/tests/test-http-server.mjs.map +1 -0
  1358. package/esm/tests/test-lifecycle-state.mjs +1 -1
  1359. package/esm/tests/test-lifecycle-state.mjs.map +1 -1
  1360. package/esm/tests/test-server-port-channel.mjs +1 -1
  1361. package/esm/tests/test-server-port-channel.mjs.map +1 -1
  1362. package/esm/tests/test-setup-timeout.mjs +1 -1
  1363. package/esm/tests/test-setup-timeout.mjs.map +1 -1
  1364. package/esm/tests/vitest-setup.d.mts +12 -1
  1365. package/esm/tests/vitest-setup.d.mts.map +1 -1
  1366. package/esm/tests/vitest-setup.mjs +13 -5
  1367. package/esm/tests/vitest-setup.mjs.map +1 -1
  1368. package/esm/tooling/agents-md/agents-md-markers.d.mts +27 -0
  1369. package/esm/tooling/agents-md/agents-md-markers.d.mts.map +1 -0
  1370. package/esm/tooling/agents-md/agents-md-markers.mjs +59 -0
  1371. package/esm/tooling/agents-md/agents-md-markers.mjs.map +1 -0
  1372. package/esm/tooling/agents-md/agents-md-refresher.d.mts +36 -0
  1373. package/esm/tooling/agents-md/agents-md-refresher.d.mts.map +1 -0
  1374. package/esm/tooling/agents-md/agents-md-refresher.mjs +72 -0
  1375. package/esm/tooling/agents-md/agents-md-refresher.mjs.map +1 -0
  1376. package/esm/tooling/agents-md/index.mjs +7 -0
  1377. package/esm/tooling/agents-md/installed-skills.d.mts +30 -0
  1378. package/esm/tooling/agents-md/installed-skills.d.mts.map +1 -0
  1379. package/esm/tooling/agents-md/installed-skills.mjs +74 -0
  1380. package/esm/tooling/agents-md/installed-skills.mjs.map +1 -0
  1381. package/esm/tooling/agents-md/render-agents-md.d.mts +33 -0
  1382. package/esm/tooling/agents-md/render-agents-md.d.mts.map +1 -0
  1383. package/esm/tooling/agents-md/render-agents-md.mjs +195 -0
  1384. package/esm/tooling/agents-md/render-agents-md.mjs.map +1 -0
  1385. package/esm/tooling/agents-md/write-agents-md.d.mts +33 -0
  1386. package/esm/tooling/agents-md/write-agents-md.d.mts.map +1 -0
  1387. package/esm/tooling/agents-md/write-agents-md.mjs +49 -0
  1388. package/esm/tooling/agents-md/write-agents-md.mjs.map +1 -0
  1389. package/esm/tooling/board/board-message.d.mts +31 -0
  1390. package/esm/tooling/board/board-message.d.mts.map +1 -0
  1391. package/esm/tooling/board/board-message.mjs +86 -0
  1392. package/esm/tooling/board/board-message.mjs.map +1 -0
  1393. package/esm/tooling/board/board.d.mts +109 -0
  1394. package/esm/tooling/board/board.d.mts.map +1 -0
  1395. package/esm/tooling/board/board.mjs +406 -0
  1396. package/esm/tooling/board/board.mjs.map +1 -0
  1397. package/esm/tooling/board/board.types.d.mts +72 -0
  1398. package/esm/tooling/board/board.types.d.mts.map +1 -0
  1399. package/esm/tooling/board/board.types.mjs +54 -0
  1400. package/esm/tooling/board/board.types.mjs.map +1 -0
  1401. package/esm/tooling/check/changed-files.d.mts +33 -0
  1402. package/esm/tooling/check/changed-files.d.mts.map +1 -0
  1403. package/esm/tooling/check/changed-files.mjs +73 -0
  1404. package/esm/tooling/check/changed-files.mjs.map +1 -0
  1405. package/esm/tooling/check/check-report.types.d.mts +62 -0
  1406. package/esm/tooling/check/check-report.types.d.mts.map +1 -0
  1407. package/esm/tooling/check/check-report.types.mjs +37 -0
  1408. package/esm/tooling/check/check-report.types.mjs.map +1 -0
  1409. package/esm/tooling/check/code-style-conventions.mjs +106 -0
  1410. package/esm/tooling/check/code-style-conventions.mjs.map +1 -0
  1411. package/esm/tooling/check/conventions-step.d.mts +34 -0
  1412. package/esm/tooling/check/conventions-step.d.mts.map +1 -0
  1413. package/esm/tooling/check/conventions-step.mjs +184 -0
  1414. package/esm/tooling/check/conventions-step.mjs.map +1 -0
  1415. package/esm/tooling/check/environment-step.d.mts +18 -0
  1416. package/esm/tooling/check/environment-step.d.mts.map +1 -0
  1417. package/esm/tooling/check/environment-step.mjs +78 -0
  1418. package/esm/tooling/check/environment-step.mjs.map +1 -0
  1419. package/esm/tooling/check/index.d.mts +8 -0
  1420. package/esm/tooling/check/index.mjs +10 -0
  1421. package/esm/tooling/check/lint-step.d.mts +19 -0
  1422. package/esm/tooling/check/lint-step.d.mts.map +1 -0
  1423. package/esm/tooling/check/lint-step.mjs +111 -0
  1424. package/esm/tooling/check/lint-step.mjs.map +1 -0
  1425. package/esm/tooling/check/request-input.mjs +132 -0
  1426. package/esm/tooling/check/request-input.mjs.map +1 -0
  1427. package/esm/tooling/check/run-check.d.mts +35 -0
  1428. package/esm/tooling/check/run-check.d.mts.map +1 -0
  1429. package/esm/tooling/check/run-check.mjs +192 -0
  1430. package/esm/tooling/check/run-check.mjs.map +1 -0
  1431. package/esm/tooling/check/run-tests.d.mts +48 -0
  1432. package/esm/tooling/check/run-tests.d.mts.map +1 -0
  1433. package/esm/tooling/check/run-tests.mjs +93 -0
  1434. package/esm/tooling/check/run-tests.mjs.map +1 -0
  1435. package/esm/tooling/check/security-conventions.mjs +648 -0
  1436. package/esm/tooling/check/security-conventions.mjs.map +1 -0
  1437. package/esm/tooling/check/source-ast.mjs +195 -0
  1438. package/esm/tooling/check/source-ast.mjs.map +1 -0
  1439. package/esm/tooling/check/source-files.mjs +27 -0
  1440. package/esm/tooling/check/source-files.mjs.map +1 -0
  1441. package/esm/tooling/check/tests-step.d.mts +34 -0
  1442. package/esm/tooling/check/tests-step.d.mts.map +1 -0
  1443. package/esm/tooling/check/tests-step.mjs +177 -0
  1444. package/esm/tooling/check/tests-step.mjs.map +1 -0
  1445. package/esm/tooling/dev-state/dev-server-state.d.mts +39 -0
  1446. package/esm/tooling/dev-state/dev-server-state.d.mts.map +1 -0
  1447. package/esm/tooling/dev-state/dev-server-state.mjs +67 -0
  1448. package/esm/tooling/dev-state/dev-server-state.mjs.map +1 -0
  1449. package/esm/tooling/devtools/devtools-client.d.mts +91 -0
  1450. package/esm/tooling/devtools/devtools-client.d.mts.map +1 -0
  1451. package/esm/tooling/devtools/devtools-client.mjs +155 -0
  1452. package/esm/tooling/devtools/devtools-client.mjs.map +1 -0
  1453. package/esm/tooling/generate/generation.d.mts +78 -0
  1454. package/esm/tooling/generate/generation.d.mts.map +1 -0
  1455. package/esm/tooling/generate/generation.mjs +123 -0
  1456. package/esm/tooling/generate/generation.mjs.map +1 -0
  1457. package/esm/tooling/generate/generator-spec.d.mts +57 -0
  1458. package/esm/tooling/generate/generator-spec.d.mts.map +1 -0
  1459. package/esm/tooling/generate/generator-spec.mjs +102 -0
  1460. package/esm/tooling/generate/generator-spec.mjs.map +1 -0
  1461. package/esm/tooling/generate/index.mjs +6 -0
  1462. package/esm/tooling/generate/project-files.mjs +121 -0
  1463. package/esm/tooling/generate/project-files.mjs.map +1 -0
  1464. package/esm/tooling/generate/run-cli.d.mts +40 -0
  1465. package/esm/tooling/generate/run-cli.d.mts.map +1 -0
  1466. package/esm/tooling/generate/run-cli.mjs +93 -0
  1467. package/esm/tooling/generate/run-cli.mjs.map +1 -0
  1468. package/esm/tooling/generate/unified-diff.d.mts +37 -0
  1469. package/esm/tooling/generate/unified-diff.d.mts.map +1 -0
  1470. package/esm/tooling/generate/unified-diff.mjs +161 -0
  1471. package/esm/tooling/generate/unified-diff.mjs.map +1 -0
  1472. package/esm/tooling/index.d.mts +41 -0
  1473. package/esm/tooling/index.mjs +45 -0
  1474. package/esm/tooling/inspect/boot-for-inspect.d.mts +23 -0
  1475. package/esm/tooling/inspect/boot-for-inspect.d.mts.map +1 -0
  1476. package/esm/tooling/inspect/boot-for-inspect.mjs +63 -0
  1477. package/esm/tooling/inspect/boot-for-inspect.mjs.map +1 -0
  1478. package/esm/tooling/inspect/collect-config.mjs +77 -0
  1479. package/esm/tooling/inspect/collect-config.mjs.map +1 -0
  1480. package/esm/tooling/inspect/collect-models.d.mts +9 -0
  1481. package/esm/tooling/inspect/collect-models.d.mts.map +1 -0
  1482. package/esm/tooling/inspect/collect-models.mjs +154 -0
  1483. package/esm/tooling/inspect/collect-models.mjs.map +1 -0
  1484. package/esm/tooling/inspect/collect-packages.d.mts +10 -0
  1485. package/esm/tooling/inspect/collect-packages.d.mts.map +1 -0
  1486. package/esm/tooling/inspect/collect-packages.mjs +157 -0
  1487. package/esm/tooling/inspect/collect-packages.mjs.map +1 -0
  1488. package/esm/tooling/inspect/collect-pages.mjs +108 -0
  1489. package/esm/tooling/inspect/collect-pages.mjs.map +1 -0
  1490. package/esm/tooling/inspect/collect-routes.mjs +168 -0
  1491. package/esm/tooling/inspect/collect-routes.mjs.map +1 -0
  1492. package/esm/tooling/inspect/event-recorder.d.mts +37 -0
  1493. package/esm/tooling/inspect/event-recorder.d.mts.map +1 -0
  1494. package/esm/tooling/inspect/event-recorder.mjs +91 -0
  1495. package/esm/tooling/inspect/event-recorder.mjs.map +1 -0
  1496. package/esm/tooling/inspect/index.d.mts +7 -0
  1497. package/esm/tooling/inspect/index.mjs +7 -0
  1498. package/esm/tooling/inspect/inspect-app.d.mts +53 -0
  1499. package/esm/tooling/inspect/inspect-app.d.mts.map +1 -0
  1500. package/esm/tooling/inspect/inspect-app.mjs +92 -0
  1501. package/esm/tooling/inspect/inspect-app.mjs.map +1 -0
  1502. package/esm/tooling/inspect/inspect-report.schema.d.mts +15 -0
  1503. package/esm/tooling/inspect/inspect-report.schema.d.mts.map +1 -0
  1504. package/esm/tooling/inspect/inspect-report.schema.mjs +463 -0
  1505. package/esm/tooling/inspect/inspect-report.schema.mjs.map +1 -0
  1506. package/esm/tooling/inspect/inspect-report.types.d.mts +196 -0
  1507. package/esm/tooling/inspect/inspect-report.types.d.mts.map +1 -0
  1508. package/esm/tooling/inspect/inspect-report.types.mjs +33 -0
  1509. package/esm/tooling/inspect/inspect-report.types.mjs.map +1 -0
  1510. package/esm/tooling/mcp/create-mcp-context.d.mts +26 -0
  1511. package/esm/tooling/mcp/create-mcp-context.d.mts.map +1 -0
  1512. package/esm/tooling/mcp/create-mcp-context.mjs +75 -0
  1513. package/esm/tooling/mcp/create-mcp-context.mjs.map +1 -0
  1514. package/esm/tooling/mcp/db-schema.d.mts +49 -0
  1515. package/esm/tooling/mcp/db-schema.d.mts.map +1 -0
  1516. package/esm/tooling/mcp/db-schema.mjs +56 -0
  1517. package/esm/tooling/mcp/db-schema.mjs.map +1 -0
  1518. package/esm/tooling/mcp/docs-search.d.mts +72 -0
  1519. package/esm/tooling/mcp/docs-search.d.mts.map +1 -0
  1520. package/esm/tooling/mcp/docs-search.mjs +178 -0
  1521. package/esm/tooling/mcp/docs-search.mjs.map +1 -0
  1522. package/esm/tooling/mcp/index.mjs +9 -0
  1523. package/esm/tooling/mcp/load-ai-tools.d.mts +62 -0
  1524. package/esm/tooling/mcp/load-ai-tools.d.mts.map +1 -0
  1525. package/esm/tooling/mcp/load-ai-tools.mjs +44 -0
  1526. package/esm/tooling/mcp/load-ai-tools.mjs.map +1 -0
  1527. package/esm/tooling/mcp/mcp-tools.d.mts +60 -0
  1528. package/esm/tooling/mcp/mcp-tools.d.mts.map +1 -0
  1529. package/esm/tooling/mcp/mcp-tools.mjs +513 -0
  1530. package/esm/tooling/mcp/mcp-tools.mjs.map +1 -0
  1531. package/esm/tooling/mcp/start-mcp-server.d.mts +56 -0
  1532. package/esm/tooling/mcp/start-mcp-server.d.mts.map +1 -0
  1533. package/esm/tooling/mcp/start-mcp-server.mjs +126 -0
  1534. package/esm/tooling/mcp/start-mcp-server.mjs.map +1 -0
  1535. package/esm/tooling/mcp/tool-input.d.mts +75 -0
  1536. package/esm/tooling/mcp/tool-input.d.mts.map +1 -0
  1537. package/esm/tooling/mcp/tool-input.mjs +72 -0
  1538. package/esm/tooling/mcp/tool-input.mjs.map +1 -0
  1539. package/esm/tooling/problem.d.mts +45 -0
  1540. package/esm/tooling/problem.d.mts.map +1 -0
  1541. package/esm/tooling/problem.mjs +28 -0
  1542. package/esm/tooling/problem.mjs.map +1 -0
  1543. package/esm/tooling/trace/trace-report.types.d.mts +71 -0
  1544. package/esm/tooling/trace/trace-report.types.d.mts.map +1 -0
  1545. package/esm/tooling/trace/trace-report.types.mjs +7 -0
  1546. package/esm/tooling/trace/trace-report.types.mjs.map +1 -0
  1547. package/esm/tooling/trace/trace-request.d.mts +83 -0
  1548. package/esm/tooling/trace/trace-request.d.mts.map +1 -0
  1549. package/esm/tooling/trace/trace-request.mjs +241 -0
  1550. package/esm/tooling/trace/trace-request.mjs.map +1 -0
  1551. package/esm/tooling/typecheck/index.d.mts +1 -0
  1552. package/esm/tooling/typecheck/index.mjs +3 -0
  1553. package/esm/tooling/typecheck/run-typecheck.d.mts +59 -0
  1554. package/esm/tooling/typecheck/run-typecheck.d.mts.map +1 -0
  1555. package/esm/tooling/typecheck/run-typecheck.mjs +153 -0
  1556. package/esm/tooling/typecheck/run-typecheck.mjs.map +1 -0
  1557. package/esm/updater/package-manager.mjs +1 -1
  1558. package/esm/updater/package-manager.mjs.map +1 -1
  1559. package/esm/updater/update-warlock-packages.mjs +1 -1
  1560. package/esm/updater/update-warlock-packages.mjs.map +1 -1
  1561. package/esm/upgrade/codemods/head-viewport.mjs +46 -0
  1562. package/esm/upgrade/codemods/head-viewport.mjs.map +1 -0
  1563. package/esm/upgrade/codemods/helpers.mjs +81 -0
  1564. package/esm/upgrade/codemods/helpers.mjs.map +1 -0
  1565. package/esm/upgrade/codemods/index.mjs +34 -0
  1566. package/esm/upgrade/codemods/index.mjs.map +1 -0
  1567. package/esm/upgrade/codemods/logger-sync-calls.mjs +57 -0
  1568. package/esm/upgrade/codemods/logger-sync-calls.mjs.map +1 -0
  1569. package/esm/upgrade/codemods/package-json.mjs +122 -0
  1570. package/esm/upgrade/codemods/package-json.mjs.map +1 -0
  1571. package/esm/upgrade/codemods/request-log-snapshot.mjs +82 -0
  1572. package/esm/upgrade/codemods/request-log-snapshot.mjs.map +1 -0
  1573. package/esm/upgrade/codemods/review-sites.mjs +262 -0
  1574. package/esm/upgrade/codemods/review-sites.mjs.map +1 -0
  1575. package/esm/upgrade/diff.mjs +119 -0
  1576. package/esm/upgrade/diff.mjs.map +1 -0
  1577. package/esm/upgrade/format-upgrade-report.mjs +32 -0
  1578. package/esm/upgrade/format-upgrade-report.mjs.map +1 -0
  1579. package/esm/upgrade/load-ts-morph.mjs +48 -0
  1580. package/esm/upgrade/load-ts-morph.mjs.map +1 -0
  1581. package/esm/upgrade/notes.mjs +16 -0
  1582. package/esm/upgrade/notes.mjs.map +1 -0
  1583. package/esm/upgrade/run-upgrade.mjs +246 -0
  1584. package/esm/upgrade/run-upgrade.mjs.map +1 -0
  1585. package/esm/upgrade/upgrade-command.action.mjs +37 -0
  1586. package/esm/upgrade/upgrade-command.action.mjs.map +1 -0
  1587. package/esm/upgrade/version.mjs +39 -0
  1588. package/esm/upgrade/version.mjs.map +1 -0
  1589. package/esm/use-cases/types.d.mts +1 -1
  1590. package/esm/use-cases/types.d.mts.map +1 -1
  1591. package/esm/use-cases/use-case-broadcast.d.mts +1 -1
  1592. package/esm/use-cases/use-case-broadcast.d.mts.map +1 -1
  1593. package/esm/use-cases/use-case-broadcast.mjs +1 -1
  1594. package/esm/use-cases/use-case-broadcast.mjs.map +1 -1
  1595. package/esm/use-cases/use-case-events.d.mts +1 -1
  1596. package/esm/use-cases/use-case-events.d.mts.map +1 -1
  1597. package/esm/use-cases/use-case-events.mjs +1 -1
  1598. package/esm/use-cases/use-case-events.mjs.map +1 -1
  1599. package/esm/use-cases/use-case-pipeline.d.mts +1 -1
  1600. package/esm/use-cases/use-case-pipeline.d.mts.map +1 -1
  1601. package/esm/use-cases/use-case-pipeline.mjs +1 -1
  1602. package/esm/use-cases/use-case-pipeline.mjs.map +1 -1
  1603. package/esm/use-cases/use-case.d.mts +1 -1
  1604. package/esm/use-cases/use-case.d.mts.map +1 -1
  1605. package/esm/use-cases/use-case.errors.d.mts +1 -1
  1606. package/esm/use-cases/use-case.errors.d.mts.map +1 -1
  1607. package/esm/use-cases/use-case.errors.mjs +1 -1
  1608. package/esm/use-cases/use-case.errors.mjs.map +1 -1
  1609. package/esm/use-cases/use-case.mjs +1 -1
  1610. package/esm/use-cases/use-case.mjs.map +1 -1
  1611. package/esm/use-cases/use-cases-registry.d.mts +1 -1
  1612. package/esm/use-cases/use-cases-registry.d.mts.map +1 -1
  1613. package/esm/use-cases/use-cases-registry.mjs +1 -1
  1614. package/esm/use-cases/use-cases-registry.mjs.map +1 -1
  1615. package/esm/utils/app-log.d.mts +6 -6
  1616. package/esm/utils/app-log.d.mts.map +1 -1
  1617. package/esm/utils/app-log.mjs +1 -1
  1618. package/esm/utils/app-log.mjs.map +1 -1
  1619. package/esm/utils/clock.d.mts +33 -0
  1620. package/esm/utils/clock.d.mts.map +1 -0
  1621. package/esm/utils/clock.mjs +27 -0
  1622. package/esm/utils/clock.mjs.map +1 -0
  1623. package/esm/utils/database-log.d.mts +1 -1
  1624. package/esm/utils/database-log.d.mts.map +1 -1
  1625. package/esm/utils/database-log.mjs +1 -1
  1626. package/esm/utils/database-log.mjs.map +1 -1
  1627. package/esm/utils/detect-environment-overrides.mjs +1 -1
  1628. package/esm/utils/detect-environment-overrides.mjs.map +1 -1
  1629. package/esm/utils/environment.d.mts +1 -1
  1630. package/esm/utils/environment.d.mts.map +1 -1
  1631. package/esm/utils/environment.mjs +1 -1
  1632. package/esm/utils/environment.mjs.map +1 -1
  1633. package/esm/utils/framework-vesion.mjs +2 -2
  1634. package/esm/utils/framework-vesion.mjs.map +1 -1
  1635. package/esm/utils/get-localized.d.mts +1 -1
  1636. package/esm/utils/get-localized.d.mts.map +1 -1
  1637. package/esm/utils/get-localized.mjs +1 -1
  1638. package/esm/utils/get-localized.mjs.map +1 -1
  1639. package/esm/utils/ids.d.mts +32 -0
  1640. package/esm/utils/ids.d.mts.map +1 -0
  1641. package/esm/utils/ids.mjs +33 -0
  1642. package/esm/utils/ids.mjs.map +1 -0
  1643. package/esm/utils/index.d.mts +3 -0
  1644. package/esm/utils/index.mjs +3 -0
  1645. package/esm/utils/is-test-file.mjs +1 -1
  1646. package/esm/utils/is-test-file.mjs.map +1 -1
  1647. package/esm/utils/load-environment.mjs +1 -1
  1648. package/esm/utils/load-environment.mjs.map +1 -1
  1649. package/esm/utils/normalized-path.d.mts +1 -1
  1650. package/esm/utils/normalized-path.d.mts.map +1 -1
  1651. package/esm/utils/normalized-path.mjs +1 -1
  1652. package/esm/utils/normalized-path.mjs.map +1 -1
  1653. package/esm/utils/npm-registry.d.mts +1 -1
  1654. package/esm/utils/npm-registry.d.mts.map +1 -1
  1655. package/esm/utils/npm-registry.mjs +1 -1
  1656. package/esm/utils/npm-registry.mjs.map +1 -1
  1657. package/esm/utils/paths.d.mts +1 -1
  1658. package/esm/utils/paths.d.mts.map +1 -1
  1659. package/esm/utils/paths.mjs +1 -1
  1660. package/esm/utils/paths.mjs.map +1 -1
  1661. package/esm/utils/promise-all-object.d.mts +1 -1
  1662. package/esm/utils/promise-all-object.d.mts.map +1 -1
  1663. package/esm/utils/promise-all-object.mjs +1 -1
  1664. package/esm/utils/promise-all-object.mjs.map +1 -1
  1665. package/esm/utils/queue.d.mts +1 -1
  1666. package/esm/utils/queue.d.mts.map +1 -1
  1667. package/esm/utils/queue.mjs +1 -1
  1668. package/esm/utils/queue.mjs.map +1 -1
  1669. package/esm/utils/recorded-environment-overrides.mjs +1 -1
  1670. package/esm/utils/recorded-environment-overrides.mjs.map +1 -1
  1671. package/esm/utils/report-environment-overrides.mjs +1 -1
  1672. package/esm/utils/report-environment-overrides.mjs.map +1 -1
  1673. package/esm/utils/runtime.d.mts +59 -0
  1674. package/esm/utils/runtime.d.mts.map +1 -0
  1675. package/esm/utils/runtime.mjs +85 -0
  1676. package/esm/utils/runtime.mjs.map +1 -0
  1677. package/esm/utils/sleep.d.mts +1 -1
  1678. package/esm/utils/sleep.d.mts.map +1 -1
  1679. package/esm/utils/sleep.mjs +1 -1
  1680. package/esm/utils/sleep.mjs.map +1 -1
  1681. package/esm/utils/sluggable.d.mts +1 -1
  1682. package/esm/utils/sluggable.d.mts.map +1 -1
  1683. package/esm/utils/sluggable.mjs +1 -1
  1684. package/esm/utils/sluggable.mjs.map +1 -1
  1685. package/esm/utils/to-json.d.mts +1 -1
  1686. package/esm/utils/to-json.d.mts.map +1 -1
  1687. package/esm/utils/to-json.mjs +1 -1
  1688. package/esm/utils/to-json.mjs.map +1 -1
  1689. package/esm/utils/types.d.mts +1 -1
  1690. package/esm/utils/types.d.mts.map +1 -1
  1691. package/esm/utils/urls.d.mts +1 -1
  1692. package/esm/utils/urls.d.mts.map +1 -1
  1693. package/esm/utils/urls.mjs +1 -1
  1694. package/esm/utils/urls.mjs.map +1 -1
  1695. package/esm/utils/version-compare.d.mts +1 -1
  1696. package/esm/utils/version-compare.d.mts.map +1 -1
  1697. package/esm/utils/version-compare.mjs +1 -1
  1698. package/esm/utils/version-compare.mjs.map +1 -1
  1699. package/esm/validation/database/exists-except-current-id.d.mts +1 -1
  1700. package/esm/validation/database/exists-except-current-id.d.mts.map +1 -1
  1701. package/esm/validation/database/exists-except-current-id.mjs +1 -1
  1702. package/esm/validation/database/exists-except-current-id.mjs.map +1 -1
  1703. package/esm/validation/database/exists-except-current-user.d.mts +1 -1
  1704. package/esm/validation/database/exists-except-current-user.d.mts.map +1 -1
  1705. package/esm/validation/database/exists-except-current-user.mjs +1 -1
  1706. package/esm/validation/database/exists-except-current-user.mjs.map +1 -1
  1707. package/esm/validation/database/types.d.mts +1 -1
  1708. package/esm/validation/database/types.d.mts.map +1 -1
  1709. package/esm/validation/database/unique-except-current-id.d.mts +1 -1
  1710. package/esm/validation/database/unique-except-current-id.d.mts.map +1 -1
  1711. package/esm/validation/database/unique-except-current-id.mjs +1 -1
  1712. package/esm/validation/database/unique-except-current-id.mjs.map +1 -1
  1713. package/esm/validation/database/unique-except-current-user.d.mts +1 -1
  1714. package/esm/validation/database/unique-except-current-user.d.mts.map +1 -1
  1715. package/esm/validation/database/unique-except-current-user.mjs +1 -1
  1716. package/esm/validation/database/unique-except-current-user.mjs.map +1 -1
  1717. package/esm/validation/file/file.d.mts +1 -1
  1718. package/esm/validation/file/file.d.mts.map +1 -1
  1719. package/esm/validation/file/file.mjs +1 -1
  1720. package/esm/validation/file/file.mjs.map +1 -1
  1721. package/esm/validation/index.d.mts +1 -1
  1722. package/esm/validation/init.mjs +1 -1
  1723. package/esm/validation/init.mjs.map +1 -1
  1724. package/esm/validation/plugins/database-plugin.mjs +1 -1
  1725. package/esm/validation/plugins/database-plugin.mjs.map +1 -1
  1726. package/esm/validation/plugins/file-plugin.mjs +1 -1
  1727. package/esm/validation/plugins/file-plugin.mjs.map +1 -1
  1728. package/esm/validation/plugins/localized-plugin.mjs +1 -1
  1729. package/esm/validation/plugins/localized-plugin.mjs.map +1 -1
  1730. package/esm/validation/types.d.mts +58 -3
  1731. package/esm/validation/types.d.mts.map +1 -1
  1732. package/esm/validation/validateAll.mjs +20 -3
  1733. package/esm/validation/validateAll.mjs.map +1 -1
  1734. package/esm/validation/validation-failure-status.mjs +15 -0
  1735. package/esm/validation/validation-failure-status.mjs.map +1 -0
  1736. package/esm/validation/validators/file-validator.d.mts +28 -41
  1737. package/esm/validation/validators/file-validator.d.mts.map +1 -1
  1738. package/esm/validation/validators/file-validator.mjs +4 -1
  1739. package/esm/validation/validators/file-validator.mjs.map +1 -1
  1740. package/esm/vite/lower-stage3-decorators.d.mts +1 -1
  1741. package/esm/vite/lower-stage3-decorators.d.mts.map +1 -1
  1742. package/esm/vite/lower-stage3-decorators.mjs +1 -1
  1743. package/esm/vite/lower-stage3-decorators.mjs.map +1 -1
  1744. package/esm/warlock-config/bundle-config.mjs +148 -0
  1745. package/esm/warlock-config/bundle-config.mjs.map +1 -0
  1746. package/esm/warlock-config/default-configurations.mjs +1 -1
  1747. package/esm/warlock-config/default-configurations.mjs.map +1 -1
  1748. package/esm/warlock-config/define-config.d.mts +1 -1
  1749. package/esm/warlock-config/define-config.d.mts.map +1 -1
  1750. package/esm/warlock-config/define-config.mjs +1 -1
  1751. package/esm/warlock-config/define-config.mjs.map +1 -1
  1752. package/esm/warlock-config/index.d.mts +1 -1
  1753. package/esm/warlock-config/index.mjs +1 -1
  1754. package/esm/warlock-config/normalize-build-config.mjs +1 -1
  1755. package/esm/warlock-config/normalize-build-config.mjs.map +1 -1
  1756. package/esm/warlock-config/types.d.mts +28 -4
  1757. package/esm/warlock-config/types.d.mts.map +1 -1
  1758. package/esm/warlock-config/warlock-config.manager.d.mts +32 -7
  1759. package/esm/warlock-config/warlock-config.manager.d.mts.map +1 -1
  1760. package/esm/warlock-config/warlock-config.manager.mjs +94 -18
  1761. package/esm/warlock-config/warlock-config.manager.mjs.map +1 -1
  1762. package/esm/warlock-config/warn-deprecated-config.mjs +1 -1
  1763. package/esm/warlock-config/warn-deprecated-config.mjs.map +1 -1
  1764. package/llms-full.txt +3271 -784
  1765. package/llms.txt +16 -6
  1766. package/package.json +51 -14
  1767. package/schemas/inspect-report.schema.json +554 -0
  1768. package/skills/README.md +9 -0
  1769. package/skills/add-connector/SKILL.md +26 -38
  1770. package/skills/benchmark-code/SKILL.md +30 -24
  1771. package/skills/build-restful/SKILL.md +14 -14
  1772. package/skills/build-url/SKILL.md +18 -18
  1773. package/skills/configure-app/SKILL.md +129 -14
  1774. package/skills/create-controller/SKILL.md +29 -12
  1775. package/skills/create-module/SKILL.md +3 -3
  1776. package/skills/define-resource/SKILL.md +32 -29
  1777. package/skills/encrypt-data/SKILL.md +21 -19
  1778. package/skills/generate-openapi/SKILL.md +50 -24
  1779. package/skills/hash-password/SKILL.md +2 -2
  1780. package/skills/health-checks/SKILL.md +26 -7
  1781. package/skills/index.md +9 -4
  1782. package/skills/lower-stage3-decorators/SKILL.md +4 -4
  1783. package/skills/make-endpoint/SKILL.md +110 -0
  1784. package/skills/model-factories/SKILL.md +92 -0
  1785. package/skills/process-image/SKILL.md +32 -30
  1786. package/skills/register-route/SKILL.md +119 -10
  1787. package/skills/request-memo/SKILL.md +1 -1
  1788. package/skills/request-tracing/SKILL.md +4 -1
  1789. package/skills/resolve-path/SKILL.md +45 -44
  1790. package/skills/retry-operation/SKILL.md +20 -11
  1791. package/skills/run-app/SKILL.md +111 -20
  1792. package/skills/send-response/SKILL.md +189 -16
  1793. package/skills/store-file/SKILL.md +97 -53
  1794. package/skills/test-fakes/SKILL.md +123 -0
  1795. package/skills/test-http/SKILL.md +125 -21
  1796. package/skills/test-service/SKILL.md +41 -1
  1797. package/skills/update-packages/SKILL.md +29 -18
  1798. package/skills/upgrade-from-5-29/SKILL.md +413 -0
  1799. package/skills/upload-file/SKILL.md +31 -33
  1800. package/skills/use-app-context/SKILL.md +38 -31
  1801. package/skills/use-middleware/SKILL.md +46 -26
  1802. package/skills/use-model-transformers/SKILL.md +37 -28
  1803. package/skills/use-repository/SKILL.md +2 -2
  1804. package/skills/validate-input/SKILL.md +73 -29
  1805. package/skills/warlock-agents-md/SKILL.md +96 -0
  1806. package/skills/warlock-board/SKILL.md +123 -0
  1807. package/skills/warlock-check/SKILL.md +132 -0
  1808. package/skills/warlock-conventions/SKILL.md +115 -0
  1809. package/skills/warlock-doctor/SKILL.md +55 -22
  1810. package/skills/warlock-inspect/SKILL.md +134 -0
  1811. package/skills/warlock-mcp/SKILL.md +120 -0
  1812. package/skills/warlock-routes/SKILL.md +18 -11
  1813. package/skills/warlock-trace/SKILL.md +81 -0
  1814. package/skills/wire-socket/SKILL.md +8 -8
  1815. package/skills/write-seeder/SKILL.md +46 -32
  1816. package/skills/write-use-case/SKILL.md +40 -27
  1817. package/esm/http/uploads/matches-if-none-match.mjs +0 -13
  1818. package/esm/http/uploads/matches-if-none-match.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"storage-file.mjs","names":[],"sources":["../../../../../../../core/src/storage/storage-file.ts"],"sourcesContent":["import { basename, dirname, extname } from \"path\";\nimport type { Readable } from \"stream\";\nimport type {\n CloudStorageDriverContract,\n CloudStorageFileData,\n FileVisibility,\n StorageDriverContract,\n StorageFileData,\n StorageFileInfo,\n} from \"./types\";\n\n/**\n * StorageFile class - OOP wrapper for storage file operations\n *\n * Provides a fluent interface for working with files in storage,\n * wrapping the underlying driver operations.\n *\n * @example\n * ```typescript\n * const file = await storage.put(buffer, \"uploads/image.jpg\");\n *\n * // Properties (sync, from cached data)\n * file.name // \"image.jpg\"\n * file.extension // \"jpg\"\n * file.path // \"uploads/image.jpg\"\n * file.hash // \"sha256:abc123...\"\n *\n * // Operations\n * await file.copy(\"uploads/backup.jpg\")\n * await file.move(\"archive/image.jpg\")\n * await file.delete()\n *\n * // Content\n * const buffer = await file.contents();\n * const stream = await file.stream();\n * ```\n */\nexport class StorageFile {\n /**\n * Relative file path\n */\n protected _path: string;\n\n /**\n * The driver instance\n */\n protected _driver: StorageDriverContract;\n\n /**\n * Cached file data (from put operations or lazy loaded)\n */\n protected _data?: StorageFileData;\n\n /**\n * Whether the file has been deleted\n */\n protected _deleted = false;\n\n /**\n * Create a new StorageFile instance\n *\n * @param path - Relative file path\n * @param driver - Driver instance\n * @param data - Optional initial data from put/copy operations\n */\n public constructor(path: string, driver: StorageDriverContract, data?: StorageFileData) {\n this._path = path;\n this._driver = driver;\n this._data = data;\n }\n\n // ============================================================\n // Properties\n // ============================================================\n\n /**\n * Get the relative file path\n */\n public get path(): string {\n return this._path;\n }\n\n /**\n * Get the file name (with extension)\n */\n public get name(): string {\n return basename(this._path);\n }\n\n /**\n * Get the file extension (without dot)\n */\n public get extension(): string {\n return extname(this._path).slice(1).toLowerCase();\n }\n\n /**\n * Get the directory path\n */\n public get directory(): string {\n return dirname(this._path);\n }\n\n /**\n * Get the driver name\n */\n public get driver(): string {\n return this._driver.name;\n }\n\n /**\n * Check if file has been deleted\n */\n public get isDeleted(): boolean {\n return this._deleted;\n }\n\n /**\n * Get public URL (sync if data cached, otherwise computed)\n */\n public get url(): string {\n this.ensureNotDeleted();\n return this._data?.url || this._driver.url(this._path);\n }\n\n /**\n * Get the absolute filesystem path (local driver only)\n */\n public get absolutePath(): string | undefined {\n this.ensureNotDeleted();\n if (\"path\" in this._driver && typeof this._driver.path === \"function\") {\n return this._driver.path(this._path);\n }\n\n return undefined;\n }\n\n /**\n * Get file hash (SHA-256, available from put operations)\n */\n public get hash(): string | undefined {\n return this._data?.hash;\n }\n\n // ============================================================\n // Data Methods (Lazy Loaded)\n // ============================================================\n\n /**\n * Get cached file data, or fetch it if not available\n */\n public async data(): Promise<StorageFileData> {\n this.ensureNotDeleted();\n if (!this._data) {\n // Fetch info and construct data\n const info = await this.metadata();\n this._data = {\n path: info.path,\n url: this._driver.url(this._path),\n size: info.size,\n hash: \"\", // Not available from metadata\n mimeType: info.mimeType || \"application/octet-stream\",\n driver: this._driver.name,\n };\n }\n return this._data;\n }\n\n /**\n * Get file size in bytes\n */\n public async size(): Promise<number> {\n const data = await this.data();\n return data.size;\n }\n\n /**\n * Get MIME type\n */\n public async mimeType(): Promise<string> {\n const data = await this.data();\n return data.mimeType;\n }\n\n /**\n * Get last modified date (fetches from driver)\n */\n public async lastModified(): Promise<Date | undefined> {\n this.ensureNotDeleted();\n const info = await this.metadata();\n return info.lastModified;\n }\n\n /**\n * Get ETag (cloud drivers, fetches from driver)\n */\n public async etag(): Promise<string | undefined> {\n this.ensureNotDeleted();\n const info = await this.metadata();\n return info.etag;\n }\n\n // ============================================================\n // Content Methods\n // ============================================================\n\n /**\n * Get file contents as Buffer\n */\n public async contents(): Promise<Buffer> {\n this.ensureNotDeleted();\n return this._driver.get(this._path);\n }\n\n /**\n * Get file contents as readable stream\n */\n public async stream(): Promise<Readable> {\n this.ensureNotDeleted();\n return this._driver.getStream(this._path);\n }\n\n /**\n * Get file contents as UTF-8 text\n */\n public async text(): Promise<string> {\n const buffer = await this.contents();\n return buffer.toString(\"utf-8\");\n }\n\n /**\n * Get file contents as base64 string\n */\n public async base64(): Promise<string> {\n const buffer = await this.contents();\n return buffer.toString(\"base64\");\n }\n\n /**\n * Get file contents as data URL\n */\n public async dataUrl(): Promise<string> {\n const [buffer, data] = await Promise.all([this.contents(), this.data()]);\n return `data:${data.mimeType};base64,${buffer.toString(\"base64\")}`;\n }\n\n // ============================================================\n // URL Methods\n // ============================================================\n\n /**\n * Get a temporary signed URL\n *\n * @param expiresIn - Seconds until expiration (default: 3600)\n */\n public async temporaryUrl(expiresIn = 3600): Promise<string> {\n this.ensureNotDeleted();\n return this._driver.temporaryUrl(this._path, expiresIn);\n }\n\n // ============================================================\n // File Operations\n // ============================================================\n\n /**\n * Check if the file exists\n */\n public async exists(): Promise<boolean> {\n if (this._deleted) return false;\n return this._driver.exists(this._path);\n }\n\n /**\n * Copy the file to a new location\n *\n * @param destination - Destination path\n * @returns New StorageFile instance at destination\n */\n public async copy(destination: string): Promise<StorageFile> {\n this.ensureNotDeleted();\n const result = await this._driver.copy(this._path, destination);\n return new StorageFile(destination, this._driver, result);\n }\n\n /**\n * Move the file to a new location\n *\n * @param destination - Destination path\n * @returns This StorageFile instance with updated path\n */\n public async move(destination: string): Promise<this> {\n this.ensureNotDeleted();\n const result = await this._driver.move(this._path, destination);\n this._path = destination;\n this._data = result; // Update cached data\n return this;\n }\n\n /**\n * Rename the file (move within same directory)\n *\n * @param newName - New file name\n * @returns This StorageFile instance with updated path\n */\n public async rename(newName: string): Promise<this> {\n const newPath = this.directory === \".\" ? newName : `${this.directory}/${newName}`;\n return this.move(newPath);\n }\n\n /**\n * Delete the file\n *\n * @returns true if deleted, false if not found\n */\n public async delete(): Promise<boolean> {\n this.ensureNotDeleted();\n const result = await this._driver.delete(this._path);\n this._deleted = true;\n return result;\n }\n\n // ============================================================\n // Cloud-Specific Methods\n // ============================================================\n\n /**\n * Set file visibility (cloud drivers only)\n *\n * @param visibility - \"public\" or \"private\"\n * @throws Error if driver doesn't support visibility\n */\n public async setVisibility(visibility: FileVisibility): Promise<this> {\n this.ensureNotDeleted();\n\n if (!(\"setVisibility\" in this._driver)) {\n throw new Error(\"setVisibility is only available for cloud storage drivers\");\n }\n\n await (this._driver as CloudStorageDriverContract).setVisibility(this._path, visibility);\n return this;\n }\n\n /**\n * Get file visibility (cloud drivers only)\n *\n * @throws Error if driver doesn't support visibility\n */\n public async getVisibility(): Promise<FileVisibility> {\n this.ensureNotDeleted();\n\n if (!(\"getVisibility\" in this._driver)) {\n throw new Error(\"getVisibility is only available for cloud storage drivers\");\n }\n\n return (this._driver as CloudStorageDriverContract).getVisibility(this._path);\n }\n\n /**\n * Set storage class (cloud drivers only)\n *\n * @param storageClass - Storage class (e.g., \"STANDARD\", \"GLACIER\")\n * @throws Error if driver doesn't support storage class\n */\n public async setStorageClass(storageClass: string): Promise<this> {\n this.ensureNotDeleted();\n\n if (!(\"setStorageClass\" in this._driver)) {\n throw new Error(\"setStorageClass is only available for cloud storage drivers\");\n }\n\n await (this._driver as CloudStorageDriverContract).setStorageClass(this._path, storageClass);\n return this;\n }\n\n // ============================================================\n // Utilities\n // ============================================================\n\n /**\n * Ensure the file has not been deleted\n */\n protected ensureNotDeleted(): void {\n if (this._deleted) {\n throw new Error(`File \"${this._path}\" has been deleted`);\n }\n }\n\n /**\n * Create a StorageFile instance from StorageFileData\n *\n * @param data - Storage file data from put/copy/move operations\n * @param driver - Driver instance\n */\n public static fromData(\n data: StorageFileData | CloudStorageFileData,\n driver: StorageDriverContract,\n ): StorageFile {\n return new StorageFile(data.path, driver, data);\n }\n\n /**\n * Get file metadata\n */\n public async metadata(): Promise<StorageFileInfo> {\n this.ensureNotDeleted();\n return this._driver.metadata(this._path);\n }\n\n /**\n * Determine if this file is an image type\n */\n public async isImage() {\n const metadata = await this.metadata();\n return metadata.mimeType!.startsWith(\"image/\");\n }\n\n /**\n * Determine if this file is a document type\n */\n public async isDocument() {\n const metadata = await this.metadata();\n return metadata.mimeType!.startsWith(\"application/\");\n }\n\n /**\n * Determine if this file is a pdf type\n */\n public async isPdf() {\n const metadata = await this.metadata();\n return metadata.mimeType!.startsWith(\"application/pdf\");\n }\n\n /**\n * Determine if this file is an excel file (any support excel file)\n */\n public async isExcel() {\n const metadata = await this.metadata();\n return (\n metadata.mimeType!.startsWith(\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n ) || metadata.mimeType!.startsWith(\"application/vnd.ms-excel\")\n );\n }\n\n /**\n * Determine if this file is a doc file\n */\n public async isDoc() {\n const metadata = await this.metadata();\n return (\n metadata.mimeType!.startsWith(\"application/msword\") ||\n metadata.mimeType!.startsWith(\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n )\n );\n }\n\n /**\n * Determine if this file is an audio type\n */\n public async isAudio() {\n const metadata = await this.metadata();\n return metadata.mimeType!.startsWith(\"audio/\");\n }\n\n /**\n * Determine if this file is a video type\n */\n public async isVideo() {\n const metadata = await this.metadata();\n return metadata.mimeType!.startsWith(\"video/\");\n }\n\n /**\n * Convert to plain object (returns cached data or constructs it)\n */\n public toJSON(): {\n path: string;\n name: string;\n extension: string;\n driver: string;\n url: string;\n hash?: string;\n size?: number;\n mimeType?: string;\n } {\n return {\n path: this._path,\n name: this.name,\n extension: this.extension,\n driver: this._driver.name,\n url: this._deleted ? \"\" : this.url,\n hash: this._data?.hash,\n size: this._data?.size,\n mimeType: this._data?.mimeType,\n };\n }\n\n /**\n * String representation\n */\n public toString(): string {\n return this._path;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqCA,IAAa,cAAb,MAAa,YAAY;;;;;;;;CA4BvB,AAAO,YAAY,MAAc,QAA+B,MAAwB;kBATnE;EAUnB,KAAK,QAAQ;EACb,KAAK,UAAU;EACf,KAAK,QAAQ;CACf;;;;CASA,IAAW,OAAe;EACxB,OAAO,KAAK;CACd;;;;CAKA,IAAW,OAAe;EACxB,OAAO,SAAS,KAAK,KAAK;CAC5B;;;;CAKA,IAAW,YAAoB;EAC7B,OAAO,QAAQ,KAAK,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY;CAClD;;;;CAKA,IAAW,YAAoB;EAC7B,OAAO,QAAQ,KAAK,KAAK;CAC3B;;;;CAKA,IAAW,SAAiB;EAC1B,OAAO,KAAK,QAAQ;CACtB;;;;CAKA,IAAW,YAAqB;EAC9B,OAAO,KAAK;CACd;;;;CAKA,IAAW,MAAc;EACvB,KAAK,iBAAiB;EACtB,OAAO,KAAK,OAAO,OAAO,KAAK,QAAQ,IAAI,KAAK,KAAK;CACvD;;;;CAKA,IAAW,eAAmC;EAC5C,KAAK,iBAAiB;EACtB,IAAI,UAAU,KAAK,WAAW,OAAO,KAAK,QAAQ,SAAS,YACzD,OAAO,KAAK,QAAQ,KAAK,KAAK,KAAK;CAIvC;;;;CAKA,IAAW,OAA2B;EACpC,OAAO,KAAK,OAAO;CACrB;;;;CASA,MAAa,OAAiC;EAC5C,KAAK,iBAAiB;EACtB,IAAI,CAAC,KAAK,OAAO;GAEf,MAAM,OAAO,MAAM,KAAK,SAAS;GACjC,KAAK,QAAQ;IACX,MAAM,KAAK;IACX,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK;IAChC,MAAM,KAAK;IACX,MAAM;IACN,UAAU,KAAK,YAAY;IAC3B,QAAQ,KAAK,QAAQ;GACvB;EACF;EACA,OAAO,KAAK;CACd;;;;CAKA,MAAa,OAAwB;EAEnC,QAAO,MADY,KAAK,KAAK,EAClB,CAAC;CACd;;;;CAKA,MAAa,WAA4B;EAEvC,QAAO,MADY,KAAK,KAAK,EAClB,CAAC;CACd;;;;CAKA,MAAa,eAA0C;EACrD,KAAK,iBAAiB;EAEtB,QAAO,MADY,KAAK,SAAS,EACtB,CAAC;CACd;;;;CAKA,MAAa,OAAoC;EAC/C,KAAK,iBAAiB;EAEtB,QAAO,MADY,KAAK,SAAS,EACtB,CAAC;CACd;;;;CASA,MAAa,WAA4B;EACvC,KAAK,iBAAiB;EACtB,OAAO,KAAK,QAAQ,IAAI,KAAK,KAAK;CACpC;;;;CAKA,MAAa,SAA4B;EACvC,KAAK,iBAAiB;EACtB,OAAO,KAAK,QAAQ,UAAU,KAAK,KAAK;CAC1C;;;;CAKA,MAAa,OAAwB;EAEnC,QAAO,MADc,KAAK,SAAS,EACtB,CAAC,SAAS,OAAO;CAChC;;;;CAKA,MAAa,SAA0B;EAErC,QAAO,MADc,KAAK,SAAS,EACtB,CAAC,SAAS,QAAQ;CACjC;;;;CAKA,MAAa,UAA2B;EACtC,MAAM,CAAC,QAAQ,QAAQ,MAAM,QAAQ,IAAI,CAAC,KAAK,SAAS,GAAG,KAAK,KAAK,CAAC,CAAC;EACvE,OAAO,QAAQ,KAAK,SAAS,UAAU,OAAO,SAAS,QAAQ;CACjE;;;;;;CAWA,MAAa,aAAa,YAAY,MAAuB;EAC3D,KAAK,iBAAiB;EACtB,OAAO,KAAK,QAAQ,aAAa,KAAK,OAAO,SAAS;CACxD;;;;CASA,MAAa,SAA2B;EACtC,IAAI,KAAK,UAAU,OAAO;EAC1B,OAAO,KAAK,QAAQ,OAAO,KAAK,KAAK;CACvC;;;;;;;CAQA,MAAa,KAAK,aAA2C;EAC3D,KAAK,iBAAiB;EACtB,MAAM,SAAS,MAAM,KAAK,QAAQ,KAAK,KAAK,OAAO,WAAW;EAC9D,OAAO,IAAI,YAAY,aAAa,KAAK,SAAS,MAAM;CAC1D;;;;;;;CAQA,MAAa,KAAK,aAAoC;EACpD,KAAK,iBAAiB;EACtB,MAAM,SAAS,MAAM,KAAK,QAAQ,KAAK,KAAK,OAAO,WAAW;EAC9D,KAAK,QAAQ;EACb,KAAK,QAAQ;EACb,OAAO;CACT;;;;;;;CAQA,MAAa,OAAO,SAAgC;EAClD,MAAM,UAAU,KAAK,cAAc,MAAM,UAAU,GAAG,KAAK,UAAU,GAAG;EACxE,OAAO,KAAK,KAAK,OAAO;CAC1B;;;;;;CAOA,MAAa,SAA2B;EACtC,KAAK,iBAAiB;EACtB,MAAM,SAAS,MAAM,KAAK,QAAQ,OAAO,KAAK,KAAK;EACnD,KAAK,WAAW;EAChB,OAAO;CACT;;;;;;;CAYA,MAAa,cAAc,YAA2C;EACpE,KAAK,iBAAiB;EAEtB,IAAI,EAAE,mBAAmB,KAAK,UAC5B,MAAM,IAAI,MAAM,2DAA2D;EAG7E,MAAO,KAAK,QAAuC,cAAc,KAAK,OAAO,UAAU;EACvF,OAAO;CACT;;;;;;CAOA,MAAa,gBAAyC;EACpD,KAAK,iBAAiB;EAEtB,IAAI,EAAE,mBAAmB,KAAK,UAC5B,MAAM,IAAI,MAAM,2DAA2D;EAG7E,OAAQ,KAAK,QAAuC,cAAc,KAAK,KAAK;CAC9E;;;;;;;CAQA,MAAa,gBAAgB,cAAqC;EAChE,KAAK,iBAAiB;EAEtB,IAAI,EAAE,qBAAqB,KAAK,UAC9B,MAAM,IAAI,MAAM,6DAA6D;EAG/E,MAAO,KAAK,QAAuC,gBAAgB,KAAK,OAAO,YAAY;EAC3F,OAAO;CACT;;;;CASA,AAAU,mBAAyB;EACjC,IAAI,KAAK,UACP,MAAM,IAAI,MAAM,SAAS,KAAK,MAAM,mBAAmB;CAE3D;;;;;;;CAQA,OAAc,SACZ,MACA,QACa;EACb,OAAO,IAAI,YAAY,KAAK,MAAM,QAAQ,IAAI;CAChD;;;;CAKA,MAAa,WAAqC;EAChD,KAAK,iBAAiB;EACtB,OAAO,KAAK,QAAQ,SAAS,KAAK,KAAK;CACzC;;;;CAKA,MAAa,UAAU;EAErB,QAAO,MADgB,KAAK,SAAS,EACtB,CAAC,SAAU,WAAW,QAAQ;CAC/C;;;;CAKA,MAAa,aAAa;EAExB,QAAO,MADgB,KAAK,SAAS,EACtB,CAAC,SAAU,WAAW,cAAc;CACrD;;;;CAKA,MAAa,QAAQ;EAEnB,QAAO,MADgB,KAAK,SAAS,EACtB,CAAC,SAAU,WAAW,iBAAiB;CACxD;;;;CAKA,MAAa,UAAU;EACrB,MAAM,WAAW,MAAM,KAAK,SAAS;EACrC,OACE,SAAS,SAAU,WACjB,mEACF,KAAK,SAAS,SAAU,WAAW,0BAA0B;CAEjE;;;;CAKA,MAAa,QAAQ;EACnB,MAAM,WAAW,MAAM,KAAK,SAAS;EACrC,OACE,SAAS,SAAU,WAAW,oBAAoB,KAClD,SAAS,SAAU,WACjB,yEACF;CAEJ;;;;CAKA,MAAa,UAAU;EAErB,QAAO,MADgB,KAAK,SAAS,EACtB,CAAC,SAAU,WAAW,QAAQ;CAC/C;;;;CAKA,MAAa,UAAU;EAErB,QAAO,MADgB,KAAK,SAAS,EACtB,CAAC,SAAU,WAAW,QAAQ;CAC/C;;;;CAKA,AAAO,SASL;EACA,OAAO;GACL,MAAM,KAAK;GACX,MAAM,KAAK;GACX,WAAW,KAAK;GAChB,QAAQ,KAAK,QAAQ;GACrB,KAAK,KAAK,WAAW,KAAK,KAAK;GAC/B,MAAM,KAAK,OAAO;GAClB,MAAM,KAAK,OAAO;GAClB,UAAU,KAAK,OAAO;EACxB;CACF;;;;CAKA,AAAO,WAAmB;EACxB,OAAO,KAAK;CACd;AACF"}
1
+ {"version":3,"file":"storage-file.mjs","names":[],"sources":["../../../../../../../../packages/core/src/storage/storage-file.ts"],"sourcesContent":["import { basename, dirname, extname } from \"path\";\nimport type { Readable } from \"stream\";\nimport type {\n CloudStorageDriverContract,\n CloudStorageFileData,\n FileVisibility,\n StorageDriverContract,\n StorageFileData,\n StorageFileInfo,\n} from \"./types\";\n\n/**\n * StorageFile class - OOP wrapper for storage file operations\n *\n * Provides a fluent interface for working with files in storage,\n * wrapping the underlying driver operations.\n *\n * @example\n * ```typescript\n * const file = await storage.put(buffer, \"uploads/image.jpg\");\n *\n * // Properties (sync, from cached data)\n * file.name // \"image.jpg\"\n * file.extension // \"jpg\"\n * file.path // \"uploads/image.jpg\"\n * file.hash // \"sha256:abc123...\"\n *\n * // Operations\n * await file.copy(\"uploads/backup.jpg\")\n * await file.move(\"archive/image.jpg\")\n * await file.delete()\n *\n * // Content\n * const buffer = await file.contents();\n * const stream = await file.stream();\n * ```\n */\nexport class StorageFile {\n /**\n * Relative file path\n */\n protected _path: string;\n\n /**\n * The driver instance\n */\n protected _driver: StorageDriverContract;\n\n /**\n * Cached file data (from put operations or lazy loaded)\n */\n protected _data?: StorageFileData;\n\n /**\n * Whether the file has been deleted\n */\n protected _deleted = false;\n\n /**\n * Create a new StorageFile instance\n *\n * @param path - Relative file path\n * @param driver - Driver instance\n * @param data - Optional initial data from put/copy operations\n */\n public constructor(path: string, driver: StorageDriverContract, data?: StorageFileData) {\n this._path = path;\n this._driver = driver;\n this._data = data;\n }\n\n // ============================================================\n // Properties\n // ============================================================\n\n /**\n * Get the relative file path\n */\n public get path(): string {\n return this._path;\n }\n\n /**\n * Get the file name (with extension)\n */\n public get name(): string {\n return basename(this._path);\n }\n\n /**\n * Get the file extension (without dot)\n */\n public get extension(): string {\n return extname(this._path).slice(1).toLowerCase();\n }\n\n /**\n * Get the directory path\n */\n public get directory(): string {\n return dirname(this._path);\n }\n\n /**\n * Get the driver name\n */\n public get driver(): string {\n return this._driver.name;\n }\n\n /**\n * Check if file has been deleted\n */\n public get isDeleted(): boolean {\n return this._deleted;\n }\n\n /**\n * Get public URL (sync if data cached, otherwise computed)\n */\n public get url(): string {\n this.ensureNotDeleted();\n return this._data?.url || this._driver.url(this._path);\n }\n\n /**\n * Get the absolute filesystem path (local driver only)\n */\n public get absolutePath(): string | undefined {\n this.ensureNotDeleted();\n if (\"path\" in this._driver && typeof this._driver.path === \"function\") {\n return this._driver.path(this._path);\n }\n\n return undefined;\n }\n\n /**\n * Get file hash (SHA-256, available from put operations)\n */\n public get hash(): string | undefined {\n return this._data?.hash;\n }\n\n // ============================================================\n // Data Methods (Lazy Loaded)\n // ============================================================\n\n /**\n * Get cached file data, or fetch it if not available\n */\n public async data(): Promise<StorageFileData> {\n this.ensureNotDeleted();\n if (!this._data) {\n // Fetch info and construct data\n const info = await this.metadata();\n this._data = {\n path: info.path,\n url: this._driver.url(this._path),\n size: info.size,\n hash: \"\", // Not available from metadata\n mimeType: info.mimeType || \"application/octet-stream\",\n driver: this._driver.name,\n };\n }\n return this._data;\n }\n\n /**\n * Get file size in bytes\n */\n public async size(): Promise<number> {\n const data = await this.data();\n return data.size;\n }\n\n /**\n * Get MIME type\n */\n public async mimeType(): Promise<string> {\n const data = await this.data();\n return data.mimeType;\n }\n\n /**\n * Get last modified date (fetches from driver)\n */\n public async lastModified(): Promise<Date | undefined> {\n this.ensureNotDeleted();\n const info = await this.metadata();\n return info.lastModified;\n }\n\n /**\n * Get ETag (cloud drivers, fetches from driver)\n */\n public async etag(): Promise<string | undefined> {\n this.ensureNotDeleted();\n const info = await this.metadata();\n return info.etag;\n }\n\n // ============================================================\n // Content Methods\n // ============================================================\n\n /**\n * Get file contents as Buffer\n */\n public async contents(): Promise<Buffer> {\n this.ensureNotDeleted();\n return this._driver.get(this._path);\n }\n\n /**\n * Get file contents as readable stream\n */\n public async stream(): Promise<Readable> {\n this.ensureNotDeleted();\n return this._driver.getStream(this._path);\n }\n\n /**\n * Get file contents as UTF-8 text\n */\n public async text(): Promise<string> {\n const buffer = await this.contents();\n return buffer.toString(\"utf-8\");\n }\n\n /**\n * Get file contents as base64 string\n */\n public async base64(): Promise<string> {\n const buffer = await this.contents();\n return buffer.toString(\"base64\");\n }\n\n /**\n * Get file contents as data URL\n */\n public async dataUrl(): Promise<string> {\n const [buffer, data] = await Promise.all([this.contents(), this.data()]);\n return `data:${data.mimeType};base64,${buffer.toString(\"base64\")}`;\n }\n\n // ============================================================\n // URL Methods\n // ============================================================\n\n /**\n * Get a temporary signed URL\n *\n * @param expiresIn - Seconds until expiration (default: 3600)\n */\n public async temporaryUrl(expiresIn = 3600): Promise<string> {\n this.ensureNotDeleted();\n return this._driver.temporaryUrl(this._path, expiresIn);\n }\n\n // ============================================================\n // File Operations\n // ============================================================\n\n /**\n * Check if the file exists\n */\n public async exists(): Promise<boolean> {\n if (this._deleted) return false;\n return this._driver.exists(this._path);\n }\n\n /**\n * Copy the file to a new location\n *\n * @param destination - Destination path\n * @returns New StorageFile instance at destination\n */\n public async copy(destination: string): Promise<StorageFile> {\n this.ensureNotDeleted();\n const result = await this._driver.copy(this._path, destination);\n return new StorageFile(destination, this._driver, result);\n }\n\n /**\n * Move the file to a new location\n *\n * @param destination - Destination path\n * @returns This StorageFile instance with updated path\n */\n public async move(destination: string): Promise<this> {\n this.ensureNotDeleted();\n const result = await this._driver.move(this._path, destination);\n this._path = destination;\n this._data = result; // Update cached data\n return this;\n }\n\n /**\n * Rename the file (move within same directory)\n *\n * @param newName - New file name\n * @returns This StorageFile instance with updated path\n */\n public async rename(newName: string): Promise<this> {\n const newPath = this.directory === \".\" ? newName : `${this.directory}/${newName}`;\n return this.move(newPath);\n }\n\n /**\n * Delete the file\n *\n * @returns true if deleted, false if not found\n */\n public async delete(): Promise<boolean> {\n this.ensureNotDeleted();\n const result = await this._driver.delete(this._path);\n this._deleted = true;\n return result;\n }\n\n // ============================================================\n // Cloud-Specific Methods\n // ============================================================\n\n /**\n * Set file visibility (cloud drivers only)\n *\n * @param visibility - \"public\" or \"private\"\n * @throws Error if driver doesn't support visibility\n */\n public async setVisibility(visibility: FileVisibility): Promise<this> {\n this.ensureNotDeleted();\n\n if (!(\"setVisibility\" in this._driver)) {\n throw new Error(\"setVisibility is only available for cloud storage drivers\");\n }\n\n await (this._driver as CloudStorageDriverContract).setVisibility(this._path, visibility);\n return this;\n }\n\n /**\n * Get file visibility (cloud drivers only)\n *\n * @throws Error if driver doesn't support visibility\n */\n public async getVisibility(): Promise<FileVisibility> {\n this.ensureNotDeleted();\n\n if (!(\"getVisibility\" in this._driver)) {\n throw new Error(\"getVisibility is only available for cloud storage drivers\");\n }\n\n return (this._driver as CloudStorageDriverContract).getVisibility(this._path);\n }\n\n /**\n * Set storage class (cloud drivers only)\n *\n * @param storageClass - Storage class (e.g., \"STANDARD\", \"GLACIER\")\n * @throws Error if driver doesn't support storage class\n */\n public async setStorageClass(storageClass: string): Promise<this> {\n this.ensureNotDeleted();\n\n if (!(\"setStorageClass\" in this._driver)) {\n throw new Error(\"setStorageClass is only available for cloud storage drivers\");\n }\n\n await (this._driver as CloudStorageDriverContract).setStorageClass(this._path, storageClass);\n return this;\n }\n\n // ============================================================\n // Utilities\n // ============================================================\n\n /**\n * Ensure the file has not been deleted\n */\n protected ensureNotDeleted(): void {\n if (this._deleted) {\n throw new Error(`File \"${this._path}\" has been deleted`);\n }\n }\n\n /**\n * Create a StorageFile instance from StorageFileData\n *\n * @param data - Storage file data from put/copy/move operations\n * @param driver - Driver instance\n */\n public static fromData(\n data: StorageFileData | CloudStorageFileData,\n driver: StorageDriverContract,\n ): StorageFile {\n return new StorageFile(data.path, driver, data);\n }\n\n /**\n * Get file metadata\n */\n public async metadata(): Promise<StorageFileInfo> {\n this.ensureNotDeleted();\n return this._driver.metadata(this._path);\n }\n\n /**\n * Determine if this file is an image type\n */\n public async isImage() {\n const metadata = await this.metadata();\n return metadata.mimeType!.startsWith(\"image/\");\n }\n\n /**\n * Determine if this file is a document type\n */\n public async isDocument() {\n const metadata = await this.metadata();\n return metadata.mimeType!.startsWith(\"application/\");\n }\n\n /**\n * Determine if this file is a pdf type\n */\n public async isPdf() {\n const metadata = await this.metadata();\n return metadata.mimeType!.startsWith(\"application/pdf\");\n }\n\n /**\n * Determine if this file is an excel file (any support excel file)\n */\n public async isExcel() {\n const metadata = await this.metadata();\n return (\n metadata.mimeType!.startsWith(\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n ) || metadata.mimeType!.startsWith(\"application/vnd.ms-excel\")\n );\n }\n\n /**\n * Determine if this file is a doc file\n */\n public async isDoc() {\n const metadata = await this.metadata();\n return (\n metadata.mimeType!.startsWith(\"application/msword\") ||\n metadata.mimeType!.startsWith(\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n )\n );\n }\n\n /**\n * Determine if this file is an audio type\n */\n public async isAudio() {\n const metadata = await this.metadata();\n return metadata.mimeType!.startsWith(\"audio/\");\n }\n\n /**\n * Determine if this file is a video type\n */\n public async isVideo() {\n const metadata = await this.metadata();\n return metadata.mimeType!.startsWith(\"video/\");\n }\n\n /**\n * Convert to plain object (returns cached data or constructs it)\n */\n public toJSON(): {\n path: string;\n name: string;\n extension: string;\n driver: string;\n url: string;\n hash?: string;\n size?: number;\n mimeType?: string;\n } {\n return {\n path: this._path,\n name: this.name,\n extension: this.extension,\n driver: this._driver.name,\n url: this._deleted ? \"\" : this.url,\n hash: this._data?.hash,\n size: this._data?.size,\n mimeType: this._data?.mimeType,\n };\n }\n\n /**\n * String representation\n */\n public toString(): string {\n return this._path;\n }\n}\n"],"mappings":"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"}
@@ -1,11 +1,11 @@
1
1
  import { StorageFile } from "./storage-file.mjs";
2
- import { CloudStorageDriverContract, CloudStorageDriverOptions, DeleteManyResult, FileVisibility, ListOptions, LocalStorageDriverOptions, PresignedOptions, PresignedUploadOptions, PutFromUrlOptions, PutOptions, R2StorageDriverOptions, ScopedStorageContract, StorageDriverConfig, StorageDriverContract, StorageDriverName, StorageEventHandler, StorageEventPayload, StorageEventType, StorageFileInfo, StorageManagerContract, TemporaryTokenValidation } from "./types.mjs";
3
2
  import { ScopedStorage } from "./scoped-storage.mjs";
3
+ import { CloudStorageDriverContract, CloudStorageDriverOptions, DeleteManyResult, FileVisibility, ListOptions, LocalStorageDriverOptions, PresignedOptions, PresignedUploadOptions, PutFromUrlOptions, PutOptions, R2StorageDriverOptions, StorageDriverConfig, StorageDriverContract, StorageDriverName, StorageEventHandler, StorageEventPayload, StorageEventType, StorageFileInfo, StorageManagerContract, TemporaryTokenValidation } from "./types.mjs";
4
4
  import { UploadedFile } from "../http/uploaded-file.mjs";
5
5
  import { EventSubscription } from "@mongez/events";
6
6
  import { Readable } from "stream";
7
7
 
8
- //#region ../core/src/storage/storage.d.ts
8
+ //#region ../../packages/core/src/storage/storage.d.ts
9
9
  /**
10
10
  * Storage Manager
11
11
  *
@@ -79,6 +79,20 @@ declare class Storage extends ScopedStorage implements StorageManagerContract {
79
79
  * Called automatically on first driver access.
80
80
  */
81
81
  init(): Promise<void>;
82
+ /**
83
+ * Whether `init()` has run (and `reset()` has not run since).
84
+ */
85
+ get isInitialized(): boolean;
86
+ /**
87
+ * The names of every registered driver configuration, including the
88
+ * built-in `local` one. The test kit's storage fake reads it to replace
89
+ * every driver with a local one.
90
+ */
91
+ driverNames(): StorageDriverName[];
92
+ /**
93
+ * The name of the default driver, once initialized.
94
+ */
95
+ getDefaultName(): StorageDriverName | undefined;
82
96
  /**
83
97
  * Reset storage defaults
84
98
  */
@@ -137,7 +151,7 @@ declare class Storage extends ScopedStorage implements StorageManagerContract {
137
151
  * console.log(localFile.url);
138
152
  * ```
139
153
  */
140
- use(name: StorageDriverName): ScopedStorageContract;
154
+ use(name: StorageDriverName): ScopedStorage;
141
155
  /**
142
156
  * Get a raw driver instance
143
157
  *
@@ -1 +1 @@
1
- {"version":3,"file":"storage.d.mts","names":[],"sources":["../../../../../../../core/src/storage/storage.ts"],"mappings":"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"}
1
+ {"version":3,"file":"storage.d.mts","names":[],"sources":["../../../../../../../../packages/core/src/storage/storage.ts"],"mappings":"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"}
@@ -7,6 +7,7 @@ import { safeFetchToBuffer } from "./utils/safe-fetch.mjs";
7
7
  import { ScopedStorage } from "./scoped-storage.mjs";
8
8
  import { storageDriverContext } from "./context/storage-driver-context.mjs";
9
9
  import { DOSpacesDriver } from "./drivers/do-spaces-driver.mjs";
10
+ import { registerLocalDiskConfigurations } from "./local-disk-roots.mjs";
10
11
  import { LocalDriver } from "./drivers/local-driver.mjs";
11
12
  import { R2Driver } from "./drivers/r2-driver.mjs";
12
13
  import { S3Driver } from "./drivers/s3-driver.mjs";
@@ -14,7 +15,7 @@ import path from "path";
14
15
  import events from "@mongez/events";
15
16
  import fs from "fs";
16
17
 
17
- //#region ../core/src/storage/storage.ts
18
+ //#region ../../packages/core/src/storage/storage.ts
18
19
  /**
19
20
  * Storage Manager
20
21
  *
@@ -66,6 +67,7 @@ var Storage = class extends ScopedStorage {
66
67
  this.drivers = /* @__PURE__ */ new Map();
67
68
  this.configs = /* @__PURE__ */ new Map();
68
69
  this.initialized = false;
70
+ registerLocalDiskConfigurations(() => this.configs);
69
71
  }
70
72
  /**
71
73
  * Ensure storage is initialized (lazy initialization)
@@ -81,6 +83,26 @@ var Storage = class extends ScopedStorage {
81
83
  this._driver = this.resolveDriver(this.defaultDriverName);
82
84
  }
83
85
  /**
86
+ * Whether `init()` has run (and `reset()` has not run since).
87
+ */
88
+ get isInitialized() {
89
+ return this.initialized;
90
+ }
91
+ /**
92
+ * The names of every registered driver configuration, including the
93
+ * built-in `local` one. The test kit's storage fake reads it to replace
94
+ * every driver with a local one.
95
+ */
96
+ driverNames() {
97
+ return [...this.configs.keys()];
98
+ }
99
+ /**
100
+ * The name of the default driver, once initialized.
101
+ */
102
+ getDefaultName() {
103
+ return this.defaultDriverName ?? void 0;
104
+ }
105
+ /**
84
106
  * Reset storage defaults
85
107
  */
86
108
  reset() {
@@ -1 +1 @@
1
- {"version":3,"file":"storage.mjs","names":[],"sources":["../../../../../../../core/src/storage/storage.ts"],"sourcesContent":["import events, { type EventSubscription } from \"@mongez/events\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport type { Readable } from \"stream\";\nimport type { UploadedFile } from \"../http\";\nimport { uploadsPath } from \"../utils/paths\";\nimport { storageConfig, storageConfigurations } from \"./config\";\nimport { storageDriverContext } from \"./context/storage-driver-context\";\nimport { DOSpacesDriver } from \"./drivers/do-spaces-driver\";\nimport { LocalDriver } from \"./drivers/local-driver\";\nimport { R2Driver } from \"./drivers/r2-driver\";\nimport { S3Driver } from \"./drivers/s3-driver\";\nimport { ScopedStorage } from \"./scoped-storage\";\nimport { StorageFile } from \"./storage-file\";\nimport { safeFetchToBuffer } from \"./utils/safe-fetch\";\nimport { StorageCapabilityError } from \"./utils/storage-capability-error\";\nimport { StorageNotInitializedError } from \"./utils/storage-not-initialized-error\";\nimport type {\n CloudStorageDriverContract,\n CloudStorageDriverOptions,\n DeleteManyResult,\n FileVisibility,\n ListOptions,\n LocalStorageDriverOptions,\n PresignedOptions,\n PresignedUploadOptions,\n PutFromUrlOptions,\n PutOptions,\n R2StorageDriverOptions,\n ScopedStorageContract,\n StorageCopyEventPayload,\n StorageDriverConfig,\n StorageDriverContract,\n StorageDriverName,\n StorageEventHandler,\n StorageEventPayload,\n StorageEventType,\n StorageFileInfo,\n StorageManagerContract,\n StoragePutEventPayload,\n TemporaryTokenValidation,\n} from \"./types\";\n\n/**\n * Storage Manager\n *\n * Provides a unified interface for file storage operations across multiple\n * drivers (local, S3, R2, DigitalOcean Spaces). Extends `ScopedStorage` to\n * inherit all base operations while adding driver management and events.\n *\n * All operations return `StorageFile` instances for a consistent, rich DX.\n *\n * @example\n * ```typescript\n * // Basic usage (uses default driver)\n * const file = await storage.put(buffer, \"uploads/image.jpg\");\n *\n * // With options\n * const file = await storage.put(buffer, \"uploads/image.jpg\", {\n * mimeType: \"image/jpeg\",\n * cacheControl: \"max-age=31536000\"\n * });\n *\n * // Using specific driver (also returns StorageFile)\n * const file = await storage.use(\"s3\").put(buffer, \"path/to/file\");\n *\n * // Get raw driver for advanced use\n * const driver = storage.driver(\"s3\");\n * const data = await driver.put(buffer, \"path/to/file\"); // Returns StorageFileData\n *\n * // Stream operations for large files\n * const stream = await storage.getStream(\"large-file.zip\");\n * await storage.putStream(readableStream, \"output/file.zip\");\n *\n * // Batch operations\n * const results = await storage.deleteMany([\"file1.txt\", \"file2.txt\"]);\n *\n * // Event hooks\n * storage.on(\"afterPut\", ({ location, file }) => {\n * console.log(`Uploaded ${location}`);\n * });\n * ```\n */\nexport class Storage extends ScopedStorage implements StorageManagerContract {\n /**\n * Registered drivers (cached instances)\n * @internal\n */\n protected drivers = new Map<string, StorageDriverContract>();\n\n /**\n * Driver configurations\n * @internal\n */\n protected configs = new Map<string, StorageDriverConfig>();\n\n /**\n * Default driver name\n * @internal\n */\n protected defaultDriverName!: StorageDriverName;\n\n /**\n * Whether the storage has been initialized\n * @internal\n */\n private initialized = false;\n\n /**\n * Create a new Storage manager instance\n *\n * Uses lazy initialization - driver is resolved on first access.\n */\n public constructor() {\n // Temp placeholder - will be replaced on first access\n super(null as unknown as StorageDriverContract);\n }\n\n /**\n * Ensure storage is initialized (lazy initialization)\n *\n * Called automatically on first driver access.\n */\n public async init(): Promise<void> {\n if (this.initialized) return;\n\n // Mark as initialized FIRST to prevent infinite recursion\n this.initialized = true;\n\n // Get default driver name from config\n\n const defaultName = storageConfig(\"default\", \"local\");\n\n this.defaultDriverName = defaultName as StorageDriverName;\n this.loadDriversFromConfig();\n\n // Now set the actual driver\n this._driver = this.resolveDriver(this.defaultDriverName);\n }\n\n /**\n * Reset storage defaults\n */\n public reset(): void {\n this.initialized = false;\n this.drivers.clear();\n this.configs.clear();\n this.defaultDriverName = null as unknown as StorageDriverName;\n this._driver = null as unknown as StorageDriverContract;\n }\n\n /**\n * Get the currently active driver (context-aware in future)\n *\n * Currently returns the default driver.\n * Will be enhanced to check AsyncLocalStorage context for multi-tenant support.\n *\n * @returns The active storage driver\n * @throws {StorageNotInitializedError} When neither a context driver nor\n * an initialized default driver is available\n */\n public override get activeDriver(): StorageDriverContract {\n // Check context for tenant-specific driver\n const contextDriver = storageDriverContext.getDriver();\n\n if (contextDriver) return contextDriver;\n\n if (!this._driver) throw new StorageNotInitializedError();\n\n return this._driver;\n }\n\n // ============================================================\n // Driver Management\n // ============================================================\n\n /**\n * Load drivers from configuration\n * @internal\n */\n protected loadDriversFromConfig(): void {\n // `activeDriver` is a synchronous getter, so an async resolver can never be\n // honoured. Fail loudly instead of silently ignoring it.\n if (storageConfig(\"resolver\")) {\n throw new Error(\n \"storage.resolver is not supported: use storageDriverContext (per-request driver) for multi-tenant storage.\",\n );\n }\n\n this.registerBuiltInLocalDriver();\n\n const drivers = storageConfig<Record<string, StorageDriverConfig>>(\"drivers\", {});\n\n for (const [name, config] of Object.entries(drivers)) {\n this.configs.set(name, config);\n }\n }\n\n /**\n * Register the built-in `local` driver, rooted at `uploadsPath()`.\n *\n * The storage connector starts unconditionally — unlike database, cache and\n * herald, it does not early-return when `config.get(\"storage\")` is absent —\n * on the stated grounds that `init()` falls back to a built-in local driver so\n * file storage works out of the box. That fallback did not exist: `init()`\n * resolved the default driver *name* and then found no config registered\n * under it, so **any app without `src/config/storage.ts` failed to boot**\n * with `Storage driver \"local\" is not configured`. Only scaffolded apps, which\n * always ship that file, hid it.\n *\n * Registered before the configured drivers so an app that defines its own\n * `local` entry overrides this one rather than fighting it.\n */\n protected registerBuiltInLocalDriver(): void {\n this.configs.set(\n \"local\",\n storageConfigurations.local({\n root: uploadsPath(),\n urlPrefix: \"/uploads\",\n }),\n );\n }\n\n /**\n * Get a scoped storage for a specific driver\n *\n * Returns a `ScopedStorage` instance that wraps the specified driver.\n * Operations on the returned instance also return `StorageFile` objects.\n *\n * @param name - Driver name as defined in configuration\n * @returns ScopedStorage instance for the specified driver\n *\n * @example\n * ```typescript\n * // Upload to S3\n * const s3File = await storage.use(\"s3\").put(buffer, \"images/photo.jpg\");\n *\n * // Upload to local\n * const localFile = await storage.use(\"local\").put(buffer, \"temp/file.txt\");\n *\n * // Both return StorageFile with identical API\n * console.log(s3File.url);\n * console.log(localFile.url);\n * ```\n */\n public use(name: StorageDriverName): ScopedStorageContract {\n return new ScopedStorage(this.getDriver(name));\n }\n\n /**\n * Get a raw driver instance\n *\n * Returns the underlying driver directly for advanced use cases.\n * Unlike `use()`, calling methods on the raw driver returns\n * `StorageFileData` instead of `StorageFile`.\n *\n * @param name - Driver name as defined in configuration\n * @returns Raw driver instance implementing StorageDriverContract\n *\n * @example\n * ```typescript\n * const driver = storage.getDriver(\"s3\");\n * const data = await driver.put(buffer, \"path/to/file\");\n * // data is StorageFileData, not StorageFile\n * ```\n */\n public getDriver(name: StorageDriverName): StorageDriverContract {\n return this.resolveDriver(name);\n }\n\n /**\n * Get root directory of current driver\n */\n public root(apepndedPath?: string): string {\n const rootPath = this.activeDriver.options?.root || \"\";\n\n return path.join(rootPath, apepndedPath || \"\");\n }\n\n /**\n * Use a cloud storage driver with extended cloud capabilities\n *\n * @param name - Cloud driver name (s3, r2, spaces)\n * @returns Driver instance implementing CloudStorageDriverContract\n * @throws Error if driver doesn't support cloud operations\n *\n * @example\n * ```typescript\n * const cloudDriver = storage.useCloud(\"s3\");\n * const presignedUrl = await cloudDriver.getPresignedUrl(\"private/doc.pdf\");\n * ```\n */\n public useCloud(name: StorageDriverName): CloudStorageDriverContract {\n const instance = this.getDriver(name);\n\n if (!this.isCloudDriver(instance)) {\n throw new Error(`Driver \"${name}\" does not support cloud operations`);\n }\n\n return instance as CloudStorageDriverContract;\n }\n\n /**\n * Register a new driver configuration at runtime\n *\n * Allows dynamic driver registration for multi-tenancy or\n * runtime configuration scenarios.\n *\n * @param name - Unique driver name\n * @param config - Driver configuration\n * @returns This instance for chaining\n *\n * @example\n * ```typescript\n * storage.register(\"tenant-s3\", {\n * driver: \"s3\",\n * bucket: \"tenant-bucket\",\n * region: \"us-east-1\",\n * accessKeyId: process.env.TENANT_AWS_KEY,\n * secretAccessKey: process.env.TENANT_AWS_SECRET\n * });\n *\n * await storage.use(\"tenant-s3\").put(buffer, \"file.txt\");\n * ```\n */\n public register(name: StorageDriverName, config: StorageDriverConfig): this {\n this.configs.set(name, config);\n this.drivers.delete(name); // Clear cached instance\n return this;\n }\n\n /**\n * Set the default driver name\n *\n * @param name - Driver name to use as default\n * @returns This instance for chaining\n *\n * @example\n * ```typescript\n * storage.setDefault(\"s3\");\n * await storage.put(buffer, \"file.txt\"); // Now uses S3\n * ```\n */\n public setDefault(name: StorageDriverName): this {\n this.defaultDriverName = name;\n this._driver = this.getDriver(name);\n return this;\n }\n\n /**\n * Check if current driver is a cloud driver\n *\n * @returns Promise resolving to true if the current driver supports cloud operations\n */\n public async isCloud(): Promise<boolean> {\n return this.isCloudDriver(this.activeDriver);\n }\n\n /**\n * Check if a driver instance supports cloud operations\n * @internal\n */\n protected isCloudDriver(driver: StorageDriverContract): driver is CloudStorageDriverContract {\n return \"getPresignedUrl\" in driver;\n }\n\n // ============================================================\n // Event System\n // ============================================================\n\n /**\n * Register an event handler\n *\n * Subscribe to storage events for logging, analytics, or side effects.\n *\n * @param event - Event type to listen for\n * @param handler - Handler function\n * @returns Event subscription for unsubscribing\n *\n * @example\n * ```typescript\n * // Log all uploads\n * storage.on(\"afterPut\", ({ location, file }) => {\n * console.log(`Uploaded ${file?.size} bytes to ${location}`);\n * });\n *\n * // Track deletions\n * storage.on(\"afterDelete\", ({ location }) => {\n * analytics.track(\"file_deleted\", { path: location });\n * });\n * ```\n */\n public on<T extends StorageEventPayload = StorageEventPayload>(\n event: StorageEventType,\n handler: StorageEventHandler<T>,\n ): EventSubscription {\n return events.subscribe(`storage.${event}`, handler);\n }\n\n /**\n * Remove all handlers for an event type\n *\n * @param event - Event type to remove handlers for\n * @returns This instance for chaining\n *\n * @example\n * ```typescript\n * storage.off(\"afterPut\"); // Remove all afterPut handlers\n * ```\n */\n public off(event: StorageEventType): this {\n events.off(`storage.${event}`);\n return this;\n }\n\n /**\n * Emit an event to all registered handlers\n * @internal\n */\n protected async emit<T extends StorageEventPayload>(\n event: StorageEventType,\n payload: T,\n ): Promise<void> {\n // `triggerAll` is synchronous — it never awaits its handlers, so awaiting it\n // would make async listeners fire-and-forget. `triggerAllAsync` takes the\n // same `(event, ...args)` shape and awaits each handler in turn.\n await events.triggerAllAsync(`storage.${event}`, payload);\n }\n\n // ============================================================\n // Overridden Operations with Events\n // ============================================================\n\n /**\n * Store a file in storage\n *\n * Extends base `put()` with event emission for beforePut/afterPut hooks.\n *\n * @param file - File content as Buffer, string, UploadedFile, or Readable stream\n * @param location - Destination path\n * @param options - Storage options (mimeType, cacheControl, etc.)\n * @returns StorageFile instance with cached metadata\n */\n public override async put(\n file: UploadedFile | Buffer | string | Readable,\n location: string,\n options?: PutOptions,\n ): Promise<StorageFile> {\n const driver = this.activeDriver;\n const buffer = await this.toBuffer(file);\n\n await this.emit<StoragePutEventPayload>(\"beforePut\", {\n driver: driver.name,\n location,\n timestamp: new Date(),\n size: buffer.length,\n });\n\n const result = await driver.put(buffer, location, options);\n\n await this.emit<StoragePutEventPayload>(\"afterPut\", {\n driver: driver.name,\n location,\n timestamp: new Date(),\n file: result,\n });\n\n if (!result.size) {\n result.size = buffer.length;\n }\n\n return StorageFile.fromData(result, driver);\n }\n\n /**\n * Atomically store a file only if nothing exists at `location`.\n *\n * Emits the same beforePut/afterPut events as `put()` when the file is\n * written; emits nothing when the location already exists (`null`).\n * Because the outcome is unknown until the driver returns, both events\n * fire after the write, for the winner only.\n *\n * @throws StorageCapabilityError when the driver has no `putIfAbsent`\n */\n public override async putIfAbsent(\n file: Buffer | string,\n location: string,\n options?: PutOptions,\n ): Promise<StorageFile | null> {\n const driver = this.activeDriver;\n\n if (typeof driver.putIfAbsent !== \"function\") {\n throw new StorageCapabilityError(\"putIfAbsent\", driver.name);\n }\n\n const result = await driver.putIfAbsent(file, location, options);\n\n if (!result) {\n return null;\n }\n\n const size = typeof file === \"string\" ? Buffer.byteLength(file) : file.length;\n\n await this.emit<StoragePutEventPayload>(\"beforePut\", {\n driver: driver.name,\n location,\n timestamp: new Date(),\n size,\n });\n\n await this.emit<StoragePutEventPayload>(\"afterPut\", {\n driver: driver.name,\n location,\n timestamp: new Date(),\n file: result,\n });\n\n if (!result.size) {\n result.size = size;\n }\n\n return StorageFile.fromData(result, driver);\n }\n\n /**\n * Store a file from a readable stream (for large files)\n *\n * Extends base `putStream()` with event emission.\n *\n * @param stream - Readable stream\n * @param location - Destination path\n * @param options - Storage options\n * @returns StorageFile instance with cached metadata\n */\n public override async putStream(\n stream: Readable | string,\n location: string,\n options?: PutOptions,\n ): Promise<StorageFile> {\n const driver = this.activeDriver;\n\n await this.emit<StoragePutEventPayload>(\"beforePut\", {\n driver: driver.name,\n location,\n timestamp: new Date(),\n });\n\n if (typeof stream === \"string\") {\n stream = fs.createReadStream(stream);\n }\n\n const result = await driver.putStream(stream, location, options);\n\n await this.emit<StoragePutEventPayload>(\"afterPut\", {\n driver: driver.name,\n location,\n timestamp: new Date(),\n file: result,\n });\n\n return StorageFile.fromData(result, driver);\n }\n\n /**\n * Store a file from a URL\n *\n * Downloads content from the URL and stores it at the specified location.\n *\n * The download is SSRF-guarded by default: the URL scheme must be\n * https/http, the host must not resolve to a private / loopback /\n * link-local / cloud-metadata address, the body is capped, and the\n * request times out. Tune or relax via the {@link PutFromUrlOptions}\n * guard fields.\n *\n * @param url - Source URL to download from\n * @param location - Destination path\n * @param options - Storage + outbound-download guard options\n * @returns StorageFile instance with cached metadata\n *\n * @example\n * ```typescript\n * const file = await storage.putFromUrl(\n * \"https://example.com/image.jpg\",\n * \"downloads/image.jpg\"\n * );\n * ```\n */\n public async putFromUrl(\n url: string,\n location: string,\n options?: PutFromUrlOptions,\n ): Promise<StorageFile> {\n const { allowPrivateHosts, maxBytes, timeoutMs, allowedSchemes, ...putOptions } = options ?? {};\n\n const result = await safeFetchToBuffer(url, {\n allowPrivateHosts,\n maxBytes,\n timeoutMs,\n allowedSchemes,\n });\n\n if (!result.ok) {\n throw new Error(`Failed to fetch file from URL: ${result.statusText}`);\n }\n\n if (!result.contentType && !putOptions.mimeType) {\n throw new Error(`Failed to fetch file from URL: missing content-type header`);\n }\n\n const mimeType = putOptions.mimeType || result.contentType || undefined;\n\n return this.put(result.buffer, location, { ...putOptions, mimeType });\n }\n\n /**\n * Store a file from base64 encoded string\n *\n * Decodes base64 content (with optional data URL prefix) and stores it.\n *\n * @param base64 - Base64 encoded file content (or data URL)\n * @param location - Destination path\n * @param options - Storage options\n * @returns StorageFile instance with cached metadata\n *\n * @example\n * ```typescript\n * // From plain base64\n * const file = await storage.putFromBase64(base64String, \"images/photo.jpg\");\n *\n * // From data URL (auto-extracts MIME type)\n * const file = await storage.putFromBase64(\n * \"data:image/png;base64,iVBORw0KGgo...\",\n * \"images/photo.png\"\n * );\n * ```\n */\n public async putFromBase64(\n base64: string,\n location: string,\n options?: PutOptions,\n ): Promise<StorageFile> {\n let data = base64;\n let mimeType = options?.mimeType;\n\n if (base64.startsWith(\"data:\")) {\n const match = base64.match(/^data:([^;]+);base64,(.+)$/);\n if (match) {\n const matchedMimeType = match[1];\n const matchedData = match[2];\n\n if (matchedMimeType !== undefined && matchedData !== undefined) {\n mimeType = mimeType || matchedMimeType;\n data = matchedData;\n }\n }\n }\n\n const buffer = Buffer.from(data, \"base64\");\n return this.put(buffer, location, { ...options, mimeType });\n }\n\n /**\n * Retrieve file contents as Buffer\n *\n * Uses the current driver (with async resolution).\n *\n * @param location - File path\n * @returns Buffer containing file contents\n */\n public override async get(location: string): Promise<Buffer> {\n return this.activeDriver.get(location);\n }\n\n /**\n * Get JSON content from a file\n *\n * Downloads and parses JSON file content.\n *\n * @param location - File path\n * @returns Parsed JSON content\n *\n * @example\n * ```typescript\n * const config = await storage.getJson(\"config/settings.json\");\n * console.log(config.apiKey);\n * ```\n */\n public async getJson(location: string): Promise<any> {\n const buffer = await this.get(location);\n return JSON.parse(buffer.toString());\n }\n\n /**\n * Retrieve a file as a readable stream (for large files)\n *\n * @param location - File path\n * @returns Readable stream of file contents\n */\n public override async getStream(location: string): Promise<Readable> {\n return this.activeDriver.getStream(location);\n }\n\n /**\n * Delete a file\n *\n * Extends base `delete()` with event emission.\n *\n * @param location - File path or StorageFile\n * @returns true if deleted, false if not found\n */\n public override async delete(location: string | StorageFile): Promise<boolean> {\n const driver = this.activeDriver;\n const path = typeof location === \"string\" ? location : location.path;\n\n await this.emit<StorageEventPayload>(\"beforeDelete\", {\n driver: driver.name,\n location: path,\n timestamp: new Date(),\n });\n\n const result = await driver.delete(path);\n\n await this.emit<StorageEventPayload>(\"afterDelete\", {\n driver: driver.name,\n location: path,\n timestamp: new Date(),\n });\n\n return result;\n }\n\n /**\n * Delete multiple files at once\n *\n * @param locations - Array of file paths\n * @returns Array of delete results with status for each file\n */\n public override async deleteMany(locations: string[]): Promise<DeleteManyResult[]> {\n return this.activeDriver.deleteMany(locations);\n }\n\n /**\n * Check if a file exists\n *\n * @param location - File path\n * @returns true if file exists\n */\n public override async exists(location: string): Promise<boolean> {\n return this.activeDriver.exists(location);\n }\n\n /**\n * Copy a file to a new location\n *\n * Extends base `copy()` with event emission.\n *\n * @param from - Source path or StorageFile\n * @param to - Destination path\n * @returns StorageFile instance at destination\n */\n public override async copy(from: string | StorageFile, to: string): Promise<StorageFile> {\n const driver = this.activeDriver;\n const fromPath = typeof from === \"string\" ? from : from.path;\n\n await this.emit<StorageCopyEventPayload>(\"beforeCopy\", {\n driver: driver.name,\n location: to,\n from: fromPath,\n to,\n timestamp: new Date(),\n });\n\n const result = await driver.copy(fromPath, to);\n\n await this.emit<StorageCopyEventPayload>(\"afterCopy\", {\n driver: driver.name,\n location: to,\n from: fromPath,\n to,\n timestamp: new Date(),\n file: result,\n });\n\n return StorageFile.fromData(result, driver);\n }\n\n /**\n * Move a file to a new location\n *\n * Extends base `move()` with event emission.\n *\n * @param from - Source path or StorageFile\n * @param to - Destination path\n * @returns StorageFile instance at destination\n */\n public override async move(from: string | StorageFile, to: string): Promise<StorageFile> {\n const driver = this.activeDriver;\n const fromPath = typeof from === \"string\" ? from : from.path;\n\n await this.emit<StorageCopyEventPayload>(\"beforeMove\", {\n driver: driver.name,\n location: to,\n from: fromPath,\n to,\n timestamp: new Date(),\n });\n\n const result = await driver.move(fromPath, to);\n\n await this.emit<StorageCopyEventPayload>(\"afterMove\", {\n driver: driver.name,\n location: to,\n from: fromPath,\n to,\n timestamp: new Date(),\n file: result,\n });\n\n return StorageFile.fromData(result, driver);\n }\n\n /**\n * List files in a directory\n *\n * @param directory - Directory path (defaults to root)\n * @param options - List options (recursive, limit, etc.)\n * @returns Array of file information objects\n */\n public override async list(\n directory?: string,\n options?: ListOptions,\n ): Promise<StorageFileInfo[]> {\n return this.activeDriver.list(directory || \"\", options);\n }\n\n // ============================================================\n // Metadata Operations\n // ============================================================\n\n /**\n * Get file metadata without downloading\n *\n * @param location - File path\n * @returns File information object\n */\n public override async metadata(location: string): Promise<StorageFileInfo> {\n return this.activeDriver.metadata(location);\n }\n\n /**\n * Get file size in bytes\n *\n * @param location - File path\n * @returns File size in bytes\n */\n public override async size(location: string): Promise<number> {\n return this.activeDriver.size(location);\n }\n\n // ============================================================\n // Path Operations (Local Driver Only)\n // ============================================================\n\n /**\n * Get the absolute filesystem path for a location\n *\n * Only available for local driver.\n *\n * @param location - File path\n * @throws Error if current driver is not a local driver\n * @returns Absolute filesystem path\n */\n public async path(location: string): Promise<string> {\n const driver = this.activeDriver;\n\n if (!(\"path\" in driver) || typeof driver.path !== \"function\") {\n throw new Error(\"path() is only available for local storage drivers\");\n }\n\n return driver.path(location);\n }\n\n // ============================================================\n // Cloud-Specific Operations\n // ============================================================\n\n /**\n * Get a presigned URL for downloading a file\n *\n * Only available for cloud drivers.\n *\n * @param location - File path\n * @param options - Presigned URL options (expiresIn)\n * @throws Error if current driver is not a cloud driver\n * @returns Presigned download URL\n *\n * @example\n * ```typescript\n * const url = await storage.getPresignedUrl(\"private/document.pdf\", {\n * expiresIn: 3600 // 1 hour\n * });\n * ```\n */\n public async getPresignedUrl(location: string, options?: PresignedOptions): Promise<string> {\n const driver = this.activeDriver;\n\n if (!this.isCloudDriver(driver)) {\n throw new Error(\"Presigned URLs are only available for cloud storage drivers\");\n }\n\n return driver.getPresignedUrl(location, options);\n }\n\n /**\n * Get a presigned URL for uploading a file directly to cloud storage\n *\n * Only available for cloud drivers.\n *\n * @param location - Destination path\n * @param options - Upload options (expiresIn, contentType, metadata).\n * There is no size cap: a presigned PUT URL cannot enforce one — verify\n * the uploaded size server-side or use a presigned POST policy instead.\n * @throws Error if current driver is not a cloud driver\n * @returns Presigned upload URL\n *\n * @example\n * ```typescript\n * const uploadUrl = await storage.getPresignedUploadUrl(\"uploads/file.pdf\", {\n * expiresIn: 3600,\n * contentType: \"application/pdf\"\n * });\n *\n * // Client can PUT directly to this URL\n * ```\n */\n public async getPresignedUploadUrl(\n location: string,\n options?: PresignedUploadOptions,\n ): Promise<string> {\n const driver = this.activeDriver;\n\n if (!this.isCloudDriver(driver)) {\n throw new Error(\"Presigned upload URLs are only available for cloud storage drivers\");\n }\n\n return driver.getPresignedUploadUrl(location, options);\n }\n\n /**\n * Get the bucket name for cloud storage\n *\n * Only available for cloud drivers.\n *\n * @throws Error if current driver is not a cloud driver\n * @returns Bucket name\n */\n public async getBucket(): Promise<string> {\n const driver = this.activeDriver;\n\n if (!this.isCloudDriver(driver)) {\n throw new Error(\"Bucket information is only available for cloud storage drivers\");\n }\n\n return driver.getBucket();\n }\n\n /**\n * Get the region for cloud storage\n *\n * Only available for cloud drivers.\n *\n * @throws Error if current driver is not a cloud driver\n * @returns Region name\n */\n public async getRegion(): Promise<string> {\n const driver = this.activeDriver;\n\n if (!this.isCloudDriver(driver)) {\n throw new Error(\"Region information is only available for cloud storage drivers\");\n }\n\n return driver.getRegion();\n }\n\n /**\n * Set storage class for a file (e.g., STANDARD, GLACIER, etc.)\n *\n * Only available for cloud drivers.\n *\n * @param location - File path\n * @param storageClass - Target storage class\n * @throws Error if current driver is not a cloud driver\n */\n public async setStorageClass(location: string, storageClass: string): Promise<void> {\n const driver = this.activeDriver;\n\n if (!this.isCloudDriver(driver)) {\n throw new Error(\"Storage class is only available for cloud storage drivers\");\n }\n\n return driver.setStorageClass(location, storageClass);\n }\n\n /**\n * Set file visibility (public or private)\n *\n * Only available for cloud drivers.\n *\n * @param location - File path\n * @param visibility - \"public\" or \"private\"\n * @throws Error if current driver is not a cloud driver\n */\n public async setVisibility(location: string, visibility: FileVisibility): Promise<void> {\n const driver = this.activeDriver;\n\n if (!this.isCloudDriver(driver)) {\n throw new Error(\"Visibility is only available for cloud storage drivers\");\n }\n\n return driver.setVisibility(location, visibility);\n }\n\n /**\n * Get file visibility\n *\n * Only available for cloud drivers.\n *\n * @param location - File path\n * @throws Error if current driver is not a cloud driver\n * @returns Current visibility setting\n */\n public async getVisibility(location: string): Promise<FileVisibility> {\n const driver = this.activeDriver;\n\n if (!this.isCloudDriver(driver)) {\n throw new Error(\"Visibility is only available for cloud storage drivers\");\n }\n\n return driver.getVisibility(location);\n }\n\n /**\n * Get a temporary signed URL\n *\n * Creates a URL that provides temporary access to the file.\n *\n * @param location - File path\n * @param expiresIn - Seconds until expiration (default: 3600)\n * @returns Signed URL string\n */\n public override async temporaryUrl(location: string, expiresIn?: number): Promise<string> {\n return this.activeDriver.temporaryUrl(location, expiresIn);\n }\n\n /**\n * Validate a temporary URL token\n *\n * For local driver: validates HMAC-signed tokens\n * For cloud drivers: returns invalid (cloud validates via presigned URL)\n *\n * @param token - The token from the temporary URL\n * @returns Validation result with file info and convenience methods\n *\n * @example\n * ```typescript\n * const result = await storage.validateTemporaryToken(token);\n *\n * if (!result.valid) {\n * return response.status(403).send(result.error);\n * }\n *\n * // For local driver - use sendFile for efficiency\n * if (result.absolutePath) {\n * return response.sendFile(result.absolutePath);\n * }\n *\n * // For cloud driver - stream the file\n * const stream = await result.getStream!();\n * stream.pipe(response.raw);\n * ```\n */\n public async validateTemporaryToken(token: string): Promise<TemporaryTokenValidation> {\n // Check if driver supports token validation\n if (\n !(\"validateTemporaryToken\" in this.activeDriver) ||\n typeof this.activeDriver.validateTemporaryToken !== \"function\"\n ) {\n // For cloud drivers, temporary URLs are presigned and validated by the cloud provider\n return {\n valid: false,\n error: \"invalid_token\",\n };\n }\n\n return this.activeDriver.validateTemporaryToken(token);\n }\n\n // ============================================================\n // Configuration Parsing\n // ============================================================\n\n /**\n * Parse config into driver-specific options\n * @internal\n */\n protected parseOptions(\n config: StorageDriverConfig,\n ): LocalStorageDriverOptions | CloudStorageDriverOptions | R2StorageDriverOptions {\n const { driver, ...options } = config;\n\n switch (driver) {\n case \"local\":\n return {\n root: options.root,\n prefix: options.prefix,\n urlPrefix: options.urlPrefix,\n temporaryUrlPrefix: options.temporaryUrlPrefix,\n signatureKey: options.signatureKey,\n } satisfies LocalStorageDriverOptions;\n\n case \"s3\":\n this.validateCloudConfig(config, \"s3\");\n return {\n ...options,\n bucket: options.bucket!,\n region: options.region!,\n accessKeyId: options.accessKeyId,\n secretAccessKey: options.secretAccessKey,\n endpoint: options.endpoint,\n urlPrefix: options.urlPrefix,\n } satisfies CloudStorageDriverOptions;\n\n case \"r2\":\n this.validateCloudConfig(config, \"r2\");\n if (!options.accountId) {\n throw new Error('R2 driver requires \"accountId\" configuration');\n }\n\n return {\n ...options,\n region: options.region || \"auto\",\n bucket: options.bucket!,\n accessKeyId: options.accessKeyId,\n secretAccessKey: options.secretAccessKey,\n endpoint: options.endpoint,\n urlPrefix: options.urlPrefix,\n accountId: options.accountId,\n publicDomain: options.publicDomain,\n } satisfies R2StorageDriverOptions;\n\n case \"spaces\":\n this.validateCloudConfig(config, \"spaces\");\n return {\n ...options,\n bucket: options.bucket!,\n region: options.region!,\n accessKeyId: options.accessKeyId,\n secretAccessKey: options.secretAccessKey,\n endpoint: options.endpoint,\n urlPrefix: options.urlPrefix,\n } satisfies CloudStorageDriverOptions;\n\n default:\n throw new Error(`Unknown driver type: ${driver}`);\n }\n }\n\n /**\n * Validate cloud driver configuration has required fields\n * @internal\n */\n protected validateCloudConfig(config: StorageDriverConfig, driverName: string): void {\n // Credentials are optional: when absent, the AWS default provider chain\n // applies (IAM roles, ECS task roles, IRSA, SSO profiles).\n const required = [\"bucket\"];\n\n if (driverName !== \"r2\") {\n required.push(\"region\");\n }\n\n for (const field of required) {\n if (!config[field as keyof StorageDriverConfig]) {\n throw new Error(`${driverName.toUpperCase()} driver requires \"${field}\" configuration`);\n }\n }\n\n if (Boolean(config.accessKeyId) !== Boolean(config.secretAccessKey)) {\n throw new Error(\n `${driverName.toUpperCase()} driver requires both \"accessKeyId\" and \"secretAccessKey\", or neither`,\n );\n }\n }\n\n /**\n * Get or create driver instance from cache\n * @internal\n */\n protected resolveDriver(name: string): StorageDriverContract {\n // Ensure configs are loaded\n\n if (this.drivers.has(name)) {\n return this.drivers.get(name)!;\n }\n\n const config = this.configs.get(name);\n\n if (!config) {\n throw new Error(`Storage driver \"${name}\" is not configured`);\n }\n\n const options = this.parseOptions(config);\n let driver: StorageDriverContract;\n\n switch (config.driver) {\n case \"local\":\n driver = new LocalDriver(options as LocalStorageDriverOptions);\n break;\n case \"s3\":\n driver = new S3Driver(options as CloudStorageDriverOptions);\n break;\n case \"r2\":\n driver = new R2Driver(options as R2StorageDriverOptions);\n break;\n case \"spaces\":\n driver = new DOSpacesDriver(options as CloudStorageDriverOptions);\n break;\n default:\n throw new Error(`Unknown storage driver type: ${config.driver}`);\n }\n\n this.drivers.set(name, driver);\n return driver;\n }\n}\n\n/**\n * Singleton storage instance\n *\n * Pre-configured storage manager ready for use throughout the application.\n *\n * @example\n * ```typescript\n * import { storage } from \"@warlock.js/core\";\n *\n * const file = await storage.put(buffer, \"uploads/file.txt\");\n * ```\n */\nexport const storage = new Storage();\n"],"mappings":"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"}
1
+ {"version":3,"file":"storage.mjs","names":[],"sources":["../../../../../../../../packages/core/src/storage/storage.ts"],"sourcesContent":["import events, { type EventSubscription } from \"@mongez/events\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport type { Readable } from \"stream\";\nimport type { UploadedFile } from \"../http\";\nimport { uploadsPath } from \"../utils/paths\";\nimport { storageConfig, storageConfigurations } from \"./config\";\nimport { storageDriverContext } from \"./context/storage-driver-context\";\nimport { DOSpacesDriver } from \"./drivers/do-spaces-driver\";\nimport { LocalDriver } from \"./drivers/local-driver\";\nimport { R2Driver } from \"./drivers/r2-driver\";\nimport { S3Driver } from \"./drivers/s3-driver\";\nimport { ScopedStorage } from \"./scoped-storage\";\nimport { StorageFile } from \"./storage-file\";\nimport { registerLocalDiskConfigurations } from \"./local-disk-roots\";\nimport { safeFetchToBuffer } from \"./utils/safe-fetch\";\nimport { StorageCapabilityError } from \"./utils/storage-capability-error\";\nimport { StorageNotInitializedError } from \"./utils/storage-not-initialized-error\";\nimport type {\n CloudStorageDriverContract,\n CloudStorageDriverOptions,\n DeleteManyResult,\n FileVisibility,\n ListOptions,\n LocalStorageDriverOptions,\n PresignedOptions,\n PresignedUploadOptions,\n PutFromUrlOptions,\n PutOptions,\n R2StorageDriverOptions,\n StorageCopyEventPayload,\n StorageDriverConfig,\n StorageDriverContract,\n StorageDriverName,\n StorageEventHandler,\n StorageEventPayload,\n StorageEventType,\n StorageFileInfo,\n StorageManagerContract,\n StoragePutEventPayload,\n TemporaryTokenValidation,\n} from \"./types\";\n\n/**\n * Storage Manager\n *\n * Provides a unified interface for file storage operations across multiple\n * drivers (local, S3, R2, DigitalOcean Spaces). Extends `ScopedStorage` to\n * inherit all base operations while adding driver management and events.\n *\n * All operations return `StorageFile` instances for a consistent, rich DX.\n *\n * @example\n * ```typescript\n * // Basic usage (uses default driver)\n * const file = await storage.put(buffer, \"uploads/image.jpg\");\n *\n * // With options\n * const file = await storage.put(buffer, \"uploads/image.jpg\", {\n * mimeType: \"image/jpeg\",\n * cacheControl: \"max-age=31536000\"\n * });\n *\n * // Using specific driver (also returns StorageFile)\n * const file = await storage.use(\"s3\").put(buffer, \"path/to/file\");\n *\n * // Get raw driver for advanced use\n * const driver = storage.driver(\"s3\");\n * const data = await driver.put(buffer, \"path/to/file\"); // Returns StorageFileData\n *\n * // Stream operations for large files\n * const stream = await storage.getStream(\"large-file.zip\");\n * await storage.putStream(readableStream, \"output/file.zip\");\n *\n * // Batch operations\n * const results = await storage.deleteMany([\"file1.txt\", \"file2.txt\"]);\n *\n * // Event hooks\n * storage.on(\"afterPut\", ({ location, file }) => {\n * console.log(`Uploaded ${location}`);\n * });\n * ```\n */\nexport class Storage extends ScopedStorage implements StorageManagerContract {\n /**\n * Registered drivers (cached instances)\n * @internal\n */\n protected drivers = new Map<string, StorageDriverContract>();\n\n /**\n * Driver configurations\n * @internal\n */\n protected configs = new Map<string, StorageDriverConfig>();\n\n /**\n * Default driver name\n * @internal\n */\n protected defaultDriverName!: StorageDriverName;\n\n /**\n * Whether the storage has been initialized\n * @internal\n */\n private initialized = false;\n\n /**\n * Create a new Storage manager instance\n *\n * Uses lazy initialization - driver is resolved on first access.\n */\n public constructor() {\n // Temp placeholder - will be replaced on first access\n super(null as unknown as StorageDriverContract);\n registerLocalDiskConfigurations(() => this.configs);\n }\n\n /**\n * Ensure storage is initialized (lazy initialization)\n *\n * Called automatically on first driver access.\n */\n public async init(): Promise<void> {\n if (this.initialized) return;\n\n // Mark as initialized FIRST to prevent infinite recursion\n this.initialized = true;\n\n // Get default driver name from config\n\n const defaultName = storageConfig(\"default\", \"local\");\n\n this.defaultDriverName = defaultName as StorageDriverName;\n this.loadDriversFromConfig();\n\n // Now set the actual driver\n this._driver = this.resolveDriver(this.defaultDriverName);\n }\n\n /**\n * Whether `init()` has run (and `reset()` has not run since).\n */\n public get isInitialized(): boolean {\n return this.initialized;\n }\n\n /**\n * The names of every registered driver configuration, including the\n * built-in `local` one. The test kit's storage fake reads it to replace\n * every driver with a local one.\n */\n public driverNames(): StorageDriverName[] {\n return [...this.configs.keys()] as StorageDriverName[];\n }\n\n /**\n * The name of the default driver, once initialized.\n */\n public getDefaultName(): StorageDriverName | undefined {\n return this.defaultDriverName ?? undefined;\n }\n\n /**\n * Reset storage defaults\n */\n public reset(): void {\n this.initialized = false;\n this.drivers.clear();\n this.configs.clear();\n this.defaultDriverName = null as unknown as StorageDriverName;\n this._driver = null as unknown as StorageDriverContract;\n }\n\n /**\n * Get the currently active driver (context-aware in future)\n *\n * Currently returns the default driver.\n * Will be enhanced to check AsyncLocalStorage context for multi-tenant support.\n *\n * @returns The active storage driver\n * @throws {StorageNotInitializedError} When neither a context driver nor\n * an initialized default driver is available\n */\n public override get activeDriver(): StorageDriverContract {\n // Check context for tenant-specific driver\n const contextDriver = storageDriverContext.getDriver();\n\n if (contextDriver) return contextDriver;\n\n if (!this._driver) throw new StorageNotInitializedError();\n\n return this._driver;\n }\n\n // ============================================================\n // Driver Management\n // ============================================================\n\n /**\n * Load drivers from configuration\n * @internal\n */\n protected loadDriversFromConfig(): void {\n // `activeDriver` is a synchronous getter, so an async resolver can never be\n // honoured. Fail loudly instead of silently ignoring it.\n if (storageConfig(\"resolver\")) {\n throw new Error(\n \"storage.resolver is not supported: use storageDriverContext (per-request driver) for multi-tenant storage.\",\n );\n }\n\n this.registerBuiltInLocalDriver();\n\n const drivers = storageConfig<Record<string, StorageDriverConfig>>(\"drivers\", {});\n\n for (const [name, config] of Object.entries(drivers)) {\n this.configs.set(name, config);\n }\n }\n\n /**\n * Register the built-in `local` driver, rooted at `uploadsPath()`.\n *\n * The storage connector starts unconditionally — unlike database, cache and\n * herald, it does not early-return when `config.get(\"storage\")` is absent —\n * on the stated grounds that `init()` falls back to a built-in local driver so\n * file storage works out of the box. That fallback did not exist: `init()`\n * resolved the default driver *name* and then found no config registered\n * under it, so **any app without `src/config/storage.ts` failed to boot**\n * with `Storage driver \"local\" is not configured`. Only scaffolded apps, which\n * always ship that file, hid it.\n *\n * Registered before the configured drivers so an app that defines its own\n * `local` entry overrides this one rather than fighting it.\n */\n protected registerBuiltInLocalDriver(): void {\n this.configs.set(\n \"local\",\n storageConfigurations.local({\n root: uploadsPath(),\n urlPrefix: \"/uploads\",\n }),\n );\n }\n\n /**\n * Get a scoped storage for a specific driver\n *\n * Returns a `ScopedStorage` instance that wraps the specified driver.\n * Operations on the returned instance also return `StorageFile` objects.\n *\n * @param name - Driver name as defined in configuration\n * @returns ScopedStorage instance for the specified driver\n *\n * @example\n * ```typescript\n * // Upload to S3\n * const s3File = await storage.use(\"s3\").put(buffer, \"images/photo.jpg\");\n *\n * // Upload to local\n * const localFile = await storage.use(\"local\").put(buffer, \"temp/file.txt\");\n *\n * // Both return StorageFile with identical API\n * console.log(s3File.url);\n * console.log(localFile.url);\n * ```\n */\n public use(name: StorageDriverName): ScopedStorage {\n return new ScopedStorage(this.getDriver(name));\n }\n\n /**\n * Get a raw driver instance\n *\n * Returns the underlying driver directly for advanced use cases.\n * Unlike `use()`, calling methods on the raw driver returns\n * `StorageFileData` instead of `StorageFile`.\n *\n * @param name - Driver name as defined in configuration\n * @returns Raw driver instance implementing StorageDriverContract\n *\n * @example\n * ```typescript\n * const driver = storage.getDriver(\"s3\");\n * const data = await driver.put(buffer, \"path/to/file\");\n * // data is StorageFileData, not StorageFile\n * ```\n */\n public getDriver(name: StorageDriverName): StorageDriverContract {\n return this.resolveDriver(name);\n }\n\n /**\n * Get root directory of current driver\n */\n public root(apepndedPath?: string): string {\n const rootPath = this.activeDriver.options?.root || \"\";\n\n return path.join(rootPath, apepndedPath || \"\");\n }\n\n /**\n * Use a cloud storage driver with extended cloud capabilities\n *\n * @param name - Cloud driver name (s3, r2, spaces)\n * @returns Driver instance implementing CloudStorageDriverContract\n * @throws Error if driver doesn't support cloud operations\n *\n * @example\n * ```typescript\n * const cloudDriver = storage.useCloud(\"s3\");\n * const presignedUrl = await cloudDriver.getPresignedUrl(\"private/doc.pdf\");\n * ```\n */\n public useCloud(name: StorageDriverName): CloudStorageDriverContract {\n const instance = this.getDriver(name);\n\n if (!this.isCloudDriver(instance)) {\n throw new Error(`Driver \"${name}\" does not support cloud operations`);\n }\n\n return instance as CloudStorageDriverContract;\n }\n\n /**\n * Register a new driver configuration at runtime\n *\n * Allows dynamic driver registration for multi-tenancy or\n * runtime configuration scenarios.\n *\n * @param name - Unique driver name\n * @param config - Driver configuration\n * @returns This instance for chaining\n *\n * @example\n * ```typescript\n * storage.register(\"tenant-s3\", {\n * driver: \"s3\",\n * bucket: \"tenant-bucket\",\n * region: \"us-east-1\",\n * accessKeyId: process.env.TENANT_AWS_KEY,\n * secretAccessKey: process.env.TENANT_AWS_SECRET\n * });\n *\n * await storage.use(\"tenant-s3\").put(buffer, \"file.txt\");\n * ```\n */\n public register(name: StorageDriverName, config: StorageDriverConfig): this {\n this.configs.set(name, config);\n this.drivers.delete(name); // Clear cached instance\n return this;\n }\n\n /**\n * Set the default driver name\n *\n * @param name - Driver name to use as default\n * @returns This instance for chaining\n *\n * @example\n * ```typescript\n * storage.setDefault(\"s3\");\n * await storage.put(buffer, \"file.txt\"); // Now uses S3\n * ```\n */\n public setDefault(name: StorageDriverName): this {\n this.defaultDriverName = name;\n this._driver = this.getDriver(name);\n return this;\n }\n\n /**\n * Check if current driver is a cloud driver\n *\n * @returns Promise resolving to true if the current driver supports cloud operations\n */\n public async isCloud(): Promise<boolean> {\n return this.isCloudDriver(this.activeDriver);\n }\n\n /**\n * Check if a driver instance supports cloud operations\n * @internal\n */\n protected isCloudDriver(driver: StorageDriverContract): driver is CloudStorageDriverContract {\n return \"getPresignedUrl\" in driver;\n }\n\n // ============================================================\n // Event System\n // ============================================================\n\n /**\n * Register an event handler\n *\n * Subscribe to storage events for logging, analytics, or side effects.\n *\n * @param event - Event type to listen for\n * @param handler - Handler function\n * @returns Event subscription for unsubscribing\n *\n * @example\n * ```typescript\n * // Log all uploads\n * storage.on(\"afterPut\", ({ location, file }) => {\n * console.log(`Uploaded ${file?.size} bytes to ${location}`);\n * });\n *\n * // Track deletions\n * storage.on(\"afterDelete\", ({ location }) => {\n * analytics.track(\"file_deleted\", { path: location });\n * });\n * ```\n */\n public on<T extends StorageEventPayload = StorageEventPayload>(\n event: StorageEventType,\n handler: StorageEventHandler<T>,\n ): EventSubscription {\n return events.subscribe(`storage.${event}`, handler);\n }\n\n /**\n * Remove all handlers for an event type\n *\n * @param event - Event type to remove handlers for\n * @returns This instance for chaining\n *\n * @example\n * ```typescript\n * storage.off(\"afterPut\"); // Remove all afterPut handlers\n * ```\n */\n public off(event: StorageEventType): this {\n events.off(`storage.${event}`);\n return this;\n }\n\n /**\n * Emit an event to all registered handlers\n * @internal\n */\n protected async emit<T extends StorageEventPayload>(\n event: StorageEventType,\n payload: T,\n ): Promise<void> {\n // `triggerAll` is synchronous — it never awaits its handlers, so awaiting it\n // would make async listeners fire-and-forget. `triggerAllAsync` takes the\n // same `(event, ...args)` shape and awaits each handler in turn.\n await events.triggerAllAsync(`storage.${event}`, payload);\n }\n\n // ============================================================\n // Overridden Operations with Events\n // ============================================================\n\n /**\n * Store a file in storage\n *\n * Extends base `put()` with event emission for beforePut/afterPut hooks.\n *\n * @param file - File content as Buffer, string, UploadedFile, or Readable stream\n * @param location - Destination path\n * @param options - Storage options (mimeType, cacheControl, etc.)\n * @returns StorageFile instance with cached metadata\n */\n public override async put(\n file: UploadedFile | Buffer | string | Readable,\n location: string,\n options?: PutOptions,\n ): Promise<StorageFile> {\n const driver = this.activeDriver;\n const buffer = await this.toBuffer(file);\n\n await this.emit<StoragePutEventPayload>(\"beforePut\", {\n driver: driver.name,\n location,\n timestamp: new Date(),\n size: buffer.length,\n });\n\n const result = await driver.put(buffer, location, options);\n\n await this.emit<StoragePutEventPayload>(\"afterPut\", {\n driver: driver.name,\n location,\n timestamp: new Date(),\n file: result,\n });\n\n if (!result.size) {\n result.size = buffer.length;\n }\n\n return StorageFile.fromData(result, driver);\n }\n\n /**\n * Atomically store a file only if nothing exists at `location`.\n *\n * Emits the same beforePut/afterPut events as `put()` when the file is\n * written; emits nothing when the location already exists (`null`).\n * Because the outcome is unknown until the driver returns, both events\n * fire after the write, for the winner only.\n *\n * @throws StorageCapabilityError when the driver has no `putIfAbsent`\n */\n public override async putIfAbsent(\n file: Buffer | string,\n location: string,\n options?: PutOptions,\n ): Promise<StorageFile | null> {\n const driver = this.activeDriver;\n\n if (typeof driver.putIfAbsent !== \"function\") {\n throw new StorageCapabilityError(\"putIfAbsent\", driver.name);\n }\n\n const result = await driver.putIfAbsent(file, location, options);\n\n if (!result) {\n return null;\n }\n\n const size = typeof file === \"string\" ? Buffer.byteLength(file) : file.length;\n\n await this.emit<StoragePutEventPayload>(\"beforePut\", {\n driver: driver.name,\n location,\n timestamp: new Date(),\n size,\n });\n\n await this.emit<StoragePutEventPayload>(\"afterPut\", {\n driver: driver.name,\n location,\n timestamp: new Date(),\n file: result,\n });\n\n if (!result.size) {\n result.size = size;\n }\n\n return StorageFile.fromData(result, driver);\n }\n\n /**\n * Store a file from a readable stream (for large files)\n *\n * Extends base `putStream()` with event emission.\n *\n * @param stream - Readable stream\n * @param location - Destination path\n * @param options - Storage options\n * @returns StorageFile instance with cached metadata\n */\n public override async putStream(\n stream: Readable | string,\n location: string,\n options?: PutOptions,\n ): Promise<StorageFile> {\n const driver = this.activeDriver;\n\n await this.emit<StoragePutEventPayload>(\"beforePut\", {\n driver: driver.name,\n location,\n timestamp: new Date(),\n });\n\n if (typeof stream === \"string\") {\n stream = fs.createReadStream(stream);\n }\n\n const result = await driver.putStream(stream, location, options);\n\n await this.emit<StoragePutEventPayload>(\"afterPut\", {\n driver: driver.name,\n location,\n timestamp: new Date(),\n file: result,\n });\n\n return StorageFile.fromData(result, driver);\n }\n\n /**\n * Store a file from a URL\n *\n * Downloads content from the URL and stores it at the specified location.\n *\n * The download is SSRF-guarded by default: the URL scheme must be\n * https/http, the host must not resolve to a private / loopback /\n * link-local / cloud-metadata address, the body is capped, and the\n * request times out. Tune or relax via the {@link PutFromUrlOptions}\n * guard fields.\n *\n * @param url - Source URL to download from\n * @param location - Destination path\n * @param options - Storage + outbound-download guard options\n * @returns StorageFile instance with cached metadata\n *\n * @example\n * ```typescript\n * const file = await storage.putFromUrl(\n * \"https://example.com/image.jpg\",\n * \"downloads/image.jpg\"\n * );\n * ```\n */\n public async putFromUrl(\n url: string,\n location: string,\n options?: PutFromUrlOptions,\n ): Promise<StorageFile> {\n const { allowPrivateHosts, maxBytes, timeoutMs, allowedSchemes, ...putOptions } = options ?? {};\n\n const result = await safeFetchToBuffer(url, {\n allowPrivateHosts,\n maxBytes,\n timeoutMs,\n allowedSchemes,\n });\n\n if (!result.ok) {\n throw new Error(`Failed to fetch file from URL: ${result.statusText}`);\n }\n\n if (!result.contentType && !putOptions.mimeType) {\n throw new Error(`Failed to fetch file from URL: missing content-type header`);\n }\n\n const mimeType = putOptions.mimeType || result.contentType || undefined;\n\n return this.put(result.buffer, location, { ...putOptions, mimeType });\n }\n\n /**\n * Store a file from base64 encoded string\n *\n * Decodes base64 content (with optional data URL prefix) and stores it.\n *\n * @param base64 - Base64 encoded file content (or data URL)\n * @param location - Destination path\n * @param options - Storage options\n * @returns StorageFile instance with cached metadata\n *\n * @example\n * ```typescript\n * // From plain base64\n * const file = await storage.putFromBase64(base64String, \"images/photo.jpg\");\n *\n * // From data URL (auto-extracts MIME type)\n * const file = await storage.putFromBase64(\n * \"data:image/png;base64,iVBORw0KGgo...\",\n * \"images/photo.png\"\n * );\n * ```\n */\n public async putFromBase64(\n base64: string,\n location: string,\n options?: PutOptions,\n ): Promise<StorageFile> {\n let data = base64;\n let mimeType = options?.mimeType;\n\n if (base64.startsWith(\"data:\")) {\n const match = base64.match(/^data:([^;]+);base64,(.+)$/);\n if (match) {\n const matchedMimeType = match[1];\n const matchedData = match[2];\n\n if (matchedMimeType !== undefined && matchedData !== undefined) {\n mimeType = mimeType || matchedMimeType;\n data = matchedData;\n }\n }\n }\n\n const buffer = Buffer.from(data, \"base64\");\n return this.put(buffer, location, { ...options, mimeType });\n }\n\n /**\n * Retrieve file contents as Buffer\n *\n * Uses the current driver (with async resolution).\n *\n * @param location - File path\n * @returns Buffer containing file contents\n */\n public override async get(location: string): Promise<Buffer> {\n return this.activeDriver.get(location);\n }\n\n /**\n * Get JSON content from a file\n *\n * Downloads and parses JSON file content.\n *\n * @param location - File path\n * @returns Parsed JSON content\n *\n * @example\n * ```typescript\n * const config = await storage.getJson(\"config/settings.json\");\n * console.log(config.apiKey);\n * ```\n */\n public async getJson(location: string): Promise<any> {\n const buffer = await this.get(location);\n return JSON.parse(buffer.toString());\n }\n\n /**\n * Retrieve a file as a readable stream (for large files)\n *\n * @param location - File path\n * @returns Readable stream of file contents\n */\n public override async getStream(location: string): Promise<Readable> {\n return this.activeDriver.getStream(location);\n }\n\n /**\n * Delete a file\n *\n * Extends base `delete()` with event emission.\n *\n * @param location - File path or StorageFile\n * @returns true if deleted, false if not found\n */\n public override async delete(location: string | StorageFile): Promise<boolean> {\n const driver = this.activeDriver;\n const path = typeof location === \"string\" ? location : location.path;\n\n await this.emit<StorageEventPayload>(\"beforeDelete\", {\n driver: driver.name,\n location: path,\n timestamp: new Date(),\n });\n\n const result = await driver.delete(path);\n\n await this.emit<StorageEventPayload>(\"afterDelete\", {\n driver: driver.name,\n location: path,\n timestamp: new Date(),\n });\n\n return result;\n }\n\n /**\n * Delete multiple files at once\n *\n * @param locations - Array of file paths\n * @returns Array of delete results with status for each file\n */\n public override async deleteMany(locations: string[]): Promise<DeleteManyResult[]> {\n return this.activeDriver.deleteMany(locations);\n }\n\n /**\n * Check if a file exists\n *\n * @param location - File path\n * @returns true if file exists\n */\n public override async exists(location: string): Promise<boolean> {\n return this.activeDriver.exists(location);\n }\n\n /**\n * Copy a file to a new location\n *\n * Extends base `copy()` with event emission.\n *\n * @param from - Source path or StorageFile\n * @param to - Destination path\n * @returns StorageFile instance at destination\n */\n public override async copy(from: string | StorageFile, to: string): Promise<StorageFile> {\n const driver = this.activeDriver;\n const fromPath = typeof from === \"string\" ? from : from.path;\n\n await this.emit<StorageCopyEventPayload>(\"beforeCopy\", {\n driver: driver.name,\n location: to,\n from: fromPath,\n to,\n timestamp: new Date(),\n });\n\n const result = await driver.copy(fromPath, to);\n\n await this.emit<StorageCopyEventPayload>(\"afterCopy\", {\n driver: driver.name,\n location: to,\n from: fromPath,\n to,\n timestamp: new Date(),\n file: result,\n });\n\n return StorageFile.fromData(result, driver);\n }\n\n /**\n * Move a file to a new location\n *\n * Extends base `move()` with event emission.\n *\n * @param from - Source path or StorageFile\n * @param to - Destination path\n * @returns StorageFile instance at destination\n */\n public override async move(from: string | StorageFile, to: string): Promise<StorageFile> {\n const driver = this.activeDriver;\n const fromPath = typeof from === \"string\" ? from : from.path;\n\n await this.emit<StorageCopyEventPayload>(\"beforeMove\", {\n driver: driver.name,\n location: to,\n from: fromPath,\n to,\n timestamp: new Date(),\n });\n\n const result = await driver.move(fromPath, to);\n\n await this.emit<StorageCopyEventPayload>(\"afterMove\", {\n driver: driver.name,\n location: to,\n from: fromPath,\n to,\n timestamp: new Date(),\n file: result,\n });\n\n return StorageFile.fromData(result, driver);\n }\n\n /**\n * List files in a directory\n *\n * @param directory - Directory path (defaults to root)\n * @param options - List options (recursive, limit, etc.)\n * @returns Array of file information objects\n */\n public override async list(\n directory?: string,\n options?: ListOptions,\n ): Promise<StorageFileInfo[]> {\n return this.activeDriver.list(directory || \"\", options);\n }\n\n // ============================================================\n // Metadata Operations\n // ============================================================\n\n /**\n * Get file metadata without downloading\n *\n * @param location - File path\n * @returns File information object\n */\n public override async metadata(location: string): Promise<StorageFileInfo> {\n return this.activeDriver.metadata(location);\n }\n\n /**\n * Get file size in bytes\n *\n * @param location - File path\n * @returns File size in bytes\n */\n public override async size(location: string): Promise<number> {\n return this.activeDriver.size(location);\n }\n\n // ============================================================\n // Path Operations (Local Driver Only)\n // ============================================================\n\n /**\n * Get the absolute filesystem path for a location\n *\n * Only available for local driver.\n *\n * @param location - File path\n * @throws Error if current driver is not a local driver\n * @returns Absolute filesystem path\n */\n public async path(location: string): Promise<string> {\n const driver = this.activeDriver;\n\n if (!(\"path\" in driver) || typeof driver.path !== \"function\") {\n throw new Error(\"path() is only available for local storage drivers\");\n }\n\n return driver.path(location);\n }\n\n // ============================================================\n // Cloud-Specific Operations\n // ============================================================\n\n /**\n * Get a presigned URL for downloading a file\n *\n * Only available for cloud drivers.\n *\n * @param location - File path\n * @param options - Presigned URL options (expiresIn)\n * @throws Error if current driver is not a cloud driver\n * @returns Presigned download URL\n *\n * @example\n * ```typescript\n * const url = await storage.getPresignedUrl(\"private/document.pdf\", {\n * expiresIn: 3600 // 1 hour\n * });\n * ```\n */\n public async getPresignedUrl(location: string, options?: PresignedOptions): Promise<string> {\n const driver = this.activeDriver;\n\n if (!this.isCloudDriver(driver)) {\n throw new Error(\"Presigned URLs are only available for cloud storage drivers\");\n }\n\n return driver.getPresignedUrl(location, options);\n }\n\n /**\n * Get a presigned URL for uploading a file directly to cloud storage\n *\n * Only available for cloud drivers.\n *\n * @param location - Destination path\n * @param options - Upload options (expiresIn, contentType, metadata).\n * There is no size cap: a presigned PUT URL cannot enforce one — verify\n * the uploaded size server-side or use a presigned POST policy instead.\n * @throws Error if current driver is not a cloud driver\n * @returns Presigned upload URL\n *\n * @example\n * ```typescript\n * const uploadUrl = await storage.getPresignedUploadUrl(\"uploads/file.pdf\", {\n * expiresIn: 3600,\n * contentType: \"application/pdf\"\n * });\n *\n * // Client can PUT directly to this URL\n * ```\n */\n public async getPresignedUploadUrl(\n location: string,\n options?: PresignedUploadOptions,\n ): Promise<string> {\n const driver = this.activeDriver;\n\n if (!this.isCloudDriver(driver)) {\n throw new Error(\"Presigned upload URLs are only available for cloud storage drivers\");\n }\n\n return driver.getPresignedUploadUrl(location, options);\n }\n\n /**\n * Get the bucket name for cloud storage\n *\n * Only available for cloud drivers.\n *\n * @throws Error if current driver is not a cloud driver\n * @returns Bucket name\n */\n public async getBucket(): Promise<string> {\n const driver = this.activeDriver;\n\n if (!this.isCloudDriver(driver)) {\n throw new Error(\"Bucket information is only available for cloud storage drivers\");\n }\n\n return driver.getBucket();\n }\n\n /**\n * Get the region for cloud storage\n *\n * Only available for cloud drivers.\n *\n * @throws Error if current driver is not a cloud driver\n * @returns Region name\n */\n public async getRegion(): Promise<string> {\n const driver = this.activeDriver;\n\n if (!this.isCloudDriver(driver)) {\n throw new Error(\"Region information is only available for cloud storage drivers\");\n }\n\n return driver.getRegion();\n }\n\n /**\n * Set storage class for a file (e.g., STANDARD, GLACIER, etc.)\n *\n * Only available for cloud drivers.\n *\n * @param location - File path\n * @param storageClass - Target storage class\n * @throws Error if current driver is not a cloud driver\n */\n public async setStorageClass(location: string, storageClass: string): Promise<void> {\n const driver = this.activeDriver;\n\n if (!this.isCloudDriver(driver)) {\n throw new Error(\"Storage class is only available for cloud storage drivers\");\n }\n\n return driver.setStorageClass(location, storageClass);\n }\n\n /**\n * Set file visibility (public or private)\n *\n * Only available for cloud drivers.\n *\n * @param location - File path\n * @param visibility - \"public\" or \"private\"\n * @throws Error if current driver is not a cloud driver\n */\n public async setVisibility(location: string, visibility: FileVisibility): Promise<void> {\n const driver = this.activeDriver;\n\n if (!this.isCloudDriver(driver)) {\n throw new Error(\"Visibility is only available for cloud storage drivers\");\n }\n\n return driver.setVisibility(location, visibility);\n }\n\n /**\n * Get file visibility\n *\n * Only available for cloud drivers.\n *\n * @param location - File path\n * @throws Error if current driver is not a cloud driver\n * @returns Current visibility setting\n */\n public async getVisibility(location: string): Promise<FileVisibility> {\n const driver = this.activeDriver;\n\n if (!this.isCloudDriver(driver)) {\n throw new Error(\"Visibility is only available for cloud storage drivers\");\n }\n\n return driver.getVisibility(location);\n }\n\n /**\n * Get a temporary signed URL\n *\n * Creates a URL that provides temporary access to the file.\n *\n * @param location - File path\n * @param expiresIn - Seconds until expiration (default: 3600)\n * @returns Signed URL string\n */\n public override async temporaryUrl(location: string, expiresIn?: number): Promise<string> {\n return this.activeDriver.temporaryUrl(location, expiresIn);\n }\n\n /**\n * Validate a temporary URL token\n *\n * For local driver: validates HMAC-signed tokens\n * For cloud drivers: returns invalid (cloud validates via presigned URL)\n *\n * @param token - The token from the temporary URL\n * @returns Validation result with file info and convenience methods\n *\n * @example\n * ```typescript\n * const result = await storage.validateTemporaryToken(token);\n *\n * if (!result.valid) {\n * return response.status(403).send(result.error);\n * }\n *\n * // For local driver - use sendFile for efficiency\n * if (result.absolutePath) {\n * return response.sendFile(result.absolutePath);\n * }\n *\n * // For cloud driver - stream the file\n * const stream = await result.getStream!();\n * stream.pipe(response.raw);\n * ```\n */\n public async validateTemporaryToken(token: string): Promise<TemporaryTokenValidation> {\n // Check if driver supports token validation\n if (\n !(\"validateTemporaryToken\" in this.activeDriver) ||\n typeof this.activeDriver.validateTemporaryToken !== \"function\"\n ) {\n // For cloud drivers, temporary URLs are presigned and validated by the cloud provider\n return {\n valid: false,\n error: \"invalid_token\",\n };\n }\n\n return this.activeDriver.validateTemporaryToken(token);\n }\n\n // ============================================================\n // Configuration Parsing\n // ============================================================\n\n /**\n * Parse config into driver-specific options\n * @internal\n */\n protected parseOptions(\n config: StorageDriverConfig,\n ): LocalStorageDriverOptions | CloudStorageDriverOptions | R2StorageDriverOptions {\n const { driver, ...options } = config;\n\n switch (driver) {\n case \"local\":\n return {\n root: options.root,\n prefix: options.prefix,\n urlPrefix: options.urlPrefix,\n temporaryUrlPrefix: options.temporaryUrlPrefix,\n signatureKey: options.signatureKey,\n } satisfies LocalStorageDriverOptions;\n\n case \"s3\":\n this.validateCloudConfig(config, \"s3\");\n return {\n ...options,\n bucket: options.bucket!,\n region: options.region!,\n accessKeyId: options.accessKeyId,\n secretAccessKey: options.secretAccessKey,\n endpoint: options.endpoint,\n urlPrefix: options.urlPrefix,\n } satisfies CloudStorageDriverOptions;\n\n case \"r2\":\n this.validateCloudConfig(config, \"r2\");\n if (!options.accountId) {\n throw new Error('R2 driver requires \"accountId\" configuration');\n }\n\n return {\n ...options,\n region: options.region || \"auto\",\n bucket: options.bucket!,\n accessKeyId: options.accessKeyId,\n secretAccessKey: options.secretAccessKey,\n endpoint: options.endpoint,\n urlPrefix: options.urlPrefix,\n accountId: options.accountId,\n publicDomain: options.publicDomain,\n } satisfies R2StorageDriverOptions;\n\n case \"spaces\":\n this.validateCloudConfig(config, \"spaces\");\n return {\n ...options,\n bucket: options.bucket!,\n region: options.region!,\n accessKeyId: options.accessKeyId,\n secretAccessKey: options.secretAccessKey,\n endpoint: options.endpoint,\n urlPrefix: options.urlPrefix,\n } satisfies CloudStorageDriverOptions;\n\n default:\n throw new Error(`Unknown driver type: ${driver}`);\n }\n }\n\n /**\n * Validate cloud driver configuration has required fields\n * @internal\n */\n protected validateCloudConfig(config: StorageDriverConfig, driverName: string): void {\n // Credentials are optional: when absent, the AWS default provider chain\n // applies (IAM roles, ECS task roles, IRSA, SSO profiles).\n const required = [\"bucket\"];\n\n if (driverName !== \"r2\") {\n required.push(\"region\");\n }\n\n for (const field of required) {\n if (!config[field as keyof StorageDriverConfig]) {\n throw new Error(`${driverName.toUpperCase()} driver requires \"${field}\" configuration`);\n }\n }\n\n if (Boolean(config.accessKeyId) !== Boolean(config.secretAccessKey)) {\n throw new Error(\n `${driverName.toUpperCase()} driver requires both \"accessKeyId\" and \"secretAccessKey\", or neither`,\n );\n }\n }\n\n /**\n * Get or create driver instance from cache\n * @internal\n */\n protected resolveDriver(name: string): StorageDriverContract {\n // Ensure configs are loaded\n\n if (this.drivers.has(name)) {\n return this.drivers.get(name)!;\n }\n\n const config = this.configs.get(name);\n\n if (!config) {\n throw new Error(`Storage driver \"${name}\" is not configured`);\n }\n\n const options = this.parseOptions(config);\n let driver: StorageDriverContract;\n\n switch (config.driver) {\n case \"local\":\n driver = new LocalDriver(options as LocalStorageDriverOptions);\n break;\n case \"s3\":\n driver = new S3Driver(options as CloudStorageDriverOptions);\n break;\n case \"r2\":\n driver = new R2Driver(options as R2StorageDriverOptions);\n break;\n case \"spaces\":\n driver = new DOSpacesDriver(options as CloudStorageDriverOptions);\n break;\n default:\n throw new Error(`Unknown storage driver type: ${config.driver}`);\n }\n\n this.drivers.set(name, driver);\n return driver;\n }\n}\n\n/**\n * Singleton storage instance\n *\n * Pre-configured storage manager ready for use throughout the application.\n *\n * @example\n * ```typescript\n * import { storage } from \"@warlock.js/core\";\n *\n * const file = await storage.put(buffer, \"uploads/file.txt\");\n * ```\n */\nexport const storage = new Storage();\n"],"mappings":"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"}
@@ -1,8 +1,9 @@
1
1
  import { StorageFile } from "./storage-file.mjs";
2
+ import { ScopedStorage } from "./scoped-storage.mjs";
2
3
  import { UploadedFile } from "../http/uploaded-file.mjs";
3
4
  import { Readable } from "stream";
4
5
 
5
- //#region ../core/src/storage/types.d.ts
6
+ //#region ../../packages/core/src/storage/types.d.ts
6
7
  /**
7
8
  * Options for local storage driver
8
9
  */
@@ -986,7 +987,7 @@ interface StorageManagerContract extends ScopedStorageContract {
986
987
  * @param name - Driver name as configured
987
988
  * @returns ScopedStorage instance for the driver
988
989
  */
989
- use(name: StorageDriverName): ScopedStorageContract;
990
+ use(name: StorageDriverName): ScopedStorage;
990
991
  /**
991
992
  * Get a raw driver instance
992
993
  *
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.mts","names":[],"sources":["../../../../../../../core/src/storage/types.ts"],"mappings":"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"}
1
+ {"version":3,"file":"types.d.mts","names":[],"sources":["../../../../../../../../packages/core/src/storage/types.ts"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- //#region ../core/src/storage/utils/classify-ip-address.d.ts
1
+ //#region ../../packages/core/src/storage/utils/classify-ip-address.d.ts
2
2
  /**
3
3
  * True when `ip` is a private, loopback, link-local, unique-local,
4
4
  * carrier-grade-NAT, unspecified, or otherwise non-public address — the set
@@ -1 +1 @@
1
- {"version":3,"file":"classify-ip-address.d.mts","names":[],"sources":["../../../../../../../../core/src/storage/utils/classify-ip-address.ts"],"mappings":";;AAwKA;;;;AAAgD;;;iBAAhC,qBAAA,CAAsB,EAAU"}
1
+ {"version":3,"file":"classify-ip-address.d.mts","names":[],"sources":["../../../../../../../../../packages/core/src/storage/utils/classify-ip-address.ts"],"mappings":";;AAwKA;;;;AAAgD;;;iBAAhC,qBAAA,CAAsB,EAAU"}
@@ -1,6 +1,6 @@
1
1
  import { isIP } from "node:net";
2
2
 
3
- //#region ../core/src/storage/utils/classify-ip-address.ts
3
+ //#region ../../packages/core/src/storage/utils/classify-ip-address.ts
4
4
  /** Parse a dotted-quad into four octets, or `null` if malformed. */
5
5
  function parseIpv4(ip) {
6
6
  const parts = ip.split(".");
@@ -1 +1 @@
1
- {"version":3,"file":"classify-ip-address.mjs","names":[],"sources":["../../../../../../../../core/src/storage/utils/classify-ip-address.ts"],"sourcesContent":["import { isIP } from \"node:net\";\n\n/**\n * Dependency-free IP classifier for SSRF guards. Imports node built-ins only\n * so other packages (e.g. `@warlock.js/ai`) can reuse it verbatim.\n */\n\ntype Ipv4Octets = [number, number, number, number];\n\n/** Parse a dotted-quad into four octets, or `null` if malformed. */\nfunction parseIpv4(ip: string): Ipv4Octets | null {\n const parts = ip.split(\".\");\n if (parts.length !== 4) {\n return null;\n }\n\n const octets = parts.map((part) => Number(part));\n if (octets.some((n) => !Number.isInteger(n) || n < 0 || n > 255)) {\n return null;\n }\n\n return octets as Ipv4Octets;\n}\n\nfunction isPrivateIpv4(ip: string): boolean {\n const octets = parseIpv4(ip);\n if (!octets) {\n return true; // unparseable → refuse, fail closed\n }\n\n const [a, b] = octets;\n\n return (\n a === 0 || // 0.0.0.0/8 \"this network\"\n a === 10 || // 10.0.0.0/8 private\n a === 127 || // 127.0.0.0/8 loopback\n (a === 100 && b >= 64 && b <= 127) || // 100.64.0.0/10 CGNAT\n (a === 169 && b === 254) || // 169.254.0.0/16 link-local + metadata\n (a === 172 && b >= 16 && b <= 31) || // 172.16.0.0/12 private\n (a === 192 && b === 168) || // 192.168.0.0/16 private\n (a === 192 && b === 0) || // 192.0.0.0/24 + 192.0.2.0/24 (IETF/test)\n (a === 198 && (b === 18 || b === 19)) || // 198.18.0.0/15 benchmarking\n (a === 198 && b === 51) || // 198.51.100.0/24 test-net-2\n (a === 203 && b === 0) || // 203.0.113.0/24 test-net-3\n a >= 224 // 224.0.0.0/4 multicast + 240.0.0.0/4 reserved + 255.255.255.255\n );\n}\n\n/**\n * Expand an IPv6 literal into its eight 16-bit groups (`::` expanded, a\n * trailing dotted-quad folded into two groups, zone id dropped). Returns\n * `null` when it cannot be parsed.\n */\nfunction expandIpv6(ip: string): number[] | null {\n let text = (ip.toLowerCase().split(\"%\")[0] ?? \"\").trim();\n if (text.startsWith(\"[\") && text.endsWith(\"]\")) {\n text = text.slice(1, -1);\n }\n\n const dotted = text.match(/^(.*:)(\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3})$/);\n if (dotted) {\n const octets = parseIpv4(dotted[2] as string);\n if (!octets) {\n return null;\n }\n const [a, b, c, d] = octets;\n text = `${dotted[1]}${((a << 8) | b).toString(16)}:${((c << 8) | d).toString(16)}`;\n }\n\n const halves = text.split(\"::\");\n if (halves.length > 2) {\n return null;\n }\n\n const toGroups = (part: string): string[] => (part === \"\" ? [] : part.split(\":\"));\n const head = toGroups(halves[0] as string);\n const tail = halves.length === 2 ? toGroups(halves[1] as string) : [];\n\n let groups: string[];\n if (halves.length === 2) {\n const missing = 8 - head.length - tail.length;\n if (missing < 1) {\n return null;\n }\n groups = [...head, ...new Array<string>(missing).fill(\"0\"), ...tail];\n } else {\n groups = head;\n }\n\n if (groups.length !== 8) {\n return null;\n }\n\n const values = groups.map((group) =>\n /^[0-9a-f]{1,4}$/.test(group) ? Number.parseInt(group, 16) : Number.NaN,\n );\n\n return values.some((n) => Number.isNaN(n)) ? null : values;\n}\n\n/** Build a dotted-quad from two 16-bit groups. */\nfunction toIpv4(high: number, low: number): string {\n return `${high >> 8}.${high & 0xff}.${low >> 8}.${low & 0xff}`;\n}\n\n/**\n * Extract the IPv4 address embedded in an IPv6 one — IPv4-mapped\n * (`::ffff:a.b.c.d` / `::ffff:XXXX:XXXX`), IPv4-translated (`::ffff:0:a.b.c.d`),\n * IPv4-compatible (`::a.b.c.d`), NAT64 (`64:ff9b::/96`) and 6to4\n * (`2002::/16`) — or `null` when there is none.\n */\nfunction extractEmbeddedIpv4(g: number[]): string | null {\n const zero = (from: number, to: number) => g.slice(from, to).every((n) => n === 0);\n\n if (zero(0, 5) && g[5] === 0xffff) {\n return toIpv4(g[6] as number, g[7] as number); // ::ffff:0:0/96\n }\n if (zero(0, 4) && g[4] === 0xffff && g[5] === 0) {\n return toIpv4(g[6] as number, g[7] as number); // ::ffff:0:0:0/96 (SIIT)\n }\n if (zero(0, 6)) {\n return toIpv4(g[6] as number, g[7] as number); // ::/96 (compatible)\n }\n if (g[0] === 0x64 && g[1] === 0xff9b && zero(2, 6)) {\n return toIpv4(g[6] as number, g[7] as number); // 64:ff9b::/96 NAT64\n }\n if (g[0] === 0x2002) {\n return toIpv4(g[1] as number, g[2] as number); // 2002::/16 6to4\n }\n\n return null;\n}\n\n// Every fallback returns `true` (\"private — refuse\"): this is an SSRF guard,\n// so an address we cannot classify must be refused, never let through.\nfunction isPrivateIpv6(ip: string): boolean {\n const groups = expandIpv6(ip);\n if (!groups) {\n return true;\n }\n\n const embedded = extractEmbeddedIpv4(groups);\n if (embedded !== null) {\n return isPrivateIpv4(embedded); // also covers :: (0.0.0.0) and ::1 (0.0.0.1)\n }\n\n const head = groups[0] as number;\n\n // fc00::/7 unique-local\n if ((head & 0xfe00) === 0xfc00) {\n return true;\n }\n // fe80::/10 link-local\n if ((head & 0xffc0) === 0xfe80) {\n return true;\n }\n\n return false;\n}\n\n/**\n * True when `ip` is a private, loopback, link-local, unique-local,\n * carrier-grade-NAT, unspecified, or otherwise non-public address — the set\n * an SSRF guard must refuse. IPv6 is normalised first, so every spelling of\n * an embedded IPv4 (mapped, hex-mapped, compatible, NAT64, 6to4) is judged\n * by the IPv4 it carries. A non-IP string returns `false` (the caller\n * resolves hostnames via DNS first).\n */\nexport function isPrivateOrReservedIp(ip: string): boolean {\n const family = isIP(ip);\n if (family === 4) {\n return isPrivateIpv4(ip);\n }\n if (family === 6) {\n return isPrivateIpv6(ip);\n }\n return false;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"classify-ip-address.mjs","names":[],"sources":["../../../../../../../../../packages/core/src/storage/utils/classify-ip-address.ts"],"sourcesContent":["import { isIP } from \"node:net\";\n\n/**\n * Dependency-free IP classifier for SSRF guards. Imports node built-ins only\n * so other packages (e.g. `@warlock.js/ai`) can reuse it verbatim.\n */\n\ntype Ipv4Octets = [number, number, number, number];\n\n/** Parse a dotted-quad into four octets, or `null` if malformed. */\nfunction parseIpv4(ip: string): Ipv4Octets | null {\n const parts = ip.split(\".\");\n if (parts.length !== 4) {\n return null;\n }\n\n const octets = parts.map((part) => Number(part));\n if (octets.some((n) => !Number.isInteger(n) || n < 0 || n > 255)) {\n return null;\n }\n\n return octets as Ipv4Octets;\n}\n\nfunction isPrivateIpv4(ip: string): boolean {\n const octets = parseIpv4(ip);\n if (!octets) {\n return true; // unparseable → refuse, fail closed\n }\n\n const [a, b] = octets;\n\n return (\n a === 0 || // 0.0.0.0/8 \"this network\"\n a === 10 || // 10.0.0.0/8 private\n a === 127 || // 127.0.0.0/8 loopback\n (a === 100 && b >= 64 && b <= 127) || // 100.64.0.0/10 CGNAT\n (a === 169 && b === 254) || // 169.254.0.0/16 link-local + metadata\n (a === 172 && b >= 16 && b <= 31) || // 172.16.0.0/12 private\n (a === 192 && b === 168) || // 192.168.0.0/16 private\n (a === 192 && b === 0) || // 192.0.0.0/24 + 192.0.2.0/24 (IETF/test)\n (a === 198 && (b === 18 || b === 19)) || // 198.18.0.0/15 benchmarking\n (a === 198 && b === 51) || // 198.51.100.0/24 test-net-2\n (a === 203 && b === 0) || // 203.0.113.0/24 test-net-3\n a >= 224 // 224.0.0.0/4 multicast + 240.0.0.0/4 reserved + 255.255.255.255\n );\n}\n\n/**\n * Expand an IPv6 literal into its eight 16-bit groups (`::` expanded, a\n * trailing dotted-quad folded into two groups, zone id dropped). Returns\n * `null` when it cannot be parsed.\n */\nfunction expandIpv6(ip: string): number[] | null {\n let text = (ip.toLowerCase().split(\"%\")[0] ?? \"\").trim();\n if (text.startsWith(\"[\") && text.endsWith(\"]\")) {\n text = text.slice(1, -1);\n }\n\n const dotted = text.match(/^(.*:)(\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3})$/);\n if (dotted) {\n const octets = parseIpv4(dotted[2] as string);\n if (!octets) {\n return null;\n }\n const [a, b, c, d] = octets;\n text = `${dotted[1]}${((a << 8) | b).toString(16)}:${((c << 8) | d).toString(16)}`;\n }\n\n const halves = text.split(\"::\");\n if (halves.length > 2) {\n return null;\n }\n\n const toGroups = (part: string): string[] => (part === \"\" ? [] : part.split(\":\"));\n const head = toGroups(halves[0] as string);\n const tail = halves.length === 2 ? toGroups(halves[1] as string) : [];\n\n let groups: string[];\n if (halves.length === 2) {\n const missing = 8 - head.length - tail.length;\n if (missing < 1) {\n return null;\n }\n groups = [...head, ...new Array<string>(missing).fill(\"0\"), ...tail];\n } else {\n groups = head;\n }\n\n if (groups.length !== 8) {\n return null;\n }\n\n const values = groups.map((group) =>\n /^[0-9a-f]{1,4}$/.test(group) ? Number.parseInt(group, 16) : Number.NaN,\n );\n\n return values.some((n) => Number.isNaN(n)) ? null : values;\n}\n\n/** Build a dotted-quad from two 16-bit groups. */\nfunction toIpv4(high: number, low: number): string {\n return `${high >> 8}.${high & 0xff}.${low >> 8}.${low & 0xff}`;\n}\n\n/**\n * Extract the IPv4 address embedded in an IPv6 one — IPv4-mapped\n * (`::ffff:a.b.c.d` / `::ffff:XXXX:XXXX`), IPv4-translated (`::ffff:0:a.b.c.d`),\n * IPv4-compatible (`::a.b.c.d`), NAT64 (`64:ff9b::/96`) and 6to4\n * (`2002::/16`) — or `null` when there is none.\n */\nfunction extractEmbeddedIpv4(g: number[]): string | null {\n const zero = (from: number, to: number) => g.slice(from, to).every((n) => n === 0);\n\n if (zero(0, 5) && g[5] === 0xffff) {\n return toIpv4(g[6] as number, g[7] as number); // ::ffff:0:0/96\n }\n if (zero(0, 4) && g[4] === 0xffff && g[5] === 0) {\n return toIpv4(g[6] as number, g[7] as number); // ::ffff:0:0:0/96 (SIIT)\n }\n if (zero(0, 6)) {\n return toIpv4(g[6] as number, g[7] as number); // ::/96 (compatible)\n }\n if (g[0] === 0x64 && g[1] === 0xff9b && zero(2, 6)) {\n return toIpv4(g[6] as number, g[7] as number); // 64:ff9b::/96 NAT64\n }\n if (g[0] === 0x2002) {\n return toIpv4(g[1] as number, g[2] as number); // 2002::/16 6to4\n }\n\n return null;\n}\n\n// Every fallback returns `true` (\"private — refuse\"): this is an SSRF guard,\n// so an address we cannot classify must be refused, never let through.\nfunction isPrivateIpv6(ip: string): boolean {\n const groups = expandIpv6(ip);\n if (!groups) {\n return true;\n }\n\n const embedded = extractEmbeddedIpv4(groups);\n if (embedded !== null) {\n return isPrivateIpv4(embedded); // also covers :: (0.0.0.0) and ::1 (0.0.0.1)\n }\n\n const head = groups[0] as number;\n\n // fc00::/7 unique-local\n if ((head & 0xfe00) === 0xfc00) {\n return true;\n }\n // fe80::/10 link-local\n if ((head & 0xffc0) === 0xfe80) {\n return true;\n }\n\n return false;\n}\n\n/**\n * True when `ip` is a private, loopback, link-local, unique-local,\n * carrier-grade-NAT, unspecified, or otherwise non-public address — the set\n * an SSRF guard must refuse. IPv6 is normalised first, so every spelling of\n * an embedded IPv4 (mapped, hex-mapped, compatible, NAT64, 6to4) is judged\n * by the IPv4 it carries. A non-IP string returns `false` (the caller\n * resolves hostnames via DNS first).\n */\nexport function isPrivateOrReservedIp(ip: string): boolean {\n const family = isIP(ip);\n if (family === 4) {\n return isPrivateIpv4(ip);\n }\n if (family === 6) {\n return isPrivateIpv6(ip);\n }\n return false;\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- //#region ../core/src/storage/utils/contain-path.d.ts
1
+ //#region ../../packages/core/src/storage/utils/contain-path.d.ts
2
2
  /**
3
3
  * Resolve `location` against `root` and assert the result stays *inside*
4
4
  * `root` — the local-storage path-traversal guard.
@@ -1 +1 @@
1
- {"version":3,"file":"contain-path.d.mts","names":[],"sources":["../../../../../../../../core/src/storage/utils/contain-path.ts"],"mappings":";;AAqBA;;;;AAAgE;;;;;;;;;;;;;iBAAhD,iBAAA,CAAkB,IAAA,UAAc,QAAgB"}
1
+ {"version":3,"file":"contain-path.d.mts","names":[],"sources":["../../../../../../../../../packages/core/src/storage/utils/contain-path.ts"],"mappings":";;AAqBA;;;;AAAgE;;;;;;;;;;;;;iBAAhD,iBAAA,CAAkB,IAAA,UAAc,QAAgB"}
@@ -1,7 +1,7 @@
1
1
  import { StorageError } from "./storage-error.mjs";
2
2
  import path from "path";
3
3
 
4
- //#region ../core/src/storage/utils/contain-path.ts
4
+ //#region ../../packages/core/src/storage/utils/contain-path.ts
5
5
  /**
6
6
  * Resolve `location` against `root` and assert the result stays *inside*
7
7
  * `root` — the local-storage path-traversal guard.
@@ -1 +1 @@
1
- {"version":3,"file":"contain-path.mjs","names":[],"sources":["../../../../../../../../core/src/storage/utils/contain-path.ts"],"sourcesContent":["import path from \"path\";\nimport { StorageError } from \"./storage-error\";\n\n/**\n * Resolve `location` against `root` and assert the result stays *inside*\n * `root` — the local-storage path-traversal guard.\n *\n * Without this, a `location` like `../../etc/passwd`, `..\\..\\windows\\...`,\n * an absolute path (`/etc/passwd`, `C:\\secret`), or a prefix breakout could\n * escape the configured storage root and read or clobber arbitrary files on\n * the host.\n *\n * The check compares the relative path from `root` to the resolved target:\n * if it climbs out (`..` prefix) or is itself absolute (different drive /\n * root on Windows), the location is rejected.\n *\n * @param root - Absolute, normalized storage root.\n * @param location - Caller-supplied (already prefix-applied) location.\n * @returns The absolute, contained filesystem path.\n * @throws {StorageError} When the location escapes `root`.\n */\nexport function resolveWithinRoot(root: string, location: string): string {\n const resolved = path.resolve(root, location);\n const rel = path.relative(root, resolved);\n\n if (rel !== \"\" && (rel.startsWith(\"..\") || path.isAbsolute(rel))) {\n throw new StorageError(`Storage location escapes the storage root: \"${location}\"`, {\n context: { location, root },\n });\n }\n\n return resolved;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAqBA,SAAgB,kBAAkB,MAAc,UAA0B;CACxE,MAAM,WAAW,KAAK,QAAQ,MAAM,QAAQ;CAC5C,MAAM,MAAM,KAAK,SAAS,MAAM,QAAQ;CAExC,IAAI,QAAQ,OAAO,IAAI,WAAW,IAAI,KAAK,KAAK,WAAW,GAAG,IAC5D,MAAM,IAAI,aAAa,+CAA+C,SAAS,IAAI,EACjF,SAAS;EAAE;EAAU;CAAK,EAC5B,CAAC;CAGH,OAAO;AACT"}
1
+ {"version":3,"file":"contain-path.mjs","names":[],"sources":["../../../../../../../../../packages/core/src/storage/utils/contain-path.ts"],"sourcesContent":["import path from \"path\";\nimport { StorageError } from \"./storage-error\";\n\n/**\n * Resolve `location` against `root` and assert the result stays *inside*\n * `root` — the local-storage path-traversal guard.\n *\n * Without this, a `location` like `../../etc/passwd`, `..\\..\\windows\\...`,\n * an absolute path (`/etc/passwd`, `C:\\secret`), or a prefix breakout could\n * escape the configured storage root and read or clobber arbitrary files on\n * the host.\n *\n * The check compares the relative path from `root` to the resolved target:\n * if it climbs out (`..` prefix) or is itself absolute (different drive /\n * root on Windows), the location is rejected.\n *\n * @param root - Absolute, normalized storage root.\n * @param location - Caller-supplied (already prefix-applied) location.\n * @returns The absolute, contained filesystem path.\n * @throws {StorageError} When the location escapes `root`.\n */\nexport function resolveWithinRoot(root: string, location: string): string {\n const resolved = path.resolve(root, location);\n const rel = path.relative(root, resolved);\n\n if (rel !== \"\" && (rel.startsWith(\"..\") || path.isAbsolute(rel))) {\n throw new StorageError(`Storage location escapes the storage root: \"${location}\"`, {\n context: { location, root },\n });\n }\n\n return resolved;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAqBA,SAAgB,kBAAkB,MAAc,UAA0B;CACxE,MAAM,WAAW,KAAK,QAAQ,MAAM,QAAQ;CAC5C,MAAM,MAAM,KAAK,SAAS,MAAM,QAAQ;CAExC,IAAI,QAAQ,OAAO,IAAI,WAAW,IAAI,KAAK,KAAK,WAAW,GAAG,IAC5D,MAAM,IAAI,aAAa,+CAA+C,SAAS,IAAI,EACjF,SAAS;EAAE;EAAU;CAAK,EAC5B,CAAC;CAGH,OAAO;AACT"}