@warlock.js/core 5.0.2 → 5.2.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 (1040) hide show
  1. package/CHANGELOG.md +190 -0
  2. package/esm/application/app.d.mts +1 -1
  3. package/esm/application/app.d.mts.map +1 -1
  4. package/esm/application/app.mjs +1 -1
  5. package/esm/application/app.mjs.map +1 -1
  6. package/esm/application/application-config-types.d.mts +1 -1
  7. package/esm/application/application-config-types.d.mts.map +1 -1
  8. package/esm/application/application.d.mts +1 -1
  9. package/esm/application/application.d.mts.map +1 -1
  10. package/esm/application/application.mjs +1 -1
  11. package/esm/application/application.mjs.map +1 -1
  12. package/esm/application/boot-signal.d.mts +1 -1
  13. package/esm/application/boot-signal.d.mts.map +1 -1
  14. package/esm/application/boot-signal.mjs +1 -1
  15. package/esm/application/boot-signal.mjs.map +1 -1
  16. package/esm/benchmark/benchmark-snapshots.d.mts +1 -1
  17. package/esm/benchmark/benchmark-snapshots.d.mts.map +1 -1
  18. package/esm/benchmark/benchmark-snapshots.mjs +1 -1
  19. package/esm/benchmark/benchmark-snapshots.mjs.map +1 -1
  20. package/esm/benchmark/benchmark.d.mts +1 -1
  21. package/esm/benchmark/benchmark.d.mts.map +1 -1
  22. package/esm/benchmark/benchmark.mjs +1 -1
  23. package/esm/benchmark/benchmark.mjs.map +1 -1
  24. package/esm/benchmark/channels/console.channel.d.mts +1 -1
  25. package/esm/benchmark/channels/console.channel.d.mts.map +1 -1
  26. package/esm/benchmark/channels/console.channel.mjs +1 -1
  27. package/esm/benchmark/channels/console.channel.mjs.map +1 -1
  28. package/esm/benchmark/channels/noop.channel.d.mts +1 -1
  29. package/esm/benchmark/channels/noop.channel.d.mts.map +1 -1
  30. package/esm/benchmark/channels/noop.channel.mjs +1 -1
  31. package/esm/benchmark/channels/noop.channel.mjs.map +1 -1
  32. package/esm/benchmark/profiler.d.mts +1 -1
  33. package/esm/benchmark/profiler.d.mts.map +1 -1
  34. package/esm/benchmark/profiler.mjs +1 -1
  35. package/esm/benchmark/profiler.mjs.map +1 -1
  36. package/esm/benchmark/types.d.mts +1 -1
  37. package/esm/benchmark/types.d.mts.map +1 -1
  38. package/esm/bootstrap/setup.d.mts +1 -1
  39. package/esm/bootstrap/setup.d.mts.map +1 -1
  40. package/esm/bootstrap/setup.mjs +1 -1
  41. package/esm/bootstrap/setup.mjs.map +1 -1
  42. package/esm/bootstrap.d.mts +1 -1
  43. package/esm/bootstrap.d.mts.map +1 -1
  44. package/esm/bootstrap.mjs +1 -1
  45. package/esm/bootstrap.mjs.map +1 -1
  46. package/esm/cache/database-cache-driver.d.mts +1 -1
  47. package/esm/cache/database-cache-driver.d.mts.map +1 -1
  48. package/esm/cache/database-cache-driver.mjs +1 -1
  49. package/esm/cache/database-cache-driver.mjs.map +1 -1
  50. package/esm/cache/index.mjs +1 -1
  51. package/esm/cache/index.mjs.map +1 -1
  52. package/esm/cli/cli-commands.manager.mjs +37 -2
  53. package/esm/cli/cli-commands.manager.mjs.map +1 -1
  54. package/esm/cli/cli-commands.utils.mjs +17 -11
  55. package/esm/cli/cli-commands.utils.mjs.map +1 -1
  56. package/esm/cli/commands/add.command.mjs +1 -1
  57. package/esm/cli/commands/add.command.mjs.map +1 -1
  58. package/esm/cli/commands/build.command.mjs +1 -1
  59. package/esm/cli/commands/build.command.mjs.map +1 -1
  60. package/esm/cli/commands/create-database.command.mjs +1 -1
  61. package/esm/cli/commands/create-database.command.mjs.map +1 -1
  62. package/esm/cli/commands/dev-server.command.mjs +2 -2
  63. package/esm/cli/commands/dev-server.command.mjs.map +1 -1
  64. package/esm/cli/commands/doctor/boot-for-diagnostics.mjs +207 -0
  65. package/esm/cli/commands/doctor/boot-for-diagnostics.mjs.map +1 -0
  66. package/esm/cli/commands/doctor/checks/config.check.mjs +6 -3
  67. package/esm/cli/commands/doctor/checks/config.check.mjs.map +1 -1
  68. package/esm/cli/commands/doctor/checks/connectors.check.mjs +39 -13
  69. package/esm/cli/commands/doctor/checks/connectors.check.mjs.map +1 -1
  70. package/esm/cli/commands/doctor/checks/handler-signature.check.mjs +9 -5
  71. package/esm/cli/commands/doctor/checks/handler-signature.check.mjs.map +1 -1
  72. package/esm/cli/commands/doctor/checks/health.check.mjs +78 -12
  73. package/esm/cli/commands/doctor/checks/health.check.mjs.map +1 -1
  74. package/esm/cli/commands/doctor/checks/index.mjs +6 -1
  75. package/esm/cli/commands/doctor/checks/index.mjs.map +1 -1
  76. package/esm/cli/commands/doctor/checks/optional-peers.check.mjs +117 -54
  77. package/esm/cli/commands/doctor/checks/optional-peers.check.mjs.map +1 -1
  78. package/esm/cli/commands/doctor/checks/release-hygiene.check.mjs +28 -10
  79. package/esm/cli/commands/doctor/checks/release-hygiene.check.mjs.map +1 -1
  80. package/esm/cli/commands/doctor/checks/routes.check.mjs +52 -13
  81. package/esm/cli/commands/doctor/checks/routes.check.mjs.map +1 -1
  82. package/esm/cli/commands/doctor/doctor-command.action.mjs +17 -7
  83. package/esm/cli/commands/doctor/doctor-command.action.mjs.map +1 -1
  84. package/esm/cli/commands/doctor/format-report.mjs +1 -1
  85. package/esm/cli/commands/doctor/format-report.mjs.map +1 -1
  86. package/esm/cli/commands/doctor/run-checks.mjs +16 -7
  87. package/esm/cli/commands/doctor/run-checks.mjs.map +1 -1
  88. package/esm/cli/commands/doctor.command.mjs +18 -10
  89. package/esm/cli/commands/doctor.command.mjs.map +1 -1
  90. package/esm/cli/commands/drop-tables.command.mjs +1 -1
  91. package/esm/cli/commands/drop-tables.command.mjs.map +1 -1
  92. package/esm/cli/commands/generate/generate.command.mjs +1 -1
  93. package/esm/cli/commands/generate/generate.command.mjs.map +1 -1
  94. package/esm/cli/commands/generate/generators/column-dsl-parser.mjs +1 -1
  95. package/esm/cli/commands/generate/generators/column-dsl-parser.mjs.map +1 -1
  96. package/esm/cli/commands/generate/generators/controller.generator.mjs +1 -1
  97. package/esm/cli/commands/generate/generators/controller.generator.mjs.map +1 -1
  98. package/esm/cli/commands/generate/generators/migration.generator.mjs +1 -1
  99. package/esm/cli/commands/generate/generators/migration.generator.mjs.map +1 -1
  100. package/esm/cli/commands/generate/generators/model.generator.mjs +1 -1
  101. package/esm/cli/commands/generate/generators/model.generator.mjs.map +1 -1
  102. package/esm/cli/commands/generate/generators/module.generator.mjs +1 -1
  103. package/esm/cli/commands/generate/generators/module.generator.mjs.map +1 -1
  104. package/esm/cli/commands/generate/generators/repository.generator.mjs +1 -1
  105. package/esm/cli/commands/generate/generators/repository.generator.mjs.map +1 -1
  106. package/esm/cli/commands/generate/generators/resource.generator.mjs +1 -1
  107. package/esm/cli/commands/generate/generators/resource.generator.mjs.map +1 -1
  108. package/esm/cli/commands/generate/generators/service.generator.mjs +1 -1
  109. package/esm/cli/commands/generate/generators/service.generator.mjs.map +1 -1
  110. package/esm/cli/commands/generate/templates/stubs.mjs +1 -1
  111. package/esm/cli/commands/generate/templates/stubs.mjs.map +1 -1
  112. package/esm/cli/commands/generate/utils/name-parser.mjs +1 -1
  113. package/esm/cli/commands/generate/utils/name-parser.mjs.map +1 -1
  114. package/esm/cli/commands/generate/utils/path-resolver.mjs +1 -1
  115. package/esm/cli/commands/generate/utils/path-resolver.mjs.map +1 -1
  116. package/esm/cli/commands/generate/utils/prompt.mjs +1 -1
  117. package/esm/cli/commands/generate/utils/prompt.mjs.map +1 -1
  118. package/esm/cli/commands/generate/utils/writer.mjs +1 -1
  119. package/esm/cli/commands/generate/utils/writer.mjs.map +1 -1
  120. package/esm/cli/commands/migrate.command.mjs +1 -1
  121. package/esm/cli/commands/migrate.command.mjs.map +1 -1
  122. package/esm/cli/commands/routes/diff-page-routes.mjs +84 -0
  123. package/esm/cli/commands/routes/diff-page-routes.mjs.map +1 -0
  124. package/esm/cli/commands/routes/format-routes-table.mjs +1 -1
  125. package/esm/cli/commands/routes/format-routes-table.mjs.map +1 -1
  126. package/esm/cli/commands/routes/route-row.mjs +1 -1
  127. package/esm/cli/commands/routes/route-row.mjs.map +1 -1
  128. package/esm/cli/commands/routes/routes-command.action.mjs +1 -1
  129. package/esm/cli/commands/routes/routes-command.action.mjs.map +1 -1
  130. package/esm/cli/commands/routes/routes-diff.action.mjs +84 -0
  131. package/esm/cli/commands/routes/routes-diff.action.mjs.map +1 -0
  132. package/esm/cli/commands/routes.command.mjs +16 -2
  133. package/esm/cli/commands/routes.command.mjs.map +1 -1
  134. package/esm/cli/commands/seed.command.mjs +1 -1
  135. package/esm/cli/commands/seed.command.mjs.map +1 -1
  136. package/esm/cli/commands/start-production.command.mjs +9 -2
  137. package/esm/cli/commands/start-production.command.mjs.map +1 -1
  138. package/esm/cli/commands/storage-put.action.mjs +1 -1
  139. package/esm/cli/commands/storage-put.action.mjs.map +1 -1
  140. package/esm/cli/commands/storage-put.command.mjs +1 -1
  141. package/esm/cli/commands/storage-put.command.mjs.map +1 -1
  142. package/esm/cli/commands/typings-generator.command.mjs +1 -1
  143. package/esm/cli/commands/typings-generator.command.mjs.map +1 -1
  144. package/esm/cli/commands/update.command.mjs +1 -1
  145. package/esm/cli/commands/update.command.mjs.map +1 -1
  146. package/esm/cli/commands-loader.mjs +1 -1
  147. package/esm/cli/commands-loader.mjs.map +1 -1
  148. package/esm/cli/framework-cli-commands.mjs +3 -2
  149. package/esm/cli/framework-cli-commands.mjs.map +1 -1
  150. package/esm/cli/parse-cli-args.mjs +1 -1
  151. package/esm/cli/parse-cli-args.mjs.map +1 -1
  152. package/esm/cli/start.mjs +1 -1
  153. package/esm/cli/start.mjs.map +1 -1
  154. package/esm/cli/string-similarity.mjs +1 -1
  155. package/esm/cli/string-similarity.mjs.map +1 -1
  156. package/esm/commands/cli-command.d.mts +1 -1
  157. package/esm/commands/cli-command.d.mts.map +1 -1
  158. package/esm/commands/cli-command.mjs +1 -1
  159. package/esm/commands/cli-command.mjs.map +1 -1
  160. package/esm/commands/types.d.mts +1 -1
  161. package/esm/commands/types.d.mts.map +1 -1
  162. package/esm/config/config-getter.d.mts +1 -1
  163. package/esm/config/config-getter.d.mts.map +1 -1
  164. package/esm/config/config-getter.mjs +1 -1
  165. package/esm/config/config-getter.mjs.map +1 -1
  166. package/esm/config/config-handlers.d.mts +1 -1
  167. package/esm/config/config-handlers.d.mts.map +1 -1
  168. package/esm/config/config-handlers.mjs +1 -1
  169. package/esm/config/config-handlers.mjs.map +1 -1
  170. package/esm/config/config-loader.d.mts +2 -2
  171. package/esm/config/config-loader.d.mts.map +1 -1
  172. package/esm/config/config-loader.mjs +1 -1
  173. package/esm/config/config-loader.mjs.map +1 -1
  174. package/esm/config/config-manager.mjs +1 -1
  175. package/esm/config/config-manager.mjs.map +1 -1
  176. package/esm/config/config-setter.d.mts +1 -1
  177. package/esm/config/config-setter.d.mts.map +1 -1
  178. package/esm/config/config-setter.mjs +1 -1
  179. package/esm/config/config-setter.mjs.map +1 -1
  180. package/esm/config/config-special-handlers.d.mts +2 -2
  181. package/esm/config/config-special-handlers.d.mts.map +1 -1
  182. package/esm/config/config-special-handlers.mjs +1 -1
  183. package/esm/config/config-special-handlers.mjs.map +1 -1
  184. package/esm/config/load-config-files.mjs +1 -1
  185. package/esm/config/load-config-files.mjs.map +1 -1
  186. package/esm/config/locale-configuration.mjs +1 -1
  187. package/esm/config/locale-configuration.mjs.map +1 -1
  188. package/esm/config/types.d.mts +1 -1
  189. package/esm/config/types.d.mts.map +1 -1
  190. package/esm/connectors/access-connector.d.mts +1 -1
  191. package/esm/connectors/access-connector.d.mts.map +1 -1
  192. package/esm/connectors/access-connector.mjs +1 -1
  193. package/esm/connectors/access-connector.mjs.map +1 -1
  194. package/esm/connectors/ai-connector.d.mts +1 -1
  195. package/esm/connectors/ai-connector.d.mts.map +1 -1
  196. package/esm/connectors/ai-connector.mjs +1 -1
  197. package/esm/connectors/ai-connector.mjs.map +1 -1
  198. package/esm/connectors/assert-no-reserved-connector-names.d.mts +1 -1
  199. package/esm/connectors/assert-no-reserved-connector-names.d.mts.map +1 -1
  200. package/esm/connectors/assert-no-reserved-connector-names.mjs +1 -1
  201. package/esm/connectors/assert-no-reserved-connector-names.mjs.map +1 -1
  202. package/esm/connectors/assert-unique-connector-names.d.mts +1 -1
  203. package/esm/connectors/assert-unique-connector-names.d.mts.map +1 -1
  204. package/esm/connectors/assert-unique-connector-names.mjs +1 -1
  205. package/esm/connectors/assert-unique-connector-names.mjs.map +1 -1
  206. package/esm/connectors/base-connector.d.mts +1 -1
  207. package/esm/connectors/base-connector.d.mts.map +1 -1
  208. package/esm/connectors/base-connector.mjs +1 -1
  209. package/esm/connectors/base-connector.mjs.map +1 -1
  210. package/esm/connectors/cache-connector.d.mts +1 -1
  211. package/esm/connectors/cache-connector.d.mts.map +1 -1
  212. package/esm/connectors/cache-connector.mjs +1 -1
  213. package/esm/connectors/cache-connector.mjs.map +1 -1
  214. package/esm/connectors/connectors-manager.d.mts +1 -1
  215. package/esm/connectors/connectors-manager.d.mts.map +1 -1
  216. package/esm/connectors/connectors-manager.mjs +1 -1
  217. package/esm/connectors/connectors-manager.mjs.map +1 -1
  218. package/esm/connectors/database-connector.d.mts +1 -1
  219. package/esm/connectors/database-connector.d.mts.map +1 -1
  220. package/esm/connectors/database-connector.mjs +1 -1
  221. package/esm/connectors/database-connector.mjs.map +1 -1
  222. package/esm/connectors/describe-server-address.mjs +108 -8
  223. package/esm/connectors/describe-server-address.mjs.map +1 -1
  224. package/esm/connectors/herald-connector.d.mts +1 -1
  225. package/esm/connectors/herald-connector.d.mts.map +1 -1
  226. package/esm/connectors/herald-connector.mjs +1 -1
  227. package/esm/connectors/herald-connector.mjs.map +1 -1
  228. package/esm/connectors/http-connector.d.mts +19 -1
  229. package/esm/connectors/http-connector.d.mts.map +1 -1
  230. package/esm/connectors/http-connector.mjs +42 -5
  231. package/esm/connectors/http-connector.mjs.map +1 -1
  232. package/esm/connectors/logger-connector.d.mts +1 -1
  233. package/esm/connectors/logger-connector.d.mts.map +1 -1
  234. package/esm/connectors/logger-connector.mjs +1 -1
  235. package/esm/connectors/logger-connector.mjs.map +1 -1
  236. package/esm/connectors/mail-connector.d.mts +1 -1
  237. package/esm/connectors/mail-connector.d.mts.map +1 -1
  238. package/esm/connectors/mail-connector.mjs +1 -1
  239. package/esm/connectors/mail-connector.mjs.map +1 -1
  240. package/esm/connectors/notifications-connector.d.mts +1 -1
  241. package/esm/connectors/notifications-connector.d.mts.map +1 -1
  242. package/esm/connectors/notifications-connector.mjs +1 -1
  243. package/esm/connectors/notifications-connector.mjs.map +1 -1
  244. package/esm/connectors/register-configured-connectors.d.mts +1 -1
  245. package/esm/connectors/register-configured-connectors.d.mts.map +1 -1
  246. package/esm/connectors/register-configured-connectors.mjs +1 -1
  247. package/esm/connectors/register-configured-connectors.mjs.map +1 -1
  248. package/esm/connectors/socket-connector.d.mts +1 -1
  249. package/esm/connectors/socket-connector.d.mts.map +1 -1
  250. package/esm/connectors/socket-connector.mjs +1 -1
  251. package/esm/connectors/socket-connector.mjs.map +1 -1
  252. package/esm/connectors/storage.connector.d.mts +1 -1
  253. package/esm/connectors/storage.connector.d.mts.map +1 -1
  254. package/esm/connectors/storage.connector.mjs +1 -1
  255. package/esm/connectors/storage.connector.mjs.map +1 -1
  256. package/esm/connectors/types.d.mts +1 -1
  257. package/esm/connectors/types.d.mts.map +1 -1
  258. package/esm/connectors/types.mjs +1 -1
  259. package/esm/connectors/types.mjs.map +1 -1
  260. package/esm/container/index.d.mts +1 -1
  261. package/esm/container/index.d.mts.map +1 -1
  262. package/esm/container/index.mjs +1 -1
  263. package/esm/container/index.mjs.map +1 -1
  264. package/esm/database/create-database-action.mjs +1 -1
  265. package/esm/database/create-database-action.mjs.map +1 -1
  266. package/esm/database/drop-tables-action.mjs +1 -1
  267. package/esm/database/drop-tables-action.mjs.map +1 -1
  268. package/esm/database/migrate-action.mjs +1 -1
  269. package/esm/database/migrate-action.mjs.map +1 -1
  270. package/esm/database/models/database-log/database-log.d.mts +1 -1
  271. package/esm/database/models/database-log/database-log.d.mts.map +1 -1
  272. package/esm/database/models/database-log/database-log.mjs +1 -1
  273. package/esm/database/models/database-log/database-log.mjs.map +1 -1
  274. package/esm/database/pending-exit-code.mjs +1 -1
  275. package/esm/database/pending-exit-code.mjs.map +1 -1
  276. package/esm/database/resolve-pending-migrations.mjs +1 -1
  277. package/esm/database/resolve-pending-migrations.mjs.map +1 -1
  278. package/esm/database/seed-command-action.mjs +1 -1
  279. package/esm/database/seed-command-action.mjs.map +1 -1
  280. package/esm/database/seeds/seed-records-table-migration.mjs +2 -2
  281. package/esm/database/seeds/seed-records-table-migration.mjs.map +1 -1
  282. package/esm/database/seeds/seeder.d.mts +1 -1
  283. package/esm/database/seeds/seeder.d.mts.map +1 -1
  284. package/esm/database/seeds/seeder.errors.d.mts +1 -1
  285. package/esm/database/seeds/seeder.errors.d.mts.map +1 -1
  286. package/esm/database/seeds/seeder.errors.mjs +1 -1
  287. package/esm/database/seeds/seeder.errors.mjs.map +1 -1
  288. package/esm/database/seeds/seeder.mjs +1 -1
  289. package/esm/database/seeds/seeder.mjs.map +1 -1
  290. package/esm/database/seeds/seeders.manager.mjs +1 -1
  291. package/esm/database/seeds/seeders.manager.mjs.map +1 -1
  292. package/esm/database/seeds/seeds-table-migration.mjs +2 -2
  293. package/esm/database/seeds/seeds-table-migration.mjs.map +1 -1
  294. package/esm/database/seeds/types.d.mts +1 -1
  295. package/esm/database/seeds/types.d.mts.map +1 -1
  296. package/esm/database/seeds/utils.mjs +1 -1
  297. package/esm/database/seeds/utils.mjs.map +1 -1
  298. package/esm/database/utils.d.mts +1 -1
  299. package/esm/database/utils.d.mts.map +1 -1
  300. package/esm/database/utils.mjs +1 -1
  301. package/esm/database/utils.mjs.map +1 -1
  302. package/esm/dev-server/check-for-updates.mjs +1 -1
  303. package/esm/dev-server/check-for-updates.mjs.map +1 -1
  304. package/esm/dev-server/create-worker.mjs +1 -1
  305. package/esm/dev-server/create-worker.mjs.map +1 -1
  306. package/esm/dev-server/dependency-graph.d.mts +1 -1
  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-logger.mjs +2 -5
  311. package/esm/dev-server/dev-logger.mjs.map +1 -1
  312. package/esm/dev-server/development-server.mjs +4 -8
  313. package/esm/dev-server/development-server.mjs.map +1 -1
  314. package/esm/dev-server/events.mjs +1 -1
  315. package/esm/dev-server/events.mjs.map +1 -1
  316. package/esm/dev-server/file-event-handler.mjs +1 -1
  317. package/esm/dev-server/file-event-handler.mjs.map +1 -1
  318. package/esm/dev-server/file-manager.d.mts +1 -1
  319. package/esm/dev-server/file-manager.d.mts.map +1 -1
  320. package/esm/dev-server/file-manager.mjs +1 -1
  321. package/esm/dev-server/file-manager.mjs.map +1 -1
  322. package/esm/dev-server/file-operations.d.mts +1 -1
  323. package/esm/dev-server/file-operations.d.mts.map +1 -1
  324. package/esm/dev-server/file-operations.mjs +1 -1
  325. package/esm/dev-server/file-operations.mjs.map +1 -1
  326. package/esm/dev-server/files-orchestrator.mjs +1 -1
  327. package/esm/dev-server/files-orchestrator.mjs.map +1 -1
  328. package/esm/dev-server/files-watcher.mjs +1 -1
  329. package/esm/dev-server/files-watcher.mjs.map +1 -1
  330. package/esm/dev-server/flags.mjs +1 -1
  331. package/esm/dev-server/flags.mjs.map +1 -1
  332. package/esm/dev-server/health-checker/checkers/base-health-checker.mjs +1 -1
  333. package/esm/dev-server/health-checker/checkers/base-health-checker.mjs.map +1 -1
  334. package/esm/dev-server/health-checker/checkers/eslint-health-checker.mjs +1 -1
  335. package/esm/dev-server/health-checker/checkers/eslint-health-checker.mjs.map +1 -1
  336. package/esm/dev-server/health-checker/checkers/typescript-health-checker.mjs +1 -1
  337. package/esm/dev-server/health-checker/checkers/typescript-health-checker.mjs.map +1 -1
  338. package/esm/dev-server/health-checker/file-health-checker.contract.d.mts +1 -1
  339. package/esm/dev-server/health-checker/file-health-checker.contract.d.mts.map +1 -1
  340. package/esm/dev-server/health-checker/file-health-result.d.mts +1 -1
  341. package/esm/dev-server/health-checker/file-health-result.d.mts.map +1 -1
  342. package/esm/dev-server/health-checker/file-health-result.mjs +1 -1
  343. package/esm/dev-server/health-checker/file-health-result.mjs.map +1 -1
  344. package/esm/dev-server/health-checker/files-healthcare.manager.mjs +1 -1
  345. package/esm/dev-server/health-checker/files-healthcare.manager.mjs.map +1 -1
  346. package/esm/dev-server/health-checker/workers/eslint-health.worker.mjs +1 -1
  347. package/esm/dev-server/health-checker/workers/eslint-health.worker.mjs.map +1 -1
  348. package/esm/dev-server/health-checker/workers/ts-health.worker.mjs +1 -1
  349. package/esm/dev-server/health-checker/workers/ts-health.worker.mjs.map +1 -1
  350. package/esm/dev-server/layer-executor.mjs +11 -4
  351. package/esm/dev-server/layer-executor.mjs.map +1 -1
  352. package/esm/dev-server/loader/build-transpile-init.mjs +1 -1
  353. package/esm/dev-server/loader/build-transpile-init.mjs.map +1 -1
  354. package/esm/dev-server/loader/hook-thread.d.mts +1 -1
  355. package/esm/dev-server/loader/hook-thread.d.mts.map +1 -1
  356. package/esm/dev-server/loader/hook-thread.mjs +1 -1
  357. package/esm/dev-server/loader/hook-thread.mjs.map +1 -1
  358. package/esm/dev-server/loader/load-hook.d.mts +1 -1
  359. package/esm/dev-server/loader/load-hook.d.mts.map +1 -1
  360. package/esm/dev-server/loader/load-hook.mjs +1 -1
  361. package/esm/dev-server/loader/load-hook.mjs.map +1 -1
  362. package/esm/dev-server/loader/own-resolver.mjs +1 -1
  363. package/esm/dev-server/loader/own-resolver.mjs.map +1 -1
  364. package/esm/dev-server/loader/register-loader.mjs +1 -1
  365. package/esm/dev-server/loader/register-loader.mjs.map +1 -1
  366. package/esm/dev-server/loader/resolve-capture.mjs +1 -1
  367. package/esm/dev-server/loader/resolve-capture.mjs.map +1 -1
  368. package/esm/dev-server/loader/resolve-hook.d.mts +1 -1
  369. package/esm/dev-server/loader/resolve-hook.d.mts.map +1 -1
  370. package/esm/dev-server/loader/resolve-hook.mjs +1 -1
  371. package/esm/dev-server/loader/resolve-hook.mjs.map +1 -1
  372. package/esm/dev-server/loader/source-slug.mjs +1 -1
  373. package/esm/dev-server/loader/source-slug.mjs.map +1 -1
  374. package/esm/dev-server/loader/transpile-cache.mjs +13 -4
  375. package/esm/dev-server/loader/transpile-cache.mjs.map +1 -1
  376. package/esm/dev-server/loader/version-registry.mjs +1 -1
  377. package/esm/dev-server/loader/version-registry.mjs.map +1 -1
  378. package/esm/dev-server/manifest-manager.d.mts +1 -1
  379. package/esm/dev-server/manifest-manager.d.mts.map +1 -1
  380. package/esm/dev-server/manifest-manager.mjs +1 -1
  381. package/esm/dev-server/manifest-manager.mjs.map +1 -1
  382. package/esm/dev-server/module-loader.mjs +2 -2
  383. package/esm/dev-server/module-loader.mjs.map +1 -1
  384. package/esm/dev-server/package-json-manager.mjs +1 -1
  385. package/esm/dev-server/package-json-manager.mjs.map +1 -1
  386. package/esm/dev-server/parse-imports.mjs +1 -1
  387. package/esm/dev-server/parse-imports.mjs.map +1 -1
  388. package/esm/dev-server/read-config-ast.mjs +1 -1
  389. package/esm/dev-server/read-config-ast.mjs.map +1 -1
  390. package/esm/dev-server/ready-block.mjs +62 -0
  391. package/esm/dev-server/ready-block.mjs.map +1 -0
  392. package/esm/dev-server/register-dev-shortcuts.mjs +1 -1
  393. package/esm/dev-server/register-dev-shortcuts.mjs.map +1 -1
  394. package/esm/dev-server/restart-dev-server.mjs +1 -1
  395. package/esm/dev-server/restart-dev-server.mjs.map +1 -1
  396. package/esm/dev-server/run-typings-generation.mjs +1 -1
  397. package/esm/dev-server/run-typings-generation.mjs.map +1 -1
  398. package/esm/dev-server/shortcuts.mjs +1 -1
  399. package/esm/dev-server/shortcuts.mjs.map +1 -1
  400. package/esm/dev-server/special-files-collector.d.mts +1 -1
  401. package/esm/dev-server/special-files-collector.d.mts.map +1 -1
  402. package/esm/dev-server/special-files-collector.mjs +1 -1
  403. package/esm/dev-server/special-files-collector.mjs.map +1 -1
  404. package/esm/dev-server/start-development-server.mjs +1 -1
  405. package/esm/dev-server/start-development-server.mjs.map +1 -1
  406. package/esm/dev-server/supervisor.mjs +10 -7
  407. package/esm/dev-server/supervisor.mjs.map +1 -1
  408. package/esm/dev-server/tsconfig-manager.mjs +1 -1
  409. package/esm/dev-server/tsconfig-manager.mjs.map +1 -1
  410. package/esm/dev-server/type-generator.mjs +1 -1
  411. package/esm/dev-server/type-generator.mjs.map +1 -1
  412. package/esm/dev-server/types.d.mts +1 -1
  413. package/esm/dev-server/types.d.mts.map +1 -1
  414. package/esm/dev-server/update-check-cache.mjs +1 -1
  415. package/esm/dev-server/update-check-cache.mjs.map +1 -1
  416. package/esm/dev-server/utils.mjs +1 -1
  417. package/esm/dev-server/utils.mjs.map +1 -1
  418. package/esm/encryption/encrypt.d.mts +1 -1
  419. package/esm/encryption/encrypt.d.mts.map +1 -1
  420. package/esm/encryption/encrypt.mjs +1 -1
  421. package/esm/encryption/encrypt.mjs.map +1 -1
  422. package/esm/encryption/hash.d.mts +1 -1
  423. package/esm/encryption/hash.d.mts.map +1 -1
  424. package/esm/encryption/hash.mjs +1 -1
  425. package/esm/encryption/hash.mjs.map +1 -1
  426. package/esm/encryption/password.d.mts +1 -1
  427. package/esm/encryption/password.d.mts.map +1 -1
  428. package/esm/encryption/password.mjs +1 -1
  429. package/esm/encryption/password.mjs.map +1 -1
  430. package/esm/encryption/types.d.mts +1 -1
  431. package/esm/encryption/types.d.mts.map +1 -1
  432. package/esm/generations/add-command.action.mjs +12 -578
  433. package/esm/generations/add-command.action.mjs.map +1 -1
  434. package/esm/generations/features/access.feature.mjs +77 -0
  435. package/esm/generations/features/access.feature.mjs.map +1 -0
  436. package/esm/generations/features/ai-anthropic.feature.mjs +12 -0
  437. package/esm/generations/features/ai-anthropic.feature.mjs.map +1 -0
  438. package/esm/generations/features/ai-bedrock.feature.mjs +12 -0
  439. package/esm/generations/features/ai-bedrock.feature.mjs.map +1 -0
  440. package/esm/generations/features/ai-google.feature.mjs +12 -0
  441. package/esm/generations/features/ai-google.feature.mjs.map +1 -0
  442. package/esm/generations/features/ai-ollama.feature.mjs +12 -0
  443. package/esm/generations/features/ai-ollama.feature.mjs.map +1 -0
  444. package/esm/generations/features/ai-openai.feature.mjs +12 -0
  445. package/esm/generations/features/ai-openai.feature.mjs.map +1 -0
  446. package/esm/generations/features/ai-panoptic.feature.mjs +14 -0
  447. package/esm/generations/features/ai-panoptic.feature.mjs.map +1 -0
  448. package/esm/generations/features/ai-tools.feature.mjs +14 -0
  449. package/esm/generations/features/ai-tools.feature.mjs.map +1 -0
  450. package/esm/generations/features/ai-workspace.feature.mjs +14 -0
  451. package/esm/generations/features/ai-workspace.feature.mjs.map +1 -0
  452. package/esm/generations/features/ai.feature.mjs +16 -0
  453. package/esm/generations/features/ai.feature.mjs.map +1 -0
  454. package/esm/generations/features/herald.feature.mjs +20 -0
  455. package/esm/generations/features/herald.feature.mjs.map +1 -0
  456. package/esm/generations/features/image.feature.mjs +9 -0
  457. package/esm/generations/features/image.feature.mjs.map +1 -0
  458. package/esm/generations/features/index.mjs +72 -0
  459. package/esm/generations/features/index.mjs.map +1 -0
  460. package/esm/generations/features/mail.feature.mjs +10 -0
  461. package/esm/generations/features/mail.feature.mjs.map +1 -0
  462. package/esm/generations/features/mongodb.feature.mjs +9 -0
  463. package/esm/generations/features/mongodb.feature.mjs.map +1 -0
  464. package/esm/generations/features/mysql.feature.mjs +9 -0
  465. package/esm/generations/features/mysql.feature.mjs.map +1 -0
  466. package/esm/generations/features/notifications.feature.mjs +44 -0
  467. package/esm/generations/features/notifications.feature.mjs.map +1 -0
  468. package/esm/generations/features/postgres.feature.mjs +9 -0
  469. package/esm/generations/features/postgres.feature.mjs.map +1 -0
  470. package/esm/generations/features/react-email.feature.mjs +70 -0
  471. package/esm/generations/features/react-email.feature.mjs.map +1 -0
  472. package/esm/generations/features/react.feature.mjs +16 -0
  473. package/esm/generations/features/react.feature.mjs.map +1 -0
  474. package/esm/generations/features/redis.feature.mjs +9 -0
  475. package/esm/generations/features/redis.feature.mjs.map +1 -0
  476. package/esm/generations/features/s3.feature.mjs +13 -0
  477. package/esm/generations/features/s3.feature.mjs.map +1 -0
  478. package/esm/generations/features/scheduler.feature.mjs +11 -0
  479. package/esm/generations/features/scheduler.feature.mjs.map +1 -0
  480. package/esm/generations/features/ses.feature.mjs +9 -0
  481. package/esm/generations/features/ses.feature.mjs.map +1 -0
  482. package/esm/generations/features/shadcn.feature.mjs +397 -0
  483. package/esm/generations/features/shadcn.feature.mjs.map +1 -0
  484. package/esm/generations/features/shared/link-ai-package-import.mjs +37 -0
  485. package/esm/generations/features/shared/link-ai-package-import.mjs.map +1 -0
  486. package/esm/generations/features/shared/migration-timestamp.mjs +17 -0
  487. package/esm/generations/features/shared/migration-timestamp.mjs.map +1 -0
  488. package/esm/generations/features/socket.feature.mjs +15 -0
  489. package/esm/generations/features/socket.feature.mjs.map +1 -0
  490. package/esm/generations/features/tailwind.feature.mjs +174 -0
  491. package/esm/generations/features/tailwind.feature.mjs.map +1 -0
  492. package/esm/generations/features/test.feature.mjs +96 -0
  493. package/esm/generations/features/test.feature.mjs.map +1 -0
  494. package/esm/generations/features/types.mjs +14 -0
  495. package/esm/generations/features/types.mjs.map +1 -0
  496. package/esm/generations/features/web.feature.mjs +187 -0
  497. package/esm/generations/features/web.feature.mjs.map +1 -0
  498. package/esm/generations/stubs.mjs +238 -10
  499. package/esm/generations/stubs.mjs.map +1 -1
  500. package/esm/http/boot-port-preflight.d.mts +46 -0
  501. package/esm/http/boot-port-preflight.d.mts.map +1 -0
  502. package/esm/http/boot-port-preflight.mjs +87 -0
  503. package/esm/http/boot-port-preflight.mjs.map +1 -0
  504. package/esm/http/build-cors-options.mjs +1 -1
  505. package/esm/http/build-cors-options.mjs.map +1 -1
  506. package/esm/http/config.d.mts +1 -1
  507. package/esm/http/config.d.mts.map +1 -1
  508. package/esm/http/config.mjs +1 -1
  509. package/esm/http/config.mjs.map +1 -1
  510. package/esm/http/context/request-context.d.mts +1 -1
  511. package/esm/http/context/request-context.d.mts.map +1 -1
  512. package/esm/http/context/request-context.mjs +1 -1
  513. package/esm/http/context/request-context.mjs.map +1 -1
  514. package/esm/http/context/request-memo.d.mts +1 -1
  515. package/esm/http/context/request-memo.d.mts.map +1 -1
  516. package/esm/http/context/request-memo.mjs +1 -1
  517. package/esm/http/context/request-memo.mjs.map +1 -1
  518. package/esm/http/createHttpApplication.d.mts +1 -1
  519. package/esm/http/createHttpApplication.d.mts.map +1 -1
  520. package/esm/http/createHttpApplication.mjs +1 -1
  521. package/esm/http/createHttpApplication.mjs.map +1 -1
  522. package/esm/http/database/RequestLog.d.mts +1 -1
  523. package/esm/http/database/RequestLog.d.mts.map +1 -1
  524. package/esm/http/database/RequestLog.mjs +1 -1
  525. package/esm/http/database/RequestLog.mjs.map +1 -1
  526. package/esm/http/error-codes.d.mts +1 -1
  527. package/esm/http/error-codes.d.mts.map +1 -1
  528. package/esm/http/error-codes.mjs +1 -1
  529. package/esm/http/error-codes.mjs.map +1 -1
  530. package/esm/http/errors/errors.d.mts +1 -1
  531. package/esm/http/errors/errors.d.mts.map +1 -1
  532. package/esm/http/errors/errors.mjs +1 -1
  533. package/esm/http/errors/errors.mjs.map +1 -1
  534. package/esm/http/events.d.mts +1 -1
  535. package/esm/http/events.d.mts.map +1 -1
  536. package/esm/http/events.mjs +1 -1
  537. package/esm/http/events.mjs.map +1 -1
  538. package/esm/http/health.d.mts +1 -1
  539. package/esm/http/health.d.mts.map +1 -1
  540. package/esm/http/health.mjs +1 -1
  541. package/esm/http/health.mjs.map +1 -1
  542. package/esm/http/index.d.mts +2 -0
  543. package/esm/http/index.mjs +2 -0
  544. package/esm/http/middleware/cache-response-middleware.d.mts +1 -1
  545. package/esm/http/middleware/cache-response-middleware.d.mts.map +1 -1
  546. package/esm/http/middleware/cache-response-middleware.mjs +1 -1
  547. package/esm/http/middleware/cache-response-middleware.mjs.map +1 -1
  548. package/esm/http/middleware/concurrency-limit.middleware.d.mts +1 -1
  549. package/esm/http/middleware/concurrency-limit.middleware.d.mts.map +1 -1
  550. package/esm/http/middleware/concurrency-limit.middleware.mjs +1 -1
  551. package/esm/http/middleware/concurrency-limit.middleware.mjs.map +1 -1
  552. package/esm/http/middleware/idempotency.middleware.d.mts +1 -1
  553. package/esm/http/middleware/idempotency.middleware.d.mts.map +1 -1
  554. package/esm/http/middleware/idempotency.middleware.mjs +1 -1
  555. package/esm/http/middleware/idempotency.middleware.mjs.map +1 -1
  556. package/esm/http/middleware/inject-request-context.d.mts +1 -1
  557. package/esm/http/middleware/inject-request-context.d.mts.map +1 -1
  558. package/esm/http/middleware/inject-request-context.mjs +1 -1
  559. package/esm/http/middleware/inject-request-context.mjs.map +1 -1
  560. package/esm/http/middleware/ip-filter.middleware.d.mts +2 -2
  561. package/esm/http/middleware/ip-filter.middleware.d.mts.map +1 -1
  562. package/esm/http/middleware/ip-filter.middleware.mjs +2 -2
  563. package/esm/http/middleware/ip-filter.middleware.mjs.map +1 -1
  564. package/esm/http/middleware/maintenance.middleware.d.mts +1 -1
  565. package/esm/http/middleware/maintenance.middleware.d.mts.map +1 -1
  566. package/esm/http/middleware/maintenance.middleware.mjs +1 -1
  567. package/esm/http/middleware/maintenance.middleware.mjs.map +1 -1
  568. package/esm/http/middleware/max-body-size.middleware.d.mts +1 -1
  569. package/esm/http/middleware/max-body-size.middleware.d.mts.map +1 -1
  570. package/esm/http/middleware/max-body-size.middleware.mjs +1 -1
  571. package/esm/http/middleware/max-body-size.middleware.mjs.map +1 -1
  572. package/esm/http/middleware/middleware-list.d.mts +1 -1
  573. package/esm/http/middleware/middleware-list.d.mts.map +1 -1
  574. package/esm/http/middleware/middleware-list.mjs +1 -1
  575. package/esm/http/middleware/middleware-list.mjs.map +1 -1
  576. package/esm/http/middleware/rate-limit.middleware.d.mts +1 -1
  577. package/esm/http/middleware/rate-limit.middleware.d.mts.map +1 -1
  578. package/esm/http/middleware/rate-limit.middleware.mjs +1 -1
  579. package/esm/http/middleware/rate-limit.middleware.mjs.map +1 -1
  580. package/esm/http/middleware/utils/cidr-match.d.mts +1 -1
  581. package/esm/http/middleware/utils/cidr-match.d.mts.map +1 -1
  582. package/esm/http/middleware/utils/cidr-match.mjs +1 -1
  583. package/esm/http/middleware/utils/cidr-match.mjs.map +1 -1
  584. package/esm/http/middleware/utils/idempotency-key.d.mts +1 -1
  585. package/esm/http/middleware/utils/idempotency-key.d.mts.map +1 -1
  586. package/esm/http/middleware/utils/idempotency-key.mjs +1 -1
  587. package/esm/http/middleware/utils/idempotency-key.mjs.map +1 -1
  588. package/esm/http/middleware/utils/parse-size.d.mts +1 -1
  589. package/esm/http/middleware/utils/parse-size.d.mts.map +1 -1
  590. package/esm/http/middleware/utils/parse-size.mjs +1 -1
  591. package/esm/http/middleware/utils/parse-size.mjs.map +1 -1
  592. package/esm/http/plugins.d.mts +1 -1
  593. package/esm/http/plugins.d.mts.map +1 -1
  594. package/esm/http/plugins.mjs +1 -1
  595. package/esm/http/plugins.mjs.map +1 -1
  596. package/esm/http/port-preflight.d.mts +9 -1
  597. package/esm/http/port-preflight.d.mts.map +1 -1
  598. package/esm/http/port-preflight.mjs +9 -2
  599. package/esm/http/port-preflight.mjs.map +1 -1
  600. package/esm/http/ready-report.d.mts +56 -0
  601. package/esm/http/ready-report.d.mts.map +1 -0
  602. package/esm/http/ready-report.mjs +24 -0
  603. package/esm/http/ready-report.mjs.map +1 -0
  604. package/esm/http/request-controller.d.mts +1 -1
  605. package/esm/http/request-controller.d.mts.map +1 -1
  606. package/esm/http/request-controller.mjs +1 -1
  607. package/esm/http/request-controller.mjs.map +1 -1
  608. package/esm/http/request.d.mts +15 -3
  609. package/esm/http/request.d.mts.map +1 -1
  610. package/esm/http/request.mjs +17 -3
  611. package/esm/http/request.mjs.map +1 -1
  612. package/esm/http/response.d.mts +4 -4
  613. package/esm/http/response.d.mts.map +1 -1
  614. package/esm/http/response.mjs +1 -1
  615. package/esm/http/response.mjs.map +1 -1
  616. package/esm/http/server.d.mts +1 -1
  617. package/esm/http/server.d.mts.map +1 -1
  618. package/esm/http/server.mjs +27 -3
  619. package/esm/http/server.mjs.map +1 -1
  620. package/esm/http/types.d.mts +2 -4
  621. package/esm/http/types.d.mts.map +1 -1
  622. package/esm/http/uploaded-file.d.mts +1 -1
  623. package/esm/http/uploaded-file.d.mts.map +1 -1
  624. package/esm/http/uploaded-file.mjs +1 -1
  625. package/esm/http/uploaded-file.mjs.map +1 -1
  626. package/esm/http/uploads-config.d.mts +1 -1
  627. package/esm/http/uploads-config.d.mts.map +1 -1
  628. package/esm/http/uploads-config.mjs +1 -1
  629. package/esm/http/uploads-config.mjs.map +1 -1
  630. package/esm/http/uploads-types.d.mts +1 -1
  631. package/esm/http/uploads-types.d.mts.map +1 -1
  632. package/esm/image/image.d.mts +1 -1
  633. package/esm/image/image.d.mts.map +1 -1
  634. package/esm/image/image.mjs +1 -1
  635. package/esm/image/image.mjs.map +1 -1
  636. package/esm/index.d.mts +7 -1
  637. package/esm/index.mjs +7 -1
  638. package/esm/logger/fatal-visibility.d.mts +25 -0
  639. package/esm/logger/fatal-visibility.d.mts.map +1 -0
  640. package/esm/logger/fatal-visibility.mjs +31 -0
  641. package/esm/logger/fatal-visibility.mjs.map +1 -0
  642. package/esm/logger/index.d.mts +1 -0
  643. package/esm/logger/index.mjs +1 -0
  644. package/esm/logger/logger.d.mts +1 -1
  645. package/esm/logger/logger.d.mts.map +1 -1
  646. package/esm/logger/logger.mjs +1 -1
  647. package/esm/logger/logger.mjs.map +1 -1
  648. package/esm/logger/types.d.mts +1 -1
  649. package/esm/logger/types.d.mts.map +1 -1
  650. package/esm/mail/config.d.mts +1 -1
  651. package/esm/mail/config.d.mts.map +1 -1
  652. package/esm/mail/config.mjs +1 -1
  653. package/esm/mail/config.mjs.map +1 -1
  654. package/esm/mail/events.d.mts +1 -1
  655. package/esm/mail/events.d.mts.map +1 -1
  656. package/esm/mail/events.mjs +1 -1
  657. package/esm/mail/events.mjs.map +1 -1
  658. package/esm/mail/mail.d.mts +1 -1
  659. package/esm/mail/mail.d.mts.map +1 -1
  660. package/esm/mail/mail.mjs +1 -1
  661. package/esm/mail/mail.mjs.map +1 -1
  662. package/esm/mail/mailer-pool.d.mts +1 -1
  663. package/esm/mail/mailer-pool.d.mts.map +1 -1
  664. package/esm/mail/mailer-pool.mjs +3 -1
  665. package/esm/mail/mailer-pool.mjs.map +1 -1
  666. package/esm/mail/react-mail.d.mts +1 -1
  667. package/esm/mail/react-mail.d.mts.map +1 -1
  668. package/esm/mail/react-mail.mjs +1 -1
  669. package/esm/mail/react-mail.mjs.map +1 -1
  670. package/esm/mail/send-mail.d.mts +1 -1
  671. package/esm/mail/send-mail.d.mts.map +1 -1
  672. package/esm/mail/send-mail.mjs +1 -1
  673. package/esm/mail/send-mail.mjs.map +1 -1
  674. package/esm/mail/test-mailbox.d.mts +1 -1
  675. package/esm/mail/test-mailbox.d.mts.map +1 -1
  676. package/esm/mail/test-mailbox.mjs +1 -1
  677. package/esm/mail/test-mailbox.mjs.map +1 -1
  678. package/esm/mail/types.d.mts +1 -1
  679. package/esm/mail/types.d.mts.map +1 -1
  680. package/esm/mail/types.mjs +1 -1
  681. package/esm/mail/types.mjs.map +1 -1
  682. package/esm/manifest/manifest-manager.mjs +1 -1
  683. package/esm/manifest/manifest-manager.mjs.map +1 -1
  684. package/esm/production/assert-dist-ready-to-start.mjs +24 -0
  685. package/esm/production/assert-dist-ready-to-start.mjs.map +1 -0
  686. package/esm/production/assert-generated-imports.mjs +1 -1
  687. package/esm/production/assert-generated-imports.mjs.map +1 -1
  688. package/esm/production/build-app-production.mjs +1 -1
  689. package/esm/production/build-app-production.mjs.map +1 -1
  690. package/esm/production/build-contributions.mjs +1 -1
  691. package/esm/production/build-contributions.mjs.map +1 -1
  692. package/esm/production/dist-build-manifest.mjs +47 -0
  693. package/esm/production/dist-build-manifest.mjs.map +1 -0
  694. package/esm/production/esbuild-plugins.mjs +1 -1
  695. package/esm/production/esbuild-plugins.mjs.map +1 -1
  696. package/esm/production/production-builder.mjs +69 -14
  697. package/esm/production/production-builder.mjs.map +1 -1
  698. package/esm/production/production-supervisor.mjs +22 -10
  699. package/esm/production/production-supervisor.mjs.map +1 -1
  700. package/esm/production/promote-dist.mjs +115 -0
  701. package/esm/production/promote-dist.mjs.map +1 -0
  702. package/esm/production/resolve-build-config.d.mts +1 -1
  703. package/esm/production/resolve-build-config.d.mts.map +1 -1
  704. package/esm/production/resolve-build-config.mjs +1 -1
  705. package/esm/production/resolve-build-config.mjs.map +1 -1
  706. package/esm/react/index.d.mts +1 -1
  707. package/esm/react/index.d.mts.map +1 -1
  708. package/esm/react/index.mjs +1 -1
  709. package/esm/react/index.mjs.map +1 -1
  710. package/esm/repositories/adapters/cascade/cascade-adapter.d.mts +1 -1
  711. package/esm/repositories/adapters/cascade/cascade-adapter.d.mts.map +1 -1
  712. package/esm/repositories/adapters/cascade/cascade-adapter.mjs +1 -1
  713. package/esm/repositories/adapters/cascade/cascade-adapter.mjs.map +1 -1
  714. package/esm/repositories/adapters/cascade/cascade-query-builder.d.mts +1 -1
  715. package/esm/repositories/adapters/cascade/cascade-query-builder.d.mts.map +1 -1
  716. package/esm/repositories/adapters/cascade/cascade-query-builder.mjs +1 -1
  717. package/esm/repositories/adapters/cascade/cascade-query-builder.mjs.map +1 -1
  718. package/esm/repositories/adapters/cascade/filter-applicator.mjs +1 -1
  719. package/esm/repositories/adapters/cascade/filter-applicator.mjs.map +1 -1
  720. package/esm/repositories/contracts/query-builder.contract.d.mts +1 -1
  721. package/esm/repositories/contracts/query-builder.contract.d.mts.map +1 -1
  722. package/esm/repositories/contracts/repository-adapter.contract.d.mts +1 -1
  723. package/esm/repositories/contracts/repository-adapter.contract.d.mts.map +1 -1
  724. package/esm/repositories/contracts/types.d.mts +1 -1
  725. package/esm/repositories/contracts/types.d.mts.map +1 -1
  726. package/esm/repositories/repository.manager.d.mts +1 -1
  727. package/esm/repositories/repository.manager.d.mts.map +1 -1
  728. package/esm/repositories/repository.manager.mjs +1 -1
  729. package/esm/repositories/repository.manager.mjs.map +1 -1
  730. package/esm/resource/define-resource.d.mts +1 -1
  731. package/esm/resource/define-resource.d.mts.map +1 -1
  732. package/esm/resource/define-resource.mjs +1 -1
  733. package/esm/resource/define-resource.mjs.map +1 -1
  734. package/esm/resource/register-resource.d.mts +1 -1
  735. package/esm/resource/register-resource.d.mts.map +1 -1
  736. package/esm/resource/register-resource.mjs +1 -1
  737. package/esm/resource/register-resource.mjs.map +1 -1
  738. package/esm/resource/resource-field-builder.d.mts +1 -1
  739. package/esm/resource/resource-field-builder.d.mts.map +1 -1
  740. package/esm/resource/resource-field-builder.mjs +1 -1
  741. package/esm/resource/resource-field-builder.mjs.map +1 -1
  742. package/esm/resource/resource.d.mts +1 -1
  743. package/esm/resource/resource.d.mts.map +1 -1
  744. package/esm/resource/resource.mjs +1 -1
  745. package/esm/resource/resource.mjs.map +1 -1
  746. package/esm/resource/types.d.mts +1 -1
  747. package/esm/resource/types.d.mts.map +1 -1
  748. package/esm/restful/restful.d.mts +1 -1
  749. package/esm/restful/restful.d.mts.map +1 -1
  750. package/esm/restful/restful.mjs +1 -1
  751. package/esm/restful/restful.mjs.map +1 -1
  752. package/esm/router/describe-route-for-log.mjs +1 -1
  753. package/esm/router/describe-route-for-log.mjs.map +1 -1
  754. package/esm/router/index.d.mts +3 -0
  755. package/esm/router/index.mjs +3 -0
  756. package/esm/router/log-request-lifecycle.mjs +1 -1
  757. package/esm/router/log-request-lifecycle.mjs.map +1 -1
  758. package/esm/router/normalize-request-path.d.mts +14 -0
  759. package/esm/router/normalize-request-path.d.mts.map +1 -0
  760. package/esm/router/normalize-request-path.mjs +18 -0
  761. package/esm/router/normalize-request-path.mjs.map +1 -0
  762. package/esm/router/normalize-route-path.d.mts +28 -0
  763. package/esm/router/normalize-route-path.d.mts.map +1 -0
  764. package/esm/router/normalize-route-path.mjs +33 -0
  765. package/esm/router/normalize-route-path.mjs.map +1 -0
  766. package/esm/router/positional-handler-diagnostics.d.mts +1 -1
  767. package/esm/router/positional-handler-diagnostics.d.mts.map +1 -1
  768. package/esm/router/positional-handler-diagnostics.mjs +1 -1
  769. package/esm/router/positional-handler-diagnostics.mjs.map +1 -1
  770. package/esm/router/route-builder.d.mts +1 -1
  771. package/esm/router/route-builder.d.mts.map +1 -1
  772. package/esm/router/route-builder.mjs +1 -1
  773. package/esm/router/route-builder.mjs.map +1 -1
  774. package/esm/router/route-name-method-suffix.d.mts +33 -0
  775. package/esm/router/route-name-method-suffix.d.mts.map +1 -0
  776. package/esm/router/route-name-method-suffix.mjs +39 -0
  777. package/esm/router/route-name-method-suffix.mjs.map +1 -0
  778. package/esm/router/route-registry.d.mts +1 -1
  779. package/esm/router/route-registry.d.mts.map +1 -1
  780. package/esm/router/route-registry.mjs +4 -3
  781. package/esm/router/route-registry.mjs.map +1 -1
  782. package/esm/router/router.d.mts +15 -1
  783. package/esm/router/router.d.mts.map +1 -1
  784. package/esm/router/router.mjs +51 -12
  785. package/esm/router/router.mjs.map +1 -1
  786. package/esm/router/types.d.mts +1 -1
  787. package/esm/router/types.d.mts.map +1 -1
  788. package/esm/socket/types.d.mts +1 -1
  789. package/esm/socket/types.d.mts.map +1 -1
  790. package/esm/socket/utils.d.mts +1 -1
  791. package/esm/socket/utils.d.mts.map +1 -1
  792. package/esm/socket/utils.mjs +1 -1
  793. package/esm/socket/utils.mjs.map +1 -1
  794. package/esm/storage/config.d.mts +1 -1
  795. package/esm/storage/config.d.mts.map +1 -1
  796. package/esm/storage/config.mjs +1 -1
  797. package/esm/storage/config.mjs.map +1 -1
  798. package/esm/storage/context/storage-driver-context.d.mts +1 -1
  799. package/esm/storage/context/storage-driver-context.d.mts.map +1 -1
  800. package/esm/storage/context/storage-driver-context.mjs +1 -1
  801. package/esm/storage/context/storage-driver-context.mjs.map +1 -1
  802. package/esm/storage/drivers/cloud-driver.d.mts +1 -1
  803. package/esm/storage/drivers/cloud-driver.d.mts.map +1 -1
  804. package/esm/storage/drivers/cloud-driver.mjs +1 -1
  805. package/esm/storage/drivers/cloud-driver.mjs.map +1 -1
  806. package/esm/storage/drivers/do-spaces-driver.d.mts +1 -1
  807. package/esm/storage/drivers/do-spaces-driver.d.mts.map +1 -1
  808. package/esm/storage/drivers/do-spaces-driver.mjs +1 -1
  809. package/esm/storage/drivers/do-spaces-driver.mjs.map +1 -1
  810. package/esm/storage/drivers/local-driver.d.mts +1 -1
  811. package/esm/storage/drivers/local-driver.d.mts.map +1 -1
  812. package/esm/storage/drivers/local-driver.mjs +1 -1
  813. package/esm/storage/drivers/local-driver.mjs.map +1 -1
  814. package/esm/storage/drivers/r2-driver.d.mts +1 -1
  815. package/esm/storage/drivers/r2-driver.d.mts.map +1 -1
  816. package/esm/storage/drivers/r2-driver.mjs +1 -1
  817. package/esm/storage/drivers/r2-driver.mjs.map +1 -1
  818. package/esm/storage/drivers/s3-driver.d.mts +1 -1
  819. package/esm/storage/drivers/s3-driver.d.mts.map +1 -1
  820. package/esm/storage/drivers/s3-driver.mjs +1 -1
  821. package/esm/storage/drivers/s3-driver.mjs.map +1 -1
  822. package/esm/storage/scoped-storage.d.mts +1 -1
  823. package/esm/storage/scoped-storage.d.mts.map +1 -1
  824. package/esm/storage/scoped-storage.mjs +1 -1
  825. package/esm/storage/scoped-storage.mjs.map +1 -1
  826. package/esm/storage/storage-file.d.mts +1 -1
  827. package/esm/storage/storage-file.d.mts.map +1 -1
  828. package/esm/storage/storage-file.mjs +1 -1
  829. package/esm/storage/storage-file.mjs.map +1 -1
  830. package/esm/storage/storage.d.mts +1 -1
  831. package/esm/storage/storage.d.mts.map +1 -1
  832. package/esm/storage/storage.mjs +1 -1
  833. package/esm/storage/storage.mjs.map +1 -1
  834. package/esm/storage/types.d.mts +15 -1
  835. package/esm/storage/types.d.mts.map +1 -1
  836. package/esm/storage/utils/contain-path.d.mts +1 -1
  837. package/esm/storage/utils/contain-path.d.mts.map +1 -1
  838. package/esm/storage/utils/contain-path.mjs +1 -1
  839. package/esm/storage/utils/contain-path.mjs.map +1 -1
  840. package/esm/storage/utils/mime.d.mts +1 -1
  841. package/esm/storage/utils/mime.d.mts.map +1 -1
  842. package/esm/storage/utils/mime.mjs +1 -1
  843. package/esm/storage/utils/mime.mjs.map +1 -1
  844. package/esm/storage/utils/safe-fetch.d.mts +1 -1
  845. package/esm/storage/utils/safe-fetch.d.mts.map +1 -1
  846. package/esm/storage/utils/safe-fetch.mjs +1 -1
  847. package/esm/storage/utils/safe-fetch.mjs.map +1 -1
  848. package/esm/storage/utils/storage-error.d.mts +1 -1
  849. package/esm/storage/utils/storage-error.d.mts.map +1 -1
  850. package/esm/storage/utils/storage-error.mjs +1 -1
  851. package/esm/storage/utils/storage-error.mjs.map +1 -1
  852. package/esm/tests/start-http-development-server.d.mts +1 -1
  853. package/esm/tests/start-http-development-server.d.mts.map +1 -1
  854. package/esm/tests/start-http-development-server.mjs +3 -2
  855. package/esm/tests/start-http-development-server.mjs.map +1 -1
  856. package/esm/tests/test-connectors-selection.d.mts +1 -1
  857. package/esm/tests/test-connectors-selection.d.mts.map +1 -1
  858. package/esm/tests/test-connectors-selection.mjs +1 -1
  859. package/esm/tests/test-connectors-selection.mjs.map +1 -1
  860. package/esm/tests/test-helpers.d.mts +1 -1
  861. package/esm/tests/test-helpers.d.mts.map +1 -1
  862. package/esm/tests/test-helpers.mjs +1 -1
  863. package/esm/tests/test-helpers.mjs.map +1 -1
  864. package/esm/tests/test-lifecycle-state.mjs +1 -1
  865. package/esm/tests/test-lifecycle-state.mjs.map +1 -1
  866. package/esm/tests/test-server-port-channel.mjs +1 -1
  867. package/esm/tests/test-server-port-channel.mjs.map +1 -1
  868. package/esm/tests/test-setup-timeout.mjs +1 -1
  869. package/esm/tests/test-setup-timeout.mjs.map +1 -1
  870. package/esm/tests/vitest-setup.d.mts +1 -1
  871. package/esm/tests/vitest-setup.d.mts.map +1 -1
  872. package/esm/tests/vitest-setup.mjs +1 -1
  873. package/esm/tests/vitest-setup.mjs.map +1 -1
  874. package/esm/updater/package-manager.mjs +1 -1
  875. package/esm/updater/package-manager.mjs.map +1 -1
  876. package/esm/updater/update-warlock-packages.mjs +1 -1
  877. package/esm/updater/update-warlock-packages.mjs.map +1 -1
  878. package/esm/use-cases/types.d.mts +1 -1
  879. package/esm/use-cases/types.d.mts.map +1 -1
  880. package/esm/use-cases/use-case-broadcast.d.mts +1 -1
  881. package/esm/use-cases/use-case-broadcast.d.mts.map +1 -1
  882. package/esm/use-cases/use-case-broadcast.mjs +1 -1
  883. package/esm/use-cases/use-case-broadcast.mjs.map +1 -1
  884. package/esm/use-cases/use-case-events.d.mts +1 -1
  885. package/esm/use-cases/use-case-events.d.mts.map +1 -1
  886. package/esm/use-cases/use-case-events.mjs +1 -1
  887. package/esm/use-cases/use-case-events.mjs.map +1 -1
  888. package/esm/use-cases/use-case-pipeline.d.mts +1 -1
  889. package/esm/use-cases/use-case-pipeline.d.mts.map +1 -1
  890. package/esm/use-cases/use-case-pipeline.mjs +1 -1
  891. package/esm/use-cases/use-case-pipeline.mjs.map +1 -1
  892. package/esm/use-cases/use-case.d.mts +1 -1
  893. package/esm/use-cases/use-case.d.mts.map +1 -1
  894. package/esm/use-cases/use-case.errors.d.mts +1 -1
  895. package/esm/use-cases/use-case.errors.d.mts.map +1 -1
  896. package/esm/use-cases/use-case.errors.mjs +1 -1
  897. package/esm/use-cases/use-case.errors.mjs.map +1 -1
  898. package/esm/use-cases/use-case.mjs +1 -1
  899. package/esm/use-cases/use-case.mjs.map +1 -1
  900. package/esm/use-cases/use-cases-registry.d.mts +1 -1
  901. package/esm/use-cases/use-cases-registry.d.mts.map +1 -1
  902. package/esm/use-cases/use-cases-registry.mjs +1 -1
  903. package/esm/use-cases/use-cases-registry.mjs.map +1 -1
  904. package/esm/utils/app-log.d.mts +1 -1
  905. package/esm/utils/app-log.d.mts.map +1 -1
  906. package/esm/utils/app-log.mjs +1 -1
  907. package/esm/utils/app-log.mjs.map +1 -1
  908. package/esm/utils/database-log.d.mts +1 -1
  909. package/esm/utils/database-log.d.mts.map +1 -1
  910. package/esm/utils/database-log.mjs +1 -1
  911. package/esm/utils/database-log.mjs.map +1 -1
  912. package/esm/utils/environment.d.mts +1 -1
  913. package/esm/utils/environment.d.mts.map +1 -1
  914. package/esm/utils/environment.mjs +1 -1
  915. package/esm/utils/environment.mjs.map +1 -1
  916. package/esm/utils/framework-vesion.mjs +1 -1
  917. package/esm/utils/framework-vesion.mjs.map +1 -1
  918. package/esm/utils/get-localized.d.mts +1 -1
  919. package/esm/utils/get-localized.d.mts.map +1 -1
  920. package/esm/utils/get-localized.mjs +1 -1
  921. package/esm/utils/get-localized.mjs.map +1 -1
  922. package/esm/utils/load-environment.mjs +1 -1
  923. package/esm/utils/load-environment.mjs.map +1 -1
  924. package/esm/utils/normalized-path.d.mts +1 -1
  925. package/esm/utils/normalized-path.d.mts.map +1 -1
  926. package/esm/utils/normalized-path.mjs +1 -1
  927. package/esm/utils/normalized-path.mjs.map +1 -1
  928. package/esm/utils/npm-registry.d.mts +1 -1
  929. package/esm/utils/npm-registry.d.mts.map +1 -1
  930. package/esm/utils/npm-registry.mjs +1 -1
  931. package/esm/utils/npm-registry.mjs.map +1 -1
  932. package/esm/utils/paths.d.mts +1 -1
  933. package/esm/utils/paths.d.mts.map +1 -1
  934. package/esm/utils/paths.mjs +1 -1
  935. package/esm/utils/paths.mjs.map +1 -1
  936. package/esm/utils/promise-all-object.d.mts +1 -1
  937. package/esm/utils/promise-all-object.d.mts.map +1 -1
  938. package/esm/utils/promise-all-object.mjs +1 -1
  939. package/esm/utils/promise-all-object.mjs.map +1 -1
  940. package/esm/utils/queue.d.mts +1 -1
  941. package/esm/utils/queue.d.mts.map +1 -1
  942. package/esm/utils/queue.mjs +1 -1
  943. package/esm/utils/queue.mjs.map +1 -1
  944. package/esm/utils/sleep.d.mts +1 -1
  945. package/esm/utils/sleep.d.mts.map +1 -1
  946. package/esm/utils/sleep.mjs +1 -1
  947. package/esm/utils/sleep.mjs.map +1 -1
  948. package/esm/utils/sluggable.d.mts +1 -1
  949. package/esm/utils/sluggable.d.mts.map +1 -1
  950. package/esm/utils/sluggable.mjs +1 -1
  951. package/esm/utils/sluggable.mjs.map +1 -1
  952. package/esm/utils/to-json.d.mts +1 -1
  953. package/esm/utils/to-json.d.mts.map +1 -1
  954. package/esm/utils/to-json.mjs +1 -1
  955. package/esm/utils/to-json.mjs.map +1 -1
  956. package/esm/utils/types.d.mts +1 -1
  957. package/esm/utils/types.d.mts.map +1 -1
  958. package/esm/utils/urls.d.mts +1 -1
  959. package/esm/utils/urls.d.mts.map +1 -1
  960. package/esm/utils/urls.mjs +1 -1
  961. package/esm/utils/urls.mjs.map +1 -1
  962. package/esm/utils/version-compare.d.mts +1 -1
  963. package/esm/utils/version-compare.d.mts.map +1 -1
  964. package/esm/utils/version-compare.mjs +1 -1
  965. package/esm/utils/version-compare.mjs.map +1 -1
  966. package/esm/validation/database/exists-except-current-id.d.mts +1 -1
  967. package/esm/validation/database/exists-except-current-id.d.mts.map +1 -1
  968. package/esm/validation/database/exists-except-current-id.mjs +1 -1
  969. package/esm/validation/database/exists-except-current-id.mjs.map +1 -1
  970. package/esm/validation/database/exists-except-current-user.d.mts +1 -1
  971. package/esm/validation/database/exists-except-current-user.d.mts.map +1 -1
  972. package/esm/validation/database/exists-except-current-user.mjs +1 -1
  973. package/esm/validation/database/exists-except-current-user.mjs.map +1 -1
  974. package/esm/validation/database/types.d.mts +1 -1
  975. package/esm/validation/database/types.d.mts.map +1 -1
  976. package/esm/validation/database/unique-except-current-id.d.mts +1 -1
  977. package/esm/validation/database/unique-except-current-id.d.mts.map +1 -1
  978. package/esm/validation/database/unique-except-current-id.mjs +1 -1
  979. package/esm/validation/database/unique-except-current-id.mjs.map +1 -1
  980. package/esm/validation/database/unique-except-current-user.d.mts +1 -1
  981. package/esm/validation/database/unique-except-current-user.d.mts.map +1 -1
  982. package/esm/validation/database/unique-except-current-user.mjs +1 -1
  983. package/esm/validation/database/unique-except-current-user.mjs.map +1 -1
  984. package/esm/validation/file/file.d.mts +1 -1
  985. package/esm/validation/file/file.d.mts.map +1 -1
  986. package/esm/validation/file/file.mjs +1 -1
  987. package/esm/validation/file/file.mjs.map +1 -1
  988. package/esm/validation/init.mjs +1 -1
  989. package/esm/validation/init.mjs.map +1 -1
  990. package/esm/validation/plugins/database-plugin.mjs +1 -1
  991. package/esm/validation/plugins/database-plugin.mjs.map +1 -1
  992. package/esm/validation/plugins/file-plugin.mjs +1 -1
  993. package/esm/validation/plugins/file-plugin.mjs.map +1 -1
  994. package/esm/validation/plugins/localized-plugin.mjs +1 -1
  995. package/esm/validation/plugins/localized-plugin.mjs.map +1 -1
  996. package/esm/validation/types.d.mts +1 -1
  997. package/esm/validation/types.d.mts.map +1 -1
  998. package/esm/validation/validateAll.mjs +1 -1
  999. package/esm/validation/validateAll.mjs.map +1 -1
  1000. package/esm/validation/validators/file-validator.d.mts +1 -1
  1001. package/esm/validation/validators/file-validator.d.mts.map +1 -1
  1002. package/esm/validation/validators/file-validator.mjs +1 -1
  1003. package/esm/validation/validators/file-validator.mjs.map +1 -1
  1004. package/esm/vite/lower-stage3-decorators.d.mts +1 -1
  1005. package/esm/vite/lower-stage3-decorators.d.mts.map +1 -1
  1006. package/esm/vite/lower-stage3-decorators.mjs +1 -1
  1007. package/esm/vite/lower-stage3-decorators.mjs.map +1 -1
  1008. package/esm/warlock-config/default-configurations.mjs +1 -1
  1009. package/esm/warlock-config/default-configurations.mjs.map +1 -1
  1010. package/esm/warlock-config/define-config.d.mts +1 -1
  1011. package/esm/warlock-config/define-config.d.mts.map +1 -1
  1012. package/esm/warlock-config/define-config.mjs +1 -1
  1013. package/esm/warlock-config/define-config.mjs.map +1 -1
  1014. package/esm/warlock-config/normalize-build-config.mjs +1 -1
  1015. package/esm/warlock-config/normalize-build-config.mjs.map +1 -1
  1016. package/esm/warlock-config/types.d.mts +1 -1
  1017. package/esm/warlock-config/types.d.mts.map +1 -1
  1018. package/esm/warlock-config/warlock-config.manager.d.mts +1 -1
  1019. package/esm/warlock-config/warlock-config.manager.d.mts.map +1 -1
  1020. package/esm/warlock-config/warlock-config.manager.mjs +1 -1
  1021. package/esm/warlock-config/warlock-config.manager.mjs.map +1 -1
  1022. package/llms-full.txt +527 -91
  1023. package/llms.txt +7 -5
  1024. package/package.json +12 -12
  1025. package/skills/add-connector/SKILL.md +35 -28
  1026. package/skills/create-controller/SKILL.md +1 -1
  1027. package/skills/create-module/SKILL.md +12 -12
  1028. package/skills/hash-password/SKILL.md +4 -4
  1029. package/skills/run-app/SKILL.md +77 -16
  1030. package/skills/send-mail/SKILL.md +2 -2
  1031. package/skills/use-middleware/SKILL.md +13 -4
  1032. package/skills/use-model-transformers/SKILL.md +2 -2
  1033. package/skills/use-repository/SKILL.md +1 -1
  1034. package/skills/use-request-locals/SKILL.md +24 -1
  1035. package/skills/validate-input/SKILL.md +1 -1
  1036. package/skills/warlock-conventions/SKILL.md +6 -2
  1037. package/skills/warlock-doctor/SKILL.md +3 -3
  1038. package/skills/warlock-routes/SKILL.md +47 -9
  1039. package/skills/write-cli-command/SKILL.md +1 -1
  1040. package/skills/write-seeder/SKILL.md +8 -8
@@ -1 +1 @@
1
- {"version":3,"file":"health.check.mjs","names":[],"sources":["../../../../../../../../../../core/src/cli/commands/doctor/checks/health.check.ts"],"sourcesContent":["import { config } from \"../../../../config/config-getter\";\nimport type { DoctorCheck } from \"../check.types\";\n\n/**\n * Confirms the built-in liveness (`/health`) and readiness (`/ready`)\n * endpoints will be exposed. The HTTP connector registers them automatically\n * unless `http.health.enabled` is explicitly `false`, so this check reads that\n * config flag and the (overridable) paths.\n *\n * Disabling the probes is a deliberate, supported choice but a common\n * misconfiguration in container/orchestrated deployments, so it is surfaced as\n * a `warn` rather than a pass.\n *\n * Read-only: inspects `config.get(\"http.health\")` only.\n */\nexport const healthCheck: DoctorCheck = {\n name: \"health\",\n run: () => {\n const healthConfig = config.get(\"http.health\");\n\n if (healthConfig?.enabled === false) {\n return {\n name: \"health\",\n status: \"warn\",\n detail: \"health endpoints disabled (http.health.enabled = false)\",\n };\n }\n\n const livenessPath = healthConfig?.path ?? \"/health\";\n const readinessPath = healthConfig?.readinessPath ?? \"/ready\";\n\n return {\n name: \"health\",\n status: \"ok\",\n detail: `liveness ${livenessPath} + readiness ${readinessPath} registered`,\n };\n },\n};\n"],"mappings":";;;;;;;;;;;;;;;AAeA,MAAa,cAA2B;CACtC,MAAM;CACN,WAAW;EACT,MAAM,eAAe,OAAO,IAAI,aAAa;EAE7C,IAAI,cAAc,YAAY,OAC5B,OAAO;GACL,MAAM;GACN,QAAQ;GACR,QAAQ;EACV;EAMF,OAAO;GACL,MAAM;GACN,QAAQ;GACR,QAAQ,YANW,cAAc,QAAQ,UAMR,eALb,cAAc,iBAAiB,SAKW;EAChE;CACF;AACF"}
1
+ {"version":3,"file":"health.check.mjs","names":[],"sources":["C:/Work/Warlock.js/core/src/cli/commands/doctor/checks/health.check.ts"],"sourcesContent":["import { config } from \"../../../../config/config-getter\";\nimport { container } from \"../../../../container\";\nimport { router } from \"../../../../router/router\";\nimport type { DoctorCheck } from \"../check.types\";\n\n/**\n * Ask the booted Fastify instance whether a GET route exists at this path.\n *\n * `hasRoute` is the instance's own answer, not a re-derivation of the config\n * that was supposed to produce it — which is the entire point of asking it.\n * Guarded because it is the one part of this check that depends on a Fastify\n * API: if the instance cannot answer, the check says so instead of inventing a\n * verdict from the config flag it is meant to be verifying.\n */\nfunction fastifyHasGet(path: string): boolean | undefined {\n const http = container.has(\"http.server\") ? container.get<any>(\"http.server\") : undefined;\n\n if (!http || typeof http.hasRoute !== \"function\") return undefined;\n\n try {\n return Boolean(http.hasRoute({ method: \"GET\", url: path }));\n } catch {\n return undefined;\n }\n}\n\n/**\n * Whether an app route already claims this path. The HTTP connector puts the\n * probes on the Fastify instance directly and the router scans app routes onto\n * the same instance at `start()`, so a collision is a duplicate registration:\n * Fastify refuses it and the server does not start.\n */\nfunction appRouteClaims(path: string): boolean {\n return router.list().some((route) => {\n const method = String(route.method).toUpperCase();\n\n return route.path === path && (method === \"GET\" || method === \"ALL\");\n });\n}\n\n/**\n * Confirms the liveness (`/health`) and readiness (`/ready`) endpoints are\n * really there.\n *\n * NEEDS A BOOTED APP: the HTTP connector registers the probes during `boot()`,\n * which the boot pass runs. Previously this check read `http.health.enabled`\n * and reported the endpoints as \"registered\" on that basis alone — in the same\n * report where `routes` said zero, because nothing had been booted at all. It\n * was reporting an intention as a fact, and the two lines contradicted each\n * other in the owner's own run.\n *\n * Verdicts:\n * - no `http` config → not applicable, no line;\n * - `http.health.enabled = false` → `ok`. Turning the probes off is a supported\n * choice, and a warning that fires on a deliberate setting every single run\n * is not read by the time it matters;\n * - an app route already claims a probe's path → `fail`: Fastify will refuse\n * the duplicate and the server will not start;\n * - the instance says the route is absent → `fail`;\n * - otherwise `ok`, with the paths that are actually registered.\n */\nexport const healthCheck: DoctorCheck = {\n name: \"health\",\n run: (context) => {\n if (!config.get(\"http\")) {\n return undefined;\n }\n\n const healthConfig = config.get(\"http.health\");\n\n if (healthConfig?.enabled === false) {\n return {\n name: \"health\",\n status: \"ok\",\n detail: \"probes disabled by config (http.health.enabled = false)\",\n };\n }\n\n const livenessPath = healthConfig?.path ?? \"/health\";\n const readinessPath = healthConfig?.readinessPath ?? \"/ready\";\n\n const collisions = [livenessPath, readinessPath].filter(appRouteClaims);\n\n if (collisions.length > 0) {\n return {\n name: \"health\",\n status: \"fail\",\n detail:\n `an app route already claims ${collisions.join(\" and \")} — Fastify refuses the ` +\n \"duplicate registration and the server will not start. Move the app route, or \" +\n \"rename the probe via http.health.path / http.health.readinessPath\",\n };\n }\n\n // The HTTP connector is what registers the probes. If it did not boot, the\n // connectors check already says so with the reason — reporting the same\n // defect a second time here as a health failure would inflate one problem\n // into two.\n if (!context.connectors.booted.includes(\"http\")) {\n return undefined;\n }\n\n const registered = [livenessPath, readinessPath].map(fastifyHasGet);\n\n if (registered.some((answer) => answer === undefined)) {\n return {\n name: \"health\",\n status: \"warn\",\n detail:\n \"could not read the http server's route table — \" +\n `${livenessPath} + ${readinessPath} unverified`,\n };\n }\n\n const missing = [livenessPath, readinessPath].filter((_path, index) => !registered[index]);\n\n if (missing.length > 0) {\n return {\n name: \"health\",\n status: \"fail\",\n detail: `enabled in config but not registered on the http server: ${missing.join(\", \")}`,\n };\n }\n\n return {\n name: \"health\",\n status: \"ok\",\n detail: `liveness ${livenessPath} + readiness ${readinessPath} registered`,\n };\n },\n};\n"],"mappings":";;;;;;;;;;;;;;AAcA,SAAS,cAAc,MAAmC;CACxD,MAAM,OAAO,UAAU,IAAI,aAAa,IAAI,UAAU,IAAS,aAAa,IAAI;CAEhF,IAAI,CAAC,QAAQ,OAAO,KAAK,aAAa,YAAY,OAAO;CAEzD,IAAI;EACF,OAAO,QAAQ,KAAK,SAAS;GAAE,QAAQ;GAAO,KAAK;EAAK,CAAC,CAAC;CAC5D,QAAQ;EACN;CACF;AACF;;;;;;;AAQA,SAAS,eAAe,MAAuB;CAC7C,OAAO,OAAO,KAAK,EAAE,MAAM,UAAU;EACnC,MAAM,SAAS,OAAO,MAAM,MAAM,EAAE,YAAY;EAEhD,OAAO,MAAM,SAAS,SAAS,WAAW,SAAS,WAAW;CAChE,CAAC;AACH;;;;;;;;;;;;;;;;;;;;;;AAuBA,MAAa,cAA2B;CACtC,MAAM;CACN,MAAM,YAAY;EAChB,IAAI,CAAC,OAAO,IAAI,MAAM,GACpB;EAGF,MAAM,eAAe,OAAO,IAAI,aAAa;EAE7C,IAAI,cAAc,YAAY,OAC5B,OAAO;GACL,MAAM;GACN,QAAQ;GACR,QAAQ;EACV;EAGF,MAAM,eAAe,cAAc,QAAQ;EAC3C,MAAM,gBAAgB,cAAc,iBAAiB;EAErD,MAAM,aAAa,CAAC,cAAc,aAAa,EAAE,OAAO,cAAc;EAEtE,IAAI,WAAW,SAAS,GACtB,OAAO;GACL,MAAM;GACN,QAAQ;GACR,QACE,+BAA+B,WAAW,KAAK,OAAO,EAAE;EAG5D;EAOF,IAAI,CAAC,QAAQ,WAAW,OAAO,SAAS,MAAM,GAC5C;EAGF,MAAM,aAAa,CAAC,cAAc,aAAa,EAAE,IAAI,aAAa;EAElE,IAAI,WAAW,MAAM,WAAW,WAAW,MAAS,GAClD,OAAO;GACL,MAAM;GACN,QAAQ;GACR,QACE,kDACG,aAAa,KAAK,cAAc;EACvC;EAGF,MAAM,UAAU,CAAC,cAAc,aAAa,EAAE,QAAQ,OAAO,UAAU,CAAC,WAAW,MAAM;EAEzF,IAAI,QAAQ,SAAS,GACnB,OAAO;GACL,MAAM;GACN,QAAQ;GACR,QAAQ,4DAA4D,QAAQ,KAAK,IAAI;EACvF;EAGF,OAAO;GACL,MAAM;GACN,QAAQ;GACR,QAAQ,YAAY,aAAa,eAAe,cAAc;EAChE;CACF;AACF"}
@@ -6,11 +6,16 @@ import { optionalPeersCheck } from "./optional-peers.check.mjs";
6
6
  import { releaseHygieneCheck } from "./release-hygiene.check.mjs";
7
7
  import { routesCheck } from "./routes.check.mjs";
8
8
 
9
- //#region ../core/src/cli/commands/doctor/checks/index.ts
9
+ //#region core/src/cli/commands/doctor/checks/index.ts
10
10
  /**
11
11
  * The default, ordered set of checks `warlock doctor` runs. Ordering controls
12
12
  * the report layout: runtime-surface checks first (routes, handler signatures,
13
13
  * config, connectors, peers, health), release hygiene last.
14
+ *
15
+ * Every check is handed the same boot context, and any of them may return
16
+ * `undefined` to opt out of a project it does not apply to — so this list is
17
+ * the set of checks that COULD run, not the set of lines a given project will
18
+ * print.
14
19
  */
15
20
  const defaultDoctorChecks = [
16
21
  routesCheck,
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../../../../../../../../../core/src/cli/commands/doctor/checks/index.ts"],"sourcesContent":["import type { DoctorCheck } from \"../check.types\";\nimport { configCheck } from \"./config.check\";\nimport { connectorsCheck } from \"./connectors.check\";\nimport { handlerSignatureCheck } from \"./handler-signature.check\";\nimport { healthCheck } from \"./health.check\";\nimport { optionalPeersCheck } from \"./optional-peers.check\";\nimport { releaseHygieneCheck } from \"./release-hygiene.check\";\nimport { routesCheck } from \"./routes.check\";\n\n/**\n * The default, ordered set of checks `warlock doctor` runs. Ordering controls\n * the report layout: runtime-surface checks first (routes, handler signatures,\n * config, connectors, peers, health), release hygiene last.\n */\nexport const defaultDoctorChecks: DoctorCheck[] = [\n routesCheck,\n handlerSignatureCheck,\n configCheck,\n connectorsCheck,\n optionalPeersCheck,\n healthCheck,\n releaseHygieneCheck,\n];\n"],"mappings":";;;;;;;;;;;;;;AAcA,MAAa,sBAAqC;CAChD;CACA;CACA;CACA;CACA;CACA;CACA;AACF"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["C:/Work/Warlock.js/core/src/cli/commands/doctor/checks/index.ts"],"sourcesContent":["import type { DoctorCheck } from \"../check.types\";\nimport { configCheck } from \"./config.check\";\nimport { connectorsCheck } from \"./connectors.check\";\nimport { handlerSignatureCheck } from \"./handler-signature.check\";\nimport { healthCheck } from \"./health.check\";\nimport { optionalPeersCheck } from \"./optional-peers.check\";\nimport { releaseHygieneCheck } from \"./release-hygiene.check\";\nimport { routesCheck } from \"./routes.check\";\n\n/**\n * The default, ordered set of checks `warlock doctor` runs. Ordering controls\n * the report layout: runtime-surface checks first (routes, handler signatures,\n * config, connectors, peers, health), release hygiene last.\n *\n * Every check is handed the same boot context, and any of them may return\n * `undefined` to opt out of a project it does not apply to — so this list is\n * the set of checks that COULD run, not the set of lines a given project will\n * print.\n */\nexport const defaultDoctorChecks: DoctorCheck[] = [\n routesCheck,\n handlerSignatureCheck,\n configCheck,\n connectorsCheck,\n optionalPeersCheck,\n healthCheck,\n releaseHygieneCheck,\n];\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAmBA,MAAa,sBAAqC;CAChD;CACA;CACA;CACA;CACA;CACA;CACA;AACF"}
@@ -1,49 +1,7 @@
1
+ import { config } from "../../../../config/config-getter.mjs";
1
2
  import { createRequire } from "node:module";
2
3
 
3
- //#region ../core/src/cli/commands/doctor/checks/optional-peers.check.ts
4
- /**
5
- * The optional peers core knows how to use. Kept in sync with the install
6
- * targets in the `warlock add` feature registry (sharp, nodemailer, socket.io,
7
- * the AWS SDK family, redis, the Cascade DB drivers, …).
8
- */
9
- const OPTIONAL_PEERS = [
10
- {
11
- package: "sharp",
12
- feature: "image processing"
13
- },
14
- {
15
- package: "nodemailer",
16
- feature: "mail (SMTP) channel"
17
- },
18
- {
19
- package: "socket.io",
20
- feature: "realtime socket server"
21
- },
22
- {
23
- package: "@aws-sdk/client-s3",
24
- feature: "S3 cloud storage"
25
- },
26
- {
27
- package: "@aws-sdk/client-sesv2",
28
- feature: "Amazon SES mail channel"
29
- },
30
- {
31
- package: "redis",
32
- feature: "Redis cache driver"
33
- },
34
- {
35
- package: "mongodb",
36
- feature: "MongoDB database driver"
37
- },
38
- {
39
- package: "pg",
40
- feature: "Postgres database driver"
41
- },
42
- {
43
- package: "mysql2",
44
- feature: "MySQL database driver"
45
- }
46
- ];
4
+ //#region core/src/cli/commands/doctor/checks/optional-peers.check.ts
47
5
  /**
48
6
  * Resolve from the project's working directory, not from core's own
49
7
  * `node_modules`, so the probe reflects what the *consuming app* has installed.
@@ -62,25 +20,130 @@ function isInstalled(packageName) {
62
20
  }
63
21
  }
64
22
  /**
65
- * Detects which optional peer dependencies are installed and which are not,
66
- * reporting the features that are consequently unavailable. Missing peers are
67
- * a `warn` (the feature is simply off), never a `fail`.
23
+ * A non-empty string, or `undefined`. Config values arrive from `env(...)` and
24
+ * an unset variable yields `undefined` but a `.env` line with nothing after
25
+ * the `=` yields `""`, which is "not configured" just as much.
26
+ */
27
+ function text(value) {
28
+ return typeof value === "string" && value.trim().length > 0 ? value.trim() : void 0;
29
+ }
30
+ /**
31
+ * The database driver's package. `driver` is a closed union in cascade
32
+ * (`mongodb | postgres | mysql`), so an unrecognised value means the config is
33
+ * wrong in a way this check is not the right one to report.
34
+ */
35
+ function databasePeer() {
36
+ const driver = text(config.get("database.driver"));
37
+ const packageName = driver === "mongodb" ? "mongodb" : driver === "postgres" ? "pg" : driver === "mysql" ? "mysql2" : void 0;
38
+ return packageName ? {
39
+ package: packageName,
40
+ because: `database.driver = "${driver}"`
41
+ } : void 0;
42
+ }
43
+ /**
44
+ * The selected cache driver. Only the DEFAULT matters: `cache.drivers` is a
45
+ * menu the scaffold fills in for every driver the framework ships, and warning
46
+ * about a menu entry nobody selected is the false positive this whole check was
47
+ * rewritten to remove.
48
+ */
49
+ function cachePeer() {
50
+ const selected = text(config.get("cache.default"));
51
+ if (!selected || !/redis/i.test(selected)) return void 0;
52
+ return {
53
+ package: "redis",
54
+ because: `cache.default = "${selected}"`
55
+ };
56
+ }
57
+ /**
58
+ * The selected storage driver, read through its canonical `driver` field
59
+ * (`local` / `s3` / `r2` / `spaces`) rather than the key the app happened to
60
+ * name it, so a driver called "cdn" is still recognised as S3.
61
+ */
62
+ function storagePeer() {
63
+ const selected = text(config.get("storage.default"));
64
+ if (!selected) return void 0;
65
+ const driver = text(config.get(`storage.drivers.${selected}.driver`));
66
+ if (!driver || driver === "local") return void 0;
67
+ return {
68
+ package: "@aws-sdk/client-s3",
69
+ because: `storage.default = "${selected}" (driver "${driver}")`
70
+ };
71
+ }
72
+ /**
73
+ * The mail transport. A `mail` config with no host and no driver is the
74
+ * scaffold's placeholder — every field is an unset env var — so it asks for
75
+ * nothing and this stays quiet.
76
+ */
77
+ function mailPeer() {
78
+ if (text(config.get("mail.driver")) === "ses") return {
79
+ package: "@aws-sdk/client-sesv2",
80
+ because: `mail.driver = "ses"`
81
+ };
82
+ const host = text(config.get("mail.host"));
83
+ if (!host) return void 0;
84
+ return {
85
+ package: "nodemailer",
86
+ because: `mail.host = "${host}"`
87
+ };
88
+ }
89
+ /**
90
+ * Realtime sockets. The connector no-ops without a `socket` config, so the
91
+ * presence of that config is exactly the request for the peer.
92
+ */
93
+ function socketPeer() {
94
+ if (!config.get("socket")) return void 0;
95
+ return {
96
+ package: "socket.io",
97
+ because: "a socket config is present"
98
+ };
99
+ }
100
+ /**
101
+ * Every peer THIS project's configuration asks for.
102
+ */
103
+ function requiredPeers() {
104
+ return [
105
+ databasePeer(),
106
+ cachePeer(),
107
+ storagePeer(),
108
+ mailPeer(),
109
+ socketPeer()
110
+ ].filter((peer) => Boolean(peer));
111
+ }
112
+ /**
113
+ * Checks that every optional peer the project's own configuration selects is
114
+ * actually installed.
115
+ *
116
+ * NEEDS NO BOOTED APP — it reads config and resolves module paths. It runs after
117
+ * the boot pass only because config is loaded by then.
118
+ *
119
+ * WHAT THIS REPLACED, AND WHY: the previous version probed nine packages and
120
+ * warned about every one that was absent. Every one of them is an OPTIONAL
121
+ * peer — a fresh app installs none of them by design — so the check warned, at
122
+ * length, about the framework's own default state. "No MySQL driver installed"
123
+ * is not a diagnosis for someone who never wanted MySQL; it is noise that
124
+ * teaches the reader to skim past the line where a real finding will one day
125
+ * appear.
68
126
  *
69
- * Read-only: resolves module paths only; never imports or executes the peers.
127
+ * Inverted, it becomes a genuine one: a project whose config selects a driver
128
+ * whose package is missing is broken — it will throw the first time that
129
+ * feature is used — so a missing peer here is a `fail`, not a warning.
70
130
  */
71
131
  const optionalPeersCheck = {
72
132
  name: "optional-peers",
73
133
  run: () => {
74
- const missing = OPTIONAL_PEERS.filter((peer) => !isInstalled(peer.package));
75
- if (missing.length === 0) return {
134
+ const required = requiredPeers();
135
+ if (required.length === 0) return;
136
+ const missing = required.filter((peer) => !isInstalled(peer.package));
137
+ const status = missing.length > 0 ? "fail" : "ok";
138
+ if (missing.length > 0) return {
76
139
  name: "optional-peers",
77
- status: "ok",
78
- detail: `all ${OPTIONAL_PEERS.length} known optional peers installed`
140
+ status,
141
+ detail: `${missing.length} configured feature(s) have no driver installed:\n` + missing.map((peer) => ` - ${peer.package} required by ${peer.because}`).join("\n")
79
142
  };
80
143
  return {
81
144
  name: "optional-peers",
82
- status: "warn",
83
- detail: `not installed unavailable: ${missing.map((peer) => `${peer.package} (${peer.feature})`).join("; ")}`
145
+ status,
146
+ detail: `every configured driver is installed (${required.map((peer) => peer.package).join(", ")})`
84
147
  };
85
148
  }
86
149
  };
@@ -1 +1 @@
1
- {"version":3,"file":"optional-peers.check.mjs","names":[],"sources":["../../../../../../../../../../core/src/cli/commands/doctor/checks/optional-peers.check.ts"],"sourcesContent":["import { createRequire } from \"node:module\";\nimport type { DoctorCheck } from \"../check.types\";\n\n/**\n * A single optional peer dependency and the feature it unlocks. These are NOT\n * bundled by core each is loaded lazily by the connector/driver that needs\n * it, so a missing peer simply means that feature is unavailable (a `warn`),\n * never a failure.\n */\ntype OptionalPeer = {\n /** The npm package name to probe via `require.resolve`. */\n package: string;\n\n /** The framework feature this peer enables. */\n feature: string;\n};\n\n/**\n * The optional peers core knows how to use. Kept in sync with the install\n * targets in the `warlock add` feature registry (sharp, nodemailer, socket.io,\n * the AWS SDK family, redis, the Cascade DB drivers, …).\n */\nconst OPTIONAL_PEERS: OptionalPeer[] = [\n { package: \"sharp\", feature: \"image processing\" },\n { package: \"nodemailer\", feature: \"mail (SMTP) channel\" },\n { package: \"socket.io\", feature: \"realtime socket server\" },\n { package: \"@aws-sdk/client-s3\", feature: \"S3 cloud storage\" },\n { package: \"@aws-sdk/client-sesv2\", feature: \"Amazon SES mail channel\" },\n { package: \"redis\", feature: \"Redis cache driver\" },\n { package: \"mongodb\", feature: \"MongoDB database driver\" },\n { package: \"pg\", feature: \"Postgres database driver\" },\n { package: \"mysql2\", feature: \"MySQL database driver\" },\n];\n\n/**\n * Resolve from the project's working directory, not from core's own\n * `node_modules`, so the probe reflects what the *consuming app* has installed.\n */\nconst projectRequire = createRequire(`${process.cwd()}/package.json`);\n\n/**\n * Whether a package can be resolved from the project. A failed resolve (the\n * normal \"not installed\" case) is swallowed and reported as missing.\n */\nfunction isInstalled(packageName: string): boolean {\n try {\n projectRequire.resolve(packageName);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Detects which optional peer dependencies are installed and which are not,\n * reporting the features that are consequently unavailable. Missing peers are\n * a `warn` (the feature is simply off), never a `fail`.\n *\n * Read-only: resolves module paths only; never imports or executes the peers.\n */\nexport const optionalPeersCheck: DoctorCheck = {\n name: \"optional-peers\",\n run: () => {\n const missing = OPTIONAL_PEERS.filter((peer) => !isInstalled(peer.package));\n\n if (missing.length === 0) {\n return {\n name: \"optional-peers\",\n status: \"ok\",\n detail: `all ${OPTIONAL_PEERS.length} known optional peers installed`,\n };\n }\n\n const unavailable = missing\n .map((peer) => `${peer.package} (${peer.feature})`)\n .join(\"; \");\n\n return {\n name: \"optional-peers\",\n status: \"warn\",\n detail: `not installed unavailable: ${unavailable}`,\n };\n },\n};\n"],"mappings":";;;;;;;;AAsBA,MAAM,iBAAiC;CACrC;EAAE,SAAS;EAAS,SAAS;CAAmB;CAChD;EAAE,SAAS;EAAc,SAAS;CAAsB;CACxD;EAAE,SAAS;EAAa,SAAS;CAAyB;CAC1D;EAAE,SAAS;EAAsB,SAAS;CAAmB;CAC7D;EAAE,SAAS;EAAyB,SAAS;CAA0B;CACvE;EAAE,SAAS;EAAS,SAAS;CAAqB;CAClD;EAAE,SAAS;EAAW,SAAS;CAA0B;CACzD;EAAE,SAAS;EAAM,SAAS;CAA2B;CACrD;EAAE,SAAS;EAAU,SAAS;CAAwB;AACxD;;;;;AAMA,MAAM,iBAAiB,cAAc,GAAG,QAAQ,IAAI,EAAE,cAAc;;;;;AAMpE,SAAS,YAAY,aAA8B;CACjD,IAAI;EACF,eAAe,QAAQ,WAAW;EAClC,OAAO;CACT,QAAQ;EACN,OAAO;CACT;AACF;;;;;;;;AASA,MAAa,qBAAkC;CAC7C,MAAM;CACN,WAAW;EACT,MAAM,UAAU,eAAe,QAAQ,SAAS,CAAC,YAAY,KAAK,OAAO,CAAC;EAE1E,IAAI,QAAQ,WAAW,GACrB,OAAO;GACL,MAAM;GACN,QAAQ;GACR,QAAQ,OAAO,eAAe,OAAO;EACvC;EAOF,OAAO;GACL,MAAM;GACN,QAAQ;GACR,QAAQ,gCAPU,QACjB,KAAK,SAAS,GAAG,KAAK,QAAQ,IAAI,KAAK,QAAQ,EAAE,CAAC,CAClD,KAAK,IAK4C;EACpD;CACF;AACF"}
1
+ {"version":3,"file":"optional-peers.check.mjs","names":[],"sources":["C:/Work/Warlock.js/core/src/cli/commands/doctor/checks/optional-peers.check.ts"],"sourcesContent":["import { createRequire } from \"node:module\";\nimport { config } from \"../../../../config/config-getter\";\nimport type { CheckStatus, DoctorCheck } from \"../check.types\";\n\n/**\n * A package this project's own configuration requires, and what asked for it.\n */\ntype RequiredPeer = {\n /** The npm package name to probe via `require.resolve`. */\n package: string;\n\n /** The config that asked for it, quoted back to the user verbatim. */\n because: string;\n};\n\n/**\n * Resolve from the project's working directory, not from core's own\n * `node_modules`, so the probe reflects what the *consuming app* has installed.\n */\nconst projectRequire = createRequire(`${process.cwd()}/package.json`);\n\n/**\n * Whether a package can be resolved from the project. A failed resolve (the\n * normal \"not installed\" case) is swallowed and reported as missing.\n */\nfunction isInstalled(packageName: string): boolean {\n try {\n projectRequire.resolve(packageName);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * A non-empty string, or `undefined`. Config values arrive from `env(...)` and\n * an unset variable yields `undefined` — but a `.env` line with nothing after\n * the `=` yields `\"\"`, which is \"not configured\" just as much.\n */\nfunction text(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim().length > 0 ? value.trim() : undefined;\n}\n\n/**\n * The database driver's package. `driver` is a closed union in cascade\n * (`mongodb | postgres | mysql`), so an unrecognised value means the config is\n * wrong in a way this check is not the right one to report.\n */\nfunction databasePeer(): RequiredPeer | undefined {\n const driver = text(config.get(\"database.driver\"));\n\n const packageName =\n driver === \"mongodb\"\n ? \"mongodb\"\n : driver === \"postgres\"\n ? \"pg\"\n : driver === \"mysql\"\n ? \"mysql2\"\n : undefined;\n\n return packageName ? { package: packageName, because: `database.driver = \"${driver}\"` } : undefined;\n}\n\n/**\n * The selected cache driver. Only the DEFAULT matters: `cache.drivers` is a\n * menu the scaffold fills in for every driver the framework ships, and warning\n * about a menu entry nobody selected is the false positive this whole check was\n * rewritten to remove.\n */\nfunction cachePeer(): RequiredPeer | undefined {\n const selected = text(config.get(\"cache.default\"));\n\n if (!selected || !/redis/i.test(selected)) return undefined;\n\n return { package: \"redis\", because: `cache.default = \"${selected}\"` };\n}\n\n/**\n * The selected storage driver, read through its canonical `driver` field\n * (`local` / `s3` / `r2` / `spaces`) rather than the key the app happened to\n * name it, so a driver called \"cdn\" is still recognised as S3.\n */\nfunction storagePeer(): RequiredPeer | undefined {\n const selected = text(config.get(\"storage.default\"));\n\n if (!selected) return undefined;\n\n const driver = text(config.get(`storage.drivers.${selected}.driver`));\n\n if (!driver || driver === \"local\") return undefined;\n\n return {\n package: \"@aws-sdk/client-s3\",\n because: `storage.default = \"${selected}\" (driver \"${driver}\")`,\n };\n}\n\n/**\n * The mail transport. A `mail` config with no host and no driver is the\n * scaffold's placeholder — every field is an unset env var — so it asks for\n * nothing and this stays quiet.\n */\nfunction mailPeer(): RequiredPeer | undefined {\n const driver = text(config.get(\"mail.driver\"));\n\n if (driver === \"ses\") {\n return { package: \"@aws-sdk/client-sesv2\", because: `mail.driver = \"ses\"` };\n }\n\n const host = text(config.get(\"mail.host\"));\n\n if (!host) return undefined;\n\n return { package: \"nodemailer\", because: `mail.host = \"${host}\"` };\n}\n\n/**\n * Realtime sockets. The connector no-ops without a `socket` config, so the\n * presence of that config is exactly the request for the peer.\n */\nfunction socketPeer(): RequiredPeer | undefined {\n if (!config.get(\"socket\")) return undefined;\n\n return { package: \"socket.io\", because: \"a socket config is present\" };\n}\n\n/**\n * Every peer THIS project's configuration asks for.\n */\nfunction requiredPeers(): RequiredPeer[] {\n return [databasePeer(), cachePeer(), storagePeer(), mailPeer(), socketPeer()].filter(\n (peer): peer is RequiredPeer => Boolean(peer),\n );\n}\n\n/**\n * Checks that every optional peer the project's own configuration selects is\n * actually installed.\n *\n * NEEDS NO BOOTED APP — it reads config and resolves module paths. It runs after\n * the boot pass only because config is loaded by then.\n *\n * WHAT THIS REPLACED, AND WHY: the previous version probed nine packages and\n * warned about every one that was absent. Every one of them is an OPTIONAL\n * peer — a fresh app installs none of them by design — so the check warned, at\n * length, about the framework's own default state. \"No MySQL driver installed\"\n * is not a diagnosis for someone who never wanted MySQL; it is noise that\n * teaches the reader to skim past the line where a real finding will one day\n * appear.\n *\n * Inverted, it becomes a genuine one: a project whose config selects a driver\n * whose package is missing is broken — it will throw the first time that\n * feature is used — so a missing peer here is a `fail`, not a warning.\n */\nexport const optionalPeersCheck: DoctorCheck = {\n name: \"optional-peers\",\n run: () => {\n const required = requiredPeers();\n\n if (required.length === 0) {\n return undefined;\n }\n\n const missing = required.filter((peer) => !isInstalled(peer.package));\n\n const status: CheckStatus = missing.length > 0 ? \"fail\" : \"ok\";\n\n if (missing.length > 0) {\n return {\n name: \"optional-peers\",\n status,\n detail:\n `${missing.length} configured feature(s) have no driver installed:\\n` +\n missing.map((peer) => ` - ${peer.package} — required by ${peer.because}`).join(\"\\n\"),\n };\n }\n\n return {\n name: \"optional-peers\",\n status,\n detail: `every configured driver is installed (${required\n .map((peer) => peer.package)\n .join(\", \")})`,\n };\n },\n};\n"],"mappings":";;;;;;;;AAmBA,MAAM,iBAAiB,cAAc,GAAG,QAAQ,IAAI,EAAE,cAAc;;;;;AAMpE,SAAS,YAAY,aAA8B;CACjD,IAAI;EACF,eAAe,QAAQ,WAAW;EAClC,OAAO;CACT,QAAQ;EACN,OAAO;CACT;AACF;;;;;;AAOA,SAAS,KAAK,OAAoC;CAChD,OAAO,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,SAAS,IAAI,MAAM,KAAK,IAAI;AAC/E;;;;;;AAOA,SAAS,eAAyC;CAChD,MAAM,SAAS,KAAK,OAAO,IAAI,iBAAiB,CAAC;CAEjD,MAAM,cACJ,WAAW,YACP,YACA,WAAW,aACT,OACA,WAAW,UACT,WACA;CAEV,OAAO,cAAc;EAAE,SAAS;EAAa,SAAS,sBAAsB,OAAO;CAAG,IAAI;AAC5F;;;;;;;AAQA,SAAS,YAAsC;CAC7C,MAAM,WAAW,KAAK,OAAO,IAAI,eAAe,CAAC;CAEjD,IAAI,CAAC,YAAY,CAAC,SAAS,KAAK,QAAQ,GAAG,OAAO;CAElD,OAAO;EAAE,SAAS;EAAS,SAAS,oBAAoB,SAAS;CAAG;AACtE;;;;;;AAOA,SAAS,cAAwC;CAC/C,MAAM,WAAW,KAAK,OAAO,IAAI,iBAAiB,CAAC;CAEnD,IAAI,CAAC,UAAU,OAAO;CAEtB,MAAM,SAAS,KAAK,OAAO,IAAI,mBAAmB,SAAS,QAAQ,CAAC;CAEpE,IAAI,CAAC,UAAU,WAAW,SAAS,OAAO;CAE1C,OAAO;EACL,SAAS;EACT,SAAS,sBAAsB,SAAS,aAAa,OAAO;CAC9D;AACF;;;;;;AAOA,SAAS,WAAqC;CAG5C,IAFe,KAAK,OAAO,IAAI,aAAa,CAEnC,MAAM,OACb,OAAO;EAAE,SAAS;EAAyB,SAAS;CAAsB;CAG5E,MAAM,OAAO,KAAK,OAAO,IAAI,WAAW,CAAC;CAEzC,IAAI,CAAC,MAAM,OAAO;CAElB,OAAO;EAAE,SAAS;EAAc,SAAS,gBAAgB,KAAK;CAAG;AACnE;;;;;AAMA,SAAS,aAAuC;CAC9C,IAAI,CAAC,OAAO,IAAI,QAAQ,GAAG,OAAO;CAElC,OAAO;EAAE,SAAS;EAAa,SAAS;CAA6B;AACvE;;;;AAKA,SAAS,gBAAgC;CACvC,OAAO;EAAC,aAAa;EAAG,UAAU;EAAG,YAAY;EAAG,SAAS;EAAG,WAAW;CAAC,EAAE,QAC3E,SAA+B,QAAQ,IAAI,CAC9C;AACF;;;;;;;;;;;;;;;;;;;;AAqBA,MAAa,qBAAkC;CAC7C,MAAM;CACN,WAAW;EACT,MAAM,WAAW,cAAc;EAE/B,IAAI,SAAS,WAAW,GACtB;EAGF,MAAM,UAAU,SAAS,QAAQ,SAAS,CAAC,YAAY,KAAK,OAAO,CAAC;EAEpE,MAAM,SAAsB,QAAQ,SAAS,IAAI,SAAS;EAE1D,IAAI,QAAQ,SAAS,GACnB,OAAO;GACL,MAAM;GACN;GACA,QACE,GAAG,QAAQ,OAAO,sDAClB,QAAQ,KAAK,SAAS,OAAO,KAAK,QAAQ,iBAAiB,KAAK,SAAS,EAAE,KAAK,IAAI;EACxF;EAGF,OAAO;GACL,MAAM;GACN;GACA,QAAQ,yCAAyC,SAC9C,KAAK,SAAS,KAAK,OAAO,EAC1B,KAAK,IAAI,EAAE;EAChB;CACF;AACF"}
@@ -1,7 +1,7 @@
1
1
  import { rootPath } from "../../../../utils/paths.mjs";
2
2
  import { existsSync, readFileSync } from "node:fs";
3
3
 
4
- //#region ../core/src/cli/commands/doctor/checks/release-hygiene.check.ts
4
+ //#region core/src/cli/commands/doctor/checks/release-hygiene.check.ts
5
5
  /**
6
6
  * Parse the top-most `## x.y.z[ - YYYY-MM-DD]` heading out of a CHANGELOG body.
7
7
  * Returns `undefined` when no version heading is present.
@@ -16,29 +16,47 @@ function parseTopHeading(changelog) {
16
16
  };
17
17
  }
18
18
  /**
19
- * Checks that the project's `package.json` version matches the top-most
20
- * `## x.y.z` heading in `CHANGELOG.md` — the same version↔changelog invariant
21
- * the release-hygiene unit guard enforces, surfaced as a pre-release doctor
22
- * check.
19
+ * Whether this project is something anyone could `npm publish`.
20
+ *
21
+ * THE GATE, and the reason it exists: a changelog is a promise to the people
22
+ * who install your package. An application has no such people. Running this
23
+ * check on every project projected the framework monorepo's own release
24
+ * practice onto users building an app, who were told — on every single run,
25
+ * forever — that their private application was missing a CHANGELOG.md it had no
26
+ * reason to have. `"private": true` is exactly the field npm itself reads to
27
+ * refuse a publish, so it is the honest test of whether the concern applies.
28
+ */
29
+ function isPublishable(manifest) {
30
+ return manifest.private !== true && typeof manifest.name === "string";
31
+ }
32
+ /**
33
+ * Checks that a PUBLISHABLE package's `package.json` version matches the
34
+ * top-most `## x.y.z` heading in `CHANGELOG.md` — the same version↔changelog
35
+ * invariant the release-hygiene unit guard enforces, surfaced as a pre-release
36
+ * doctor check.
37
+ *
38
+ * NEEDS NO BOOTED APP — it reads two files from the project root.
23
39
  *
24
40
  * Verdicts:
25
- * - no `CHANGELOG.md``warn` (a changelog is recommended, not mandatory);
41
+ * - `"private": true`, or no package name not applicable, no line at all;
42
+ * - no `CHANGELOG.md` → `warn` (recommended for a published package, not
43
+ * mandatory);
26
44
  * - no parseable heading → `warn`;
27
45
  * - heading version ≠ package.json version → `fail`;
28
46
  * - otherwise → `ok`.
29
- *
30
- * Read-only: reads `package.json` and `CHANGELOG.md` from the project root.
31
47
  */
32
48
  const releaseHygieneCheck = {
33
49
  name: "release-hygiene",
34
50
  run: () => {
35
51
  const packageJsonPath = rootPath("package.json");
36
52
  const changelogPath = rootPath("CHANGELOG.md");
37
- const pkgVersion = JSON.parse(readFileSync(packageJsonPath, "utf8")).version;
53
+ const manifest = JSON.parse(readFileSync(packageJsonPath, "utf8"));
54
+ if (!isPublishable(manifest)) return;
55
+ const pkgVersion = manifest.version;
38
56
  if (typeof pkgVersion !== "string") return {
39
57
  name: "release-hygiene",
40
58
  status: "fail",
41
- detail: "package.json has no string version field"
59
+ detail: "package.json is publishable but has no string version field"
42
60
  };
43
61
  if (!existsSync(changelogPath)) return {
44
62
  name: "release-hygiene",
@@ -1 +1 @@
1
- {"version":3,"file":"release-hygiene.check.mjs","names":[],"sources":["../../../../../../../../../../core/src/cli/commands/doctor/checks/release-hygiene.check.ts"],"sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport { rootPath } from \"../../../../utils/paths\";\nimport type { DoctorCheck } from \"../check.types\";\n\n/**\n * A `## x.y.z` changelog heading with an optional ` - YYYY-MM-DD` suffix.\n * Mirrors the shape parsed by the tier-0 release-hygiene unit guard; inlined\n * here because that guard lives in the test tree and is not importable from\n * `src`.\n */\ntype ChangelogHeading = {\n version: string;\n date?: string;\n};\n\n/**\n * Parse the top-most `## x.y.z[ - YYYY-MM-DD]` heading out of a CHANGELOG body.\n * Returns `undefined` when no version heading is present.\n */\nfunction parseTopHeading(changelog: string): ChangelogHeading | undefined {\n const match = changelog.match(\n /^##\\s+(\\d+)\\.(\\d+)\\.(\\d+)(?:\\s*[-–]\\s*(\\d{4}-\\d{2}-\\d{2}))?\\s*$/m,\n );\n\n if (!match) {\n return undefined;\n }\n\n const [, major, minor, patch, date] = match;\n\n return {\n version: `${major}.${minor}.${patch}`,\n date,\n };\n}\n\n/**\n * Checks that the project's `package.json` version matches the top-most\n * `## x.y.z` heading in `CHANGELOG.md` — the same version↔changelog invariant\n * the release-hygiene unit guard enforces, surfaced as a pre-release doctor\n * check.\n *\n * Verdicts:\n * - no `CHANGELOG.md` → `warn` (a changelog is recommended, not mandatory);\n * - no parseable heading → `warn`;\n * - heading version ≠ package.json version → `fail`;\n * - otherwise → `ok`.\n *\n * Read-only: reads `package.json` and `CHANGELOG.md` from the project root.\n */\nexport const releaseHygieneCheck: DoctorCheck = {\n name: \"release-hygiene\",\n run: () => {\n const packageJsonPath = rootPath(\"package.json\");\n const changelogPath = rootPath(\"CHANGELOG.md\");\n\n const pkgVersion: unknown = JSON.parse(readFileSync(packageJsonPath, \"utf8\")).version;\n\n if (typeof pkgVersion !== \"string\") {\n return {\n name: \"release-hygiene\",\n status: \"fail\",\n detail: \"package.json has no string version field\",\n };\n }\n\n if (!existsSync(changelogPath)) {\n return {\n name: \"release-hygiene\",\n status: \"warn\",\n detail: `no CHANGELOG.md at project root (package.json is ${pkgVersion})`,\n };\n }\n\n const changelog = readFileSync(changelogPath, \"utf8\");\n const heading = parseTopHeading(changelog);\n\n if (!heading) {\n return {\n name: \"release-hygiene\",\n status: \"warn\",\n detail: \"CHANGELOG.md has no parseable `## x.y.z` heading\",\n };\n }\n\n if (heading.version !== pkgVersion) {\n return {\n name: \"release-hygiene\",\n status: \"fail\",\n detail: `package.json ${pkgVersion} ≠ top CHANGELOG heading ${heading.version}`,\n };\n }\n\n return {\n name: \"release-hygiene\",\n status: \"ok\",\n detail: `package.json and CHANGELOG agree on ${pkgVersion}`,\n };\n },\n};\n"],"mappings":";;;;;;;;AAmBA,SAAS,gBAAgB,WAAiD;CACxE,MAAM,QAAQ,UAAU,MACtB,kEACF;CAEA,IAAI,CAAC,OACH;CAGF,MAAM,GAAG,OAAO,OAAO,OAAO,QAAQ;CAEtC,OAAO;EACL,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG;EAC9B;CACF;AACF;;;;;;;;;;;;;;;AAgBA,MAAa,sBAAmC;CAC9C,MAAM;CACN,WAAW;EACT,MAAM,kBAAkB,SAAS,cAAc;EAC/C,MAAM,gBAAgB,SAAS,cAAc;EAE7C,MAAM,aAAsB,KAAK,MAAM,aAAa,iBAAiB,MAAM,CAAC,CAAC,CAAC;EAE9E,IAAI,OAAO,eAAe,UACxB,OAAO;GACL,MAAM;GACN,QAAQ;GACR,QAAQ;EACV;EAGF,IAAI,CAAC,WAAW,aAAa,GAC3B,OAAO;GACL,MAAM;GACN,QAAQ;GACR,QAAQ,oDAAoD,WAAW;EACzE;EAIF,MAAM,UAAU,gBADE,aAAa,eAAe,MACN,CAAC;EAEzC,IAAI,CAAC,SACH,OAAO;GACL,MAAM;GACN,QAAQ;GACR,QAAQ;EACV;EAGF,IAAI,QAAQ,YAAY,YACtB,OAAO;GACL,MAAM;GACN,QAAQ;GACR,QAAQ,gBAAgB,WAAW,2BAA2B,QAAQ;EACxE;EAGF,OAAO;GACL,MAAM;GACN,QAAQ;GACR,QAAQ,uCAAuC;EACjD;CACF;AACF"}
1
+ {"version":3,"file":"release-hygiene.check.mjs","names":[],"sources":["C:/Work/Warlock.js/core/src/cli/commands/doctor/checks/release-hygiene.check.ts"],"sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport { rootPath } from \"../../../../utils/paths\";\nimport type { DoctorCheck } from \"../check.types\";\n\n/**\n * A `## x.y.z` changelog heading with an optional ` - YYYY-MM-DD` suffix.\n * Mirrors the shape parsed by the tier-0 release-hygiene unit guard; inlined\n * here because that guard lives in the test tree and is not importable from\n * `src`.\n */\ntype ChangelogHeading = {\n version: string;\n date?: string;\n};\n\n/**\n * The parts of `package.json` this check reads.\n */\ntype ProjectManifest = {\n version?: unknown;\n private?: unknown;\n name?: unknown;\n};\n\n/**\n * Parse the top-most `## x.y.z[ - YYYY-MM-DD]` heading out of a CHANGELOG body.\n * Returns `undefined` when no version heading is present.\n */\nfunction parseTopHeading(changelog: string): ChangelogHeading | undefined {\n const match = changelog.match(\n /^##\\s+(\\d+)\\.(\\d+)\\.(\\d+)(?:\\s*[-–]\\s*(\\d{4}-\\d{2}-\\d{2}))?\\s*$/m,\n );\n\n if (!match) {\n return undefined;\n }\n\n const [, major, minor, patch, date] = match;\n\n return {\n version: `${major}.${minor}.${patch}`,\n date,\n };\n}\n\n/**\n * Whether this project is something anyone could `npm publish`.\n *\n * THE GATE, and the reason it exists: a changelog is a promise to the people\n * who install your package. An application has no such people. Running this\n * check on every project projected the framework monorepo's own release\n * practice onto users building an app, who were told — on every single run,\n * forever — that their private application was missing a CHANGELOG.md it had no\n * reason to have. `\"private\": true` is exactly the field npm itself reads to\n * refuse a publish, so it is the honest test of whether the concern applies.\n */\nfunction isPublishable(manifest: ProjectManifest): boolean {\n return manifest.private !== true && typeof manifest.name === \"string\";\n}\n\n/**\n * Checks that a PUBLISHABLE package's `package.json` version matches the\n * top-most `## x.y.z` heading in `CHANGELOG.md` — the same version↔changelog\n * invariant the release-hygiene unit guard enforces, surfaced as a pre-release\n * doctor check.\n *\n * NEEDS NO BOOTED APP — it reads two files from the project root.\n *\n * Verdicts:\n * - `\"private\": true`, or no package name → not applicable, no line at all;\n * - no `CHANGELOG.md` → `warn` (recommended for a published package, not\n * mandatory);\n * - no parseable heading → `warn`;\n * - heading version ≠ package.json version → `fail`;\n * - otherwise → `ok`.\n */\nexport const releaseHygieneCheck: DoctorCheck = {\n name: \"release-hygiene\",\n run: () => {\n const packageJsonPath = rootPath(\"package.json\");\n const changelogPath = rootPath(\"CHANGELOG.md\");\n\n const manifest: ProjectManifest = JSON.parse(readFileSync(packageJsonPath, \"utf8\"));\n\n if (!isPublishable(manifest)) {\n return undefined;\n }\n\n const pkgVersion = manifest.version;\n\n if (typeof pkgVersion !== \"string\") {\n return {\n name: \"release-hygiene\",\n status: \"fail\",\n detail: \"package.json is publishable but has no string version field\",\n };\n }\n\n if (!existsSync(changelogPath)) {\n return {\n name: \"release-hygiene\",\n status: \"warn\",\n detail: `no CHANGELOG.md at project root (package.json is ${pkgVersion})`,\n };\n }\n\n const changelog = readFileSync(changelogPath, \"utf8\");\n const heading = parseTopHeading(changelog);\n\n if (!heading) {\n return {\n name: \"release-hygiene\",\n status: \"warn\",\n detail: \"CHANGELOG.md has no parseable `## x.y.z` heading\",\n };\n }\n\n if (heading.version !== pkgVersion) {\n return {\n name: \"release-hygiene\",\n status: \"fail\",\n detail: `package.json ${pkgVersion} ≠ top CHANGELOG heading ${heading.version}`,\n };\n }\n\n return {\n name: \"release-hygiene\",\n status: \"ok\",\n detail: `package.json and CHANGELOG agree on ${pkgVersion}`,\n };\n },\n};\n"],"mappings":";;;;;;;;AA4BA,SAAS,gBAAgB,WAAiD;CACxE,MAAM,QAAQ,UAAU,MACtB,kEACF;CAEA,IAAI,CAAC,OACH;CAGF,MAAM,GAAG,OAAO,OAAO,OAAO,QAAQ;CAEtC,OAAO;EACL,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG;EAC9B;CACF;AACF;;;;;;;;;;;;AAaA,SAAS,cAAc,UAAoC;CACzD,OAAO,SAAS,YAAY,QAAQ,OAAO,SAAS,SAAS;AAC/D;;;;;;;;;;;;;;;;;AAkBA,MAAa,sBAAmC;CAC9C,MAAM;CACN,WAAW;EACT,MAAM,kBAAkB,SAAS,cAAc;EAC/C,MAAM,gBAAgB,SAAS,cAAc;EAE7C,MAAM,WAA4B,KAAK,MAAM,aAAa,iBAAiB,MAAM,CAAC;EAElF,IAAI,CAAC,cAAc,QAAQ,GACzB;EAGF,MAAM,aAAa,SAAS;EAE5B,IAAI,OAAO,eAAe,UACxB,OAAO;GACL,MAAM;GACN,QAAQ;GACR,QAAQ;EACV;EAGF,IAAI,CAAC,WAAW,aAAa,GAC3B,OAAO;GACL,MAAM;GACN,QAAQ;GACR,QAAQ,oDAAoD,WAAW;EACzE;EAIF,MAAM,UAAU,gBADE,aAAa,eAAe,MACN,CAAC;EAEzC,IAAI,CAAC,SACH,OAAO;GACL,MAAM;GACN,QAAQ;GACR,QAAQ;EACV;EAGF,IAAI,QAAQ,YAAY,YACtB,OAAO;GACL,MAAM;GACN,QAAQ;GACR,QAAQ,gBAAgB,WAAW,2BAA2B,QAAQ;EACxE;EAGF,OAAO;GACL,MAAM;GACN,QAAQ;GACR,QAAQ,uCAAuC;EACjD;CACF;AACF"}
@@ -1,26 +1,65 @@
1
- import { router } from "../../../../router/router.mjs";
2
-
3
- //#region ../core/src/cli/commands/doctor/checks/routes.check.ts
1
+ //#region core/src/cli/commands/doctor/checks/routes.check.ts
2
+ /**
3
+ * Describe the failed modules as an indented block, one per line, cause first.
4
+ * The file that failed is the only thing that makes this actionable, so it is
5
+ * never summarised away.
6
+ */
7
+ function describeFailures(context) {
8
+ return context.moduleFailures.map((failure) => ` - ${failure.file}: ${failure.message}`).join("\n");
9
+ }
4
10
  /**
5
- * Reports the number of registered routes. A booted app with zero routes
6
- * almost always means a route module failed to register silently, so this
7
- * warns (rather than passing) when the route table is empty.
11
+ * Reports the route surface the app will actually serve.
8
12
  *
9
- * Read-only: introspects the router via `routeCount()` only.
13
+ * NEEDS A BOOTED APP — and now gets one. Routes exist only as the side effect of
14
+ * importing the module that declares them, so a doctor that did not import app
15
+ * code reported `0 routes` for an app the dev server served fourteen routes
16
+ * for. The boot pass imports the same modules, in the same order, and boots
17
+ * (never starts) the same connectors, so the number printed here is the number
18
+ * `warlock dev` prints for the same project — the two are read off the same
19
+ * router after the same registrations.
20
+ *
21
+ * Verdicts:
22
+ * - a module failed to import → `fail`, naming every file and its cause. This
23
+ * is the finding doctor exists for: a route file that throws on import is
24
+ * invisible at runtime, it just 404s;
25
+ * - route modules on disk but nothing registered → `fail` (they loaded and
26
+ * registered nothing, which is not a state a working app is in);
27
+ * - no route modules at all → `ok`, stated plainly. A worker or CLI-only app is
28
+ * a legitimate shape and must not be nagged;
29
+ * - otherwise → `ok` with the count, split into what app code registered and
30
+ * what connectors added.
10
31
  */
11
32
  const routesCheck = {
12
33
  name: "routes",
13
- run: () => {
14
- const count = router.routeCount();
15
- if (count === 0) return {
34
+ run: (context) => {
35
+ if (context.moduleFailures.length > 0) return {
36
+ name: "routes",
37
+ status: "fail",
38
+ detail: `${context.moduleFailures.length} app module(s) failed to load — the routes they declare will 404:\n` + describeFailures(context)
39
+ };
40
+ if (!context.booted) return {
16
41
  name: "routes",
17
- status: "warn",
18
- detail: "0 routes registered did a route module fail to load?"
42
+ status: "fail",
43
+ detail: "app modules could not be discovered nothing to report on"
19
44
  };
45
+ if (context.totalRoutes === 0) {
46
+ if (context.routeModules === 0) return {
47
+ name: "routes",
48
+ status: "ok",
49
+ detail: "no route modules found (src/app/*/routes.ts) — this app serves no HTTP routes"
50
+ };
51
+ return {
52
+ name: "routes",
53
+ status: "fail",
54
+ detail: `${context.routeModules} route module(s) loaded without error but registered 0 routes — every request will 404`
55
+ };
56
+ }
57
+ const fromConnectors = context.totalRoutes - context.appRoutes;
58
+ const breakdown = fromConnectors > 0 ? `${context.appRoutes} from ${context.routeModules} route module(s), ${fromConnectors} from connectors` : `from ${context.routeModules} route module(s)`;
20
59
  return {
21
60
  name: "routes",
22
61
  status: "ok",
23
- detail: `${count} registered`
62
+ detail: `${context.totalRoutes} registered (${breakdown})`
24
63
  };
25
64
  }
26
65
  };
@@ -1 +1 @@
1
- {"version":3,"file":"routes.check.mjs","names":[],"sources":["../../../../../../../../../../core/src/cli/commands/doctor/checks/routes.check.ts"],"sourcesContent":["import { router } from \"../../../../router/router\";\nimport type { DoctorCheck } from \"../check.types\";\n\n/**\n * Reports the number of registered routes. A booted app with zero routes\n * almost always means a route module failed to register silently, so this\n * warns (rather than passing) when the route table is empty.\n *\n * Read-only: introspects the router via `routeCount()` only.\n */\nexport const routesCheck: DoctorCheck = {\n name: \"routes\",\n run: () => {\n const count = router.routeCount();\n\n if (count === 0) {\n return {\n name: \"routes\",\n status: \"warn\",\n detail: \"0 routes registereddid a route module fail to load?\",\n };\n }\n\n return {\n name: \"routes\",\n status: \"ok\",\n detail: `${count} registered`,\n };\n },\n};\n"],"mappings":";;;;;;;;;;AAUA,MAAa,cAA2B;CACtC,MAAM;CACN,WAAW;EACT,MAAM,QAAQ,OAAO,WAAW;EAEhC,IAAI,UAAU,GACZ,OAAO;GACL,MAAM;GACN,QAAQ;GACR,QAAQ;EACV;EAGF,OAAO;GACL,MAAM;GACN,QAAQ;GACR,QAAQ,GAAG,MAAM;EACnB;CACF;AACF"}
1
+ {"version":3,"file":"routes.check.mjs","names":[],"sources":["C:/Work/Warlock.js/core/src/cli/commands/doctor/checks/routes.check.ts"],"sourcesContent":["import type { DoctorBootContext, DoctorCheck } from \"../check.types\";\n\n/**\n * Describe the failed modules as an indented block, one per line, cause first.\n * The file that failed is the only thing that makes this actionable, so it is\n * never summarised away.\n */\nfunction describeFailures(context: DoctorBootContext): string {\n return context.moduleFailures\n .map((failure) => ` - ${failure.file}: ${failure.message}`)\n .join(\"\\n\");\n}\n\n/**\n * Reports the route surface the app will actually serve.\n *\n * NEEDS A BOOTED APP — and now gets one. Routes exist only as the side effect of\n * importing the module that declares them, so a doctor that did not import app\n * code reported `0 routes` for an app the dev server served fourteen routes\n * for. The boot pass imports the same modules, in the same order, and boots\n * (never starts) the same connectors, so the number printed here is the number\n * `warlock dev` prints for the same project — the two are read off the same\n * router after the same registrations.\n *\n * Verdicts:\n * - a module failed to import → `fail`, naming every file and its cause. This\n * is the finding doctor exists for: a route file that throws on import is\n * invisible at runtime, it just 404s;\n * - route modules on disk but nothing registered → `fail` (they loaded and\n * registered nothing, which is not a state a working app is in);\n * - no route modules at all → `ok`, stated plainly. A worker or CLI-only app is\n * a legitimate shape and must not be nagged;\n * - otherwise → `ok` with the count, split into what app code registered and\n * what connectors added.\n */\nexport const routesCheck: DoctorCheck = {\n name: \"routes\",\n run: (context) => {\n if (context.moduleFailures.length > 0) {\n const count = context.moduleFailures.length;\n\n return {\n name: \"routes\",\n status: \"fail\",\n detail:\n `${count} app module(s) failed to load — the routes they declare will 404:\\n` +\n describeFailures(context),\n };\n }\n\n if (!context.booted) {\n return {\n name: \"routes\",\n status: \"fail\",\n detail: \"app modules could not be discovered — nothing to report on\",\n };\n }\n\n if (context.totalRoutes === 0) {\n if (context.routeModules === 0) {\n return {\n name: \"routes\",\n status: \"ok\",\n detail: \"no route modules found (src/app/*/routes.ts) this app serves no HTTP routes\",\n };\n }\n\n return {\n name: \"routes\",\n status: \"fail\",\n detail:\n `${context.routeModules} route module(s) loaded without error but registered 0 routes — ` +\n \"every request will 404\",\n };\n }\n\n const fromConnectors = context.totalRoutes - context.appRoutes;\n const breakdown =\n fromConnectors > 0\n ? `${context.appRoutes} from ${context.routeModules} route module(s), ` +\n `${fromConnectors} from connectors`\n : `from ${context.routeModules} route module(s)`;\n\n return {\n name: \"routes\",\n status: \"ok\",\n detail: `${context.totalRoutes} registered (${breakdown})`,\n };\n },\n};\n"],"mappings":";;;;;;AAOA,SAAS,iBAAiB,SAAoC;CAC5D,OAAO,QAAQ,eACZ,KAAK,YAAY,OAAO,QAAQ,KAAK,IAAI,QAAQ,SAAS,EAC1D,KAAK,IAAI;AACd;;;;;;;;;;;;;;;;;;;;;;;AAwBA,MAAa,cAA2B;CACtC,MAAM;CACN,MAAM,YAAY;EAChB,IAAI,QAAQ,eAAe,SAAS,GAGlC,OAAO;GACL,MAAM;GACN,QAAQ;GACR,QACE,GANU,QAAQ,eAAe,OAMxB,uEACT,iBAAiB,OAAO;EAC5B;EAGF,IAAI,CAAC,QAAQ,QACX,OAAO;GACL,MAAM;GACN,QAAQ;GACR,QAAQ;EACV;EAGF,IAAI,QAAQ,gBAAgB,GAAG;GAC7B,IAAI,QAAQ,iBAAiB,GAC3B,OAAO;IACL,MAAM;IACN,QAAQ;IACR,QAAQ;GACV;GAGF,OAAO;IACL,MAAM;IACN,QAAQ;IACR,QACE,GAAG,QAAQ,aAAa;GAE5B;EACF;EAEA,MAAM,iBAAiB,QAAQ,cAAc,QAAQ;EACrD,MAAM,YACJ,iBAAiB,IACb,GAAG,QAAQ,UAAU,QAAQ,QAAQ,aAAa,oBAC/C,eAAe,oBAClB,QAAQ,QAAQ,aAAa;EAEnC,OAAO;GACL,MAAM;GACN,QAAQ;GACR,QAAQ,GAAG,QAAQ,YAAY,eAAe,UAAU;EAC1D;CACF;AACF"}
@@ -1,24 +1,34 @@
1
+ import { bootForDiagnostics } from "./boot-for-diagnostics.mjs";
1
2
  import { defaultDoctorChecks } from "./checks/index.mjs";
2
3
  import { printReport } from "./format-report.mjs";
3
4
  import { runChecks } from "./run-checks.mjs";
4
5
 
5
- //#region ../core/src/cli/commands/doctor/doctor-command.action.ts
6
+ //#region core/src/cli/commands/doctor/doctor-command.action.ts
6
7
  /**
7
- * Action behind `warlock doctor`. Runs the default read-only diagnostic
8
- * checks, prints the grouped pass/warn/fail report, and — when any check
9
- * failed exits the process with a non-zero code so the command signals
10
- * failure to scripts/CI.
8
+ * Action behind `warlock doctor`.
9
+ *
10
+ * Two steps, in this order and for a reason: ONE boot pass, then every check
11
+ * against what that pass observed. The checks never boot anything themselves,
12
+ * so the report cannot contain two lines that inspected the app at different
13
+ * moments and contradicted each other — which is exactly what it used to
14
+ * contain (`routes: 0 registered` beside `health: /health + /ready
15
+ * registered`, in the same run, on an app serving fourteen routes).
16
+ *
17
+ * The pass boots every connector and starts none, so no database, cache or
18
+ * socket connection is opened and no port is bound. See
19
+ * `boot-for-diagnostics.ts`.
11
20
  *
12
21
  * A failing check is REPORTED (a line in the report + a non-zero exit), never
13
22
  * thrown: the runner converts any thrown check into a `fail` result first.
14
23
  *
15
24
  * On success this simply returns; the CLI manager then prints its own success
16
- * banner and exits zero.
25
+ * banner and exits zero — which also disposes of the handles the boot pass
26
+ * left open (a Fastify instance, a Vite dev server for `web` apps).
17
27
  *
18
28
  * @param _data Parsed CLI args (unused — doctor takes no positional args).
19
29
  */
20
30
  async function doctorCommandAction(_data) {
21
- const report = await runChecks(defaultDoctorChecks);
31
+ const report = await runChecks(defaultDoctorChecks, await bootForDiagnostics());
22
32
  printReport(report);
23
33
  if (report.hasFailures) process.exit(report.exitCode);
24
34
  }
@@ -1 +1 @@
1
- {"version":3,"file":"doctor-command.action.mjs","names":[],"sources":["../../../../../../../../../core/src/cli/commands/doctor/doctor-command.action.ts"],"sourcesContent":["import type { CommandActionData } from \"../../../commands/types\";\r\nimport { defaultDoctorChecks } from \"./checks\";\r\nimport { printReport } from \"./format-report\";\r\nimport { runChecks } from \"./run-checks\";\r\n\r\n/**\r\n * Action behind `warlock doctor`. Runs the default read-only diagnostic\r\n * checks, prints the grouped pass/warn/fail report, and — when any check\r\n * failed exits the process with a non-zero code so the command signals\r\n * failure to scripts/CI.\r\n *\r\n * A failing check is REPORTED (a line in the report + a non-zero exit), never\r\n * thrown: the runner converts any thrown check into a `fail` result first.\r\n *\r\n * On success this simply returns; the CLI manager then prints its own success\r\n * banner and exits zero.\r\n *\r\n * @param _data Parsed CLI args (unused — doctor takes no positional args).\r\n */\r\nexport async function doctorCommandAction(_data: CommandActionData): Promise<void> {\r\n const report = await runChecks(defaultDoctorChecks);\r\n\r\n printReport(report);\r\n\r\n if (report.hasFailures) {\r\n process.exit(report.exitCode);\r\n }\r\n}\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAmBA,eAAsB,oBAAoB,OAAyC;CACjF,MAAM,SAAS,MAAM,UAAU,mBAAmB;CAElD,YAAY,MAAM;CAElB,IAAI,OAAO,aACT,QAAQ,KAAK,OAAO,QAAQ;AAEhC"}
1
+ {"version":3,"file":"doctor-command.action.mjs","names":[],"sources":["C:/Work/Warlock.js/core/src/cli/commands/doctor/doctor-command.action.ts"],"sourcesContent":["import type { CommandActionData } from \"../../../commands/types\";\nimport { bootForDiagnostics } from \"./boot-for-diagnostics\";\nimport { defaultDoctorChecks } from \"./checks\";\nimport { printReport } from \"./format-report\";\nimport { runChecks } from \"./run-checks\";\n\n/**\n * Action behind `warlock doctor`.\n *\n * Two steps, in this order and for a reason: ONE boot pass, then every check\n * against what that pass observed. The checks never boot anything themselves,\n * so the report cannot contain two lines that inspected the app at different\n * moments and contradicted each other which is exactly what it used to\n * contain (`routes: 0 registered` beside `health: /health + /ready\n * registered`, in the same run, on an app serving fourteen routes).\n *\n * The pass boots every connector and starts none, so no database, cache or\n * socket connection is opened and no port is bound. See\n * `boot-for-diagnostics.ts`.\n *\n * A failing check is REPORTED (a line in the report + a non-zero exit), never\n * thrown: the runner converts any thrown check into a `fail` result first.\n *\n * On success this simply returns; the CLI manager then prints its own success\n * banner and exits zero — which also disposes of the handles the boot pass\n * left open (a Fastify instance, a Vite dev server for `web` apps).\n *\n * @param _data Parsed CLI args (unused — doctor takes no positional args).\n */\nexport async function doctorCommandAction(_data: CommandActionData): Promise<void> {\n const context = await bootForDiagnostics();\n\n const report = await runChecks(defaultDoctorChecks, context);\n\n printReport(report);\n\n if (report.hasFailures) {\n process.exit(report.exitCode);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BA,eAAsB,oBAAoB,OAAyC;CAGjF,MAAM,SAAS,MAAM,UAAU,qBAAqB,MAF9B,mBAAmB,CAEkB;CAE3D,YAAY,MAAM;CAElB,IAAI,OAAO,aACT,QAAQ,KAAK,OAAO,QAAQ;AAEhC"}
@@ -1,6 +1,6 @@
1
1
  import { colors } from "@mongez/copper";
2
2
 
3
- //#region ../core/src/cli/commands/doctor/format-report.ts
3
+ //#region core/src/cli/commands/doctor/format-report.ts
4
4
  /**
5
5
  * The glyph shown beside each check, keyed by status.
6
6
  */
@@ -1 +1 @@
1
- {"version":3,"file":"format-report.mjs","names":[],"sources":["../../../../../../../../../core/src/cli/commands/doctor/format-report.ts"],"sourcesContent":["import { colors } from \"@mongez/copper\";\nimport type { CheckStatus, DoctorReport } from \"./check.types\";\n\n/**\n * The glyph shown beside each check, keyed by status.\n */\nconst STATUS_SYMBOL: Record<CheckStatus, string> = {\n ok: \"✓\",\n warn: \"⚠\",\n fail: \"✗\",\n};\n\n/**\n * Colorize a status glyph. Kept separate from {@link STATUS_SYMBOL} so the\n * plain glyphs remain available for snapshot-friendly, color-free assertions.\n */\nfunction colorizeSymbol(status: CheckStatus): string {\n const symbol = STATUS_SYMBOL[status];\n\n switch (status) {\n case \"ok\":\n return colors.green(symbol);\n case \"warn\":\n return colors.yellow(symbol);\n case \"fail\":\n return colors.red(symbol);\n }\n}\n\n/**\n * Build the report body as an ordered list of plain (uncolored) lines:\n * one `<symbol> <name>: <detail>` line per check, a blank line, then a summary\n * line. Returned as strings (not printed) so the formatting is unit-testable.\n *\n * @param report The aggregated doctor report.\n * @returns The lines to print, top to bottom.\n */\nexport function formatReportLines(report: DoctorReport): string[] {\n const lines = report.results.map((result) => {\n return `${STATUS_SYMBOL[result.status]} ${result.name}: ${result.detail}`;\n });\n\n const { ok, warn, fail } = report.summary;\n\n lines.push(\"\");\n lines.push(`Summary: ${ok} ok, ${warn} warn, ${fail} fail`);\n\n return lines;\n}\n\n/**\n * Print the report to stdout with colored status glyphs and a colored summary\n * verdict. Thin wrapper over {@link formatReportLines} — the structured report\n * stays the source of truth for the exit code.\n *\n * @param report The aggregated doctor report.\n */\nexport function printReport(report: DoctorReport): void {\n for (const result of report.results) {\n const symbol = colorizeSymbol(result.status);\n\n console.log(`${symbol} ${colors.bold(result.name)}: ${result.detail}`);\n }\n\n const { ok, warn, fail } = report.summary;\n const summaryLine = `Summary: ${ok} ok, ${warn} warn, ${fail} fail`;\n\n console.log(\"\");\n console.log(report.hasFailures ? colors.red(summaryLine) : colors.green(summaryLine));\n}\n"],"mappings":";;;;;;AAMA,MAAM,gBAA6C;CACjD,IAAI;CACJ,MAAM;CACN,MAAM;AACR;;;;;AAMA,SAAS,eAAe,QAA6B;CACnD,MAAM,SAAS,cAAc;CAE7B,QAAQ,QAAR;EACE,KAAK,MACH,OAAO,OAAO,MAAM,MAAM;EAC5B,KAAK,QACH,OAAO,OAAO,OAAO,MAAM;EAC7B,KAAK,QACH,OAAO,OAAO,IAAI,MAAM;CAC5B;AACF;;;;;;;;AA8BA,SAAgB,YAAY,QAA4B;CACtD,KAAK,MAAM,UAAU,OAAO,SAAS;EACnC,MAAM,SAAS,eAAe,OAAO,MAAM;EAE3C,QAAQ,IAAI,GAAG,OAAO,GAAG,OAAO,KAAK,OAAO,IAAI,EAAE,IAAI,OAAO,QAAQ;CACvE;CAEA,MAAM,EAAE,IAAI,MAAM,SAAS,OAAO;CAClC,MAAM,cAAc,YAAY,GAAG,OAAO,KAAK,SAAS,KAAK;CAE7D,QAAQ,IAAI,EAAE;CACd,QAAQ,IAAI,OAAO,cAAc,OAAO,IAAI,WAAW,IAAI,OAAO,MAAM,WAAW,CAAC;AACtF"}
1
+ {"version":3,"file":"format-report.mjs","names":[],"sources":["C:/Work/Warlock.js/core/src/cli/commands/doctor/format-report.ts"],"sourcesContent":["import { colors } from \"@mongez/copper\";\nimport type { CheckStatus, DoctorReport } from \"./check.types\";\n\n/**\n * The glyph shown beside each check, keyed by status.\n */\nconst STATUS_SYMBOL: Record<CheckStatus, string> = {\n ok: \"✓\",\n warn: \"⚠\",\n fail: \"✗\",\n};\n\n/**\n * Colorize a status glyph. Kept separate from {@link STATUS_SYMBOL} so the\n * plain glyphs remain available for snapshot-friendly, color-free assertions.\n */\nfunction colorizeSymbol(status: CheckStatus): string {\n const symbol = STATUS_SYMBOL[status];\n\n switch (status) {\n case \"ok\":\n return colors.green(symbol);\n case \"warn\":\n return colors.yellow(symbol);\n case \"fail\":\n return colors.red(symbol);\n }\n}\n\n/**\n * Build the report body as an ordered list of plain (uncolored) lines:\n * one `<symbol> <name>: <detail>` line per check, a blank line, then a summary\n * line. Returned as strings (not printed) so the formatting is unit-testable.\n *\n * @param report The aggregated doctor report.\n * @returns The lines to print, top to bottom.\n */\nexport function formatReportLines(report: DoctorReport): string[] {\n const lines = report.results.map((result) => {\n return `${STATUS_SYMBOL[result.status]} ${result.name}: ${result.detail}`;\n });\n\n const { ok, warn, fail } = report.summary;\n\n lines.push(\"\");\n lines.push(`Summary: ${ok} ok, ${warn} warn, ${fail} fail`);\n\n return lines;\n}\n\n/**\n * Print the report to stdout with colored status glyphs and a colored summary\n * verdict. Thin wrapper over {@link formatReportLines} — the structured report\n * stays the source of truth for the exit code.\n *\n * @param report The aggregated doctor report.\n */\nexport function printReport(report: DoctorReport): void {\n for (const result of report.results) {\n const symbol = colorizeSymbol(result.status);\n\n console.log(`${symbol} ${colors.bold(result.name)}: ${result.detail}`);\n }\n\n const { ok, warn, fail } = report.summary;\n const summaryLine = `Summary: ${ok} ok, ${warn} warn, ${fail} fail`;\n\n console.log(\"\");\n console.log(report.hasFailures ? colors.red(summaryLine) : colors.green(summaryLine));\n}\n"],"mappings":";;;;;;AAMA,MAAM,gBAA6C;CACjD,IAAI;CACJ,MAAM;CACN,MAAM;AACR;;;;;AAMA,SAAS,eAAe,QAA6B;CACnD,MAAM,SAAS,cAAc;CAE7B,QAAQ,QAAR;EACE,KAAK,MACH,OAAO,OAAO,MAAM,MAAM;EAC5B,KAAK,QACH,OAAO,OAAO,OAAO,MAAM;EAC7B,KAAK,QACH,OAAO,OAAO,IAAI,MAAM;CAC5B;AACF;;;;;;;;AA8BA,SAAgB,YAAY,QAA4B;CACtD,KAAK,MAAM,UAAU,OAAO,SAAS;EACnC,MAAM,SAAS,eAAe,OAAO,MAAM;EAE3C,QAAQ,IAAI,GAAG,OAAO,GAAG,OAAO,KAAK,OAAO,IAAI,EAAE,IAAI,OAAO,QAAQ;CACvE;CAEA,MAAM,EAAE,IAAI,MAAM,SAAS,OAAO;CAClC,MAAM,cAAc,YAAY,GAAG,OAAO,KAAK,SAAS,KAAK;CAE7D,QAAQ,IAAI,EAAE;CACd,QAAQ,IAAI,OAAO,cAAc,OAAO,IAAI,WAAW,IAAI,OAAO,MAAM,WAAW,CAAC;AACtF"}
@@ -1,13 +1,16 @@
1
- //#region ../core/src/cli/commands/doctor/run-checks.ts
1
+ //#region core/src/cli/commands/doctor/run-checks.ts
2
2
  /**
3
3
  * Run one check defensively: a check that throws (or rejects) is recorded as a
4
4
  * `fail` carrying the error message, never re-thrown. This is what keeps
5
5
  * `doctor` itself crash-proof — a broken probe degrades to a failed check
6
6
  * instead of taking the whole command down.
7
+ *
8
+ * A check that returns `undefined` does not apply to this project; the caller
9
+ * drops it from the report rather than printing a line about nothing.
7
10
  */
8
- async function runOne(check) {
11
+ async function runOne(check, context) {
9
12
  try {
10
- return await check.run();
13
+ return await check.run(context);
11
14
  } catch (error) {
12
15
  const message = error instanceof Error ? error.message : String(error);
13
16
  return {
@@ -20,16 +23,22 @@ async function runOne(check) {
20
23
  /**
21
24
  * Run every check and aggregate the results into a {@link DoctorReport}.
22
25
  *
23
- * Checks run in registration order. Each is isolated via {@link runOne}, so one
24
- * throwing check cannot abort the others. The exit code is `1` if any check
26
+ * Checks run in registration order against ONE shared boot context, so the
27
+ * report can never contain two checks that disagree about the app because they
28
+ * inspected it at different moments. Each is isolated via {@link runOne}, so
29
+ * one throwing check cannot abort the others. The exit code is `1` if any check
25
30
  * resolved to `fail`, otherwise `0` — warnings never fail the command.
26
31
  *
27
32
  * @param checks The diagnostic probes to execute.
33
+ * @param context What the boot pass observed.
28
34
  * @returns The aggregated report (results + per-status counts + exit code).
29
35
  */
30
- async function runChecks(checks) {
36
+ async function runChecks(checks, context) {
31
37
  const results = [];
32
- for (const check of checks) results.push(await runOne(check));
38
+ for (const check of checks) {
39
+ const result = await runOne(check, context);
40
+ if (result) results.push(result);
41
+ }
33
42
  const summary = {
34
43
  ok: 0,
35
44
  warn: 0,