@warlock.js/core 5.30.0 → 5.32.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 (1374) hide show
  1. package/CHANGELOG.md +165 -36
  2. package/README.md +28 -23
  3. package/bin/source-load-hook.mjs +63 -0
  4. package/bin/warlock.js +102 -42
  5. package/esm/application/app.d.mts +3 -3
  6. package/esm/application/app.d.mts.map +1 -1
  7. package/esm/application/application-config-types.d.mts +1 -2
  8. package/esm/application/application-config-types.d.mts.map +1 -1
  9. package/esm/application/application.d.mts +5 -7
  10. package/esm/application/application.d.mts.map +1 -1
  11. package/esm/application/application.mjs +3 -1
  12. package/esm/application/application.mjs.map +1 -1
  13. package/esm/application/boot-signal.d.mts +14 -12
  14. package/esm/application/boot-signal.d.mts.map +1 -1
  15. package/esm/application/index.d.mts +2 -1
  16. package/esm/application/index.mjs +1 -1
  17. package/esm/application/public-url.d.mts +1 -2
  18. package/esm/application/public-url.d.mts.map +1 -1
  19. package/esm/application/roles.d.mts +10 -11
  20. package/esm/application/roles.d.mts.map +1 -1
  21. package/esm/benchmark/benchmark-snapshots.d.mts +1 -3
  22. package/esm/benchmark/benchmark-snapshots.d.mts.map +1 -1
  23. package/esm/benchmark/benchmark.d.mts +1 -3
  24. package/esm/benchmark/benchmark.d.mts.map +1 -1
  25. package/esm/benchmark/channels/console.channel.d.mts +1 -3
  26. package/esm/benchmark/channels/console.channel.d.mts.map +1 -1
  27. package/esm/benchmark/channels/noop.channel.d.mts +1 -3
  28. package/esm/benchmark/channels/noop.channel.d.mts.map +1 -1
  29. package/esm/benchmark/index.mjs +1 -1
  30. package/esm/benchmark/profiler.d.mts +1 -3
  31. package/esm/benchmark/profiler.d.mts.map +1 -1
  32. package/esm/benchmark/profiler.mjs +2 -1
  33. package/esm/benchmark/profiler.mjs.map +1 -1
  34. package/esm/benchmark/types.d.mts +22 -17
  35. package/esm/benchmark/types.d.mts.map +1 -1
  36. package/esm/bootstrap/setup.d.mts +1 -2
  37. package/esm/bootstrap/setup.d.mts.map +1 -1
  38. package/esm/bootstrap.d.mts +1 -2
  39. package/esm/bootstrap.d.mts.map +1 -1
  40. package/esm/cache/database-cache-driver.d.mts +3 -5
  41. package/esm/cache/database-cache-driver.d.mts.map +1 -1
  42. package/esm/cache/database-cache-driver.mjs +1 -1
  43. package/esm/cache/index.d.mts +2 -1
  44. package/esm/cache/index.mjs +1 -1
  45. package/esm/cli/cli-commands.manager.mjs +6 -3
  46. package/esm/cli/cli-commands.manager.mjs.map +1 -1
  47. package/esm/cli/commands/add.command.mjs +4 -2
  48. package/esm/cli/commands/add.command.mjs.map +1 -1
  49. package/esm/cli/commands/agents-md/agents-md-command.action.mjs +70 -0
  50. package/esm/cli/commands/agents-md/agents-md-command.action.mjs.map +1 -0
  51. package/esm/cli/commands/agents-md.command.mjs +38 -0
  52. package/esm/cli/commands/agents-md.command.mjs.map +1 -0
  53. package/esm/cli/commands/board/board-command.action.mjs +279 -0
  54. package/esm/cli/commands/board/board-command.action.mjs.map +1 -0
  55. package/esm/cli/commands/board.command.mjs +78 -0
  56. package/esm/cli/commands/board.command.mjs.map +1 -0
  57. package/esm/cli/commands/build.command.mjs +6 -1
  58. package/esm/cli/commands/build.command.mjs.map +1 -1
  59. package/esm/cli/commands/check/check-command.action.mjs +57 -0
  60. package/esm/cli/commands/check/check-command.action.mjs.map +1 -0
  61. package/esm/cli/commands/check/child-typecheck.mjs +66 -0
  62. package/esm/cli/commands/check/child-typecheck.mjs.map +1 -0
  63. package/esm/cli/commands/check/format-problems.mjs +43 -0
  64. package/esm/cli/commands/check/format-problems.mjs.map +1 -0
  65. package/esm/cli/commands/check/typecheck-command.action.mjs +61 -0
  66. package/esm/cli/commands/check/typecheck-command.action.mjs.map +1 -0
  67. package/esm/cli/commands/check.command.mjs +50 -0
  68. package/esm/cli/commands/check.command.mjs.map +1 -0
  69. package/esm/cli/commands/dev-server.command.mjs +12 -3
  70. package/esm/cli/commands/dev-server.command.mjs.map +1 -1
  71. package/esm/cli/commands/doctor/boot-for-diagnostics.mjs +8 -3
  72. package/esm/cli/commands/doctor/boot-for-diagnostics.mjs.map +1 -1
  73. package/esm/cli/commands/doctor/check.types.d.mts +89 -0
  74. package/esm/cli/commands/doctor/check.types.d.mts.map +1 -0
  75. package/esm/cli/commands/doctor/checks/config.check.mjs +1 -0
  76. package/esm/cli/commands/doctor/checks/config.check.mjs.map +1 -1
  77. package/esm/cli/commands/doctor/checks/connectors.check.mjs +2 -0
  78. package/esm/cli/commands/doctor/checks/connectors.check.mjs.map +1 -1
  79. package/esm/cli/commands/doctor/checks/handler-signature.check.mjs +1 -0
  80. package/esm/cli/commands/doctor/checks/handler-signature.check.mjs.map +1 -1
  81. package/esm/cli/commands/doctor/checks/health.check.mjs +3 -0
  82. package/esm/cli/commands/doctor/checks/health.check.mjs.map +1 -1
  83. package/esm/cli/commands/doctor/checks/jwt-secret.check.mjs +1 -0
  84. package/esm/cli/commands/doctor/checks/jwt-secret.check.mjs.map +1 -1
  85. package/esm/cli/commands/doctor/checks/locales-ts-deprecated.check.mjs +23 -27
  86. package/esm/cli/commands/doctor/checks/locales-ts-deprecated.check.mjs.map +1 -1
  87. package/esm/cli/commands/doctor/checks/optional-peers.check.mjs +1 -0
  88. package/esm/cli/commands/doctor/checks/optional-peers.check.mjs.map +1 -1
  89. package/esm/cli/commands/doctor/checks/release-hygiene.check.mjs +4 -0
  90. package/esm/cli/commands/doctor/checks/release-hygiene.check.mjs.map +1 -1
  91. package/esm/cli/commands/doctor/checks/routes.check.mjs +3 -0
  92. package/esm/cli/commands/doctor/checks/routes.check.mjs.map +1 -1
  93. package/esm/cli/commands/doctor/doctor-command.action.mjs +15 -6
  94. package/esm/cli/commands/doctor/doctor-command.action.mjs.map +1 -1
  95. package/esm/cli/commands/doctor/format-report.mjs +30 -2
  96. package/esm/cli/commands/doctor/format-report.mjs.map +1 -1
  97. package/esm/cli/commands/doctor.command.mjs +4 -0
  98. package/esm/cli/commands/doctor.command.mjs.map +1 -1
  99. package/esm/cli/commands/explain/explain-command.action.mjs +64 -0
  100. package/esm/cli/commands/explain/explain-command.action.mjs.map +1 -0
  101. package/esm/cli/commands/explain.command.mjs +23 -0
  102. package/esm/cli/commands/explain.command.mjs.map +1 -0
  103. package/esm/cli/commands/generate/generate.command.mjs +124 -124
  104. package/esm/cli/commands/generate/generate.command.mjs.map +1 -1
  105. package/esm/cli/commands/generate/generators/controller.generator.mjs +5 -2
  106. package/esm/cli/commands/generate/generators/controller.generator.mjs.map +1 -1
  107. package/esm/cli/commands/generate/generators/endpoint.generator.mjs +313 -0
  108. package/esm/cli/commands/generate/generators/endpoint.generator.mjs.map +1 -0
  109. package/esm/cli/commands/generate/generators/migration.generator.mjs +1 -1
  110. package/esm/cli/commands/generate/generators/migration.generator.mjs.map +1 -1
  111. package/esm/cli/commands/generate/generators/model.generator.mjs +4 -3
  112. package/esm/cli/commands/generate/generators/model.generator.mjs.map +1 -1
  113. package/esm/cli/commands/generate/generators/repository.generator.mjs +3 -1
  114. package/esm/cli/commands/generate/generators/repository.generator.mjs.map +1 -1
  115. package/esm/cli/commands/generate/generators/resource.generator.mjs +3 -1
  116. package/esm/cli/commands/generate/generators/resource.generator.mjs.map +1 -1
  117. package/esm/cli/commands/generate/generators/service.generator.mjs +3 -1
  118. package/esm/cli/commands/generate/generators/service.generator.mjs.map +1 -1
  119. package/esm/cli/commands/generate/templates/endpoint-stubs.mjs +341 -0
  120. package/esm/cli/commands/generate/templates/endpoint-stubs.mjs.map +1 -0
  121. package/esm/cli/commands/generate/templates/stubs.mjs +19 -6
  122. package/esm/cli/commands/generate/templates/stubs.mjs.map +1 -1
  123. package/esm/cli/commands/generate/utils/endpoint-schema.mjs +136 -0
  124. package/esm/cli/commands/generate/utils/endpoint-schema.mjs.map +1 -0
  125. package/esm/cli/commands/generate/utils/name-parser.mjs +2 -2
  126. package/esm/cli/commands/generate/utils/name-parser.mjs.map +1 -1
  127. package/esm/cli/commands/generate/utils/path-resolver.mjs +1 -1
  128. package/esm/cli/commands/generate/utils/prompt.mjs.map +1 -1
  129. package/esm/cli/commands/generate/utils/writer.mjs +38 -13
  130. package/esm/cli/commands/generate/utils/writer.mjs.map +1 -1
  131. package/esm/cli/commands/inspect/inspect-command.action.mjs +73 -0
  132. package/esm/cli/commands/inspect/inspect-command.action.mjs.map +1 -0
  133. package/esm/cli/commands/inspect.command.mjs +39 -0
  134. package/esm/cli/commands/inspect.command.mjs.map +1 -0
  135. package/esm/cli/commands/issue/collect-environment.mjs +187 -0
  136. package/esm/cli/commands/issue/collect-environment.mjs.map +1 -0
  137. package/esm/cli/commands/issue/issue-command.action.mjs +70 -0
  138. package/esm/cli/commands/issue/issue-command.action.mjs.map +1 -0
  139. package/esm/cli/commands/issue.command.mjs +31 -0
  140. package/esm/cli/commands/issue.command.mjs.map +1 -0
  141. package/esm/cli/commands/mcp/mcp-command.action.mjs +104 -0
  142. package/esm/cli/commands/mcp/mcp-command.action.mjs.map +1 -0
  143. package/esm/cli/commands/mcp.command.mjs +76 -0
  144. package/esm/cli/commands/mcp.command.mjs.map +1 -0
  145. package/esm/cli/commands/openapi-generator.action.mjs +1 -1
  146. package/esm/cli/commands/openapi-generator.action.mjs.map +1 -1
  147. package/esm/cli/commands/openapi-generator.command.mjs.map +1 -1
  148. package/esm/cli/commands/postman-generator.action.mjs +1 -1
  149. package/esm/cli/commands/postman-generator.action.mjs.map +1 -1
  150. package/esm/cli/commands/postman-generator.command.mjs.map +1 -1
  151. package/esm/cli/commands/routes/format-routes-table.mjs +1 -1
  152. package/esm/cli/commands/routes/route-row.mjs +1 -1
  153. package/esm/cli/commands/routes/routes-diff.action.mjs +3 -3
  154. package/esm/cli/commands/routes/routes-diff.action.mjs.map +1 -1
  155. package/esm/cli/commands/test.command.mjs +131 -0
  156. package/esm/cli/commands/test.command.mjs.map +1 -0
  157. package/esm/cli/commands/trace/trace-command.action.mjs +145 -0
  158. package/esm/cli/commands/trace/trace-command.action.mjs.map +1 -0
  159. package/esm/cli/commands/trace.command.mjs +60 -0
  160. package/esm/cli/commands/trace.command.mjs.map +1 -0
  161. package/esm/cli/commands/typecheck.command.mjs +40 -0
  162. package/esm/cli/commands/typecheck.command.mjs.map +1 -0
  163. package/esm/cli/commands/upgrade.command.mjs +46 -0
  164. package/esm/cli/commands/upgrade.command.mjs.map +1 -0
  165. package/esm/cli/commands-loader.mjs +1 -1
  166. package/esm/cli/flush-and-exit.mjs +34 -0
  167. package/esm/cli/flush-and-exit.mjs.map +1 -0
  168. package/esm/cli/framework-cli-commands.mjs +25 -1
  169. package/esm/cli/framework-cli-commands.mjs.map +1 -1
  170. package/esm/cli/parse-cli-args.mjs +3 -2
  171. package/esm/cli/parse-cli-args.mjs.map +1 -1
  172. package/esm/cli/start.d.mts +1 -1
  173. package/esm/cli/string-similarity.mjs +1 -1
  174. package/esm/commands/cli-command.d.mts +2 -4
  175. package/esm/commands/cli-command.d.mts.map +1 -1
  176. package/esm/commands/index.d.mts +2 -1
  177. package/esm/commands/index.mjs +1 -1
  178. package/esm/commands/types.d.mts +8 -8
  179. package/esm/commands/types.d.mts.map +1 -1
  180. package/esm/config/config-getter.d.mts +2 -3
  181. package/esm/config/config-getter.d.mts.map +1 -1
  182. package/esm/config/config-getter.mjs +5 -5
  183. package/esm/config/config-getter.mjs.map +1 -1
  184. package/esm/config/config-handlers.d.mts +1 -3
  185. package/esm/config/config-handlers.d.mts.map +1 -1
  186. package/esm/config/config-loader.d.mts +1 -2
  187. package/esm/config/config-loader.d.mts.map +1 -1
  188. package/esm/config/config-loader.mjs +35 -14
  189. package/esm/config/config-loader.mjs.map +1 -1
  190. package/esm/config/config-manager.mjs +1 -1
  191. package/esm/config/config-schema.d.mts +70 -0
  192. package/esm/config/config-schema.d.mts.map +1 -0
  193. package/esm/config/config-schema.mjs +77 -0
  194. package/esm/config/config-schema.mjs.map +1 -0
  195. package/esm/config/config-setter.d.mts +2 -4
  196. package/esm/config/config-setter.d.mts.map +1 -1
  197. package/esm/config/config-setter.mjs +2 -2
  198. package/esm/config/config-setter.mjs.map +1 -1
  199. package/esm/config/config-special-handlers.d.mts +2 -4
  200. package/esm/config/config-special-handlers.d.mts.map +1 -1
  201. package/esm/config/index.d.mts +7 -0
  202. package/esm/config/index.mjs +2 -1
  203. package/esm/config/types.d.mts +4 -5
  204. package/esm/config/types.d.mts.map +1 -1
  205. package/esm/connectors/access-connector.d.mts +1 -3
  206. package/esm/connectors/access-connector.d.mts.map +1 -1
  207. package/esm/connectors/access-connector.mjs +2 -2
  208. package/esm/connectors/access-connector.mjs.map +1 -1
  209. package/esm/connectors/ai-connector.d.mts +1 -3
  210. package/esm/connectors/ai-connector.d.mts.map +1 -1
  211. package/esm/connectors/ai-connector.mjs +2 -2
  212. package/esm/connectors/ai-connector.mjs.map +1 -1
  213. package/esm/connectors/assert-no-reserved-connector-names.d.mts +1 -3
  214. package/esm/connectors/assert-no-reserved-connector-names.d.mts.map +1 -1
  215. package/esm/connectors/assert-no-reserved-connector-names.mjs +2 -1
  216. package/esm/connectors/assert-no-reserved-connector-names.mjs.map +1 -1
  217. package/esm/connectors/assert-unique-connector-names.d.mts +1 -3
  218. package/esm/connectors/assert-unique-connector-names.d.mts.map +1 -1
  219. package/esm/connectors/assert-unique-connector-names.mjs +26 -1
  220. package/esm/connectors/assert-unique-connector-names.mjs.map +1 -1
  221. package/esm/connectors/base-connector.d.mts +1 -3
  222. package/esm/connectors/base-connector.d.mts.map +1 -1
  223. package/esm/connectors/cache-connector.d.mts +1 -3
  224. package/esm/connectors/cache-connector.d.mts.map +1 -1
  225. package/esm/connectors/cache-connector.mjs +3 -3
  226. package/esm/connectors/cache-connector.mjs.map +1 -1
  227. package/esm/connectors/connectors-manager.d.mts +2 -4
  228. package/esm/connectors/connectors-manager.d.mts.map +1 -1
  229. package/esm/connectors/connectors-manager.mjs +2 -2
  230. package/esm/connectors/connectors-manager.mjs.map +1 -1
  231. package/esm/connectors/database-connector.d.mts +1 -3
  232. package/esm/connectors/database-connector.d.mts.map +1 -1
  233. package/esm/connectors/database-connector.mjs +2 -2
  234. package/esm/connectors/database-connector.mjs.map +1 -1
  235. package/esm/connectors/describe-server-address.mjs +4 -4
  236. package/esm/connectors/describe-server-address.mjs.map +1 -1
  237. package/esm/connectors/herald-connector.d.mts +1 -3
  238. package/esm/connectors/herald-connector.d.mts.map +1 -1
  239. package/esm/connectors/herald-connector.mjs +2 -2
  240. package/esm/connectors/herald-connector.mjs.map +1 -1
  241. package/esm/connectors/http-connector.d.mts +1 -3
  242. package/esm/connectors/http-connector.d.mts.map +1 -1
  243. package/esm/connectors/http-connector.mjs +11 -9
  244. package/esm/connectors/http-connector.mjs.map +1 -1
  245. package/esm/connectors/index.d.mts +2 -1
  246. package/esm/connectors/index.mjs +1 -1
  247. package/esm/connectors/logger-connector.d.mts +1 -3
  248. package/esm/connectors/logger-connector.d.mts.map +1 -1
  249. package/esm/connectors/logger-connector.mjs +2 -2
  250. package/esm/connectors/logger-connector.mjs.map +1 -1
  251. package/esm/connectors/mail-connector.d.mts +1 -3
  252. package/esm/connectors/mail-connector.d.mts.map +1 -1
  253. package/esm/connectors/mail-connector.mjs +2 -2
  254. package/esm/connectors/mail-connector.mjs.map +1 -1
  255. package/esm/connectors/notifications-connector.d.mts +1 -3
  256. package/esm/connectors/notifications-connector.d.mts.map +1 -1
  257. package/esm/connectors/notifications-connector.mjs +2 -2
  258. package/esm/connectors/notifications-connector.mjs.map +1 -1
  259. package/esm/connectors/register-configured-connectors.d.mts +2 -4
  260. package/esm/connectors/register-configured-connectors.d.mts.map +1 -1
  261. package/esm/connectors/single-server-warnings.mjs.map +1 -1
  262. package/esm/connectors/socket-connector.d.mts +1 -3
  263. package/esm/connectors/socket-connector.d.mts.map +1 -1
  264. package/esm/connectors/socket-connector.mjs +12 -10
  265. package/esm/connectors/socket-connector.mjs.map +1 -1
  266. package/esm/connectors/storage.connector.d.mts +1 -3
  267. package/esm/connectors/storage.connector.d.mts.map +1 -1
  268. package/esm/connectors/storage.connector.mjs +2 -2
  269. package/esm/connectors/storage.connector.mjs.map +1 -1
  270. package/esm/connectors/types.d.mts +17 -14
  271. package/esm/connectors/types.d.mts.map +1 -1
  272. package/esm/container/container-instance-registry.mjs.map +1 -1
  273. package/esm/container/development-app-modules.d.mts +7 -5
  274. package/esm/container/development-app-modules.d.mts.map +1 -1
  275. package/esm/container/development-model-modules.d.mts +6 -5
  276. package/esm/container/development-model-modules.d.mts.map +1 -1
  277. package/esm/container/index.d.mts +4 -4
  278. package/esm/container/index.d.mts.map +1 -1
  279. package/esm/container/index.mjs.map +1 -1
  280. package/esm/database/index.d.mts +3 -1
  281. package/esm/database/index.mjs +1 -1
  282. package/esm/database/migrate-action.mjs +1 -1
  283. package/esm/database/migrate-action.mjs.map +1 -1
  284. package/esm/database/models/database-log/database-log.d.mts +2 -31
  285. package/esm/database/models/database-log/database-log.d.mts.map +1 -1
  286. package/esm/database/models/database-log/index.d.mts +2 -1
  287. package/esm/database/models/database-log/index.mjs +1 -1
  288. package/esm/database/seed-command-action.mjs +1 -1
  289. package/esm/database/seeds/seeder.d.mts +2 -4
  290. package/esm/database/seeds/seeder.d.mts.map +1 -1
  291. package/esm/database/seeds/seeder.errors.d.mts +6 -3
  292. package/esm/database/seeds/seeder.errors.d.mts.map +1 -1
  293. package/esm/database/seeds/seeder.errors.mjs +2 -0
  294. package/esm/database/seeds/seeder.errors.mjs.map +1 -1
  295. package/esm/database/seeds/seeders.manager.mjs +2 -1
  296. package/esm/database/seeds/seeders.manager.mjs.map +1 -1
  297. package/esm/database/seeds/types.d.mts +7 -8
  298. package/esm/database/seeds/types.d.mts.map +1 -1
  299. package/esm/database/utils.d.mts +4 -5
  300. package/esm/database/utils.d.mts.map +1 -1
  301. package/esm/dev-server/app-module-registry.mjs +1 -1
  302. package/esm/dev-server/boot-precondition-error.mjs +1 -0
  303. package/esm/dev-server/boot-precondition-error.mjs.map +1 -1
  304. package/esm/dev-server/create-worker.mjs +17 -9
  305. package/esm/dev-server/create-worker.mjs.map +1 -1
  306. package/esm/dev-server/dependency-graph.d.mts +1 -3
  307. package/esm/dev-server/dependency-graph.d.mts.map +1 -1
  308. package/esm/dev-server/dependency-graph.mjs +1 -1
  309. package/esm/dev-server/dependency-graph.mjs.map +1 -1
  310. package/esm/dev-server/dev-agent-tooling.mjs +135 -0
  311. package/esm/dev-server/dev-agent-tooling.mjs.map +1 -0
  312. package/esm/dev-server/dev-logger.mjs.map +1 -1
  313. package/esm/dev-server/development-server.mjs +8 -0
  314. package/esm/dev-server/development-server.mjs.map +1 -1
  315. package/esm/dev-server/extract-translation-keys.mjs +16 -17
  316. package/esm/dev-server/extract-translation-keys.mjs.map +1 -1
  317. package/esm/dev-server/file-manager.d.mts +3 -7
  318. package/esm/dev-server/file-manager.d.mts.map +1 -1
  319. package/esm/dev-server/file-operations.d.mts +1 -3
  320. package/esm/dev-server/file-operations.d.mts.map +1 -1
  321. package/esm/dev-server/files-orchestrator.mjs +4 -5
  322. package/esm/dev-server/files-orchestrator.mjs.map +1 -1
  323. package/esm/dev-server/files-watcher.mjs +12 -11
  324. package/esm/dev-server/files-watcher.mjs.map +1 -1
  325. package/esm/dev-server/health-checker/checkers/eslint-health-checker.mjs +2 -3
  326. package/esm/dev-server/health-checker/checkers/eslint-health-checker.mjs.map +1 -1
  327. package/esm/dev-server/health-checker/checkers/oxlint-health-checker.mjs +33 -0
  328. package/esm/dev-server/health-checker/checkers/oxlint-health-checker.mjs.map +1 -0
  329. package/esm/dev-server/health-checker/checkers/typescript-health-checker.mjs +36 -115
  330. package/esm/dev-server/health-checker/checkers/typescript-health-checker.mjs.map +1 -1
  331. package/esm/dev-server/health-checker/default-health-checkers.mjs +31 -0
  332. package/esm/dev-server/health-checker/default-health-checkers.mjs.map +1 -0
  333. package/esm/dev-server/health-checker/file-health-checker.contract.d.mts +12 -6
  334. package/esm/dev-server/health-checker/file-health-checker.contract.d.mts.map +1 -1
  335. package/esm/dev-server/health-checker/file-health-result.d.mts +2 -2
  336. package/esm/dev-server/health-checker/file-health-result.d.mts.map +1 -1
  337. package/esm/dev-server/health-checker/files-healthcare.manager.mjs +16 -4
  338. package/esm/dev-server/health-checker/files-healthcare.manager.mjs.map +1 -1
  339. package/esm/dev-server/health-checker/oxlint-runner.mjs +303 -0
  340. package/esm/dev-server/health-checker/oxlint-runner.mjs.map +1 -0
  341. package/esm/dev-server/health-checker/workers/eslint-health.worker.d.mts +1 -1
  342. package/esm/dev-server/health-checker/workers/oxlint-health.worker.d.mts +1 -0
  343. package/esm/dev-server/health-checker/workers/oxlint-health.worker.mjs +42 -0
  344. package/esm/dev-server/health-checker/workers/oxlint-health.worker.mjs.map +1 -0
  345. package/esm/dev-server/health-checker/workers/ts-health.worker.d.mts +1 -1
  346. package/esm/dev-server/health-checker/workers/ts-health.worker.mjs +40 -174
  347. package/esm/dev-server/health-checker/workers/ts-health.worker.mjs.map +1 -1
  348. package/esm/dev-server/loader/hook-thread.d.mts +4 -8
  349. package/esm/dev-server/loader/hook-thread.d.mts.map +1 -1
  350. package/esm/dev-server/loader/load-hook.d.mts +10 -6
  351. package/esm/dev-server/loader/load-hook.d.mts.map +1 -1
  352. package/esm/dev-server/loader/load-hook.mjs +4 -3
  353. package/esm/dev-server/loader/load-hook.mjs.map +1 -1
  354. package/esm/dev-server/loader/loader-port-acks.mjs +1 -1
  355. package/esm/dev-server/loader/loader-port-acks.mjs.map +1 -1
  356. package/esm/dev-server/loader/own-resolver.mjs +1 -1
  357. package/esm/dev-server/loader/register-loader.mjs +4 -3
  358. package/esm/dev-server/loader/register-loader.mjs.map +1 -1
  359. package/esm/dev-server/loader/resolve-hook.d.mts +2 -2
  360. package/esm/dev-server/loader/resolve-hook.d.mts.map +1 -1
  361. package/esm/dev-server/loader/resolve-hook.mjs +3 -2
  362. package/esm/dev-server/loader/resolve-hook.mjs.map +1 -1
  363. package/esm/dev-server/loader/transpile-cache.mjs +3 -2
  364. package/esm/dev-server/loader/transpile-cache.mjs.map +1 -1
  365. package/esm/dev-server/manifest-manager.d.mts +1 -3
  366. package/esm/dev-server/manifest-manager.d.mts.map +1 -1
  367. package/esm/dev-server/model-module-registry.mjs +3 -3
  368. package/esm/dev-server/model-module-registry.mjs.map +1 -1
  369. package/esm/dev-server/model-resource-typings.mjs +40 -47
  370. package/esm/dev-server/model-resource-typings.mjs.map +1 -1
  371. package/esm/dev-server/module-loader.mjs +3 -2
  372. package/esm/dev-server/module-loader.mjs.map +1 -1
  373. package/esm/dev-server/package-json-manager.mjs +1 -1
  374. package/esm/dev-server/parse-imports.mjs +7 -39
  375. package/esm/dev-server/parse-imports.mjs.map +1 -1
  376. package/esm/dev-server/read-config-ast.mjs +3 -33
  377. package/esm/dev-server/read-config-ast.mjs.map +1 -1
  378. package/esm/dev-server/ready-block.mjs +1 -1
  379. package/esm/dev-server/route-types-publisher.mjs +1 -1
  380. package/esm/dev-server/shortcuts.mjs +1 -1
  381. package/esm/dev-server/special-files-collector.d.mts +2 -4
  382. package/esm/dev-server/special-files-collector.d.mts.map +1 -1
  383. package/esm/dev-server/start-development-server.mjs.map +1 -1
  384. package/esm/dev-server/supervisor.mjs +1 -1
  385. package/esm/dev-server/translation-keys-sources.mjs +1 -1
  386. package/esm/dev-server/translation-keys-sources.mjs.map +1 -1
  387. package/esm/dev-server/tsconfig-manager.mjs +3 -3
  388. package/esm/dev-server/tsconfig-manager.mjs.map +1 -1
  389. package/esm/dev-server/type-generator.mjs +31 -38
  390. package/esm/dev-server/type-generator.mjs.map +1 -1
  391. package/esm/dev-server/types.d.mts +3 -4
  392. package/esm/dev-server/types.d.mts.map +1 -1
  393. package/esm/dev-server/update-check-cache.mjs +2 -2
  394. package/esm/dev-server/update-check-cache.mjs.map +1 -1
  395. package/esm/encryption/encrypt.d.mts +2 -3
  396. package/esm/encryption/encrypt.d.mts.map +1 -1
  397. package/esm/encryption/hash.d.mts +1 -2
  398. package/esm/encryption/hash.d.mts.map +1 -1
  399. package/esm/encryption/index.mjs +1 -1
  400. package/esm/encryption/password.d.mts +2 -3
  401. package/esm/encryption/password.d.mts.map +1 -1
  402. package/esm/encryption/types.d.mts +2 -3
  403. package/esm/encryption/types.d.mts.map +1 -1
  404. package/esm/errors/container-key-missing-error.mjs +1 -0
  405. package/esm/errors/container-key-missing-error.mjs.map +1 -1
  406. package/esm/errors/error-codes.d.mts +660 -0
  407. package/esm/errors/error-codes.d.mts.map +1 -0
  408. package/esm/errors/error-codes.mjs +634 -0
  409. package/esm/errors/error-codes.mjs.map +1 -0
  410. package/esm/errors/esbuild-binary-missing-error.mjs +1 -0
  411. package/esm/errors/esbuild-binary-missing-error.mjs.map +1 -1
  412. package/esm/errors/index.d.mts +3 -1
  413. package/esm/errors/index.mjs +3 -1
  414. package/esm/errors/unknown-locale-error.mjs +1 -0
  415. package/esm/errors/unknown-locale-error.mjs.map +1 -1
  416. package/esm/errors/warlock-error.d.mts +21 -0
  417. package/esm/errors/warlock-error.d.mts.map +1 -0
  418. package/esm/errors/warlock-error.mjs +22 -0
  419. package/esm/errors/warlock-error.mjs.map +1 -0
  420. package/esm/generations/add-command.action.mjs +22 -5
  421. package/esm/generations/add-command.action.mjs.map +1 -1
  422. package/esm/generations/features/access.feature.mjs +1 -1
  423. package/esm/generations/features/access.feature.mjs.map +1 -1
  424. package/esm/generations/features/bull-board.feature.mjs +3 -2
  425. package/esm/generations/features/bull-board.feature.mjs.map +1 -1
  426. package/esm/generations/features/mysql.feature.mjs.map +1 -1
  427. package/esm/generations/features/notifications.feature.mjs +7 -3
  428. package/esm/generations/features/notifications.feature.mjs.map +1 -1
  429. package/esm/generations/features/queue.feature.mjs +1 -1
  430. package/esm/generations/features/queue.feature.mjs.map +1 -1
  431. package/esm/generations/features/react-email.feature.mjs +1 -1
  432. package/esm/generations/features/react-email.feature.mjs.map +1 -1
  433. package/esm/generations/features/shadcn.feature.mjs +1 -1
  434. package/esm/generations/features/shadcn.feature.mjs.map +1 -1
  435. package/esm/generations/features/shared/link-ai-package-import.mjs +1 -1
  436. package/esm/generations/features/shared/link-ai-package-import.mjs.map +1 -1
  437. package/esm/generations/features/shared/merge-web-sitemap-config.mjs +16 -23
  438. package/esm/generations/features/shared/merge-web-sitemap-config.mjs.map +1 -1
  439. package/esm/generations/features/shared/patch-tsconfig-include.mjs +2 -2
  440. package/esm/generations/features/shared/patch-tsconfig-include.mjs.map +1 -1
  441. package/esm/generations/features/shared/relocate-conflicting-home-route.mjs +2 -2
  442. package/esm/generations/features/shared/relocate-conflicting-home-route.mjs.map +1 -1
  443. package/esm/generations/features/sitemap.feature.mjs +3 -2
  444. package/esm/generations/features/sitemap.feature.mjs.map +1 -1
  445. package/esm/generations/features/tailwind.feature.mjs +1 -1
  446. package/esm/generations/features/tailwind.feature.mjs.map +1 -1
  447. package/esm/generations/features/test.feature.mjs +11 -6
  448. package/esm/generations/features/test.feature.mjs.map +1 -1
  449. package/esm/generations/features/web.feature.mjs +1 -1
  450. package/esm/generations/features/web.feature.mjs.map +1 -1
  451. package/esm/generations/generation-fs.mjs +73 -0
  452. package/esm/generations/generation-fs.mjs.map +1 -0
  453. package/esm/generations/generation-run.mjs +185 -0
  454. package/esm/generations/generation-run.mjs.map +1 -0
  455. package/esm/generations/stubs.mjs +156 -14
  456. package/esm/generations/stubs.mjs.map +1 -1
  457. package/esm/http/boot-port-preflight.d.mts +4 -5
  458. package/esm/http/boot-port-preflight.d.mts.map +1 -1
  459. package/esm/http/boot-port-preflight.mjs +2 -2
  460. package/esm/http/boot-port-preflight.mjs.map +1 -1
  461. package/esm/http/bounded-stream-queue.d.mts +10 -0
  462. package/esm/http/bounded-stream-queue.d.mts.map +1 -0
  463. package/esm/http/bounded-stream-queue.mjs +97 -0
  464. package/esm/http/bounded-stream-queue.mjs.map +1 -0
  465. package/esm/http/build-cors-options.mjs +2 -2
  466. package/esm/http/build-cors-options.mjs.map +1 -1
  467. package/esm/http/build-rate-limit-options.d.mts +15 -3
  468. package/esm/http/build-rate-limit-options.d.mts.map +1 -1
  469. package/esm/http/build-rate-limit-options.mjs +1 -1
  470. package/esm/http/build-rate-limit-options.mjs.map +1 -1
  471. package/esm/http/conditional-request.d.mts +87 -0
  472. package/esm/http/conditional-request.d.mts.map +1 -0
  473. package/esm/http/conditional-request.mjs +121 -0
  474. package/esm/http/conditional-request.mjs.map +1 -0
  475. package/esm/http/config.d.mts +2 -4
  476. package/esm/http/config.d.mts.map +1 -1
  477. package/esm/http/config.mjs +2 -2
  478. package/esm/http/config.mjs.map +1 -1
  479. package/esm/http/context/request-context.d.mts +6 -7
  480. package/esm/http/context/request-context.d.mts.map +1 -1
  481. package/esm/http/context/request-memo.d.mts +1 -2
  482. package/esm/http/context/request-memo.d.mts.map +1 -1
  483. package/esm/http/createHttpApplication.d.mts +2 -3
  484. package/esm/http/createHttpApplication.d.mts.map +1 -1
  485. package/esm/http/createHttpApplication.mjs +2 -2
  486. package/esm/http/createHttpApplication.mjs.map +1 -1
  487. package/esm/http/csp.d.mts +12 -12
  488. package/esm/http/csp.d.mts.map +1 -1
  489. package/esm/http/csp.mjs +3 -2
  490. package/esm/http/csp.mjs.map +1 -1
  491. package/esm/http/csrf-default-guard.d.mts +2 -4
  492. package/esm/http/csrf-default-guard.d.mts.map +1 -1
  493. package/esm/http/csrf-default-guard.mjs +1 -1
  494. package/esm/http/csrf-default-guard.mjs.map +1 -1
  495. package/esm/http/csrf-origin-policy.d.mts +7 -9
  496. package/esm/http/csrf-origin-policy.d.mts.map +1 -1
  497. package/esm/http/csrf-origin-policy.mjs +2 -2
  498. package/esm/http/csrf-origin-policy.mjs.map +1 -1
  499. package/esm/http/database/RequestLog.d.mts +26 -87
  500. package/esm/http/database/RequestLog.d.mts.map +1 -1
  501. package/esm/http/error-codes.d.mts +1 -2
  502. package/esm/http/error-codes.d.mts.map +1 -1
  503. package/esm/http/error-mapper.d.mts +2 -4
  504. package/esm/http/error-mapper.d.mts.map +1 -1
  505. package/esm/http/error-mapper.mjs +2 -2
  506. package/esm/http/error-mapper.mjs.map +1 -1
  507. package/esm/http/errors/errors.d.mts +30 -29
  508. package/esm/http/errors/errors.d.mts.map +1 -1
  509. package/esm/http/errors/errors.mjs +1 -0
  510. package/esm/http/errors/errors.mjs.map +1 -1
  511. package/esm/http/escape-header-value.d.mts +17 -0
  512. package/esm/http/escape-header-value.d.mts.map +1 -0
  513. package/esm/http/escape-header-value.mjs +27 -0
  514. package/esm/http/escape-header-value.mjs.map +1 -0
  515. package/esm/http/events.d.mts +2 -4
  516. package/esm/http/events.d.mts.map +1 -1
  517. package/esm/http/flush-pending-cookies.mjs.map +1 -1
  518. package/esm/http/health.d.mts +4 -4
  519. package/esm/http/health.d.mts.map +1 -1
  520. package/esm/http/index.d.mts +9 -3
  521. package/esm/http/index.mjs +5 -2
  522. package/esm/http/lazy-static.mjs +194 -0
  523. package/esm/http/lazy-static.mjs.map +1 -0
  524. package/esm/http/middleware/cache-response-middleware.d.mts +2 -4
  525. package/esm/http/middleware/cache-response-middleware.d.mts.map +1 -1
  526. package/esm/http/middleware/concurrency-limit.middleware.d.mts +3 -3
  527. package/esm/http/middleware/concurrency-limit.middleware.d.mts.map +1 -1
  528. package/esm/http/middleware/idempotency.middleware.d.mts +3 -3
  529. package/esm/http/middleware/idempotency.middleware.d.mts.map +1 -1
  530. package/esm/http/middleware/idempotency.middleware.mjs +6 -6
  531. package/esm/http/middleware/idempotency.middleware.mjs.map +1 -1
  532. package/esm/http/middleware/index.d.mts +3 -1
  533. package/esm/http/middleware/index.mjs +1 -1
  534. package/esm/http/middleware/inject-request-context.d.mts +2 -4
  535. package/esm/http/middleware/inject-request-context.d.mts.map +1 -1
  536. package/esm/http/middleware/inject-request-context.mjs +3 -3
  537. package/esm/http/middleware/inject-request-context.mjs.map +1 -1
  538. package/esm/http/middleware/ip-filter.middleware.d.mts +3 -3
  539. package/esm/http/middleware/ip-filter.middleware.d.mts.map +1 -1
  540. package/esm/http/middleware/maintenance.middleware.d.mts +3 -3
  541. package/esm/http/middleware/maintenance.middleware.d.mts.map +1 -1
  542. package/esm/http/middleware/maintenance.middleware.mjs +4 -4
  543. package/esm/http/middleware/maintenance.middleware.mjs.map +1 -1
  544. package/esm/http/middleware/max-body-size.middleware.d.mts +2 -2
  545. package/esm/http/middleware/max-body-size.middleware.d.mts.map +1 -1
  546. package/esm/http/middleware/middleware-list.d.mts +1 -3
  547. package/esm/http/middleware/middleware-list.d.mts.map +1 -1
  548. package/esm/http/middleware/rate-limit.middleware.d.mts +3 -3
  549. package/esm/http/middleware/rate-limit.middleware.d.mts.map +1 -1
  550. package/esm/http/middleware/rate-limit.middleware.mjs +2 -2
  551. package/esm/http/middleware/rate-limit.middleware.mjs.map +1 -1
  552. package/esm/http/middleware/utils/cidr-match.d.mts +2 -3
  553. package/esm/http/middleware/utils/cidr-match.d.mts.map +1 -1
  554. package/esm/http/middleware/utils/idempotency-key.d.mts +3 -5
  555. package/esm/http/middleware/utils/idempotency-key.d.mts.map +1 -1
  556. package/esm/http/middleware/utils/index.d.mts +2 -1
  557. package/esm/http/middleware/utils/parse-size.d.mts +1 -2
  558. package/esm/http/middleware/utils/parse-size.d.mts.map +1 -1
  559. package/esm/http/middleware/utils/parse-size.mjs +2 -2
  560. package/esm/http/middleware/utils/parse-size.mjs.map +1 -1
  561. package/esm/http/plugins.d.mts +2 -4
  562. package/esm/http/plugins.d.mts.map +1 -1
  563. package/esm/http/plugins.mjs +17 -14
  564. package/esm/http/plugins.mjs.map +1 -1
  565. package/esm/http/port-preflight.d.mts +3 -4
  566. package/esm/http/port-preflight.d.mts.map +1 -1
  567. package/esm/http/rate-limit-cache-store.mjs +6 -4
  568. package/esm/http/rate-limit-cache-store.mjs.map +1 -1
  569. package/esm/http/ready-report.d.mts +15 -10
  570. package/esm/http/ready-report.d.mts.map +1 -1
  571. package/esm/http/request-controller.d.mts +1 -3
  572. package/esm/http/request-controller.d.mts.map +1 -1
  573. package/esm/http/request-log-snapshot.d.mts +26 -15
  574. package/esm/http/request-log-snapshot.d.mts.map +1 -1
  575. package/esm/http/request-log-snapshot.mjs +85 -6
  576. package/esm/http/request-log-snapshot.mjs.map +1 -1
  577. package/esm/http/request.d.mts +6 -5
  578. package/esm/http/request.d.mts.map +1 -1
  579. package/esm/http/request.mjs +13 -11
  580. package/esm/http/request.mjs.map +1 -1
  581. package/esm/http/response.d.mts +23 -12
  582. package/esm/http/response.d.mts.map +1 -1
  583. package/esm/http/response.mjs +169 -81
  584. package/esm/http/response.mjs.map +1 -1
  585. package/esm/http/safe-redirect.d.mts +50 -0
  586. package/esm/http/safe-redirect.d.mts.map +1 -0
  587. package/esm/http/safe-redirect.mjs +80 -0
  588. package/esm/http/safe-redirect.mjs.map +1 -0
  589. package/esm/http/serialized.d.mts +12 -13
  590. package/esm/http/serialized.d.mts.map +1 -1
  591. package/esm/http/server-rebuilt.d.mts +3 -5
  592. package/esm/http/server-rebuilt.d.mts.map +1 -1
  593. package/esm/http/server.d.mts +11 -9
  594. package/esm/http/server.d.mts.map +1 -1
  595. package/esm/http/server.mjs +17 -7
  596. package/esm/http/server.mjs.map +1 -1
  597. package/esm/http/stream-react-response.d.mts +7 -7
  598. package/esm/http/stream-react-response.d.mts.map +1 -1
  599. package/esm/http/stream-transport.mjs +4 -2
  600. package/esm/http/stream-transport.mjs.map +1 -1
  601. package/esm/http/tracing/index.mjs +1 -1
  602. package/esm/http/tracing/trace-id.d.mts +2 -3
  603. package/esm/http/tracing/trace-id.d.mts.map +1 -1
  604. package/esm/http/tracing/tracing-dispatcher.d.mts +10 -11
  605. package/esm/http/tracing/tracing-dispatcher.d.mts.map +1 -1
  606. package/esm/http/tracing/tracing-dispatcher.mjs +2 -2
  607. package/esm/http/tracing/tracing-dispatcher.mjs.map +1 -1
  608. package/esm/http/tracing/tracing.type.d.mts +11 -9
  609. package/esm/http/tracing/tracing.type.d.mts.map +1 -1
  610. package/esm/http/types.d.mts +78 -39
  611. package/esm/http/types.d.mts.map +1 -1
  612. package/esm/http/uploaded-file.d.mts +6 -5
  613. package/esm/http/uploaded-file.d.mts.map +1 -1
  614. package/esm/http/uploads/generate-image-variant.mjs +1 -1
  615. package/esm/http/uploads/generate-image-variants.d.mts +13 -10
  616. package/esm/http/uploads/generate-image-variants.d.mts.map +1 -1
  617. package/esm/http/uploads/generate-image-variants.mjs +62 -25
  618. package/esm/http/uploads/generate-image-variants.mjs.map +1 -1
  619. package/esm/http/uploads/image-variant-cache-entries.mjs +78 -0
  620. package/esm/http/uploads/image-variant-cache-entries.mjs.map +1 -0
  621. package/esm/http/uploads/image-variant-cache.mjs +72 -30
  622. package/esm/http/uploads/image-variant-cache.mjs.map +1 -1
  623. package/esm/http/uploads/image-variant-types.d.mts +9 -9
  624. package/esm/http/uploads/image-variant-types.d.mts.map +1 -1
  625. package/esm/http/uploads/image-variants-config-error.d.mts +4 -3
  626. package/esm/http/uploads/image-variants-config-error.d.mts.map +1 -1
  627. package/esm/http/uploads/image-variants-config-error.mjs +3 -2
  628. package/esm/http/uploads/image-variants-config-error.mjs.map +1 -1
  629. package/esm/http/uploads/index.d.mts +2 -1
  630. package/esm/http/uploads/index.mjs +1 -1
  631. package/esm/http/uploads/load-variant-source.mjs +1 -1
  632. package/esm/http/uploads/load-variant-source.mjs.map +1 -1
  633. package/esm/http/uploads/parse-uploaded-file-query.mjs +1 -1
  634. package/esm/http/uploads/parse-uploaded-file-query.mjs.map +1 -1
  635. package/esm/http/uploads/purge-image-variants.d.mts +9 -6
  636. package/esm/http/uploads/purge-image-variants.d.mts.map +1 -1
  637. package/esm/http/uploads/purge-image-variants.mjs +16 -16
  638. package/esm/http/uploads/purge-image-variants.mjs.map +1 -1
  639. package/esm/http/uploads/remote-variant-source.mjs +115 -0
  640. package/esm/http/uploads/remote-variant-source.mjs.map +1 -0
  641. package/esm/http/uploads/resolve-image-variant.d.mts +6 -9
  642. package/esm/http/uploads/resolve-image-variant.d.mts.map +1 -1
  643. package/esm/http/uploads/resolve-image-variant.mjs +10 -18
  644. package/esm/http/uploads/resolve-image-variant.mjs.map +1 -1
  645. package/esm/http/uploads/resolve-image-variants-config.mjs +7 -5
  646. package/esm/http/uploads/resolve-image-variants-config.mjs.map +1 -1
  647. package/esm/http/uploads/resolve-original-content-type.mjs +1 -1
  648. package/esm/http/uploads/resolve-original-content-type.mjs.map +1 -1
  649. package/esm/http/uploads/resolve-remote-image-variant.mjs +89 -0
  650. package/esm/http/uploads/resolve-remote-image-variant.mjs.map +1 -0
  651. package/esm/http/uploads/trim-image-variant-cache.mjs +193 -0
  652. package/esm/http/uploads/trim-image-variant-cache.mjs.map +1 -0
  653. package/esm/http/uploads/uploaded-file.controller.d.mts +9 -6
  654. package/esm/http/uploads/uploaded-file.controller.d.mts.map +1 -1
  655. package/esm/http/uploads/uploaded-file.controller.mjs +18 -9
  656. package/esm/http/uploads/uploaded-file.controller.mjs.map +1 -1
  657. package/esm/http/uploads/variant-cache-key.mjs +2 -2
  658. package/esm/http/uploads-config.d.mts +2 -4
  659. package/esm/http/uploads-config.d.mts.map +1 -1
  660. package/esm/http/uploads-types.d.mts +22 -16
  661. package/esm/http/uploads-types.d.mts.map +1 -1
  662. package/esm/http/xmlable.d.mts +1 -2
  663. package/esm/http/xmlable.d.mts.map +1 -1
  664. package/esm/image/image.d.mts +6 -7
  665. package/esm/image/image.d.mts.map +1 -1
  666. package/esm/image/image.mjs.map +1 -1
  667. package/esm/image/index.d.mts +2 -1
  668. package/esm/image/index.mjs +1 -1
  669. package/esm/index.d.mts +38 -6
  670. package/esm/index.mjs +14 -3
  671. package/esm/loader/app-module-importer.d.mts +1 -2
  672. package/esm/loader/app-module-importer.d.mts.map +1 -1
  673. package/esm/localization/index.mjs +1 -1
  674. package/esm/localization/parse-locale-dictionary.d.mts +6 -5
  675. package/esm/localization/parse-locale-dictionary.d.mts.map +1 -1
  676. package/esm/localization/parse-locale-dictionary.mjs +2 -1
  677. package/esm/localization/parse-locale-dictionary.mjs.map +1 -1
  678. package/esm/localization/register-locale-dictionary.d.mts +3 -4
  679. package/esm/localization/register-locale-dictionary.d.mts.map +1 -1
  680. package/esm/localization/register-locale-dictionary.mjs +2 -2
  681. package/esm/localization/register-locale-dictionary.mjs.map +1 -1
  682. package/esm/logger/fatal-visibility.d.mts +1 -2
  683. package/esm/logger/fatal-visibility.d.mts.map +1 -1
  684. package/esm/logger/index.d.mts +2 -1
  685. package/esm/logger/index.mjs +1 -1
  686. package/esm/logger/logger.d.mts +1 -3
  687. package/esm/logger/logger.d.mts.map +1 -1
  688. package/esm/logger/types.d.mts +2 -3
  689. package/esm/logger/types.d.mts.map +1 -1
  690. package/esm/mail/config.d.mts +21 -12
  691. package/esm/mail/config.d.mts.map +1 -1
  692. package/esm/mail/config.mjs +16 -1
  693. package/esm/mail/config.mjs.map +1 -1
  694. package/esm/mail/events.d.mts +4 -6
  695. package/esm/mail/events.d.mts.map +1 -1
  696. package/esm/mail/index.d.mts +3 -2
  697. package/esm/mail/index.mjs +2 -2
  698. package/esm/mail/mail.d.mts +1 -3
  699. package/esm/mail/mail.d.mts.map +1 -1
  700. package/esm/mail/mailer-pool.d.mts +5 -7
  701. package/esm/mail/mailer-pool.d.mts.map +1 -1
  702. package/esm/mail/react-mail.d.mts +1 -3
  703. package/esm/mail/react-mail.d.mts.map +1 -1
  704. package/esm/mail/send-mail.d.mts +1 -3
  705. package/esm/mail/send-mail.d.mts.map +1 -1
  706. package/esm/mail/send-mail.mjs +2 -1
  707. package/esm/mail/send-mail.mjs.map +1 -1
  708. package/esm/mail/test-mailbox.d.mts +11 -13
  709. package/esm/mail/test-mailbox.d.mts.map +1 -1
  710. package/esm/mail/types.d.mts +17 -18
  711. package/esm/mail/types.d.mts.map +1 -1
  712. package/esm/manifest/manifest-manager.mjs +1 -1
  713. package/esm/net/index.d.mts +2 -0
  714. package/esm/net/index.mjs +3 -0
  715. package/esm/openapi/build-openapi-document.d.mts +2 -4
  716. package/esm/openapi/build-openapi-document.d.mts.map +1 -1
  717. package/esm/openapi/build-openapi-document.mjs +8 -5
  718. package/esm/openapi/build-openapi-document.mjs.map +1 -1
  719. package/esm/openapi/cast-schema.mjs +1 -1
  720. package/esm/openapi/development-openapi-provider.d.mts +5 -6
  721. package/esm/openapi/development-openapi-provider.d.mts.map +1 -1
  722. package/esm/openapi/error-responses.mjs +28 -2
  723. package/esm/openapi/error-responses.mjs.map +1 -1
  724. package/esm/openapi/index.d.mts +3 -1
  725. package/esm/openapi/index.mjs +1 -1
  726. package/esm/openapi/openapi-child-output.mjs +2 -2
  727. package/esm/openapi/openapi-child-output.mjs.map +1 -1
  728. package/esm/openapi/postman/build-request-body.mjs.map +1 -1
  729. package/esm/openapi/postman/build-request-url.mjs +1 -1
  730. package/esm/openapi/postman/build-request-url.mjs.map +1 -1
  731. package/esm/openapi/postman/build-saved-responses.mjs.map +1 -1
  732. package/esm/openapi/postman/example-from-schema.d.mts +1 -3
  733. package/esm/openapi/postman/example-from-schema.d.mts.map +1 -1
  734. package/esm/openapi/postman/example-from-schema.mjs.map +1 -1
  735. package/esm/openapi/postman/index.d.mts +2 -1
  736. package/esm/openapi/postman/openapi-to-postman-collection.d.mts +3 -5
  737. package/esm/openapi/postman/openapi-to-postman-collection.d.mts.map +1 -1
  738. package/esm/openapi/postman/openapi-to-postman-collection.mjs.map +1 -1
  739. package/esm/openapi/postman/postman-types.d.mts +19 -18
  740. package/esm/openapi/postman/postman-types.d.mts.map +1 -1
  741. package/esm/openapi/postman/schema-refs.d.mts +1 -3
  742. package/esm/openapi/postman/schema-refs.d.mts.map +1 -1
  743. package/esm/openapi/postman/schema-refs.mjs.map +1 -1
  744. package/esm/openapi/postman/uuid-v5.mjs +1 -1
  745. package/esm/openapi/postman/uuid-v5.mjs.map +1 -1
  746. package/esm/openapi/request-schemas.mjs.map +1 -1
  747. package/esm/openapi/response-schemas.mjs.map +1 -1
  748. package/esm/openapi/schema-registry.d.mts +1 -0
  749. package/esm/openapi/schema-registry.mjs.map +1 -1
  750. package/esm/openapi/security.mjs +1 -1
  751. package/esm/openapi/security.mjs.map +1 -1
  752. package/esm/openapi/types.d.mts +23 -20
  753. package/esm/openapi/types.d.mts.map +1 -1
  754. package/esm/production/assert-generated-imports.mjs +2 -1
  755. package/esm/production/assert-generated-imports.mjs.map +1 -1
  756. package/esm/production/build-contributions.mjs +1 -1
  757. package/esm/production/bundle-framework-dependencies.mjs +1 -1
  758. package/esm/production/dist-build-manifest.mjs +1 -1
  759. package/esm/production/esbuild-plugins.mjs.map +1 -1
  760. package/esm/production/esbuild-preflight.mjs +1 -1
  761. package/esm/production/production-builder.mjs +14 -5
  762. package/esm/production/production-builder.mjs.map +1 -1
  763. package/esm/production/production-supervisor.mjs +1 -1
  764. package/esm/production/registration-child-runner.mjs +4 -3
  765. package/esm/production/registration-child-runner.mjs.map +1 -1
  766. package/esm/production/resolve-build-config.d.mts +4 -4
  767. package/esm/production/resolve-build-config.d.mts.map +1 -1
  768. package/esm/production/resolve-build-config.mjs +2 -1
  769. package/esm/production/resolve-build-config.mjs.map +1 -1
  770. package/esm/production/route-registration-child.d.mts +1 -1
  771. package/esm/production/route-registration-child.mjs +8 -7
  772. package/esm/production/route-registration-child.mjs.map +1 -1
  773. package/esm/production/route-registration-snapshot.mjs.map +1 -1
  774. package/esm/production/tsconfig-path-aliases.mjs +1 -1
  775. package/esm/react/index.d.mts +1 -3
  776. package/esm/react/index.d.mts.map +1 -1
  777. package/esm/react/index.mjs.map +1 -1
  778. package/esm/repositories/adapters/cascade/cascade-adapter.d.mts +3 -4
  779. package/esm/repositories/adapters/cascade/cascade-adapter.d.mts.map +1 -1
  780. package/esm/repositories/adapters/cascade/cascade-query-builder.d.mts +2 -3
  781. package/esm/repositories/adapters/cascade/cascade-query-builder.d.mts.map +1 -1
  782. package/esm/repositories/adapters/cascade/filter-applicator.mjs +10 -9
  783. package/esm/repositories/adapters/cascade/filter-applicator.mjs.map +1 -1
  784. package/esm/repositories/adapters/cascade/index.d.mts +2 -1
  785. package/esm/repositories/adapters/cascade/index.mjs +1 -1
  786. package/esm/repositories/contracts/index.d.mts +2 -1
  787. package/esm/repositories/contracts/query-builder.contract.d.mts +4 -6
  788. package/esm/repositories/contracts/query-builder.contract.d.mts.map +1 -1
  789. package/esm/repositories/contracts/repository-adapter.contract.d.mts +1 -3
  790. package/esm/repositories/contracts/repository-adapter.contract.d.mts.map +1 -1
  791. package/esm/repositories/contracts/types.d.mts +23 -25
  792. package/esm/repositories/contracts/types.d.mts.map +1 -1
  793. package/esm/repositories/index.d.mts +4 -1
  794. package/esm/repositories/index.mjs +1 -1
  795. package/esm/repositories/repository.manager.d.mts +2 -3
  796. package/esm/repositories/repository.manager.d.mts.map +1 -1
  797. package/esm/repositories/repository.manager.mjs +2 -2
  798. package/esm/repositories/repository.manager.mjs.map +1 -1
  799. package/esm/resource/define-resource.d.mts +3 -5
  800. package/esm/resource/define-resource.d.mts.map +1 -1
  801. package/esm/resource/index.d.mts +2 -1
  802. package/esm/resource/index.mjs +1 -1
  803. package/esm/resource/nullable-resource.d.mts +5 -7
  804. package/esm/resource/nullable-resource.d.mts.map +1 -1
  805. package/esm/resource/register-resource.d.mts +1 -3
  806. package/esm/resource/register-resource.d.mts.map +1 -1
  807. package/esm/resource/resource-field-builder.d.mts +1 -3
  808. package/esm/resource/resource-field-builder.d.mts.map +1 -1
  809. package/esm/resource/resource.d.mts +3 -5
  810. package/esm/resource/resource.d.mts.map +1 -1
  811. package/esm/resource/resource.mjs +4 -2
  812. package/esm/resource/resource.mjs.map +1 -1
  813. package/esm/resource/types.d.mts +21 -21
  814. package/esm/resource/types.d.mts.map +1 -1
  815. package/esm/restful/index.d.mts +2 -1
  816. package/esm/restful/index.mjs +1 -1
  817. package/esm/restful/restful.d.mts +11 -31
  818. package/esm/restful/restful.d.mts.map +1 -1
  819. package/esm/restful/restful.mjs.map +1 -1
  820. package/esm/router/build-route-rate-limit.mjs.map +1 -1
  821. package/esm/router/dev-dispatch.mjs +31 -12
  822. package/esm/router/dev-dispatch.mjs.map +1 -1
  823. package/esm/router/index.d.mts +5 -2
  824. package/esm/router/index.mjs +3 -1
  825. package/esm/router/log-request-lifecycle.mjs.map +1 -1
  826. package/esm/router/named-api-routes-with-responses.mjs +2 -1
  827. package/esm/router/named-api-routes-with-responses.mjs.map +1 -1
  828. package/esm/router/normalize-request-path.d.mts +1 -2
  829. package/esm/router/normalize-request-path.d.mts.map +1 -1
  830. package/esm/router/normalize-route-path.d.mts +1 -2
  831. package/esm/router/normalize-route-path.d.mts.map +1 -1
  832. package/esm/router/positional-handler-diagnostics.d.mts +15 -13
  833. package/esm/router/positional-handler-diagnostics.d.mts.map +1 -1
  834. package/esm/router/positional-handler-diagnostics.mjs.map +1 -1
  835. package/esm/router/resolve-route-rate-limit.mjs +47 -0
  836. package/esm/router/resolve-route-rate-limit.mjs.map +1 -0
  837. package/esm/router/resolve-route-validation.mjs +19 -0
  838. package/esm/router/resolve-route-validation.mjs.map +1 -0
  839. package/esm/router/route-builder.d.mts +1 -3
  840. package/esm/router/route-builder.d.mts.map +1 -1
  841. package/esm/router/route-guard-names.mjs +30 -0
  842. package/esm/router/route-guard-names.mjs.map +1 -0
  843. package/esm/router/route-name-method-suffix.d.mts +2 -3
  844. package/esm/router/route-name-method-suffix.d.mts.map +1 -1
  845. package/esm/router/route-name-taken-error.d.mts +12 -0
  846. package/esm/router/route-name-taken-error.d.mts.map +1 -0
  847. package/esm/router/route-name-taken-error.mjs +18 -0
  848. package/esm/router/route-name-taken-error.mjs.map +1 -0
  849. package/esm/router/route-registry.d.mts +1 -3
  850. package/esm/router/route-registry.d.mts.map +1 -1
  851. package/esm/router/router.d.mts +34 -17
  852. package/esm/router/router.d.mts.map +1 -1
  853. package/esm/router/router.mjs +74 -39
  854. package/esm/router/router.mjs.map +1 -1
  855. package/esm/router/types.d.mts +156 -37
  856. package/esm/router/types.d.mts.map +1 -1
  857. package/esm/router/unguarded-route-diagnostics.d.mts +38 -0
  858. package/esm/router/unguarded-route-diagnostics.d.mts.map +1 -0
  859. package/esm/router/unguarded-route-diagnostics.mjs +95 -0
  860. package/esm/router/unguarded-route-diagnostics.mjs.map +1 -0
  861. package/esm/socket/index.d.mts +2 -1
  862. package/esm/socket/index.mjs +1 -1
  863. package/esm/socket/types.d.mts +2 -4
  864. package/esm/socket/types.d.mts.map +1 -1
  865. package/esm/socket/utils.d.mts +1 -3
  866. package/esm/socket/utils.d.mts.map +1 -1
  867. package/esm/storage/config.d.mts +4 -6
  868. package/esm/storage/config.d.mts.map +1 -1
  869. package/esm/storage/context/storage-driver-context.d.mts +3 -4
  870. package/esm/storage/context/storage-driver-context.d.mts.map +1 -1
  871. package/esm/storage/drivers/cloud-driver.d.mts +2 -4
  872. package/esm/storage/drivers/cloud-driver.d.mts.map +1 -1
  873. package/esm/storage/drivers/cloud-driver.mjs.map +1 -1
  874. package/esm/storage/drivers/do-spaces-driver.d.mts +1 -3
  875. package/esm/storage/drivers/do-spaces-driver.d.mts.map +1 -1
  876. package/esm/storage/drivers/local-driver.d.mts +2 -3
  877. package/esm/storage/drivers/local-driver.d.mts.map +1 -1
  878. package/esm/storage/drivers/local-driver.mjs +8 -3
  879. package/esm/storage/drivers/local-driver.mjs.map +1 -1
  880. package/esm/storage/drivers/r2-driver.d.mts +1 -3
  881. package/esm/storage/drivers/r2-driver.d.mts.map +1 -1
  882. package/esm/storage/drivers/s3-driver.d.mts +1 -3
  883. package/esm/storage/drivers/s3-driver.d.mts.map +1 -1
  884. package/esm/storage/index.d.mts +2 -1
  885. package/esm/storage/index.mjs +1 -1
  886. package/esm/storage/local-disk-roots.mjs +24 -0
  887. package/esm/storage/local-disk-roots.mjs.map +1 -0
  888. package/esm/storage/scoped-storage.d.mts +2 -3
  889. package/esm/storage/scoped-storage.d.mts.map +1 -1
  890. package/esm/storage/storage-file.d.mts +1 -3
  891. package/esm/storage/storage-file.d.mts.map +1 -1
  892. package/esm/storage/storage.d.mts +17 -4
  893. package/esm/storage/storage.d.mts.map +1 -1
  894. package/esm/storage/storage.mjs +22 -0
  895. package/esm/storage/storage.mjs.map +1 -1
  896. package/esm/storage/types.d.mts +36 -36
  897. package/esm/storage/types.d.mts.map +1 -1
  898. package/esm/storage/utils/classify-ip-address.d.mts +1 -2
  899. package/esm/storage/utils/classify-ip-address.d.mts.map +1 -1
  900. package/esm/storage/utils/contain-path.d.mts +1 -2
  901. package/esm/storage/utils/contain-path.d.mts.map +1 -1
  902. package/esm/storage/utils/mime.d.mts +2 -3
  903. package/esm/storage/utils/mime.d.mts.map +1 -1
  904. package/esm/storage/utils/safe-fetch.d.mts +6 -6
  905. package/esm/storage/utils/safe-fetch.d.mts.map +1 -1
  906. package/esm/storage/utils/safe-fetch.mjs +3 -3
  907. package/esm/storage/utils/safe-fetch.mjs.map +1 -1
  908. package/esm/storage/utils/storage-capability-error.d.mts +1 -3
  909. package/esm/storage/utils/storage-capability-error.d.mts.map +1 -1
  910. package/esm/storage/utils/storage-error.d.mts +2 -3
  911. package/esm/storage/utils/storage-error.d.mts.map +1 -1
  912. package/esm/storage/utils/storage-not-initialized-error.d.mts +3 -2
  913. package/esm/storage/utils/storage-not-initialized-error.d.mts.map +1 -1
  914. package/esm/storage/utils/storage-not-initialized-error.mjs +1 -0
  915. package/esm/storage/utils/storage-not-initialized-error.mjs.map +1 -1
  916. package/esm/tests/authenticated-test-client.d.mts +31 -0
  917. package/esm/tests/authenticated-test-client.d.mts.map +1 -0
  918. package/esm/tests/authenticated-test-client.mjs +40 -0
  919. package/esm/tests/authenticated-test-client.mjs.map +1 -0
  920. package/esm/tests/factories.d.mts +74 -0
  921. package/esm/tests/factories.d.mts.map +1 -0
  922. package/esm/tests/factories.mjs +105 -0
  923. package/esm/tests/factories.mjs.map +1 -0
  924. package/esm/tests/fakes/cache-fake.d.mts +34 -0
  925. package/esm/tests/fakes/cache-fake.d.mts.map +1 -0
  926. package/esm/tests/fakes/cache-fake.mjs +79 -0
  927. package/esm/tests/fakes/cache-fake.mjs.map +1 -0
  928. package/esm/tests/fakes/clock-fake.d.mts +37 -0
  929. package/esm/tests/fakes/clock-fake.d.mts.map +1 -0
  930. package/esm/tests/fakes/clock-fake.mjs +69 -0
  931. package/esm/tests/fakes/clock-fake.mjs.map +1 -0
  932. package/esm/tests/fakes/fake-assertion-error.d.mts +12 -0
  933. package/esm/tests/fakes/fake-assertion-error.d.mts.map +1 -0
  934. package/esm/tests/fakes/fake-assertion-error.mjs +20 -0
  935. package/esm/tests/fakes/fake-assertion-error.mjs.map +1 -0
  936. package/esm/tests/fakes/ids-fake.d.mts +23 -0
  937. package/esm/tests/fakes/ids-fake.d.mts.map +1 -0
  938. package/esm/tests/fakes/ids-fake.mjs +57 -0
  939. package/esm/tests/fakes/ids-fake.mjs.map +1 -0
  940. package/esm/tests/fakes/index.d.mts +9 -0
  941. package/esm/tests/fakes/index.mjs +10 -0
  942. package/esm/tests/fakes/mail-fake.d.mts +49 -0
  943. package/esm/tests/fakes/mail-fake.d.mts.map +1 -0
  944. package/esm/tests/fakes/mail-fake.mjs +111 -0
  945. package/esm/tests/fakes/mail-fake.mjs.map +1 -0
  946. package/esm/tests/fakes/queue-fake.d.mts +56 -0
  947. package/esm/tests/fakes/queue-fake.d.mts.map +1 -0
  948. package/esm/tests/fakes/queue-fake.mjs +134 -0
  949. package/esm/tests/fakes/queue-fake.mjs.map +1 -0
  950. package/esm/tests/fakes/storage-fake.d.mts +35 -0
  951. package/esm/tests/fakes/storage-fake.d.mts.map +1 -0
  952. package/esm/tests/fakes/storage-fake.mjs +122 -0
  953. package/esm/tests/fakes/storage-fake.mjs.map +1 -0
  954. package/esm/tests/fakes/test-fakes.d.mts +38 -0
  955. package/esm/tests/fakes/test-fakes.d.mts.map +1 -0
  956. package/esm/tests/fakes/test-fakes.mjs +90 -0
  957. package/esm/tests/fakes/test-fakes.mjs.map +1 -0
  958. package/esm/tests/index.d.mts +15 -2
  959. package/esm/tests/index.mjs +15 -2
  960. package/esm/tests/snapshot-response.d.mts +33 -0
  961. package/esm/tests/snapshot-response.d.mts.map +1 -0
  962. package/esm/tests/snapshot-response.mjs +42 -0
  963. package/esm/tests/snapshot-response.mjs.map +1 -0
  964. package/esm/tests/start-http-development-server.d.mts +25 -5
  965. package/esm/tests/start-http-development-server.d.mts.map +1 -1
  966. package/esm/tests/start-http-development-server.mjs +41 -8
  967. package/esm/tests/start-http-development-server.mjs.map +1 -1
  968. package/esm/tests/test-connectors-selection.d.mts +2 -2
  969. package/esm/tests/test-connectors-selection.d.mts.map +1 -1
  970. package/esm/tests/test-connectors-selection.mjs +1 -1
  971. package/esm/tests/test-helpers.d.mts +28 -10
  972. package/esm/tests/test-helpers.d.mts.map +1 -1
  973. package/esm/tests/test-helpers.mjs +40 -27
  974. package/esm/tests/test-helpers.mjs.map +1 -1
  975. package/esm/tests/test-http-server.d.mts +66 -0
  976. package/esm/tests/test-http-server.d.mts.map +1 -0
  977. package/esm/tests/test-http-server.mjs +119 -0
  978. package/esm/tests/test-http-server.mjs.map +1 -0
  979. package/esm/tests/test-lifecycle-state.mjs +1 -1
  980. package/esm/tests/vitest-setup.d.mts +17 -7
  981. package/esm/tests/vitest-setup.d.mts.map +1 -1
  982. package/esm/tests/vitest-setup.mjs +12 -4
  983. package/esm/tests/vitest-setup.mjs.map +1 -1
  984. package/esm/tooling/agents-md/agents-md-markers.d.mts +26 -0
  985. package/esm/tooling/agents-md/agents-md-markers.d.mts.map +1 -0
  986. package/esm/tooling/agents-md/agents-md-markers.mjs +60 -0
  987. package/esm/tooling/agents-md/agents-md-markers.mjs.map +1 -0
  988. package/esm/tooling/agents-md/agents-md-refresher.d.mts +43 -0
  989. package/esm/tooling/agents-md/agents-md-refresher.d.mts.map +1 -0
  990. package/esm/tooling/agents-md/agents-md-refresher.mjs +72 -0
  991. package/esm/tooling/agents-md/agents-md-refresher.mjs.map +1 -0
  992. package/esm/tooling/agents-md/index.mjs +7 -0
  993. package/esm/tooling/agents-md/installed-skills.d.mts +34 -0
  994. package/esm/tooling/agents-md/installed-skills.d.mts.map +1 -0
  995. package/esm/tooling/agents-md/installed-skills.mjs +74 -0
  996. package/esm/tooling/agents-md/installed-skills.mjs.map +1 -0
  997. package/esm/tooling/agents-md/render-agents-md.d.mts +34 -0
  998. package/esm/tooling/agents-md/render-agents-md.d.mts.map +1 -0
  999. package/esm/tooling/agents-md/render-agents-md.mjs +195 -0
  1000. package/esm/tooling/agents-md/render-agents-md.mjs.map +1 -0
  1001. package/esm/tooling/agents-md/write-agents-md.d.mts +38 -0
  1002. package/esm/tooling/agents-md/write-agents-md.d.mts.map +1 -0
  1003. package/esm/tooling/agents-md/write-agents-md.mjs +49 -0
  1004. package/esm/tooling/agents-md/write-agents-md.mjs.map +1 -0
  1005. package/esm/tooling/board/board-message.d.mts +29 -0
  1006. package/esm/tooling/board/board-message.d.mts.map +1 -0
  1007. package/esm/tooling/board/board-message.mjs +86 -0
  1008. package/esm/tooling/board/board-message.mjs.map +1 -0
  1009. package/esm/tooling/board/board.d.mts +121 -0
  1010. package/esm/tooling/board/board.d.mts.map +1 -0
  1011. package/esm/tooling/board/board.mjs +407 -0
  1012. package/esm/tooling/board/board.mjs.map +1 -0
  1013. package/esm/tooling/board/board.types.d.mts +81 -0
  1014. package/esm/tooling/board/board.types.d.mts.map +1 -0
  1015. package/esm/tooling/board/board.types.mjs +54 -0
  1016. package/esm/tooling/board/board.types.mjs.map +1 -0
  1017. package/esm/tooling/check/changed-files.d.mts +31 -0
  1018. package/esm/tooling/check/changed-files.d.mts.map +1 -0
  1019. package/esm/tooling/check/changed-files.mjs +73 -0
  1020. package/esm/tooling/check/changed-files.mjs.map +1 -0
  1021. package/esm/tooling/check/check-report.types.d.mts +67 -0
  1022. package/esm/tooling/check/check-report.types.d.mts.map +1 -0
  1023. package/esm/tooling/check/check-report.types.mjs +37 -0
  1024. package/esm/tooling/check/check-report.types.mjs.map +1 -0
  1025. package/esm/tooling/check/code-style-conventions.mjs +106 -0
  1026. package/esm/tooling/check/code-style-conventions.mjs.map +1 -0
  1027. package/esm/tooling/check/conventions-step.d.mts +32 -0
  1028. package/esm/tooling/check/conventions-step.d.mts.map +1 -0
  1029. package/esm/tooling/check/conventions-step.mjs +173 -0
  1030. package/esm/tooling/check/conventions-step.mjs.map +1 -0
  1031. package/esm/tooling/check/environment-step.d.mts +16 -0
  1032. package/esm/tooling/check/environment-step.d.mts.map +1 -0
  1033. package/esm/tooling/check/environment-step.mjs +78 -0
  1034. package/esm/tooling/check/environment-step.mjs.map +1 -0
  1035. package/esm/tooling/check/index.mjs +10 -0
  1036. package/esm/tooling/check/lint-step.d.mts +18 -0
  1037. package/esm/tooling/check/lint-step.d.mts.map +1 -0
  1038. package/esm/tooling/check/lint-step.mjs +112 -0
  1039. package/esm/tooling/check/lint-step.mjs.map +1 -0
  1040. package/esm/tooling/check/request-input.mjs +132 -0
  1041. package/esm/tooling/check/request-input.mjs.map +1 -0
  1042. package/esm/tooling/check/run-check.d.mts +43 -0
  1043. package/esm/tooling/check/run-check.d.mts.map +1 -0
  1044. package/esm/tooling/check/run-check.mjs +192 -0
  1045. package/esm/tooling/check/run-check.mjs.map +1 -0
  1046. package/esm/tooling/check/run-tests.d.mts +55 -0
  1047. package/esm/tooling/check/run-tests.d.mts.map +1 -0
  1048. package/esm/tooling/check/run-tests.mjs +93 -0
  1049. package/esm/tooling/check/run-tests.mjs.map +1 -0
  1050. package/esm/tooling/check/security-conventions.mjs +650 -0
  1051. package/esm/tooling/check/security-conventions.mjs.map +1 -0
  1052. package/esm/tooling/check/source-ast.mjs +155 -0
  1053. package/esm/tooling/check/source-ast.mjs.map +1 -0
  1054. package/esm/tooling/check/source-files.mjs +27 -0
  1055. package/esm/tooling/check/source-files.mjs.map +1 -0
  1056. package/esm/tooling/check/tests-step.d.mts +33 -0
  1057. package/esm/tooling/check/tests-step.d.mts.map +1 -0
  1058. package/esm/tooling/check/tests-step.mjs +177 -0
  1059. package/esm/tooling/check/tests-step.mjs.map +1 -0
  1060. package/esm/tooling/dev-state/dev-server-state.d.mts +43 -0
  1061. package/esm/tooling/dev-state/dev-server-state.d.mts.map +1 -0
  1062. package/esm/tooling/dev-state/dev-server-state.mjs +67 -0
  1063. package/esm/tooling/dev-state/dev-server-state.mjs.map +1 -0
  1064. package/esm/tooling/devtools/devtools-client.d.mts +100 -0
  1065. package/esm/tooling/devtools/devtools-client.d.mts.map +1 -0
  1066. package/esm/tooling/devtools/devtools-client.mjs +155 -0
  1067. package/esm/tooling/devtools/devtools-client.mjs.map +1 -0
  1068. package/esm/tooling/generate/generation.d.mts +90 -0
  1069. package/esm/tooling/generate/generation.d.mts.map +1 -0
  1070. package/esm/tooling/generate/generation.mjs +127 -0
  1071. package/esm/tooling/generate/generation.mjs.map +1 -0
  1072. package/esm/tooling/generate/generator-spec.d.mts +57 -0
  1073. package/esm/tooling/generate/generator-spec.d.mts.map +1 -0
  1074. package/esm/tooling/generate/generator-spec.mjs +102 -0
  1075. package/esm/tooling/generate/generator-spec.mjs.map +1 -0
  1076. package/esm/tooling/generate/index.mjs +6 -0
  1077. package/esm/tooling/generate/project-files.mjs +121 -0
  1078. package/esm/tooling/generate/project-files.mjs.map +1 -0
  1079. package/esm/tooling/generate/run-cli.d.mts +43 -0
  1080. package/esm/tooling/generate/run-cli.d.mts.map +1 -0
  1081. package/esm/tooling/generate/run-cli.mjs +93 -0
  1082. package/esm/tooling/generate/run-cli.mjs.map +1 -0
  1083. package/esm/tooling/generate/unified-diff.d.mts +40 -0
  1084. package/esm/tooling/generate/unified-diff.d.mts.map +1 -0
  1085. package/esm/tooling/generate/unified-diff.mjs +161 -0
  1086. package/esm/tooling/generate/unified-diff.mjs.map +1 -0
  1087. package/esm/tooling/index.d.mts +42 -0
  1088. package/esm/tooling/index.mjs +45 -0
  1089. package/esm/tooling/inspect/boot-for-inspect.d.mts +23 -0
  1090. package/esm/tooling/inspect/boot-for-inspect.d.mts.map +1 -0
  1091. package/esm/tooling/inspect/boot-for-inspect.mjs +63 -0
  1092. package/esm/tooling/inspect/boot-for-inspect.mjs.map +1 -0
  1093. package/esm/tooling/inspect/collect-config.mjs +77 -0
  1094. package/esm/tooling/inspect/collect-config.mjs.map +1 -0
  1095. package/esm/tooling/inspect/collect-models.d.mts +10 -0
  1096. package/esm/tooling/inspect/collect-models.d.mts.map +1 -0
  1097. package/esm/tooling/inspect/collect-models.mjs +154 -0
  1098. package/esm/tooling/inspect/collect-models.mjs.map +1 -0
  1099. package/esm/tooling/inspect/collect-packages.d.mts +9 -0
  1100. package/esm/tooling/inspect/collect-packages.d.mts.map +1 -0
  1101. package/esm/tooling/inspect/collect-packages.mjs +157 -0
  1102. package/esm/tooling/inspect/collect-packages.mjs.map +1 -0
  1103. package/esm/tooling/inspect/collect-pages.mjs +108 -0
  1104. package/esm/tooling/inspect/collect-pages.mjs.map +1 -0
  1105. package/esm/tooling/inspect/collect-routes.mjs +168 -0
  1106. package/esm/tooling/inspect/collect-routes.mjs.map +1 -0
  1107. package/esm/tooling/inspect/event-recorder.d.mts +37 -0
  1108. package/esm/tooling/inspect/event-recorder.d.mts.map +1 -0
  1109. package/esm/tooling/inspect/event-recorder.mjs +91 -0
  1110. package/esm/tooling/inspect/event-recorder.mjs.map +1 -0
  1111. package/esm/tooling/inspect/index.d.mts +8 -0
  1112. package/esm/tooling/inspect/index.mjs +7 -0
  1113. package/esm/tooling/inspect/inspect-app.d.mts +62 -0
  1114. package/esm/tooling/inspect/inspect-app.d.mts.map +1 -0
  1115. package/esm/tooling/inspect/inspect-app.mjs +92 -0
  1116. package/esm/tooling/inspect/inspect-app.mjs.map +1 -0
  1117. package/esm/tooling/inspect/inspect-report.schema.d.mts +14 -0
  1118. package/esm/tooling/inspect/inspect-report.schema.d.mts.map +1 -0
  1119. package/esm/tooling/inspect/inspect-report.schema.mjs +463 -0
  1120. package/esm/tooling/inspect/inspect-report.schema.mjs.map +1 -0
  1121. package/esm/tooling/inspect/inspect-report.types.d.mts +228 -0
  1122. package/esm/tooling/inspect/inspect-report.types.d.mts.map +1 -0
  1123. package/esm/tooling/inspect/inspect-report.types.mjs +33 -0
  1124. package/esm/tooling/inspect/inspect-report.types.mjs.map +1 -0
  1125. package/esm/tooling/mcp/create-mcp-context.d.mts +29 -0
  1126. package/esm/tooling/mcp/create-mcp-context.d.mts.map +1 -0
  1127. package/esm/tooling/mcp/create-mcp-context.mjs +75 -0
  1128. package/esm/tooling/mcp/create-mcp-context.mjs.map +1 -0
  1129. package/esm/tooling/mcp/db-schema.d.mts +50 -0
  1130. package/esm/tooling/mcp/db-schema.d.mts.map +1 -0
  1131. package/esm/tooling/mcp/db-schema.mjs +56 -0
  1132. package/esm/tooling/mcp/db-schema.mjs.map +1 -0
  1133. package/esm/tooling/mcp/docs-search.d.mts +77 -0
  1134. package/esm/tooling/mcp/docs-search.d.mts.map +1 -0
  1135. package/esm/tooling/mcp/docs-search.mjs +178 -0
  1136. package/esm/tooling/mcp/docs-search.mjs.map +1 -0
  1137. package/esm/tooling/mcp/index.mjs +9 -0
  1138. package/esm/tooling/mcp/load-ai-tools.d.mts +61 -0
  1139. package/esm/tooling/mcp/load-ai-tools.d.mts.map +1 -0
  1140. package/esm/tooling/mcp/load-ai-tools.mjs +45 -0
  1141. package/esm/tooling/mcp/load-ai-tools.mjs.map +1 -0
  1142. package/esm/tooling/mcp/mcp-tools.d.mts +70 -0
  1143. package/esm/tooling/mcp/mcp-tools.d.mts.map +1 -0
  1144. package/esm/tooling/mcp/mcp-tools.mjs +514 -0
  1145. package/esm/tooling/mcp/mcp-tools.mjs.map +1 -0
  1146. package/esm/tooling/mcp/start-mcp-server.d.mts +63 -0
  1147. package/esm/tooling/mcp/start-mcp-server.d.mts.map +1 -0
  1148. package/esm/tooling/mcp/start-mcp-server.mjs +126 -0
  1149. package/esm/tooling/mcp/start-mcp-server.mjs.map +1 -0
  1150. package/esm/tooling/mcp/tool-input.d.mts +75 -0
  1151. package/esm/tooling/mcp/tool-input.d.mts.map +1 -0
  1152. package/esm/tooling/mcp/tool-input.mjs +72 -0
  1153. package/esm/tooling/mcp/tool-input.mjs.map +1 -0
  1154. package/esm/tooling/problem.d.mts +55 -0
  1155. package/esm/tooling/problem.d.mts.map +1 -0
  1156. package/esm/tooling/problem.mjs +28 -0
  1157. package/esm/tooling/problem.mjs.map +1 -0
  1158. package/esm/tooling/syntax/ast.mjs +230 -0
  1159. package/esm/tooling/syntax/ast.mjs.map +1 -0
  1160. package/esm/tooling/syntax/imports.mjs +34 -0
  1161. package/esm/tooling/syntax/imports.mjs.map +1 -0
  1162. package/esm/tooling/trace/trace-report.types.d.mts +85 -0
  1163. package/esm/tooling/trace/trace-report.types.d.mts.map +1 -0
  1164. package/esm/tooling/trace/trace-report.types.mjs +7 -0
  1165. package/esm/tooling/trace/trace-report.types.mjs.map +1 -0
  1166. package/esm/tooling/trace/trace-request.d.mts +90 -0
  1167. package/esm/tooling/trace/trace-request.d.mts.map +1 -0
  1168. package/esm/tooling/trace/trace-request.mjs +241 -0
  1169. package/esm/tooling/trace/trace-request.mjs.map +1 -0
  1170. package/esm/tooling/typecheck/index.mjs +3 -0
  1171. package/esm/tooling/typecheck/run-typecheck.d.mts +26 -0
  1172. package/esm/tooling/typecheck/run-typecheck.d.mts.map +1 -0
  1173. package/esm/tooling/typecheck/run-typecheck.mjs +90 -0
  1174. package/esm/tooling/typecheck/run-typecheck.mjs.map +1 -0
  1175. package/esm/tooling/typescript/compiler.d.mts +31 -0
  1176. package/esm/tooling/typescript/compiler.d.mts.map +1 -0
  1177. package/esm/tooling/typescript/compiler.mjs +120 -0
  1178. package/esm/tooling/typescript/compiler.mjs.map +1 -0
  1179. package/esm/updater/update-warlock-packages.mjs +3 -2
  1180. package/esm/updater/update-warlock-packages.mjs.map +1 -1
  1181. package/esm/upgrade/codemods/head-viewport.mjs +46 -0
  1182. package/esm/upgrade/codemods/head-viewport.mjs.map +1 -0
  1183. package/esm/upgrade/codemods/helpers.mjs +81 -0
  1184. package/esm/upgrade/codemods/helpers.mjs.map +1 -0
  1185. package/esm/upgrade/codemods/index.mjs +34 -0
  1186. package/esm/upgrade/codemods/index.mjs.map +1 -0
  1187. package/esm/upgrade/codemods/logger-sync-calls.mjs +57 -0
  1188. package/esm/upgrade/codemods/logger-sync-calls.mjs.map +1 -0
  1189. package/esm/upgrade/codemods/package-json.mjs +122 -0
  1190. package/esm/upgrade/codemods/package-json.mjs.map +1 -0
  1191. package/esm/upgrade/codemods/request-log-snapshot.mjs +82 -0
  1192. package/esm/upgrade/codemods/request-log-snapshot.mjs.map +1 -0
  1193. package/esm/upgrade/codemods/review-sites.mjs +262 -0
  1194. package/esm/upgrade/codemods/review-sites.mjs.map +1 -0
  1195. package/esm/upgrade/diff.mjs +119 -0
  1196. package/esm/upgrade/diff.mjs.map +1 -0
  1197. package/esm/upgrade/format-upgrade-report.mjs +32 -0
  1198. package/esm/upgrade/format-upgrade-report.mjs.map +1 -0
  1199. package/esm/upgrade/load-ts-morph.mjs +49 -0
  1200. package/esm/upgrade/load-ts-morph.mjs.map +1 -0
  1201. package/esm/upgrade/notes.mjs +16 -0
  1202. package/esm/upgrade/notes.mjs.map +1 -0
  1203. package/esm/upgrade/run-upgrade.mjs +246 -0
  1204. package/esm/upgrade/run-upgrade.mjs.map +1 -0
  1205. package/esm/upgrade/upgrade-command.action.mjs +37 -0
  1206. package/esm/upgrade/upgrade-command.action.mjs.map +1 -0
  1207. package/esm/upgrade/version.mjs +39 -0
  1208. package/esm/upgrade/version.mjs.map +1 -0
  1209. package/esm/use-cases/index.d.mts +2 -1
  1210. package/esm/use-cases/index.mjs +1 -1
  1211. package/esm/use-cases/types.d.mts +116 -63
  1212. package/esm/use-cases/types.d.mts.map +1 -1
  1213. package/esm/use-cases/use-case-broadcast.d.mts +1 -3
  1214. package/esm/use-cases/use-case-broadcast.d.mts.map +1 -1
  1215. package/esm/use-cases/use-case-events.d.mts +3 -5
  1216. package/esm/use-cases/use-case-events.d.mts.map +1 -1
  1217. package/esm/use-cases/use-case-pipeline.d.mts +6 -6
  1218. package/esm/use-cases/use-case-pipeline.d.mts.map +1 -1
  1219. package/esm/use-cases/use-case.d.mts +2 -4
  1220. package/esm/use-cases/use-case.d.mts.map +1 -1
  1221. package/esm/use-cases/use-case.errors.d.mts +1 -3
  1222. package/esm/use-cases/use-case.errors.d.mts.map +1 -1
  1223. package/esm/use-cases/use-cases-registry.d.mts +8 -10
  1224. package/esm/use-cases/use-cases-registry.d.mts.map +1 -1
  1225. package/esm/use-cases/use-cases-registry.mjs.map +1 -1
  1226. package/esm/utils/app-log.d.mts +1 -2
  1227. package/esm/utils/app-log.d.mts.map +1 -1
  1228. package/esm/utils/clock.d.mts +35 -0
  1229. package/esm/utils/clock.d.mts.map +1 -0
  1230. package/esm/utils/clock.mjs +27 -0
  1231. package/esm/utils/clock.mjs.map +1 -0
  1232. package/esm/utils/database-log.d.mts +3 -4
  1233. package/esm/utils/database-log.d.mts.map +1 -1
  1234. package/esm/utils/environment.d.mts +4 -5
  1235. package/esm/utils/environment.d.mts.map +1 -1
  1236. package/esm/utils/framework-vesion.mjs +1 -1
  1237. package/esm/utils/framework-vesion.mjs.map +1 -1
  1238. package/esm/utils/get-localized.d.mts +2 -3
  1239. package/esm/utils/get-localized.d.mts.map +1 -1
  1240. package/esm/utils/ids.d.mts +35 -0
  1241. package/esm/utils/ids.d.mts.map +1 -0
  1242. package/esm/utils/ids.mjs +33 -0
  1243. package/esm/utils/ids.mjs.map +1 -0
  1244. package/esm/utils/index.d.mts +5 -1
  1245. package/esm/utils/index.mjs +4 -1
  1246. package/esm/utils/normalized-path.d.mts +1 -2
  1247. package/esm/utils/normalized-path.d.mts.map +1 -1
  1248. package/esm/utils/npm-registry.d.mts +1 -2
  1249. package/esm/utils/npm-registry.d.mts.map +1 -1
  1250. package/esm/utils/paths.d.mts +13 -14
  1251. package/esm/utils/paths.d.mts.map +1 -1
  1252. package/esm/utils/paths.mjs +2 -2
  1253. package/esm/utils/paths.mjs.map +1 -1
  1254. package/esm/utils/promise-all-object.d.mts +1 -2
  1255. package/esm/utils/promise-all-object.d.mts.map +1 -1
  1256. package/esm/utils/queue.d.mts +1 -2
  1257. package/esm/utils/queue.d.mts.map +1 -1
  1258. package/esm/utils/runtime.d.mts +60 -0
  1259. package/esm/utils/runtime.d.mts.map +1 -0
  1260. package/esm/utils/runtime.mjs +85 -0
  1261. package/esm/utils/runtime.mjs.map +1 -0
  1262. package/esm/utils/sleep.d.mts +1 -2
  1263. package/esm/utils/sleep.d.mts.map +1 -1
  1264. package/esm/utils/sluggable.d.mts +1 -3
  1265. package/esm/utils/sluggable.d.mts.map +1 -1
  1266. package/esm/utils/to-json.d.mts +1 -2
  1267. package/esm/utils/to-json.d.mts.map +1 -1
  1268. package/esm/utils/types.d.mts +1 -2
  1269. package/esm/utils/types.d.mts.map +1 -1
  1270. package/esm/utils/urls.d.mts +5 -6
  1271. package/esm/utils/urls.d.mts.map +1 -1
  1272. package/esm/utils/version-compare.d.mts +1 -2
  1273. package/esm/utils/version-compare.d.mts.map +1 -1
  1274. package/esm/validation/database/exists-except-current-id.d.mts +2 -3
  1275. package/esm/validation/database/exists-except-current-id.d.mts.map +1 -1
  1276. package/esm/validation/database/exists-except-current-user.d.mts +2 -3
  1277. package/esm/validation/database/exists-except-current-user.d.mts.map +1 -1
  1278. package/esm/validation/database/index.d.mts +2 -1
  1279. package/esm/validation/database/index.mjs +1 -1
  1280. package/esm/validation/database/types.d.mts +14 -10
  1281. package/esm/validation/database/types.d.mts.map +1 -1
  1282. package/esm/validation/database/unique-except-current-id.d.mts +2 -3
  1283. package/esm/validation/database/unique-except-current-id.d.mts.map +1 -1
  1284. package/esm/validation/database/unique-except-current-user.d.mts +2 -3
  1285. package/esm/validation/database/unique-except-current-user.d.mts.map +1 -1
  1286. package/esm/validation/file/file.d.mts +4 -6
  1287. package/esm/validation/file/file.d.mts.map +1 -1
  1288. package/esm/validation/file/index.d.mts +2 -1
  1289. package/esm/validation/file/index.mjs +1 -1
  1290. package/esm/validation/index.d.mts +6 -2
  1291. package/esm/validation/index.mjs +1 -1
  1292. package/esm/validation/plugins/index.mjs +1 -1
  1293. package/esm/validation/types.d.mts +61 -4
  1294. package/esm/validation/types.d.mts.map +1 -1
  1295. package/esm/validation/validateAll.mjs +21 -4
  1296. package/esm/validation/validateAll.mjs.map +1 -1
  1297. package/esm/validation/validation-failure-status.mjs +15 -0
  1298. package/esm/validation/validation-failure-status.mjs.map +1 -0
  1299. package/esm/validation/validators/file-validator.d.mts +2 -20
  1300. package/esm/validation/validators/file-validator.d.mts.map +1 -1
  1301. package/esm/validation/validators/index.d.mts +2 -1
  1302. package/esm/validation/validators/index.mjs +1 -1
  1303. package/esm/vite/lower-stage3-decorators.d.mts +2 -3
  1304. package/esm/vite/lower-stage3-decorators.d.mts.map +1 -1
  1305. package/esm/warlock-config/bundle-config.mjs +1 -1
  1306. package/esm/warlock-config/define-config.d.mts +1 -3
  1307. package/esm/warlock-config/define-config.d.mts.map +1 -1
  1308. package/esm/warlock-config/define-config.mjs +3 -2
  1309. package/esm/warlock-config/define-config.mjs.map +1 -1
  1310. package/esm/warlock-config/index.d.mts +2 -1
  1311. package/esm/warlock-config/index.mjs +1 -1
  1312. package/esm/warlock-config/types.d.mts +31 -6
  1313. package/esm/warlock-config/types.d.mts.map +1 -1
  1314. package/esm/warlock-config/warlock-config.manager.d.mts +5 -7
  1315. package/esm/warlock-config/warlock-config.manager.d.mts.map +1 -1
  1316. package/esm/warlock-config/warlock-config.manager.mjs +2 -1
  1317. package/esm/warlock-config/warlock-config.manager.mjs.map +1 -1
  1318. package/esm/warlock-config/warn-deprecated-config.mjs +1 -1
  1319. package/llms-full.txt +3211 -731
  1320. package/llms.txt +16 -6
  1321. package/package.json +47 -15
  1322. package/schemas/inspect-report.schema.json +554 -0
  1323. package/skills/README.md +9 -0
  1324. package/skills/add-connector/SKILL.md +26 -38
  1325. package/skills/benchmark-code/SKILL.md +30 -24
  1326. package/skills/build-restful/SKILL.md +14 -14
  1327. package/skills/build-url/SKILL.md +18 -18
  1328. package/skills/configure-app/SKILL.md +107 -14
  1329. package/skills/create-controller/SKILL.md +25 -12
  1330. package/skills/create-module/SKILL.md +10 -3
  1331. package/skills/define-resource/SKILL.md +32 -29
  1332. package/skills/encrypt-data/SKILL.md +21 -19
  1333. package/skills/generate-openapi/SKILL.md +50 -24
  1334. package/skills/hash-password/SKILL.md +2 -2
  1335. package/skills/health-checks/SKILL.md +24 -7
  1336. package/skills/index.md +11 -4
  1337. package/skills/lower-stage3-decorators/SKILL.md +4 -4
  1338. package/skills/make-endpoint/SKILL.md +110 -0
  1339. package/skills/model-factories/SKILL.md +92 -0
  1340. package/skills/process-image/SKILL.md +32 -30
  1341. package/skills/register-route/SKILL.md +109 -10
  1342. package/skills/report-framework-issue.md +154 -0
  1343. package/skills/request-memo/SKILL.md +1 -1
  1344. package/skills/request-tracing/SKILL.md +4 -1
  1345. package/skills/resolve-path/SKILL.md +45 -44
  1346. package/skills/retry-operation/SKILL.md +20 -11
  1347. package/skills/run-app/SKILL.md +107 -22
  1348. package/skills/send-response/SKILL.md +179 -14
  1349. package/skills/store-file/SKILL.md +93 -53
  1350. package/skills/test-fakes/SKILL.md +123 -0
  1351. package/skills/test-http/SKILL.md +125 -21
  1352. package/skills/test-service/SKILL.md +41 -1
  1353. package/skills/update-packages/SKILL.md +29 -18
  1354. package/skills/upgrade-from-5-29/SKILL.md +454 -0
  1355. package/skills/upload-file/SKILL.md +31 -33
  1356. package/skills/use-app-context/SKILL.md +38 -31
  1357. package/skills/use-middleware/SKILL.md +45 -25
  1358. package/skills/use-model-transformers/SKILL.md +37 -28
  1359. package/skills/use-repository/SKILL.md +2 -2
  1360. package/skills/validate-input/SKILL.md +72 -28
  1361. package/skills/warlock-agents-md/SKILL.md +96 -0
  1362. package/skills/warlock-board/SKILL.md +123 -0
  1363. package/skills/warlock-check/SKILL.md +133 -0
  1364. package/skills/warlock-conventions/SKILL.md +115 -0
  1365. package/skills/warlock-doctor/SKILL.md +55 -22
  1366. package/skills/warlock-inspect/SKILL.md +134 -0
  1367. package/skills/warlock-mcp/SKILL.md +120 -0
  1368. package/skills/warlock-routes/SKILL.md +18 -11
  1369. package/skills/warlock-trace/SKILL.md +81 -0
  1370. package/skills/wire-socket/SKILL.md +8 -8
  1371. package/skills/write-seeder/SKILL.md +46 -32
  1372. package/skills/write-use-case/SKILL.md +40 -27
  1373. package/esm/http/uploads/matches-if-none-match.mjs +0 -13
  1374. package/esm/http/uploads/matches-if-none-match.mjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-codes.mjs","names":[],"sources":["../../../../../../../../packages/core/src/errors/error-codes.ts"],"sourcesContent":["/**\n * The registry of stable Warlock error codes.\n *\n * Every framework error core throws, every `warlock doctor` finding and every\n * `warlock check` problem carries one of these codes, so a person or an agent\n * can look the code up instead of interpreting the message. `warlock explain\n * <CODE>` prints an entry; the docs page `cli/error-codes` lists all of them.\n *\n * THE SCHEME: `WL` followed by four digits. The first digit is the area:\n *\n * | Range | Area | Meaning |\n * | ------ | ----------- | ---------------------------------------------------- |\n * | WL1xxx | config | a configuration value is missing or invalid |\n * | WL2xxx | boot | the app could not boot: modules, connectors, services |\n * | WL3xxx | routing | route registration and lookup |\n * | WL4xxx | validation | request validation schemas |\n * | WL5xxx | http | the HTTP layer at runtime |\n * | WL6xxx | database | migrations, seeders and database code |\n * | WL7xxx | cli | CLI usage, and problems `warlock check` finds in code |\n * | WL8xxx | environment | this machine: Node, tools, services, ports |\n * | WL9xxx | convention | framework conventions and release hygiene |\n *\n * STABILITY: a code, once released, keeps its meaning forever. Its `title`,\n * `fix` and links may be reworded; a code is never reused for a different\n * problem and never renumbered. A retired code stays in this table with\n * `retired: true`.\n *\n * `category` splits \"your code\" from \"this machine\": `environment` problems are\n * the ones `warlock check` reports with exit code 2, so an agent stops editing\n * code to fix a missing Redis server.\n *\n * This module is part of the side-effect-free `@warlock.js/core/errors` entry:\n * it imports nothing.\n */\n\n/** The area a code belongs to, matching its first digit. */\nexport type ErrorCodeArea =\n | \"config\"\n | \"boot\"\n | \"routing\"\n | \"validation\"\n | \"http\"\n | \"database\"\n | \"cli\"\n | \"environment\"\n | \"convention\";\n\n/**\n * Who has to act: `code` problems are fixed in the project's source or config,\n * `environment` problems on the machine running it.\n */\nexport type ErrorCodeCategory = \"code\" | \"environment\";\n\n/** One registry entry. */\nexport type ErrorCodeDefinition = {\n /** The stable code, e.g. `\"WL3001\"`. */\n readonly code: string;\n /** The area, matching the first digit. */\n readonly area: ErrorCodeArea;\n /** Whether the project or the machine has to change. */\n readonly category: ErrorCodeCategory;\n /** One-line name of the problem. */\n readonly title: string;\n /** One-line \"what to do\". */\n readonly fix: string;\n /** Slug of the skill that explains the fix (`packages/<pkg>/skills/<slug>/SKILL.md`). */\n readonly skill: string;\n /** Names of the error classes that carry this code, when an error class does. */\n readonly errorNames?: readonly string[];\n /** Set when the code is no longer emitted. Retired codes are never reused. */\n readonly retired?: true;\n};\n\n/** Base URL of the error-code reference; each code is an anchor on that page. */\nexport const ERROR_CODES_DOCS_URL = \"https://warlock.js.org/v/latest/core/cli/error-codes/\";\n\n/** The registry, keyed by code. */\nexport const ERROR_CODES = {\n // ── WL1xxx config ────────────────────────────────────────────────────────\n WL1001: {\n code: \"WL1001\",\n area: \"config\",\n category: \"code\",\n title: \"A required config section is missing\",\n fix: \"Add the missing file under src/config/ (for example src/config/app.ts) exporting the section.\",\n skill: \"configure-app\",\n },\n WL1002: {\n code: \"WL1002\",\n area: \"config\",\n category: \"code\",\n title: \"No JWT signing secret is configured\",\n fix: \"Run `warlock jwt.generate` (writes JWT_SECRET to .env) and read it as auth.accessToken.secret in src/config/auth.ts.\",\n skill: \"configure-app\",\n },\n WL1003: {\n code: \"WL1003\",\n area: \"config\",\n category: \"code\",\n title: \"The rate-limit store cannot use the configured cache driver\",\n fix: 'Use a redis, pg or memory cache driver for http.rateLimit store \"cache\", or set store: \"memory\".',\n skill: \"configure-app\",\n errorNames: [\"UnsupportedRateLimitDriverError\"],\n },\n WL1004: {\n code: \"WL1004\",\n area: \"config\",\n category: \"code\",\n title: \"An http.csp directive value is invalid\",\n fix: \"Fix the directive value named in the message in your http config; quotes must balance and values may not contain ';'.\",\n skill: \"configure-app\",\n errorNames: [\"InvalidCspDirectiveError\"],\n },\n WL1005: {\n code: \"WL1005\",\n area: \"config\",\n category: \"code\",\n title: \"The uploads.images configuration is invalid\",\n fix: \"Correct the uploads.images variant settings named in the message.\",\n skill: \"upload-file\",\n errorNames: [\"ImageVariantsConfigError\"],\n },\n WL1006: {\n code: \"WL1006\",\n area: \"config\",\n category: \"code\",\n title: \"warlock.config.ts sets a build option the builder refuses\",\n fix: \"Remove the named option from the build block of warlock.config.ts; change tsconfig.json instead.\",\n skill: \"run-app\",\n errorNames: [\"ForbiddenBuildOptionError\"],\n },\n WL1007: {\n code: \"WL1007\",\n area: \"config\",\n category: \"code\",\n title: \"A locale dictionary file cannot be parsed\",\n fix: \"Fix the key named in the message in the locales.json file it names.\",\n skill: \"use-localization\",\n errorNames: [\"LocaleDictionaryError\"],\n },\n WL1008: {\n code: \"WL1008\",\n area: \"config\",\n category: \"code\",\n title: \"A locale outside app.localeCodes was requested\",\n fix: \"Add the locale to app.localeCodes in src/config/app.ts, or pass a configured locale.\",\n skill: \"use-localization\",\n errorNames: [\"UnknownLocaleError\"],\n },\n WL1009: {\n code: \"WL1009\",\n area: \"config\",\n category: \"code\",\n title: \"warlock.config.ts > connectors was refused\",\n fix: \"Give every connector in warlock.config.ts a unique name that is not a built-in connector name.\",\n skill: \"add-connector\",\n },\n\n // ── WL2xxx boot ──────────────────────────────────────────────────────────\n WL2001: {\n code: \"WL2001\",\n area: \"boot\",\n category: \"code\",\n title: \"An app module failed to load\",\n fix: \"Open the file named in the message and fix the error it throws on import; its routes and listeners are missing until then.\",\n skill: \"warlock-doctor\",\n errorNames: [\"ModuleLoadError\"],\n },\n WL2002: {\n code: \"WL2002\",\n area: \"boot\",\n category: \"code\",\n title: \"The app's source files could not be discovered\",\n fix: \"Run the command from the project root and check that src/ exists and is readable.\",\n skill: \"warlock-doctor\",\n },\n WL2003: {\n code: \"WL2003\",\n area: \"boot\",\n category: \"code\",\n title: \"A connector failed to boot\",\n fix: \"Read the connector's message; it usually names the config value or package it needs.\",\n skill: \"add-connector\",\n },\n WL2004: {\n code: \"WL2004\",\n area: \"boot\",\n category: \"code\",\n title: \"A container key was read before it was registered\",\n fix: \"Register the key (container.set) before reading it, or read it after the connector that sets it has booted.\",\n skill: \"use-app-context\",\n errorNames: [\"ContainerKeyMissingError\"],\n },\n WL2005: {\n code: \"WL2005\",\n area: \"boot\",\n category: \"code\",\n title: \"A boot precondition failed\",\n fix: \"Fix the condition named in the message; restarting does not help until it changes.\",\n skill: \"run-app\",\n errorNames: [\"BootPreconditionError\"],\n },\n WL2006: {\n code: \"WL2006\",\n area: \"boot\",\n category: \"code\",\n title: \"Storage was used before the storage connector ran\",\n fix: 'Add src/config/storage.ts; in a custom command add \"storage\" to preload.connectors.',\n skill: \"store-file\",\n errorNames: [\"StorageNotInitializedError\"],\n },\n WL2007: {\n code: \"WL2007\",\n area: \"boot\",\n category: \"code\",\n title: \"A configured driver's package is not installed\",\n fix: \"Install the package named in the message (for example `pnpm add sharp`), or stop configuring the driver.\",\n skill: \"update-packages\",\n },\n\n // ── WL3xxx routing ───────────────────────────────────────────────────────\n WL3001: {\n code: \"WL3001\",\n area: \"routing\",\n category: \"code\",\n title: \"A route name is already taken\",\n fix: 'Rename one of the two routes with the \"name\" route option; pages and API routes share one namespace.',\n skill: \"register-route\",\n errorNames: [\"RouteNameTakenError\"],\n },\n WL3002: {\n code: \"WL3002\",\n area: \"routing\",\n category: \"code\",\n title: \"A route points at a controller method that does not exist\",\n fix: \"Fix the [controller, action] pair: the action must be a method on the controller.\",\n skill: \"register-route\",\n },\n WL3003: {\n code: \"WL3003\",\n area: \"routing\",\n category: \"code\",\n title: \"A URL was built for a route name that is not registered\",\n fix: \"Check the name passed to router.route(); `warlock routes --name <part>` lists the registered names.\",\n skill: \"warlock-routes\",\n },\n WL3004: {\n code: \"WL3004\",\n area: \"routing\",\n category: \"code\",\n title: \"A URL was built without one of the route's path parameters\",\n fix: \"Pass every :param of the route path when building the URL.\",\n skill: \"warlock-routes\",\n },\n WL3005: {\n code: \"WL3005\",\n area: \"routing\",\n category: \"code\",\n title: \"Route modules loaded but registered no routes\",\n fix: \"Make sure routes.ts calls router.get/post/... at module level and is not wrapped in an unused function.\",\n skill: \"register-route\",\n },\n WL3006: {\n code: \"WL3006\",\n area: \"routing\",\n category: \"code\",\n title: \"A handler uses the v4 (request, response) signature\",\n fix: \"Rewrite the handler as async ({ request, response }) => { ... }.\",\n skill: \"create-controller\",\n },\n\n // ── WL4xxx validation ────────────────────────────────────────────────────\n WL4001: {\n code: \"WL4001\",\n area: \"validation\",\n category: \"code\",\n title: \"A validation schema cannot be described as JSON Schema\",\n fix: \"Use Seal validators with a static shape for validation.schema/params; custom validate middleware is not described.\",\n skill: \"validate-input\",\n },\n\n // ── WL5xxx http ──────────────────────────────────────────────────────────\n WL5001: {\n code: \"WL5001\",\n area: \"http\",\n category: \"code\",\n title: \"A cookie was read but the cookie plugin is not registered\",\n fix: \"Register @fastify/cookie on the server before reading cookies by name.\",\n skill: \"send-response\",\n errorNames: [\"CookieJarUnavailableError\"],\n },\n WL5002: {\n code: \"WL5002\",\n area: \"http\",\n category: \"code\",\n title: \"An app route claims a health-probe path\",\n fix: \"Move the app route, or rename the probe with http.health.path / http.health.readinessPath.\",\n skill: \"health-checks\",\n },\n WL5003: {\n code: \"WL5003\",\n area: \"http\",\n category: \"code\",\n title: \"Health probes are enabled but not registered\",\n fix: \"Check that the http connector booted and that nothing removed the probe routes.\",\n skill: \"health-checks\",\n },\n WL5004: {\n code: \"WL5004\",\n area: \"http\",\n category: \"code\",\n title: \"Devtools recorded no timeline for the traced request\",\n fix: \"Keep http.requestId enabled (its echoed header is how the request is found) and retry; a path under the devtools prefix is never recorded.\",\n skill: \"warlock-trace\",\n },\n\n // ── WL6xxx database ──────────────────────────────────────────────────────\n WL6001: {\n code: \"WL6001\",\n area: \"database\",\n category: \"code\",\n title: \"A seeder depends on a seeder that is not registered\",\n fix: \"Fix the dependsOn name, or register the missing seeder.\",\n skill: \"write-seeder\",\n errorNames: [\"UnknownSeederDependencyError\"],\n },\n WL6002: {\n code: \"WL6002\",\n area: \"database\",\n category: \"code\",\n title: \"Seeder dependencies form a cycle\",\n fix: \"Remove one dependsOn edge from the cycle printed in the message.\",\n skill: \"write-seeder\",\n errorNames: [\"SeederDependencyCycleError\"],\n },\n\n // ── WL7xxx cli and checked code ──────────────────────────────────────────\n WL7001: {\n code: \"WL7001\",\n area: \"cli\",\n category: \"code\",\n title: \"A boolean CLI option received a value it cannot read\",\n fix: \"Pass true/false/1/0/yes/no, or the flag on its own for true.\",\n skill: \"write-cli-command\",\n errorNames: [\"CliOptionValueError\"],\n },\n WL7002: {\n code: \"WL7002\",\n area: \"cli\",\n category: \"code\",\n title: \"Generated code imports a package the app does not declare\",\n fix: \"Add the named package to the app's dependencies, or import it through @warlock.js/core.\",\n skill: \"run-app\",\n errorNames: [\"UndeclaredGeneratedImportError\"],\n },\n WL7003: {\n code: \"WL7003\",\n area: \"cli\",\n category: \"code\",\n title: \"A command needs an optional package that is not installed\",\n fix: \"Install the packages named in the message as dev dependencies (warlock mcp needs @warlock.js/ai-tools and @warlock.js/ai).\",\n skill: \"warlock-mcp\",\n },\n WL7004: {\n code: \"WL7004\",\n area: \"cli\",\n category: \"code\",\n title: \"warlock mcp was asked to listen off loopback without a token\",\n fix: \"Pass --token (or set WARLOCK_MCP_TOKEN) when --host is not 127.0.0.1, ::1 or localhost, or keep the default loopback host.\",\n skill: \"warlock-mcp\",\n },\n WL7005: {\n code: \"WL7005\",\n area: \"cli\",\n category: \"code\",\n title: \"An MCP tool that writes files was called on a read-only server\",\n fix: \"Restart the server with --allow-writes to let generate tools write; without it they only return the diff.\",\n skill: \"warlock-mcp\",\n },\n WL7101: {\n code: \"WL7101\",\n area: \"cli\",\n category: \"code\",\n title: \"TypeScript reports a type error\",\n fix: \"Fix the type error at the reported position; the TypeScript code (TS1234) is in `rule`.\",\n skill: \"warlock-check\",\n },\n WL7102: {\n code: \"WL7102\",\n area: \"cli\",\n category: \"code\",\n title: \"tsconfig.json is missing or invalid\",\n fix: \"Fix tsconfig.json at the project root; the message names the problem.\",\n skill: \"warlock-check\",\n },\n WL7201: {\n code: \"WL7201\",\n area: \"cli\",\n category: \"code\",\n title: \"The linter reports an error\",\n fix: \"Fix the lint error at the reported position; the rule id is in `rule`.\",\n skill: \"warlock-check\",\n },\n WL7202: {\n code: \"WL7202\",\n area: \"cli\",\n category: \"code\",\n title: \"The linter reports a warning\",\n fix: \"Fix the warning, or change the rule's severity in the lint config if it does not apply.\",\n skill: \"warlock-check\",\n },\n WL7301: {\n code: \"WL7301\",\n area: \"cli\",\n category: \"code\",\n title: \"A test failed\",\n fix: \"Run the test file alone, read the assertion message and fix the code or the test.\",\n skill: \"warlock-check\",\n },\n WL7302: {\n code: \"WL7302\",\n area: \"cli\",\n category: \"code\",\n title: \"A test file failed before its tests ran\",\n fix: \"Fix the import or setup error named in the message; none of the file's tests ran.\",\n skill: \"warlock-check\",\n },\n WL7401: {\n code: \"WL7401\",\n area: \"cli\",\n category: \"code\",\n title: \"The agent board is not initialized\",\n fix: \"Run `warlock board init` at the project root first.\",\n skill: \"warlock-board\",\n },\n WL7402: {\n code: \"WL7402\",\n area: \"cli\",\n category: \"code\",\n title: \"A board item does not exist\",\n fix: \"Run `warlock board status` to list the item ids.\",\n skill: \"warlock-board\",\n },\n WL7403: {\n code: \"WL7403\",\n area: \"cli\",\n category: \"code\",\n title: \"A board item cannot move to the requested state\",\n fix: \"Use one of the next states listed in the message; `warlock board status <id>` shows the item's current state.\",\n skill: \"warlock-board\",\n },\n WL7404: {\n code: \"WL7404\",\n area: \"cli\",\n category: \"code\",\n title: \"No board message arrived before the watch timed out\",\n fix: \"Run `warlock board watch` again, or raise --timeout.\",\n skill: \"warlock-board\",\n },\n WL7501: {\n code: \"WL7501\",\n area: \"cli\",\n category: \"code\",\n title: \"AGENTS.md has malformed generated-section markers\",\n fix: \"Keep one `<!-- warlock:generated:start -->` line followed by one `<!-- warlock:generated:end -->` line, or remove both.\",\n skill: \"warlock-agents-md\",\n },\n\n // ── WL8xxx environment ───────────────────────────────────────────────────\n WL8001: {\n code: \"WL8001\",\n area: \"environment\",\n category: \"environment\",\n title: \"The Node.js version is not supported\",\n fix: \"Switch to a Node.js version that satisfies the engines range in the message (for example with nvm).\",\n skill: \"update-packages\",\n },\n WL8002: {\n code: \"WL8002\",\n area: \"environment\",\n category: \"environment\",\n title: \"A tool the project is configured to use is not installed\",\n fix: \"Install the tool named in the message (pnpm install), or remove its config file.\",\n skill: \"warlock-check\",\n },\n WL8003: {\n code: \"WL8003\",\n area: \"environment\",\n category: \"environment\",\n title: \"A service the code needs is unreachable\",\n fix: \"Start the service named in the message (database, Redis, ...) or point the config at a running one.\",\n skill: \"warlock-check\",\n },\n WL8004: {\n code: \"WL8004\",\n area: \"environment\",\n category: \"environment\",\n title: \"A port is already in use\",\n fix: \"Stop whatever listens on the port, or use another port (port 0 in tests).\",\n skill: \"run-app\",\n errorNames: [\"PortInUseError\"],\n },\n WL8005: {\n code: \"WL8005\",\n area: \"environment\",\n category: \"environment\",\n title: \"esbuild's native binary is not installed\",\n fix: \"Run `pnpm approve-builds`, then reinstall dependencies without skipping install scripts.\",\n skill: \"run-app\",\n errorNames: [\"EsbuildBinaryMissingError\"],\n },\n WL8006: {\n code: \"WL8006\",\n area: \"environment\",\n category: \"environment\",\n title: \"Git cannot list the changed files\",\n fix: \"Run inside a git repository with git on PATH, or run the command without --changed.\",\n skill: \"warlock-check\",\n },\n WL8007: {\n code: \"WL8007\",\n area: \"environment\",\n category: \"environment\",\n title: \"A tool crashed, timed out or ran out of memory\",\n fix: \"Re-run the step; if it repeats, raise the memory limit (NODE_OPTIONS=--max-old-space-size) or use --changed.\",\n skill: \"warlock-check\",\n },\n WL8008: {\n code: \"WL8008\",\n area: \"environment\",\n category: \"environment\",\n title: \"The dev server is not running\",\n fix: \"Start `warlock dev` in this project, or pass --url with the address of a running dev server.\",\n skill: \"warlock-trace\",\n },\n WL8009: {\n code: \"WL8009\",\n area: \"environment\",\n category: \"environment\",\n title: \"Devtools is not running in the dev server\",\n fix: \"Install it with `warlock add devtools` and restart `warlock dev`; devtools answers loopback requests in development only.\",\n skill: \"warlock-trace\",\n },\n\n // ── WL9xxx conventions and hygiene ───────────────────────────────────────\n WL9001: {\n code: \"WL9001\",\n area: \"convention\",\n category: \"code\",\n title: \"An auto-loaded file is imported\",\n fix: \"Remove the import: routes.ts, main.ts, worker.ts and events/ files are loaded by the framework.\",\n skill: \"warlock-conventions\",\n },\n WL9002: {\n code: \"WL9002\",\n area: \"convention\",\n category: \"code\",\n title: \"An import path ends in .js\",\n fix: \"Drop the .js extension from the import path.\",\n skill: \"warlock-conventions\",\n },\n WL9003: {\n code: \"WL9003\",\n area: \"convention\",\n category: \"code\",\n title: \"A relative import reaches into another module\",\n fix: \"Import across modules through the app/<module>/... alias instead of ../../.\",\n skill: \"warlock-conventions\",\n },\n WL9004: {\n code: \"WL9004\",\n area: \"convention\",\n category: \"code\",\n title: \"tsconfig.json enables legacy experimentalDecorators\",\n fix: 'Remove \"experimentalDecorators\": true from tsconfig.json; Cascade uses standard decorators.',\n skill: \"lower-stage3-decorators\",\n },\n WL9005: {\n code: \"WL9005\",\n area: \"convention\",\n category: \"code\",\n title: \"`request.all()` is passed to a query, a service or inApp()\",\n fix: \"Give the route a validation schema and pass `request.validated()`, which holds only the fields the schema accepted (mass assignment otherwise).\",\n skill: \"warlock-conventions\",\n },\n WL9006: {\n code: \"WL9006\",\n area: \"convention\",\n category: \"code\",\n title: \"A mutating route has no auth guard and is not marked public\",\n fix: \"Register the POST/PUT/PATCH/DELETE route inside `guarded()` (or with auth middleware), or pass `{ public: true }` if it is meant to be open.\",\n skill: \"warlock-conventions\",\n },\n WL9007: {\n code: \"WL9007\",\n area: \"convention\",\n category: \"code\",\n title: \"A redirect or link target comes from request input\",\n fix: \"Wrap the target in `safeRedirect()` (server, @warlock.js/core) or `safeRedirectTarget()` (pages, @warlock.js/web), or check it with `isSafeRedirect()` first.\",\n skill: \"warlock-conventions\",\n },\n WL9008: {\n code: \"WL9008\",\n area: \"convention\",\n category: \"code\",\n title: \"A raw email, credential or request body is logged\",\n fix: \"Pass the value through `maskEmail()`, `redact()`, `escapeLogValue()` or `request.toLogSnapshot()`, or log it under a key the logger censors (`token`, `password`, ...).\",\n skill: \"warlock-conventions\",\n },\n WL9009: {\n code: \"WL9009\",\n area: \"convention\",\n category: \"code\",\n title: \"A regex with an unbounded quantifier runs on request input\",\n fix: \"Bound the repetition (`{1,256}` instead of `+` or `*`) or cap the input length before matching.\",\n skill: \"warlock-conventions\",\n },\n WL9010: {\n code: \"WL9010\",\n area: \"convention\",\n category: \"code\",\n title: \"`await` on a synchronous log call\",\n fix: \"Remove the `await`: `log.info()` and its siblings return the logger; `await log.flush()` waits for delivery.\",\n skill: \"warlock-conventions\",\n },\n WL9011: {\n code: \"WL9011\",\n area: \"convention\",\n category: \"code\",\n title: \"A file defines more than one controller\",\n fix: \"Move each extra controller into its own `<name>.controller.ts` file.\",\n skill: \"warlock-conventions\",\n },\n WL9012: {\n code: \"WL9012\",\n area: \"convention\",\n category: \"code\",\n title: \"A tagged union uses `kind` as its discriminator\",\n fix: \"Rename the discriminator to `type` and update the code that narrows on it.\",\n skill: \"warlock-conventions\",\n },\n WL9101: {\n code: \"WL9101\",\n area: \"convention\",\n category: \"code\",\n title: \"A module still uses the deprecated utils/locales.ts\",\n fix: \"Run `warlock doctor --fix` to convert it to locales.json, or convert it by hand.\",\n skill: \"use-localization\",\n },\n WL9102: {\n code: \"WL9102\",\n area: \"convention\",\n category: \"code\",\n title: \"package.json version and CHANGELOG.md disagree\",\n fix: \"Add a CHANGELOG.md heading for the package.json version, or fix the version.\",\n skill: \"warlock-doctor\",\n },\n WL9103: {\n code: \"WL9103\",\n area: \"convention\",\n category: \"code\",\n title: \"CHANGELOG.md is missing or has no version heading\",\n fix: \"Add a CHANGELOG.md with a `## x.y.z` heading for the current version.\",\n skill: \"warlock-doctor\",\n },\n} as const satisfies Record<string, ErrorCodeDefinition>;\n\n/** Every registered code, as a union. */\nexport type WarlockErrorCode = keyof typeof ERROR_CODES;\n\n/** Whether `value` is a registered code. */\nexport function isWarlockErrorCode(value: unknown): value is WarlockErrorCode {\n return typeof value === \"string\" && Object.prototype.hasOwnProperty.call(ERROR_CODES, value);\n}\n\n/**\n * The registry entry for a code, or `undefined` for an unknown one. Case and\n * surrounding whitespace are ignored, so `explainErrorCode(\" wl3001 \")` works.\n */\nexport function explainErrorCode(code: string): ErrorCodeDefinition | undefined {\n const normalized = code.trim().toUpperCase();\n\n return isWarlockErrorCode(normalized) ? ERROR_CODES[normalized] : undefined;\n}\n\n/** The docs URL of a code: the reference page with the code as its anchor. */\nexport function errorCodeDocsUrl(code: WarlockErrorCode): string {\n return `${ERROR_CODES_DOCS_URL}#${code.toLowerCase()}`;\n}\n\n/** Node errno codes that mean \"the machine\", mapped to the Warlock code. */\nconst SYSTEM_ERROR_CODES: Readonly<Record<string, WarlockErrorCode>> = {\n ECONNREFUSED: \"WL8003\",\n ENOTFOUND: \"WL8003\",\n EHOSTUNREACH: \"WL8003\",\n ETIMEDOUT: \"WL8003\",\n EADDRINUSE: \"WL8004\",\n ERR_OUT_OF_MEMORY: \"WL8007\",\n};\n\nfunction readStringProperty(value: object, key: string): string | undefined {\n const property = Reflect.get(value, key);\n\n return typeof property === \"string\" ? property : undefined;\n}\n\n/**\n * The Warlock code of a thrown value, or `undefined` when it has none.\n *\n * Reads, in order: a registered `code` property (framework errors carry one);\n * the error's `name`, for classes whose `code` property already means\n * something else (`PortInUseError.code` is Node's `\"EADDRINUSE\"`); a Node\n * system errno such as `ECONNREFUSED`; then the same checks on `cause`. Reading\n * by name rather than `instanceof` keeps the answer right when two copies of\n * core are loaded.\n */\nexport function errorCodeOf(error: unknown): WarlockErrorCode | undefined {\n const seen = new Set<unknown>();\n let current: unknown = error;\n\n while (typeof current === \"object\" && current !== null && !seen.has(current)) {\n seen.add(current);\n\n const code = readStringProperty(current, \"code\");\n\n if (isWarlockErrorCode(code)) {\n return code;\n }\n\n const name = readStringProperty(current, \"name\");\n\n if (name) {\n for (const definition of Object.values(ERROR_CODES) as ErrorCodeDefinition[]) {\n if (definition.errorNames?.includes(name) && isWarlockErrorCode(definition.code)) {\n return definition.code;\n }\n }\n }\n\n if (code && SYSTEM_ERROR_CODES[code]) {\n return SYSTEM_ERROR_CODES[code];\n }\n\n current = Reflect.get(current, \"cause\");\n }\n\n return undefined;\n}\n"],"mappings":"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"}
@@ -11,6 +11,7 @@
11
11
  var EsbuildBinaryMissingError = class extends Error {
12
12
  constructor(options) {
13
13
  super("esbuild's native binary is not installed or linked for this platform, so `warlock dev` / `warlock build` cannot run.\n\nThis usually happens when a platform package such as `@esbuild/win32-x64` was never installed, or the package manager skipped esbuild's postinstall script that links it. Fix it with:\n\n pnpm approve-builds\n\nthen reinstall dependencies (do not skip install scripts), or reinstall with your package manager's equivalent of allowing build scripts.", options);
14
+ this.code = "WL8005";
14
15
  this.name = "EsbuildBinaryMissingError";
15
16
  }
16
17
  };
@@ -1 +1 @@
1
- {"version":3,"file":"esbuild-binary-missing-error.mjs","names":[],"sources":["../../../../../../../../packages/core/src/errors/esbuild-binary-missing-error.ts"],"sourcesContent":["/**\n * Raised when `warlock dev` / `warlock build` cannot use esbuild because its\n * platform-native binary was never installed or linked.\n *\n * The message names what is missing and the exact fix — reinstall with the\n * package manager without skipping install scripts — so the failure is\n * actionable at the point it is thrown, instead of surfacing later as an\n * opaque low-level error from deep inside the bundler.\n */\nexport class EsbuildBinaryMissingError extends Error {\n public constructor(options?: { cause?: unknown }) {\n super(\n \"esbuild's native binary is not installed or linked for this platform, so \" +\n \"`warlock dev` / `warlock build` cannot run.\\n\\n\" +\n \"This usually happens when a platform package such as `@esbuild/win32-x64` \" +\n \"was never installed, or the package manager skipped esbuild's postinstall \" +\n \"script that links it. Fix it with:\\n\\n\" +\n \" pnpm approve-builds\\n\\n\" +\n \"then reinstall dependencies (do not skip install scripts), \" +\n \"or reinstall with your package manager's equivalent of allowing build scripts.\",\n options,\n );\n\n this.name = \"EsbuildBinaryMissingError\";\n }\n}\n"],"mappings":";;;;;;;;;;AASA,IAAa,4BAAb,cAA+C,MAAM;CACnD,AAAO,YAAY,SAA+B;EAChD,MACE,wdAQA,OACF;EAEA,KAAK,OAAO;CACd;AACF"}
1
+ {"version":3,"file":"esbuild-binary-missing-error.mjs","names":[],"sources":["../../../../../../../../packages/core/src/errors/esbuild-binary-missing-error.ts"],"sourcesContent":["/**\n * Raised when `warlock dev` / `warlock build` cannot use esbuild because its\n * platform-native binary was never installed or linked.\n *\n * The message names what is missing and the exact fix — reinstall with the\n * package manager without skipping install scripts — so the failure is\n * actionable at the point it is thrown, instead of surfacing later as an\n * opaque low-level error from deep inside the bundler.\n */\nexport class EsbuildBinaryMissingError extends Error {\n /** Stable Warlock error code; `warlock explain WL8005` prints the fix. */\n public readonly code = \"WL8005\";\n\n public constructor(options?: { cause?: unknown }) {\n super(\n \"esbuild's native binary is not installed or linked for this platform, so \" +\n \"`warlock dev` / `warlock build` cannot run.\\n\\n\" +\n \"This usually happens when a platform package such as `@esbuild/win32-x64` \" +\n \"was never installed, or the package manager skipped esbuild's postinstall \" +\n \"script that links it. Fix it with:\\n\\n\" +\n \" pnpm approve-builds\\n\\n\" +\n \"then reinstall dependencies (do not skip install scripts), \" +\n \"or reinstall with your package manager's equivalent of allowing build scripts.\",\n options,\n );\n\n this.name = \"EsbuildBinaryMissingError\";\n }\n}\n"],"mappings":";;;;;;;;;;AASA,IAAa,4BAAb,cAA+C,MAAM;CAInD,AAAO,YAAY,SAA+B;EAChD,MACE,wdAQA,OACF;cAbqB;EAerB,KAAK,OAAO;CACd;AACF"}
@@ -1,2 +1,4 @@
1
1
  import { BadRequestError, ConflictError, CookieJarUnavailableError, ForbiddenError, HttpError, NotAcceptableError, NotAllowedError, ResourceNotFoundError, ServerError, UnAuthorizedError } from "../http/errors/errors.mjs";
2
- export { BadRequestError, ConflictError, CookieJarUnavailableError, ForbiddenError, HttpError, NotAcceptableError, NotAllowedError, ResourceNotFoundError, ServerError, UnAuthorizedError };
2
+ import { ERROR_CODES, ERROR_CODES_DOCS_URL, ErrorCodeArea, ErrorCodeCategory, ErrorCodeDefinition, WarlockErrorCode, errorCodeDocsUrl, errorCodeOf, explainErrorCode, isWarlockErrorCode } from "./error-codes.mjs";
3
+ import { WarlockError } from "./warlock-error.mjs";
4
+ export { BadRequestError, ConflictError, CookieJarUnavailableError, ERROR_CODES, ERROR_CODES_DOCS_URL, ErrorCodeArea, ErrorCodeCategory, ErrorCodeDefinition, ForbiddenError, HttpError, NotAcceptableError, NotAllowedError, ResourceNotFoundError, ServerError, UnAuthorizedError, WarlockError, WarlockErrorCode, errorCodeDocsUrl, errorCodeOf, explainErrorCode, isWarlockErrorCode };
@@ -1,3 +1,5 @@
1
1
  import { BadRequestError, ConflictError, CookieJarUnavailableError, ForbiddenError, HttpError, NotAcceptableError, NotAllowedError, ResourceNotFoundError, ServerError, UnAuthorizedError } from "../http/errors/errors.mjs";
2
+ import { WarlockError } from "./warlock-error.mjs";
3
+ import { ERROR_CODES, ERROR_CODES_DOCS_URL, errorCodeDocsUrl, errorCodeOf, explainErrorCode, isWarlockErrorCode } from "./error-codes.mjs";
2
4
 
3
- export { BadRequestError, ConflictError, CookieJarUnavailableError, ForbiddenError, HttpError, NotAcceptableError, NotAllowedError, ResourceNotFoundError, ServerError, UnAuthorizedError };
5
+ export { BadRequestError, ConflictError, CookieJarUnavailableError, ERROR_CODES, ERROR_CODES_DOCS_URL, ForbiddenError, HttpError, NotAcceptableError, NotAllowedError, ResourceNotFoundError, ServerError, UnAuthorizedError, WarlockError, errorCodeDocsUrl, errorCodeOf, explainErrorCode, isWarlockErrorCode };
@@ -16,6 +16,7 @@
16
16
  var UnknownLocaleError = class UnknownLocaleError extends Error {
17
17
  constructor(locale, localeCodes) {
18
18
  super(UnknownLocaleError.buildMessage(locale, localeCodes));
19
+ this.code = "WL1008";
19
20
  this.name = "UnknownLocaleError";
20
21
  }
21
22
  static buildMessage(locale, localeCodes) {
@@ -1 +1 @@
1
- {"version":3,"file":"unknown-locale-error.mjs","names":[],"sources":["../../../../../../../../packages/core/src/errors/unknown-locale-error.ts"],"sourcesContent":["/**\n * Thrown by `response.setLocale(locale)` when `locale` is outside the\n * application's declared `app.localeCodes` allow-list.\n *\n * Silently writing a locale cookie for a locale the app cannot serve is a\n * NEW silent failure — `request.locale` would read the cookie back, fail its\n * own allow-list check (`Request.cacheLocale`), and fall back to the default\n * with nothing telling the caller why the switch never took. Failing here,\n * at the write, names the mistake at its source instead of downstream.\n *\n * Only raised when `app.localeCodes` is declared — with no list declared\n * there is nothing to fail against, matching `Request.cacheLocale`'s own\n * fail-open rule.\n */\nexport class UnknownLocaleError extends Error {\n public constructor(locale: string, localeCodes: string[]) {\n super(UnknownLocaleError.buildMessage(locale, localeCodes));\n this.name = \"UnknownLocaleError\";\n }\n\n private static buildMessage(locale: string, localeCodes: string[]): string {\n return (\n `Cannot set locale \"${locale}\": it is not in the configured \"app.localeCodes\" list ` +\n `(${localeCodes.map((code) => `\"${code}\"`).join(\", \")}). Add \"${locale}\" to ` +\n `\"app.localeCodes\" or pass one of the configured locales instead.`\n );\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;AAcA,IAAa,qBAAb,MAAa,2BAA2B,MAAM;CAC5C,AAAO,YAAY,QAAgB,aAAuB;EACxD,MAAM,mBAAmB,aAAa,QAAQ,WAAW,CAAC;EAC1D,KAAK,OAAO;CACd;CAEA,OAAe,aAAa,QAAgB,aAA+B;EACzE,OACE,sBAAsB,OAAO,yDACzB,YAAY,KAAK,SAAS,IAAI,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,EAAE,UAAU,OAAO;CAG3E;AACF"}
1
+ {"version":3,"file":"unknown-locale-error.mjs","names":[],"sources":["../../../../../../../../packages/core/src/errors/unknown-locale-error.ts"],"sourcesContent":["/**\n * Thrown by `response.setLocale(locale)` when `locale` is outside the\n * application's declared `app.localeCodes` allow-list.\n *\n * Silently writing a locale cookie for a locale the app cannot serve is a\n * NEW silent failure — `request.locale` would read the cookie back, fail its\n * own allow-list check (`Request.cacheLocale`), and fall back to the default\n * with nothing telling the caller why the switch never took. Failing here,\n * at the write, names the mistake at its source instead of downstream.\n *\n * Only raised when `app.localeCodes` is declared — with no list declared\n * there is nothing to fail against, matching `Request.cacheLocale`'s own\n * fail-open rule.\n */\nexport class UnknownLocaleError extends Error {\n /** Stable Warlock error code; `warlock explain WL1008` prints the fix. */\n public readonly code = \"WL1008\";\n\n public constructor(locale: string, localeCodes: string[]) {\n super(UnknownLocaleError.buildMessage(locale, localeCodes));\n this.name = \"UnknownLocaleError\";\n }\n\n private static buildMessage(locale: string, localeCodes: string[]): string {\n return (\n `Cannot set locale \"${locale}\": it is not in the configured \"app.localeCodes\" list ` +\n `(${localeCodes.map((code) => `\"${code}\"`).join(\", \")}). Add \"${locale}\" to ` +\n `\"app.localeCodes\" or pass one of the configured locales instead.`\n );\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;AAcA,IAAa,qBAAb,MAAa,2BAA2B,MAAM;CAI5C,AAAO,YAAY,QAAgB,aAAuB;EACxD,MAAM,mBAAmB,aAAa,QAAQ,WAAW,CAAC;cAHrC;EAIrB,KAAK,OAAO;CACd;CAEA,OAAe,aAAa,QAAgB,aAA+B;EACzE,OACE,sBAAsB,OAAO,yDACzB,YAAY,KAAK,SAAS,IAAI,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,EAAE,UAAU,OAAO;CAG3E;AACF"}
@@ -0,0 +1,21 @@
1
+ import { WarlockErrorCode } from "./error-codes.mjs";
2
+ //#region ../../packages/core/src/errors/warlock-error.d.ts
3
+ /**
4
+ * A framework error with a stable {@link WarlockErrorCode}.
5
+ *
6
+ * Thrown where core used to throw a bare `Error`, so the failure can be looked
7
+ * up (`warlock explain <code>`) instead of matched by message. Still an
8
+ * `Error`: existing `catch` blocks and message assertions keep working.
9
+ *
10
+ * @example
11
+ * throw new WarlockError("WL3003", `Route name "${name}" not found`);
12
+ */
13
+ export declare class WarlockError extends Error {
14
+ /** Stable Warlock error code; `warlock explain <code>` prints the fix. */
15
+ readonly code: WarlockErrorCode;
16
+ constructor(code: WarlockErrorCode, message: string, options?: {
17
+ cause?: unknown;
18
+ });
19
+ }
20
+ //#endregion
21
+ //# sourceMappingURL=warlock-error.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"warlock-error.d.mts","names":[],"sources":["../../../../../../../../packages/core/src/errors/warlock-error.ts"],"mappings":";;;;;;;;;;;;qBAYa,qBAAqB;;WAEhB,MAAM;EAEtB,YAAmB,MAAM,kBAAkB,iBAAiB;IAAY"}
@@ -0,0 +1,22 @@
1
+ //#region ../../packages/core/src/errors/warlock-error.ts
2
+ /**
3
+ * A framework error with a stable {@link WarlockErrorCode}.
4
+ *
5
+ * Thrown where core used to throw a bare `Error`, so the failure can be looked
6
+ * up (`warlock explain <code>`) instead of matched by message. Still an
7
+ * `Error`: existing `catch` blocks and message assertions keep working.
8
+ *
9
+ * @example
10
+ * throw new WarlockError("WL3003", `Route name "${name}" not found`);
11
+ */
12
+ var WarlockError = class extends Error {
13
+ constructor(code, message, options) {
14
+ super(message, options);
15
+ this.name = "WarlockError";
16
+ this.code = code;
17
+ }
18
+ };
19
+
20
+ //#endregion
21
+ export { WarlockError };
22
+ //# sourceMappingURL=warlock-error.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"warlock-error.mjs","names":[],"sources":["../../../../../../../../packages/core/src/errors/warlock-error.ts"],"sourcesContent":["import type { WarlockErrorCode } from \"./error-codes\";\n\n/**\n * A framework error with a stable {@link WarlockErrorCode}.\n *\n * Thrown where core used to throw a bare `Error`, so the failure can be looked\n * up (`warlock explain <code>`) instead of matched by message. Still an\n * `Error`: existing `catch` blocks and message assertions keep working.\n *\n * @example\n * throw new WarlockError(\"WL3003\", `Route name \"${name}\" not found`);\n */\nexport class WarlockError extends Error {\n /** Stable Warlock error code; `warlock explain <code>` prints the fix. */\n public readonly code: WarlockErrorCode;\n\n public constructor(code: WarlockErrorCode, message: string, options?: { cause?: unknown }) {\n super(message, options);\n this.name = \"WarlockError\";\n this.code = code;\n }\n}\n"],"mappings":";;;;;;;;;;;AAYA,IAAa,eAAb,cAAkC,MAAM;CAItC,AAAO,YAAY,MAAwB,SAAiB,SAA+B;EACzF,MAAM,SAAS,OAAO;EACtB,KAAK,OAAO;EACZ,KAAK,OAAO;CACd;AACF"}
@@ -1,11 +1,12 @@
1
1
  import { rootPath, srcPath } from "../utils/paths.mjs";
2
2
  import "../utils/index.mjs";
3
3
  import { getWarlockVersion } from "../utils/framework-vesion.mjs";
4
+ import { isGenerationDryRun, recordSkippedFile, setGenerationDetail } from "./generation-run.mjs";
5
+ import { fileExistsAsync, getFileAsync, getJsonFileAsync, putFileAsync, putJsonFileAsync } from "./generation-fs.mjs";
4
6
  import { detectPackageManager, getAddCommand, getExactAddCommand } from "../updater/package-manager.mjs";
5
7
  import { featuresMap } from "./features/index.mjs";
6
8
  import { getPnpmVersion, isInsideParentPnpmWorkspace, mergeOnlyBuiltDependencies, mergePackageJsonBuildApprovals, mergePnpmSharpApproval, pnpmBuildApprovalLayout } from "./pnpm-build-approvals.mjs";
7
9
  import { colors } from "@mongez/copper";
8
- import { fileExistsAsync, getFileAsync, getJsonFileAsync, putFileAsync, putJsonFileAsync } from "@warlock.js/fs";
9
10
  import { execSync } from "node:child_process";
10
11
 
11
12
  //#region ../../packages/core/src/generations/add-command.action.ts
@@ -37,6 +38,10 @@ async function addCommandAction(options) {
37
38
  const features = options.args;
38
39
  const { packageManager, list, noInstall } = options.options;
39
40
  if (list) {
41
+ setGenerationDetail("features", allowedFeatures.map((feature) => ({
42
+ name: feature,
43
+ description: featuresMap[feature]?.description ?? ""
44
+ })));
40
45
  console.log("Available Features:");
41
46
  for (const feature of allowedFeatures) {
42
47
  const definition = featuresMap[feature];
@@ -73,13 +78,23 @@ async function addCommandAction(options) {
73
78
  console.log(`${colors.yellowBright(devDependency)} is already installed, skipping...`);
74
79
  delete devDependencies[devDependency];
75
80
  }
76
- if (noInstall) await recordDependencies(dependencies, devDependencies);
81
+ setGenerationDetail("features", resolvedFeatures);
82
+ setGenerationDetail("dependencies", { ...dependencies });
83
+ setGenerationDetail("devDependencies", { ...devDependencies });
84
+ if (isGenerationDryRun()) {
85
+ console.log(`Dry run: would install ${colors.magenta(Object.keys({
86
+ ...dependencies,
87
+ ...devDependencies
88
+ }).join(", ") || "nothing")}`);
89
+ await recordDependencies(dependencies, devDependencies);
90
+ } else if (noInstall) await recordDependencies(dependencies, devDependencies);
77
91
  else {
78
92
  if ((packageManager ?? await detectPackageManager()) === "pnpm" && dependencies.sharp !== void 0) await approvePnpmSharpBuild();
79
93
  await installDependencies(packageManager, dependencies, devDependencies);
80
94
  }
81
95
  for (const [name, config] of Object.entries(ejectConfigs)) {
82
96
  if (await fileExistsAsync(srcPath(`config/${name}.ts`))) {
97
+ recordSkippedFile(srcPath(`config/${name}.ts`), "exists");
83
98
  console.log(`${colors.yellowBright(name)} config already exists, skipping...`);
84
99
  continue;
85
100
  }
@@ -91,6 +106,7 @@ async function addCommandAction(options) {
91
106
  const featurePackages = featuresMap[feature];
92
107
  if (featurePackages?.onExecuting) await featurePackages.onExecuting(options);
93
108
  }
109
+ setGenerationDetail("scripts", { ...scripts });
94
110
  if (Object.keys(scripts).length > 0) {
95
111
  console.log(`Adding scripts ${colors.magenta(Object.keys(scripts).join(", "))}`);
96
112
  const packageJsonPath = rootPath("package.json");
@@ -122,7 +138,8 @@ async function approvePnpmSharpBuild() {
122
138
  const layout = pnpmBuildApprovalLayout(getPnpmVersion(rootPath()));
123
139
  if (layout === "packageJson") {
124
140
  const packageJsonPath = rootPath("package.json");
125
- await putJsonFileAsync(packageJsonPath, mergePackageJsonBuildApprovals(await getJsonFileAsync(packageJsonPath), ["sharp"]));
141
+ const packageJson = await getJsonFileAsync(packageJsonPath);
142
+ await putJsonFileAsync(packageJsonPath, mergePackageJsonBuildApprovals(packageJson, ["sharp"]));
126
143
  return;
127
144
  }
128
145
  const current = hasWorkspaceFile ? await getFileAsync(workspacePath) : "";
@@ -181,7 +198,7 @@ async function recordDependencies(dependencies, devDependencies) {
181
198
  Object.assign(packageJson.devDependencies, devDependencies);
182
199
  await putJsonFileAsync(packageJsonPath, packageJson);
183
200
  const recorded = [...Object.keys(dependencies), ...Object.keys(devDependencies)];
184
- console.log(`Recorded ${colors.green(recorded.join(", "))} in package.json (install skipped via --no-install)`);
201
+ console.log(`Recorded ${colors.green(recorded.join(", "))} in package.json (${isGenerationDryRun() ? "dry run: nothing installed" : "install skipped via --no-install"})`);
185
202
  }
186
203
  function validateFeatures(features) {
187
204
  for (const feature of features) if (!allowedFeatures.includes(feature)) {
@@ -191,5 +208,5 @@ function validateFeatures(features) {
191
208
  }
192
209
 
193
210
  //#endregion
194
- export { addCommandAction };
211
+ export { addCommandAction, allowedFeatures, featuresMap, installDependencies, resolveWarlockDependencyVersions };
195
212
  //# sourceMappingURL=add-command.action.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"add-command.action.mjs","names":[],"sources":["../../../../../../../../packages/core/src/generations/add-command.action.ts"],"sourcesContent":["import { colors } from \"@mongez/copper\";\nimport {\n fileExistsAsync,\n getFileAsync,\n getJsonFileAsync,\n putFileAsync,\n putJsonFileAsync,\n} from \"@warlock.js/fs\";\nimport { execSync } from \"node:child_process\";\nimport type { CommandActionData } from \"../commands/types\";\nimport {\n detectPackageManager,\n getAddCommand,\n getExactAddCommand,\n type PackageManager,\n} from \"../updater/package-manager\";\nimport { rootPath, srcPath } from \"../utils\";\nimport { getWarlockVersion } from \"../utils/framework-vesion\";\nimport { featuresMap } from \"./features\";\nimport {\n getPnpmVersion,\n isInsideParentPnpmWorkspace,\n mergeOnlyBuiltDependencies,\n mergePackageJsonBuildApprovals,\n mergePnpmSharpApproval,\n pnpmBuildApprovalLayout,\n} from \"./pnpm-build-approvals\";\n\nexport { featuresMap };\nexport type { FeatureDefinition } from \"./features\";\n\n/**\n * The parts of a project `package.json` this action reads or writes. Deliberately\n * partial — it describes what we touch, not the whole manifest.\n */\ntype ProjectPackageJson = {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n scripts?: Record<string, string>;\n};\n\nexport const allowedFeatures = Object.keys(featuresMap);\n\nfunction isWarlockPackage(packageName: string): boolean {\n return packageName.startsWith(\"@warlock.js/\");\n}\n\n/**\n * Resolve the internal feature-map placeholder to the version of Core that is\n * actually executing the command. Every @warlock.js package is lockstep, so\n * Core is the single source of truth; non-Warlock dependencies are untouched.\n */\nexport function resolveWarlockDependencyVersions(\n dependencies: Record<string, string>,\n frameworkVersion: string,\n): void {\n for (const dependency of Object.keys(dependencies)) {\n if (isWarlockPackage(dependency)) {\n dependencies[dependency] = frameworkVersion;\n }\n }\n}\n\nfunction resolveFeatures(features: string[], visited = new Set<string>()): string[] {\n const resolved: string[] = [];\n\n for (const feature of features) {\n if (visited.has(feature)) continue;\n visited.add(feature);\n\n const def = featuresMap[feature];\n\n // `addCommandAction` runs `validateFeatures()` before calling this, and the\n // recursive calls below pass `requires` entries that come out of the map\n // itself — so every lookup resolves. Skipping an unresolvable one keeps a\n // typo from crashing the command with `Cannot read properties of\n // undefined`, which names neither the feature nor the fact that it was the\n // ARGUMENT that was wrong.\n if (def === undefined) continue;\n\n if (def.requires?.length) {\n resolved.push(...resolveFeatures(def.requires, visited));\n }\n\n resolved.push(feature);\n }\n\n return resolved;\n}\n\nexport async function addCommandAction(options: CommandActionData) {\n const features = options.args;\n const { packageManager, list, noInstall } = options.options;\n\n if (list) {\n console.log(\"Available Features:\");\n\n for (const feature of allowedFeatures) {\n const definition = featuresMap[feature];\n\n // `allowedFeatures` is derived from this same map, so this resolves.\n if (definition === undefined) continue;\n\n console.log(`- ${colors.yellowBright(feature)}: ${colors.green(definition.description)}`);\n }\n\n process.exit(0);\n }\n\n validateFeatures(features);\n\n const resolvedFeatures = resolveFeatures(features);\n\n const dependencies: Record<string, string> = {};\n const devDependencies: Record<string, string> = {};\n const ejectConfigs: Record<string, { content: string; name: string }> = {};\n const scripts: Record<string, string> = {};\n\n for (const feature of resolvedFeatures) {\n const featurePackages = featuresMap[feature as keyof typeof featuresMap];\n\n // Validated upstream; see the note in resolveFeatures above.\n if (featurePackages === undefined) continue;\n\n Object.assign(dependencies, featurePackages.dependencies);\n if (featurePackages.devDependencies) {\n Object.assign(devDependencies, featurePackages.devDependencies);\n }\n\n if (featurePackages.ejectConfig) {\n ejectConfigs[featurePackages.ejectConfig.name] = featurePackages.ejectConfig;\n }\n\n if (featurePackages.script) {\n Object.assign(scripts, featurePackages.script);\n }\n }\n\n // Pin every @warlock.js/* feature package to the INSTALLED framework version so\n // a scaffolded project's features match its core version instead of drifting to\n // the feature map's static range.\n const frameworkVersion = await getWarlockVersion();\n resolveWarlockDependencyVersions(dependencies, frameworkVersion);\n resolveWarlockDependencyVersions(devDependencies, frameworkVersion);\n\n const currentPackageJson = await getJsonFileAsync<ProjectPackageJson>(rootPath(\"package.json\"));\n\n // Fresh templates may omit one of the maps — guard before reading.\n currentPackageJson.dependencies = currentPackageJson.dependencies ?? {};\n currentPackageJson.devDependencies = currentPackageJson.devDependencies ?? {};\n\n // Skip anything already present so we never downgrade an existing pin.\n for (const dependency of Object.keys(dependencies)) {\n if (currentPackageJson.dependencies[dependency]) {\n console.log(`${colors.yellowBright(dependency)} is already installed, skipping...`);\n delete dependencies[dependency];\n }\n }\n\n for (const devDependency of Object.keys(devDependencies)) {\n if (currentPackageJson.devDependencies[devDependency]) {\n console.log(`${colors.yellowBright(devDependency)} is already installed, skipping...`);\n delete devDependencies[devDependency];\n }\n }\n\n if (noInstall) {\n await recordDependencies(dependencies, devDependencies);\n } else {\n const resolvedPackageManager =\n (packageManager as PackageManager | undefined) ?? (await detectPackageManager());\n if (resolvedPackageManager === \"pnpm\" && dependencies.sharp !== undefined) {\n await approvePnpmSharpBuild();\n }\n await installDependencies(\n packageManager as PackageManager | undefined,\n dependencies,\n devDependencies,\n );\n }\n\n for (const [name, config] of Object.entries(ejectConfigs)) {\n if (await fileExistsAsync(srcPath(`config/${name}.ts`))) {\n console.log(`${colors.yellowBright(name)} config already exists, skipping...`);\n continue;\n }\n\n console.log(`Creating ${colors.magenta(name)} config...`);\n\n await putFileAsync(srcPath(`config/${name}.ts`), config.content);\n\n console.log(`${colors.green(name)} config created successfully`);\n }\n\n // now loop again over features to execute onExecuting\n for (const feature of resolvedFeatures) {\n const featurePackages = featuresMap[feature as keyof typeof featuresMap];\n\n if (featurePackages?.onExecuting) {\n await featurePackages.onExecuting(options);\n }\n }\n\n if (Object.keys(scripts).length > 0) {\n console.log(`Adding scripts ${colors.magenta(Object.keys(scripts).join(\", \"))}`);\n const packageJsonPath = rootPath(\"package.json\");\n const packageJson = await getJsonFileAsync<ProjectPackageJson>(packageJsonPath);\n packageJson.scripts = { ...(packageJson.scripts ?? {}), ...scripts };\n await putJsonFileAsync(packageJsonPath, packageJson);\n\n console.log(`Scripts added successfully ${colors.green(Object.keys(scripts).join(\", \"))}`);\n }\n}\n\n/**\n * Let pnpm run sharp's install script, written where the INSTALLED pnpm reads\n * approvals (see `pnpmBuildApprovalLayout`). pnpm 9 and 10.0–10.4 reject a\n * settings-only `pnpm-workspace.yaml`, so for them the approval goes into\n * package.json and no workspace file is created.\n *\n * An app inside a parent pnpm workspace gets no per-app policy: the parent's\n * workspace owns it, and a nested workspace file would make a second root.\n */\nasync function approvePnpmSharpBuild(): Promise<void> {\n const workspacePath = rootPath(\"pnpm-workspace.yaml\");\n const hasWorkspaceFile = await fileExistsAsync(workspacePath);\n\n if (!hasWorkspaceFile && isInsideParentPnpmWorkspace(rootPath())) {\n console.log(\n `${colors.yellowBright(\"sharp\")} needs its install script approved in the parent pnpm workspace's settings.`,\n );\n return;\n }\n\n const layout = pnpmBuildApprovalLayout(getPnpmVersion(rootPath()));\n\n if (layout === \"packageJson\") {\n const packageJsonPath = rootPath(\"package.json\");\n const packageJson = await getJsonFileAsync<ProjectPackageJson>(packageJsonPath);\n\n await putJsonFileAsync(packageJsonPath, mergePackageJsonBuildApprovals(packageJson, [\"sharp\"]));\n return;\n }\n\n const current = hasWorkspaceFile ? await getFileAsync(workspacePath) : \"\";\n const updated =\n layout === \"onlyBuiltDependencies\"\n ? mergeOnlyBuiltDependencies(current, [\"sharp\"])\n : mergePnpmSharpApproval(current);\n\n if (updated !== current) await putFileAsync(workspacePath, updated);\n}\n\n/**\n * Install the resolved dependency sets through the project's package manager.\n * Runs two passes (prod then dev) so each lands in the correct section.\n */\nexport async function installDependencies(\n packageManager: PackageManager | undefined,\n dependencies: Record<string, string>,\n devDependencies: Record<string, string>,\n exec: (command: string, options: { cwd: string; stdio: \"inherit\" }) => unknown = execSync,\n) {\n // `--package-manager` is optional; without it, fall back to the lockfile.\n const resolvedPackageManager = packageManager ?? (await detectPackageManager());\n const packageManagerCommand = getAddCommand(resolvedPackageManager);\n const exactPackageManagerCommand = getExactAddCommand(resolvedPackageManager);\n\n const installDependencySet = (dependencySet: Record<string, string>, development: boolean) => {\n const regularSpecs: string[] = [];\n const exactWarlockSpecs: string[] = [];\n\n for (const [name, version] of Object.entries(dependencySet)) {\n const spec = `${name}@${version}`;\n (isWarlockPackage(name) ? exactWarlockSpecs : regularSpecs).push(spec);\n }\n\n const developmentFlag = development ? \" -D\" : \"\";\n const runInstall = (command: string, specs: string[]) => {\n if (specs.length === 0) return;\n\n exec(`${command} ${specs.join(\" \")}${developmentFlag}`, {\n cwd: process.cwd(),\n stdio: \"inherit\",\n });\n };\n\n runInstall(packageManagerCommand, regularSpecs);\n runInstall(exactPackageManagerCommand, exactWarlockSpecs);\n };\n\n if (Object.keys(dependencies).length > 0) {\n console.log(`Installing dependencies ${colors.magenta(Object.keys(dependencies).join(\", \"))}`);\n\n installDependencySet(dependencies, false);\n\n console.log(\n `Dependencies installed successfully ${colors.green(Object.keys(dependencies).join(\", \"))}`,\n );\n }\n\n if (Object.keys(devDependencies).length > 0) {\n console.log(\n `Installing dev dependencies ${colors.magenta(Object.keys(devDependencies).join(\", \"))}`,\n );\n\n installDependencySet(devDependencies, true);\n\n console.log(\n `Dev dependencies installed successfully ${colors.green(Object.keys(devDependencies).join(\", \"))}`,\n );\n }\n}\n\n/**\n * Write the resolved dependency sets into package.json without installing.\n * Used by `--no-install` so a scaffolder can batch every feature into one\n * install pass after the command returns. Versions come from the feature map.\n */\nasync function recordDependencies(\n dependencies: Record<string, string>,\n devDependencies: Record<string, string>,\n) {\n if (Object.keys(dependencies).length === 0 && Object.keys(devDependencies).length === 0) {\n return;\n }\n\n const packageJsonPath = rootPath(\"package.json\");\n const packageJson = await getJsonFileAsync<ProjectPackageJson>(packageJsonPath);\n\n packageJson.dependencies = packageJson.dependencies ?? {};\n packageJson.devDependencies = packageJson.devDependencies ?? {};\n\n Object.assign(packageJson.dependencies, dependencies);\n Object.assign(packageJson.devDependencies, devDependencies);\n\n await putJsonFileAsync(packageJsonPath, packageJson);\n\n const recorded = [...Object.keys(dependencies), ...Object.keys(devDependencies)];\n\n console.log(\n `Recorded ${colors.green(recorded.join(\", \"))} in package.json (install skipped via --no-install)`,\n );\n}\n\nfunction validateFeatures(features: string[]) {\n for (const feature of features) {\n if (!allowedFeatures.includes(feature)) {\n console.log(\n `Feature ${colors.redBright(feature)} is not allowed, allowed features are: ${colors.green(allowedFeatures.join(\", \"))}`,\n );\n process.exit(1);\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"add-command.action.mjs","names":[],"sources":["../../../../../../../../packages/core/src/generations/add-command.action.ts"],"sourcesContent":["import { colors } from \"@mongez/copper\";\nimport {\n fileExistsAsync,\n getFileAsync,\n getJsonFileAsync,\n putFileAsync,\n putJsonFileAsync,\n recordSkippedFile,\n} from \"./generation-fs\";\nimport { isGenerationDryRun, setGenerationDetail } from \"./generation-run\";\nimport { execSync } from \"node:child_process\";\nimport type { CommandActionData } from \"../commands/types\";\nimport {\n detectPackageManager,\n getAddCommand,\n getExactAddCommand,\n type PackageManager,\n} from \"../updater/package-manager\";\nimport { rootPath, srcPath } from \"../utils\";\nimport { getWarlockVersion } from \"../utils/framework-vesion\";\nimport { featuresMap } from \"./features\";\nimport {\n getPnpmVersion,\n isInsideParentPnpmWorkspace,\n mergeOnlyBuiltDependencies,\n mergePackageJsonBuildApprovals,\n mergePnpmSharpApproval,\n pnpmBuildApprovalLayout,\n} from \"./pnpm-build-approvals\";\n\nexport { featuresMap };\nexport type { FeatureDefinition } from \"./features\";\n\n/**\n * The parts of a project `package.json` this action reads or writes. Deliberately\n * partial — it describes what we touch, not the whole manifest.\n */\ntype ProjectPackageJson = {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n scripts?: Record<string, string>;\n};\n\nexport const allowedFeatures = Object.keys(featuresMap);\n\nfunction isWarlockPackage(packageName: string): boolean {\n return packageName.startsWith(\"@warlock.js/\");\n}\n\n/**\n * Resolve the internal feature-map placeholder to the version of Core that is\n * actually executing the command. Every @warlock.js package is lockstep, so\n * Core is the single source of truth; non-Warlock dependencies are untouched.\n */\nexport function resolveWarlockDependencyVersions(\n dependencies: Record<string, string>,\n frameworkVersion: string,\n): void {\n for (const dependency of Object.keys(dependencies)) {\n if (isWarlockPackage(dependency)) {\n dependencies[dependency] = frameworkVersion;\n }\n }\n}\n\nfunction resolveFeatures(features: string[], visited = new Set<string>()): string[] {\n const resolved: string[] = [];\n\n for (const feature of features) {\n if (visited.has(feature)) continue;\n visited.add(feature);\n\n const def = featuresMap[feature];\n\n // `addCommandAction` runs `validateFeatures()` before calling this, and the\n // recursive calls below pass `requires` entries that come out of the map\n // itself — so every lookup resolves. Skipping an unresolvable one keeps a\n // typo from crashing the command with `Cannot read properties of\n // undefined`, which names neither the feature nor the fact that it was the\n // ARGUMENT that was wrong.\n if (def === undefined) continue;\n\n if (def.requires?.length) {\n resolved.push(...resolveFeatures(def.requires, visited));\n }\n\n resolved.push(feature);\n }\n\n return resolved;\n}\n\nexport async function addCommandAction(options: CommandActionData) {\n const features = options.args;\n const { packageManager, list, noInstall } = options.options;\n\n if (list) {\n setGenerationDetail(\n \"features\",\n allowedFeatures.map((feature) => ({\n name: feature,\n description: featuresMap[feature]?.description ?? \"\",\n })),\n );\n\n console.log(\"Available Features:\");\n\n for (const feature of allowedFeatures) {\n const definition = featuresMap[feature];\n\n // `allowedFeatures` is derived from this same map, so this resolves.\n if (definition === undefined) continue;\n\n console.log(`- ${colors.yellowBright(feature)}: ${colors.green(definition.description)}`);\n }\n\n process.exit(0);\n }\n\n validateFeatures(features);\n\n const resolvedFeatures = resolveFeatures(features);\n\n const dependencies: Record<string, string> = {};\n const devDependencies: Record<string, string> = {};\n const ejectConfigs: Record<string, { content: string; name: string }> = {};\n const scripts: Record<string, string> = {};\n\n for (const feature of resolvedFeatures) {\n const featurePackages = featuresMap[feature as keyof typeof featuresMap];\n\n // Validated upstream; see the note in resolveFeatures above.\n if (featurePackages === undefined) continue;\n\n Object.assign(dependencies, featurePackages.dependencies);\n if (featurePackages.devDependencies) {\n Object.assign(devDependencies, featurePackages.devDependencies);\n }\n\n if (featurePackages.ejectConfig) {\n ejectConfigs[featurePackages.ejectConfig.name] = featurePackages.ejectConfig;\n }\n\n if (featurePackages.script) {\n Object.assign(scripts, featurePackages.script);\n }\n }\n\n // Pin every @warlock.js/* feature package to the INSTALLED framework version so\n // a scaffolded project's features match its core version instead of drifting to\n // the feature map's static range.\n const frameworkVersion = await getWarlockVersion();\n resolveWarlockDependencyVersions(dependencies, frameworkVersion);\n resolveWarlockDependencyVersions(devDependencies, frameworkVersion);\n\n const currentPackageJson = await getJsonFileAsync<ProjectPackageJson>(rootPath(\"package.json\"));\n\n // Fresh templates may omit one of the maps — guard before reading.\n currentPackageJson.dependencies = currentPackageJson.dependencies ?? {};\n currentPackageJson.devDependencies = currentPackageJson.devDependencies ?? {};\n\n // Skip anything already present so we never downgrade an existing pin.\n for (const dependency of Object.keys(dependencies)) {\n if (currentPackageJson.dependencies[dependency]) {\n console.log(`${colors.yellowBright(dependency)} is already installed, skipping...`);\n delete dependencies[dependency];\n }\n }\n\n for (const devDependency of Object.keys(devDependencies)) {\n if (currentPackageJson.devDependencies[devDependency]) {\n console.log(`${colors.yellowBright(devDependency)} is already installed, skipping...`);\n delete devDependencies[devDependency];\n }\n }\n\n setGenerationDetail(\"features\", resolvedFeatures);\n setGenerationDetail(\"dependencies\", { ...dependencies });\n setGenerationDetail(\"devDependencies\", { ...devDependencies });\n\n if (isGenerationDryRun()) {\n // A preview installs nothing; package.json is \"edited\" in the overlay so\n // the report lists it, and later steps read the previewed manifest.\n console.log(\n `Dry run: would install ${colors.magenta(Object.keys({ ...dependencies, ...devDependencies }).join(\", \") || \"nothing\")}`,\n );\n await recordDependencies(dependencies, devDependencies);\n } else if (noInstall) {\n await recordDependencies(dependencies, devDependencies);\n } else {\n const resolvedPackageManager =\n (packageManager as PackageManager | undefined) ?? (await detectPackageManager());\n if (resolvedPackageManager === \"pnpm\" && dependencies.sharp !== undefined) {\n await approvePnpmSharpBuild();\n }\n await installDependencies(\n packageManager as PackageManager | undefined,\n dependencies,\n devDependencies,\n );\n }\n\n for (const [name, config] of Object.entries(ejectConfigs)) {\n if (await fileExistsAsync(srcPath(`config/${name}.ts`))) {\n recordSkippedFile(srcPath(`config/${name}.ts`), \"exists\");\n console.log(`${colors.yellowBright(name)} config already exists, skipping...`);\n continue;\n }\n\n console.log(`Creating ${colors.magenta(name)} config...`);\n\n await putFileAsync(srcPath(`config/${name}.ts`), config.content);\n\n console.log(`${colors.green(name)} config created successfully`);\n }\n\n // now loop again over features to execute onExecuting\n for (const feature of resolvedFeatures) {\n const featurePackages = featuresMap[feature as keyof typeof featuresMap];\n\n if (featurePackages?.onExecuting) {\n await featurePackages.onExecuting(options);\n }\n }\n\n setGenerationDetail(\"scripts\", { ...scripts });\n\n if (Object.keys(scripts).length > 0) {\n console.log(`Adding scripts ${colors.magenta(Object.keys(scripts).join(\", \"))}`);\n const packageJsonPath = rootPath(\"package.json\");\n const packageJson = await getJsonFileAsync<ProjectPackageJson>(packageJsonPath);\n packageJson.scripts = { ...(packageJson.scripts ?? {}), ...scripts };\n await putJsonFileAsync(packageJsonPath, packageJson);\n\n console.log(`Scripts added successfully ${colors.green(Object.keys(scripts).join(\", \"))}`);\n }\n}\n\n/**\n * Let pnpm run sharp's install script, written where the INSTALLED pnpm reads\n * approvals (see `pnpmBuildApprovalLayout`). pnpm 9 and 10.0–10.4 reject a\n * settings-only `pnpm-workspace.yaml`, so for them the approval goes into\n * package.json and no workspace file is created.\n *\n * An app inside a parent pnpm workspace gets no per-app policy: the parent's\n * workspace owns it, and a nested workspace file would make a second root.\n */\nasync function approvePnpmSharpBuild(): Promise<void> {\n const workspacePath = rootPath(\"pnpm-workspace.yaml\");\n const hasWorkspaceFile = await fileExistsAsync(workspacePath);\n\n if (!hasWorkspaceFile && isInsideParentPnpmWorkspace(rootPath())) {\n console.log(\n `${colors.yellowBright(\"sharp\")} needs its install script approved in the parent pnpm workspace's settings.`,\n );\n return;\n }\n\n const layout = pnpmBuildApprovalLayout(getPnpmVersion(rootPath()));\n\n if (layout === \"packageJson\") {\n const packageJsonPath = rootPath(\"package.json\");\n const packageJson = await getJsonFileAsync<ProjectPackageJson>(packageJsonPath);\n\n await putJsonFileAsync(packageJsonPath, mergePackageJsonBuildApprovals(packageJson, [\"sharp\"]));\n return;\n }\n\n const current = hasWorkspaceFile ? await getFileAsync(workspacePath) : \"\";\n const updated =\n layout === \"onlyBuiltDependencies\"\n ? mergeOnlyBuiltDependencies(current, [\"sharp\"])\n : mergePnpmSharpApproval(current);\n\n if (updated !== current) await putFileAsync(workspacePath, updated);\n}\n\n/**\n * Install the resolved dependency sets through the project's package manager.\n * Runs two passes (prod then dev) so each lands in the correct section.\n */\nexport async function installDependencies(\n packageManager: PackageManager | undefined,\n dependencies: Record<string, string>,\n devDependencies: Record<string, string>,\n exec: (command: string, options: { cwd: string; stdio: \"inherit\" }) => unknown = execSync,\n) {\n // `--package-manager` is optional; without it, fall back to the lockfile.\n const resolvedPackageManager = packageManager ?? (await detectPackageManager());\n const packageManagerCommand = getAddCommand(resolvedPackageManager);\n const exactPackageManagerCommand = getExactAddCommand(resolvedPackageManager);\n\n const installDependencySet = (dependencySet: Record<string, string>, development: boolean) => {\n const regularSpecs: string[] = [];\n const exactWarlockSpecs: string[] = [];\n\n for (const [name, version] of Object.entries(dependencySet)) {\n const spec = `${name}@${version}`;\n (isWarlockPackage(name) ? exactWarlockSpecs : regularSpecs).push(spec);\n }\n\n const developmentFlag = development ? \" -D\" : \"\";\n const runInstall = (command: string, specs: string[]) => {\n if (specs.length === 0) return;\n\n exec(`${command} ${specs.join(\" \")}${developmentFlag}`, {\n cwd: process.cwd(),\n stdio: \"inherit\",\n });\n };\n\n runInstall(packageManagerCommand, regularSpecs);\n runInstall(exactPackageManagerCommand, exactWarlockSpecs);\n };\n\n if (Object.keys(dependencies).length > 0) {\n console.log(`Installing dependencies ${colors.magenta(Object.keys(dependencies).join(\", \"))}`);\n\n installDependencySet(dependencies, false);\n\n console.log(\n `Dependencies installed successfully ${colors.green(Object.keys(dependencies).join(\", \"))}`,\n );\n }\n\n if (Object.keys(devDependencies).length > 0) {\n console.log(\n `Installing dev dependencies ${colors.magenta(Object.keys(devDependencies).join(\", \"))}`,\n );\n\n installDependencySet(devDependencies, true);\n\n console.log(\n `Dev dependencies installed successfully ${colors.green(Object.keys(devDependencies).join(\", \"))}`,\n );\n }\n}\n\n/**\n * Write the resolved dependency sets into package.json without installing.\n * Used by `--no-install` so a scaffolder can batch every feature into one\n * install pass after the command returns. Versions come from the feature map.\n */\nasync function recordDependencies(\n dependencies: Record<string, string>,\n devDependencies: Record<string, string>,\n) {\n if (Object.keys(dependencies).length === 0 && Object.keys(devDependencies).length === 0) {\n return;\n }\n\n const packageJsonPath = rootPath(\"package.json\");\n const packageJson = await getJsonFileAsync<ProjectPackageJson>(packageJsonPath);\n\n packageJson.dependencies = packageJson.dependencies ?? {};\n packageJson.devDependencies = packageJson.devDependencies ?? {};\n\n Object.assign(packageJson.dependencies, dependencies);\n Object.assign(packageJson.devDependencies, devDependencies);\n\n await putJsonFileAsync(packageJsonPath, packageJson);\n\n const recorded = [...Object.keys(dependencies), ...Object.keys(devDependencies)];\n\n console.log(\n `Recorded ${colors.green(recorded.join(\", \"))} in package.json (${isGenerationDryRun() ? \"dry run: nothing installed\" : \"install skipped via --no-install\"})`,\n );\n}\n\nfunction validateFeatures(features: string[]) {\n for (const feature of features) {\n if (!allowedFeatures.includes(feature)) {\n console.log(\n `Feature ${colors.redBright(feature)} is not allowed, allowed features are: ${colors.green(allowedFeatures.join(\", \"))}`,\n );\n process.exit(1);\n }\n }\n}\n"],"mappings":"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"}
@@ -1,10 +1,10 @@
1
1
  import { srcPath } from "../../utils/paths.mjs";
2
2
  import "../../utils/index.mjs";
3
+ import { ensureDirectoryAsync, fileExistsAsync, getFileAsync, putFileAsync } from "../generation-fs.mjs";
3
4
  import { accessConfigStub, accessResolverStub, accessRoleMigrationStub, accessRoleModelIndexStub, accessRoleModelStub, accessUserRoleMigrationStub, accessUserRoleModelIndexStub, accessUserRoleModelStub } from "../stubs.mjs";
4
5
  import { migrationTimestamp } from "./shared/migration-timestamp.mjs";
5
6
  import { INSTALLED_WARLOCK_VERSION } from "./types.mjs";
6
7
  import { colors } from "@mongez/copper";
7
- import { ensureDirectoryAsync, fileExistsAsync, getFileAsync, putFileAsync } from "@warlock.js/fs";
8
8
 
9
9
  //#region ../../packages/core/src/generations/features/access.feature.ts
10
10
  async function registerAccessLocale() {
@@ -1 +1 @@
1
- {"version":3,"file":"access.feature.mjs","names":[],"sources":["../../../../../../../../../packages/core/src/generations/features/access.feature.ts"],"sourcesContent":["import { colors } from \"@mongez/copper\";\nimport { ensureDirectoryAsync, fileExistsAsync, getFileAsync, putFileAsync } from \"@warlock.js/fs\";\nimport type { CommandActionData } from \"../../commands/types\";\nimport { srcPath } from \"../../utils\";\nimport {\n accessConfigStub,\n accessResolverStub,\n accessRoleMigrationStub,\n accessRoleModelIndexStub,\n accessRoleModelStub,\n accessUserRoleMigrationStub,\n accessUserRoleModelIndexStub,\n accessUserRoleModelStub,\n} from \"../stubs\";\nimport { migrationTimestamp } from \"./shared/migration-timestamp\";\nimport { type FeatureDefinition, INSTALLED_WARLOCK_VERSION } from \"./types\";\n\nasync function registerAccessLocale() {\n const legacyLocalesPath = srcPath(\"app/shared/utils/locales.ts\");\n const localesPath = srcPath(\"app/access/utils/locales.json\");\n const forbidden = {\n en: \"You do not have permission to perform this action.\",\n ar: \"ليس لديك صلاحية لتنفيذ هذا الإجراء.\",\n };\n\n if (await fileExistsAsync(legacyLocalesPath)) {\n const legacy = await getFileAsync(legacyLocalesPath);\n if (legacy.includes(`groupedTranslations(\"access\"`)) {\n console.log(`${colors.yellowBright(\"access\")} locale already registered, skipping...`);\n return;\n }\n }\n\n if (await fileExistsAsync(localesPath)) {\n const current = await getFileAsync(localesPath);\n let dictionary: Record<string, unknown>;\n try {\n const parsed: unknown = JSON.parse(current);\n if (parsed === null || Array.isArray(parsed) || typeof parsed !== \"object\") throw new Error();\n dictionary = parsed as Record<string, unknown>;\n } catch {\n console.log(\n `${colors.yellowBright(\"access\")} locale JSON is invalid; add errors.forbidden to src/app/access/utils/locales.json manually.`,\n );\n return;\n }\n\n // A root `$group` renames the whole file's namespace; merging there would\n // register the sentence under a key the access checks never read.\n if (dictionary.$group !== undefined && dictionary.$group !== \"access\") {\n console.log(\n `${colors.yellowBright(\"access\")} locale JSON declares a different $group; add access.errors.forbidden manually.`,\n );\n return;\n }\n\n const errors = dictionary.errors;\n if (\n errors !== undefined &&\n (errors === null || Array.isArray(errors) || typeof errors !== \"object\")\n ) {\n console.log(\n `${colors.yellowBright(\"access\")} locale JSON cannot safely add errors.forbidden; update src/app/access/utils/locales.json manually.`,\n );\n return;\n }\n const entries = (errors ?? {}) as Record<string, unknown>;\n if (entries.forbidden !== undefined) return;\n\n entries.forbidden = forbidden;\n dictionary.errors = entries;\n await putFileAsync(localesPath, `${JSON.stringify(dictionary, null, 2)}\\n`);\n console.log(\n `${colors.green(\"✓\")} Registered the access locale in src/app/access/utils/locales.json`,\n );\n return;\n }\n\n await ensureDirectoryAsync(srcPath(\"app/access/utils\"));\n await putFileAsync(localesPath, `${JSON.stringify({ errors: { forbidden } }, null, 2)}\\n`);\n console.log(\n `${colors.green(\"✓\")} Created src/app/access/utils/locales.json with the access locale`,\n );\n}\n\nasync function scaffoldAccessFiles() {\n // The resolver file is the sentinel for \"access already scaffolded\" — its\n // presence means the role/user-role model folders and their timestamped\n // migrations were created too, so we must not re-emit duplicate migrations on\n // a second run.\n const resolverPath = srcPath(\"app/access/services/access-resolver.ts\");\n\n if (await fileExistsAsync(resolverPath)) {\n console.log(\n `${colors.yellowBright(\"src/app/access\")} already scaffolded, skipping resolver + role tables...`,\n );\n\n return;\n }\n\n // 1. Role catalog model folder (model + barrel + migration). The catalog row\n // is role name → granted permissions; managed at runtime in the DB.\n await ensureDirectoryAsync(srcPath(\"app/access/models/role\"));\n await putFileAsync(srcPath(\"app/access/models/role/role.model.ts\"), accessRoleModelStub);\n await putFileAsync(srcPath(\"app/access/models/role/index.ts\"), accessRoleModelIndexStub);\n console.log(`${colors.green(\"✓\")} Created src/app/access/models/role`);\n\n await ensureDirectoryAsync(srcPath(\"app/access/models/role/migrations\"));\n\n // Migration filenames carry a MM-DD-YYYY_HH-MM-SS prefix so cascade infers\n // their createdAt and orders them deterministically (the migrate action\n // discovers src/app/*/models/*/migrations/*). The two tables are independent\n // (no FK between them), but the user-role migration is stamped a second later\n // so the relative order is stable.\n const roleMigrationFile = `${migrationTimestamp()}-role.migration.ts`;\n await putFileAsync(\n srcPath(\"app/access/models/role/migrations\", roleMigrationFile),\n accessRoleMigrationStub,\n );\n console.log(\n `${colors.green(\"✓\")} Created src/app/access/models/role/migrations/${roleMigrationFile}`,\n );\n\n // 2. UserRole assignment model folder (model + barrel + migration). The model\n // statics scope an unresolved tenant to GLOBAL rows only (security\n // invariant) — see the stub for the reasoning.\n await ensureDirectoryAsync(srcPath(\"app/access/models/user-role\"));\n await putFileAsync(\n srcPath(\"app/access/models/user-role/user-role.model.ts\"),\n accessUserRoleModelStub,\n );\n await putFileAsync(srcPath(\"app/access/models/user-role/index.ts\"), accessUserRoleModelIndexStub);\n console.log(`${colors.green(\"✓\")} Created src/app/access/models/user-role`);\n\n await ensureDirectoryAsync(srcPath(\"app/access/models/user-role/migrations\"));\n\n const userRoleMigrationFile = `${migrationTimestamp(1)}-user-role.migration.ts`;\n await putFileAsync(\n srcPath(\"app/access/models/user-role/migrations\", userRoleMigrationFile),\n accessUserRoleMigrationStub,\n );\n console.log(\n `${colors.green(\"✓\")} Created src/app/access/models/user-role/migrations/${userRoleMigrationFile}`,\n );\n\n // 3. The DatabaseAccessResolver — the one required config seam, wired into\n // config/access.ts by the ejected stub.\n await ensureDirectoryAsync(srcPath(\"app/access/services\"));\n await putFileAsync(resolverPath, accessResolverStub);\n console.log(`${colors.green(\"✓\")} Created src/app/access/services/access-resolver.ts`);\n}\n\nasync function completeAccessInstallation(_options: CommandActionData) {\n await registerAccessLocale();\n await scaffoldAccessFiles();\n}\n\nexport const accessFeature: FeatureDefinition = {\n description:\n \"Installs @warlock.js/access — authorization (RBAC + ABAC): permission checks, ABAC policies, and roles. Ejects config/access.ts, the DatabaseAccessResolver + Role/UserRole models and migrations into src/app/access, and registers the access locale in src/app/access/utils/locales.json\",\n dependencies: {\n \"@warlock.js/access\": INSTALLED_WARLOCK_VERSION,\n },\n ejectConfig: {\n content: accessConfigStub,\n name: \"access\",\n },\n onExecuting: completeAccessInstallation,\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"access.feature.mjs","names":[],"sources":["../../../../../../../../../packages/core/src/generations/features/access.feature.ts"],"sourcesContent":["import { colors } from \"@mongez/copper\";\nimport {\n ensureDirectoryAsync,\n fileExistsAsync,\n getFileAsync,\n putFileAsync,\n} from \"../generation-fs\";\nimport type { CommandActionData } from \"../../commands/types\";\nimport { srcPath } from \"../../utils\";\nimport {\n accessConfigStub,\n accessResolverStub,\n accessRoleMigrationStub,\n accessRoleModelIndexStub,\n accessRoleModelStub,\n accessUserRoleMigrationStub,\n accessUserRoleModelIndexStub,\n accessUserRoleModelStub,\n} from \"../stubs\";\nimport { migrationTimestamp } from \"./shared/migration-timestamp\";\nimport { type FeatureDefinition, INSTALLED_WARLOCK_VERSION } from \"./types\";\n\nasync function registerAccessLocale() {\n const legacyLocalesPath = srcPath(\"app/shared/utils/locales.ts\");\n const localesPath = srcPath(\"app/access/utils/locales.json\");\n const forbidden = {\n en: \"You do not have permission to perform this action.\",\n ar: \"ليس لديك صلاحية لتنفيذ هذا الإجراء.\",\n };\n\n if (await fileExistsAsync(legacyLocalesPath)) {\n const legacy = await getFileAsync(legacyLocalesPath);\n if (legacy.includes(`groupedTranslations(\"access\"`)) {\n console.log(`${colors.yellowBright(\"access\")} locale already registered, skipping...`);\n return;\n }\n }\n\n if (await fileExistsAsync(localesPath)) {\n const current = await getFileAsync(localesPath);\n let dictionary: Record<string, unknown>;\n try {\n const parsed: unknown = JSON.parse(current);\n if (parsed === null || Array.isArray(parsed) || typeof parsed !== \"object\") throw new Error();\n dictionary = parsed as Record<string, unknown>;\n } catch {\n console.log(\n `${colors.yellowBright(\"access\")} locale JSON is invalid; add errors.forbidden to src/app/access/utils/locales.json manually.`,\n );\n return;\n }\n\n // A root `$group` renames the whole file's namespace; merging there would\n // register the sentence under a key the access checks never read.\n if (dictionary.$group !== undefined && dictionary.$group !== \"access\") {\n console.log(\n `${colors.yellowBright(\"access\")} locale JSON declares a different $group; add access.errors.forbidden manually.`,\n );\n return;\n }\n\n const errors = dictionary.errors;\n if (\n errors !== undefined &&\n (errors === null || Array.isArray(errors) || typeof errors !== \"object\")\n ) {\n console.log(\n `${colors.yellowBright(\"access\")} locale JSON cannot safely add errors.forbidden; update src/app/access/utils/locales.json manually.`,\n );\n return;\n }\n const entries = (errors ?? {}) as Record<string, unknown>;\n if (entries.forbidden !== undefined) return;\n\n entries.forbidden = forbidden;\n dictionary.errors = entries;\n await putFileAsync(localesPath, `${JSON.stringify(dictionary, null, 2)}\\n`);\n console.log(\n `${colors.green(\"✓\")} Registered the access locale in src/app/access/utils/locales.json`,\n );\n return;\n }\n\n await ensureDirectoryAsync(srcPath(\"app/access/utils\"));\n await putFileAsync(localesPath, `${JSON.stringify({ errors: { forbidden } }, null, 2)}\\n`);\n console.log(\n `${colors.green(\"✓\")} Created src/app/access/utils/locales.json with the access locale`,\n );\n}\n\nasync function scaffoldAccessFiles() {\n // The resolver file is the sentinel for \"access already scaffolded\" — its\n // presence means the role/user-role model folders and their timestamped\n // migrations were created too, so we must not re-emit duplicate migrations on\n // a second run.\n const resolverPath = srcPath(\"app/access/services/access-resolver.ts\");\n\n if (await fileExistsAsync(resolverPath)) {\n console.log(\n `${colors.yellowBright(\"src/app/access\")} already scaffolded, skipping resolver + role tables...`,\n );\n\n return;\n }\n\n // 1. Role catalog model folder (model + barrel + migration). The catalog row\n // is role name → granted permissions; managed at runtime in the DB.\n await ensureDirectoryAsync(srcPath(\"app/access/models/role\"));\n await putFileAsync(srcPath(\"app/access/models/role/role.model.ts\"), accessRoleModelStub);\n await putFileAsync(srcPath(\"app/access/models/role/index.ts\"), accessRoleModelIndexStub);\n console.log(`${colors.green(\"✓\")} Created src/app/access/models/role`);\n\n await ensureDirectoryAsync(srcPath(\"app/access/models/role/migrations\"));\n\n // Migration filenames carry a MM-DD-YYYY_HH-MM-SS prefix so cascade infers\n // their createdAt and orders them deterministically (the migrate action\n // discovers src/app/*/models/*/migrations/*). The two tables are independent\n // (no FK between them), but the user-role migration is stamped a second later\n // so the relative order is stable.\n const roleMigrationFile = `${migrationTimestamp()}-role.migration.ts`;\n await putFileAsync(\n srcPath(\"app/access/models/role/migrations\", roleMigrationFile),\n accessRoleMigrationStub,\n );\n console.log(\n `${colors.green(\"✓\")} Created src/app/access/models/role/migrations/${roleMigrationFile}`,\n );\n\n // 2. UserRole assignment model folder (model + barrel + migration). The model\n // statics scope an unresolved tenant to GLOBAL rows only (security\n // invariant) — see the stub for the reasoning.\n await ensureDirectoryAsync(srcPath(\"app/access/models/user-role\"));\n await putFileAsync(\n srcPath(\"app/access/models/user-role/user-role.model.ts\"),\n accessUserRoleModelStub,\n );\n await putFileAsync(srcPath(\"app/access/models/user-role/index.ts\"), accessUserRoleModelIndexStub);\n console.log(`${colors.green(\"✓\")} Created src/app/access/models/user-role`);\n\n await ensureDirectoryAsync(srcPath(\"app/access/models/user-role/migrations\"));\n\n const userRoleMigrationFile = `${migrationTimestamp(1)}-user-role.migration.ts`;\n await putFileAsync(\n srcPath(\"app/access/models/user-role/migrations\", userRoleMigrationFile),\n accessUserRoleMigrationStub,\n );\n console.log(\n `${colors.green(\"✓\")} Created src/app/access/models/user-role/migrations/${userRoleMigrationFile}`,\n );\n\n // 3. The DatabaseAccessResolver — the one required config seam, wired into\n // config/access.ts by the ejected stub.\n await ensureDirectoryAsync(srcPath(\"app/access/services\"));\n await putFileAsync(resolverPath, accessResolverStub);\n console.log(`${colors.green(\"✓\")} Created src/app/access/services/access-resolver.ts`);\n}\n\nasync function completeAccessInstallation(_options: CommandActionData) {\n await registerAccessLocale();\n await scaffoldAccessFiles();\n}\n\nexport const accessFeature: FeatureDefinition = {\n description:\n \"Installs @warlock.js/access — authorization (RBAC + ABAC): permission checks, ABAC policies, and roles. Ejects config/access.ts, the DatabaseAccessResolver + Role/UserRole models and migrations into src/app/access, and registers the access locale in src/app/access/utils/locales.json\",\n dependencies: {\n \"@warlock.js/access\": INSTALLED_WARLOCK_VERSION,\n },\n ejectConfig: {\n content: accessConfigStub,\n name: \"access\",\n },\n onExecuting: completeAccessInstallation,\n};\n"],"mappings":"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"}
@@ -1,8 +1,8 @@
1
1
  import { rootPath, srcPath } from "../../utils/paths.mjs";
2
2
  import "../../utils/index.mjs";
3
+ import { fileExistsAsync, getFileAsync, getJsonFileAsync, putFileAsync } from "../generation-fs.mjs";
3
4
  import { insertQueueDashboardBlock } from "./shared/insert-queue-dashboard-block.mjs";
4
5
  import { colors } from "@mongez/copper";
5
- import { fileExistsAsync, getFileAsync, getJsonFileAsync, putFileAsync } from "@warlock.js/fs";
6
6
 
7
7
  //#region ../../packages/core/src/generations/features/bull-board.feature.ts
8
8
  /**
@@ -22,7 +22,8 @@ async function addDashboardConfigBlock() {
22
22
  `);
23
23
  return;
24
24
  }
25
- const insertion = insertQueueDashboardBlock(await getFileAsync(configPath));
25
+ const current = await getFileAsync(configPath);
26
+ const insertion = insertQueueDashboardBlock(current);
26
27
  if (insertion.status === "already-present") {
27
28
  console.log(`${colors.yellowBright("dashboard")} config already present in src/config/queue.ts, skipping...`);
28
29
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"bull-board.feature.mjs","names":[],"sources":["../../../../../../../../../packages/core/src/generations/features/bull-board.feature.ts"],"sourcesContent":["import { colors } from \"@mongez/copper\";\nimport { fileExistsAsync, getFileAsync, getJsonFileAsync, putFileAsync } from \"@warlock.js/fs\";\nimport type { CommandActionData } from \"../../commands/types\";\nimport { rootPath, srcPath } from \"../../utils\";\nimport { insertQueueDashboardBlock } from \"./shared/insert-queue-dashboard-block\";\nimport type { FeatureDefinition } from \"./types\";\n\n/** The parts of `package.json` this feature reads to check for its prerequisite. */\ntype ProjectPackageJson = {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n};\n\n/**\n * Defensive floor: `requires: [\"queue\"]` normally installs queue first, so\n * this only fires when the dashboard step runs without it (e.g. called\n * directly), and then fails loudly instead of writing a half-wired config.\n */\nasync function isQueueInstalled(): Promise<boolean> {\n const packageJson = await getJsonFileAsync<ProjectPackageJson>(rootPath(\"package.json\"));\n\n return Boolean(\n packageJson.dependencies?.[\"@warlock.js/queue\"] ||\n packageJson.devDependencies?.[\"@warlock.js/queue\"],\n );\n}\n\n/** Insert the `dashboard` block into `src/config/queue.ts`, without reformatting it. */\nasync function addDashboardConfigBlock(): Promise<void> {\n const configPath = srcPath(\"config/queue.ts\");\n\n if (!(await fileExistsAsync(configPath))) {\n console.log(\n `${colors.yellowBright(\"src/config/queue.ts\")} not found — add this to your queue config yourself:\\n` +\n ' dashboard: { enabled: true, path: \"/admin/queues\", middleware: [] },\\n',\n );\n\n return;\n }\n\n const current = await getFileAsync(configPath);\n const insertion = insertQueueDashboardBlock(current);\n\n if (insertion.status === \"already-present\") {\n console.log(\n `${colors.yellowBright(\"dashboard\")} config already present in src/config/queue.ts, skipping...`,\n );\n\n return;\n }\n\n if (insertion.status === \"unrecognised\") {\n console.log(\n `${colors.yellowBright(\"!\")} src/config/queue.ts has no recognisable ${colors.yellowBright(\"queueConfig\")} object — ` +\n \"add the dashboard block yourself:\\n\" +\n ' dashboard: { enabled: true, path: \"/admin/queues\", middleware: [] },\\n',\n );\n\n return;\n }\n\n await putFileAsync(configPath, insertion.next);\n console.log(`${colors.green(\"✓\")} Added dashboard config to src/config/queue.ts`);\n}\n\n/**\n * Wire the dashboard into the app: verify queue is installed, then add the\n * `dashboard` block to its config.\n */\nasync function completeBullBoardInstallation(_options: CommandActionData): Promise<void> {\n if (!(await isQueueInstalled())) {\n console.log(\n `${colors.redBright(\"✗\")} @warlock.js/queue is not installed — run ` +\n `${colors.yellowBright(\"warlock add queue\")} first, then ${colors.yellowBright(\"warlock add bull-board\")}.`,\n );\n process.exitCode = 1;\n\n return;\n }\n\n await addDashboardConfigBlock();\n\n console.log(\n \"\\nNext: guard the dashboard with a middleware before it ships to production — an empty \" +\n \"middleware list throws QueueDashboardUnguardedError at boot when NODE_ENV is \\\"production\\\".\",\n );\n}\n\n/** `warlock add bull-board` — a config-driven bull-board dashboard for @warlock.js/queue. */\nexport const bullBoardFeature: FeatureDefinition = {\n description:\n \"Installs @bull-board/api and @bull-board/fastify and adds a dashboard block to src/config/queue.ts. Adds the queue feature first when it is missing.\",\n requires: [\"queue\"],\n dependencies: {\n \"@bull-board/api\": \"^9.10.2\",\n \"@bull-board/fastify\": \"^9.10.2\",\n },\n onExecuting: completeBullBoardInstallation,\n};\n"],"mappings":";;;;;;;;;;;;AAkBA,eAAe,mBAAqC;CAClD,MAAM,cAAc,MAAM,iBAAqC,SAAS,cAAc,CAAC;CAEvF,OAAO,QACL,YAAY,eAAe,wBACzB,YAAY,kBAAkB,oBAClC;AACF;;AAGA,eAAe,0BAAyC;CACtD,MAAM,aAAa,QAAQ,iBAAiB;CAE5C,IAAI,CAAE,MAAM,gBAAgB,UAAU,GAAI;EACxC,QAAQ,IACN,GAAG,OAAO,aAAa,qBAAqB,EAAE;CAEhD;EAEA;CACF;CAGA,MAAM,YAAY,0BAA0B,MADtB,aAAa,UAAU,CACM;CAEnD,IAAI,UAAU,WAAW,mBAAmB;EAC1C,QAAQ,IACN,GAAG,OAAO,aAAa,WAAW,EAAE,4DACtC;EAEA;CACF;CAEA,IAAI,UAAU,WAAW,gBAAgB;EACvC,QAAQ,IACN,GAAG,OAAO,aAAa,GAAG,EAAE,2CAA2C,OAAO,aAAa,aAAa,EAAE;;CAG5G;EAEA;CACF;CAEA,MAAM,aAAa,YAAY,UAAU,IAAI;CAC7C,QAAQ,IAAI,GAAG,OAAO,MAAM,GAAG,EAAE,+CAA+C;AAClF;;;;;AAMA,eAAe,8BAA8B,UAA4C;CACvF,IAAI,CAAE,MAAM,iBAAiB,GAAI;EAC/B,QAAQ,IACN,GAAG,OAAO,UAAU,GAAG,EAAE,4CACpB,OAAO,aAAa,mBAAmB,EAAE,eAAe,OAAO,aAAa,wBAAwB,EAAE,EAC7G;EACA,QAAQ,WAAW;EAEnB;CACF;CAEA,MAAM,wBAAwB;CAE9B,QAAQ,IACN,qLAEF;AACF;;AAGA,MAAa,mBAAsC;CACjD,aACE;CACF,UAAU,CAAC,OAAO;CAClB,cAAc;EACZ,mBAAmB;EACnB,uBAAuB;CACzB;CACA,aAAa;AACf"}
1
+ {"version":3,"file":"bull-board.feature.mjs","names":[],"sources":["../../../../../../../../../packages/core/src/generations/features/bull-board.feature.ts"],"sourcesContent":["import { colors } from \"@mongez/copper\";\nimport { fileExistsAsync, getFileAsync, getJsonFileAsync, putFileAsync } from \"../generation-fs\";\nimport type { CommandActionData } from \"../../commands/types\";\nimport { rootPath, srcPath } from \"../../utils\";\nimport { insertQueueDashboardBlock } from \"./shared/insert-queue-dashboard-block\";\nimport type { FeatureDefinition } from \"./types\";\n\n/** The parts of `package.json` this feature reads to check for its prerequisite. */\ntype ProjectPackageJson = {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n};\n\n/**\n * Defensive floor: `requires: [\"queue\"]` normally installs queue first, so\n * this only fires when the dashboard step runs without it (e.g. called\n * directly), and then fails loudly instead of writing a half-wired config.\n */\nasync function isQueueInstalled(): Promise<boolean> {\n const packageJson = await getJsonFileAsync<ProjectPackageJson>(rootPath(\"package.json\"));\n\n return Boolean(\n packageJson.dependencies?.[\"@warlock.js/queue\"] ||\n packageJson.devDependencies?.[\"@warlock.js/queue\"],\n );\n}\n\n/** Insert the `dashboard` block into `src/config/queue.ts`, without reformatting it. */\nasync function addDashboardConfigBlock(): Promise<void> {\n const configPath = srcPath(\"config/queue.ts\");\n\n if (!(await fileExistsAsync(configPath))) {\n console.log(\n `${colors.yellowBright(\"src/config/queue.ts\")} not found — add this to your queue config yourself:\\n` +\n ' dashboard: { enabled: true, path: \"/admin/queues\", middleware: [] },\\n',\n );\n\n return;\n }\n\n const current = await getFileAsync(configPath);\n const insertion = insertQueueDashboardBlock(current);\n\n if (insertion.status === \"already-present\") {\n console.log(\n `${colors.yellowBright(\"dashboard\")} config already present in src/config/queue.ts, skipping...`,\n );\n\n return;\n }\n\n if (insertion.status === \"unrecognised\") {\n console.log(\n `${colors.yellowBright(\"!\")} src/config/queue.ts has no recognisable ${colors.yellowBright(\"queueConfig\")} object — ` +\n \"add the dashboard block yourself:\\n\" +\n ' dashboard: { enabled: true, path: \"/admin/queues\", middleware: [] },\\n',\n );\n\n return;\n }\n\n await putFileAsync(configPath, insertion.next);\n console.log(`${colors.green(\"✓\")} Added dashboard config to src/config/queue.ts`);\n}\n\n/**\n * Wire the dashboard into the app: verify queue is installed, then add the\n * `dashboard` block to its config.\n */\nasync function completeBullBoardInstallation(_options: CommandActionData): Promise<void> {\n if (!(await isQueueInstalled())) {\n console.log(\n `${colors.redBright(\"✗\")} @warlock.js/queue is not installed — run ` +\n `${colors.yellowBright(\"warlock add queue\")} first, then ${colors.yellowBright(\"warlock add bull-board\")}.`,\n );\n process.exitCode = 1;\n\n return;\n }\n\n await addDashboardConfigBlock();\n\n console.log(\n \"\\nNext: guard the dashboard with a middleware before it ships to production — an empty \" +\n 'middleware list throws QueueDashboardUnguardedError at boot when NODE_ENV is \"production\".',\n );\n}\n\n/** `warlock add bull-board` — a config-driven bull-board dashboard for @warlock.js/queue. */\nexport const bullBoardFeature: FeatureDefinition = {\n description:\n \"Installs @bull-board/api and @bull-board/fastify and adds a dashboard block to src/config/queue.ts. Adds the queue feature first when it is missing.\",\n requires: [\"queue\"],\n dependencies: {\n \"@bull-board/api\": \"^9.10.2\",\n \"@bull-board/fastify\": \"^9.10.2\",\n },\n onExecuting: completeBullBoardInstallation,\n};\n"],"mappings":";;;;;;;;;;;;AAkBA,eAAe,mBAAqC;CAClD,MAAM,cAAc,MAAM,iBAAqC,SAAS,cAAc,CAAC;CAEvF,OAAO,QACL,YAAY,eAAe,wBAC3B,YAAY,kBAAkB,oBAChC;AACF;;AAGA,eAAe,0BAAyC;CACtD,MAAM,aAAa,QAAQ,iBAAiB;CAE5C,IAAI,CAAE,MAAM,gBAAgB,UAAU,GAAI;EACxC,QAAQ,IACN,GAAG,OAAO,aAAa,qBAAqB,EAAE;CAEhD;EAEA;CACF;CAEA,MAAM,UAAU,MAAM,aAAa,UAAU;CAC7C,MAAM,YAAY,0BAA0B,OAAO;CAEnD,IAAI,UAAU,WAAW,mBAAmB;EAC1C,QAAQ,IACN,GAAG,OAAO,aAAa,WAAW,EAAE,4DACtC;EAEA;CACF;CAEA,IAAI,UAAU,WAAW,gBAAgB;EACvC,QAAQ,IACN,GAAG,OAAO,aAAa,GAAG,EAAE,2CAA2C,OAAO,aAAa,aAAa,EAAE;;CAG5G;EAEA;CACF;CAEA,MAAM,aAAa,YAAY,UAAU,IAAI;CAC7C,QAAQ,IAAI,GAAG,OAAO,MAAM,GAAG,EAAE,+CAA+C;AAClF;;;;;AAMA,eAAe,8BAA8B,UAA4C;CACvF,IAAI,CAAE,MAAM,iBAAiB,GAAI;EAC/B,QAAQ,IACN,GAAG,OAAO,UAAU,GAAG,EAAE,4CACpB,OAAO,aAAa,mBAAmB,EAAE,eAAe,OAAO,aAAa,wBAAwB,EAAE,EAC7G;EACA,QAAQ,WAAW;EAEnB;CACF;CAEA,MAAM,wBAAwB;CAE9B,QAAQ,IACN,qLAEF;AACF;;AAGA,MAAa,mBAAsC;CACjD,aACE;CACF,UAAU,CAAC,OAAO;CAClB,cAAc;EACZ,mBAAmB;EACnB,uBAAuB;CACzB;CACA,aAAa;AACf"}
@@ -1 +1 @@
1
- {"version":3,"file":"mysql.feature.mjs","names":[],"sources":["../../../../../../../../../packages/core/src/generations/features/mysql.feature.ts"],"sourcesContent":["import type { FeatureDefinition } from \"./types\";\n\n/**\n * MySQL is not implemented by Cascade (`connectToDatabase` throws for it), so\n * installing `mysql2` would only produce an app that crashes on boot. No\n * dependencies are declared and running the feature fails loudly instead.\n */\nexport const mysqlFeature: FeatureDefinition = {\n description: \"MySQL (not supported by @warlock.js/cascade yet)\",\n onExecuting: async () => {\n throw new Error(\n \"MySQL is not supported by @warlock.js/cascade yet; use postgres or mongodb\",\n );\n },\n};\n"],"mappings":";;;;;;AAOA,MAAa,eAAkC;CAC7C,aAAa;CACb,aAAa,YAAY;EACvB,MAAM,IAAI,MACR,4EACF;CACF;AACF"}
1
+ {"version":3,"file":"mysql.feature.mjs","names":[],"sources":["../../../../../../../../../packages/core/src/generations/features/mysql.feature.ts"],"sourcesContent":["import type { FeatureDefinition } from \"./types\";\n\n/**\n * MySQL is not implemented by Cascade (`connectToDatabase` throws for it), so\n * installing `mysql2` would only produce an app that crashes on boot. No\n * dependencies are declared and running the feature fails loudly instead.\n */\nexport const mysqlFeature: FeatureDefinition = {\n description: \"MySQL (not supported by @warlock.js/cascade yet)\",\n onExecuting: async () => {\n throw new Error(\"MySQL is not supported by @warlock.js/cascade yet; use postgres or mongodb\");\n },\n};\n"],"mappings":";;;;;;AAOA,MAAa,eAAkC;CAC7C,aAAa;CACb,aAAa,YAAY;EACvB,MAAM,IAAI,MAAM,4EAA4E;CAC9F;AACF"}
@@ -1,11 +1,12 @@
1
1
  import { srcPath } from "../../utils/paths.mjs";
2
2
  import "../../utils/index.mjs";
3
- import { listNotificationsControllerStub, listNotificationsSchemaStub, markAllNotificationsReadControllerStub, markNotificationReadControllerStub, markNotificationReadServiceStub, notificationControllerSpecStub, notificationLocalesStub, notificationMigrationStub, notificationModelStub, notificationResourceStub, notificationRoutesStub, notificationsConfigStub, notificationsRequestTypeStub, unreadNotificationsCountControllerStub } from "../stubs.mjs";
3
+ import { recordSkippedFile } from "../generation-run.mjs";
4
+ import { directoryExistsAsync, ensureDirectoryAsync, fileExistsAsync, getFileAsync, putFileAsync } from "../generation-fs.mjs";
5
+ import { listNotificationsControllerStub, listNotificationsSchemaStub, markAllNotificationsReadControllerStub, markNotificationReadControllerStub, markNotificationReadServiceStub, notificationControllerSpecStub, notificationLocalesStub, notificationMigrationStub, notificationModelStub, notificationResourceStub, notificationRoutesStub, notificationTestFixtureStub, notificationsConfigStub, notificationsRequestTypeStub, unreadNotificationsCountControllerStub } from "../stubs.mjs";
4
6
  import { migrationTimestamp } from "./shared/migration-timestamp.mjs";
5
7
  import { INSTALLED_WARLOCK_VERSION } from "./types.mjs";
6
8
  import { dirname } from "node:path";
7
9
  import { colors } from "@mongez/copper";
8
- import { directoryExistsAsync, ensureDirectoryAsync, fileExistsAsync, getFileAsync, putFileAsync } from "@warlock.js/fs";
9
10
 
10
11
  //#region ../../packages/core/src/generations/features/notifications.feature.ts
11
12
  /**
@@ -49,6 +50,7 @@ async function writeModuleFile(relativePath, content, skipped) {
49
50
  const path = srcPath("app/notifications", relativePath);
50
51
  if (await fileExistsAsync(path)) {
51
52
  skipped.push(relativePath);
53
+ recordSkippedFile(path, "exists");
52
54
  return;
53
55
  }
54
56
  await ensureDirectoryAsync(dirname(path));
@@ -101,7 +103,8 @@ async function pointConfigAtLegacyModel() {
101
103
  }
102
104
  async function completeNotificationsInstallation(_options) {
103
105
  const modelPath = srcPath("app/notifications/models/notification/notification.model.ts");
104
- if (await fileExistsAsync(srcPath("app/notifications/notification.model.ts"))) {
106
+ const legacyModelPath = srcPath("app/notifications/notification.model.ts");
107
+ if (await fileExistsAsync(legacyModelPath)) {
105
108
  if (!await fileExistsAsync(modelPath)) await pointConfigAtLegacyModel();
106
109
  console.log(`${colors.yellowBright("src/app/notifications")} already scaffolded (5.29 layout), skipping...`);
107
110
  return;
@@ -122,6 +125,7 @@ async function completeNotificationsInstallation(_options) {
122
125
  await writeModuleFile("services/mark-notification-read.service.ts", markNotificationReadServiceStub, skipped);
123
126
  await registerNotificationLocales(skipped);
124
127
  const withSpecs = await fileExistsAsync(srcPath("test-setup.ts"));
128
+ if (withSpecs) await writeModuleFile("tests/notifications.fixture.ts", notificationTestFixtureStub, skipped);
125
129
  for (const controller of notificationControllers) {
126
130
  await writeModuleFile(`controllers/${controller.file}.ts`, controller.stub, skipped);
127
131
  if (withSpecs) await writeModuleFile(`controllers/${controller.file}.spec.ts`, notificationControllerSpecStub(controller.method, controller.path), skipped);