@warlock.js/core 5.28.0 → 5.30.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 (1396) hide show
  1. package/CHANGELOG.md +71 -0
  2. package/esm/application/app.d.mts +1 -1
  3. package/esm/application/app.d.mts.map +1 -1
  4. package/esm/application/app.mjs +1 -1
  5. package/esm/application/app.mjs.map +1 -1
  6. package/esm/application/application-config-types.d.mts +1 -1
  7. package/esm/application/application-config-types.d.mts.map +1 -1
  8. package/esm/application/application.d.mts +1 -1
  9. package/esm/application/application.d.mts.map +1 -1
  10. package/esm/application/application.mjs +1 -1
  11. package/esm/application/application.mjs.map +1 -1
  12. package/esm/application/boot-signal.d.mts +1 -1
  13. package/esm/application/boot-signal.d.mts.map +1 -1
  14. package/esm/application/boot-signal.mjs +1 -1
  15. package/esm/application/boot-signal.mjs.map +1 -1
  16. package/esm/application/public-url.d.mts +1 -1
  17. package/esm/application/public-url.d.mts.map +1 -1
  18. package/esm/application/public-url.mjs +1 -1
  19. package/esm/application/public-url.mjs.map +1 -1
  20. package/esm/application/roles.d.mts +1 -1
  21. package/esm/application/roles.d.mts.map +1 -1
  22. package/esm/application/roles.mjs +1 -1
  23. package/esm/application/roles.mjs.map +1 -1
  24. package/esm/benchmark/benchmark-snapshots.d.mts +1 -1
  25. package/esm/benchmark/benchmark-snapshots.d.mts.map +1 -1
  26. package/esm/benchmark/benchmark-snapshots.mjs +1 -1
  27. package/esm/benchmark/benchmark-snapshots.mjs.map +1 -1
  28. package/esm/benchmark/benchmark.d.mts +1 -1
  29. package/esm/benchmark/benchmark.d.mts.map +1 -1
  30. package/esm/benchmark/benchmark.mjs +1 -1
  31. package/esm/benchmark/benchmark.mjs.map +1 -1
  32. package/esm/benchmark/channels/console.channel.d.mts +1 -1
  33. package/esm/benchmark/channels/console.channel.d.mts.map +1 -1
  34. package/esm/benchmark/channels/console.channel.mjs +1 -1
  35. package/esm/benchmark/channels/console.channel.mjs.map +1 -1
  36. package/esm/benchmark/channels/noop.channel.d.mts +1 -1
  37. package/esm/benchmark/channels/noop.channel.d.mts.map +1 -1
  38. package/esm/benchmark/channels/noop.channel.mjs +1 -1
  39. package/esm/benchmark/channels/noop.channel.mjs.map +1 -1
  40. package/esm/benchmark/profiler.d.mts +1 -1
  41. package/esm/benchmark/profiler.d.mts.map +1 -1
  42. package/esm/benchmark/profiler.mjs +1 -1
  43. package/esm/benchmark/profiler.mjs.map +1 -1
  44. package/esm/benchmark/types.d.mts +1 -1
  45. package/esm/benchmark/types.d.mts.map +1 -1
  46. package/esm/bootstrap/setup.d.mts +1 -1
  47. package/esm/bootstrap/setup.d.mts.map +1 -1
  48. package/esm/bootstrap/setup.mjs +1 -1
  49. package/esm/bootstrap/setup.mjs.map +1 -1
  50. package/esm/bootstrap.d.mts +1 -1
  51. package/esm/bootstrap.d.mts.map +1 -1
  52. package/esm/bootstrap.mjs +1 -1
  53. package/esm/bootstrap.mjs.map +1 -1
  54. package/esm/cache/database-cache-driver.d.mts +1 -1
  55. package/esm/cache/database-cache-driver.d.mts.map +1 -1
  56. package/esm/cache/database-cache-driver.mjs +1 -1
  57. package/esm/cache/database-cache-driver.mjs.map +1 -1
  58. package/esm/cache/index.mjs +1 -1
  59. package/esm/cache/index.mjs.map +1 -1
  60. package/esm/cli/cli-commands.manager.mjs +1 -1
  61. package/esm/cli/cli-commands.manager.mjs.map +1 -1
  62. package/esm/cli/cli-commands.utils.mjs +1 -1
  63. package/esm/cli/cli-commands.utils.mjs.map +1 -1
  64. package/esm/cli/commands/add.command.mjs +1 -1
  65. package/esm/cli/commands/add.command.mjs.map +1 -1
  66. package/esm/cli/commands/build.command.mjs +1 -1
  67. package/esm/cli/commands/build.command.mjs.map +1 -1
  68. package/esm/cli/commands/create-database.command.mjs +1 -1
  69. package/esm/cli/commands/create-database.command.mjs.map +1 -1
  70. package/esm/cli/commands/dev-server.command.mjs +1 -1
  71. package/esm/cli/commands/dev-server.command.mjs.map +1 -1
  72. package/esm/cli/commands/doctor/boot-for-diagnostics.mjs +1 -1
  73. package/esm/cli/commands/doctor/boot-for-diagnostics.mjs.map +1 -1
  74. package/esm/cli/commands/doctor/checks/config.check.mjs +1 -1
  75. package/esm/cli/commands/doctor/checks/config.check.mjs.map +1 -1
  76. package/esm/cli/commands/doctor/checks/connectors.check.mjs +1 -1
  77. package/esm/cli/commands/doctor/checks/connectors.check.mjs.map +1 -1
  78. package/esm/cli/commands/doctor/checks/handler-signature.check.mjs +1 -1
  79. package/esm/cli/commands/doctor/checks/handler-signature.check.mjs.map +1 -1
  80. package/esm/cli/commands/doctor/checks/health.check.mjs +1 -1
  81. package/esm/cli/commands/doctor/checks/health.check.mjs.map +1 -1
  82. package/esm/cli/commands/doctor/checks/index.mjs +1 -1
  83. package/esm/cli/commands/doctor/checks/index.mjs.map +1 -1
  84. package/esm/cli/commands/doctor/checks/jwt-secret.check.mjs +1 -1
  85. package/esm/cli/commands/doctor/checks/jwt-secret.check.mjs.map +1 -1
  86. package/esm/cli/commands/doctor/checks/locales-ts-deprecated.check.mjs +1 -1
  87. package/esm/cli/commands/doctor/checks/locales-ts-deprecated.check.mjs.map +1 -1
  88. package/esm/cli/commands/doctor/checks/optional-peers.check.mjs +1 -1
  89. package/esm/cli/commands/doctor/checks/optional-peers.check.mjs.map +1 -1
  90. package/esm/cli/commands/doctor/checks/release-hygiene.check.mjs +1 -1
  91. package/esm/cli/commands/doctor/checks/release-hygiene.check.mjs.map +1 -1
  92. package/esm/cli/commands/doctor/checks/routes.check.mjs +1 -1
  93. package/esm/cli/commands/doctor/checks/routes.check.mjs.map +1 -1
  94. package/esm/cli/commands/doctor/doctor-command.action.mjs +1 -1
  95. package/esm/cli/commands/doctor/doctor-command.action.mjs.map +1 -1
  96. package/esm/cli/commands/doctor/format-report.mjs +1 -1
  97. package/esm/cli/commands/doctor/format-report.mjs.map +1 -1
  98. package/esm/cli/commands/doctor/run-checks.mjs +1 -1
  99. package/esm/cli/commands/doctor/run-checks.mjs.map +1 -1
  100. package/esm/cli/commands/doctor.command.mjs +1 -1
  101. package/esm/cli/commands/doctor.command.mjs.map +1 -1
  102. package/esm/cli/commands/drop-tables.command.mjs +1 -1
  103. package/esm/cli/commands/drop-tables.command.mjs.map +1 -1
  104. package/esm/cli/commands/generate/generate.command.mjs +1 -1
  105. package/esm/cli/commands/generate/generate.command.mjs.map +1 -1
  106. package/esm/cli/commands/generate/generators/column-dsl-parser.mjs +1 -1
  107. package/esm/cli/commands/generate/generators/column-dsl-parser.mjs.map +1 -1
  108. package/esm/cli/commands/generate/generators/controller.generator.mjs +1 -1
  109. package/esm/cli/commands/generate/generators/controller.generator.mjs.map +1 -1
  110. package/esm/cli/commands/generate/generators/migration.generator.mjs +1 -1
  111. package/esm/cli/commands/generate/generators/migration.generator.mjs.map +1 -1
  112. package/esm/cli/commands/generate/generators/model.generator.mjs +1 -1
  113. package/esm/cli/commands/generate/generators/model.generator.mjs.map +1 -1
  114. package/esm/cli/commands/generate/generators/module.generator.mjs +1 -1
  115. package/esm/cli/commands/generate/generators/module.generator.mjs.map +1 -1
  116. package/esm/cli/commands/generate/generators/repository.generator.mjs +1 -1
  117. package/esm/cli/commands/generate/generators/repository.generator.mjs.map +1 -1
  118. package/esm/cli/commands/generate/generators/resource.generator.mjs +1 -1
  119. package/esm/cli/commands/generate/generators/resource.generator.mjs.map +1 -1
  120. package/esm/cli/commands/generate/generators/service.generator.mjs +1 -1
  121. package/esm/cli/commands/generate/generators/service.generator.mjs.map +1 -1
  122. package/esm/cli/commands/generate/generators/use-case.generator.mjs +1 -1
  123. package/esm/cli/commands/generate/generators/use-case.generator.mjs.map +1 -1
  124. package/esm/cli/commands/generate/templates/stubs.mjs +1 -1
  125. package/esm/cli/commands/generate/templates/stubs.mjs.map +1 -1
  126. package/esm/cli/commands/generate/utils/name-parser.mjs +1 -1
  127. package/esm/cli/commands/generate/utils/name-parser.mjs.map +1 -1
  128. package/esm/cli/commands/generate/utils/path-resolver.mjs +1 -1
  129. package/esm/cli/commands/generate/utils/path-resolver.mjs.map +1 -1
  130. package/esm/cli/commands/generate/utils/prompt.mjs +1 -1
  131. package/esm/cli/commands/generate/utils/prompt.mjs.map +1 -1
  132. package/esm/cli/commands/generate/utils/writer.mjs +1 -1
  133. package/esm/cli/commands/generate/utils/writer.mjs.map +1 -1
  134. package/esm/cli/commands/migrate.command.mjs +1 -1
  135. package/esm/cli/commands/migrate.command.mjs.map +1 -1
  136. package/esm/cli/commands/openapi-generator.action.mjs +1 -1
  137. package/esm/cli/commands/openapi-generator.action.mjs.map +1 -1
  138. package/esm/cli/commands/openapi-generator.command.mjs +1 -1
  139. package/esm/cli/commands/openapi-generator.command.mjs.map +1 -1
  140. package/esm/cli/commands/postman-generator.action.mjs +1 -1
  141. package/esm/cli/commands/postman-generator.action.mjs.map +1 -1
  142. package/esm/cli/commands/postman-generator.command.mjs +1 -1
  143. package/esm/cli/commands/postman-generator.command.mjs.map +1 -1
  144. package/esm/cli/commands/routes/diff-page-routes.mjs +1 -1
  145. package/esm/cli/commands/routes/diff-page-routes.mjs.map +1 -1
  146. package/esm/cli/commands/routes/format-routes-table.mjs +1 -1
  147. package/esm/cli/commands/routes/format-routes-table.mjs.map +1 -1
  148. package/esm/cli/commands/routes/route-row.mjs +1 -1
  149. package/esm/cli/commands/routes/route-row.mjs.map +1 -1
  150. package/esm/cli/commands/routes/routes-command.action.mjs +1 -1
  151. package/esm/cli/commands/routes/routes-command.action.mjs.map +1 -1
  152. package/esm/cli/commands/routes/routes-diff.action.mjs +1 -1
  153. package/esm/cli/commands/routes/routes-diff.action.mjs.map +1 -1
  154. package/esm/cli/commands/routes/with-console-on-stderr.mjs +1 -1
  155. package/esm/cli/commands/routes/with-console-on-stderr.mjs.map +1 -1
  156. package/esm/cli/commands/routes.command.mjs +1 -1
  157. package/esm/cli/commands/routes.command.mjs.map +1 -1
  158. package/esm/cli/commands/seed.command.mjs +1 -1
  159. package/esm/cli/commands/seed.command.mjs.map +1 -1
  160. package/esm/cli/commands/start-production.command.mjs +1 -1
  161. package/esm/cli/commands/start-production.command.mjs.map +1 -1
  162. package/esm/cli/commands/storage-put.action.mjs +1 -1
  163. package/esm/cli/commands/storage-put.action.mjs.map +1 -1
  164. package/esm/cli/commands/storage-put.command.mjs +1 -1
  165. package/esm/cli/commands/storage-put.command.mjs.map +1 -1
  166. package/esm/cli/commands/typings-generator.command.mjs +1 -1
  167. package/esm/cli/commands/typings-generator.command.mjs.map +1 -1
  168. package/esm/cli/commands/update.command.mjs +1 -1
  169. package/esm/cli/commands/update.command.mjs.map +1 -1
  170. package/esm/cli/commands-loader.mjs +1 -1
  171. package/esm/cli/commands-loader.mjs.map +1 -1
  172. package/esm/cli/framework-cli-commands.mjs +1 -1
  173. package/esm/cli/framework-cli-commands.mjs.map +1 -1
  174. package/esm/cli/parse-cli-args.mjs +1 -1
  175. package/esm/cli/parse-cli-args.mjs.map +1 -1
  176. package/esm/cli/start.mjs +1 -1
  177. package/esm/cli/start.mjs.map +1 -1
  178. package/esm/cli/string-similarity.mjs +1 -1
  179. package/esm/cli/string-similarity.mjs.map +1 -1
  180. package/esm/commands/cli-command.d.mts +1 -1
  181. package/esm/commands/cli-command.d.mts.map +1 -1
  182. package/esm/commands/cli-command.mjs +1 -1
  183. package/esm/commands/cli-command.mjs.map +1 -1
  184. package/esm/commands/types.d.mts +1 -1
  185. package/esm/commands/types.d.mts.map +1 -1
  186. package/esm/config/config-getter.d.mts +1 -1
  187. package/esm/config/config-getter.d.mts.map +1 -1
  188. package/esm/config/config-getter.mjs +1 -1
  189. package/esm/config/config-getter.mjs.map +1 -1
  190. package/esm/config/config-handlers.d.mts +1 -1
  191. package/esm/config/config-handlers.d.mts.map +1 -1
  192. package/esm/config/config-handlers.mjs +1 -1
  193. package/esm/config/config-handlers.mjs.map +1 -1
  194. package/esm/config/config-key-from-path.mjs +1 -1
  195. package/esm/config/config-key-from-path.mjs.map +1 -1
  196. package/esm/config/config-loader.d.mts +1 -1
  197. package/esm/config/config-loader.d.mts.map +1 -1
  198. package/esm/config/config-loader.mjs +1 -1
  199. package/esm/config/config-loader.mjs.map +1 -1
  200. package/esm/config/config-manager.mjs +1 -1
  201. package/esm/config/config-manager.mjs.map +1 -1
  202. package/esm/config/config-setter.d.mts +1 -1
  203. package/esm/config/config-setter.d.mts.map +1 -1
  204. package/esm/config/config-setter.mjs +1 -1
  205. package/esm/config/config-setter.mjs.map +1 -1
  206. package/esm/config/config-special-handlers.d.mts +1 -1
  207. package/esm/config/config-special-handlers.d.mts.map +1 -1
  208. package/esm/config/config-special-handlers.mjs +1 -1
  209. package/esm/config/config-special-handlers.mjs.map +1 -1
  210. package/esm/config/load-config-files.mjs +1 -1
  211. package/esm/config/load-config-files.mjs.map +1 -1
  212. package/esm/config/locale-configuration.mjs +1 -1
  213. package/esm/config/locale-configuration.mjs.map +1 -1
  214. package/esm/config/types.d.mts +1 -1
  215. package/esm/config/types.d.mts.map +1 -1
  216. package/esm/connectors/access-connector.d.mts +1 -1
  217. package/esm/connectors/access-connector.d.mts.map +1 -1
  218. package/esm/connectors/access-connector.mjs +1 -1
  219. package/esm/connectors/access-connector.mjs.map +1 -1
  220. package/esm/connectors/ai-connector.d.mts +1 -1
  221. package/esm/connectors/ai-connector.d.mts.map +1 -1
  222. package/esm/connectors/ai-connector.mjs +1 -1
  223. package/esm/connectors/ai-connector.mjs.map +1 -1
  224. package/esm/connectors/assert-no-reserved-connector-names.d.mts +1 -1
  225. package/esm/connectors/assert-no-reserved-connector-names.d.mts.map +1 -1
  226. package/esm/connectors/assert-no-reserved-connector-names.mjs +1 -1
  227. package/esm/connectors/assert-no-reserved-connector-names.mjs.map +1 -1
  228. package/esm/connectors/assert-unique-connector-names.d.mts +1 -1
  229. package/esm/connectors/assert-unique-connector-names.d.mts.map +1 -1
  230. package/esm/connectors/assert-unique-connector-names.mjs +1 -1
  231. package/esm/connectors/assert-unique-connector-names.mjs.map +1 -1
  232. package/esm/connectors/base-connector.d.mts +1 -1
  233. package/esm/connectors/base-connector.d.mts.map +1 -1
  234. package/esm/connectors/base-connector.mjs +1 -1
  235. package/esm/connectors/base-connector.mjs.map +1 -1
  236. package/esm/connectors/cache-connector.d.mts +1 -1
  237. package/esm/connectors/cache-connector.d.mts.map +1 -1
  238. package/esm/connectors/cache-connector.mjs +1 -1
  239. package/esm/connectors/cache-connector.mjs.map +1 -1
  240. package/esm/connectors/connectors-manager.d.mts +1 -1
  241. package/esm/connectors/connectors-manager.d.mts.map +1 -1
  242. package/esm/connectors/connectors-manager.mjs +2 -2
  243. package/esm/connectors/connectors-manager.mjs.map +1 -1
  244. package/esm/connectors/database-connector.d.mts +1 -1
  245. package/esm/connectors/database-connector.d.mts.map +1 -1
  246. package/esm/connectors/database-connector.mjs +1 -1
  247. package/esm/connectors/database-connector.mjs.map +1 -1
  248. package/esm/connectors/describe-server-address.mjs +1 -1
  249. package/esm/connectors/describe-server-address.mjs.map +1 -1
  250. package/esm/connectors/herald-connector.d.mts +1 -1
  251. package/esm/connectors/herald-connector.d.mts.map +1 -1
  252. package/esm/connectors/herald-connector.mjs +1 -1
  253. package/esm/connectors/herald-connector.mjs.map +1 -1
  254. package/esm/connectors/http-connector.d.mts +1 -1
  255. package/esm/connectors/http-connector.d.mts.map +1 -1
  256. package/esm/connectors/http-connector.mjs +1 -1
  257. package/esm/connectors/http-connector.mjs.map +1 -1
  258. package/esm/connectors/logger-connector.d.mts +1 -1
  259. package/esm/connectors/logger-connector.d.mts.map +1 -1
  260. package/esm/connectors/logger-connector.mjs +1 -1
  261. package/esm/connectors/logger-connector.mjs.map +1 -1
  262. package/esm/connectors/mail-connector.d.mts +1 -1
  263. package/esm/connectors/mail-connector.d.mts.map +1 -1
  264. package/esm/connectors/mail-connector.mjs +1 -1
  265. package/esm/connectors/mail-connector.mjs.map +1 -1
  266. package/esm/connectors/notifications-connector.d.mts +1 -1
  267. package/esm/connectors/notifications-connector.d.mts.map +1 -1
  268. package/esm/connectors/notifications-connector.mjs +1 -1
  269. package/esm/connectors/notifications-connector.mjs.map +1 -1
  270. package/esm/connectors/read-bound-port.mjs +1 -1
  271. package/esm/connectors/read-bound-port.mjs.map +1 -1
  272. package/esm/connectors/register-configured-connectors.d.mts +1 -1
  273. package/esm/connectors/register-configured-connectors.d.mts.map +1 -1
  274. package/esm/connectors/register-configured-connectors.mjs +1 -1
  275. package/esm/connectors/register-configured-connectors.mjs.map +1 -1
  276. package/esm/connectors/single-server-warnings.mjs +1 -1
  277. package/esm/connectors/single-server-warnings.mjs.map +1 -1
  278. package/esm/connectors/socket-connector.d.mts +1 -1
  279. package/esm/connectors/socket-connector.d.mts.map +1 -1
  280. package/esm/connectors/socket-connector.mjs +1 -1
  281. package/esm/connectors/socket-connector.mjs.map +1 -1
  282. package/esm/connectors/storage.connector.d.mts +1 -1
  283. package/esm/connectors/storage.connector.d.mts.map +1 -1
  284. package/esm/connectors/storage.connector.mjs +1 -1
  285. package/esm/connectors/storage.connector.mjs.map +1 -1
  286. package/esm/connectors/types.d.mts +1 -1
  287. package/esm/connectors/types.d.mts.map +1 -1
  288. package/esm/connectors/types.mjs +1 -1
  289. package/esm/connectors/types.mjs.map +1 -1
  290. package/esm/container/container-instance-registry.mjs +1 -1
  291. package/esm/container/container-instance-registry.mjs.map +1 -1
  292. package/esm/container/development-app-modules.d.mts +31 -0
  293. package/esm/container/development-app-modules.d.mts.map +1 -0
  294. package/esm/container/development-model-modules.d.mts +1 -1
  295. package/esm/container/development-model-modules.d.mts.map +1 -1
  296. package/esm/container/index.d.mts +3 -1
  297. package/esm/container/index.d.mts.map +1 -1
  298. package/esm/container/index.mjs +1 -1
  299. package/esm/container/index.mjs.map +1 -1
  300. package/esm/database/create-database-action.mjs +1 -1
  301. package/esm/database/create-database-action.mjs.map +1 -1
  302. package/esm/database/drop-tables-action.mjs +1 -1
  303. package/esm/database/drop-tables-action.mjs.map +1 -1
  304. package/esm/database/migrate-action.mjs +1 -1
  305. package/esm/database/migrate-action.mjs.map +1 -1
  306. package/esm/database/models/database-log/database-log.d.mts +31 -39
  307. package/esm/database/models/database-log/database-log.d.mts.map +1 -1
  308. package/esm/database/models/database-log/database-log.mjs +1 -1
  309. package/esm/database/models/database-log/database-log.mjs.map +1 -1
  310. package/esm/database/pending-exit-code.mjs +1 -1
  311. package/esm/database/pending-exit-code.mjs.map +1 -1
  312. package/esm/database/resolve-pending-migrations.mjs +1 -1
  313. package/esm/database/resolve-pending-migrations.mjs.map +1 -1
  314. package/esm/database/seed-command-action.mjs +1 -1
  315. package/esm/database/seed-command-action.mjs.map +1 -1
  316. package/esm/database/seeds/seed-records-table-migration.mjs +1 -1
  317. package/esm/database/seeds/seed-records-table-migration.mjs.map +1 -1
  318. package/esm/database/seeds/seeder.d.mts +1 -1
  319. package/esm/database/seeds/seeder.d.mts.map +1 -1
  320. package/esm/database/seeds/seeder.errors.d.mts +1 -1
  321. package/esm/database/seeds/seeder.errors.d.mts.map +1 -1
  322. package/esm/database/seeds/seeder.errors.mjs +1 -1
  323. package/esm/database/seeds/seeder.errors.mjs.map +1 -1
  324. package/esm/database/seeds/seeder.mjs +1 -1
  325. package/esm/database/seeds/seeder.mjs.map +1 -1
  326. package/esm/database/seeds/seeders.manager.mjs +1 -1
  327. package/esm/database/seeds/seeders.manager.mjs.map +1 -1
  328. package/esm/database/seeds/seeds-table-migration.mjs +1 -1
  329. package/esm/database/seeds/seeds-table-migration.mjs.map +1 -1
  330. package/esm/database/seeds/types.d.mts +1 -1
  331. package/esm/database/seeds/types.d.mts.map +1 -1
  332. package/esm/database/seeds/utils.mjs +1 -1
  333. package/esm/database/seeds/utils.mjs.map +1 -1
  334. package/esm/database/utils.d.mts +1 -1
  335. package/esm/database/utils.d.mts.map +1 -1
  336. package/esm/database/utils.mjs +1 -1
  337. package/esm/database/utils.mjs.map +1 -1
  338. package/esm/dev-server/app-module-registry.mjs +52 -0
  339. package/esm/dev-server/app-module-registry.mjs.map +1 -0
  340. package/esm/dev-server/boot-precondition-error.mjs +1 -1
  341. package/esm/dev-server/boot-precondition-error.mjs.map +1 -1
  342. package/esm/dev-server/build-development-openapi-document.mjs +1 -1
  343. package/esm/dev-server/build-development-openapi-document.mjs.map +1 -1
  344. package/esm/dev-server/check-for-updates.mjs +1 -1
  345. package/esm/dev-server/check-for-updates.mjs.map +1 -1
  346. package/esm/dev-server/collect-development-api-routes.mjs +1 -1
  347. package/esm/dev-server/collect-development-api-routes.mjs.map +1 -1
  348. package/esm/dev-server/create-worker.mjs +1 -1
  349. package/esm/dev-server/create-worker.mjs.map +1 -1
  350. package/esm/dev-server/dependency-graph.d.mts +1 -1
  351. package/esm/dev-server/dependency-graph.d.mts.map +1 -1
  352. package/esm/dev-server/dependency-graph.mjs +1 -1
  353. package/esm/dev-server/dependency-graph.mjs.map +1 -1
  354. package/esm/dev-server/dev-logger.mjs +1 -1
  355. package/esm/dev-server/dev-logger.mjs.map +1 -1
  356. package/esm/dev-server/development-server.mjs +1 -1
  357. package/esm/dev-server/development-server.mjs.map +1 -1
  358. package/esm/dev-server/events.mjs +1 -1
  359. package/esm/dev-server/events.mjs.map +1 -1
  360. package/esm/dev-server/extract-translation-keys.mjs +1 -1
  361. package/esm/dev-server/extract-translation-keys.mjs.map +1 -1
  362. package/esm/dev-server/file-event-handler.mjs +1 -1
  363. package/esm/dev-server/file-event-handler.mjs.map +1 -1
  364. package/esm/dev-server/file-manager.d.mts +1 -1
  365. package/esm/dev-server/file-manager.d.mts.map +1 -1
  366. package/esm/dev-server/file-manager.mjs +1 -1
  367. package/esm/dev-server/file-manager.mjs.map +1 -1
  368. package/esm/dev-server/file-operations.d.mts +1 -1
  369. package/esm/dev-server/file-operations.d.mts.map +1 -1
  370. package/esm/dev-server/file-operations.mjs +1 -1
  371. package/esm/dev-server/file-operations.mjs.map +1 -1
  372. package/esm/dev-server/files-orchestrator.mjs +28 -14
  373. package/esm/dev-server/files-orchestrator.mjs.map +1 -1
  374. package/esm/dev-server/files-watcher.mjs +1 -1
  375. package/esm/dev-server/files-watcher.mjs.map +1 -1
  376. package/esm/dev-server/flags.mjs +1 -1
  377. package/esm/dev-server/flags.mjs.map +1 -1
  378. package/esm/dev-server/health-checker/checkers/base-health-checker.mjs +1 -1
  379. package/esm/dev-server/health-checker/checkers/base-health-checker.mjs.map +1 -1
  380. package/esm/dev-server/health-checker/checkers/eslint-health-checker.mjs +1 -1
  381. package/esm/dev-server/health-checker/checkers/eslint-health-checker.mjs.map +1 -1
  382. package/esm/dev-server/health-checker/checkers/typescript-health-checker.mjs +1 -1
  383. package/esm/dev-server/health-checker/checkers/typescript-health-checker.mjs.map +1 -1
  384. package/esm/dev-server/health-checker/file-health-checker.contract.d.mts +1 -1
  385. package/esm/dev-server/health-checker/file-health-checker.contract.d.mts.map +1 -1
  386. package/esm/dev-server/health-checker/file-health-result.d.mts +1 -1
  387. package/esm/dev-server/health-checker/file-health-result.d.mts.map +1 -1
  388. package/esm/dev-server/health-checker/file-health-result.mjs +1 -1
  389. package/esm/dev-server/health-checker/file-health-result.mjs.map +1 -1
  390. package/esm/dev-server/health-checker/files-healthcare.manager.mjs +1 -1
  391. package/esm/dev-server/health-checker/files-healthcare.manager.mjs.map +1 -1
  392. package/esm/dev-server/health-checker/workers/eslint-health.worker.mjs +1 -1
  393. package/esm/dev-server/health-checker/workers/eslint-health.worker.mjs.map +1 -1
  394. package/esm/dev-server/health-checker/workers/ts-health.worker.mjs +1 -1
  395. package/esm/dev-server/health-checker/workers/ts-health.worker.mjs.map +1 -1
  396. package/esm/dev-server/layer-executor.mjs +1 -1
  397. package/esm/dev-server/layer-executor.mjs.map +1 -1
  398. package/esm/dev-server/legacy-locales-warning.mjs +1 -1
  399. package/esm/dev-server/legacy-locales-warning.mjs.map +1 -1
  400. package/esm/dev-server/loader/build-transpile-init.mjs +1 -1
  401. package/esm/dev-server/loader/build-transpile-init.mjs.map +1 -1
  402. package/esm/dev-server/loader/hook-thread.d.mts +1 -1
  403. package/esm/dev-server/loader/hook-thread.d.mts.map +1 -1
  404. package/esm/dev-server/loader/hook-thread.mjs +1 -1
  405. package/esm/dev-server/loader/hook-thread.mjs.map +1 -1
  406. package/esm/dev-server/loader/load-hook.d.mts +1 -1
  407. package/esm/dev-server/loader/load-hook.d.mts.map +1 -1
  408. package/esm/dev-server/loader/load-hook.mjs +1 -1
  409. package/esm/dev-server/loader/load-hook.mjs.map +1 -1
  410. package/esm/dev-server/loader/loader-port-acks.mjs +34 -0
  411. package/esm/dev-server/loader/loader-port-acks.mjs.map +1 -0
  412. package/esm/dev-server/loader/own-resolver.mjs +1 -1
  413. package/esm/dev-server/loader/own-resolver.mjs.map +1 -1
  414. package/esm/dev-server/loader/register-loader.mjs +1 -1
  415. package/esm/dev-server/loader/register-loader.mjs.map +1 -1
  416. package/esm/dev-server/loader/resolve-capture.mjs +1 -1
  417. package/esm/dev-server/loader/resolve-capture.mjs.map +1 -1
  418. package/esm/dev-server/loader/resolve-hook.d.mts +1 -1
  419. package/esm/dev-server/loader/resolve-hook.d.mts.map +1 -1
  420. package/esm/dev-server/loader/resolve-hook.mjs +2 -2
  421. package/esm/dev-server/loader/resolve-hook.mjs.map +1 -1
  422. package/esm/dev-server/loader/source-slug.mjs +1 -1
  423. package/esm/dev-server/loader/source-slug.mjs.map +1 -1
  424. package/esm/dev-server/loader/transpile-cache.mjs +1 -1
  425. package/esm/dev-server/loader/transpile-cache.mjs.map +1 -1
  426. package/esm/dev-server/loader/version-registry.mjs +1 -1
  427. package/esm/dev-server/loader/version-registry.mjs.map +1 -1
  428. package/esm/dev-server/manifest-manager.d.mts +1 -1
  429. package/esm/dev-server/manifest-manager.d.mts.map +1 -1
  430. package/esm/dev-server/manifest-manager.mjs +1 -1
  431. package/esm/dev-server/manifest-manager.mjs.map +1 -1
  432. package/esm/dev-server/model-module-registry.mjs +1 -1
  433. package/esm/dev-server/model-module-registry.mjs.map +1 -1
  434. package/esm/dev-server/model-resource-typings.mjs +1 -1
  435. package/esm/dev-server/model-resource-typings.mjs.map +1 -1
  436. package/esm/dev-server/module-loader.mjs +1 -1
  437. package/esm/dev-server/module-loader.mjs.map +1 -1
  438. package/esm/dev-server/package-json-manager.mjs +1 -1
  439. package/esm/dev-server/package-json-manager.mjs.map +1 -1
  440. package/esm/dev-server/parse-imports.mjs +73 -6
  441. package/esm/dev-server/parse-imports.mjs.map +1 -1
  442. package/esm/dev-server/read-config-ast.mjs +1 -1
  443. package/esm/dev-server/read-config-ast.mjs.map +1 -1
  444. package/esm/dev-server/ready-block.mjs +1 -1
  445. package/esm/dev-server/ready-block.mjs.map +1 -1
  446. package/esm/dev-server/register-dev-shortcuts.mjs +1 -1
  447. package/esm/dev-server/register-dev-shortcuts.mjs.map +1 -1
  448. package/esm/dev-server/register-installed-devtools.mjs +1 -1
  449. package/esm/dev-server/register-installed-devtools.mjs.map +1 -1
  450. package/esm/dev-server/restart-dev-server.mjs +1 -1
  451. package/esm/dev-server/restart-dev-server.mjs.map +1 -1
  452. package/esm/dev-server/route-types-publisher.mjs +1 -1
  453. package/esm/dev-server/route-types-publisher.mjs.map +1 -1
  454. package/esm/dev-server/run-connector-typings.mjs +1 -1
  455. package/esm/dev-server/run-connector-typings.mjs.map +1 -1
  456. package/esm/dev-server/run-typings-generation.mjs +1 -1
  457. package/esm/dev-server/run-typings-generation.mjs.map +1 -1
  458. package/esm/dev-server/shortcuts.mjs +1 -1
  459. package/esm/dev-server/shortcuts.mjs.map +1 -1
  460. package/esm/dev-server/special-file-patterns.mjs +1 -1
  461. package/esm/dev-server/special-file-patterns.mjs.map +1 -1
  462. package/esm/dev-server/special-files-collector.d.mts +1 -1
  463. package/esm/dev-server/special-files-collector.d.mts.map +1 -1
  464. package/esm/dev-server/special-files-collector.mjs +1 -1
  465. package/esm/dev-server/special-files-collector.mjs.map +1 -1
  466. package/esm/dev-server/start-development-server.mjs +1 -1
  467. package/esm/dev-server/start-development-server.mjs.map +1 -1
  468. package/esm/dev-server/supervisor.mjs +1 -1
  469. package/esm/dev-server/supervisor.mjs.map +1 -1
  470. package/esm/dev-server/translation-keys-sources.mjs +1 -1
  471. package/esm/dev-server/translation-keys-sources.mjs.map +1 -1
  472. package/esm/dev-server/tsconfig-manager.mjs +1 -1
  473. package/esm/dev-server/tsconfig-manager.mjs.map +1 -1
  474. package/esm/dev-server/type-generator.mjs +32 -11
  475. package/esm/dev-server/type-generator.mjs.map +1 -1
  476. package/esm/dev-server/types.d.mts +1 -1
  477. package/esm/dev-server/types.d.mts.map +1 -1
  478. package/esm/dev-server/update-check-cache.mjs +1 -1
  479. package/esm/dev-server/update-check-cache.mjs.map +1 -1
  480. package/esm/dev-server/utils.mjs +1 -1
  481. package/esm/dev-server/utils.mjs.map +1 -1
  482. package/esm/encryption/encrypt.d.mts +1 -1
  483. package/esm/encryption/encrypt.d.mts.map +1 -1
  484. package/esm/encryption/encrypt.mjs +1 -1
  485. package/esm/encryption/encrypt.mjs.map +1 -1
  486. package/esm/encryption/hash.d.mts +1 -1
  487. package/esm/encryption/hash.d.mts.map +1 -1
  488. package/esm/encryption/hash.mjs +1 -1
  489. package/esm/encryption/hash.mjs.map +1 -1
  490. package/esm/encryption/password.d.mts +1 -1
  491. package/esm/encryption/password.d.mts.map +1 -1
  492. package/esm/encryption/password.mjs +1 -1
  493. package/esm/encryption/password.mjs.map +1 -1
  494. package/esm/encryption/types.d.mts +1 -1
  495. package/esm/encryption/types.d.mts.map +1 -1
  496. package/esm/errors/container-key-missing-error.mjs +1 -1
  497. package/esm/errors/container-key-missing-error.mjs.map +1 -1
  498. package/esm/errors/esbuild-binary-missing-error.mjs +1 -1
  499. package/esm/errors/esbuild-binary-missing-error.mjs.map +1 -1
  500. package/esm/errors/index.d.mts +2 -0
  501. package/esm/errors/index.mjs +3 -0
  502. package/esm/errors/unknown-locale-error.mjs +1 -1
  503. package/esm/errors/unknown-locale-error.mjs.map +1 -1
  504. package/esm/generations/add-command.action.mjs +29 -6
  505. package/esm/generations/add-command.action.mjs.map +1 -1
  506. package/esm/generations/features/access.feature.mjs +1 -1
  507. package/esm/generations/features/access.feature.mjs.map +1 -1
  508. package/esm/generations/features/ai-anthropic.feature.mjs +1 -1
  509. package/esm/generations/features/ai-anthropic.feature.mjs.map +1 -1
  510. package/esm/generations/features/ai-bedrock.feature.mjs +1 -1
  511. package/esm/generations/features/ai-bedrock.feature.mjs.map +1 -1
  512. package/esm/generations/features/ai-google.feature.mjs +1 -1
  513. package/esm/generations/features/ai-google.feature.mjs.map +1 -1
  514. package/esm/generations/features/ai-ollama.feature.mjs +1 -1
  515. package/esm/generations/features/ai-ollama.feature.mjs.map +1 -1
  516. package/esm/generations/features/ai-openai.feature.mjs +1 -1
  517. package/esm/generations/features/ai-openai.feature.mjs.map +1 -1
  518. package/esm/generations/features/ai-panoptic.feature.mjs +1 -1
  519. package/esm/generations/features/ai-panoptic.feature.mjs.map +1 -1
  520. package/esm/generations/features/ai-tools.feature.mjs +1 -1
  521. package/esm/generations/features/ai-tools.feature.mjs.map +1 -1
  522. package/esm/generations/features/ai-workspace.feature.mjs +1 -1
  523. package/esm/generations/features/ai-workspace.feature.mjs.map +1 -1
  524. package/esm/generations/features/ai.feature.mjs +1 -1
  525. package/esm/generations/features/ai.feature.mjs.map +1 -1
  526. package/esm/generations/features/auth-google.feature.mjs +1 -1
  527. package/esm/generations/features/auth-google.feature.mjs.map +1 -1
  528. package/esm/generations/features/auth-passkeys.feature.mjs +1 -1
  529. package/esm/generations/features/auth-passkeys.feature.mjs.map +1 -1
  530. package/esm/generations/features/bull-board.feature.mjs +1 -1
  531. package/esm/generations/features/bull-board.feature.mjs.map +1 -1
  532. package/esm/generations/features/devtools.feature.mjs +1 -1
  533. package/esm/generations/features/devtools.feature.mjs.map +1 -1
  534. package/esm/generations/features/herald.feature.mjs +1 -1
  535. package/esm/generations/features/herald.feature.mjs.map +1 -1
  536. package/esm/generations/features/image.feature.mjs +1 -1
  537. package/esm/generations/features/image.feature.mjs.map +1 -1
  538. package/esm/generations/features/index.mjs +1 -1
  539. package/esm/generations/features/index.mjs.map +1 -1
  540. package/esm/generations/features/mail.feature.mjs +1 -1
  541. package/esm/generations/features/mail.feature.mjs.map +1 -1
  542. package/esm/generations/features/mongodb.feature.mjs +1 -1
  543. package/esm/generations/features/mongodb.feature.mjs.map +1 -1
  544. package/esm/generations/features/mysql.feature.mjs +1 -1
  545. package/esm/generations/features/mysql.feature.mjs.map +1 -1
  546. package/esm/generations/features/notifications.feature.mjs +121 -17
  547. package/esm/generations/features/notifications.feature.mjs.map +1 -1
  548. package/esm/generations/features/postgres.feature.mjs +1 -1
  549. package/esm/generations/features/postgres.feature.mjs.map +1 -1
  550. package/esm/generations/features/queue.feature.mjs +1 -1
  551. package/esm/generations/features/queue.feature.mjs.map +1 -1
  552. package/esm/generations/features/react-email.feature.mjs +1 -1
  553. package/esm/generations/features/react-email.feature.mjs.map +1 -1
  554. package/esm/generations/features/react.feature.mjs +1 -1
  555. package/esm/generations/features/react.feature.mjs.map +1 -1
  556. package/esm/generations/features/redis.feature.mjs +1 -1
  557. package/esm/generations/features/redis.feature.mjs.map +1 -1
  558. package/esm/generations/features/s3.feature.mjs +1 -1
  559. package/esm/generations/features/s3.feature.mjs.map +1 -1
  560. package/esm/generations/features/scheduler.feature.mjs +1 -1
  561. package/esm/generations/features/scheduler.feature.mjs.map +1 -1
  562. package/esm/generations/features/ses.feature.mjs +1 -1
  563. package/esm/generations/features/ses.feature.mjs.map +1 -1
  564. package/esm/generations/features/shadcn.feature.mjs +1 -1
  565. package/esm/generations/features/shadcn.feature.mjs.map +1 -1
  566. package/esm/generations/features/shared/insert-connector-entry.mjs +1 -1
  567. package/esm/generations/features/shared/insert-connector-entry.mjs.map +1 -1
  568. package/esm/generations/features/shared/insert-queue-dashboard-block.mjs +1 -1
  569. package/esm/generations/features/shared/insert-queue-dashboard-block.mjs.map +1 -1
  570. package/esm/generations/features/shared/link-ai-package-import.mjs +1 -1
  571. package/esm/generations/features/shared/link-ai-package-import.mjs.map +1 -1
  572. package/esm/generations/features/shared/merge-web-sitemap-config.mjs +1 -1
  573. package/esm/generations/features/shared/merge-web-sitemap-config.mjs.map +1 -1
  574. package/esm/generations/features/shared/migration-timestamp.mjs +1 -1
  575. package/esm/generations/features/shared/migration-timestamp.mjs.map +1 -1
  576. package/esm/generations/features/shared/patch-tsconfig-include.mjs +1 -1
  577. package/esm/generations/features/shared/patch-tsconfig-include.mjs.map +1 -1
  578. package/esm/generations/features/shared/relocate-conflicting-home-route.mjs +1 -1
  579. package/esm/generations/features/shared/relocate-conflicting-home-route.mjs.map +1 -1
  580. package/esm/generations/features/shared/resolve-contact-scaffold.mjs +1 -1
  581. package/esm/generations/features/shared/resolve-contact-scaffold.mjs.map +1 -1
  582. package/esm/generations/features/sitemap.feature.mjs +1 -1
  583. package/esm/generations/features/sitemap.feature.mjs.map +1 -1
  584. package/esm/generations/features/socket.feature.mjs +1 -1
  585. package/esm/generations/features/socket.feature.mjs.map +1 -1
  586. package/esm/generations/features/tailwind.feature.mjs +1 -1
  587. package/esm/generations/features/tailwind.feature.mjs.map +1 -1
  588. package/esm/generations/features/test.feature.mjs +1 -1
  589. package/esm/generations/features/test.feature.mjs.map +1 -1
  590. package/esm/generations/features/types.mjs +1 -1
  591. package/esm/generations/features/types.mjs.map +1 -1
  592. package/esm/generations/features/web.feature.mjs +1 -1
  593. package/esm/generations/features/web.feature.mjs.map +1 -1
  594. package/esm/generations/pnpm-build-approvals.mjs +89 -3
  595. package/esm/generations/pnpm-build-approvals.mjs.map +1 -1
  596. package/esm/generations/stubs.mjs +184 -78
  597. package/esm/generations/stubs.mjs.map +1 -1
  598. package/esm/http/boot-port-preflight.d.mts +1 -1
  599. package/esm/http/boot-port-preflight.d.mts.map +1 -1
  600. package/esm/http/boot-port-preflight.mjs +1 -1
  601. package/esm/http/boot-port-preflight.mjs.map +1 -1
  602. package/esm/http/build-cors-options.mjs +1 -1
  603. package/esm/http/build-cors-options.mjs.map +1 -1
  604. package/esm/http/build-rate-limit-options.d.mts +22 -1
  605. package/esm/http/build-rate-limit-options.d.mts.map +1 -1
  606. package/esm/http/build-rate-limit-options.mjs +7 -1
  607. package/esm/http/build-rate-limit-options.mjs.map +1 -1
  608. package/esm/http/config.d.mts +1 -1
  609. package/esm/http/config.d.mts.map +1 -1
  610. package/esm/http/config.mjs +1 -1
  611. package/esm/http/config.mjs.map +1 -1
  612. package/esm/http/context/request-context.d.mts +1 -1
  613. package/esm/http/context/request-context.d.mts.map +1 -1
  614. package/esm/http/context/request-context.mjs +1 -1
  615. package/esm/http/context/request-context.mjs.map +1 -1
  616. package/esm/http/context/request-memo.d.mts +1 -1
  617. package/esm/http/context/request-memo.d.mts.map +1 -1
  618. package/esm/http/context/request-memo.mjs +1 -1
  619. package/esm/http/context/request-memo.mjs.map +1 -1
  620. package/esm/http/createHttpApplication.d.mts +1 -1
  621. package/esm/http/createHttpApplication.d.mts.map +1 -1
  622. package/esm/http/createHttpApplication.mjs +1 -1
  623. package/esm/http/createHttpApplication.mjs.map +1 -1
  624. package/esm/http/csp.d.mts +1 -1
  625. package/esm/http/csp.d.mts.map +1 -1
  626. package/esm/http/csp.mjs +1 -1
  627. package/esm/http/csp.mjs.map +1 -1
  628. package/esm/http/csrf-default-guard.d.mts +1 -1
  629. package/esm/http/csrf-default-guard.d.mts.map +1 -1
  630. package/esm/http/csrf-default-guard.mjs +1 -1
  631. package/esm/http/csrf-default-guard.mjs.map +1 -1
  632. package/esm/http/csrf-origin-policy.d.mts +1 -1
  633. package/esm/http/csrf-origin-policy.d.mts.map +1 -1
  634. package/esm/http/csrf-origin-policy.mjs +1 -1
  635. package/esm/http/csrf-origin-policy.mjs.map +1 -1
  636. package/esm/http/database/RequestLog.d.mts +63 -111
  637. package/esm/http/database/RequestLog.d.mts.map +1 -1
  638. package/esm/http/database/RequestLog.mjs +1 -1
  639. package/esm/http/database/RequestLog.mjs.map +1 -1
  640. package/esm/http/error-codes.d.mts +1 -1
  641. package/esm/http/error-codes.d.mts.map +1 -1
  642. package/esm/http/error-codes.mjs +1 -1
  643. package/esm/http/error-codes.mjs.map +1 -1
  644. package/esm/http/error-mapper.d.mts +48 -0
  645. package/esm/http/error-mapper.d.mts.map +1 -0
  646. package/esm/http/error-mapper.mjs +48 -0
  647. package/esm/http/error-mapper.mjs.map +1 -0
  648. package/esm/http/errors/errors.d.mts +1 -1
  649. package/esm/http/errors/errors.d.mts.map +1 -1
  650. package/esm/http/errors/errors.mjs +1 -1
  651. package/esm/http/errors/errors.mjs.map +1 -1
  652. package/esm/http/events.d.mts +1 -1
  653. package/esm/http/events.d.mts.map +1 -1
  654. package/esm/http/events.mjs +1 -1
  655. package/esm/http/events.mjs.map +1 -1
  656. package/esm/http/flush-pending-cookies.mjs +1 -1
  657. package/esm/http/flush-pending-cookies.mjs.map +1 -1
  658. package/esm/http/health.d.mts +1 -1
  659. package/esm/http/health.d.mts.map +1 -1
  660. package/esm/http/health.mjs +1 -1
  661. package/esm/http/health.mjs.map +1 -1
  662. package/esm/http/index.d.mts +10 -6
  663. package/esm/http/index.mjs +8 -5
  664. package/esm/http/middleware/cache-response-middleware.d.mts +1 -1
  665. package/esm/http/middleware/cache-response-middleware.d.mts.map +1 -1
  666. package/esm/http/middleware/cache-response-middleware.mjs +1 -1
  667. package/esm/http/middleware/cache-response-middleware.mjs.map +1 -1
  668. package/esm/http/middleware/concurrency-limit.middleware.d.mts +1 -1
  669. package/esm/http/middleware/concurrency-limit.middleware.d.mts.map +1 -1
  670. package/esm/http/middleware/concurrency-limit.middleware.mjs +1 -1
  671. package/esm/http/middleware/concurrency-limit.middleware.mjs.map +1 -1
  672. package/esm/http/middleware/idempotency.middleware.d.mts +1 -1
  673. package/esm/http/middleware/idempotency.middleware.d.mts.map +1 -1
  674. package/esm/http/middleware/idempotency.middleware.mjs +1 -1
  675. package/esm/http/middleware/idempotency.middleware.mjs.map +1 -1
  676. package/esm/http/middleware/inject-request-context.d.mts +1 -1
  677. package/esm/http/middleware/inject-request-context.d.mts.map +1 -1
  678. package/esm/http/middleware/inject-request-context.mjs +4 -2
  679. package/esm/http/middleware/inject-request-context.mjs.map +1 -1
  680. package/esm/http/middleware/ip-filter.middleware.d.mts +1 -1
  681. package/esm/http/middleware/ip-filter.middleware.d.mts.map +1 -1
  682. package/esm/http/middleware/ip-filter.middleware.mjs +1 -1
  683. package/esm/http/middleware/ip-filter.middleware.mjs.map +1 -1
  684. package/esm/http/middleware/maintenance.middleware.d.mts +1 -1
  685. package/esm/http/middleware/maintenance.middleware.d.mts.map +1 -1
  686. package/esm/http/middleware/maintenance.middleware.mjs +1 -1
  687. package/esm/http/middleware/maintenance.middleware.mjs.map +1 -1
  688. package/esm/http/middleware/max-body-size.middleware.d.mts +1 -1
  689. package/esm/http/middleware/max-body-size.middleware.d.mts.map +1 -1
  690. package/esm/http/middleware/max-body-size.middleware.mjs +1 -1
  691. package/esm/http/middleware/max-body-size.middleware.mjs.map +1 -1
  692. package/esm/http/middleware/middleware-list.d.mts +1 -1
  693. package/esm/http/middleware/middleware-list.d.mts.map +1 -1
  694. package/esm/http/middleware/middleware-list.mjs +1 -1
  695. package/esm/http/middleware/middleware-list.mjs.map +1 -1
  696. package/esm/http/middleware/rate-limit.middleware.d.mts +20 -5
  697. package/esm/http/middleware/rate-limit.middleware.d.mts.map +1 -1
  698. package/esm/http/middleware/rate-limit.middleware.mjs +34 -12
  699. package/esm/http/middleware/rate-limit.middleware.mjs.map +1 -1
  700. package/esm/http/middleware/utils/cidr-match.d.mts +1 -1
  701. package/esm/http/middleware/utils/cidr-match.d.mts.map +1 -1
  702. package/esm/http/middleware/utils/cidr-match.mjs +1 -1
  703. package/esm/http/middleware/utils/cidr-match.mjs.map +1 -1
  704. package/esm/http/middleware/utils/idempotency-key.d.mts +1 -1
  705. package/esm/http/middleware/utils/idempotency-key.d.mts.map +1 -1
  706. package/esm/http/middleware/utils/idempotency-key.mjs +1 -1
  707. package/esm/http/middleware/utils/idempotency-key.mjs.map +1 -1
  708. package/esm/http/middleware/utils/parse-size.d.mts +1 -1
  709. package/esm/http/middleware/utils/parse-size.d.mts.map +1 -1
  710. package/esm/http/middleware/utils/parse-size.mjs +1 -1
  711. package/esm/http/middleware/utils/parse-size.mjs.map +1 -1
  712. package/esm/http/parse-urlencoded-body.mjs +1 -1
  713. package/esm/http/parse-urlencoded-body.mjs.map +1 -1
  714. package/esm/http/plugins.d.mts +9 -2
  715. package/esm/http/plugins.d.mts.map +1 -1
  716. package/esm/http/plugins.mjs +18 -4
  717. package/esm/http/plugins.mjs.map +1 -1
  718. package/esm/http/port-preflight.d.mts +1 -1
  719. package/esm/http/port-preflight.d.mts.map +1 -1
  720. package/esm/http/port-preflight.mjs +1 -1
  721. package/esm/http/port-preflight.mjs.map +1 -1
  722. package/esm/http/rate-limit-cache-store.mjs +155 -0
  723. package/esm/http/rate-limit-cache-store.mjs.map +1 -0
  724. package/esm/http/ready-report.d.mts +1 -1
  725. package/esm/http/ready-report.d.mts.map +1 -1
  726. package/esm/http/ready-report.mjs +1 -1
  727. package/esm/http/ready-report.mjs.map +1 -1
  728. package/esm/http/request-controller.d.mts +1 -1
  729. package/esm/http/request-controller.d.mts.map +1 -1
  730. package/esm/http/request-controller.mjs +1 -1
  731. package/esm/http/request-controller.mjs.map +1 -1
  732. package/esm/http/request-log-snapshot.d.mts +123 -0
  733. package/esm/http/request-log-snapshot.d.mts.map +1 -0
  734. package/esm/http/request-log-snapshot.mjs +141 -0
  735. package/esm/http/request-log-snapshot.mjs.map +1 -0
  736. package/esm/http/request.d.mts +41 -2
  737. package/esm/http/request.d.mts.map +1 -1
  738. package/esm/http/request.mjs +65 -2
  739. package/esm/http/request.mjs.map +1 -1
  740. package/esm/http/resolve-bind-port.mjs +1 -1
  741. package/esm/http/resolve-bind-port.mjs.map +1 -1
  742. package/esm/http/response.d.mts +40 -8
  743. package/esm/http/response.d.mts.map +1 -1
  744. package/esm/http/response.mjs +173 -61
  745. package/esm/http/response.mjs.map +1 -1
  746. package/esm/http/serialized.d.mts +1 -1
  747. package/esm/http/serialized.d.mts.map +1 -1
  748. package/esm/http/server-rebuilt.d.mts +1 -1
  749. package/esm/http/server-rebuilt.d.mts.map +1 -1
  750. package/esm/http/server-rebuilt.mjs +1 -1
  751. package/esm/http/server-rebuilt.mjs.map +1 -1
  752. package/esm/http/server.d.mts +34 -6
  753. package/esm/http/server.d.mts.map +1 -1
  754. package/esm/http/server.mjs +70 -5
  755. package/esm/http/server.mjs.map +1 -1
  756. package/esm/http/stream-react-response.d.mts +1 -1
  757. package/esm/http/stream-react-response.d.mts.map +1 -1
  758. package/esm/http/stream-react-response.mjs +1 -1
  759. package/esm/http/stream-react-response.mjs.map +1 -1
  760. package/esm/http/stream-transport.mjs +75 -0
  761. package/esm/http/stream-transport.mjs.map +1 -0
  762. package/esm/http/tracing/trace-id.d.mts +1 -1
  763. package/esm/http/tracing/trace-id.d.mts.map +1 -1
  764. package/esm/http/tracing/trace-id.mjs +1 -1
  765. package/esm/http/tracing/trace-id.mjs.map +1 -1
  766. package/esm/http/tracing/tracing-dispatcher.d.mts +1 -1
  767. package/esm/http/tracing/tracing-dispatcher.d.mts.map +1 -1
  768. package/esm/http/tracing/tracing-dispatcher.mjs +1 -1
  769. package/esm/http/tracing/tracing-dispatcher.mjs.map +1 -1
  770. package/esm/http/tracing/tracing.type.d.mts +1 -1
  771. package/esm/http/tracing/tracing.type.d.mts.map +1 -1
  772. package/esm/http/types.d.mts +131 -6
  773. package/esm/http/types.d.mts.map +1 -1
  774. package/esm/http/uploaded-file.d.mts +2 -2
  775. package/esm/http/uploaded-file.d.mts.map +1 -1
  776. package/esm/http/uploaded-file.mjs +2 -2
  777. package/esm/http/uploaded-file.mjs.map +1 -1
  778. package/esm/http/uploads/detect-image-format.mjs +1 -1
  779. package/esm/http/uploads/detect-image-format.mjs.map +1 -1
  780. package/esm/http/uploads/generate-image-variant.mjs +1 -1
  781. package/esm/http/uploads/generate-image-variant.mjs.map +1 -1
  782. package/esm/http/uploads/generate-image-variants.d.mts +1 -1
  783. package/esm/http/uploads/generate-image-variants.d.mts.map +1 -1
  784. package/esm/http/uploads/generate-image-variants.mjs +15 -7
  785. package/esm/http/uploads/generate-image-variants.mjs.map +1 -1
  786. package/esm/http/uploads/image-variant-cache.mjs +143 -0
  787. package/esm/http/uploads/image-variant-cache.mjs.map +1 -0
  788. package/esm/http/uploads/image-variant-types.d.mts +1 -1
  789. package/esm/http/uploads/image-variant-types.d.mts.map +1 -1
  790. package/esm/http/uploads/image-variants-config-error.d.mts +1 -1
  791. package/esm/http/uploads/image-variants-config-error.d.mts.map +1 -1
  792. package/esm/http/uploads/image-variants-config-error.mjs +1 -1
  793. package/esm/http/uploads/image-variants-config-error.mjs.map +1 -1
  794. package/esm/http/uploads/index.d.mts +3 -1
  795. package/esm/http/uploads/index.mjs +3 -1
  796. package/esm/http/uploads/is-path-inside.mjs +1 -1
  797. package/esm/http/uploads/is-path-inside.mjs.map +1 -1
  798. package/esm/http/uploads/load-variant-source.mjs +1 -1
  799. package/esm/http/uploads/load-variant-source.mjs.map +1 -1
  800. package/esm/http/uploads/local-disk-root.mjs +24 -0
  801. package/esm/http/uploads/local-disk-root.mjs.map +1 -0
  802. package/esm/http/uploads/matches-if-none-match.mjs +1 -1
  803. package/esm/http/uploads/matches-if-none-match.mjs.map +1 -1
  804. package/esm/http/uploads/parse-uploaded-file-query.mjs +1 -1
  805. package/esm/http/uploads/parse-uploaded-file-query.mjs.map +1 -1
  806. package/esm/http/uploads/purge-image-variants.d.mts +32 -0
  807. package/esm/http/uploads/purge-image-variants.d.mts.map +1 -0
  808. package/esm/http/uploads/purge-image-variants.mjs +46 -0
  809. package/esm/http/uploads/purge-image-variants.mjs.map +1 -0
  810. package/esm/http/uploads/read-file-head.mjs +1 -1
  811. package/esm/http/uploads/read-file-head.mjs.map +1 -1
  812. package/esm/http/uploads/resolve-image-variant.d.mts +73 -0
  813. package/esm/http/uploads/resolve-image-variant.d.mts.map +1 -0
  814. package/esm/http/uploads/resolve-image-variant.mjs +107 -0
  815. package/esm/http/uploads/resolve-image-variant.mjs.map +1 -0
  816. package/esm/http/uploads/resolve-image-variants-config.mjs +1 -1
  817. package/esm/http/uploads/resolve-image-variants-config.mjs.map +1 -1
  818. package/esm/http/uploads/resolve-inline-image-content-type.mjs +1 -1
  819. package/esm/http/uploads/resolve-inline-image-content-type.mjs.map +1 -1
  820. package/esm/http/uploads/resolve-original-content-type.mjs +1 -1
  821. package/esm/http/uploads/resolve-original-content-type.mjs.map +1 -1
  822. package/esm/http/uploads/resolve-upload-path.mjs +3 -2
  823. package/esm/http/uploads/resolve-upload-path.mjs.map +1 -1
  824. package/esm/http/uploads/resolve-variant-candidate.mjs +1 -1
  825. package/esm/http/uploads/resolve-variant-candidate.mjs.map +1 -1
  826. package/esm/http/uploads/single-flight.mjs +1 -1
  827. package/esm/http/uploads/single-flight.mjs.map +1 -1
  828. package/esm/http/uploads/uploaded-file.controller.d.mts +24 -6
  829. package/esm/http/uploads/uploaded-file.controller.d.mts.map +1 -1
  830. package/esm/http/uploads/uploaded-file.controller.mjs +63 -91
  831. package/esm/http/uploads/uploaded-file.controller.mjs.map +1 -1
  832. package/esm/http/uploads/variant-cache-key.mjs +30 -5
  833. package/esm/http/uploads/variant-cache-key.mjs.map +1 -1
  834. package/esm/http/uploads/variant-generations.mjs +1 -1
  835. package/esm/http/uploads/variant-generations.mjs.map +1 -1
  836. package/esm/http/uploads-config.d.mts +1 -1
  837. package/esm/http/uploads-config.d.mts.map +1 -1
  838. package/esm/http/uploads-config.mjs +1 -1
  839. package/esm/http/uploads-config.mjs.map +1 -1
  840. package/esm/http/uploads-types.d.mts +1 -1
  841. package/esm/http/uploads-types.d.mts.map +1 -1
  842. package/esm/http/xmlable.d.mts +1 -1
  843. package/esm/http/xmlable.d.mts.map +1 -1
  844. package/esm/image/image.d.mts +1 -1
  845. package/esm/image/image.d.mts.map +1 -1
  846. package/esm/image/image.mjs +1 -1
  847. package/esm/image/image.mjs.map +1 -1
  848. package/esm/index.d.mts +15 -9
  849. package/esm/index.mjs +11 -7
  850. package/esm/loader/app-module-importer.d.mts +1 -1
  851. package/esm/loader/app-module-importer.d.mts.map +1 -1
  852. package/esm/loader/app-module-importer.mjs +1 -1
  853. package/esm/loader/app-module-importer.mjs.map +1 -1
  854. package/esm/localization/parse-locale-dictionary.d.mts +7 -2
  855. package/esm/localization/parse-locale-dictionary.d.mts.map +1 -1
  856. package/esm/localization/parse-locale-dictionary.mjs +6 -2
  857. package/esm/localization/parse-locale-dictionary.mjs.map +1 -1
  858. package/esm/localization/register-locale-dictionary.d.mts +1 -1
  859. package/esm/localization/register-locale-dictionary.d.mts.map +1 -1
  860. package/esm/localization/register-locale-dictionary.mjs +1 -1
  861. package/esm/localization/register-locale-dictionary.mjs.map +1 -1
  862. package/esm/logger/fatal-visibility.d.mts +1 -1
  863. package/esm/logger/fatal-visibility.d.mts.map +1 -1
  864. package/esm/logger/fatal-visibility.mjs +1 -1
  865. package/esm/logger/fatal-visibility.mjs.map +1 -1
  866. package/esm/logger/logger.d.mts +1 -1
  867. package/esm/logger/logger.d.mts.map +1 -1
  868. package/esm/logger/logger.mjs +1 -1
  869. package/esm/logger/logger.mjs.map +1 -1
  870. package/esm/logger/types.d.mts +1 -1
  871. package/esm/logger/types.d.mts.map +1 -1
  872. package/esm/mail/config.d.mts +1 -1
  873. package/esm/mail/config.d.mts.map +1 -1
  874. package/esm/mail/config.mjs +1 -1
  875. package/esm/mail/config.mjs.map +1 -1
  876. package/esm/mail/events.d.mts +1 -1
  877. package/esm/mail/events.d.mts.map +1 -1
  878. package/esm/mail/events.mjs +1 -1
  879. package/esm/mail/events.mjs.map +1 -1
  880. package/esm/mail/mail.d.mts +1 -1
  881. package/esm/mail/mail.d.mts.map +1 -1
  882. package/esm/mail/mail.mjs +1 -1
  883. package/esm/mail/mail.mjs.map +1 -1
  884. package/esm/mail/mailer-pool.d.mts +1 -1
  885. package/esm/mail/mailer-pool.d.mts.map +1 -1
  886. package/esm/mail/mailer-pool.mjs +1 -1
  887. package/esm/mail/mailer-pool.mjs.map +1 -1
  888. package/esm/mail/react-mail.d.mts +1 -1
  889. package/esm/mail/react-mail.d.mts.map +1 -1
  890. package/esm/mail/react-mail.mjs +1 -1
  891. package/esm/mail/react-mail.mjs.map +1 -1
  892. package/esm/mail/send-mail.d.mts +1 -1
  893. package/esm/mail/send-mail.d.mts.map +1 -1
  894. package/esm/mail/send-mail.mjs +7 -7
  895. package/esm/mail/send-mail.mjs.map +1 -1
  896. package/esm/mail/test-mailbox.d.mts +1 -1
  897. package/esm/mail/test-mailbox.d.mts.map +1 -1
  898. package/esm/mail/test-mailbox.mjs +1 -1
  899. package/esm/mail/test-mailbox.mjs.map +1 -1
  900. package/esm/mail/types.d.mts +1 -1
  901. package/esm/mail/types.d.mts.map +1 -1
  902. package/esm/mail/types.mjs +1 -1
  903. package/esm/mail/types.mjs.map +1 -1
  904. package/esm/manifest/manifest-manager.mjs +1 -1
  905. package/esm/manifest/manifest-manager.mjs.map +1 -1
  906. package/esm/openapi/build-openapi-document.d.mts +1 -1
  907. package/esm/openapi/build-openapi-document.d.mts.map +1 -1
  908. package/esm/openapi/build-openapi-document.mjs +1 -1
  909. package/esm/openapi/build-openapi-document.mjs.map +1 -1
  910. package/esm/openapi/cast-schema.mjs +1 -1
  911. package/esm/openapi/cast-schema.mjs.map +1 -1
  912. package/esm/openapi/collect-openapi-document.mjs +1 -1
  913. package/esm/openapi/collect-openapi-document.mjs.map +1 -1
  914. package/esm/openapi/development-openapi-provider.d.mts +1 -1
  915. package/esm/openapi/development-openapi-provider.d.mts.map +1 -1
  916. package/esm/openapi/development-openapi-provider.mjs +1 -1
  917. package/esm/openapi/development-openapi-provider.mjs.map +1 -1
  918. package/esm/openapi/error-responses.mjs +1 -1
  919. package/esm/openapi/error-responses.mjs.map +1 -1
  920. package/esm/openapi/openapi-child-output.mjs +1 -1
  921. package/esm/openapi/openapi-child-output.mjs.map +1 -1
  922. package/esm/openapi/openapi-protocol.mjs +1 -1
  923. package/esm/openapi/openapi-protocol.mjs.map +1 -1
  924. package/esm/openapi/paths.mjs +1 -1
  925. package/esm/openapi/paths.mjs.map +1 -1
  926. package/esm/openapi/postman/build-request-body.mjs +1 -1
  927. package/esm/openapi/postman/build-request-body.mjs.map +1 -1
  928. package/esm/openapi/postman/build-request-url.mjs +1 -1
  929. package/esm/openapi/postman/build-request-url.mjs.map +1 -1
  930. package/esm/openapi/postman/build-saved-responses.mjs +1 -1
  931. package/esm/openapi/postman/build-saved-responses.mjs.map +1 -1
  932. package/esm/openapi/postman/example-from-schema.d.mts +1 -1
  933. package/esm/openapi/postman/example-from-schema.d.mts.map +1 -1
  934. package/esm/openapi/postman/example-from-schema.mjs +1 -1
  935. package/esm/openapi/postman/example-from-schema.mjs.map +1 -1
  936. package/esm/openapi/postman/http-status-text.mjs +1 -1
  937. package/esm/openapi/postman/http-status-text.mjs.map +1 -1
  938. package/esm/openapi/postman/openapi-to-postman-collection.d.mts +1 -1
  939. package/esm/openapi/postman/openapi-to-postman-collection.d.mts.map +1 -1
  940. package/esm/openapi/postman/openapi-to-postman-collection.mjs +1 -1
  941. package/esm/openapi/postman/openapi-to-postman-collection.mjs.map +1 -1
  942. package/esm/openapi/postman/postman-types.d.mts +1 -1
  943. package/esm/openapi/postman/postman-types.d.mts.map +1 -1
  944. package/esm/openapi/postman/resolve-operation-auth.mjs +1 -1
  945. package/esm/openapi/postman/resolve-operation-auth.mjs.map +1 -1
  946. package/esm/openapi/postman/schema-refs.d.mts +1 -1
  947. package/esm/openapi/postman/schema-refs.d.mts.map +1 -1
  948. package/esm/openapi/postman/schema-refs.mjs +1 -1
  949. package/esm/openapi/postman/schema-refs.mjs.map +1 -1
  950. package/esm/openapi/postman/uuid-v5.mjs +1 -1
  951. package/esm/openapi/postman/uuid-v5.mjs.map +1 -1
  952. package/esm/openapi/request-schemas.mjs +1 -1
  953. package/esm/openapi/request-schemas.mjs.map +1 -1
  954. package/esm/openapi/response-schemas.mjs +5 -2
  955. package/esm/openapi/response-schemas.mjs.map +1 -1
  956. package/esm/openapi/schema-registry.mjs +7 -1
  957. package/esm/openapi/schema-registry.mjs.map +1 -1
  958. package/esm/openapi/security.mjs +1 -1
  959. package/esm/openapi/security.mjs.map +1 -1
  960. package/esm/openapi/types.d.mts +1 -1
  961. package/esm/openapi/types.d.mts.map +1 -1
  962. package/esm/production/assert-dist-ready-to-start.mjs +1 -1
  963. package/esm/production/assert-dist-ready-to-start.mjs.map +1 -1
  964. package/esm/production/assert-generated-imports.mjs +1 -1
  965. package/esm/production/assert-generated-imports.mjs.map +1 -1
  966. package/esm/production/build-app-production.mjs +1 -1
  967. package/esm/production/build-app-production.mjs.map +1 -1
  968. package/esm/production/build-contributions.mjs +1 -1
  969. package/esm/production/build-contributions.mjs.map +1 -1
  970. package/esm/production/bundle-framework-dependencies.mjs +1 -1
  971. package/esm/production/bundle-framework-dependencies.mjs.map +1 -1
  972. package/esm/production/dist-build-manifest.mjs +1 -1
  973. package/esm/production/dist-build-manifest.mjs.map +1 -1
  974. package/esm/production/esbuild-plugins.mjs +1 -1
  975. package/esm/production/esbuild-plugins.mjs.map +1 -1
  976. package/esm/production/esbuild-preflight.mjs +1 -1
  977. package/esm/production/esbuild-preflight.mjs.map +1 -1
  978. package/esm/production/production-builder.mjs +1 -1
  979. package/esm/production/production-builder.mjs.map +1 -1
  980. package/esm/production/production-supervisor.mjs +1 -1
  981. package/esm/production/production-supervisor.mjs.map +1 -1
  982. package/esm/production/promote-dist.mjs +1 -1
  983. package/esm/production/promote-dist.mjs.map +1 -1
  984. package/esm/production/registration-child-runner.mjs +1 -1
  985. package/esm/production/registration-child-runner.mjs.map +1 -1
  986. package/esm/production/resolve-build-config.d.mts +1 -1
  987. package/esm/production/resolve-build-config.d.mts.map +1 -1
  988. package/esm/production/resolve-build-config.mjs +1 -1
  989. package/esm/production/resolve-build-config.mjs.map +1 -1
  990. package/esm/production/route-registration-child.mjs +1 -1
  991. package/esm/production/route-registration-child.mjs.map +1 -1
  992. package/esm/production/route-registration-snapshot.mjs +1 -1
  993. package/esm/production/route-registration-snapshot.mjs.map +1 -1
  994. package/esm/production/tsconfig-path-aliases.mjs +1 -1
  995. package/esm/production/tsconfig-path-aliases.mjs.map +1 -1
  996. package/esm/react/index.d.mts +1 -1
  997. package/esm/react/index.d.mts.map +1 -1
  998. package/esm/react/index.mjs +1 -1
  999. package/esm/react/index.mjs.map +1 -1
  1000. package/esm/repositories/adapters/cascade/cascade-adapter.d.mts +1 -1
  1001. package/esm/repositories/adapters/cascade/cascade-adapter.d.mts.map +1 -1
  1002. package/esm/repositories/adapters/cascade/cascade-adapter.mjs +1 -1
  1003. package/esm/repositories/adapters/cascade/cascade-adapter.mjs.map +1 -1
  1004. package/esm/repositories/adapters/cascade/cascade-query-builder.d.mts +1 -1
  1005. package/esm/repositories/adapters/cascade/cascade-query-builder.d.mts.map +1 -1
  1006. package/esm/repositories/adapters/cascade/cascade-query-builder.mjs +1 -1
  1007. package/esm/repositories/adapters/cascade/cascade-query-builder.mjs.map +1 -1
  1008. package/esm/repositories/adapters/cascade/filter-applicator.mjs +1 -1
  1009. package/esm/repositories/adapters/cascade/filter-applicator.mjs.map +1 -1
  1010. package/esm/repositories/contracts/query-builder.contract.d.mts +1 -1
  1011. package/esm/repositories/contracts/query-builder.contract.d.mts.map +1 -1
  1012. package/esm/repositories/contracts/repository-adapter.contract.d.mts +1 -1
  1013. package/esm/repositories/contracts/repository-adapter.contract.d.mts.map +1 -1
  1014. package/esm/repositories/contracts/types.d.mts +1 -1
  1015. package/esm/repositories/contracts/types.d.mts.map +1 -1
  1016. package/esm/repositories/repository.manager.d.mts +1 -1
  1017. package/esm/repositories/repository.manager.d.mts.map +1 -1
  1018. package/esm/repositories/repository.manager.mjs +1 -1
  1019. package/esm/repositories/repository.manager.mjs.map +1 -1
  1020. package/esm/resource/define-resource.d.mts +1 -1
  1021. package/esm/resource/define-resource.d.mts.map +1 -1
  1022. package/esm/resource/define-resource.mjs +1 -1
  1023. package/esm/resource/define-resource.mjs.map +1 -1
  1024. package/esm/resource/index.d.mts +1 -0
  1025. package/esm/resource/index.mjs +1 -0
  1026. package/esm/resource/nullable-resource.d.mts +44 -0
  1027. package/esm/resource/nullable-resource.d.mts.map +1 -0
  1028. package/esm/resource/nullable-resource.mjs +38 -0
  1029. package/esm/resource/nullable-resource.mjs.map +1 -0
  1030. package/esm/resource/register-resource.d.mts +1 -1
  1031. package/esm/resource/register-resource.d.mts.map +1 -1
  1032. package/esm/resource/register-resource.mjs +1 -1
  1033. package/esm/resource/register-resource.mjs.map +1 -1
  1034. package/esm/resource/resource-field-builder.d.mts +1 -1
  1035. package/esm/resource/resource-field-builder.d.mts.map +1 -1
  1036. package/esm/resource/resource-field-builder.mjs +1 -1
  1037. package/esm/resource/resource-field-builder.mjs.map +1 -1
  1038. package/esm/resource/resource.d.mts +1 -1
  1039. package/esm/resource/resource.d.mts.map +1 -1
  1040. package/esm/resource/resource.mjs +23 -4
  1041. package/esm/resource/resource.mjs.map +1 -1
  1042. package/esm/resource/types.d.mts +11 -6
  1043. package/esm/resource/types.d.mts.map +1 -1
  1044. package/esm/restful/restful.d.mts +1 -1
  1045. package/esm/restful/restful.d.mts.map +1 -1
  1046. package/esm/restful/restful.mjs +1 -1
  1047. package/esm/restful/restful.mjs.map +1 -1
  1048. package/esm/router/build-route-rate-limit.mjs +1 -1
  1049. package/esm/router/build-route-rate-limit.mjs.map +1 -1
  1050. package/esm/router/describe-route-for-log.mjs +1 -1
  1051. package/esm/router/describe-route-for-log.mjs.map +1 -1
  1052. package/esm/router/dev-dispatch.mjs +1 -1
  1053. package/esm/router/dev-dispatch.mjs.map +1 -1
  1054. package/esm/router/log-request-lifecycle.mjs +1 -1
  1055. package/esm/router/log-request-lifecycle.mjs.map +1 -1
  1056. package/esm/router/named-api-routes-with-responses.mjs +1 -1
  1057. package/esm/router/named-api-routes-with-responses.mjs.map +1 -1
  1058. package/esm/router/normalize-request-path.d.mts +1 -1
  1059. package/esm/router/normalize-request-path.d.mts.map +1 -1
  1060. package/esm/router/normalize-request-path.mjs +1 -1
  1061. package/esm/router/normalize-request-path.mjs.map +1 -1
  1062. package/esm/router/normalize-route-path.d.mts +1 -1
  1063. package/esm/router/normalize-route-path.d.mts.map +1 -1
  1064. package/esm/router/normalize-route-path.mjs +1 -1
  1065. package/esm/router/normalize-route-path.mjs.map +1 -1
  1066. package/esm/router/positional-handler-diagnostics.d.mts +1 -1
  1067. package/esm/router/positional-handler-diagnostics.d.mts.map +1 -1
  1068. package/esm/router/positional-handler-diagnostics.mjs +1 -1
  1069. package/esm/router/positional-handler-diagnostics.mjs.map +1 -1
  1070. package/esm/router/response-schema-types.mjs +3 -1
  1071. package/esm/router/response-schema-types.mjs.map +1 -1
  1072. package/esm/router/route-builder.d.mts +1 -1
  1073. package/esm/router/route-builder.d.mts.map +1 -1
  1074. package/esm/router/route-builder.mjs +1 -1
  1075. package/esm/router/route-builder.mjs.map +1 -1
  1076. package/esm/router/route-name-method-suffix.d.mts +1 -1
  1077. package/esm/router/route-name-method-suffix.d.mts.map +1 -1
  1078. package/esm/router/route-name-method-suffix.mjs +1 -1
  1079. package/esm/router/route-name-method-suffix.mjs.map +1 -1
  1080. package/esm/router/route-registry.d.mts +1 -1
  1081. package/esm/router/route-registry.d.mts.map +1 -1
  1082. package/esm/router/route-registry.mjs +1 -1
  1083. package/esm/router/route-registry.mjs.map +1 -1
  1084. package/esm/router/router.d.mts +8 -1
  1085. package/esm/router/router.d.mts.map +1 -1
  1086. package/esm/router/router.mjs +20 -15
  1087. package/esm/router/router.mjs.map +1 -1
  1088. package/esm/router/types.d.mts +13 -1
  1089. package/esm/router/types.d.mts.map +1 -1
  1090. package/esm/socket/types.d.mts +1 -1
  1091. package/esm/socket/types.d.mts.map +1 -1
  1092. package/esm/socket/utils.d.mts +1 -1
  1093. package/esm/socket/utils.d.mts.map +1 -1
  1094. package/esm/socket/utils.mjs +1 -1
  1095. package/esm/socket/utils.mjs.map +1 -1
  1096. package/esm/storage/config.d.mts +1 -1
  1097. package/esm/storage/config.d.mts.map +1 -1
  1098. package/esm/storage/config.mjs +1 -1
  1099. package/esm/storage/config.mjs.map +1 -1
  1100. package/esm/storage/context/storage-driver-context.d.mts +1 -1
  1101. package/esm/storage/context/storage-driver-context.d.mts.map +1 -1
  1102. package/esm/storage/context/storage-driver-context.mjs +1 -1
  1103. package/esm/storage/context/storage-driver-context.mjs.map +1 -1
  1104. package/esm/storage/drivers/cloud-driver.d.mts +1 -1
  1105. package/esm/storage/drivers/cloud-driver.d.mts.map +1 -1
  1106. package/esm/storage/drivers/cloud-driver.mjs +1 -1
  1107. package/esm/storage/drivers/cloud-driver.mjs.map +1 -1
  1108. package/esm/storage/drivers/do-spaces-driver.d.mts +1 -1
  1109. package/esm/storage/drivers/do-spaces-driver.d.mts.map +1 -1
  1110. package/esm/storage/drivers/do-spaces-driver.mjs +1 -1
  1111. package/esm/storage/drivers/do-spaces-driver.mjs.map +1 -1
  1112. package/esm/storage/drivers/local-driver.d.mts +12 -1
  1113. package/esm/storage/drivers/local-driver.d.mts.map +1 -1
  1114. package/esm/storage/drivers/local-driver.mjs +33 -1
  1115. package/esm/storage/drivers/local-driver.mjs.map +1 -1
  1116. package/esm/storage/drivers/r2-driver.d.mts +1 -1
  1117. package/esm/storage/drivers/r2-driver.d.mts.map +1 -1
  1118. package/esm/storage/drivers/r2-driver.mjs +1 -1
  1119. package/esm/storage/drivers/r2-driver.mjs.map +1 -1
  1120. package/esm/storage/drivers/s3-driver.d.mts +1 -1
  1121. package/esm/storage/drivers/s3-driver.d.mts.map +1 -1
  1122. package/esm/storage/drivers/s3-driver.mjs +1 -1
  1123. package/esm/storage/drivers/s3-driver.mjs.map +1 -1
  1124. package/esm/storage/index.d.mts +1 -1
  1125. package/esm/storage/scoped-storage.d.mts +1 -1
  1126. package/esm/storage/scoped-storage.d.mts.map +1 -1
  1127. package/esm/storage/scoped-storage.mjs +1 -1
  1128. package/esm/storage/scoped-storage.mjs.map +1 -1
  1129. package/esm/storage/storage-file.d.mts +1 -1
  1130. package/esm/storage/storage-file.d.mts.map +1 -1
  1131. package/esm/storage/storage-file.mjs +1 -1
  1132. package/esm/storage/storage-file.mjs.map +1 -1
  1133. package/esm/storage/storage.d.mts +3 -3
  1134. package/esm/storage/storage.d.mts.map +1 -1
  1135. package/esm/storage/storage.mjs +1 -1
  1136. package/esm/storage/storage.mjs.map +1 -1
  1137. package/esm/storage/types.d.mts +3 -2
  1138. package/esm/storage/types.d.mts.map +1 -1
  1139. package/esm/storage/utils/classify-ip-address.d.mts +1 -1
  1140. package/esm/storage/utils/classify-ip-address.d.mts.map +1 -1
  1141. package/esm/storage/utils/classify-ip-address.mjs +1 -1
  1142. package/esm/storage/utils/classify-ip-address.mjs.map +1 -1
  1143. package/esm/storage/utils/contain-path.d.mts +1 -1
  1144. package/esm/storage/utils/contain-path.d.mts.map +1 -1
  1145. package/esm/storage/utils/contain-path.mjs +1 -1
  1146. package/esm/storage/utils/contain-path.mjs.map +1 -1
  1147. package/esm/storage/utils/mime.d.mts +1 -1
  1148. package/esm/storage/utils/mime.d.mts.map +1 -1
  1149. package/esm/storage/utils/mime.mjs +1 -1
  1150. package/esm/storage/utils/mime.mjs.map +1 -1
  1151. package/esm/storage/utils/safe-fetch.d.mts +1 -1
  1152. package/esm/storage/utils/safe-fetch.d.mts.map +1 -1
  1153. package/esm/storage/utils/safe-fetch.mjs +1 -1
  1154. package/esm/storage/utils/safe-fetch.mjs.map +1 -1
  1155. package/esm/storage/utils/storage-capability-error.d.mts +1 -1
  1156. package/esm/storage/utils/storage-capability-error.d.mts.map +1 -1
  1157. package/esm/storage/utils/storage-capability-error.mjs +1 -1
  1158. package/esm/storage/utils/storage-capability-error.mjs.map +1 -1
  1159. package/esm/storage/utils/storage-error.d.mts +1 -1
  1160. package/esm/storage/utils/storage-error.d.mts.map +1 -1
  1161. package/esm/storage/utils/storage-error.mjs +1 -1
  1162. package/esm/storage/utils/storage-error.mjs.map +1 -1
  1163. package/esm/storage/utils/storage-not-initialized-error.d.mts +1 -1
  1164. package/esm/storage/utils/storage-not-initialized-error.d.mts.map +1 -1
  1165. package/esm/storage/utils/storage-not-initialized-error.mjs +1 -1
  1166. package/esm/storage/utils/storage-not-initialized-error.mjs.map +1 -1
  1167. package/esm/tests/start-http-development-server.d.mts +1 -1
  1168. package/esm/tests/start-http-development-server.d.mts.map +1 -1
  1169. package/esm/tests/start-http-development-server.mjs +1 -1
  1170. package/esm/tests/start-http-development-server.mjs.map +1 -1
  1171. package/esm/tests/test-connectors-selection.d.mts +1 -1
  1172. package/esm/tests/test-connectors-selection.d.mts.map +1 -1
  1173. package/esm/tests/test-connectors-selection.mjs +1 -1
  1174. package/esm/tests/test-connectors-selection.mjs.map +1 -1
  1175. package/esm/tests/test-helpers.d.mts +1 -1
  1176. package/esm/tests/test-helpers.d.mts.map +1 -1
  1177. package/esm/tests/test-helpers.mjs +1 -1
  1178. package/esm/tests/test-helpers.mjs.map +1 -1
  1179. package/esm/tests/test-lifecycle-state.mjs +1 -1
  1180. package/esm/tests/test-lifecycle-state.mjs.map +1 -1
  1181. package/esm/tests/test-server-port-channel.mjs +1 -1
  1182. package/esm/tests/test-server-port-channel.mjs.map +1 -1
  1183. package/esm/tests/test-setup-timeout.mjs +1 -1
  1184. package/esm/tests/test-setup-timeout.mjs.map +1 -1
  1185. package/esm/tests/vitest-setup.d.mts +1 -1
  1186. package/esm/tests/vitest-setup.d.mts.map +1 -1
  1187. package/esm/tests/vitest-setup.mjs +1 -1
  1188. package/esm/tests/vitest-setup.mjs.map +1 -1
  1189. package/esm/updater/package-manager.mjs +1 -1
  1190. package/esm/updater/package-manager.mjs.map +1 -1
  1191. package/esm/updater/update-warlock-packages.mjs +1 -1
  1192. package/esm/updater/update-warlock-packages.mjs.map +1 -1
  1193. package/esm/use-cases/types.d.mts +1 -1
  1194. package/esm/use-cases/types.d.mts.map +1 -1
  1195. package/esm/use-cases/use-case-broadcast.d.mts +1 -1
  1196. package/esm/use-cases/use-case-broadcast.d.mts.map +1 -1
  1197. package/esm/use-cases/use-case-broadcast.mjs +1 -1
  1198. package/esm/use-cases/use-case-broadcast.mjs.map +1 -1
  1199. package/esm/use-cases/use-case-events.d.mts +1 -1
  1200. package/esm/use-cases/use-case-events.d.mts.map +1 -1
  1201. package/esm/use-cases/use-case-events.mjs +1 -1
  1202. package/esm/use-cases/use-case-events.mjs.map +1 -1
  1203. package/esm/use-cases/use-case-pipeline.d.mts +1 -1
  1204. package/esm/use-cases/use-case-pipeline.d.mts.map +1 -1
  1205. package/esm/use-cases/use-case-pipeline.mjs +1 -1
  1206. package/esm/use-cases/use-case-pipeline.mjs.map +1 -1
  1207. package/esm/use-cases/use-case.d.mts +1 -1
  1208. package/esm/use-cases/use-case.d.mts.map +1 -1
  1209. package/esm/use-cases/use-case.errors.d.mts +1 -1
  1210. package/esm/use-cases/use-case.errors.d.mts.map +1 -1
  1211. package/esm/use-cases/use-case.errors.mjs +1 -1
  1212. package/esm/use-cases/use-case.errors.mjs.map +1 -1
  1213. package/esm/use-cases/use-case.mjs +1 -1
  1214. package/esm/use-cases/use-case.mjs.map +1 -1
  1215. package/esm/use-cases/use-cases-registry.d.mts +1 -1
  1216. package/esm/use-cases/use-cases-registry.d.mts.map +1 -1
  1217. package/esm/use-cases/use-cases-registry.mjs +1 -1
  1218. package/esm/use-cases/use-cases-registry.mjs.map +1 -1
  1219. package/esm/utils/app-log.d.mts +6 -6
  1220. package/esm/utils/app-log.d.mts.map +1 -1
  1221. package/esm/utils/app-log.mjs +1 -1
  1222. package/esm/utils/app-log.mjs.map +1 -1
  1223. package/esm/utils/database-log.d.mts +1 -1
  1224. package/esm/utils/database-log.d.mts.map +1 -1
  1225. package/esm/utils/database-log.mjs +1 -1
  1226. package/esm/utils/database-log.mjs.map +1 -1
  1227. package/esm/utils/detect-environment-overrides.mjs +1 -1
  1228. package/esm/utils/detect-environment-overrides.mjs.map +1 -1
  1229. package/esm/utils/environment.d.mts +1 -1
  1230. package/esm/utils/environment.d.mts.map +1 -1
  1231. package/esm/utils/environment.mjs +1 -1
  1232. package/esm/utils/environment.mjs.map +1 -1
  1233. package/esm/utils/framework-vesion.mjs +1 -1
  1234. package/esm/utils/framework-vesion.mjs.map +1 -1
  1235. package/esm/utils/get-localized.d.mts +1 -1
  1236. package/esm/utils/get-localized.d.mts.map +1 -1
  1237. package/esm/utils/get-localized.mjs +1 -1
  1238. package/esm/utils/get-localized.mjs.map +1 -1
  1239. package/esm/utils/is-test-file.mjs +1 -1
  1240. package/esm/utils/is-test-file.mjs.map +1 -1
  1241. package/esm/utils/load-environment.mjs +1 -1
  1242. package/esm/utils/load-environment.mjs.map +1 -1
  1243. package/esm/utils/normalized-path.d.mts +1 -1
  1244. package/esm/utils/normalized-path.d.mts.map +1 -1
  1245. package/esm/utils/normalized-path.mjs +1 -1
  1246. package/esm/utils/normalized-path.mjs.map +1 -1
  1247. package/esm/utils/npm-registry.d.mts +1 -1
  1248. package/esm/utils/npm-registry.d.mts.map +1 -1
  1249. package/esm/utils/npm-registry.mjs +1 -1
  1250. package/esm/utils/npm-registry.mjs.map +1 -1
  1251. package/esm/utils/paths.d.mts +1 -1
  1252. package/esm/utils/paths.d.mts.map +1 -1
  1253. package/esm/utils/paths.mjs +1 -1
  1254. package/esm/utils/paths.mjs.map +1 -1
  1255. package/esm/utils/promise-all-object.d.mts +1 -1
  1256. package/esm/utils/promise-all-object.d.mts.map +1 -1
  1257. package/esm/utils/promise-all-object.mjs +1 -1
  1258. package/esm/utils/promise-all-object.mjs.map +1 -1
  1259. package/esm/utils/queue.d.mts +1 -1
  1260. package/esm/utils/queue.d.mts.map +1 -1
  1261. package/esm/utils/queue.mjs +1 -1
  1262. package/esm/utils/queue.mjs.map +1 -1
  1263. package/esm/utils/recorded-environment-overrides.mjs +1 -1
  1264. package/esm/utils/recorded-environment-overrides.mjs.map +1 -1
  1265. package/esm/utils/report-environment-overrides.mjs +1 -1
  1266. package/esm/utils/report-environment-overrides.mjs.map +1 -1
  1267. package/esm/utils/sleep.d.mts +1 -1
  1268. package/esm/utils/sleep.d.mts.map +1 -1
  1269. package/esm/utils/sleep.mjs +1 -1
  1270. package/esm/utils/sleep.mjs.map +1 -1
  1271. package/esm/utils/sluggable.d.mts +1 -1
  1272. package/esm/utils/sluggable.d.mts.map +1 -1
  1273. package/esm/utils/sluggable.mjs +1 -1
  1274. package/esm/utils/sluggable.mjs.map +1 -1
  1275. package/esm/utils/to-json.d.mts +1 -1
  1276. package/esm/utils/to-json.d.mts.map +1 -1
  1277. package/esm/utils/to-json.mjs +1 -1
  1278. package/esm/utils/to-json.mjs.map +1 -1
  1279. package/esm/utils/types.d.mts +1 -1
  1280. package/esm/utils/types.d.mts.map +1 -1
  1281. package/esm/utils/urls.d.mts +1 -1
  1282. package/esm/utils/urls.d.mts.map +1 -1
  1283. package/esm/utils/urls.mjs +1 -1
  1284. package/esm/utils/urls.mjs.map +1 -1
  1285. package/esm/utils/version-compare.d.mts +1 -1
  1286. package/esm/utils/version-compare.d.mts.map +1 -1
  1287. package/esm/utils/version-compare.mjs +1 -1
  1288. package/esm/utils/version-compare.mjs.map +1 -1
  1289. package/esm/validation/database/exists-except-current-id.d.mts +1 -1
  1290. package/esm/validation/database/exists-except-current-id.d.mts.map +1 -1
  1291. package/esm/validation/database/exists-except-current-id.mjs +1 -1
  1292. package/esm/validation/database/exists-except-current-id.mjs.map +1 -1
  1293. package/esm/validation/database/exists-except-current-user.d.mts +1 -1
  1294. package/esm/validation/database/exists-except-current-user.d.mts.map +1 -1
  1295. package/esm/validation/database/exists-except-current-user.mjs +1 -1
  1296. package/esm/validation/database/exists-except-current-user.mjs.map +1 -1
  1297. package/esm/validation/database/types.d.mts +1 -1
  1298. package/esm/validation/database/types.d.mts.map +1 -1
  1299. package/esm/validation/database/unique-except-current-id.d.mts +1 -1
  1300. package/esm/validation/database/unique-except-current-id.d.mts.map +1 -1
  1301. package/esm/validation/database/unique-except-current-id.mjs +1 -1
  1302. package/esm/validation/database/unique-except-current-id.mjs.map +1 -1
  1303. package/esm/validation/database/unique-except-current-user.d.mts +1 -1
  1304. package/esm/validation/database/unique-except-current-user.d.mts.map +1 -1
  1305. package/esm/validation/database/unique-except-current-user.mjs +1 -1
  1306. package/esm/validation/database/unique-except-current-user.mjs.map +1 -1
  1307. package/esm/validation/file/file.d.mts +1 -1
  1308. package/esm/validation/file/file.d.mts.map +1 -1
  1309. package/esm/validation/file/file.mjs +1 -1
  1310. package/esm/validation/file/file.mjs.map +1 -1
  1311. package/esm/validation/init.mjs +1 -1
  1312. package/esm/validation/init.mjs.map +1 -1
  1313. package/esm/validation/plugins/database-plugin.mjs +1 -1
  1314. package/esm/validation/plugins/database-plugin.mjs.map +1 -1
  1315. package/esm/validation/plugins/file-plugin.mjs +1 -1
  1316. package/esm/validation/plugins/file-plugin.mjs.map +1 -1
  1317. package/esm/validation/plugins/localized-plugin.mjs +1 -1
  1318. package/esm/validation/plugins/localized-plugin.mjs.map +1 -1
  1319. package/esm/validation/types.d.mts +1 -1
  1320. package/esm/validation/types.d.mts.map +1 -1
  1321. package/esm/validation/validateAll.mjs +1 -1
  1322. package/esm/validation/validateAll.mjs.map +1 -1
  1323. package/esm/validation/validators/file-validator.d.mts +44 -41
  1324. package/esm/validation/validators/file-validator.d.mts.map +1 -1
  1325. package/esm/validation/validators/file-validator.mjs +4 -1
  1326. package/esm/validation/validators/file-validator.mjs.map +1 -1
  1327. package/esm/vite/lower-stage3-decorators.d.mts +1 -1
  1328. package/esm/vite/lower-stage3-decorators.d.mts.map +1 -1
  1329. package/esm/vite/lower-stage3-decorators.mjs +1 -1
  1330. package/esm/vite/lower-stage3-decorators.mjs.map +1 -1
  1331. package/esm/warlock-config/bundle-config.mjs +148 -0
  1332. package/esm/warlock-config/bundle-config.mjs.map +1 -0
  1333. package/esm/warlock-config/default-configurations.mjs +1 -1
  1334. package/esm/warlock-config/default-configurations.mjs.map +1 -1
  1335. package/esm/warlock-config/define-config.d.mts +1 -1
  1336. package/esm/warlock-config/define-config.d.mts.map +1 -1
  1337. package/esm/warlock-config/define-config.mjs +1 -1
  1338. package/esm/warlock-config/define-config.mjs.map +1 -1
  1339. package/esm/warlock-config/index.d.mts +1 -1
  1340. package/esm/warlock-config/index.mjs +1 -1
  1341. package/esm/warlock-config/normalize-build-config.mjs +1 -1
  1342. package/esm/warlock-config/normalize-build-config.mjs.map +1 -1
  1343. package/esm/warlock-config/types.d.mts +1 -1
  1344. package/esm/warlock-config/types.d.mts.map +1 -1
  1345. package/esm/warlock-config/warlock-config.manager.d.mts +32 -7
  1346. package/esm/warlock-config/warlock-config.manager.d.mts.map +1 -1
  1347. package/esm/warlock-config/warlock-config.manager.mjs +94 -18
  1348. package/esm/warlock-config/warlock-config.manager.mjs.map +1 -1
  1349. package/esm/warlock-config/warn-deprecated-config.mjs +1 -1
  1350. package/esm/warlock-config/warn-deprecated-config.mjs.map +1 -1
  1351. package/llms-full.txt +306 -249
  1352. package/llms.txt +42 -42
  1353. package/package.json +20 -13
  1354. package/skills/README.md +39 -39
  1355. package/skills/add-connector/SKILL.md +4 -4
  1356. package/skills/benchmark-code/SKILL.md +3 -3
  1357. package/skills/build-restful/SKILL.md +5 -5
  1358. package/skills/build-url/SKILL.md +7 -7
  1359. package/skills/configure-app/SKILL.md +30 -8
  1360. package/skills/create-controller/SKILL.md +12 -8
  1361. package/skills/create-module/SKILL.md +9 -9
  1362. package/skills/define-resource/SKILL.md +4 -4
  1363. package/skills/encrypt-data/SKILL.md +7 -7
  1364. package/skills/generate-openapi/SKILL.md +5 -5
  1365. package/skills/hash-password/SKILL.md +8 -8
  1366. package/skills/health-checks/SKILL.md +8 -6
  1367. package/skills/lower-stage3-decorators/SKILL.md +4 -4
  1368. package/skills/process-image/SKILL.md +5 -5
  1369. package/skills/register-route/SKILL.md +16 -6
  1370. package/skills/request-memo/SKILL.md +4 -4
  1371. package/skills/request-tracing/SKILL.md +6 -6
  1372. package/skills/resolve-path/SKILL.md +6 -6
  1373. package/skills/retry-operation/SKILL.md +4 -4
  1374. package/skills/run-app/SKILL.md +20 -13
  1375. package/skills/send-mail/SKILL.md +3 -3
  1376. package/skills/send-response/SKILL.md +16 -8
  1377. package/skills/store-file/SKILL.md +9 -5
  1378. package/skills/test-http/SKILL.md +5 -5
  1379. package/skills/test-service/SKILL.md +5 -5
  1380. package/skills/update-packages/SKILL.md +6 -6
  1381. package/skills/upload-file/SKILL.md +7 -7
  1382. package/skills/use-app-context/SKILL.md +7 -7
  1383. package/skills/use-localization/SKILL.md +6 -6
  1384. package/skills/use-middleware/SKILL.md +8 -8
  1385. package/skills/use-model-transformers/SKILL.md +6 -6
  1386. package/skills/use-repository/SKILL.md +7 -7
  1387. package/skills/use-request-locals/SKILL.md +4 -4
  1388. package/skills/validate-input/SKILL.md +7 -7
  1389. package/skills/warlock-conventions/SKILL.md +6 -6
  1390. package/skills/warlock-doctor/SKILL.md +5 -5
  1391. package/skills/warlock-routes/SKILL.md +6 -6
  1392. package/skills/wire-socket/SKILL.md +4 -4
  1393. package/skills/write-cli-command/SKILL.md +6 -6
  1394. package/skills/write-middleware/SKILL.md +8 -8
  1395. package/skills/write-seeder/SKILL.md +5 -5
  1396. package/skills/write-use-case/SKILL.md +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"send-mail.mjs","names":[],"sources":["../../../../../../../core/src/mail/send-mail.ts"],"sourcesContent":["import { log } from \"@warlock.js/logger\";\nimport { readFile } from \"node:fs/promises\";\nimport type { Options as NodemailerOptions } from \"nodemailer/lib/mailer\";\nimport { isDevelopmentMode, isTestMode, resolveMailConfig } from \"./config\";\nimport { MAIL_EVENTS, generateMailId, mailEvents } from \"./events\";\nimport { getMailer } from \"./mailer-pool\";\nimport { renderReactMail } from \"./react-mail\";\nimport { captureMail } from \"./test-mailbox\";\nimport {\n MailError,\n type CapturedMail,\n type MailAttachment,\n type MailOptions,\n type MailPriority,\n type MailResult,\n type NormalizedMail,\n} from \"./types\";\n\n/**\n * Normalize recipients to array\n */\nfunction normalizeRecipients(recipients: string | string[] | undefined): string[] {\n if (!recipients) {\n return [];\n }\n\n return Array.isArray(recipients) ? recipients : [recipients];\n}\n\n/**\n * Map priority to nodemailer format\n */\nfunction mapPriority(priority: MailPriority): \"high\" | \"normal\" | \"low\" {\n return priority;\n}\n\n/**\n * Normalize mail options to internal format\n */\nfunction normalizeMail(options: MailOptions): NormalizedMail {\n const config = resolveMailConfig(options);\n\n return {\n to: normalizeRecipients(options.to),\n cc: normalizeRecipients(options.cc),\n bcc: normalizeRecipients(options.bcc),\n replyTo: options.replyTo,\n from: options.from || config.from || { name: \"No Reply\", address: \"noreply@localhost\" },\n subject: options.subject,\n html: options.html,\n text: options.text,\n attachments: options.attachments || [],\n priority: options.priority || \"normal\",\n headers: options.headers || {},\n tags: options.tags || [],\n correlationId: options.correlationId,\n config,\n };\n}\n\n/**\n * Resolve attachment - read file if path is provided\n */\nasync function resolveAttachment(attachment: MailAttachment): Promise<{\n filename: string;\n content: Buffer | string;\n contentType?: string;\n encoding?: string;\n cid?: string;\n}> {\n // If path is provided, read the file\n if (attachment.path) {\n try {\n const content = await readFile(attachment.path);\n return {\n filename: attachment.filename,\n content,\n contentType: attachment.contentType,\n encoding: attachment.encoding,\n cid: attachment.cid,\n };\n } catch (error) {\n throw new MailError(\n `Failed to read attachment file \"${attachment.path}\": ${error instanceof Error ? error.message : \"Unknown error\"}`,\n \"CONFIG_ERROR\",\n error instanceof Error ? error : undefined,\n );\n }\n }\n\n // Already has content\n return {\n filename: attachment.filename,\n content: attachment.content!,\n contentType: attachment.contentType,\n encoding: attachment.encoding,\n cid: attachment.cid,\n };\n}\n\n/**\n * Build nodemailer options from normalized mail\n */\nasync function buildNodemailerOptions(normalized: NormalizedMail): Promise<NodemailerOptions> {\n const options: NodemailerOptions = {\n to: normalized.to,\n // nodemailer encodes/escapes {name, address} objects itself\n from: normalized.from,\n subject: normalized.subject,\n priority: mapPriority(normalized.priority),\n };\n\n if (normalized.cc.length > 0) {\n options.cc = normalized.cc;\n }\n\n if (normalized.bcc.length > 0) {\n options.bcc = normalized.bcc;\n }\n\n if (normalized.replyTo) {\n options.replyTo = normalized.replyTo;\n }\n\n if (normalized.html) {\n options.html = normalized.html;\n }\n\n if (normalized.text) {\n options.text = normalized.text;\n }\n\n if (normalized.attachments.length > 0) {\n // Resolve all attachments (read files if needed)\n const resolvedAttachments = await Promise.all(\n normalized.attachments.map((att) => resolveAttachment(att as MailAttachment)),\n );\n\n options.attachments = resolvedAttachments.map((att) => ({\n filename: att.filename,\n content: att.content,\n contentType: att.contentType,\n encoding: att.encoding,\n cid: att.cid,\n }));\n }\n\n if (Object.keys(normalized.headers).length > 0) {\n options.headers = normalized.headers;\n }\n\n return options;\n}\n\n/**\n * Map a send failure to a MailError code, preferring nodemailer's `code` / `responseCode`\n */\nfunction detectErrorCode(error: unknown): MailError[\"code\"] {\n if (error instanceof MailError) {\n return error.code;\n }\n\n const { code, responseCode } = (error ?? {}) as { code?: string; responseCode?: number };\n\n if (code === \"EAUTH\" || responseCode === 535 || responseCode === 534) return \"AUTH_ERROR\";\n\n if ([\"ECONNECTION\", \"ECONNREFUSED\", \"ENOTFOUND\", \"ESOCKET\"].includes(code as string)) {\n return \"CONNECTION_ERROR\";\n }\n\n if ([\"ETIMEDOUT\", \"ETIMEOUT\", \"ECONNECTIONTIMEOUT\"].includes(code as string)) return \"TIMEOUT\";\n if (code === \"EENVELOPE\") return \"INVALID_ADDRESS\";\n if (responseCode && [421, 450, 451, 452].includes(responseCode)) return \"RATE_LIMIT\";\n\n const message = error instanceof Error ? error.message : \"\";\n\n if (message.includes(\"ECONNREFUSED\") || message.includes(\"ENOTFOUND\")) return \"CONNECTION_ERROR\";\n if (message.includes(\"authentication\") || message.includes(\"auth\")) return \"AUTH_ERROR\";\n if (message.includes(\"timeout\") || message.includes(\"ETIMEDOUT\")) return \"TIMEOUT\";\n if (message.includes(\"rate\") || message.includes(\"limit\")) return \"RATE_LIMIT\";\n\n return \"UNKNOWN\";\n}\n\n/**\n * Run per-mail event handler\n */\nasync function runMailEvent<T extends (...args: any[]) => any>(\n handler: T | undefined,\n ...args: Parameters<T>\n): Promise<ReturnType<T> | undefined> {\n if (!handler) {\n return undefined;\n }\n\n try {\n return await handler(...args);\n } catch (error) {\n log.error(\"mail\", \"event\", `Per-mail event handler error: ${error}`);\n return undefined;\n }\n}\n\n/**\n * Trigger both global and mail-specific events\n */\nasync function triggerEvents(\n mailId: string,\n event: \"beforeSending\" | \"sent\" | \"success\" | \"error\",\n ...args: any[]\n): Promise<any[]> {\n try {\n // Trigger global event (e.g., mail.success)\n const globalEventName =\n event === \"beforeSending\"\n ? \"BEFORE_SENDING\"\n : event === \"sent\"\n ? \"SENT\"\n : event === \"success\"\n ? \"SUCCESS\"\n : \"ERROR\";\n\n const globalResults = await mailEvents.trigger(\n globalEventName as keyof typeof MAIL_EVENTS,\n ...args,\n );\n\n // Trigger mail-specific event (e.g., mail.$id.success)\n const specificResults = await mailEvents.triggerForMail(mailId, event, ...args);\n\n return [...(globalResults || []), ...(specificResults || [])];\n } catch (error) {\n log.error(\"mail\", \"event\", `Event handler error: ${error}`);\n return [];\n }\n}\n\n/**\n * Notify development and test tooling of a captured mail without allowing a\n * synchronous listener failure to interrupt delivery.\n */\nfunction triggerCapturedMail(captured: CapturedMail): void {\n try {\n mailEvents.trigger(\"CAPTURED\", captured);\n } catch (error) {\n log.error(\"mail\", \"event\", `Captured mail event handler error: ${error}`);\n }\n}\n\n/**\n * Send an email\n *\n * @param options Mail options including recipients, content, and configuration\n * @returns Result containing success status, message ID, and accepted/rejected recipients\n *\n * @example\n * ```typescript\n * // Basic usage\n * await sendMail({\n * to: \"user@example.com\",\n * subject: \"Hello\",\n * html: \"<p>World</p>\",\n * });\n *\n * // With React component\n * await sendMail({\n * to: \"user@example.com\",\n * subject: \"Welcome!\",\n * component: <WelcomeEmail name=\"John\" />,\n * });\n *\n * // Track specific mail with events\n * const mailId = generateMailId();\n * mailEvents.onMailSuccess(mailId, (mail, result) => {\n * console.log(\"This specific mail was sent!\");\n * });\n * await sendMail({ id: mailId, to: \"...\", subject: \"...\", html: \"...\" });\n * ```\n */\nexport async function sendMail(options: MailOptions): Promise<MailResult> {\n // Generate or use provided mail ID\n const mailId = options.id || generateMailId();\n\n // Render React component if provided\n if (options.component) {\n try {\n options.html = await renderReactMail(options.component);\n } catch (error) {\n const mailError = new MailError(\n `Failed to render React component: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n \"RENDER_ERROR\",\n error instanceof Error ? error : undefined,\n );\n\n await runMailEvent(options.onError, options, mailError);\n await triggerEvents(mailId, \"error\", options, mailError);\n\n throw mailError;\n }\n }\n\n // Normalize mail\n const normalized = normalizeMail(options);\n const driver = normalized.config.driver || \"smtp\";\n\n // Run beforeSending event (per-mail, global, and mail-specific)\n const beforeResult = await runMailEvent(options.beforeSending, options);\n const globalBeforeResults = await triggerEvents(mailId, \"beforeSending\", options);\n\n // If any returns false, cancel sending\n if (beforeResult === false || globalBeforeResults.some((r) => r === false)) {\n log.info(`mail.${driver}`, \"cancelled\", \"Mail sending cancelled by beforeSending event\");\n\n const result: MailResult = {\n success: false,\n accepted: [],\n rejected: normalized.to,\n response: \"Cancelled by beforeSending event\",\n };\n\n return result;\n }\n\n // Test mode - capture without sending\n if (isTestMode()) {\n log.info(`mail.${driver}`, \"test\", `[TEST MODE] Captured mail to: ${normalized.to.join(\", \")}`);\n\n const result: MailResult = {\n success: true,\n messageId: `test-${mailId}@localhost`,\n accepted: normalized.to,\n rejected: [],\n response: \"Test mode - mail captured\",\n };\n\n const captured: CapturedMail = {\n id: mailId,\n options,\n normalized,\n timestamp: new Date(),\n result,\n };\n\n captureMail(captured);\n triggerCapturedMail(captured);\n\n await runMailEvent(options.onSuccess, options, result);\n await triggerEvents(mailId, \"success\", options, result);\n await runMailEvent(options.onSent, options, result, null);\n await triggerEvents(mailId, \"sent\", options, result, null);\n\n return result;\n }\n\n // Development mode - log without sending\n if (isDevelopmentMode()) {\n log.info(`mail.${driver}`, \"dev\", `[DEV MODE] Would send mail to: ${normalized.to.join(\", \")}`);\n log.info(`mail.${driver}`, \"dev\", `Subject: ${normalized.subject}`);\n\n if (normalized.html) {\n log.info(`mail.${driver}`, \"dev\", `HTML length: ${normalized.html.length} chars`);\n }\n\n const result: MailResult = {\n success: true,\n messageId: `dev-${mailId}@localhost`,\n accepted: normalized.to,\n rejected: [],\n response: \"Development mode - mail logged\",\n };\n\n const captured: CapturedMail = {\n id: mailId,\n options,\n normalized,\n timestamp: new Date(),\n result,\n };\n\n triggerCapturedMail(captured);\n\n await runMailEvent(options.onSuccess, options, result);\n await triggerEvents(mailId, \"success\", options, result);\n await runMailEvent(options.onSent, options, result, null);\n await triggerEvents(mailId, \"sent\", options, result, null);\n\n return result;\n }\n\n // Production mode - actually send\n try {\n const config = resolveMailConfig(options);\n const mailer = await getMailer(config);\n const nodemailerOptions = await buildNodemailerOptions(normalized);\n\n log.info(`mail.${driver}`, \"send\", `Sending mail to: ${normalized.to.join(\", \")}`);\n\n const output = await mailer.sendMail(nodemailerOptions);\n\n const accepted = output.accepted || (output.messageId ? normalized.to : []);\n const rejected = output.rejected || [];\n\n if (accepted.length === 0) {\n throw new MailError(\n `All recipients were rejected: ${(rejected as string[]).join(\", \")}`,\n \"REJECTED\",\n );\n }\n\n const result: MailResult = {\n success: true,\n messageId: output.messageId,\n accepted: accepted as string[],\n rejected: rejected as string[],\n response: output.response,\n envelope: output.envelope,\n };\n\n if (rejected.length > 0) {\n log.warn(`mail.${driver}`, \"partial\", `Mail partially rejected: ${rejected.join(\", \")}`);\n }\n\n log.success(`mail.${driver}`, \"sent\", `Mail sent successfully (ID: ${result.messageId})`);\n await runMailEvent(options.onSuccess, options, result);\n await triggerEvents(mailId, \"success\", options, result);\n\n await runMailEvent(options.onSent, options, result, null);\n await triggerEvents(mailId, \"sent\", options, result, null);\n\n return result;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : \"Unknown error\";\n const code = detectErrorCode(error);\n\n const mailError = new MailError(\n `Failed to send mail: ${errorMessage}`,\n code,\n error instanceof Error ? error : undefined,\n );\n\n log.error(`mail.${driver}`, \"error\", mailError.message);\n\n await runMailEvent(options.onError, options, mailError);\n await triggerEvents(mailId, \"error\", options, mailError);\n await runMailEvent(options.onSent, options, null, mailError);\n await triggerEvents(mailId, \"sent\", options, null, mailError);\n\n throw mailError;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"send-mail.mjs","names":[],"sources":["../../../../../../../../packages/core/src/mail/send-mail.ts"],"sourcesContent":["import { log, maskEmail, maskEmailsInText } from \"@warlock.js/logger\";\nimport { readFile } from \"node:fs/promises\";\nimport type { Options as NodemailerOptions } from \"nodemailer/lib/mailer\";\nimport { isDevelopmentMode, isTestMode, resolveMailConfig } from \"./config\";\nimport { MAIL_EVENTS, generateMailId, mailEvents } from \"./events\";\nimport { getMailer } from \"./mailer-pool\";\nimport { renderReactMail } from \"./react-mail\";\nimport { captureMail } from \"./test-mailbox\";\nimport {\n MailError,\n type CapturedMail,\n type MailAttachment,\n type MailOptions,\n type MailPriority,\n type MailResult,\n type NormalizedMail,\n} from \"./types\";\n\n/**\n * Normalize recipients to array\n */\nfunction normalizeRecipients(recipients: string | string[] | undefined): string[] {\n if (!recipients) {\n return [];\n }\n\n return Array.isArray(recipients) ? recipients : [recipients];\n}\n\n/**\n * Map priority to nodemailer format\n */\nfunction mapPriority(priority: MailPriority): \"high\" | \"normal\" | \"low\" {\n return priority;\n}\n\n/**\n * Normalize mail options to internal format\n */\nfunction normalizeMail(options: MailOptions): NormalizedMail {\n const config = resolveMailConfig(options);\n\n return {\n to: normalizeRecipients(options.to),\n cc: normalizeRecipients(options.cc),\n bcc: normalizeRecipients(options.bcc),\n replyTo: options.replyTo,\n from: options.from || config.from || { name: \"No Reply\", address: \"noreply@localhost\" },\n subject: options.subject,\n html: options.html,\n text: options.text,\n attachments: options.attachments || [],\n priority: options.priority || \"normal\",\n headers: options.headers || {},\n tags: options.tags || [],\n correlationId: options.correlationId,\n config,\n };\n}\n\n/**\n * Resolve attachment - read file if path is provided\n */\nasync function resolveAttachment(attachment: MailAttachment): Promise<{\n filename: string;\n content: Buffer | string;\n contentType?: string;\n encoding?: string;\n cid?: string;\n}> {\n // If path is provided, read the file\n if (attachment.path) {\n try {\n const content = await readFile(attachment.path);\n return {\n filename: attachment.filename,\n content,\n contentType: attachment.contentType,\n encoding: attachment.encoding,\n cid: attachment.cid,\n };\n } catch (error) {\n throw new MailError(\n `Failed to read attachment file \"${attachment.path}\": ${error instanceof Error ? error.message : \"Unknown error\"}`,\n \"CONFIG_ERROR\",\n error instanceof Error ? error : undefined,\n );\n }\n }\n\n // Already has content\n return {\n filename: attachment.filename,\n content: attachment.content!,\n contentType: attachment.contentType,\n encoding: attachment.encoding,\n cid: attachment.cid,\n };\n}\n\n/**\n * Build nodemailer options from normalized mail\n */\nasync function buildNodemailerOptions(normalized: NormalizedMail): Promise<NodemailerOptions> {\n const options: NodemailerOptions = {\n to: normalized.to,\n // nodemailer encodes/escapes {name, address} objects itself\n from: normalized.from,\n subject: normalized.subject,\n priority: mapPriority(normalized.priority),\n };\n\n if (normalized.cc.length > 0) {\n options.cc = normalized.cc;\n }\n\n if (normalized.bcc.length > 0) {\n options.bcc = normalized.bcc;\n }\n\n if (normalized.replyTo) {\n options.replyTo = normalized.replyTo;\n }\n\n if (normalized.html) {\n options.html = normalized.html;\n }\n\n if (normalized.text) {\n options.text = normalized.text;\n }\n\n if (normalized.attachments.length > 0) {\n // Resolve all attachments (read files if needed)\n const resolvedAttachments = await Promise.all(\n normalized.attachments.map((att) => resolveAttachment(att as MailAttachment)),\n );\n\n options.attachments = resolvedAttachments.map((att) => ({\n filename: att.filename,\n content: att.content,\n contentType: att.contentType,\n encoding: att.encoding,\n cid: att.cid,\n }));\n }\n\n if (Object.keys(normalized.headers).length > 0) {\n options.headers = normalized.headers;\n }\n\n return options;\n}\n\n/**\n * Map a send failure to a MailError code, preferring nodemailer's `code` / `responseCode`\n */\nfunction detectErrorCode(error: unknown): MailError[\"code\"] {\n if (error instanceof MailError) {\n return error.code;\n }\n\n const { code, responseCode } = (error ?? {}) as { code?: string; responseCode?: number };\n\n if (code === \"EAUTH\" || responseCode === 535 || responseCode === 534) return \"AUTH_ERROR\";\n\n if ([\"ECONNECTION\", \"ECONNREFUSED\", \"ENOTFOUND\", \"ESOCKET\"].includes(code as string)) {\n return \"CONNECTION_ERROR\";\n }\n\n if ([\"ETIMEDOUT\", \"ETIMEOUT\", \"ECONNECTIONTIMEOUT\"].includes(code as string)) return \"TIMEOUT\";\n if (code === \"EENVELOPE\") return \"INVALID_ADDRESS\";\n if (responseCode && [421, 450, 451, 452].includes(responseCode)) return \"RATE_LIMIT\";\n\n const message = error instanceof Error ? error.message : \"\";\n\n if (message.includes(\"ECONNREFUSED\") || message.includes(\"ENOTFOUND\")) return \"CONNECTION_ERROR\";\n if (message.includes(\"authentication\") || message.includes(\"auth\")) return \"AUTH_ERROR\";\n if (message.includes(\"timeout\") || message.includes(\"ETIMEDOUT\")) return \"TIMEOUT\";\n if (message.includes(\"rate\") || message.includes(\"limit\")) return \"RATE_LIMIT\";\n\n return \"UNKNOWN\";\n}\n\n/**\n * Run per-mail event handler\n */\nasync function runMailEvent<T extends (...args: any[]) => any>(\n handler: T | undefined,\n ...args: Parameters<T>\n): Promise<ReturnType<T> | undefined> {\n if (!handler) {\n return undefined;\n }\n\n try {\n return await handler(...args);\n } catch (error) {\n log.error(\"mail\", \"event\", `Per-mail event handler error: ${error}`);\n return undefined;\n }\n}\n\n/**\n * Trigger both global and mail-specific events\n */\nasync function triggerEvents(\n mailId: string,\n event: \"beforeSending\" | \"sent\" | \"success\" | \"error\",\n ...args: any[]\n): Promise<any[]> {\n try {\n // Trigger global event (e.g., mail.success)\n const globalEventName =\n event === \"beforeSending\"\n ? \"BEFORE_SENDING\"\n : event === \"sent\"\n ? \"SENT\"\n : event === \"success\"\n ? \"SUCCESS\"\n : \"ERROR\";\n\n const globalResults = await mailEvents.trigger(\n globalEventName as keyof typeof MAIL_EVENTS,\n ...args,\n );\n\n // Trigger mail-specific event (e.g., mail.$id.success)\n const specificResults = await mailEvents.triggerForMail(mailId, event, ...args);\n\n return [...(globalResults || []), ...(specificResults || [])];\n } catch (error) {\n log.error(\"mail\", \"event\", `Event handler error: ${error}`);\n return [];\n }\n}\n\n/**\n * Notify development and test tooling of a captured mail without allowing a\n * synchronous listener failure to interrupt delivery.\n */\nfunction triggerCapturedMail(captured: CapturedMail): void {\n try {\n mailEvents.trigger(\"CAPTURED\", captured);\n } catch (error) {\n log.error(\"mail\", \"event\", `Captured mail event handler error: ${error}`);\n }\n}\n\n/**\n * Send an email\n *\n * @param options Mail options including recipients, content, and configuration\n * @returns Result containing success status, message ID, and accepted/rejected recipients\n *\n * @example\n * ```typescript\n * // Basic usage\n * await sendMail({\n * to: \"user@example.com\",\n * subject: \"Hello\",\n * html: \"<p>World</p>\",\n * });\n *\n * // With React component\n * await sendMail({\n * to: \"user@example.com\",\n * subject: \"Welcome!\",\n * component: <WelcomeEmail name=\"John\" />,\n * });\n *\n * // Track specific mail with events\n * const mailId = generateMailId();\n * mailEvents.onMailSuccess(mailId, (mail, result) => {\n * console.log(\"This specific mail was sent!\");\n * });\n * await sendMail({ id: mailId, to: \"...\", subject: \"...\", html: \"...\" });\n * ```\n */\nexport async function sendMail(options: MailOptions): Promise<MailResult> {\n // Generate or use provided mail ID\n const mailId = options.id || generateMailId();\n\n // Render React component if provided\n if (options.component) {\n try {\n options.html = await renderReactMail(options.component);\n } catch (error) {\n const mailError = new MailError(\n `Failed to render React component: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n \"RENDER_ERROR\",\n error instanceof Error ? error : undefined,\n );\n\n await runMailEvent(options.onError, options, mailError);\n await triggerEvents(mailId, \"error\", options, mailError);\n\n throw mailError;\n }\n }\n\n // Normalize mail\n const normalized = normalizeMail(options);\n const driver = normalized.config.driver || \"smtp\";\n\n // Run beforeSending event (per-mail, global, and mail-specific)\n const beforeResult = await runMailEvent(options.beforeSending, options);\n const globalBeforeResults = await triggerEvents(mailId, \"beforeSending\", options);\n\n // If any returns false, cancel sending\n if (beforeResult === false || globalBeforeResults.some((r) => r === false)) {\n log.info(`mail.${driver}`, \"cancelled\", \"Mail sending cancelled by beforeSending event\");\n\n const result: MailResult = {\n success: false,\n accepted: [],\n rejected: normalized.to,\n response: \"Cancelled by beforeSending event\",\n };\n\n return result;\n }\n\n // Test mode - capture without sending\n if (isTestMode()) {\n log.info(\n `mail.${driver}`,\n \"test\",\n `[TEST MODE] Captured mail to: ${normalized.to.map(maskEmail).join(\", \")}`,\n );\n\n const result: MailResult = {\n success: true,\n messageId: `test-${mailId}@localhost`,\n accepted: normalized.to,\n rejected: [],\n response: \"Test mode - mail captured\",\n };\n\n const captured: CapturedMail = {\n id: mailId,\n options,\n normalized,\n timestamp: new Date(),\n result,\n };\n\n captureMail(captured);\n triggerCapturedMail(captured);\n\n await runMailEvent(options.onSuccess, options, result);\n await triggerEvents(mailId, \"success\", options, result);\n await runMailEvent(options.onSent, options, result, null);\n await triggerEvents(mailId, \"sent\", options, result, null);\n\n return result;\n }\n\n // Development mode - log without sending\n if (isDevelopmentMode()) {\n log.info(\n `mail.${driver}`,\n \"dev\",\n `[DEV MODE] Would send mail to: ${normalized.to.map(maskEmail).join(\", \")}`,\n );\n log.info(`mail.${driver}`, \"dev\", `Subject: ${normalized.subject}`);\n\n if (normalized.html) {\n log.info(`mail.${driver}`, \"dev\", `HTML length: ${normalized.html.length} chars`);\n }\n\n const result: MailResult = {\n success: true,\n messageId: `dev-${mailId}@localhost`,\n accepted: normalized.to,\n rejected: [],\n response: \"Development mode - mail logged\",\n };\n\n const captured: CapturedMail = {\n id: mailId,\n options,\n normalized,\n timestamp: new Date(),\n result,\n };\n\n triggerCapturedMail(captured);\n\n await runMailEvent(options.onSuccess, options, result);\n await triggerEvents(mailId, \"success\", options, result);\n await runMailEvent(options.onSent, options, result, null);\n await triggerEvents(mailId, \"sent\", options, result, null);\n\n return result;\n }\n\n // Production mode - actually send\n try {\n const config = resolveMailConfig(options);\n const mailer = await getMailer(config);\n const nodemailerOptions = await buildNodemailerOptions(normalized);\n\n // Recipients are personal data: log them masked (`m***@example.com`),\n // never in full — the address sits inside the message, where key-based\n // redaction cannot reach it.\n log.info(\n `mail.${driver}`,\n \"send\",\n `Sending mail to ${normalized.to.length} recipient(s): ${normalized.to.map(maskEmail).join(\", \")}`,\n );\n\n const output = await mailer.sendMail(nodemailerOptions);\n\n const accepted = output.accepted || (output.messageId ? normalized.to : []);\n const rejected = output.rejected || [];\n\n if (accepted.length === 0) {\n throw new MailError(\n `All recipients were rejected: ${(rejected as string[]).join(\", \")}`,\n \"REJECTED\",\n );\n }\n\n const result: MailResult = {\n success: true,\n messageId: output.messageId,\n accepted: accepted as string[],\n rejected: rejected as string[],\n response: output.response,\n envelope: output.envelope,\n };\n\n if (rejected.length > 0) {\n log.warn(\n `mail.${driver}`,\n \"partial\",\n `Mail partially rejected: ${(rejected as unknown[]).map((address) => maskEmail(String(address))).join(\", \")}`,\n );\n }\n\n log.success(`mail.${driver}`, \"sent\", `Mail sent successfully (ID: ${result.messageId})`);\n await runMailEvent(options.onSuccess, options, result);\n await triggerEvents(mailId, \"success\", options, result);\n\n await runMailEvent(options.onSent, options, result, null);\n await triggerEvents(mailId, \"sent\", options, result, null);\n\n return result;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : \"Unknown error\";\n const code = detectErrorCode(error);\n\n const mailError = new MailError(\n `Failed to send mail: ${errorMessage}`,\n code,\n error instanceof Error ? error : undefined,\n );\n\n log.error(`mail.${driver}`, \"error\", maskEmailsInText(mailError.message));\n\n await runMailEvent(options.onError, options, mailError);\n await triggerEvents(mailId, \"error\", options, mailError);\n await runMailEvent(options.onSent, options, null, mailError);\n await triggerEvents(mailId, \"sent\", options, null, mailError);\n\n throw mailError;\n }\n}\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { CapturedMail } from "./types.mjs";
2
2
 
3
- //#region ../core/src/mail/test-mailbox.d.ts
3
+ //#region ../../packages/core/src/mail/test-mailbox.d.ts
4
4
  /**
5
5
  * Add a mail to the test mailbox
6
6
  */
@@ -1 +1 @@
1
- {"version":3,"file":"test-mailbox.d.mts","names":[],"sources":["../../../../../../../core/src/mail/test-mailbox.ts"],"mappings":";;;;;;iBA2EgB,WAAA,CAAY,IAAkB,EAAZ,YAAY;;;;iBAO9B,cAAA,IAAkB,YAAY;;;;iBAO9B,WAAA,IAAe,YAAY;;;;iBAO3B,WAAA,CAAY,KAAA,WAAgB,YAAY;;;;iBAUxC,kBAAA,CAAmB,OAAA,WAAkB,YAAY;;;;iBAOjD,aAAA,CAAc,KAAa;;;;iBAO3B,sBAAA,CAAuB,OAAe;;;;iBAOtC,cAAA;;;;iBAOA,gBAAA;;;;iBAOA,cAAA,CAAe,SAAA,GAAY,IAAA,EAAM,YAAA,eAA2B,YAAY;;;;iBAaxE,eAAA,CAAgB,KAAa"}
1
+ {"version":3,"file":"test-mailbox.d.mts","names":[],"sources":["../../../../../../../../packages/core/src/mail/test-mailbox.ts"],"mappings":";;;;;;iBA2EgB,WAAA,CAAY,IAAkB,EAAZ,YAAY;;;;iBAO9B,cAAA,IAAkB,YAAY;;;;iBAO9B,WAAA,IAAe,YAAY;;;;iBAO3B,WAAA,CAAY,KAAA,WAAgB,YAAY;;;;iBAUxC,kBAAA,CAAmB,OAAA,WAAkB,YAAY;;;;iBAOjD,aAAA,CAAc,KAAa;;;;iBAO3B,sBAAA,CAAuB,OAAe;;;;iBAOtC,cAAA;;;;iBAOA,gBAAA;;;;iBAOA,cAAA,CAAe,SAAA,GAAY,IAAA,EAAM,YAAA,eAA2B,YAAY;;;;iBAaxE,eAAA,CAAgB,KAAa"}
@@ -1,4 +1,4 @@
1
- //#region ../core/src/mail/test-mailbox.ts
1
+ //#region ../../packages/core/src/mail/test-mailbox.ts
2
2
  /**
3
3
  * Test mailbox for capturing sent emails in test mode
4
4
  */
@@ -1 +1 @@
1
- {"version":3,"file":"test-mailbox.mjs","names":[],"sources":["../../../../../../../core/src/mail/test-mailbox.ts"],"sourcesContent":["/**\n * Test Mailbox for Mail v2\n *\n * Provides utilities for capturing and asserting sent emails in test mode.\n *\n * ## Setup\n *\n * ```typescript\n * import { setMailMode, clearTestMailbox } from \"@warlock.js/core/mail/v2\";\n *\n * beforeEach(() => {\n * setMailMode(\"test\");\n * clearTestMailbox();\n * });\n * ```\n *\n * ## Usage\n *\n * ```typescript\n * import { sendMail, getTestMailbox, findMailsTo } from \"@warlock.js/core/mail/v2\";\n *\n * // Send email in test mode\n * await sendMail({\n * to: \"user@example.com\",\n * subject: \"Welcome!\",\n * html: \"<p>Hello</p>\",\n * });\n *\n * // Get all captured mails\n * const mails = getTestMailbox();\n * expect(mails).toHaveLength(1);\n * expect(mails[0].options.subject).toBe(\"Welcome!\");\n *\n * // Find specific mails\n * const userMails = findMailsTo(\"user@example.com\");\n * expect(userMails).toHaveLength(1);\n *\n * // Check if mail was sent\n * expect(wasMailSentTo(\"user@example.com\")).toBe(true);\n * expect(wasMailSentWithSubject(\"Welcome!\")).toBe(true);\n * ```\n *\n * ## Assertion Helpers\n *\n * ```typescript\n * // Assert a mail matching a predicate was sent\n * const mail = assertMailSent(m => m.options.to === \"user@example.com\");\n * expect(mail.options.subject).toBe(\"Welcome!\");\n *\n * // Assert exact count\n * assertMailCount(2); // throws if count doesn't match\n * ```\n *\n * ## Captured Mail Structure\n *\n * Each captured mail contains:\n * - `options` - Original MailOptions passed to sendMail\n * - `normalized` - Normalized mail data (arrays, addresses resolved)\n * - `timestamp` - When the mail was captured\n * - `result` - MailResult (in test mode, always success)\n * - `error` - MailError if sending failed (null in test mode)\n *\n * @module test-mailbox\n */\n\nimport type { CapturedMail } from \"./types\";\n\n/**\n * Test mailbox for capturing sent emails in test mode\n */\nlet testMailbox: CapturedMail[] = [];\n\n/**\n * Add a mail to the test mailbox\n */\nexport function captureMail(mail: CapturedMail): void {\n testMailbox.push(mail);\n}\n\n/**\n * Get all captured mails\n */\nexport function getTestMailbox(): CapturedMail[] {\n return [...testMailbox];\n}\n\n/**\n * Get the last captured mail\n */\nexport function getLastMail(): CapturedMail | undefined {\n return testMailbox[testMailbox.length - 1];\n}\n\n/**\n * Find mails by recipient\n */\nexport function findMailsTo(email: string): CapturedMail[] {\n return testMailbox.filter((mail) => {\n const to = Array.isArray(mail.options.to) ? mail.options.to : [mail.options.to];\n return to.includes(email);\n });\n}\n\n/**\n * Find mails by subject (partial match)\n */\nexport function findMailsBySubject(subject: string): CapturedMail[] {\n return testMailbox.filter((mail) => mail.options.subject.includes(subject));\n}\n\n/**\n * Check if a mail was sent to a specific recipient\n */\nexport function wasMailSentTo(email: string): boolean {\n return findMailsTo(email).length > 0;\n}\n\n/**\n * Check if a mail with specific subject was sent\n */\nexport function wasMailSentWithSubject(subject: string): boolean {\n return testMailbox.some((mail) => mail.options.subject === subject);\n}\n\n/**\n * Get mailbox size\n */\nexport function getMailboxSize(): number {\n return testMailbox.length;\n}\n\n/**\n * Clear the test mailbox\n */\nexport function clearTestMailbox(): void {\n testMailbox = [];\n}\n\n/**\n * Assert helper for testing\n */\nexport function assertMailSent(predicate: (mail: CapturedMail) => boolean): CapturedMail {\n const mail = testMailbox.find(predicate);\n\n if (!mail) {\n throw new Error(\"No mail matching the predicate was found in the test mailbox\");\n }\n\n return mail;\n}\n\n/**\n * Assert that a specific number of mails were sent\n */\nexport function assertMailCount(count: number): void {\n if (testMailbox.length !== count) {\n throw new Error(`Expected ${count} mails to be sent, but found ${testMailbox.length}`);\n }\n}\n"],"mappings":";;;;AAsEA,IAAI,cAA8B,CAAC;;;;AAKnC,SAAgB,YAAY,MAA0B;CACpD,YAAY,KAAK,IAAI;AACvB;;;;AAKA,SAAgB,iBAAiC;CAC/C,OAAO,CAAC,GAAG,WAAW;AACxB;;;;AAKA,SAAgB,cAAwC;CACtD,OAAO,YAAY,YAAY,SAAS;AAC1C;;;;AAKA,SAAgB,YAAY,OAA+B;CACzD,OAAO,YAAY,QAAQ,SAAS;EAElC,QADW,MAAM,QAAQ,KAAK,QAAQ,EAAE,IAAI,KAAK,QAAQ,KAAK,CAAC,KAAK,QAAQ,EAAE,EACrE,CAAC,SAAS,KAAK;CAC1B,CAAC;AACH;;;;AAKA,SAAgB,mBAAmB,SAAiC;CAClE,OAAO,YAAY,QAAQ,SAAS,KAAK,QAAQ,QAAQ,SAAS,OAAO,CAAC;AAC5E;;;;AAKA,SAAgB,cAAc,OAAwB;CACpD,OAAO,YAAY,KAAK,CAAC,CAAC,SAAS;AACrC;;;;AAKA,SAAgB,uBAAuB,SAA0B;CAC/D,OAAO,YAAY,MAAM,SAAS,KAAK,QAAQ,YAAY,OAAO;AACpE;;;;AAKA,SAAgB,iBAAyB;CACvC,OAAO,YAAY;AACrB;;;;AAKA,SAAgB,mBAAyB;CACvC,cAAc,CAAC;AACjB;;;;AAKA,SAAgB,eAAe,WAA0D;CACvF,MAAM,OAAO,YAAY,KAAK,SAAS;CAEvC,IAAI,CAAC,MACH,MAAM,IAAI,MAAM,8DAA8D;CAGhF,OAAO;AACT;;;;AAKA,SAAgB,gBAAgB,OAAqB;CACnD,IAAI,YAAY,WAAW,OACzB,MAAM,IAAI,MAAM,YAAY,MAAM,+BAA+B,YAAY,QAAQ;AAEzF"}
1
+ {"version":3,"file":"test-mailbox.mjs","names":[],"sources":["../../../../../../../../packages/core/src/mail/test-mailbox.ts"],"sourcesContent":["/**\n * Test Mailbox for Mail v2\n *\n * Provides utilities for capturing and asserting sent emails in test mode.\n *\n * ## Setup\n *\n * ```typescript\n * import { setMailMode, clearTestMailbox } from \"@warlock.js/core/mail/v2\";\n *\n * beforeEach(() => {\n * setMailMode(\"test\");\n * clearTestMailbox();\n * });\n * ```\n *\n * ## Usage\n *\n * ```typescript\n * import { sendMail, getTestMailbox, findMailsTo } from \"@warlock.js/core/mail/v2\";\n *\n * // Send email in test mode\n * await sendMail({\n * to: \"user@example.com\",\n * subject: \"Welcome!\",\n * html: \"<p>Hello</p>\",\n * });\n *\n * // Get all captured mails\n * const mails = getTestMailbox();\n * expect(mails).toHaveLength(1);\n * expect(mails[0].options.subject).toBe(\"Welcome!\");\n *\n * // Find specific mails\n * const userMails = findMailsTo(\"user@example.com\");\n * expect(userMails).toHaveLength(1);\n *\n * // Check if mail was sent\n * expect(wasMailSentTo(\"user@example.com\")).toBe(true);\n * expect(wasMailSentWithSubject(\"Welcome!\")).toBe(true);\n * ```\n *\n * ## Assertion Helpers\n *\n * ```typescript\n * // Assert a mail matching a predicate was sent\n * const mail = assertMailSent(m => m.options.to === \"user@example.com\");\n * expect(mail.options.subject).toBe(\"Welcome!\");\n *\n * // Assert exact count\n * assertMailCount(2); // throws if count doesn't match\n * ```\n *\n * ## Captured Mail Structure\n *\n * Each captured mail contains:\n * - `options` - Original MailOptions passed to sendMail\n * - `normalized` - Normalized mail data (arrays, addresses resolved)\n * - `timestamp` - When the mail was captured\n * - `result` - MailResult (in test mode, always success)\n * - `error` - MailError if sending failed (null in test mode)\n *\n * @module test-mailbox\n */\n\nimport type { CapturedMail } from \"./types\";\n\n/**\n * Test mailbox for capturing sent emails in test mode\n */\nlet testMailbox: CapturedMail[] = [];\n\n/**\n * Add a mail to the test mailbox\n */\nexport function captureMail(mail: CapturedMail): void {\n testMailbox.push(mail);\n}\n\n/**\n * Get all captured mails\n */\nexport function getTestMailbox(): CapturedMail[] {\n return [...testMailbox];\n}\n\n/**\n * Get the last captured mail\n */\nexport function getLastMail(): CapturedMail | undefined {\n return testMailbox[testMailbox.length - 1];\n}\n\n/**\n * Find mails by recipient\n */\nexport function findMailsTo(email: string): CapturedMail[] {\n return testMailbox.filter((mail) => {\n const to = Array.isArray(mail.options.to) ? mail.options.to : [mail.options.to];\n return to.includes(email);\n });\n}\n\n/**\n * Find mails by subject (partial match)\n */\nexport function findMailsBySubject(subject: string): CapturedMail[] {\n return testMailbox.filter((mail) => mail.options.subject.includes(subject));\n}\n\n/**\n * Check if a mail was sent to a specific recipient\n */\nexport function wasMailSentTo(email: string): boolean {\n return findMailsTo(email).length > 0;\n}\n\n/**\n * Check if a mail with specific subject was sent\n */\nexport function wasMailSentWithSubject(subject: string): boolean {\n return testMailbox.some((mail) => mail.options.subject === subject);\n}\n\n/**\n * Get mailbox size\n */\nexport function getMailboxSize(): number {\n return testMailbox.length;\n}\n\n/**\n * Clear the test mailbox\n */\nexport function clearTestMailbox(): void {\n testMailbox = [];\n}\n\n/**\n * Assert helper for testing\n */\nexport function assertMailSent(predicate: (mail: CapturedMail) => boolean): CapturedMail {\n const mail = testMailbox.find(predicate);\n\n if (!mail) {\n throw new Error(\"No mail matching the predicate was found in the test mailbox\");\n }\n\n return mail;\n}\n\n/**\n * Assert that a specific number of mails were sent\n */\nexport function assertMailCount(count: number): void {\n if (testMailbox.length !== count) {\n throw new Error(`Expected ${count} mails to be sent, but found ${testMailbox.length}`);\n }\n}\n"],"mappings":";;;;AAsEA,IAAI,cAA8B,CAAC;;;;AAKnC,SAAgB,YAAY,MAA0B;CACpD,YAAY,KAAK,IAAI;AACvB;;;;AAKA,SAAgB,iBAAiC;CAC/C,OAAO,CAAC,GAAG,WAAW;AACxB;;;;AAKA,SAAgB,cAAwC;CACtD,OAAO,YAAY,YAAY,SAAS;AAC1C;;;;AAKA,SAAgB,YAAY,OAA+B;CACzD,OAAO,YAAY,QAAQ,SAAS;EAElC,QADW,MAAM,QAAQ,KAAK,QAAQ,EAAE,IAAI,KAAK,QAAQ,KAAK,CAAC,KAAK,QAAQ,EAAE,EACrE,CAAC,SAAS,KAAK;CAC1B,CAAC;AACH;;;;AAKA,SAAgB,mBAAmB,SAAiC;CAClE,OAAO,YAAY,QAAQ,SAAS,KAAK,QAAQ,QAAQ,SAAS,OAAO,CAAC;AAC5E;;;;AAKA,SAAgB,cAAc,OAAwB;CACpD,OAAO,YAAY,KAAK,CAAC,CAAC,SAAS;AACrC;;;;AAKA,SAAgB,uBAAuB,SAA0B;CAC/D,OAAO,YAAY,MAAM,SAAS,KAAK,QAAQ,YAAY,OAAO;AACpE;;;;AAKA,SAAgB,iBAAyB;CACvC,OAAO,YAAY;AACrB;;;;AAKA,SAAgB,mBAAyB;CACvC,cAAc,CAAC;AACjB;;;;AAKA,SAAgB,eAAe,WAA0D;CACvF,MAAM,OAAO,YAAY,KAAK,SAAS;CAEvC,IAAI,CAAC,MACH,MAAM,IAAI,MAAM,8DAA8D;CAGhF,OAAO;AACT;;;;AAKA,SAAgB,gBAAgB,OAAqB;CACnD,IAAI,YAAY,WAAW,OACzB,MAAM,IAAI,MAAM,YAAY,MAAM,+BAA+B,YAAY,QAAQ;AAEzF"}
@@ -1,7 +1,7 @@
1
1
  import React from "react";
2
2
  import SMTPTransport from "nodemailer/lib/smtp-transport";
3
3
 
4
- //#region ../core/src/mail/types.d.ts
4
+ //#region ../../packages/core/src/mail/types.d.ts
5
5
  /**
6
6
  * AWS SES mail configuration
7
7
  */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.mts","names":[],"sources":["../../../../../../../core/src/mail/types.ts"],"mappings":";;;;;;AAMA;KAAY,iBAAA;EACV,MAAA;EACA,WAAA;EACA,eAAA;EACA,MAAA;EACA,IAAA,GAAO,WAAW;AAAA;;;;KAMR,kBAAA,GAAqB,kBAAA,GAAqB,iBAAiB;AAAvE;;;AAAA,KAKY,QAAA;AAL2D;AAKvE;;AALuE,KAU3D,YAAA;;AALQ;AAKpB;KAKY,WAAA;EAGN,IAAA;EACA,OAAO;AAAA;AAJb;;;;AAAA,KAWY,cAAA;EACV,QAAA;EACA,WAAA;EACA,QAAA;EACA,GAAA;AAAA;EAGI,OAAA,EAAS,MAAM;EACf,IAAA;AAAA;EAGA,OAAA;EACA,IAAA;AAAA;;;;AAAI;AAqEV;;;;;;;;;;;;;AAwBoB;AAMpB;;;;;;;;;;;;;;AAQ6C;AAM7C;;;;;;;;;;;;;AAQM;AAON;;;;AAAyB;AAezB;;;;;;;;;;;;;KA1EY,kBAAA,GAAqB,aAAA,CAAc,OAAA;EA+FR;;;EA3FrC,MAAA;EA2EA;;;;EAtEA,GAAA;EA0EA;;;;EArEA,QAAA;EAwES;;;;EAnET,QAAA;EAwEa;;;;EAnEb,IAAA,GAAO,WAAW;AAAA;;;;KAMR,aAAA;EAiEuD;AAAA;AAMnE;EAnEE,OAAA,GAAU,kBAAA;;;;EAIV,OAAA,GAAU,MAAA,SAAe,kBAAA;AAAA;;;;KAMf,UAAA;EACV,OAAA;EACA,SAAA;EACA,QAAA;EACA,QAAA;EACA,QAAA;EACA,QAAA;IACE,IAAA;IACA,EAAA;EAAA;AAAA;;;;KAOQ,aAAA;;;;;KAeA,UAAA;EA8DV;;;;EAzDA,aAAA,IAAiB,IAAA,EAAM,WAAA,YAAuB,OAAA,iBAAwB,OAAA;EA8DtE;;;EA1DA,MAAA,IACE,IAAA,EAAM,WAAA,EACN,MAAA,EAAQ,UAAA,SACR,KAAA,EAAO,SAAA,mBACG,OAAA;EA4DF;;;EAxDV,SAAA,IAAa,IAAA,EAAM,WAAA,EAAa,MAAA,EAAQ,UAAA,YAAsB,OAAA;EAiEjD;;;EA7Db,OAAA,IAAW,IAAA,EAAM,WAAA,EAAa,KAAA,EAAO,SAAA,YAAqB,OAAA;AAAA;;;;KAMhD,WAAA;EAkDV;;;;;;;;;;;EAtCA,EAAA;EAGA,EAAA;EACA,EAAA;EACA,GAAA;EACA,OAAA;EAGA,OAAA;EACA,IAAA;EACA,IAAA;EACA,SAAA,GAAY,KAAA,CAAM,YAAA;EAGlB,MAAA,GAAS,kBAAA;EACT,MAAA;EACA,IAAA,GAAO,WAAA;EAGP,WAAA,GAAc,cAAA;EAGd,QAAA,GAAW,YAAA;EACX,OAAA,GAAU,MAAA;EACV,IAAA;EAGA,aAAA;AAAA,IACE,UAAA;;;;KAKQ,cAAA;EACV,EAAA;EACA,EAAA;EACA,GAAA;EACA,OAAA;EACA,IAAA,EAAM,WAAA;EACN,OAAA;EACA,IAAA;EACA,IAAA;EACA,WAAA,EAAa,cAAA;EACb,QAAA,EAAU,YAAA;EACV,OAAA,EAAS,MAAA;EACT,IAAA;EACA,aAAA;EACA,MAAA,EAAQ,kBAAA;AAAA;;;;;;;KASE,YAAA;EAesB,qEAbhC,EAAA;EACA,OAAA,EAAS,WAAA;EACT,UAAA,EAAY,cAAA;EACZ,SAAA,EAAW,IAAA;EACX,MAAA,GAAS,UAAA;EACT,KAAA,GAAQ,SAAA;AAAA;AAUsE;;;AAAA,cAJnE,SAAA,SAAkB,KAAA;EAAA,SACb,IAAA,EAAM,aAAA;EAAA,SACN,aAAA,GAAgB,KAAA;cAEb,OAAA,UAAiB,IAAA,EAAM,aAAA,EAAe,aAAA,GAAgB,KAAA;AAAA"}
1
+ {"version":3,"file":"types.d.mts","names":[],"sources":["../../../../../../../../packages/core/src/mail/types.ts"],"mappings":";;;;;;AAMA;KAAY,iBAAA;EACV,MAAA;EACA,WAAA;EACA,eAAA;EACA,MAAA;EACA,IAAA,GAAO,WAAW;AAAA;;;;KAMR,kBAAA,GAAqB,kBAAA,GAAqB,iBAAiB;AAAvE;;;AAAA,KAKY,QAAA;AAL2D;AAKvE;;AALuE,KAU3D,YAAA;;AALQ;AAKpB;KAKY,WAAA;EAGN,IAAA;EACA,OAAO;AAAA;AAJb;;;;AAAA,KAWY,cAAA;EACV,QAAA;EACA,WAAA;EACA,QAAA;EACA,GAAA;AAAA;EAGI,OAAA,EAAS,MAAM;EACf,IAAA;AAAA;EAGA,OAAA;EACA,IAAA;AAAA;;;;AAAI;AAqEV;;;;;;;;;;;;;AAwBoB;AAMpB;;;;;;;;;;;;;;AAQ6C;AAM7C;;;;;;;;;;;;;AAQM;AAON;;;;AAAyB;AAezB;;;;;;;;;;;;;KA1EY,kBAAA,GAAqB,aAAA,CAAc,OAAA;EA+FR;;;EA3FrC,MAAA;EA2EA;;;;EAtEA,GAAA;EA0EA;;;;EArEA,QAAA;EAwES;;;;EAnET,QAAA;EAwEa;;;;EAnEb,IAAA,GAAO,WAAW;AAAA;;;;KAMR,aAAA;EAiEuD;AAAA;AAMnE;EAnEE,OAAA,GAAU,kBAAA;;;;EAIV,OAAA,GAAU,MAAA,SAAe,kBAAA;AAAA;;;;KAMf,UAAA;EACV,OAAA;EACA,SAAA;EACA,QAAA;EACA,QAAA;EACA,QAAA;EACA,QAAA;IACE,IAAA;IACA,EAAA;EAAA;AAAA;;;;KAOQ,aAAA;;;;;KAeA,UAAA;EA8DV;;;;EAzDA,aAAA,IAAiB,IAAA,EAAM,WAAA,YAAuB,OAAA,iBAAwB,OAAA;EA8DtE;;;EA1DA,MAAA,IACE,IAAA,EAAM,WAAA,EACN,MAAA,EAAQ,UAAA,SACR,KAAA,EAAO,SAAA,mBACG,OAAA;EA4DF;;;EAxDV,SAAA,IAAa,IAAA,EAAM,WAAA,EAAa,MAAA,EAAQ,UAAA,YAAsB,OAAA;EAiEjD;;;EA7Db,OAAA,IAAW,IAAA,EAAM,WAAA,EAAa,KAAA,EAAO,SAAA,YAAqB,OAAA;AAAA;;;;KAMhD,WAAA;EAkDV;;;;;;;;;;;EAtCA,EAAA;EAGA,EAAA;EACA,EAAA;EACA,GAAA;EACA,OAAA;EAGA,OAAA;EACA,IAAA;EACA,IAAA;EACA,SAAA,GAAY,KAAA,CAAM,YAAA;EAGlB,MAAA,GAAS,kBAAA;EACT,MAAA;EACA,IAAA,GAAO,WAAA;EAGP,WAAA,GAAc,cAAA;EAGd,QAAA,GAAW,YAAA;EACX,OAAA,GAAU,MAAA;EACV,IAAA;EAGA,aAAA;AAAA,IACE,UAAA;;;;KAKQ,cAAA;EACV,EAAA;EACA,EAAA;EACA,GAAA;EACA,OAAA;EACA,IAAA,EAAM,WAAA;EACN,OAAA;EACA,IAAA;EACA,IAAA;EACA,WAAA,EAAa,cAAA;EACb,QAAA,EAAU,YAAA;EACV,OAAA,EAAS,MAAA;EACT,IAAA;EACA,aAAA;EACA,MAAA,EAAQ,kBAAA;AAAA;;;;;;;KASE,YAAA;EAesB,qEAbhC,EAAA;EACA,OAAA,EAAS,WAAA;EACT,UAAA,EAAY,cAAA;EACZ,SAAA,EAAW,IAAA;EACX,MAAA,GAAS,UAAA;EACT,KAAA,GAAQ,SAAA;AAAA;AAUsE;;;AAAA,cAJnE,SAAA,SAAkB,KAAA;EAAA,SACb,IAAA,EAAM,aAAA;EAAA,SACN,aAAA,GAAgB,KAAA;cAEb,OAAA,UAAiB,IAAA,EAAM,aAAA,EAAe,aAAA,GAAgB,KAAA;AAAA"}
@@ -1,4 +1,4 @@
1
- //#region ../core/src/mail/types.ts
1
+ //#region ../../packages/core/src/mail/types.ts
2
2
  /**
3
3
  * Mail error class
4
4
  */
@@ -1 +1 @@
1
- {"version":3,"file":"types.mjs","names":[],"sources":["../../../../../../../core/src/mail/types.ts"],"sourcesContent":["import type SMTPTransport from \"nodemailer/lib/smtp-transport\";\nimport type React from \"react\";\n\n/**\n * AWS SES mail configuration\n */\nexport type SESConfigurations = {\n driver: \"ses\";\n accessKeyId: string;\n secretAccessKey: string;\n region: string;\n from?: MailAddress;\n};\n\n/**\n * Any mail configuration (SMTP or SES)\n */\nexport type MailConfigurations = SMTPConfigurations | SESConfigurations;\n\n/**\n * Mail mode determines how emails are handled\n */\nexport type MailMode = \"production\" | \"development\" | \"test\";\n\n/**\n * Mail priority levels\n */\nexport type MailPriority = \"high\" | \"normal\" | \"low\";\n\n/**\n * Email address with optional name\n */\nexport type MailAddress =\n | string\n | {\n name: string;\n address: string;\n };\n\n/**\n * Mail attachment\n * Supports both buffer/string content and file paths\n */\nexport type MailAttachment = {\n filename: string;\n contentType?: string;\n encoding?: \"base64\" | \"binary\" | \"hex\";\n cid?: string; // Content-ID for inline attachments\n} & (\n | {\n content: Buffer | string;\n path?: never;\n }\n | {\n content?: never;\n path: string; // File path - will be read automatically\n }\n);\n\n/**\n * Mail configuration for SMTP transport\n *\n * ## Basic Configuration\n *\n * ```typescript\n * setMailConfigurations({\n * host: \"smtp.gmail.com\",\n * port: 587,\n * secure: false, // true for 465, false for other ports\n * tls: true, // Use STARTTLS\n * username: \"user@gmail.com\",\n * password: \"app-password\",\n * from: { name: \"My App\", address: \"noreply@myapp.com\" },\n * });\n * ```\n *\n * ## Configuration Options\n *\n * | Option | Type | Default | Description |\n * |--------|------|---------|-------------|\n * | `host` | `string` | - | SMTP server hostname (e.g., \"smtp.gmail.com\") |\n * | `port` | `number` | 587 | SMTP port. Common: 25, 465 (SSL), 587 (TLS) |\n * | `secure` | `boolean` | false | Use SSL/TLS. Set `true` for port 465 |\n * | `tls` | `boolean` | true | Enable STARTTLS upgrade. For port 587 |\n * | `requireTLS` | `boolean` | - | Fail if STARTTLS upgrade fails |\n * | `username` | `string` | - | SMTP auth username (convenience alias) |\n * | `password` | `string` | - | SMTP auth password (convenience alias) |\n * | `auth` | `object` | - | Full auth object: `{ user, pass, type }` |\n * | `from` | `MailAddress` | - | Default sender for all emails |\n *\n * ## Provider Examples\n *\n * ### Gmail\n * ```typescript\n * { host: \"smtp.gmail.com\", port: 587, tls: true, username: \"...\", password: \"...\" }\n * ```\n *\n * ### SendGrid\n * ```typescript\n * { host: \"smtp.sendgrid.net\", port: 587, username: \"apikey\", password: \"SG.xxx\" }\n * ```\n *\n * ### AWS SES\n * ```typescript\n * { host: \"email-smtp.us-east-1.amazonaws.com\", port: 587, username: \"...\", password: \"...\" }\n * ```\n *\n * ### Mailgun\n * ```typescript\n * { host: \"smtp.mailgun.org\", port: 587, username: \"postmaster@...\", password: \"...\" }\n * ```\n *\n * ## Multi-tenant Usage\n *\n * For multi-tenant apps, pass config per-mail instead of globally:\n * ```typescript\n * await sendMail({\n * config: tenant.mailSettings, // Tenant-specific config\n * to: \"user@example.com\",\n * subject: \"Hello\",\n * html: \"<p>World</p>\",\n * });\n * ```\n */\nexport type SMTPConfigurations = SMTPTransport.Options & {\n /**\n * Transport driver type\n */\n driver?: \"smtp\";\n /**\n * Enable STARTTLS upgrade (alias for requireTLS)\n * Set to `true` for port 587\n */\n tls?: boolean;\n /**\n * SMTP authentication username\n * Convenience alias - can also use `auth.user`\n */\n username?: string;\n /**\n * SMTP authentication password\n * Convenience alias - can also use `auth.pass`\n */\n password?: string;\n /**\n * Default sender for all emails\n * Can be string (\"noreply@app.com\") or object ({ name, address })\n */\n from?: MailAddress;\n};\n\n/**\n * Named mailers configuration\n */\nexport type MailersConfig = {\n /**\n * Default mailer configuration\n */\n default?: MailConfigurations;\n /**\n * Named mailer configurations\n */\n mailers?: Record<string, MailConfigurations>;\n};\n\n/**\n * Mail result after sending\n */\nexport type MailResult = {\n success: boolean;\n messageId?: string;\n accepted: string[];\n rejected: string[];\n response?: string;\n envelope?: {\n from: string;\n to: string[];\n };\n};\n\n/**\n * Error codes for mail operations\n */\nexport type MailErrorCode =\n | \"CONNECTION_ERROR\"\n | \"AUTH_ERROR\"\n | \"RATE_LIMIT\"\n | \"INVALID_ADDRESS\"\n | \"REJECTED\"\n | \"TIMEOUT\"\n | \"RENDER_ERROR\"\n | \"CONFIG_ERROR\"\n | \"UNKNOWN\";\n\n/**\n * Mail event callbacks (per-mail)\n * For global events, use mailEvents.on() from events.ts\n */\nexport type MailEvents = {\n /**\n * Called before sending the email\n * Can be used to modify the mail or cancel sending\n */\n beforeSending?: (mail: MailOptions) => void | Promise<void> | false | Promise<false>;\n /**\n * Called after send attempt (success or failure)\n */\n onSent?: (\n mail: MailOptions,\n result: MailResult | null,\n error: MailError | null,\n ) => void | Promise<void>;\n /**\n * Called only on successful send\n */\n onSuccess?: (mail: MailOptions, result: MailResult) => void | Promise<void>;\n /**\n * Called only on error\n */\n onError?: (mail: MailOptions, error: MailError) => void | Promise<void>;\n};\n\n/**\n * Mail options for sending\n */\nexport type MailOptions = {\n /**\n * Unique mail ID for event namespacing\n * If not provided, one will be auto-generated\n *\n * Use this to subscribe to events for a specific mail:\n * ```typescript\n * const mailId = generateMailId();\n * mailEvents.onMailSuccess(mailId, (mail, result) => { ... });\n * await sendMail({ id: mailId, to: \"...\", subject: \"...\", html: \"...\" });\n * ```\n */\n id?: string;\n\n // Recipients\n to: string | string[];\n cc?: string | string[];\n bcc?: string | string[];\n replyTo?: string;\n\n // Content\n subject: string;\n html?: string;\n text?: string;\n component?: React.ReactElement;\n\n // Configuration\n config?: MailConfigurations;\n mailer?: string;\n from?: MailAddress;\n\n // Attachments\n attachments?: MailAttachment[];\n\n // Options\n priority?: MailPriority;\n headers?: Record<string, string>;\n tags?: string[];\n\n // Meta\n correlationId?: string;\n} & MailEvents;\n\n/**\n * Internal normalized mail data\n */\nexport type NormalizedMail = {\n to: string[];\n cc: string[];\n bcc: string[];\n replyTo?: string;\n from: MailAddress;\n subject: string;\n html?: string;\n text?: string;\n attachments: MailAttachment[];\n priority: MailPriority;\n headers: Record<string, string>;\n tags: string[];\n correlationId?: string;\n config: MailConfigurations;\n};\n\n/**\n * Captured mail for development and test modes.\n *\n * Attachments retain their normalized contents so test assertions can inspect\n * the exact mail that would be sent.\n */\nexport type CapturedMail = {\n /** The mail ID used for event namespacing and result correlation. */\n id: string;\n options: MailOptions;\n normalized: NormalizedMail;\n timestamp: Date;\n result?: MailResult;\n error?: MailError;\n};\n\n/**\n * Mail error class\n */\nexport class MailError extends Error {\n public readonly code: MailErrorCode;\n public readonly originalError?: Error;\n\n public constructor(message: string, code: MailErrorCode, originalError?: Error) {\n super(message);\n this.name = \"MailError\";\n this.code = code;\n this.originalError = originalError;\n }\n}\n"],"mappings":";;;;AAmTA,IAAa,YAAb,cAA+B,MAAM;CAInC,AAAO,YAAY,SAAiB,MAAqB,eAAuB;EAC9E,MAAM,OAAO;EACb,KAAK,OAAO;EACZ,KAAK,OAAO;EACZ,KAAK,gBAAgB;CACvB;AACF"}
1
+ {"version":3,"file":"types.mjs","names":[],"sources":["../../../../../../../../packages/core/src/mail/types.ts"],"sourcesContent":["import type SMTPTransport from \"nodemailer/lib/smtp-transport\";\nimport type React from \"react\";\n\n/**\n * AWS SES mail configuration\n */\nexport type SESConfigurations = {\n driver: \"ses\";\n accessKeyId: string;\n secretAccessKey: string;\n region: string;\n from?: MailAddress;\n};\n\n/**\n * Any mail configuration (SMTP or SES)\n */\nexport type MailConfigurations = SMTPConfigurations | SESConfigurations;\n\n/**\n * Mail mode determines how emails are handled\n */\nexport type MailMode = \"production\" | \"development\" | \"test\";\n\n/**\n * Mail priority levels\n */\nexport type MailPriority = \"high\" | \"normal\" | \"low\";\n\n/**\n * Email address with optional name\n */\nexport type MailAddress =\n | string\n | {\n name: string;\n address: string;\n };\n\n/**\n * Mail attachment\n * Supports both buffer/string content and file paths\n */\nexport type MailAttachment = {\n filename: string;\n contentType?: string;\n encoding?: \"base64\" | \"binary\" | \"hex\";\n cid?: string; // Content-ID for inline attachments\n} & (\n | {\n content: Buffer | string;\n path?: never;\n }\n | {\n content?: never;\n path: string; // File path - will be read automatically\n }\n);\n\n/**\n * Mail configuration for SMTP transport\n *\n * ## Basic Configuration\n *\n * ```typescript\n * setMailConfigurations({\n * host: \"smtp.gmail.com\",\n * port: 587,\n * secure: false, // true for 465, false for other ports\n * tls: true, // Use STARTTLS\n * username: \"user@gmail.com\",\n * password: \"app-password\",\n * from: { name: \"My App\", address: \"noreply@myapp.com\" },\n * });\n * ```\n *\n * ## Configuration Options\n *\n * | Option | Type | Default | Description |\n * |--------|------|---------|-------------|\n * | `host` | `string` | - | SMTP server hostname (e.g., \"smtp.gmail.com\") |\n * | `port` | `number` | 587 | SMTP port. Common: 25, 465 (SSL), 587 (TLS) |\n * | `secure` | `boolean` | false | Use SSL/TLS. Set `true` for port 465 |\n * | `tls` | `boolean` | true | Enable STARTTLS upgrade. For port 587 |\n * | `requireTLS` | `boolean` | - | Fail if STARTTLS upgrade fails |\n * | `username` | `string` | - | SMTP auth username (convenience alias) |\n * | `password` | `string` | - | SMTP auth password (convenience alias) |\n * | `auth` | `object` | - | Full auth object: `{ user, pass, type }` |\n * | `from` | `MailAddress` | - | Default sender for all emails |\n *\n * ## Provider Examples\n *\n * ### Gmail\n * ```typescript\n * { host: \"smtp.gmail.com\", port: 587, tls: true, username: \"...\", password: \"...\" }\n * ```\n *\n * ### SendGrid\n * ```typescript\n * { host: \"smtp.sendgrid.net\", port: 587, username: \"apikey\", password: \"SG.xxx\" }\n * ```\n *\n * ### AWS SES\n * ```typescript\n * { host: \"email-smtp.us-east-1.amazonaws.com\", port: 587, username: \"...\", password: \"...\" }\n * ```\n *\n * ### Mailgun\n * ```typescript\n * { host: \"smtp.mailgun.org\", port: 587, username: \"postmaster@...\", password: \"...\" }\n * ```\n *\n * ## Multi-tenant Usage\n *\n * For multi-tenant apps, pass config per-mail instead of globally:\n * ```typescript\n * await sendMail({\n * config: tenant.mailSettings, // Tenant-specific config\n * to: \"user@example.com\",\n * subject: \"Hello\",\n * html: \"<p>World</p>\",\n * });\n * ```\n */\nexport type SMTPConfigurations = SMTPTransport.Options & {\n /**\n * Transport driver type\n */\n driver?: \"smtp\";\n /**\n * Enable STARTTLS upgrade (alias for requireTLS)\n * Set to `true` for port 587\n */\n tls?: boolean;\n /**\n * SMTP authentication username\n * Convenience alias - can also use `auth.user`\n */\n username?: string;\n /**\n * SMTP authentication password\n * Convenience alias - can also use `auth.pass`\n */\n password?: string;\n /**\n * Default sender for all emails\n * Can be string (\"noreply@app.com\") or object ({ name, address })\n */\n from?: MailAddress;\n};\n\n/**\n * Named mailers configuration\n */\nexport type MailersConfig = {\n /**\n * Default mailer configuration\n */\n default?: MailConfigurations;\n /**\n * Named mailer configurations\n */\n mailers?: Record<string, MailConfigurations>;\n};\n\n/**\n * Mail result after sending\n */\nexport type MailResult = {\n success: boolean;\n messageId?: string;\n accepted: string[];\n rejected: string[];\n response?: string;\n envelope?: {\n from: string;\n to: string[];\n };\n};\n\n/**\n * Error codes for mail operations\n */\nexport type MailErrorCode =\n | \"CONNECTION_ERROR\"\n | \"AUTH_ERROR\"\n | \"RATE_LIMIT\"\n | \"INVALID_ADDRESS\"\n | \"REJECTED\"\n | \"TIMEOUT\"\n | \"RENDER_ERROR\"\n | \"CONFIG_ERROR\"\n | \"UNKNOWN\";\n\n/**\n * Mail event callbacks (per-mail)\n * For global events, use mailEvents.on() from events.ts\n */\nexport type MailEvents = {\n /**\n * Called before sending the email\n * Can be used to modify the mail or cancel sending\n */\n beforeSending?: (mail: MailOptions) => void | Promise<void> | false | Promise<false>;\n /**\n * Called after send attempt (success or failure)\n */\n onSent?: (\n mail: MailOptions,\n result: MailResult | null,\n error: MailError | null,\n ) => void | Promise<void>;\n /**\n * Called only on successful send\n */\n onSuccess?: (mail: MailOptions, result: MailResult) => void | Promise<void>;\n /**\n * Called only on error\n */\n onError?: (mail: MailOptions, error: MailError) => void | Promise<void>;\n};\n\n/**\n * Mail options for sending\n */\nexport type MailOptions = {\n /**\n * Unique mail ID for event namespacing\n * If not provided, one will be auto-generated\n *\n * Use this to subscribe to events for a specific mail:\n * ```typescript\n * const mailId = generateMailId();\n * mailEvents.onMailSuccess(mailId, (mail, result) => { ... });\n * await sendMail({ id: mailId, to: \"...\", subject: \"...\", html: \"...\" });\n * ```\n */\n id?: string;\n\n // Recipients\n to: string | string[];\n cc?: string | string[];\n bcc?: string | string[];\n replyTo?: string;\n\n // Content\n subject: string;\n html?: string;\n text?: string;\n component?: React.ReactElement;\n\n // Configuration\n config?: MailConfigurations;\n mailer?: string;\n from?: MailAddress;\n\n // Attachments\n attachments?: MailAttachment[];\n\n // Options\n priority?: MailPriority;\n headers?: Record<string, string>;\n tags?: string[];\n\n // Meta\n correlationId?: string;\n} & MailEvents;\n\n/**\n * Internal normalized mail data\n */\nexport type NormalizedMail = {\n to: string[];\n cc: string[];\n bcc: string[];\n replyTo?: string;\n from: MailAddress;\n subject: string;\n html?: string;\n text?: string;\n attachments: MailAttachment[];\n priority: MailPriority;\n headers: Record<string, string>;\n tags: string[];\n correlationId?: string;\n config: MailConfigurations;\n};\n\n/**\n * Captured mail for development and test modes.\n *\n * Attachments retain their normalized contents so test assertions can inspect\n * the exact mail that would be sent.\n */\nexport type CapturedMail = {\n /** The mail ID used for event namespacing and result correlation. */\n id: string;\n options: MailOptions;\n normalized: NormalizedMail;\n timestamp: Date;\n result?: MailResult;\n error?: MailError;\n};\n\n/**\n * Mail error class\n */\nexport class MailError extends Error {\n public readonly code: MailErrorCode;\n public readonly originalError?: Error;\n\n public constructor(message: string, code: MailErrorCode, originalError?: Error) {\n super(message);\n this.name = \"MailError\";\n this.code = code;\n this.originalError = originalError;\n }\n}\n"],"mappings":";;;;AAmTA,IAAa,YAAb,cAA+B,MAAM;CAInC,AAAO,YAAY,SAAiB,MAAqB,eAAuB;EAC9E,MAAM,OAAO;EACb,KAAK,OAAO;EACZ,KAAK,OAAO;EACZ,KAAK,gBAAgB;CACvB;AACF"}
@@ -2,7 +2,7 @@ import { warlockPath } from "../utils/paths.mjs";
2
2
  import "../utils/index.mjs";
3
3
  import { getJsonFileAsync, putJsonFileAsync, unlinkAsync } from "@warlock.js/fs";
4
4
 
5
- //#region ../core/src/manifest/manifest-manager.ts
5
+ //#region ../../packages/core/src/manifest/manifest-manager.ts
6
6
  var ManifestManager = class {
7
7
  constructor() {
8
8
  this._hasChanges = false;
@@ -1 +1 @@
1
- {"version":3,"file":"manifest-manager.mjs","names":[],"sources":["../../../../../../../core/src/manifest/manifest-manager.ts"],"sourcesContent":["import { getJsonFileAsync, putJsonFileAsync, unlinkAsync } from \"@warlock.js/fs\";\nimport { warlockPath } from \"../utils\";\n\n/**\n * Stored option metadata in manifest\n */\nexport type ManifestCommandOption = {\n name: string;\n text: string;\n alias?: string;\n description?: string;\n type?: \"string\" | \"boolean\" | \"number\";\n required?: boolean;\n defaultValue?: string | boolean | number;\n};\n\n/**\n * Command metadata stored in commands.json\n */\nexport type ManifestCommandData = {\n relativePath?: string;\n source: \"framework\" | \"plugin\" | \"project\";\n description?: string;\n alias?: string;\n options?: ManifestCommandOption[];\n};\n\ntype ManifestCommandsJson = {\n commands: Record<string, ManifestCommandData>;\n};\n\nexport class ManifestManager {\n /**\n * commands json\n */\n protected _commandsJson?: ManifestCommandsJson;\n\n /**\n * Check if commands json is changed\n */\n protected _hasChanges = false;\n\n /**\n * Whether commands json is loaded\n */\n protected _isLoaded = false;\n\n /**\n * Get if commands json has changes\n */\n public get hasChanges() {\n return this._hasChanges;\n }\n\n /**\n * Check if commands json is loaded\n */\n public get isCommandLoaded() {\n return this._isLoaded;\n }\n\n /**\n * Load commands.json file\n */\n public async loadCommands(): Promise<ManifestCommandsJson | undefined> {\n // now try to locate it in .warlock folder\n if (this._isLoaded) return this._commandsJson;\n\n try {\n this._commandsJson = await getJsonFileAsync(warlockPath(\"commands.json\"));\n\n this._isLoaded = true;\n\n return this._commandsJson;\n } catch {\n return;\n }\n }\n\n /**\n * Get commands json content\n */\n public get commandsJson() {\n return this._commandsJson;\n }\n\n /**\n * Save commands in commands.json file\n */\n public async saveCommands() {\n await putJsonFileAsync(warlockPath(\"commands.json\"), this._commandsJson);\n\n this._isLoaded = true;\n this._hasChanges = false;\n }\n\n /**\n * Add command info to commands list (But do not save commands)\n */\n public addCommandToList(name: string, command: ManifestCommandsJson[\"commands\"][string]) {\n if (!this._commandsJson) {\n this._commandsJson = {\n commands: {},\n };\n }\n\n this._commandsJson.commands[name] = command;\n\n this._hasChanges = true;\n }\n\n /**\n * Clear commands cache\n */\n public clearCommandsCache() {\n this._commandsJson = undefined;\n this._hasChanges = false;\n this._isLoaded = false;\n }\n\n /**\n * Remove commands.json file\n */\n public async removeCommandsFile() {\n try {\n await unlinkAsync(warlockPath(\"commands.json\"));\n } catch {\n // do nothing\n }\n }\n}\n\nexport const manifestManager = new ManifestManager();\n"],"mappings":";;;;;AA+BA,IAAa,kBAAb,MAA6B;;qBASH;mBAKF;;;;;CAKtB,IAAW,aAAa;EACtB,OAAO,KAAK;CACd;;;;CAKA,IAAW,kBAAkB;EAC3B,OAAO,KAAK;CACd;;;;CAKA,MAAa,eAA0D;EAErE,IAAI,KAAK,WAAW,OAAO,KAAK;EAEhC,IAAI;GACF,KAAK,gBAAgB,MAAM,iBAAiB,YAAY,eAAe,CAAC;GAExE,KAAK,YAAY;GAEjB,OAAO,KAAK;EACd,QAAQ;GACN;EACF;CACF;;;;CAKA,IAAW,eAAe;EACxB,OAAO,KAAK;CACd;;;;CAKA,MAAa,eAAe;EAC1B,MAAM,iBAAiB,YAAY,eAAe,GAAG,KAAK,aAAa;EAEvE,KAAK,YAAY;EACjB,KAAK,cAAc;CACrB;;;;CAKA,AAAO,iBAAiB,MAAc,SAAmD;EACvF,IAAI,CAAC,KAAK,eACR,KAAK,gBAAgB,EACnB,UAAU,CAAC,EACb;EAGF,KAAK,cAAc,SAAS,QAAQ;EAEpC,KAAK,cAAc;CACrB;;;;CAKA,AAAO,qBAAqB;EAC1B,KAAK,gBAAgB;EACrB,KAAK,cAAc;EACnB,KAAK,YAAY;CACnB;;;;CAKA,MAAa,qBAAqB;EAChC,IAAI;GACF,MAAM,YAAY,YAAY,eAAe,CAAC;EAChD,QAAQ,CAER;CACF;AACF;AAEA,MAAa,kBAAkB,IAAI,gBAAgB"}
1
+ {"version":3,"file":"manifest-manager.mjs","names":[],"sources":["../../../../../../../../packages/core/src/manifest/manifest-manager.ts"],"sourcesContent":["import { getJsonFileAsync, putJsonFileAsync, unlinkAsync } from \"@warlock.js/fs\";\nimport { warlockPath } from \"../utils\";\n\n/**\n * Stored option metadata in manifest\n */\nexport type ManifestCommandOption = {\n name: string;\n text: string;\n alias?: string;\n description?: string;\n type?: \"string\" | \"boolean\" | \"number\";\n required?: boolean;\n defaultValue?: string | boolean | number;\n};\n\n/**\n * Command metadata stored in commands.json\n */\nexport type ManifestCommandData = {\n relativePath?: string;\n source: \"framework\" | \"plugin\" | \"project\";\n description?: string;\n alias?: string;\n options?: ManifestCommandOption[];\n};\n\ntype ManifestCommandsJson = {\n commands: Record<string, ManifestCommandData>;\n};\n\nexport class ManifestManager {\n /**\n * commands json\n */\n protected _commandsJson?: ManifestCommandsJson;\n\n /**\n * Check if commands json is changed\n */\n protected _hasChanges = false;\n\n /**\n * Whether commands json is loaded\n */\n protected _isLoaded = false;\n\n /**\n * Get if commands json has changes\n */\n public get hasChanges() {\n return this._hasChanges;\n }\n\n /**\n * Check if commands json is loaded\n */\n public get isCommandLoaded() {\n return this._isLoaded;\n }\n\n /**\n * Load commands.json file\n */\n public async loadCommands(): Promise<ManifestCommandsJson | undefined> {\n // now try to locate it in .warlock folder\n if (this._isLoaded) return this._commandsJson;\n\n try {\n this._commandsJson = await getJsonFileAsync(warlockPath(\"commands.json\"));\n\n this._isLoaded = true;\n\n return this._commandsJson;\n } catch {\n return;\n }\n }\n\n /**\n * Get commands json content\n */\n public get commandsJson() {\n return this._commandsJson;\n }\n\n /**\n * Save commands in commands.json file\n */\n public async saveCommands() {\n await putJsonFileAsync(warlockPath(\"commands.json\"), this._commandsJson);\n\n this._isLoaded = true;\n this._hasChanges = false;\n }\n\n /**\n * Add command info to commands list (But do not save commands)\n */\n public addCommandToList(name: string, command: ManifestCommandsJson[\"commands\"][string]) {\n if (!this._commandsJson) {\n this._commandsJson = {\n commands: {},\n };\n }\n\n this._commandsJson.commands[name] = command;\n\n this._hasChanges = true;\n }\n\n /**\n * Clear commands cache\n */\n public clearCommandsCache() {\n this._commandsJson = undefined;\n this._hasChanges = false;\n this._isLoaded = false;\n }\n\n /**\n * Remove commands.json file\n */\n public async removeCommandsFile() {\n try {\n await unlinkAsync(warlockPath(\"commands.json\"));\n } catch {\n // do nothing\n }\n }\n}\n\nexport const manifestManager = new ManifestManager();\n"],"mappings":";;;;;AA+BA,IAAa,kBAAb,MAA6B;;qBASH;mBAKF;;;;;CAKtB,IAAW,aAAa;EACtB,OAAO,KAAK;CACd;;;;CAKA,IAAW,kBAAkB;EAC3B,OAAO,KAAK;CACd;;;;CAKA,MAAa,eAA0D;EAErE,IAAI,KAAK,WAAW,OAAO,KAAK;EAEhC,IAAI;GACF,KAAK,gBAAgB,MAAM,iBAAiB,YAAY,eAAe,CAAC;GAExE,KAAK,YAAY;GAEjB,OAAO,KAAK;EACd,QAAQ;GACN;EACF;CACF;;;;CAKA,IAAW,eAAe;EACxB,OAAO,KAAK;CACd;;;;CAKA,MAAa,eAAe;EAC1B,MAAM,iBAAiB,YAAY,eAAe,GAAG,KAAK,aAAa;EAEvE,KAAK,YAAY;EACjB,KAAK,cAAc;CACrB;;;;CAKA,AAAO,iBAAiB,MAAc,SAAmD;EACvF,IAAI,CAAC,KAAK,eACR,KAAK,gBAAgB,EACnB,UAAU,CAAC,EACb;EAGF,KAAK,cAAc,SAAS,QAAQ;EAEpC,KAAK,cAAc;CACrB;;;;CAKA,AAAO,qBAAqB;EAC1B,KAAK,gBAAgB;EACrB,KAAK,cAAc;EACnB,KAAK,YAAY;CACnB;;;;CAKA,MAAa,qBAAqB;EAChC,IAAI;GACF,MAAM,YAAY,YAAY,eAAe,CAAC;EAChD,QAAQ,CAER;CACF;AACF;AAEA,MAAa,kBAAkB,IAAI,gBAAgB"}
@@ -1,6 +1,6 @@
1
1
  import { OpenApiBuildResult, OpenApiContext, OpenApiRouteInput } from "./types.mjs";
2
2
 
3
- //#region ../core/src/openapi/build-openapi-document.d.ts
3
+ //#region ../../packages/core/src/openapi/build-openapi-document.d.ts
4
4
  /** `jsonSchemaDialect` of every document: OpenAPI 3.1 schemas are JSON Schema 2020-12. */
5
5
  declare const OPENAPI_JSON_SCHEMA_DIALECT = "https://json-schema.org/draft/2020-12/schema";
6
6
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"build-openapi-document.d.mts","names":[],"sources":["../../../../../../../core/src/openapi/build-openapi-document.ts"],"mappings":";;;;cA2Ba,2BAAA;AAAb;;;;AAAwC;AA8BxC;;;AA9BA,iBA8BgB,oBAAA,CACd,MAAA,WAAiB,iBAAA,IACjB,OAAA,EAAS,cAAA,GACR,kBAAA"}
1
+ {"version":3,"file":"build-openapi-document.d.mts","names":[],"sources":["../../../../../../../../packages/core/src/openapi/build-openapi-document.ts"],"mappings":";;;;cA2Ba,2BAAA;AAAb;;;;AAAwC;AA8BxC;;;AA9BA,iBA8BgB,oBAAA,CACd,MAAA,WAAiB,iBAAA,IACjB,OAAA,EAAS,cAAA,GACR,kBAAA"}
@@ -5,7 +5,7 @@ import { buildRequestParts } from "./request-schemas.mjs";
5
5
  import { SchemaRegistry } from "./schema-registry.mjs";
6
6
  import { SecuritySchemes, readRouteAuth } from "./security.mjs";
7
7
 
8
- //#region ../core/src/openapi/build-openapi-document.ts
8
+ //#region ../../packages/core/src/openapi/build-openapi-document.ts
9
9
  /** `jsonSchemaDialect` of every document: OpenAPI 3.1 schemas are JSON Schema 2020-12. */
10
10
  const OPENAPI_JSON_SCHEMA_DIALECT = "https://json-schema.org/draft/2020-12/schema";
11
11
  const UNSAFE_METHODS = [
@@ -1 +1 @@
1
- {"version":3,"file":"build-openapi-document.mjs","names":[],"sources":["../../../../../../../core/src/openapi/build-openapi-document.ts"],"sourcesContent":["import {\n buildUnauthorizedResponse,\n buildValidationFailedResponse,\n resolveValidationResponse,\n} from \"./error-responses\";\nimport {\n buildOperationId,\n expandMethods,\n firstSegmentTag,\n toOpenApiPath,\n type OpenApiMethod,\n} from \"./paths\";\nimport { buildRequestParts } from \"./request-schemas\";\nimport { buildDeclaredResponses } from \"./response-schemas\";\nimport { SchemaRegistry } from \"./schema-registry\";\nimport { readRouteAuth, SecuritySchemes } from \"./security\";\nimport type {\n AuthDescriptor,\n OpenApiBuildResult,\n OpenApiContext,\n OpenApiDocument,\n OpenApiOperation,\n OpenApiResponse,\n OpenApiRouteInput,\n} from \"./types\";\n\n/** `jsonSchemaDialect` of every document: OpenAPI 3.1 schemas are JSON Schema 2020-12. */\nexport const OPENAPI_JSON_SCHEMA_DIALECT = \"https://json-schema.org/draft/2020-12/schema\";\n\nconst UNSAFE_METHODS: readonly OpenApiMethod[] = [\"post\", \"put\", \"patch\", \"delete\"];\n\nfunction describeAuth(auth: AuthDescriptor, method: OpenApiMethod): string[] {\n const lines: string[] = [];\n\n if (auth.userTypes.length > 0) {\n lines.push(`Requires an authenticated user of type: ${auth.userTypes.join(\", \")}.`);\n }\n\n const usesCookie = auth.sources.some((source) => typeof source !== \"string\");\n\n if (usesCookie && UNSAFE_METHODS.includes(method)) {\n lines.push(\n \"When authenticating with the cookie, the request must also carry a same-origin Origin or Referer header (CSRF guard).\",\n );\n }\n\n return lines;\n}\n\n/**\n * Build an OpenAPI 3.1 document from registered routes.\n *\n * Pure: it reads the routes it is given (`router.list()` in the app), converts Seal schemas\n * with `toJsonSchema(\"draft-2020-12\")` and returns plain JSON plus the gaps it found as\n * `warnings`. It never throws for a single route it cannot document; that route is\n * documented as far as possible and a warning explains what was left out.\n */\nexport function buildOpenApiDocument(\n routes: readonly OpenApiRouteInput[],\n context: OpenApiContext,\n): OpenApiBuildResult {\n const warnings: string[] = [];\n const registry = new SchemaRegistry(context.resolveResourceName, (message) => warnings.push(message));\n const security = new SecuritySchemes();\n const validationShape = resolveValidationResponse(context.validationResponse);\n const paths: OpenApiDocument[\"paths\"] = {};\n const tags = new Set<string>();\n const operationIds = new Set<string>();\n\n for (const route of routes) {\n if (route.isPage && !context.includePages) {\n continue;\n }\n\n const methods = expandMethods(route.method);\n const label = `${String(route.method).toUpperCase()} ${route.path}`;\n const warn = (message: string) => warnings.push(`${label}: ${message}`);\n\n if (methods.length === 0) {\n warn(`unsupported method \"${String(route.method)}\", route skipped.`);\n\n continue;\n }\n\n const handler = route.handler as OpenApiRouteInput[\"handler\"] | undefined;\n const validation = handler?.validation;\n const auth = readRouteAuth(route.middleware, warn);\n const tag = firstSegmentTag(route.path);\n const pathKey = toOpenApiPath(route.path);\n\n if (validation?.validate) {\n warn(\"validation.validate is custom middleware and is not documented.\");\n }\n\n for (const method of methods) {\n paths[pathKey] ??= {};\n\n if (paths[pathKey][method]) {\n warn(`${method.toUpperCase()} ${pathKey} is already documented by an earlier route; this one is skipped.`);\n\n continue;\n }\n\n let operationId = buildOperationId(route.name, method, route.path, methods.length > 1);\n\n if (operationIds.has(operationId)) {\n let suffix = 2;\n\n while (operationIds.has(`${operationId}_${suffix}`)) {\n suffix++;\n }\n\n warn(`operationId \"${operationId}\" is already used; renamed to \"${operationId}_${suffix}\".`);\n operationId = `${operationId}_${suffix}`;\n }\n\n operationIds.add(operationId);\n\n const description = [\n route.description ?? handler?.description,\n ...(auth ? describeAuth(auth, method) : []),\n ].filter((line): line is string => typeof line === \"string\" && line.length > 0);\n\n const request = buildRequestParts({ method, path: route.path, validation, warn });\n\n const responses: Record<string, OpenApiResponse> = route.isPage\n ? { \"200\": { description: \"HTML page\", content: { \"text/html\": { schema: { type: \"string\" } } } } }\n : buildDeclaredResponses(handler?.responseSchema, registry, warn);\n\n if (!Object.keys(responses).some((status) => status.startsWith(\"2\"))) {\n responses[\"200\"] = { description: \"Successful response\" };\n }\n\n if (validation?.schema) {\n const failed = buildValidationFailedResponse(validationShape, registry);\n\n responses[failed.status] ??= failed.response;\n }\n\n if (auth) {\n responses[\"401\"] ??= buildUnauthorizedResponse(registry);\n }\n\n if (tag) {\n tags.add(tag);\n }\n\n // Built in reading order: identity, prose, inputs, outputs, security.\n const operation: OpenApiOperation = {\n operationId,\n ...(route.label ? { summary: route.label } : {}),\n ...(description.length > 0 ? { description: description.join(\"\\n\\n\") } : {}),\n ...(tag ? { tags: [tag] } : {}),\n ...(request.parameters.length > 0 ? { parameters: request.parameters } : {}),\n ...(request.requestBody ? { requestBody: request.requestBody } : {}),\n responses: sortResponses(responses),\n ...(auth ? { security: security.requirementsFor(auth) } : {}),\n };\n\n paths[pathKey][method] = operation;\n }\n }\n\n // Keys in reading order: header, servers, tags, paths, components.\n const document: OpenApiDocument = {\n openapi: \"3.1.0\",\n jsonSchemaDialect: OPENAPI_JSON_SCHEMA_DIALECT,\n info: { ...context.info },\n ...(context.servers && context.servers.length > 0\n ? { servers: context.servers.map((url) => ({ url })) }\n : {}),\n ...(tags.size > 0 ? { tags: [...tags].sort().map((name) => ({ name })) } : {}),\n paths,\n };\n\n const hasSchemas = Object.keys(registry.schemas).length > 0;\n\n if (hasSchemas || security.hasSchemes()) {\n document.components = {};\n\n if (hasSchemas) {\n document.components.schemas = registry.schemas;\n }\n\n if (security.hasSchemes()) {\n document.components.securitySchemes = security.schemes;\n }\n }\n\n return { document, warnings: [...new Set(warnings)] };\n}\n\nfunction sortResponses(responses: Record<string, OpenApiResponse>): Record<string, OpenApiResponse> {\n return Object.fromEntries(\n Object.entries(responses).sort(([first], [second]) => first.localeCompare(second)),\n );\n}\n"],"mappings":";;;;;;;;;AA2BA,MAAa,8BAA8B;AAE3C,MAAM,iBAA2C;CAAC;CAAQ;CAAO;CAAS;AAAQ;AAElF,SAAS,aAAa,MAAsB,QAAiC;CAC3E,MAAM,QAAkB,CAAC;CAEzB,IAAI,KAAK,UAAU,SAAS,GAC1B,MAAM,KAAK,2CAA2C,KAAK,UAAU,KAAK,IAAI,EAAE,EAAE;CAKpF,IAFmB,KAAK,QAAQ,MAAM,WAAW,OAAO,WAAW,QAEtD,KAAK,eAAe,SAAS,MAAM,GAC9C,MAAM,KACJ,uHACF;CAGF,OAAO;AACT;;;;;;;;;AAUA,SAAgB,qBACd,QACA,SACoB;CACpB,MAAM,WAAqB,CAAC;CAC5B,MAAM,WAAW,IAAI,eAAe,QAAQ,sBAAsB,YAAY,SAAS,KAAK,OAAO,CAAC;CACpG,MAAM,WAAW,IAAI,gBAAgB;CACrC,MAAM,kBAAkB,0BAA0B,QAAQ,kBAAkB;CAC5E,MAAM,QAAkC,CAAC;CACzC,MAAM,uBAAO,IAAI,IAAY;CAC7B,MAAM,+BAAe,IAAI,IAAY;CAErC,KAAK,MAAM,SAAS,QAAQ;EAC1B,IAAI,MAAM,UAAU,CAAC,QAAQ,cAC3B;EAGF,MAAM,UAAU,cAAc,MAAM,MAAM;EAC1C,MAAM,QAAQ,GAAG,OAAO,MAAM,MAAM,CAAC,CAAC,YAAY,EAAE,GAAG,MAAM;EAC7D,MAAM,QAAQ,YAAoB,SAAS,KAAK,GAAG,MAAM,IAAI,SAAS;EAEtE,IAAI,QAAQ,WAAW,GAAG;GACxB,KAAK,uBAAuB,OAAO,MAAM,MAAM,EAAE,kBAAkB;GAEnE;EACF;EAEA,MAAM,UAAU,MAAM;EACtB,MAAM,aAAa,SAAS;EAC5B,MAAM,OAAO,cAAc,MAAM,YAAY,IAAI;EACjD,MAAM,MAAM,gBAAgB,MAAM,IAAI;EACtC,MAAM,UAAU,cAAc,MAAM,IAAI;EAExC,IAAI,YAAY,UACd,KAAK,iEAAiE;EAGxE,KAAK,MAAM,UAAU,SAAS;GAC5B,MAAM,aAAa,CAAC;GAEpB,IAAI,MAAM,QAAQ,CAAC,SAAS;IAC1B,KAAK,GAAG,OAAO,YAAY,EAAE,GAAG,QAAQ,iEAAiE;IAEzG;GACF;GAEA,IAAI,cAAc,iBAAiB,MAAM,MAAM,QAAQ,MAAM,MAAM,QAAQ,SAAS,CAAC;GAErF,IAAI,aAAa,IAAI,WAAW,GAAG;IACjC,IAAI,SAAS;IAEb,OAAO,aAAa,IAAI,GAAG,YAAY,GAAG,QAAQ,GAChD;IAGF,KAAK,gBAAgB,YAAY,iCAAiC,YAAY,GAAG,OAAO,GAAG;IAC3F,cAAc,GAAG,YAAY,GAAG;GAClC;GAEA,aAAa,IAAI,WAAW;GAE5B,MAAM,cAAc,CAClB,MAAM,eAAe,SAAS,aAC9B,GAAI,OAAO,aAAa,MAAM,MAAM,IAAI,CAAC,CAC3C,CAAC,CAAC,QAAQ,SAAyB,OAAO,SAAS,YAAY,KAAK,SAAS,CAAC;GAE9E,MAAM,UAAU,kBAAkB;IAAE;IAAQ,MAAM,MAAM;IAAM;IAAY;GAAK,CAAC;GAEhF,MAAM,YAA6C,MAAM,SACrD,EAAE,OAAO;IAAE,aAAa;IAAa,SAAS,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,SAAS,EAAE,EAAE;GAAE,EAAE,IAChG,uBAAuB,SAAS,gBAAgB,UAAU,IAAI;GAElE,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,MAAM,WAAW,OAAO,WAAW,GAAG,CAAC,GACjE,UAAU,SAAS,EAAE,aAAa,sBAAsB;GAG1D,IAAI,YAAY,QAAQ;IACtB,MAAM,SAAS,8BAA8B,iBAAiB,QAAQ;IAEtE,UAAU,OAAO,YAAY,OAAO;GACtC;GAEA,IAAI,MACF,UAAU,WAAW,0BAA0B,QAAQ;GAGzD,IAAI,KACF,KAAK,IAAI,GAAG;GAId,MAAM,YAA8B;IAClC;IACA,GAAI,MAAM,QAAQ,EAAE,SAAS,MAAM,MAAM,IAAI,CAAC;IAC9C,GAAI,YAAY,SAAS,IAAI,EAAE,aAAa,YAAY,KAAK,MAAM,EAAE,IAAI,CAAC;IAC1E,GAAI,MAAM,EAAE,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC;IAC7B,GAAI,QAAQ,WAAW,SAAS,IAAI,EAAE,YAAY,QAAQ,WAAW,IAAI,CAAC;IAC1E,GAAI,QAAQ,cAAc,EAAE,aAAa,QAAQ,YAAY,IAAI,CAAC;IAClE,WAAW,cAAc,SAAS;IAClC,GAAI,OAAO,EAAE,UAAU,SAAS,gBAAgB,IAAI,EAAE,IAAI,CAAC;GAC7D;GAEA,MAAM,QAAQ,CAAC,UAAU;EAC3B;CACF;CAGA,MAAM,WAA4B;EAChC,SAAS;EACT,mBAAmB;EACnB,MAAM,EAAE,GAAG,QAAQ,KAAK;EACxB,GAAI,QAAQ,WAAW,QAAQ,QAAQ,SAAS,IAC5C,EAAE,SAAS,QAAQ,QAAQ,KAAK,SAAS,EAAE,IAAI,EAAE,EAAE,IACnD,CAAC;EACL,GAAI,KAAK,OAAO,IAAI,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,UAAU,EAAE,KAAK,EAAE,EAAE,IAAI,CAAC;EAC5E;CACF;CAEA,MAAM,aAAa,OAAO,KAAK,SAAS,OAAO,CAAC,CAAC,SAAS;CAE1D,IAAI,cAAc,SAAS,WAAW,GAAG;EACvC,SAAS,aAAa,CAAC;EAEvB,IAAI,YACF,SAAS,WAAW,UAAU,SAAS;EAGzC,IAAI,SAAS,WAAW,GACtB,SAAS,WAAW,kBAAkB,SAAS;CAEnD;CAEA,OAAO;EAAE;EAAU,UAAU,CAAC,GAAG,IAAI,IAAI,QAAQ,CAAC;CAAE;AACtD;AAEA,SAAS,cAAc,WAA6E;CAClG,OAAO,OAAO,YACZ,OAAO,QAAQ,SAAS,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,MAAM,cAAc,MAAM,CAAC,CACnF;AACF"}
1
+ {"version":3,"file":"build-openapi-document.mjs","names":[],"sources":["../../../../../../../../packages/core/src/openapi/build-openapi-document.ts"],"sourcesContent":["import {\n buildUnauthorizedResponse,\n buildValidationFailedResponse,\n resolveValidationResponse,\n} from \"./error-responses\";\nimport {\n buildOperationId,\n expandMethods,\n firstSegmentTag,\n toOpenApiPath,\n type OpenApiMethod,\n} from \"./paths\";\nimport { buildRequestParts } from \"./request-schemas\";\nimport { buildDeclaredResponses } from \"./response-schemas\";\nimport { SchemaRegistry } from \"./schema-registry\";\nimport { readRouteAuth, SecuritySchemes } from \"./security\";\nimport type {\n AuthDescriptor,\n OpenApiBuildResult,\n OpenApiContext,\n OpenApiDocument,\n OpenApiOperation,\n OpenApiResponse,\n OpenApiRouteInput,\n} from \"./types\";\n\n/** `jsonSchemaDialect` of every document: OpenAPI 3.1 schemas are JSON Schema 2020-12. */\nexport const OPENAPI_JSON_SCHEMA_DIALECT = \"https://json-schema.org/draft/2020-12/schema\";\n\nconst UNSAFE_METHODS: readonly OpenApiMethod[] = [\"post\", \"put\", \"patch\", \"delete\"];\n\nfunction describeAuth(auth: AuthDescriptor, method: OpenApiMethod): string[] {\n const lines: string[] = [];\n\n if (auth.userTypes.length > 0) {\n lines.push(`Requires an authenticated user of type: ${auth.userTypes.join(\", \")}.`);\n }\n\n const usesCookie = auth.sources.some((source) => typeof source !== \"string\");\n\n if (usesCookie && UNSAFE_METHODS.includes(method)) {\n lines.push(\n \"When authenticating with the cookie, the request must also carry a same-origin Origin or Referer header (CSRF guard).\",\n );\n }\n\n return lines;\n}\n\n/**\n * Build an OpenAPI 3.1 document from registered routes.\n *\n * Pure: it reads the routes it is given (`router.list()` in the app), converts Seal schemas\n * with `toJsonSchema(\"draft-2020-12\")` and returns plain JSON plus the gaps it found as\n * `warnings`. It never throws for a single route it cannot document; that route is\n * documented as far as possible and a warning explains what was left out.\n */\nexport function buildOpenApiDocument(\n routes: readonly OpenApiRouteInput[],\n context: OpenApiContext,\n): OpenApiBuildResult {\n const warnings: string[] = [];\n const registry = new SchemaRegistry(context.resolveResourceName, (message) => warnings.push(message));\n const security = new SecuritySchemes();\n const validationShape = resolveValidationResponse(context.validationResponse);\n const paths: OpenApiDocument[\"paths\"] = {};\n const tags = new Set<string>();\n const operationIds = new Set<string>();\n\n for (const route of routes) {\n if (route.isPage && !context.includePages) {\n continue;\n }\n\n const methods = expandMethods(route.method);\n const label = `${String(route.method).toUpperCase()} ${route.path}`;\n const warn = (message: string) => warnings.push(`${label}: ${message}`);\n\n if (methods.length === 0) {\n warn(`unsupported method \"${String(route.method)}\", route skipped.`);\n\n continue;\n }\n\n const handler = route.handler as OpenApiRouteInput[\"handler\"] | undefined;\n const validation = handler?.validation;\n const auth = readRouteAuth(route.middleware, warn);\n const tag = firstSegmentTag(route.path);\n const pathKey = toOpenApiPath(route.path);\n\n if (validation?.validate) {\n warn(\"validation.validate is custom middleware and is not documented.\");\n }\n\n for (const method of methods) {\n paths[pathKey] ??= {};\n\n if (paths[pathKey][method]) {\n warn(`${method.toUpperCase()} ${pathKey} is already documented by an earlier route; this one is skipped.`);\n\n continue;\n }\n\n let operationId = buildOperationId(route.name, method, route.path, methods.length > 1);\n\n if (operationIds.has(operationId)) {\n let suffix = 2;\n\n while (operationIds.has(`${operationId}_${suffix}`)) {\n suffix++;\n }\n\n warn(`operationId \"${operationId}\" is already used; renamed to \"${operationId}_${suffix}\".`);\n operationId = `${operationId}_${suffix}`;\n }\n\n operationIds.add(operationId);\n\n const description = [\n route.description ?? handler?.description,\n ...(auth ? describeAuth(auth, method) : []),\n ].filter((line): line is string => typeof line === \"string\" && line.length > 0);\n\n const request = buildRequestParts({ method, path: route.path, validation, warn });\n\n const responses: Record<string, OpenApiResponse> = route.isPage\n ? { \"200\": { description: \"HTML page\", content: { \"text/html\": { schema: { type: \"string\" } } } } }\n : buildDeclaredResponses(handler?.responseSchema, registry, warn);\n\n if (!Object.keys(responses).some((status) => status.startsWith(\"2\"))) {\n responses[\"200\"] = { description: \"Successful response\" };\n }\n\n if (validation?.schema) {\n const failed = buildValidationFailedResponse(validationShape, registry);\n\n responses[failed.status] ??= failed.response;\n }\n\n if (auth) {\n responses[\"401\"] ??= buildUnauthorizedResponse(registry);\n }\n\n if (tag) {\n tags.add(tag);\n }\n\n // Built in reading order: identity, prose, inputs, outputs, security.\n const operation: OpenApiOperation = {\n operationId,\n ...(route.label ? { summary: route.label } : {}),\n ...(description.length > 0 ? { description: description.join(\"\\n\\n\") } : {}),\n ...(tag ? { tags: [tag] } : {}),\n ...(request.parameters.length > 0 ? { parameters: request.parameters } : {}),\n ...(request.requestBody ? { requestBody: request.requestBody } : {}),\n responses: sortResponses(responses),\n ...(auth ? { security: security.requirementsFor(auth) } : {}),\n };\n\n paths[pathKey][method] = operation;\n }\n }\n\n // Keys in reading order: header, servers, tags, paths, components.\n const document: OpenApiDocument = {\n openapi: \"3.1.0\",\n jsonSchemaDialect: OPENAPI_JSON_SCHEMA_DIALECT,\n info: { ...context.info },\n ...(context.servers && context.servers.length > 0\n ? { servers: context.servers.map((url) => ({ url })) }\n : {}),\n ...(tags.size > 0 ? { tags: [...tags].sort().map((name) => ({ name })) } : {}),\n paths,\n };\n\n const hasSchemas = Object.keys(registry.schemas).length > 0;\n\n if (hasSchemas || security.hasSchemes()) {\n document.components = {};\n\n if (hasSchemas) {\n document.components.schemas = registry.schemas;\n }\n\n if (security.hasSchemes()) {\n document.components.securitySchemes = security.schemes;\n }\n }\n\n return { document, warnings: [...new Set(warnings)] };\n}\n\nfunction sortResponses(responses: Record<string, OpenApiResponse>): Record<string, OpenApiResponse> {\n return Object.fromEntries(\n Object.entries(responses).sort(([first], [second]) => first.localeCompare(second)),\n );\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- //#region ../core/src/openapi/cast-schema.ts
1
+ //#region ../../packages/core/src/openapi/cast-schema.ts
2
2
  /**
3
3
  * JSON Schema of the DEFAULT date output of a resource field (`iso`, `format`, `timestamp`
4
4
  * and `humanTime` on; `timezone`, `locale` and `offset` off), matching `BaseCastOutput<"date">`.
@@ -1 +1 @@
1
- {"version":3,"file":"cast-schema.mjs","names":[],"sources":["../../../../../../../core/src/openapi/cast-schema.ts"],"sourcesContent":["import type { OpenApiSchema } from \"./types\";\n\n/**\n * JSON Schema of the DEFAULT date output of a resource field (`iso`, `format`, `timestamp`\n * and `humanTime` on; `timezone`, `locale` and `offset` off), matching `BaseCastOutput<\"date\">`.\n */\nconst DEFAULT_DATE_SCHEMA: OpenApiSchema = {\n type: \"object\",\n properties: {\n iso: { type: \"string\", format: \"date-time\" },\n format: { type: \"string\" },\n timestamp: { type: \"number\" },\n humanTime: { type: \"string\" },\n },\n required: [\"iso\", \"format\", \"timestamp\", \"humanTime\"],\n};\n\nfunction baseCastSchema(base: string): OpenApiSchema | undefined {\n switch (base) {\n case \"string\":\n case \"localized\":\n return { type: \"string\" };\n case \"url\":\n case \"uploadsUrl\":\n case \"storageUrl\":\n return { type: \"string\", format: \"uri\" };\n case \"number\":\n case \"float\":\n return { type: \"number\" };\n case \"int\":\n return { type: \"integer\" };\n case \"boolean\":\n return { type: \"boolean\" };\n case \"object\":\n return { type: \"object\" };\n case \"array\":\n return { type: \"array\" };\n case \"date\":\n return structuredClone(DEFAULT_DATE_SCHEMA);\n default:\n return undefined;\n }\n}\n\n/**\n * Make a schema accept `null` too, the 3.1 way: `type: [T, \"null\"]`. A schema without a plain\n * `type` (a `$ref`, `{}`) is wrapped in `anyOf` with `{ type: \"null\" }`.\n */\nexport function makeNullable(schema: OpenApiSchema): OpenApiSchema {\n if (typeof schema.type === \"string\") {\n return { ...schema, type: [schema.type, \"null\"] };\n }\n\n if (Array.isArray(schema.type)) {\n return schema.type.includes(\"null\") ? schema : { ...schema, type: [...schema.type, \"null\"] };\n }\n\n return { anyOf: [schema, { type: \"null\" }] };\n}\n\n/**\n * JSON Schema of a resource cast string, suffixes included (`\"string\"`, `\"number?\"`,\n * `\"string[]\"`, `\"date[]?\"`). `?` means \"always present, value or null\"; `[]` wraps the base\n * in an array, and with `?` it is the array that may be null.\n *\n * @returns `undefined` for a cast this mapper does not know.\n */\nexport function castToJsonSchema(cast: string): OpenApiSchema | undefined {\n let base = cast;\n let nullable = false;\n let isArray = false;\n\n if (base.endsWith(\"?\")) {\n nullable = true;\n base = base.slice(0, -1);\n }\n\n if (base.endsWith(\"[]\")) {\n isArray = true;\n base = base.slice(0, -2);\n }\n\n const baseSchema = baseCastSchema(base);\n\n if (!baseSchema) {\n return undefined;\n }\n\n const shaped: OpenApiSchema = isArray ? { type: \"array\", items: baseSchema } : baseSchema;\n\n return nullable ? makeNullable(shaped) : shaped;\n}\n"],"mappings":";;;;;AAMA,MAAM,sBAAqC;CACzC,MAAM;CACN,YAAY;EACV,KAAK;GAAE,MAAM;GAAU,QAAQ;EAAY;EAC3C,QAAQ,EAAE,MAAM,SAAS;EACzB,WAAW,EAAE,MAAM,SAAS;EAC5B,WAAW,EAAE,MAAM,SAAS;CAC9B;CACA,UAAU;EAAC;EAAO;EAAU;EAAa;CAAW;AACtD;AAEA,SAAS,eAAe,MAAyC;CAC/D,QAAQ,MAAR;EACE,KAAK;EACL,KAAK,aACH,OAAO,EAAE,MAAM,SAAS;EAC1B,KAAK;EACL,KAAK;EACL,KAAK,cACH,OAAO;GAAE,MAAM;GAAU,QAAQ;EAAM;EACzC,KAAK;EACL,KAAK,SACH,OAAO,EAAE,MAAM,SAAS;EAC1B,KAAK,OACH,OAAO,EAAE,MAAM,UAAU;EAC3B,KAAK,WACH,OAAO,EAAE,MAAM,UAAU;EAC3B,KAAK,UACH,OAAO,EAAE,MAAM,SAAS;EAC1B,KAAK,SACH,OAAO,EAAE,MAAM,QAAQ;EACzB,KAAK,QACH,OAAO,gBAAgB,mBAAmB;EAC5C,SACE;CACJ;AACF;;;;;AAMA,SAAgB,aAAa,QAAsC;CACjE,IAAI,OAAO,OAAO,SAAS,UACzB,OAAO;EAAE,GAAG;EAAQ,MAAM,CAAC,OAAO,MAAM,MAAM;CAAE;CAGlD,IAAI,MAAM,QAAQ,OAAO,IAAI,GAC3B,OAAO,OAAO,KAAK,SAAS,MAAM,IAAI,SAAS;EAAE,GAAG;EAAQ,MAAM,CAAC,GAAG,OAAO,MAAM,MAAM;CAAE;CAG7F,OAAO,EAAE,OAAO,CAAC,QAAQ,EAAE,MAAM,OAAO,CAAC,EAAE;AAC7C;;;;;;;;AASA,SAAgB,iBAAiB,MAAyC;CACxE,IAAI,OAAO;CACX,IAAI,WAAW;CACf,IAAI,UAAU;CAEd,IAAI,KAAK,SAAS,GAAG,GAAG;EACtB,WAAW;EACX,OAAO,KAAK,MAAM,GAAG,EAAE;CACzB;CAEA,IAAI,KAAK,SAAS,IAAI,GAAG;EACvB,UAAU;EACV,OAAO,KAAK,MAAM,GAAG,EAAE;CACzB;CAEA,MAAM,aAAa,eAAe,IAAI;CAEtC,IAAI,CAAC,YACH;CAGF,MAAM,SAAwB,UAAU;EAAE,MAAM;EAAS,OAAO;CAAW,IAAI;CAE/E,OAAO,WAAW,aAAa,MAAM,IAAI;AAC3C"}
1
+ {"version":3,"file":"cast-schema.mjs","names":[],"sources":["../../../../../../../../packages/core/src/openapi/cast-schema.ts"],"sourcesContent":["import type { OpenApiSchema } from \"./types\";\n\n/**\n * JSON Schema of the DEFAULT date output of a resource field (`iso`, `format`, `timestamp`\n * and `humanTime` on; `timezone`, `locale` and `offset` off), matching `BaseCastOutput<\"date\">`.\n */\nconst DEFAULT_DATE_SCHEMA: OpenApiSchema = {\n type: \"object\",\n properties: {\n iso: { type: \"string\", format: \"date-time\" },\n format: { type: \"string\" },\n timestamp: { type: \"number\" },\n humanTime: { type: \"string\" },\n },\n required: [\"iso\", \"format\", \"timestamp\", \"humanTime\"],\n};\n\nfunction baseCastSchema(base: string): OpenApiSchema | undefined {\n switch (base) {\n case \"string\":\n case \"localized\":\n return { type: \"string\" };\n case \"url\":\n case \"uploadsUrl\":\n case \"storageUrl\":\n return { type: \"string\", format: \"uri\" };\n case \"number\":\n case \"float\":\n return { type: \"number\" };\n case \"int\":\n return { type: \"integer\" };\n case \"boolean\":\n return { type: \"boolean\" };\n case \"object\":\n return { type: \"object\" };\n case \"array\":\n return { type: \"array\" };\n case \"date\":\n return structuredClone(DEFAULT_DATE_SCHEMA);\n default:\n return undefined;\n }\n}\n\n/**\n * Make a schema accept `null` too, the 3.1 way: `type: [T, \"null\"]`. A schema without a plain\n * `type` (a `$ref`, `{}`) is wrapped in `anyOf` with `{ type: \"null\" }`.\n */\nexport function makeNullable(schema: OpenApiSchema): OpenApiSchema {\n if (typeof schema.type === \"string\") {\n return { ...schema, type: [schema.type, \"null\"] };\n }\n\n if (Array.isArray(schema.type)) {\n return schema.type.includes(\"null\") ? schema : { ...schema, type: [...schema.type, \"null\"] };\n }\n\n return { anyOf: [schema, { type: \"null\" }] };\n}\n\n/**\n * JSON Schema of a resource cast string, suffixes included (`\"string\"`, `\"number?\"`,\n * `\"string[]\"`, `\"date[]?\"`). `?` means \"always present, value or null\"; `[]` wraps the base\n * in an array, and with `?` it is the array that may be null.\n *\n * @returns `undefined` for a cast this mapper does not know.\n */\nexport function castToJsonSchema(cast: string): OpenApiSchema | undefined {\n let base = cast;\n let nullable = false;\n let isArray = false;\n\n if (base.endsWith(\"?\")) {\n nullable = true;\n base = base.slice(0, -1);\n }\n\n if (base.endsWith(\"[]\")) {\n isArray = true;\n base = base.slice(0, -2);\n }\n\n const baseSchema = baseCastSchema(base);\n\n if (!baseSchema) {\n return undefined;\n }\n\n const shaped: OpenApiSchema = isArray ? { type: \"array\", items: baseSchema } : baseSchema;\n\n return nullable ? makeNullable(shaped) : shaped;\n}\n"],"mappings":";;;;;AAMA,MAAM,sBAAqC;CACzC,MAAM;CACN,YAAY;EACV,KAAK;GAAE,MAAM;GAAU,QAAQ;EAAY;EAC3C,QAAQ,EAAE,MAAM,SAAS;EACzB,WAAW,EAAE,MAAM,SAAS;EAC5B,WAAW,EAAE,MAAM,SAAS;CAC9B;CACA,UAAU;EAAC;EAAO;EAAU;EAAa;CAAW;AACtD;AAEA,SAAS,eAAe,MAAyC;CAC/D,QAAQ,MAAR;EACE,KAAK;EACL,KAAK,aACH,OAAO,EAAE,MAAM,SAAS;EAC1B,KAAK;EACL,KAAK;EACL,KAAK,cACH,OAAO;GAAE,MAAM;GAAU,QAAQ;EAAM;EACzC,KAAK;EACL,KAAK,SACH,OAAO,EAAE,MAAM,SAAS;EAC1B,KAAK,OACH,OAAO,EAAE,MAAM,UAAU;EAC3B,KAAK,WACH,OAAO,EAAE,MAAM,UAAU;EAC3B,KAAK,UACH,OAAO,EAAE,MAAM,SAAS;EAC1B,KAAK,SACH,OAAO,EAAE,MAAM,QAAQ;EACzB,KAAK,QACH,OAAO,gBAAgB,mBAAmB;EAC5C,SACE;CACJ;AACF;;;;;AAMA,SAAgB,aAAa,QAAsC;CACjE,IAAI,OAAO,OAAO,SAAS,UACzB,OAAO;EAAE,GAAG;EAAQ,MAAM,CAAC,OAAO,MAAM,MAAM;CAAE;CAGlD,IAAI,MAAM,QAAQ,OAAO,IAAI,GAC3B,OAAO,OAAO,KAAK,SAAS,MAAM,IAAI,SAAS;EAAE,GAAG;EAAQ,MAAM,CAAC,GAAG,OAAO,MAAM,MAAM;CAAE;CAG7F,OAAO,EAAE,OAAO,CAAC,QAAQ,EAAE,MAAM,OAAO,CAAC,EAAE;AAC7C;;;;;;;;AASA,SAAgB,iBAAiB,MAAyC;CACxE,IAAI,OAAO;CACX,IAAI,WAAW;CACf,IAAI,UAAU;CAEd,IAAI,KAAK,SAAS,GAAG,GAAG;EACtB,WAAW;EACX,OAAO,KAAK,MAAM,GAAG,EAAE;CACzB;CAEA,IAAI,KAAK,SAAS,IAAI,GAAG;EACvB,UAAU;EACV,OAAO,KAAK,MAAM,GAAG,EAAE;CACzB;CAEA,MAAM,aAAa,eAAe,IAAI;CAEtC,IAAI,CAAC,YACH;CAGF,MAAM,SAAwB,UAAU;EAAE,MAAM;EAAS,OAAO;CAAW,IAAI;CAE/E,OAAO,WAAW,aAAa,MAAM,IAAI;AAC3C"}
@@ -1,7 +1,7 @@
1
1
  import { runRegistrationChild } from "../production/registration-child-runner.mjs";
2
2
  import { OPENAPI_RESULT_MESSAGE, parseOpenApiChildResult } from "./openapi-protocol.mjs";
3
3
 
4
- //#region ../core/src/openapi/collect-openapi-document.ts
4
+ //#region ../../packages/core/src/openapi/collect-openapi-document.ts
5
5
  /**
6
6
  * Build the app's OpenAPI document in a fresh process.
7
7
  *
@@ -1 +1 @@
1
- {"version":3,"file":"collect-openapi-document.mjs","names":[],"sources":["../../../../../../../core/src/openapi/collect-openapi-document.ts"],"sourcesContent":["import {\n runRegistrationChild,\n type RegistrationChildForker,\n} from \"../production/registration-child-runner\";\nimport type { Environment, RuntimeStrategy } from \"../utils/environment\";\nimport {\n OPENAPI_PROTOCOL_VERSION,\n OPENAPI_RESULT_MESSAGE,\n parseOpenApiChildResult,\n type OpenApiChildRequestOptions,\n type OpenApiChildResult,\n} from \"./openapi-protocol\";\n\nexport type CollectOpenApiDocumentOptions = Readonly<{\n cwd?: string;\n environment?: Environment;\n runtimeStrategy?: RuntimeStrategy;\n timeoutMs?: number;\n childEntry?: string;\n forkProcess?: RegistrationChildForker;\n title?: string;\n server?: string;\n includePages?: boolean;\n}>;\n\n/**\n * Build the app's OpenAPI document in a fresh process.\n *\n * Uses the same registration child as `warlock build` (it imports the route modules without\n * booting connectors) in OpenAPI mode: the document is built inside the child, where the Seal\n * schemas and resource classes live, and only the finished JSON crosses IPC.\n */\nexport function collectOpenApiDocument(\n options: CollectOpenApiDocumentOptions = {},\n): Promise<OpenApiChildResult> {\n const cwd = options.cwd ?? process.cwd();\n const openapi: OpenApiChildRequestOptions = {\n version: OPENAPI_PROTOCOL_VERSION,\n ...(options.title !== undefined ? { title: options.title } : {}),\n ...(options.server !== undefined ? { server: options.server } : {}),\n ...(options.includePages !== undefined ? { includePages: options.includePages } : {}),\n };\n\n return runRegistrationChild<OpenApiChildResult>({\n cwd,\n timeoutMs: options.timeoutMs,\n childEntry: options.childEntry,\n forkProcess: options.forkProcess,\n request: {\n version: 1,\n cwd,\n environment: options.environment,\n runtimeStrategy: options.runtimeStrategy,\n openapi,\n },\n resultMessageType: OPENAPI_RESULT_MESSAGE,\n resultNoun: \"document\",\n readResult: (message) => parseOpenApiChildResult(message.result),\n });\n}\n"],"mappings":";;;;;;;;;;;AAgCA,SAAgB,uBACd,UAAyC,CAAC,GACb;CAC7B,MAAM,MAAM,QAAQ,OAAO,QAAQ,IAAI;CACvC,MAAM,UAAsC;EAC1C;EACA,GAAI,QAAQ,UAAU,SAAY,EAAE,OAAO,QAAQ,MAAM,IAAI,CAAC;EAC9D,GAAI,QAAQ,WAAW,SAAY,EAAE,QAAQ,QAAQ,OAAO,IAAI,CAAC;EACjE,GAAI,QAAQ,iBAAiB,SAAY,EAAE,cAAc,QAAQ,aAAa,IAAI,CAAC;CACrF;CAEA,OAAO,qBAAyC;EAC9C;EACA,WAAW,QAAQ;EACnB,YAAY,QAAQ;EACpB,aAAa,QAAQ;EACrB,SAAS;GACP,SAAS;GACT;GACA,aAAa,QAAQ;GACrB,iBAAiB,QAAQ;GACzB;EACF;EACA,mBAAmB;EACnB,YAAY;EACZ,aAAa,YAAY,wBAAwB,QAAQ,MAAM;CACjE,CAAC;AACH"}
1
+ {"version":3,"file":"collect-openapi-document.mjs","names":[],"sources":["../../../../../../../../packages/core/src/openapi/collect-openapi-document.ts"],"sourcesContent":["import {\n runRegistrationChild,\n type RegistrationChildForker,\n} from \"../production/registration-child-runner\";\nimport type { Environment, RuntimeStrategy } from \"../utils/environment\";\nimport {\n OPENAPI_PROTOCOL_VERSION,\n OPENAPI_RESULT_MESSAGE,\n parseOpenApiChildResult,\n type OpenApiChildRequestOptions,\n type OpenApiChildResult,\n} from \"./openapi-protocol\";\n\nexport type CollectOpenApiDocumentOptions = Readonly<{\n cwd?: string;\n environment?: Environment;\n runtimeStrategy?: RuntimeStrategy;\n timeoutMs?: number;\n childEntry?: string;\n forkProcess?: RegistrationChildForker;\n title?: string;\n server?: string;\n includePages?: boolean;\n}>;\n\n/**\n * Build the app's OpenAPI document in a fresh process.\n *\n * Uses the same registration child as `warlock build` (it imports the route modules without\n * booting connectors) in OpenAPI mode: the document is built inside the child, where the Seal\n * schemas and resource classes live, and only the finished JSON crosses IPC.\n */\nexport function collectOpenApiDocument(\n options: CollectOpenApiDocumentOptions = {},\n): Promise<OpenApiChildResult> {\n const cwd = options.cwd ?? process.cwd();\n const openapi: OpenApiChildRequestOptions = {\n version: OPENAPI_PROTOCOL_VERSION,\n ...(options.title !== undefined ? { title: options.title } : {}),\n ...(options.server !== undefined ? { server: options.server } : {}),\n ...(options.includePages !== undefined ? { includePages: options.includePages } : {}),\n };\n\n return runRegistrationChild<OpenApiChildResult>({\n cwd,\n timeoutMs: options.timeoutMs,\n childEntry: options.childEntry,\n forkProcess: options.forkProcess,\n request: {\n version: 1,\n cwd,\n environment: options.environment,\n runtimeStrategy: options.runtimeStrategy,\n openapi,\n },\n resultMessageType: OPENAPI_RESULT_MESSAGE,\n resultNoun: \"document\",\n readResult: (message) => parseOpenApiChildResult(message.result),\n });\n}\n"],"mappings":";;;;;;;;;;;AAgCA,SAAgB,uBACd,UAAyC,CAAC,GACb;CAC7B,MAAM,MAAM,QAAQ,OAAO,QAAQ,IAAI;CACvC,MAAM,UAAsC;EAC1C;EACA,GAAI,QAAQ,UAAU,SAAY,EAAE,OAAO,QAAQ,MAAM,IAAI,CAAC;EAC9D,GAAI,QAAQ,WAAW,SAAY,EAAE,QAAQ,QAAQ,OAAO,IAAI,CAAC;EACjE,GAAI,QAAQ,iBAAiB,SAAY,EAAE,cAAc,QAAQ,aAAa,IAAI,CAAC;CACrF;CAEA,OAAO,qBAAyC;EAC9C;EACA,WAAW,QAAQ;EACnB,YAAY,QAAQ;EACpB,aAAa,QAAQ;EACrB,SAAS;GACP,SAAS;GACT;GACA,aAAa,QAAQ;GACrB,iBAAiB,QAAQ;GACzB;EACF;EACA,mBAAmB;EACnB,YAAY;EACZ,aAAa,YAAY,wBAAwB,QAAQ,MAAM;CACjE,CAAC;AACH"}
@@ -1,7 +1,7 @@
1
1
  import { PostmanCollection, PostmanCollectionOptions } from "./postman/postman-types.mjs";
2
2
  import { OpenApiBuildResult } from "./types.mjs";
3
3
 
4
- //#region ../core/src/openapi/development-openapi-provider.d.ts
4
+ //#region ../../packages/core/src/openapi/development-openapi-provider.d.ts
5
5
  type DevelopmentOpenApiProvider = () => Promise<OpenApiBuildResult>;
6
6
  type DevelopmentPostmanResult = {
7
7
  collection: PostmanCollection;
@@ -1 +1 @@
1
- {"version":3,"file":"development-openapi-provider.d.mts","names":[],"sources":["../../../../../../../core/src/openapi/development-openapi-provider.ts"],"mappings":";;;;KAIK,0BAAA,SAAmC,OAAO,CAAC,kBAAA;AAAA,KAEpC,wBAAA;EACV,UAAA,EAAY,iBAAiB;EAC7B,QAAA;AAAA;;AAJgE;AAElE;;iBAWgB,kCAAA,CAAmC,KAAiC,EAA1B,0BAA0B;;;;;iBAQ9D,6BAAA,IAAiC,OAAO,CAAC,kBAAA;AAjBrD;AASV;;;;AATU,iBAgCY,+BAAA,CACpB,OAAA,GAAS,wBAAA,GACR,OAAA,CAAQ,wBAAA"}
1
+ {"version":3,"file":"development-openapi-provider.d.mts","names":[],"sources":["../../../../../../../../packages/core/src/openapi/development-openapi-provider.ts"],"mappings":";;;;KAIK,0BAAA,SAAmC,OAAO,CAAC,kBAAA;AAAA,KAEpC,wBAAA;EACV,UAAA,EAAY,iBAAiB;EAC7B,QAAA;AAAA;;AAJgE;AAElE;;iBAWgB,kCAAA,CAAmC,KAAiC,EAA1B,0BAA0B;;;;;iBAQ9D,6BAAA,IAAiC,OAAO,CAAC,kBAAA;AAjBrD;AASV;;;;AATU,iBAgCY,+BAAA,CACpB,OAAA,GAAS,wBAAA,GACR,OAAA,CAAQ,wBAAA"}
@@ -1,6 +1,6 @@
1
1
  import { openApiToPostmanCollection } from "./postman/openapi-to-postman-collection.mjs";
2
2
 
3
- //#region ../core/src/openapi/development-openapi-provider.ts
3
+ //#region ../../packages/core/src/openapi/development-openapi-provider.ts
4
4
  let provider;
5
5
  /**
6
6
  * Called by the dev server at startup. The builder lives under `dev-server/`, so the
@@ -1 +1 @@
1
- {"version":3,"file":"development-openapi-provider.mjs","names":[],"sources":["../../../../../../../core/src/openapi/development-openapi-provider.ts"],"sourcesContent":["import { openApiToPostmanCollection } from \"./postman/openapi-to-postman-collection\";\nimport type { PostmanCollection, PostmanCollectionOptions } from \"./postman/postman-types\";\nimport type { OpenApiBuildResult } from \"./types\";\n\ntype DevelopmentOpenApiProvider = () => Promise<OpenApiBuildResult>;\n\nexport type DevelopmentPostmanResult = {\n collection: PostmanCollection;\n warnings: string[];\n};\n\nlet provider: DevelopmentOpenApiProvider | undefined;\n\n/**\n * Called by the dev server at startup. The builder lives under `dev-server/`, so the\n * production entry never reaches it; this registry is the only thing the root exports.\n */\nexport function registerDevelopmentOpenApiProvider(build: DevelopmentOpenApiProvider): void {\n provider = build;\n}\n\n/**\n * The OpenAPI document for the routes registered in this process, built by the dev\n * server's provider. Throws outside `warlock dev`, where no provider is registered.\n */\nexport async function getDevelopmentOpenApiDocument(): Promise<OpenApiBuildResult> {\n if (!provider) {\n throw new Error(\n \"No development OpenAPI provider is registered; the API docs are only available under `warlock dev`.\",\n );\n }\n\n return provider();\n}\n\n/**\n * The Postman collection (v2.1.0) for the routes registered in this process: the development\n * OpenAPI document run through `openApiToPostmanCollection`, so both always agree. Throws\n * outside `warlock dev`, like `getDevelopmentOpenApiDocument`.\n */\nexport async function getDevelopmentPostmanCollection(\n options: PostmanCollectionOptions = {},\n): Promise<DevelopmentPostmanResult> {\n const { document, warnings } = await getDevelopmentOpenApiDocument();\n\n return { collection: openApiToPostmanCollection(document, options), warnings };\n}\n"],"mappings":";;;AAWA,IAAI;;;;;AAMJ,SAAgB,mCAAmC,OAAyC;CAC1F,WAAW;AACb;;;;;AAMA,eAAsB,gCAA6D;CACjF,IAAI,CAAC,UACH,MAAM,IAAI,MACR,qGACF;CAGF,OAAO,SAAS;AAClB;;;;;;AAOA,eAAsB,gCACpB,UAAoC,CAAC,GACF;CACnC,MAAM,EAAE,UAAU,aAAa,MAAM,8BAA8B;CAEnE,OAAO;EAAE,YAAY,2BAA2B,UAAU,OAAO;EAAG;CAAS;AAC/E"}
1
+ {"version":3,"file":"development-openapi-provider.mjs","names":[],"sources":["../../../../../../../../packages/core/src/openapi/development-openapi-provider.ts"],"sourcesContent":["import { openApiToPostmanCollection } from \"./postman/openapi-to-postman-collection\";\nimport type { PostmanCollection, PostmanCollectionOptions } from \"./postman/postman-types\";\nimport type { OpenApiBuildResult } from \"./types\";\n\ntype DevelopmentOpenApiProvider = () => Promise<OpenApiBuildResult>;\n\nexport type DevelopmentPostmanResult = {\n collection: PostmanCollection;\n warnings: string[];\n};\n\nlet provider: DevelopmentOpenApiProvider | undefined;\n\n/**\n * Called by the dev server at startup. The builder lives under `dev-server/`, so the\n * production entry never reaches it; this registry is the only thing the root exports.\n */\nexport function registerDevelopmentOpenApiProvider(build: DevelopmentOpenApiProvider): void {\n provider = build;\n}\n\n/**\n * The OpenAPI document for the routes registered in this process, built by the dev\n * server's provider. Throws outside `warlock dev`, where no provider is registered.\n */\nexport async function getDevelopmentOpenApiDocument(): Promise<OpenApiBuildResult> {\n if (!provider) {\n throw new Error(\n \"No development OpenAPI provider is registered; the API docs are only available under `warlock dev`.\",\n );\n }\n\n return provider();\n}\n\n/**\n * The Postman collection (v2.1.0) for the routes registered in this process: the development\n * OpenAPI document run through `openApiToPostmanCollection`, so both always agree. Throws\n * outside `warlock dev`, like `getDevelopmentOpenApiDocument`.\n */\nexport async function getDevelopmentPostmanCollection(\n options: PostmanCollectionOptions = {},\n): Promise<DevelopmentPostmanResult> {\n const { document, warnings } = await getDevelopmentOpenApiDocument();\n\n return { collection: openApiToPostmanCollection(document, options), warnings };\n}\n"],"mappings":";;;AAWA,IAAI;;;;;AAMJ,SAAgB,mCAAmC,OAAyC;CAC1F,WAAW;AACb;;;;;AAMA,eAAsB,gCAA6D;CACjF,IAAI,CAAC,UACH,MAAM,IAAI,MACR,qGACF;CAGF,OAAO,SAAS;AAClB;;;;;;AAOA,eAAsB,gCACpB,UAAoC,CAAC,GACF;CACnC,MAAM,EAAE,UAAU,aAAa,MAAM,8BAA8B;CAEnE,OAAO;EAAE,YAAY,2BAA2B,UAAU,OAAO;EAAG;CAAS;AAC/E"}
@@ -1,6 +1,6 @@
1
1
  import { describeStatus } from "./response-schemas.mjs";
2
2
 
3
- //#region ../core/src/openapi/error-responses.ts
3
+ //#region ../../packages/core/src/openapi/error-responses.ts
4
4
  const DEFAULT_VALIDATION_RESPONSE = {
5
5
  errors: "errors",
6
6
  inputKey: "input",
@@ -1 +1 @@
1
- {"version":3,"file":"error-responses.mjs","names":[],"sources":["../../../../../../../core/src/openapi/error-responses.ts"],"sourcesContent":["import { describeStatus } from \"./response-schemas\";\nimport type { SchemaRegistry } from \"./schema-registry\";\nimport type { OpenApiResponse, OpenApiValidationResponseConfig } from \"./types\";\n\nconst DEFAULT_VALIDATION_RESPONSE = {\n errors: \"errors\",\n inputKey: \"input\",\n inputError: \"error\",\n status: 422,\n};\n\nexport type ValidationResponseShape = typeof DEFAULT_VALIDATION_RESPONSE;\n\n/**\n * The `validation.response` config over its documented defaults, as `Response.failedSchema`\n * reads it.\n */\nexport function resolveValidationResponse(\n config: OpenApiValidationResponseConfig | undefined,\n): ValidationResponseShape {\n const merged = { ...DEFAULT_VALIDATION_RESPONSE };\n\n if (typeof config?.errors === \"string\" && config.errors) {\n merged.errors = config.errors;\n }\n\n if (typeof config?.inputKey === \"string\" && config.inputKey) {\n merged.inputKey = config.inputKey;\n }\n\n if (typeof config?.inputError === \"string\" && config.inputError) {\n merged.inputError = config.inputError;\n }\n\n if (typeof config?.status === \"number\" && Number.isInteger(config.status)) {\n merged.status = config.status;\n }\n\n return merged;\n}\n\n/**\n * The failed-validation response: `{ [errors]: [{ [inputKey]: string, [inputError]: string }] }`\n * under the configured status. The body is a shared component, emitted once.\n */\nexport function buildValidationFailedResponse(\n shape: ValidationResponseShape,\n registry: SchemaRegistry,\n): { status: string; response: OpenApiResponse } {\n const ref = registry.shared(\"ValidationFailed\", {\n type: \"object\",\n properties: {\n [shape.errors]: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n [shape.inputKey]: { type: \"string\" },\n [shape.inputError]: { type: \"string\" },\n },\n required: [shape.inputKey, shape.inputError],\n },\n },\n },\n required: [shape.errors],\n });\n\n return {\n status: String(shape.status),\n response: {\n description: describeStatus(\"422\"),\n content: { \"application/json\": { schema: ref } },\n },\n };\n}\n\n/**\n * The 401 response of a guarded route: the conventional `{ error: string }` body.\n */\nexport function buildUnauthorizedResponse(registry: SchemaRegistry): OpenApiResponse {\n const ref = registry.shared(\"Unauthorized\", {\n type: \"object\",\n properties: { error: { type: \"string\" } },\n required: [\"error\"],\n });\n\n return {\n description: describeStatus(\"401\"),\n content: { \"application/json\": { schema: ref } },\n };\n}\n"],"mappings":";;;AAIA,MAAM,8BAA8B;CAClC,QAAQ;CACR,UAAU;CACV,YAAY;CACZ,QAAQ;AACV;;;;;AAQA,SAAgB,0BACd,QACyB;CACzB,MAAM,SAAS,EAAE,GAAG,4BAA4B;CAEhD,IAAI,OAAO,QAAQ,WAAW,YAAY,OAAO,QAC/C,OAAO,SAAS,OAAO;CAGzB,IAAI,OAAO,QAAQ,aAAa,YAAY,OAAO,UACjD,OAAO,WAAW,OAAO;CAG3B,IAAI,OAAO,QAAQ,eAAe,YAAY,OAAO,YACnD,OAAO,aAAa,OAAO;CAG7B,IAAI,OAAO,QAAQ,WAAW,YAAY,OAAO,UAAU,OAAO,MAAM,GACtE,OAAO,SAAS,OAAO;CAGzB,OAAO;AACT;;;;;AAMA,SAAgB,8BACd,OACA,UAC+C;CAC/C,MAAM,MAAM,SAAS,OAAO,oBAAoB;EAC9C,MAAM;EACN,YAAY,GACT,MAAM,SAAS;GACd,MAAM;GACN,OAAO;IACL,MAAM;IACN,YAAY;MACT,MAAM,WAAW,EAAE,MAAM,SAAS;MAClC,MAAM,aAAa,EAAE,MAAM,SAAS;IACvC;IACA,UAAU,CAAC,MAAM,UAAU,MAAM,UAAU;GAC7C;EACF,EACF;EACA,UAAU,CAAC,MAAM,MAAM;CACzB,CAAC;CAED,OAAO;EACL,QAAQ,OAAO,MAAM,MAAM;EAC3B,UAAU;GACR,aAAa,eAAe,KAAK;GACjC,SAAS,EAAE,oBAAoB,EAAE,QAAQ,IAAI,EAAE;EACjD;CACF;AACF;;;;AAKA,SAAgB,0BAA0B,UAA2C;CACnF,MAAM,MAAM,SAAS,OAAO,gBAAgB;EAC1C,MAAM;EACN,YAAY,EAAE,OAAO,EAAE,MAAM,SAAS,EAAE;EACxC,UAAU,CAAC,OAAO;CACpB,CAAC;CAED,OAAO;EACL,aAAa,eAAe,KAAK;EACjC,SAAS,EAAE,oBAAoB,EAAE,QAAQ,IAAI,EAAE;CACjD;AACF"}
1
+ {"version":3,"file":"error-responses.mjs","names":[],"sources":["../../../../../../../../packages/core/src/openapi/error-responses.ts"],"sourcesContent":["import { describeStatus } from \"./response-schemas\";\nimport type { SchemaRegistry } from \"./schema-registry\";\nimport type { OpenApiResponse, OpenApiValidationResponseConfig } from \"./types\";\n\nconst DEFAULT_VALIDATION_RESPONSE = {\n errors: \"errors\",\n inputKey: \"input\",\n inputError: \"error\",\n status: 422,\n};\n\nexport type ValidationResponseShape = typeof DEFAULT_VALIDATION_RESPONSE;\n\n/**\n * The `validation.response` config over its documented defaults, as `Response.failedSchema`\n * reads it.\n */\nexport function resolveValidationResponse(\n config: OpenApiValidationResponseConfig | undefined,\n): ValidationResponseShape {\n const merged = { ...DEFAULT_VALIDATION_RESPONSE };\n\n if (typeof config?.errors === \"string\" && config.errors) {\n merged.errors = config.errors;\n }\n\n if (typeof config?.inputKey === \"string\" && config.inputKey) {\n merged.inputKey = config.inputKey;\n }\n\n if (typeof config?.inputError === \"string\" && config.inputError) {\n merged.inputError = config.inputError;\n }\n\n if (typeof config?.status === \"number\" && Number.isInteger(config.status)) {\n merged.status = config.status;\n }\n\n return merged;\n}\n\n/**\n * The failed-validation response: `{ [errors]: [{ [inputKey]: string, [inputError]: string }] }`\n * under the configured status. The body is a shared component, emitted once.\n */\nexport function buildValidationFailedResponse(\n shape: ValidationResponseShape,\n registry: SchemaRegistry,\n): { status: string; response: OpenApiResponse } {\n const ref = registry.shared(\"ValidationFailed\", {\n type: \"object\",\n properties: {\n [shape.errors]: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n [shape.inputKey]: { type: \"string\" },\n [shape.inputError]: { type: \"string\" },\n },\n required: [shape.inputKey, shape.inputError],\n },\n },\n },\n required: [shape.errors],\n });\n\n return {\n status: String(shape.status),\n response: {\n description: describeStatus(\"422\"),\n content: { \"application/json\": { schema: ref } },\n },\n };\n}\n\n/**\n * The 401 response of a guarded route: the conventional `{ error: string }` body.\n */\nexport function buildUnauthorizedResponse(registry: SchemaRegistry): OpenApiResponse {\n const ref = registry.shared(\"Unauthorized\", {\n type: \"object\",\n properties: { error: { type: \"string\" } },\n required: [\"error\"],\n });\n\n return {\n description: describeStatus(\"401\"),\n content: { \"application/json\": { schema: ref } },\n };\n}\n"],"mappings":";;;AAIA,MAAM,8BAA8B;CAClC,QAAQ;CACR,UAAU;CACV,YAAY;CACZ,QAAQ;AACV;;;;;AAQA,SAAgB,0BACd,QACyB;CACzB,MAAM,SAAS,EAAE,GAAG,4BAA4B;CAEhD,IAAI,OAAO,QAAQ,WAAW,YAAY,OAAO,QAC/C,OAAO,SAAS,OAAO;CAGzB,IAAI,OAAO,QAAQ,aAAa,YAAY,OAAO,UACjD,OAAO,WAAW,OAAO;CAG3B,IAAI,OAAO,QAAQ,eAAe,YAAY,OAAO,YACnD,OAAO,aAAa,OAAO;CAG7B,IAAI,OAAO,QAAQ,WAAW,YAAY,OAAO,UAAU,OAAO,MAAM,GACtE,OAAO,SAAS,OAAO;CAGzB,OAAO;AACT;;;;;AAMA,SAAgB,8BACd,OACA,UAC+C;CAC/C,MAAM,MAAM,SAAS,OAAO,oBAAoB;EAC9C,MAAM;EACN,YAAY,GACT,MAAM,SAAS;GACd,MAAM;GACN,OAAO;IACL,MAAM;IACN,YAAY;MACT,MAAM,WAAW,EAAE,MAAM,SAAS;MAClC,MAAM,aAAa,EAAE,MAAM,SAAS;IACvC;IACA,UAAU,CAAC,MAAM,UAAU,MAAM,UAAU;GAC7C;EACF,EACF;EACA,UAAU,CAAC,MAAM,MAAM;CACzB,CAAC;CAED,OAAO;EACL,QAAQ,OAAO,MAAM,MAAM;EAC3B,UAAU;GACR,aAAa,eAAe,KAAK;GACjC,SAAS,EAAE,oBAAoB,EAAE,QAAQ,IAAI,EAAE;EACjD;CACF;AACF;;;;AAKA,SAAgB,0BAA0B,UAA2C;CACnF,MAAM,MAAM,SAAS,OAAO,gBAAgB;EAC1C,MAAM;EACN,YAAY,EAAE,OAAO,EAAE,MAAM,SAAS,EAAE;EACxC,UAAU,CAAC,OAAO;CACpB,CAAC;CAED,OAAO;EACL,aAAa,eAAe,KAAK;EACjC,SAAS,EAAE,oBAAoB,EAAE,QAAQ,IAAI,EAAE;CACjD;AACF"}
@@ -6,7 +6,7 @@ import config from "@mongez/config";
6
6
  import path from "node:path";
7
7
  import { readFile } from "node:fs/promises";
8
8
 
9
- //#region ../core/src/openapi/openapi-child-output.ts
9
+ //#region ../../packages/core/src/openapi/openapi-child-output.ts
10
10
  async function readAppPackage(cwd) {
11
11
  try {
12
12
  return JSON.parse(await readFile(path.join(cwd, "package.json"), "utf8"));
@@ -1 +1 @@
1
- {"version":3,"file":"openapi-child-output.mjs","names":[],"sources":["../../../../../../../core/src/openapi/openapi-child-output.ts"],"sourcesContent":["import config from \"@mongez/config\";\nimport { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { httpConfig } from \"../http/config\";\nimport {\n collectResourceExportMap,\n type ResourceSourceFile,\n} from \"../router/named-api-routes-with-responses\";\nimport { router } from \"../router/router\";\nimport { buildOpenApiDocument } from \"./build-openapi-document\";\nimport type { OpenApiChildRequestOptions } from \"./openapi-protocol\";\nimport type { OpenApiBuildResult, OpenApiValidationResponseConfig } from \"./types\";\n\nexport type BuildOpenApiForChildOptions = Readonly<{\n /** Application root (the child's cwd). */\n cwd: string;\n /** Every source file the orchestrator knows; `*.resource.ts(x)` ones are mapped to exports. */\n files: Iterable<ResourceSourceFile>;\n request: OpenApiChildRequestOptions;\n onWarn?: (message: string) => void;\n}>;\n\ntype AppPackage = { name?: unknown; version?: unknown; description?: unknown };\n\nasync function readAppPackage(cwd: string): Promise<AppPackage> {\n try {\n return JSON.parse(await readFile(path.join(cwd, \"package.json\"), \"utf8\")) as AppPackage;\n } catch {\n return {};\n }\n}\n\nfunction stringOr(value: unknown, fallback: string): string {\n return typeof value === \"string\" && value.length > 0 ? value : fallback;\n}\n\n/**\n * `http://<host>:<port>` from the `http` config. A wildcard bind address is not a place a\n * client can call, so it becomes `localhost`.\n */\nexport function resolveDefaultServer(): string {\n const host = stringOr(httpConfig(\"host\"), \"localhost\");\n const port = httpConfig(\"port\");\n const callable = host === \"0.0.0.0\" || host === \"::\" ? \"localhost\" : host;\n\n return `http://${callable}${typeof port === \"number\" || typeof port === \"string\" ? `:${port}` : \"\"}`;\n}\n\n/**\n * Build the OpenAPI document from the routes registered in THIS process.\n *\n * Runs inside the registration child, after the app's route modules are loaded and config is\n * available. Maps resource classes to their export names, reads `info` from the app\n * `package.json`, the server from the `http` config and the 422 shape from\n * `validation.response`.\n */\nexport async function buildOpenApiForChild(\n options: BuildOpenApiForChildOptions,\n): Promise<OpenApiBuildResult> {\n const routes = router.list();\n const declaresSchema = routes.some((route) => route.handler?.responseSchema);\n const resourceMap = declaresSchema\n ? await collectResourceExportMap(options.files, options.onWarn)\n : undefined;\n const pkg = await readAppPackage(options.cwd);\n const validationResponse = config.get(\n \"validation.response\",\n {},\n ) as OpenApiValidationResponseConfig;\n\n return buildOpenApiDocument(routes, {\n info: {\n title: options.request.title ?? stringOr(pkg.name, \"Warlock API\"),\n version: stringOr(pkg.version, \"0.0.0\"),\n ...(typeof pkg.description === \"string\" && pkg.description\n ? { description: pkg.description }\n : {}),\n },\n servers: [options.request.server ?? resolveDefaultServer()],\n includePages: options.request.includePages === true,\n resolveResourceName: (resource) => resourceMap?.get(resource)?.exportName,\n validationResponse,\n });\n}\n"],"mappings":";;;;;;;;;AAwBA,eAAe,eAAe,KAAkC;CAC9D,IAAI;EACF,OAAO,KAAK,MAAM,MAAM,SAAS,KAAK,KAAK,KAAK,cAAc,GAAG,MAAM,CAAC;CAC1E,QAAQ;EACN,OAAO,CAAC;CACV;AACF;AAEA,SAAS,SAAS,OAAgB,UAA0B;CAC1D,OAAO,OAAO,UAAU,YAAY,MAAM,SAAS,IAAI,QAAQ;AACjE;;;;;AAMA,SAAgB,uBAA+B;CAC7C,MAAM,OAAO,SAAS,WAAW,MAAM,GAAG,WAAW;CACrD,MAAM,OAAO,WAAW,MAAM;CAG9B,OAAO,UAFU,SAAS,aAAa,SAAS,OAAO,cAAc,OAEzC,OAAO,SAAS,YAAY,OAAO,SAAS,WAAW,IAAI,SAAS;AAClG;;;;;;;;;AAUA,eAAsB,qBACpB,SAC6B;CAC7B,MAAM,SAAS,OAAO,KAAK;CAE3B,MAAM,cADiB,OAAO,MAAM,UAAU,MAAM,SAAS,cAC5B,IAC7B,MAAM,yBAAyB,QAAQ,OAAO,QAAQ,MAAM,IAC5D;CACJ,MAAM,MAAM,MAAM,eAAe,QAAQ,GAAG;CAC5C,MAAM,qBAAqB,OAAO,IAChC,uBACA,CAAC,CACH;CAEA,OAAO,qBAAqB,QAAQ;EAClC,MAAM;GACJ,OAAO,QAAQ,QAAQ,SAAS,SAAS,IAAI,MAAM,aAAa;GAChE,SAAS,SAAS,IAAI,SAAS,OAAO;GACtC,GAAI,OAAO,IAAI,gBAAgB,YAAY,IAAI,cAC3C,EAAE,aAAa,IAAI,YAAY,IAC/B,CAAC;EACP;EACA,SAAS,CAAC,QAAQ,QAAQ,UAAU,qBAAqB,CAAC;EAC1D,cAAc,QAAQ,QAAQ,iBAAiB;EAC/C,sBAAsB,aAAa,aAAa,IAAI,QAAQ,CAAC,EAAE;EAC/D;CACF,CAAC;AACH"}
1
+ {"version":3,"file":"openapi-child-output.mjs","names":[],"sources":["../../../../../../../../packages/core/src/openapi/openapi-child-output.ts"],"sourcesContent":["import config from \"@mongez/config\";\nimport { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { httpConfig } from \"../http/config\";\nimport {\n collectResourceExportMap,\n type ResourceSourceFile,\n} from \"../router/named-api-routes-with-responses\";\nimport { router } from \"../router/router\";\nimport { buildOpenApiDocument } from \"./build-openapi-document\";\nimport type { OpenApiChildRequestOptions } from \"./openapi-protocol\";\nimport type { OpenApiBuildResult, OpenApiValidationResponseConfig } from \"./types\";\n\nexport type BuildOpenApiForChildOptions = Readonly<{\n /** Application root (the child's cwd). */\n cwd: string;\n /** Every source file the orchestrator knows; `*.resource.ts(x)` ones are mapped to exports. */\n files: Iterable<ResourceSourceFile>;\n request: OpenApiChildRequestOptions;\n onWarn?: (message: string) => void;\n}>;\n\ntype AppPackage = { name?: unknown; version?: unknown; description?: unknown };\n\nasync function readAppPackage(cwd: string): Promise<AppPackage> {\n try {\n return JSON.parse(await readFile(path.join(cwd, \"package.json\"), \"utf8\")) as AppPackage;\n } catch {\n return {};\n }\n}\n\nfunction stringOr(value: unknown, fallback: string): string {\n return typeof value === \"string\" && value.length > 0 ? value : fallback;\n}\n\n/**\n * `http://<host>:<port>` from the `http` config. A wildcard bind address is not a place a\n * client can call, so it becomes `localhost`.\n */\nexport function resolveDefaultServer(): string {\n const host = stringOr(httpConfig(\"host\"), \"localhost\");\n const port = httpConfig(\"port\");\n const callable = host === \"0.0.0.0\" || host === \"::\" ? \"localhost\" : host;\n\n return `http://${callable}${typeof port === \"number\" || typeof port === \"string\" ? `:${port}` : \"\"}`;\n}\n\n/**\n * Build the OpenAPI document from the routes registered in THIS process.\n *\n * Runs inside the registration child, after the app's route modules are loaded and config is\n * available. Maps resource classes to their export names, reads `info` from the app\n * `package.json`, the server from the `http` config and the 422 shape from\n * `validation.response`.\n */\nexport async function buildOpenApiForChild(\n options: BuildOpenApiForChildOptions,\n): Promise<OpenApiBuildResult> {\n const routes = router.list();\n const declaresSchema = routes.some((route) => route.handler?.responseSchema);\n const resourceMap = declaresSchema\n ? await collectResourceExportMap(options.files, options.onWarn)\n : undefined;\n const pkg = await readAppPackage(options.cwd);\n const validationResponse = config.get(\n \"validation.response\",\n {},\n ) as OpenApiValidationResponseConfig;\n\n return buildOpenApiDocument(routes, {\n info: {\n title: options.request.title ?? stringOr(pkg.name, \"Warlock API\"),\n version: stringOr(pkg.version, \"0.0.0\"),\n ...(typeof pkg.description === \"string\" && pkg.description\n ? { description: pkg.description }\n : {}),\n },\n servers: [options.request.server ?? resolveDefaultServer()],\n includePages: options.request.includePages === true,\n resolveResourceName: (resource) => resourceMap?.get(resource)?.exportName,\n validationResponse,\n });\n}\n"],"mappings":";;;;;;;;;AAwBA,eAAe,eAAe,KAAkC;CAC9D,IAAI;EACF,OAAO,KAAK,MAAM,MAAM,SAAS,KAAK,KAAK,KAAK,cAAc,GAAG,MAAM,CAAC;CAC1E,QAAQ;EACN,OAAO,CAAC;CACV;AACF;AAEA,SAAS,SAAS,OAAgB,UAA0B;CAC1D,OAAO,OAAO,UAAU,YAAY,MAAM,SAAS,IAAI,QAAQ;AACjE;;;;;AAMA,SAAgB,uBAA+B;CAC7C,MAAM,OAAO,SAAS,WAAW,MAAM,GAAG,WAAW;CACrD,MAAM,OAAO,WAAW,MAAM;CAG9B,OAAO,UAFU,SAAS,aAAa,SAAS,OAAO,cAAc,OAEzC,OAAO,SAAS,YAAY,OAAO,SAAS,WAAW,IAAI,SAAS;AAClG;;;;;;;;;AAUA,eAAsB,qBACpB,SAC6B;CAC7B,MAAM,SAAS,OAAO,KAAK;CAE3B,MAAM,cADiB,OAAO,MAAM,UAAU,MAAM,SAAS,cAC5B,IAC7B,MAAM,yBAAyB,QAAQ,OAAO,QAAQ,MAAM,IAC5D;CACJ,MAAM,MAAM,MAAM,eAAe,QAAQ,GAAG;CAC5C,MAAM,qBAAqB,OAAO,IAChC,uBACA,CAAC,CACH;CAEA,OAAO,qBAAqB,QAAQ;EAClC,MAAM;GACJ,OAAO,QAAQ,QAAQ,SAAS,SAAS,IAAI,MAAM,aAAa;GAChE,SAAS,SAAS,IAAI,SAAS,OAAO;GACtC,GAAI,OAAO,IAAI,gBAAgB,YAAY,IAAI,cAC3C,EAAE,aAAa,IAAI,YAAY,IAC/B,CAAC;EACP;EACA,SAAS,CAAC,QAAQ,QAAQ,UAAU,qBAAqB,CAAC;EAC1D,cAAc,QAAQ,QAAQ,iBAAiB;EAC/C,sBAAsB,aAAa,aAAa,IAAI,QAAQ,CAAC,EAAE;EAC/D;CACF,CAAC;AACH"}
@@ -1,4 +1,4 @@
1
- //#region ../core/src/openapi/openapi-protocol.ts
1
+ //#region ../../packages/core/src/openapi/openapi-protocol.ts
2
2
  /** Version of the OpenAPI mode of the registration child protocol. */
3
3
  const OPENAPI_PROTOCOL_VERSION = 1;
4
4
  /** `type` of the one message the child answers with in OpenAPI mode. */
@@ -1 +1 @@
1
- {"version":3,"file":"openapi-protocol.mjs","names":[],"sources":["../../../../../../../core/src/openapi/openapi-protocol.ts"],"sourcesContent":["import type { OpenApiDocument } from \"./types\";\n\n/** Version of the OpenAPI mode of the registration child protocol. */\nexport const OPENAPI_PROTOCOL_VERSION = 1;\n\n/** `type` of the one message the child answers with in OpenAPI mode. */\nexport const OPENAPI_RESULT_MESSAGE = \"openapi-registration:document\";\n\n/**\n * The `openapi` field of the registration child request. Its presence switches the child\n * from \"send the route snapshot\" to \"build the OpenAPI document in this process\".\n */\nexport type OpenApiChildRequestOptions = Readonly<{\n version: typeof OPENAPI_PROTOCOL_VERSION;\n /** Overrides `info.title` (default: the app `package.json` name). */\n title?: string;\n /** Overrides `servers[0].url` (default: built from the `http` config). */\n server?: string;\n includePages?: boolean;\n}>;\n\n/** What the child sends back: plain JSON only, never a Seal instance. */\nexport type OpenApiChildResult = Readonly<{\n version: typeof OPENAPI_PROTOCOL_VERSION;\n document: OpenApiDocument;\n warnings: readonly string[];\n}>;\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/**\n * Validate the `openapi` request field inside the child. Throws on anything unexpected.\n */\nexport function parseOpenApiChildOptions(value: unknown): OpenApiChildRequestOptions {\n if (\n !isRecord(value) ||\n value.version !== OPENAPI_PROTOCOL_VERSION ||\n !(value.title === undefined || typeof value.title === \"string\") ||\n !(value.server === undefined || typeof value.server === \"string\") ||\n !(value.includePages === undefined || typeof value.includePages === \"boolean\")\n ) {\n throw new Error(\"Route registration child received an invalid OpenAPI request.\");\n }\n\n return value as OpenApiChildRequestOptions;\n}\n\n/**\n * Validate the result message in the parent. Throws on anything unexpected.\n */\nexport function parseOpenApiChildResult(value: unknown): OpenApiChildResult {\n if (\n !isRecord(value) ||\n value.version !== OPENAPI_PROTOCOL_VERSION ||\n !isRecord(value.document) ||\n typeof value.document.openapi !== \"string\" ||\n !isRecord(value.document.paths) ||\n !Array.isArray(value.warnings) ||\n !value.warnings.every((warning) => typeof warning === \"string\")\n ) {\n throw new Error(\"Route registration child sent an invalid OpenAPI document payload.\");\n }\n\n return Object.freeze({\n version: OPENAPI_PROTOCOL_VERSION,\n document: value.document as unknown as OpenApiDocument,\n warnings: Object.freeze([...(value.warnings as string[])]),\n });\n}\n"],"mappings":";;AAGA,MAAa,2BAA2B;;AAGxC,MAAa,yBAAyB;AAsBtC,SAAS,SAAS,OAAkD;CAClE,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;;;;AAKA,SAAgB,yBAAyB,OAA4C;CACnF,IACE,CAAC,SAAS,KAAK,KACf,MAAM,iBACN,EAAE,MAAM,UAAU,UAAa,OAAO,MAAM,UAAU,aACtD,EAAE,MAAM,WAAW,UAAa,OAAO,MAAM,WAAW,aACxD,EAAE,MAAM,iBAAiB,UAAa,OAAO,MAAM,iBAAiB,YAEpE,MAAM,IAAI,MAAM,+DAA+D;CAGjF,OAAO;AACT;;;;AAKA,SAAgB,wBAAwB,OAAoC;CAC1E,IACE,CAAC,SAAS,KAAK,KACf,MAAM,iBACN,CAAC,SAAS,MAAM,QAAQ,KACxB,OAAO,MAAM,SAAS,YAAY,YAClC,CAAC,SAAS,MAAM,SAAS,KAAK,KAC9B,CAAC,MAAM,QAAQ,MAAM,QAAQ,KAC7B,CAAC,MAAM,SAAS,OAAO,YAAY,OAAO,YAAY,QAAQ,GAE9D,MAAM,IAAI,MAAM,oEAAoE;CAGtF,OAAO,OAAO,OAAO;EACnB;EACA,UAAU,MAAM;EAChB,UAAU,OAAO,OAAO,CAAC,GAAI,MAAM,QAAqB,CAAC;CAC3D,CAAC;AACH"}
1
+ {"version":3,"file":"openapi-protocol.mjs","names":[],"sources":["../../../../../../../../packages/core/src/openapi/openapi-protocol.ts"],"sourcesContent":["import type { OpenApiDocument } from \"./types\";\n\n/** Version of the OpenAPI mode of the registration child protocol. */\nexport const OPENAPI_PROTOCOL_VERSION = 1;\n\n/** `type` of the one message the child answers with in OpenAPI mode. */\nexport const OPENAPI_RESULT_MESSAGE = \"openapi-registration:document\";\n\n/**\n * The `openapi` field of the registration child request. Its presence switches the child\n * from \"send the route snapshot\" to \"build the OpenAPI document in this process\".\n */\nexport type OpenApiChildRequestOptions = Readonly<{\n version: typeof OPENAPI_PROTOCOL_VERSION;\n /** Overrides `info.title` (default: the app `package.json` name). */\n title?: string;\n /** Overrides `servers[0].url` (default: built from the `http` config). */\n server?: string;\n includePages?: boolean;\n}>;\n\n/** What the child sends back: plain JSON only, never a Seal instance. */\nexport type OpenApiChildResult = Readonly<{\n version: typeof OPENAPI_PROTOCOL_VERSION;\n document: OpenApiDocument;\n warnings: readonly string[];\n}>;\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/**\n * Validate the `openapi` request field inside the child. Throws on anything unexpected.\n */\nexport function parseOpenApiChildOptions(value: unknown): OpenApiChildRequestOptions {\n if (\n !isRecord(value) ||\n value.version !== OPENAPI_PROTOCOL_VERSION ||\n !(value.title === undefined || typeof value.title === \"string\") ||\n !(value.server === undefined || typeof value.server === \"string\") ||\n !(value.includePages === undefined || typeof value.includePages === \"boolean\")\n ) {\n throw new Error(\"Route registration child received an invalid OpenAPI request.\");\n }\n\n return value as OpenApiChildRequestOptions;\n}\n\n/**\n * Validate the result message in the parent. Throws on anything unexpected.\n */\nexport function parseOpenApiChildResult(value: unknown): OpenApiChildResult {\n if (\n !isRecord(value) ||\n value.version !== OPENAPI_PROTOCOL_VERSION ||\n !isRecord(value.document) ||\n typeof value.document.openapi !== \"string\" ||\n !isRecord(value.document.paths) ||\n !Array.isArray(value.warnings) ||\n !value.warnings.every((warning) => typeof warning === \"string\")\n ) {\n throw new Error(\"Route registration child sent an invalid OpenAPI document payload.\");\n }\n\n return Object.freeze({\n version: OPENAPI_PROTOCOL_VERSION,\n document: value.document as unknown as OpenApiDocument,\n warnings: Object.freeze([...(value.warnings as string[])]),\n });\n}\n"],"mappings":";;AAGA,MAAa,2BAA2B;;AAGxC,MAAa,yBAAyB;AAsBtC,SAAS,SAAS,OAAkD;CAClE,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;;;;AAKA,SAAgB,yBAAyB,OAA4C;CACnF,IACE,CAAC,SAAS,KAAK,KACf,MAAM,iBACN,EAAE,MAAM,UAAU,UAAa,OAAO,MAAM,UAAU,aACtD,EAAE,MAAM,WAAW,UAAa,OAAO,MAAM,WAAW,aACxD,EAAE,MAAM,iBAAiB,UAAa,OAAO,MAAM,iBAAiB,YAEpE,MAAM,IAAI,MAAM,+DAA+D;CAGjF,OAAO;AACT;;;;AAKA,SAAgB,wBAAwB,OAAoC;CAC1E,IACE,CAAC,SAAS,KAAK,KACf,MAAM,iBACN,CAAC,SAAS,MAAM,QAAQ,KACxB,OAAO,MAAM,SAAS,YAAY,YAClC,CAAC,SAAS,MAAM,SAAS,KAAK,KAC9B,CAAC,MAAM,QAAQ,MAAM,QAAQ,KAC7B,CAAC,MAAM,SAAS,OAAO,YAAY,OAAO,YAAY,QAAQ,GAE9D,MAAM,IAAI,MAAM,oEAAoE;CAGtF,OAAO,OAAO,OAAO;EACnB;EACA,UAAU,MAAM;EAChB,UAAU,OAAO,OAAO,CAAC,GAAI,MAAM,QAAqB,CAAC;CAC3D,CAAC;AACH"}
@@ -1,4 +1,4 @@
1
- //#region ../core/src/openapi/paths.ts
1
+ //#region ../../packages/core/src/openapi/paths.ts
2
2
  /**
3
3
  * The concrete verbs an `all` route expands into. Mirrors `ALL_METHODS` in the route registry.
4
4
  */
@@ -1 +1 @@
1
- {"version":3,"file":"paths.mjs","names":[],"sources":["../../../../../../../core/src/openapi/paths.ts"],"sourcesContent":["import type { RequestMethod } from \"../router/types\";\n\n/**\n * The concrete verbs an `all` route expands into. Mirrors `ALL_METHODS` in the route registry.\n */\nconst ALL_METHODS = [\"get\", \"post\", \"put\", \"patch\", \"delete\", \"options\", \"head\"] as const;\n\nexport type OpenApiMethod = (typeof ALL_METHODS)[number];\n\nconst PATH_PARAM_PATTERN = /:([A-Za-z_][A-Za-z0-9_]*)(\\([^)]*\\))?/g;\n\n/**\n * Convert a Warlock path into an OpenAPI path template: `/users/:id` -> `/users/{id}`.\n * A Fastify-style regex suffix (`:id(\\d+)`) is dropped.\n */\nexport function toOpenApiPath(path: string): string {\n return path.replace(PATH_PARAM_PATTERN, (_match, name: string) => `{${name}}`);\n}\n\n/**\n * Names of the path parameters of a Warlock path, in order of appearance.\n */\nexport function extractPathParamNames(path: string): string[] {\n return [...path.matchAll(PATH_PARAM_PATTERN)].flatMap((match) => match[1] ?? []);\n}\n\n/**\n * Lowercase operation verbs of a route method; `all` expands to every verb.\n */\nexport function expandMethods(method: RequestMethod | string): OpenApiMethod[] {\n const lowered = String(method).toLowerCase();\n\n if (lowered === \"all\") {\n return [...ALL_METHODS];\n }\n\n return (ALL_METHODS as readonly string[]).includes(lowered) ? [lowered as OpenApiMethod] : [];\n}\n\n/**\n * `operationId` for an operation. A named route keeps its name (with `.<verb>` appended when\n * an `all` route expands into several operations); an unnamed route gets a `method_path_slug`\n * id such as `get_users_id`.\n */\nexport function buildOperationId(\n name: string | undefined,\n method: OpenApiMethod,\n path: string,\n expanded: boolean,\n): string {\n if (name) {\n return expanded ? `${name}.${method}` : name;\n }\n\n const slug = path\n .replace(PATH_PARAM_PATTERN, \"$1\")\n .replace(/[^A-Za-z0-9]+/g, \"_\")\n .replace(/^_+|_+$/g, \"\");\n\n return slug ? `${method}_${slug}` : method;\n}\n\n/**\n * Tag of a route: its first static path segment (`/users/:id` -> `users`).\n */\nexport function firstSegmentTag(path: string): string | undefined {\n const segment = path.split(\"/\").find((part) => part.length > 0);\n\n if (!segment || segment.startsWith(\":\") || segment === \"*\") {\n return undefined;\n }\n\n return segment;\n}\n\n/**\n * Verbs whose requests carry no body, so unscoped validation maps to query parameters.\n */\nexport function isBodylessMethod(method: OpenApiMethod): boolean {\n return method === \"get\" || method === \"head\" || method === \"delete\" || method === \"options\";\n}\n"],"mappings":";;;;AAKA,MAAM,cAAc;CAAC;CAAO;CAAQ;CAAO;CAAS;CAAU;CAAW;AAAM;AAI/E,MAAM,qBAAqB;;;;;AAM3B,SAAgB,cAAc,MAAsB;CAClD,OAAO,KAAK,QAAQ,qBAAqB,QAAQ,SAAiB,IAAI,KAAK,EAAE;AAC/E;;;;AAKA,SAAgB,sBAAsB,MAAwB;CAC5D,OAAO,CAAC,GAAG,KAAK,SAAS,kBAAkB,CAAC,CAAC,CAAC,SAAS,UAAU,MAAM,MAAM,CAAC,CAAC;AACjF;;;;AAKA,SAAgB,cAAc,QAAiD;CAC7E,MAAM,UAAU,OAAO,MAAM,CAAC,CAAC,YAAY;CAE3C,IAAI,YAAY,OACd,OAAO,CAAC,GAAG,WAAW;CAGxB,OAAQ,YAAkC,SAAS,OAAO,IAAI,CAAC,OAAwB,IAAI,CAAC;AAC9F;;;;;;AAOA,SAAgB,iBACd,MACA,QACA,MACA,UACQ;CACR,IAAI,MACF,OAAO,WAAW,GAAG,KAAK,GAAG,WAAW;CAG1C,MAAM,OAAO,KACV,QAAQ,oBAAoB,IAAI,CAAC,CACjC,QAAQ,kBAAkB,GAAG,CAAC,CAC9B,QAAQ,YAAY,EAAE;CAEzB,OAAO,OAAO,GAAG,OAAO,GAAG,SAAS;AACtC;;;;AAKA,SAAgB,gBAAgB,MAAkC;CAChE,MAAM,UAAU,KAAK,MAAM,GAAG,CAAC,CAAC,MAAM,SAAS,KAAK,SAAS,CAAC;CAE9D,IAAI,CAAC,WAAW,QAAQ,WAAW,GAAG,KAAK,YAAY,KACrD;CAGF,OAAO;AACT;;;;AAKA,SAAgB,iBAAiB,QAAgC;CAC/D,OAAO,WAAW,SAAS,WAAW,UAAU,WAAW,YAAY,WAAW;AACpF"}
1
+ {"version":3,"file":"paths.mjs","names":[],"sources":["../../../../../../../../packages/core/src/openapi/paths.ts"],"sourcesContent":["import type { RequestMethod } from \"../router/types\";\n\n/**\n * The concrete verbs an `all` route expands into. Mirrors `ALL_METHODS` in the route registry.\n */\nconst ALL_METHODS = [\"get\", \"post\", \"put\", \"patch\", \"delete\", \"options\", \"head\"] as const;\n\nexport type OpenApiMethod = (typeof ALL_METHODS)[number];\n\nconst PATH_PARAM_PATTERN = /:([A-Za-z_][A-Za-z0-9_]*)(\\([^)]*\\))?/g;\n\n/**\n * Convert a Warlock path into an OpenAPI path template: `/users/:id` -> `/users/{id}`.\n * A Fastify-style regex suffix (`:id(\\d+)`) is dropped.\n */\nexport function toOpenApiPath(path: string): string {\n return path.replace(PATH_PARAM_PATTERN, (_match, name: string) => `{${name}}`);\n}\n\n/**\n * Names of the path parameters of a Warlock path, in order of appearance.\n */\nexport function extractPathParamNames(path: string): string[] {\n return [...path.matchAll(PATH_PARAM_PATTERN)].flatMap((match) => match[1] ?? []);\n}\n\n/**\n * Lowercase operation verbs of a route method; `all` expands to every verb.\n */\nexport function expandMethods(method: RequestMethod | string): OpenApiMethod[] {\n const lowered = String(method).toLowerCase();\n\n if (lowered === \"all\") {\n return [...ALL_METHODS];\n }\n\n return (ALL_METHODS as readonly string[]).includes(lowered) ? [lowered as OpenApiMethod] : [];\n}\n\n/**\n * `operationId` for an operation. A named route keeps its name (with `.<verb>` appended when\n * an `all` route expands into several operations); an unnamed route gets a `method_path_slug`\n * id such as `get_users_id`.\n */\nexport function buildOperationId(\n name: string | undefined,\n method: OpenApiMethod,\n path: string,\n expanded: boolean,\n): string {\n if (name) {\n return expanded ? `${name}.${method}` : name;\n }\n\n const slug = path\n .replace(PATH_PARAM_PATTERN, \"$1\")\n .replace(/[^A-Za-z0-9]+/g, \"_\")\n .replace(/^_+|_+$/g, \"\");\n\n return slug ? `${method}_${slug}` : method;\n}\n\n/**\n * Tag of a route: its first static path segment (`/users/:id` -> `users`).\n */\nexport function firstSegmentTag(path: string): string | undefined {\n const segment = path.split(\"/\").find((part) => part.length > 0);\n\n if (!segment || segment.startsWith(\":\") || segment === \"*\") {\n return undefined;\n }\n\n return segment;\n}\n\n/**\n * Verbs whose requests carry no body, so unscoped validation maps to query parameters.\n */\nexport function isBodylessMethod(method: OpenApiMethod): boolean {\n return method === \"get\" || method === \"head\" || method === \"delete\" || method === \"options\";\n}\n"],"mappings":";;;;AAKA,MAAM,cAAc;CAAC;CAAO;CAAQ;CAAO;CAAS;CAAU;CAAW;AAAM;AAI/E,MAAM,qBAAqB;;;;;AAM3B,SAAgB,cAAc,MAAsB;CAClD,OAAO,KAAK,QAAQ,qBAAqB,QAAQ,SAAiB,IAAI,KAAK,EAAE;AAC/E;;;;AAKA,SAAgB,sBAAsB,MAAwB;CAC5D,OAAO,CAAC,GAAG,KAAK,SAAS,kBAAkB,CAAC,CAAC,CAAC,SAAS,UAAU,MAAM,MAAM,CAAC,CAAC;AACjF;;;;AAKA,SAAgB,cAAc,QAAiD;CAC7E,MAAM,UAAU,OAAO,MAAM,CAAC,CAAC,YAAY;CAE3C,IAAI,YAAY,OACd,OAAO,CAAC,GAAG,WAAW;CAGxB,OAAQ,YAAkC,SAAS,OAAO,IAAI,CAAC,OAAwB,IAAI,CAAC;AAC9F;;;;;;AAOA,SAAgB,iBACd,MACA,QACA,MACA,UACQ;CACR,IAAI,MACF,OAAO,WAAW,GAAG,KAAK,GAAG,WAAW;CAG1C,MAAM,OAAO,KACV,QAAQ,oBAAoB,IAAI,CAAC,CACjC,QAAQ,kBAAkB,GAAG,CAAC,CAC9B,QAAQ,YAAY,EAAE;CAEzB,OAAO,OAAO,GAAG,OAAO,GAAG,SAAS;AACtC;;;;AAKA,SAAgB,gBAAgB,MAAkC;CAChE,MAAM,UAAU,KAAK,MAAM,GAAG,CAAC,CAAC,MAAM,SAAS,KAAK,SAAS,CAAC;CAE9D,IAAI,CAAC,WAAW,QAAQ,WAAW,GAAG,KAAK,YAAY,KACrD;CAGF,OAAO;AACT;;;;AAKA,SAAgB,iBAAiB,QAAgC;CAC/D,OAAO,WAAW,SAAS,WAAW,UAAU,WAAW,YAAY,WAAW;AACpF"}
@@ -1,7 +1,7 @@
1
1
  import { isRecord, primaryType, resolveSchema } from "./schema-refs.mjs";
2
2
  import { exampleFromSchema } from "./example-from-schema.mjs";
3
3
 
4
- //#region ../core/src/openapi/postman/build-request-body.ts
4
+ //#region ../../packages/core/src/openapi/postman/build-request-body.ts
5
5
  const MULTIPART = "multipart/form-data";
6
6
  const URL_ENCODED = "application/x-www-form-urlencoded";
7
7
  function isJsonContentType(contentType) {