@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
@@ -0,0 +1,174 @@
1
+ import { rootPath, srcPath } from "../../utils/paths.mjs";
2
+ import "../../utils/index.mjs";
3
+ import { colors } from "@mongez/copper";
4
+ import { ensureDirectoryAsync, fileExistsAsync, getFileAsync, putFileAsync } from "@warlock.js/fs";
5
+
6
+ //#region core/src/generations/features/tailwind.feature.ts
7
+ /**
8
+ * The stylesheet entry, and the whole of Tailwind's configuration.
9
+ *
10
+ * Tailwind v4 is CSS-first: there is no `tailwind.config.js` and no `content`
11
+ * globs to keep in sync with the project layout — the engine discovers the
12
+ * templates that reach it through the bundler graph, and everything a v3 config
13
+ * held (`theme`, `plugins`, `darkMode`) is expressed in CSS beside the import.
14
+ * So this one file is the config, which is why the feature writes it rather
15
+ * than an `ejectConfig` entry: `ejectConfig` lands in `src/config/*.ts`, and a
16
+ * stylesheet that must sit in the bundler's path does not belong there.
17
+ */
18
+ const appCssStub = `@import "tailwindcss";
19
+
20
+ /*
21
+ Tailwind v4 configures itself from CSS — there is no tailwind.config.js.
22
+
23
+ Design tokens go in an @theme block, and each one becomes both a CSS variable
24
+ and a utility class:
25
+
26
+ @theme {
27
+ --color-brand: oklch(0.62 0.19 259);
28
+ --font-display: "Inter", sans-serif;
29
+ }
30
+
31
+ gives you \`bg-brand\`, \`text-brand\`, \`font-display\` and \`var(--color-brand)\`.
32
+
33
+ Plugins are imported here too — \`@plugin "@tailwindcss/typography";\` — and
34
+ your own non-utility CSS can simply follow this comment.
35
+ */
36
+ `;
37
+ /**
38
+ * PostCSS rather than a Vite config file, and deliberately at the project root.
39
+ *
40
+ * Vite discovers `postcss.config.mjs` from the project root on its own, in the
41
+ * dev server and in `vite build` alike, without the application owning a Vite
42
+ * config at all. That matters here: the only app-facing Vite plugin array in
43
+ * this framework is `webConnector({ plugins })`, which is wired into the DEV
44
+ * server exclusively — the client build composes its own plugin list from its
45
+ * caller. Registering `@tailwindcss/vite` there would produce styles in `dev`
46
+ * and silently drop them from a production build, which is a worse failure than
47
+ * any config file, because it only shows up after deploy.
48
+ *
49
+ * `.mjs` because a Warlock project's `package.json` is not guaranteed to set
50
+ * `"type": "module"`, and `export default` in a `.js` file would throw in a
51
+ * CommonJS project.
52
+ */
53
+ const postcssConfigStub = `/**
54
+ * Tailwind v4 runs as a PostCSS plugin. Vite loads this file automatically —
55
+ * in dev and in build — so no Vite configuration is required.
56
+ *
57
+ * The plugin lives in its own package in v4: \`tailwindcss\` is the engine,
58
+ * \`@tailwindcss/postcss\` is the adapter. Naming \`tailwindcss\` here directly is
59
+ * the v3 spelling and will not work.
60
+ */
61
+ export default {
62
+ plugins: {
63
+ "@tailwindcss/postcss": {},
64
+ },
65
+ };
66
+ `;
67
+ /**
68
+ * Every filename Vite/PostCSS will pick up from the project root.
69
+ *
70
+ * Checked as a set rather than just writing our own: two PostCSS configs in one
71
+ * directory is not a merge, it is a coin toss over which one loads, so a project
72
+ * that already has one gets instructions instead of a second file.
73
+ */
74
+ const POSTCSS_CONFIG_FILES = [
75
+ "postcss.config.mjs",
76
+ "postcss.config.js",
77
+ "postcss.config.cjs",
78
+ "postcss.config.ts",
79
+ "postcss.config.json",
80
+ ".postcssrc",
81
+ ".postcssrc.js",
82
+ ".postcssrc.json"
83
+ ];
84
+ /** The side-effect import that pulls the stylesheet into the bundler graph. */
85
+ const APP_CSS_IMPORT = "import \"./app.css\";";
86
+ /**
87
+ * Create `src/web/app.css` — the sentinel for "this feature already ran".
88
+ *
89
+ * Nothing in the project template creates this file (the scaffold ships a
90
+ * static `public/home.css` instead), so its presence means `add tailwind` has
91
+ * been here, and its contents may since have been edited into a real design
92
+ * system. It is never rewritten.
93
+ */
94
+ async function createStylesheet() {
95
+ const cssFile = srcPath("web/app.css");
96
+ if (await fileExistsAsync(cssFile)) {
97
+ console.log(`${colors.yellowBright("src/web/app.css")} already exists, skipping...`);
98
+ return false;
99
+ }
100
+ await ensureDirectoryAsync(srcPath("web"));
101
+ await putFileAsync(cssFile, appCssStub);
102
+ console.log(`${colors.green("✓")} Created src/web/app.css`);
103
+ return true;
104
+ }
105
+ /**
106
+ * Write `postcss.config.mjs`, unless the project already has a PostCSS config.
107
+ *
108
+ * An existing config is left completely alone. It is an app-owned build file
109
+ * that may already register autoprefixer, nesting, or a CSS-modules pass, and
110
+ * appending Tailwind to it by string surgery would be guessing at both its
111
+ * module format and its plugin order.
112
+ */
113
+ async function writePostcssConfig() {
114
+ for (const name of POSTCSS_CONFIG_FILES) {
115
+ if (!await fileExistsAsync(rootPath(name))) continue;
116
+ if ((await getFileAsync(rootPath(name)).catch(() => "")).includes("@tailwindcss/postcss")) console.log(`${colors.yellowBright(name)} already registers Tailwind, skipping...`);
117
+ else console.log(`${colors.yellowBright("!")} ${colors.yellowBright(name)} already exists — add Tailwind to it yourself:\n plugins: { "@tailwindcss/postcss": {} }\n Two PostCSS configs in one project is undefined behaviour, so this feature did not write a second one.`);
118
+ return;
119
+ }
120
+ await putFileAsync(rootPath("postcss.config.mjs"), postcssConfigStub);
121
+ console.log(`${colors.green("✓")} Created postcss.config.mjs`);
122
+ }
123
+ /**
124
+ * Import the stylesheet from `src/web/root.tsx`.
125
+ *
126
+ * The root is the one module every SSR page renders through, so importing the
127
+ * stylesheet there is what puts it in the client bundle for every route.
128
+ *
129
+ * `root.tsx` is guaranteed to exist by the time this runs: `requires: ["web"]`
130
+ * makes the add command resolve `web` ahead of `tailwind` and run its
131
+ * `onExecuting` first, and that is what creates the file. The check below is
132
+ * therefore for a root a human has since moved or deleted — a case worth a
133
+ * printed instruction, not a failure.
134
+ */
135
+ async function importStylesheetFromRoot() {
136
+ const rootFile = srcPath("web/root.tsx");
137
+ if (!await fileExistsAsync(rootFile)) {
138
+ console.log(`${colors.yellowBright("!")} ${colors.yellowBright("src/web/root.tsx")} not found — add ${colors.yellowBright(APP_CSS_IMPORT)} to your application root yourself.\n Until the stylesheet is imported from a module the bundler reaches, no Tailwind CSS is emitted.`);
139
+ return;
140
+ }
141
+ const current = await getFileAsync(rootFile);
142
+ if (/import\s+["'].*app\.css["']/.test(current)) {
143
+ console.log(`${colors.yellowBright("src/web/root.tsx")} already imports app.css, skipping...`);
144
+ return;
145
+ }
146
+ await putFileAsync(rootFile, `${APP_CSS_IMPORT}\n${current}`);
147
+ console.log(`${colors.green("✓")} Imported app.css in src/web/root.tsx`);
148
+ }
149
+ /**
150
+ * Wire Tailwind v4 into the page layer.
151
+ *
152
+ * Three files, none of which needs `node_modules` to be populated: on the
153
+ * `create-warlock` path this runs under `--no-install`, so the dependencies
154
+ * declared below are only recorded in `package.json` and nothing here may
155
+ * import, resolve, or execute Tailwind itself.
156
+ */
157
+ async function completeTailwindInstallation(_options) {
158
+ await createStylesheet();
159
+ await writePostcssConfig();
160
+ await importStylesheetFromRoot();
161
+ }
162
+ const tailwindFeature = {
163
+ description: "Installs Tailwind CSS v4 for the SSR page layer. Creates src/web/app.css (the CSS-first config — v4 has no tailwind.config.js), imports it from src/web/root.tsx, and registers the engine through postcss.config.mjs, which Vite loads in dev and build alike.",
164
+ requires: ["web"],
165
+ devDependencies: {
166
+ tailwindcss: "^4.1.16",
167
+ "@tailwindcss/postcss": "^4.1.16"
168
+ },
169
+ onExecuting: completeTailwindInstallation
170
+ };
171
+
172
+ //#endregion
173
+ export { tailwindFeature };
174
+ //# sourceMappingURL=tailwind.feature.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tailwind.feature.mjs","names":[],"sources":["C:/Work/Warlock.js/core/src/generations/features/tailwind.feature.ts"],"sourcesContent":["import { colors } from \"@mongez/copper\";\nimport {\n ensureDirectoryAsync,\n fileExistsAsync,\n getFileAsync,\n putFileAsync,\n} from \"@warlock.js/fs\";\nimport { CommandActionData } from \"../../commands/types\";\nimport { rootPath, srcPath } from \"../../utils\";\nimport { FeatureDefinition } from \"./types\";\n\n/**\n * The stylesheet entry, and the whole of Tailwind's configuration.\n *\n * Tailwind v4 is CSS-first: there is no `tailwind.config.js` and no `content`\n * globs to keep in sync with the project layout — the engine discovers the\n * templates that reach it through the bundler graph, and everything a v3 config\n * held (`theme`, `plugins`, `darkMode`) is expressed in CSS beside the import.\n * So this one file is the config, which is why the feature writes it rather\n * than an `ejectConfig` entry: `ejectConfig` lands in `src/config/*.ts`, and a\n * stylesheet that must sit in the bundler's path does not belong there.\n */\nconst appCssStub = `@import \"tailwindcss\";\n\n/*\n Tailwind v4 configures itself from CSS — there is no tailwind.config.js.\n\n Design tokens go in an @theme block, and each one becomes both a CSS variable\n and a utility class:\n\n @theme {\n --color-brand: oklch(0.62 0.19 259);\n --font-display: \"Inter\", sans-serif;\n }\n\n gives you \\`bg-brand\\`, \\`text-brand\\`, \\`font-display\\` and \\`var(--color-brand)\\`.\n\n Plugins are imported here too — \\`@plugin \"@tailwindcss/typography\";\\` — and\n your own non-utility CSS can simply follow this comment.\n*/\n`;\n\n/**\n * PostCSS rather than a Vite config file, and deliberately at the project root.\n *\n * Vite discovers `postcss.config.mjs` from the project root on its own, in the\n * dev server and in `vite build` alike, without the application owning a Vite\n * config at all. That matters here: the only app-facing Vite plugin array in\n * this framework is `webConnector({ plugins })`, which is wired into the DEV\n * server exclusively — the client build composes its own plugin list from its\n * caller. Registering `@tailwindcss/vite` there would produce styles in `dev`\n * and silently drop them from a production build, which is a worse failure than\n * any config file, because it only shows up after deploy.\n *\n * `.mjs` because a Warlock project's `package.json` is not guaranteed to set\n * `\"type\": \"module\"`, and `export default` in a `.js` file would throw in a\n * CommonJS project.\n */\nconst postcssConfigStub = `/**\n * Tailwind v4 runs as a PostCSS plugin. Vite loads this file automatically —\n * in dev and in build — so no Vite configuration is required.\n *\n * The plugin lives in its own package in v4: \\`tailwindcss\\` is the engine,\n * \\`@tailwindcss/postcss\\` is the adapter. Naming \\`tailwindcss\\` here directly is\n * the v3 spelling and will not work.\n */\nexport default {\n plugins: {\n \"@tailwindcss/postcss\": {},\n },\n};\n`;\n\n/**\n * Every filename Vite/PostCSS will pick up from the project root.\n *\n * Checked as a set rather than just writing our own: two PostCSS configs in one\n * directory is not a merge, it is a coin toss over which one loads, so a project\n * that already has one gets instructions instead of a second file.\n */\nconst POSTCSS_CONFIG_FILES = [\n \"postcss.config.mjs\",\n \"postcss.config.js\",\n \"postcss.config.cjs\",\n \"postcss.config.ts\",\n \"postcss.config.json\",\n \".postcssrc\",\n \".postcssrc.js\",\n \".postcssrc.json\",\n];\n\n/** The side-effect import that pulls the stylesheet into the bundler graph. */\nconst APP_CSS_IMPORT = 'import \"./app.css\";';\n\n/**\n * Create `src/web/app.css` — the sentinel for \"this feature already ran\".\n *\n * Nothing in the project template creates this file (the scaffold ships a\n * static `public/home.css` instead), so its presence means `add tailwind` has\n * been here, and its contents may since have been edited into a real design\n * system. It is never rewritten.\n */\nasync function createStylesheet(): Promise<boolean> {\n const cssFile = srcPath(\"web/app.css\");\n\n if (await fileExistsAsync(cssFile)) {\n console.log(`${colors.yellowBright(\"src/web/app.css\")} already exists, skipping...`);\n\n return false;\n }\n\n await ensureDirectoryAsync(srcPath(\"web\"));\n await putFileAsync(cssFile, appCssStub);\n console.log(`${colors.green(\"✓\")} Created src/web/app.css`);\n\n return true;\n}\n\n/**\n * Write `postcss.config.mjs`, unless the project already has a PostCSS config.\n *\n * An existing config is left completely alone. It is an app-owned build file\n * that may already register autoprefixer, nesting, or a CSS-modules pass, and\n * appending Tailwind to it by string surgery would be guessing at both its\n * module format and its plugin order.\n */\nasync function writePostcssConfig(): Promise<void> {\n for (const name of POSTCSS_CONFIG_FILES) {\n if (!(await fileExistsAsync(rootPath(name)))) continue;\n\n const current = await getFileAsync(rootPath(name)).catch(() => \"\");\n\n if (current.includes(\"@tailwindcss/postcss\")) {\n console.log(`${colors.yellowBright(name)} already registers Tailwind, skipping...`);\n } else {\n console.log(\n `${colors.yellowBright(\"!\")} ${colors.yellowBright(name)} already exists — add Tailwind to it yourself:\\n` +\n ` plugins: { \"@tailwindcss/postcss\": {} }\\n` +\n \" Two PostCSS configs in one project is undefined behaviour, so this feature did not write a second one.\",\n );\n }\n\n return;\n }\n\n await putFileAsync(rootPath(\"postcss.config.mjs\"), postcssConfigStub);\n console.log(`${colors.green(\"✓\")} Created postcss.config.mjs`);\n}\n\n/**\n * Import the stylesheet from `src/web/root.tsx`.\n *\n * The root is the one module every SSR page renders through, so importing the\n * stylesheet there is what puts it in the client bundle for every route.\n *\n * `root.tsx` is guaranteed to exist by the time this runs: `requires: [\"web\"]`\n * makes the add command resolve `web` ahead of `tailwind` and run its\n * `onExecuting` first, and that is what creates the file. The check below is\n * therefore for a root a human has since moved or deleted — a case worth a\n * printed instruction, not a failure.\n */\nasync function importStylesheetFromRoot(): Promise<void> {\n const rootFile = srcPath(\"web/root.tsx\");\n\n if (!(await fileExistsAsync(rootFile))) {\n console.log(\n `${colors.yellowBright(\"!\")} ${colors.yellowBright(\"src/web/root.tsx\")} not found — ` +\n `add ${colors.yellowBright(APP_CSS_IMPORT)} to your application root yourself.\\n` +\n \" Until the stylesheet is imported from a module the bundler reaches, no Tailwind CSS is emitted.\",\n );\n\n return;\n }\n\n const current = await getFileAsync(rootFile);\n\n // Matches the import whichever quote style and specifier the file uses, so a\n // re-run against a hand-edited root does not stack a second copy.\n if (/import\\s+[\"'].*app\\.css[\"']/.test(current)) {\n console.log(`${colors.yellowBright(\"src/web/root.tsx\")} already imports app.css, skipping...`);\n\n return;\n }\n\n // FIRST line, above the framework imports. A side-effect CSS import has no\n // binding to order against, and putting it at the top keeps it from being\n // swept away by an import sorter that only ranks module specifiers.\n await putFileAsync(rootFile, `${APP_CSS_IMPORT}\\n${current}`);\n console.log(`${colors.green(\"✓\")} Imported app.css in src/web/root.tsx`);\n}\n\n/**\n * Wire Tailwind v4 into the page layer.\n *\n * Three files, none of which needs `node_modules` to be populated: on the\n * `create-warlock` path this runs under `--no-install`, so the dependencies\n * declared below are only recorded in `package.json` and nothing here may\n * import, resolve, or execute Tailwind itself.\n */\nasync function completeTailwindInstallation(_options: CommandActionData) {\n await createStylesheet();\n await writePostcssConfig();\n await importStylesheetFromRoot();\n}\n\nexport const tailwindFeature: FeatureDefinition = {\n description:\n \"Installs Tailwind CSS v4 for the SSR page layer. Creates src/web/app.css (the CSS-first config — v4 has no tailwind.config.js), imports it from src/web/root.tsx, and registers the engine through postcss.config.mjs, which Vite loads in dev and build alike.\",\n // `web` owns root.tsx and the CSS pipeline that serves this stylesheet.\n // Requiring it also fixes the order: the add command resolves requirements\n // depth-first, so `web` scaffolds src/web before this feature writes into it.\n requires: [\"web\"],\n devDependencies: {\n // Build-time only, both of them — Tailwind compiles to a plain stylesheet\n // and nothing it ships is imported at runtime.\n tailwindcss: \"^4.1.16\",\n // The engine and its PostCSS adapter are separate packages in v4 and are\n // released in lockstep; keep these two ranges identical.\n \"@tailwindcss/postcss\": \"^4.1.16\",\n },\n onExecuting: completeTailwindInstallation,\n};\n"],"mappings":";;;;;;;;;;;;;;;;;AAsBA,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCnB,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;AAsB1B,MAAM,uBAAuB;CAC3B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;;AAGA,MAAM,iBAAiB;;;;;;;;;AAUvB,eAAe,mBAAqC;CAClD,MAAM,UAAU,QAAQ,aAAa;CAErC,IAAI,MAAM,gBAAgB,OAAO,GAAG;EAClC,QAAQ,IAAI,GAAG,OAAO,aAAa,iBAAiB,EAAE,6BAA6B;EAEnF,OAAO;CACT;CAEA,MAAM,qBAAqB,QAAQ,KAAK,CAAC;CACzC,MAAM,aAAa,SAAS,UAAU;CACtC,QAAQ,IAAI,GAAG,OAAO,MAAM,GAAG,EAAE,yBAAyB;CAE1D,OAAO;AACT;;;;;;;;;AAUA,eAAe,qBAAoC;CACjD,KAAK,MAAM,QAAQ,sBAAsB;EACvC,IAAI,CAAE,MAAM,gBAAgB,SAAS,IAAI,CAAC,GAAI;EAI9C,KAAI,MAFkB,aAAa,SAAS,IAAI,CAAC,EAAE,YAAY,EAAE,GAErD,SAAS,sBAAsB,GACzC,QAAQ,IAAI,GAAG,OAAO,aAAa,IAAI,EAAE,yCAAyC;OAElF,QAAQ,IACN,GAAG,OAAO,aAAa,GAAG,EAAE,GAAG,OAAO,aAAa,IAAI,EAAE,oMAG3D;EAGF;CACF;CAEA,MAAM,aAAa,SAAS,oBAAoB,GAAG,iBAAiB;CACpE,QAAQ,IAAI,GAAG,OAAO,MAAM,GAAG,EAAE,4BAA4B;AAC/D;;;;;;;;;;;;;AAcA,eAAe,2BAA0C;CACvD,MAAM,WAAW,QAAQ,cAAc;CAEvC,IAAI,CAAE,MAAM,gBAAgB,QAAQ,GAAI;EACtC,QAAQ,IACN,GAAG,OAAO,aAAa,GAAG,EAAE,GAAG,OAAO,aAAa,kBAAkB,EAAE,mBAC9D,OAAO,aAAa,cAAc,EAAE,uIAE/C;EAEA;CACF;CAEA,MAAM,UAAU,MAAM,aAAa,QAAQ;CAI3C,IAAI,8BAA8B,KAAK,OAAO,GAAG;EAC/C,QAAQ,IAAI,GAAG,OAAO,aAAa,kBAAkB,EAAE,sCAAsC;EAE7F;CACF;CAKA,MAAM,aAAa,UAAU,GAAG,eAAe,IAAI,SAAS;CAC5D,QAAQ,IAAI,GAAG,OAAO,MAAM,GAAG,EAAE,sCAAsC;AACzE;;;;;;;;;AAUA,eAAe,6BAA6B,UAA6B;CACvE,MAAM,iBAAiB;CACvB,MAAM,mBAAmB;CACzB,MAAM,yBAAyB;AACjC;AAEA,MAAa,kBAAqC;CAChD,aACE;CAIF,UAAU,CAAC,KAAK;CAChB,iBAAiB;EAGf,aAAa;EAGb,wBAAwB;CAC1B;CACA,aAAa;AACf"}
@@ -0,0 +1,96 @@
1
+ import { rootPath, srcPath } from "../../utils/paths.mjs";
2
+ import "../../utils/index.mjs";
3
+ import { colors } from "@mongez/copper";
4
+ import { fileExistsAsync, putFileAsync } from "@warlock.js/fs";
5
+
6
+ //#region core/src/generations/features/test.feature.ts
7
+ async function completeTestInstallation(options) {
8
+ const testGlobalSetupPath = srcPath("test-global-setup.ts");
9
+ if (!await fileExistsAsync(testGlobalSetupPath)) {
10
+ await putFileAsync(testGlobalSetupPath, `/**
11
+ * Global Test Setup
12
+ *
13
+ * Runs ONCE before all test workers.
14
+ * Starts the HTTP server for integration tests.
15
+ */
16
+ import { startHttpTestServer, stopHttpTestServer } from "@warlock.js/core/tests";
17
+
18
+ export async function setup() {
19
+ await startHttpTestServer();
20
+ }
21
+
22
+ export async function teardown() {
23
+ await stopHttpTestServer();
24
+ }
25
+ `);
26
+ console.log(`${colors.green("✓")} Created src/test-global-setup.ts`);
27
+ }
28
+ const testSetupPath = srcPath("test-setup.ts");
29
+ if (!await fileExistsAsync(testSetupPath)) {
30
+ await putFileAsync(testSetupPath, `/**
31
+ * Test Setup - runs before EVERY test file
32
+ *
33
+ * Vitest runs setupFiles before each test file and rebuilds the module
34
+ * registry with it, so this pair boots and closes the test runtime once per
35
+ * test file.
36
+ *
37
+ * setupTest() is called with no options on purpose: an explicit connectors
38
+ * value outranks tests.connectors from src/config/tests.ts, so passing one
39
+ * here would erase your project config. Omitting it leaves the config in
40
+ * charge.
41
+ *
42
+ * afterAll(teardownTest) is the other half of the pair: whoever calls
43
+ * setupTest() owns closing it in the same runtime context.
44
+ */
45
+ import { setupTest, teardownTest } from "@warlock.js/core/tests";
46
+ import { afterAll } from "vitest";
47
+
48
+ await setupTest();
49
+
50
+ afterAll(teardownTest);
51
+ `);
52
+ console.log(`${colors.green("✓")} Created src/test-setup.ts`);
53
+ }
54
+ const viteConfigPath = rootPath("vite.config.ts");
55
+ if (!await fileExistsAsync(viteConfigPath)) {
56
+ await putFileAsync(viteConfigPath, `import { lowerStage3Decorators } from "@warlock.js/core/vite";
57
+ import mongezVite from "@mongez/vite";
58
+ import { defineConfig } from "vitest/config";
59
+
60
+ export default defineConfig({
61
+ // lowerStage3Decorators MUST come first: it lowers native (@RegisterModel, …)
62
+ // decorators with esbuild before oxc / the SSR rewrite can mangle them, so
63
+ // decorated Cascade models load under Vitest.
64
+ plugins: [lowerStage3Decorators(), mongezVite()],
65
+ test: {
66
+ globalSetup: "./src/test-global-setup.ts", // HTTP server - runs once
67
+ setupFiles: ["./src/test-setup.ts"], // DB/cache - runs per test file
68
+ environment: "node",
69
+ globals: false,
70
+ include: ["src/app/**/*.test.ts"],
71
+ },
72
+ });
73
+ `);
74
+ console.log(`${colors.green("✓")} Created vite.config.ts`);
75
+ }
76
+ }
77
+ const testFeature = {
78
+ description: "Installs warlock test for testing",
79
+ onExecuting: completeTestInstallation,
80
+ script: {
81
+ test: "vitest run",
82
+ "test:coverage": "vitest run --coverage",
83
+ "test:ui": "vitest --ui",
84
+ "test:watch": "vitest --watch"
85
+ },
86
+ devDependencies: {
87
+ "@mongez/vite": "^2.0.4",
88
+ vite: "^8.0.16",
89
+ vitest: "^4.1.8",
90
+ "@vitest/coverage-v8": "^4.1.8"
91
+ }
92
+ };
93
+
94
+ //#endregion
95
+ export { testFeature };
96
+ //# sourceMappingURL=test.feature.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.feature.mjs","names":[],"sources":["C:/Work/Warlock.js/core/src/generations/features/test.feature.ts"],"sourcesContent":["import { colors } from \"@mongez/copper\";\r\nimport { fileExistsAsync, putFileAsync } from \"@warlock.js/fs\";\r\nimport { CommandActionData } from \"../../commands/types\";\r\nimport { rootPath, srcPath } from \"../../utils\";\r\nimport { FeatureDefinition } from \"./types\";\r\n\r\nasync function completeTestInstallation(options: CommandActionData) {\r\n // Create test-global-setup.ts (runs once before all tests)\r\n const testGlobalSetupPath = srcPath(\"test-global-setup.ts\");\r\n const testGlobalSetupExists = await fileExistsAsync(testGlobalSetupPath);\r\n\r\n if (!testGlobalSetupExists) {\r\n await putFileAsync(\r\n testGlobalSetupPath,\r\n `/**\r\n * Global Test Setup\r\n *\r\n * Runs ONCE before all test workers.\r\n * Starts the HTTP server for integration tests.\r\n */\r\nimport { startHttpTestServer, stopHttpTestServer } from \"@warlock.js/core/tests\";\r\n\r\nexport async function setup() {\r\n await startHttpTestServer();\r\n}\r\n\r\nexport async function teardown() {\r\n await stopHttpTestServer();\r\n}\r\n`,\r\n );\r\n console.log(`${colors.green(\"✓\")} Created src/test-global-setup.ts`);\r\n }\r\n\r\n // Create test-setup.ts (runs before EVERY test file)\r\n const testSetupPath = srcPath(\"test-setup.ts\");\r\n const testSetupExists = await fileExistsAsync(testSetupPath);\r\n\r\n if (!testSetupExists) {\r\n await putFileAsync(\r\n testSetupPath,\r\n `/**\r\n * Test Setup - runs before EVERY test file\r\n *\r\n * Vitest runs setupFiles before each test file and rebuilds the module\r\n * registry with it, so this pair boots and closes the test runtime once per\r\n * test file.\r\n *\r\n * setupTest() is called with no options on purpose: an explicit connectors\r\n * value outranks tests.connectors from src/config/tests.ts, so passing one\r\n * here would erase your project config. Omitting it leaves the config in\r\n * charge.\r\n *\r\n * afterAll(teardownTest) is the other half of the pair: whoever calls\r\n * setupTest() owns closing it in the same runtime context.\r\n */\r\nimport { setupTest, teardownTest } from \"@warlock.js/core/tests\";\r\nimport { afterAll } from \"vitest\";\r\n\r\nawait setupTest();\r\n\r\nafterAll(teardownTest);\r\n`,\r\n );\r\n console.log(`${colors.green(\"✓\")} Created src/test-setup.ts`);\r\n }\r\n\r\n // Create vite.config.ts\r\n const viteConfigPath = rootPath(\"vite.config.ts\");\r\n const viteConfigExists = await fileExistsAsync(viteConfigPath);\r\n\r\n if (!viteConfigExists) {\r\n await putFileAsync(\r\n viteConfigPath,\r\n `import { lowerStage3Decorators } from \"@warlock.js/core/vite\";\r\nimport mongezVite from \"@mongez/vite\";\r\nimport { defineConfig } from \"vitest/config\";\r\n\r\nexport default defineConfig({\r\n // lowerStage3Decorators MUST come first: it lowers native (@RegisterModel, …)\r\n // decorators with esbuild before oxc / the SSR rewrite can mangle them, so\r\n // decorated Cascade models load under Vitest.\r\n plugins: [lowerStage3Decorators(), mongezVite()],\r\n test: {\r\n globalSetup: \"./src/test-global-setup.ts\", // HTTP server - runs once\r\n setupFiles: [\"./src/test-setup.ts\"], // DB/cache - runs per test file\r\n environment: \"node\",\r\n globals: false,\r\n include: [\"src/app/**/*.test.ts\"],\r\n },\r\n});\r\n`,\r\n );\r\n console.log(`${colors.green(\"✓\")} Created vite.config.ts`);\r\n }\r\n}\r\n\r\nexport const testFeature: FeatureDefinition = {\r\n description: \"Installs warlock test for testing\",\r\n onExecuting: completeTestInstallation,\r\n script: {\r\n test: \"vitest run\",\r\n \"test:coverage\": \"vitest run --coverage\",\r\n \"test:ui\": \"vitest --ui\",\r\n \"test:watch\": \"vitest --watch\",\r\n },\r\n devDependencies: {\r\n \"@mongez/vite\": \"^2.0.4\",\r\n vite: \"^8.0.16\",\r\n vitest: \"^4.1.8\",\r\n \"@vitest/coverage-v8\": \"^4.1.8\",\r\n },\r\n};\r\n"],"mappings":";;;;;;AAMA,eAAe,yBAAyB,SAA4B;CAElE,MAAM,sBAAsB,QAAQ,sBAAsB;CAG1D,IAAI,CAAC,MAF+B,gBAAgB,mBAAmB,GAE3C;EAC1B,MAAM,aACJ,qBACA;;;;;;;;;;;;;;;CAgBF;EACA,QAAQ,IAAI,GAAG,OAAO,MAAM,GAAG,EAAE,kCAAkC;CACrE;CAGA,MAAM,gBAAgB,QAAQ,eAAe;CAG7C,IAAI,CAAC,MAFyB,gBAAgB,aAAa,GAErC;EACpB,MAAM,aACJ,eACA;;;;;;;;;;;;;;;;;;;;;CAsBF;EACA,QAAQ,IAAI,GAAG,OAAO,MAAM,GAAG,EAAE,2BAA2B;CAC9D;CAGA,MAAM,iBAAiB,SAAS,gBAAgB;CAGhD,IAAI,CAAC,MAF0B,gBAAgB,cAAc,GAEtC;EACrB,MAAM,aACJ,gBACA;;;;;;;;;;;;;;;;;CAkBF;EACA,QAAQ,IAAI,GAAG,OAAO,MAAM,GAAG,EAAE,wBAAwB;CAC3D;AACF;AAEA,MAAa,cAAiC;CAC5C,aAAa;CACb,aAAa;CACb,QAAQ;EACN,MAAM;EACN,iBAAiB;EACjB,WAAW;EACX,cAAc;CAChB;CACA,iBAAiB;EACf,gBAAgB;EAChB,MAAM;EACN,QAAQ;EACR,uBAAuB;CACzB;AACF"}
@@ -0,0 +1,14 @@
1
+ //#region core/src/generations/features/types.ts
2
+ /**
3
+ * Internal placeholder for an @warlock.js dependency whose concrete version
4
+ * comes from the installed Core package at command execution time.
5
+ *
6
+ * This is deliberately not a valid package-manager range. If a future code
7
+ * path forgets to resolve it, installation fails loudly instead of silently
8
+ * falling back to a stale framework major copied into a feature definition.
9
+ */
10
+ const INSTALLED_WARLOCK_VERSION = "__INSTALLED_WARLOCK_VERSION__";
11
+
12
+ //#endregion
13
+ export { INSTALLED_WARLOCK_VERSION };
14
+ //# sourceMappingURL=types.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.mjs","names":[],"sources":["C:/Work/Warlock.js/core/src/generations/features/types.ts"],"sourcesContent":["import { CommandActionData } from \"../../commands/types\";\n\n/**\n * Internal placeholder for an @warlock.js dependency whose concrete version\n * comes from the installed Core package at command execution time.\n *\n * This is deliberately not a valid package-manager range. If a future code\n * path forgets to resolve it, installation fails loudly instead of silently\n * falling back to a stale framework major copied into a feature definition.\n */\nexport const INSTALLED_WARLOCK_VERSION = \"__INSTALLED_WARLOCK_VERSION__\";\n\r\n/**\r\n * One entry in the feature registry.\r\n *\r\n * Every feature owns a module of its own that exports a single value of this\r\n * shape, with its `onExecuting` body beside it; `features/index.ts` is only the\r\n * ordered index that collects them.\r\n */\r\nexport type FeatureDefinition = {\r\n dependencies?: Record<string, string>;\r\n devDependencies?: Record<string, string>;\r\n description: string;\r\n requires?: string[];\r\n script?: Record<string, string>;\r\n onExecuting?: (options: CommandActionData) => Promise<any>;\r\n ejectConfig?: {\r\n content: string;\r\n name: string;\r\n };\r\n};\r\n"],"mappings":";;;;;;;;;AAUA,MAAa,4BAA4B"}
@@ -0,0 +1,187 @@
1
+ import { rootPath, srcPath } from "../../utils/paths.mjs";
2
+ import "../../utils/index.mjs";
3
+ import { webContactControllerStub, webContactRoutesStub, webHomePageStub, webRootStub } from "../stubs.mjs";
4
+ import { INSTALLED_WARLOCK_VERSION } from "./types.mjs";
5
+ import { colors } from "@mongez/copper";
6
+ import { ensureDirectoryAsync, fileExistsAsync, getFileAsync, putFileAsync } from "@warlock.js/fs";
7
+
8
+ //#region core/src/generations/features/web.feature.ts
9
+ /**
10
+ * Register the WebConnector in `warlock.config.ts`, and ONLY there.
11
+ *
12
+ * It belongs to the config array or to app code, never both. Both halves are
13
+ * registered before app code loads — the CLI preloader in dev, the generated
14
+ * entry in production — so also calling `connectorsManager.register(...)` in
15
+ * `src/app/main.ts` boots the connector twice and installs every page route
16
+ * twice. That surfaces at PRODUCTION boot as `Route name "..." is already
17
+ * taken`, because pages and API routes share one route-name namespace.
18
+ *
19
+ * The config array is the half to prefer: `warlock build` reads the same array
20
+ * to drain each connector's build contribution, so "built for" and "boots with"
21
+ * cannot drift.
22
+ *
23
+ * String surgery rather than a TypeScript parse: `warlock.config.ts` is an
24
+ * app-owned file that may carry any formatting, and a parse-and-print would
25
+ * reformat the parts we did not come to change.
26
+ */
27
+ async function registerWebConnector() {
28
+ const configPath = rootPath("warlock.config.ts");
29
+ if (!await fileExistsAsync(configPath)) {
30
+ console.log(`${colors.yellowBright("warlock.config.ts")} not found — add this yourself:\n import { webConnector } from "@warlock.js/web/connector";\n export default defineConfig({ connectors: [webConnector()] });`);
31
+ return;
32
+ }
33
+ const current = await getFileAsync(configPath);
34
+ if (current.includes("webConnector")) {
35
+ console.log(`${colors.yellowBright("webConnector")} already registered, skipping...`);
36
+ return;
37
+ }
38
+ const importLine = "import { webConnector } from \"@warlock.js/web/connector\";";
39
+ let next = current.includes(importLine) ? current : `${importLine}\n${current}`;
40
+ if (/connectors:\s*\[/.test(next)) next = next.replace(/connectors:\s*\[/, "connectors: [webConnector(),");
41
+ else if (next.includes("defineConfig({")) next = next.replace("defineConfig({", "defineConfig({\n connectors: [webConnector()],");
42
+ else {
43
+ console.log(`${colors.yellowBright("warlock.config.ts")} has no recognisable defineConfig({...}) — add \`connectors: [webConnector()]\` yourself.`);
44
+ return;
45
+ }
46
+ await putFileAsync(configPath, next);
47
+ console.log(`${colors.green("✓")} Registered webConnector in warlock.config.ts`);
48
+ }
49
+ /**
50
+ * The app routes file the project template registers `GET /` in. Only this one
51
+ * path is inspected: `warlock add web` is not a codebase-wide route auditor, and
52
+ * a project that keeps its routes elsewhere lands on the `absent` outcome below,
53
+ * which writes the page exactly as before.
54
+ */
55
+ const APP_ROUTES_FILE = "app/shared/routes.ts";
56
+ /**
57
+ * A TOP-LEVEL `router.get("/", ...)` — anchored at column 0 on purpose.
58
+ *
59
+ * Routes nested in a `router.group({ prefix: "/x" }, ...)` are indented by every
60
+ * formatter this codebase runs, and their real path is `/x`, not `/`. Anchoring
61
+ * is what keeps the notifications feature's own `router.get("/", ...)` (inside
62
+ * the `/notifications` group) from reading as a homepage collision.
63
+ *
64
+ * Only the path literal is captured. The handler — a bare identifier in the
65
+ * template, but possibly an inline arrow spanning lines — is never matched, so
66
+ * the rewrite below cannot damage it.
67
+ */
68
+ const TOP_LEVEL_ROOT_GET = /^router\s*\.\s*get\(\s*(["'`])\/\1/gm;
69
+ /**
70
+ * Whether `/welcome` is already spoken for, so relocating onto it would trade
71
+ * one duplicate-route 500 for another.
72
+ */
73
+ const TOP_LEVEL_WELCOME_GET = /^router\s*\.\s*get\(\s*(["'`])\/welcome\1/m;
74
+ /**
75
+ * Make room for a page that declares `route = "/"`.
76
+ *
77
+ * The project template registers `router.get("/", homePageController)` and the
78
+ * page stub declares `route = "/"`. Fastify rejects the second registration
79
+ * (`Method 'GET' already declared for route '/'`) and the homepage 500s at
80
+ * request time — so `warlock add web` cannot just write the page and hope.
81
+ *
82
+ * Of the three ways out, this RELOCATES the JSON route to `/welcome` rather than
83
+ * deleting it or refusing to scaffold:
84
+ *
85
+ * - Deleting the controller is what the scaffolder's own `react` feature does,
86
+ * but it may do that: it owns the file it is deleting, seconds after writing
87
+ * it. `warlock add web` runs against a project a human has been living in, and
88
+ * silently unlinking their code is not a thing an `add` command gets to do.
89
+ * - Writing the page anyway and printing a warning ships a project whose
90
+ * homepage 500s. A warning above a broken app is still a broken app.
91
+ * - Relocating keeps BOTH surfaces working: the React homepage takes `/`, the
92
+ * JSON welcome answers at `/welcome`, and no line of user code disappears.
93
+ *
94
+ * Only the exact top-level shape is rewritten, and only the path literal inside
95
+ * it. Anything else that claims `/` is reported and left completely alone — we
96
+ * do not guess at code we cannot recognise.
97
+ */
98
+ async function relocateConflictingHomeRoute() {
99
+ const routesPath = srcPath(APP_ROUTES_FILE);
100
+ if (!await fileExistsAsync(routesPath)) return { outcome: "absent" };
101
+ let current;
102
+ try {
103
+ current = await getFileAsync(routesPath);
104
+ } catch (error) {
105
+ return {
106
+ outcome: "failed",
107
+ reason: `could not be read (${error.message})`
108
+ };
109
+ }
110
+ const matches = current.match(TOP_LEVEL_ROOT_GET) ?? [];
111
+ if (matches.length === 0) return { outcome: "absent" };
112
+ if (matches.length > 1) return {
113
+ outcome: "conflict",
114
+ reason: `declares ${matches.length} top-level GET "/" routes`
115
+ };
116
+ if (TOP_LEVEL_WELCOME_GET.test(current)) return {
117
+ outcome: "conflict",
118
+ reason: "already declares GET \"/welcome\", so the usual relocation target is taken"
119
+ };
120
+ const next = current.replace(TOP_LEVEL_ROOT_GET, (match, quote) => match.replace(`${quote}/${quote}`, `${quote}/welcome${quote}`));
121
+ if (next === current) return {
122
+ outcome: "conflict",
123
+ reason: "its GET \"/\" route could not be rewritten"
124
+ };
125
+ try {
126
+ await putFileAsync(routesPath, next);
127
+ } catch (error) {
128
+ return {
129
+ outcome: "failed",
130
+ reason: `could not be written (${error.message})`
131
+ };
132
+ }
133
+ return { outcome: "relocated" };
134
+ }
135
+ /**
136
+ * Scaffold the smallest page layer that renders, and register the connector.
137
+ *
138
+ * `src/web/root.tsx` is the sentinel for "already scaffolded" — the framework
139
+ * ships a default root, so its presence means a human has been here.
140
+ */
141
+ async function completeWebInstallation(_options) {
142
+ const rootFile = srcPath("web/root.tsx");
143
+ if (await fileExistsAsync(rootFile)) console.log(`${colors.yellowBright("src/web")} already scaffolded, skipping...`);
144
+ else {
145
+ await ensureDirectoryAsync(srcPath("web"));
146
+ await putFileAsync(rootFile, webRootStub);
147
+ console.log(`${colors.green("✓")} Created src/web/root.tsx`);
148
+ const collision = await relocateConflictingHomeRoute();
149
+ if (collision.outcome === "relocated") console.log(`${colors.green("✓")} Moved the existing ${colors.yellowBright("GET \"/\"")} route to ${colors.yellowBright("\"/welcome\"")} in ${colors.yellowBright(`src/${APP_ROUTES_FILE}`)} — the new page owns \`/\` now, and the JSON welcome route still answers at /welcome.`);
150
+ if (collision.outcome === "conflict" || collision.outcome === "failed") {
151
+ const verb = collision.outcome === "failed" ? colors.redBright("✗") : colors.yellowBright("!");
152
+ console.log(`${verb} Did not create src/web/home.page.tsx: ${colors.yellowBright(`src/${APP_ROUTES_FILE}`)} ${collision.reason}.\n The page stub declares ${colors.yellowBright("route = \"/\"")}, and two handlers on one path is a 500 at request time, not a startup error.
153
+ Free up ${colors.yellowBright("GET \"/\"")} in that file — move it to a path of its own, or remove it — then create src/web/home.page.tsx yourself. Giving the page a \`route\` other than \`/\` works too.`);
154
+ process.exitCode = 1;
155
+ } else {
156
+ await putFileAsync(srcPath("web/home.page.tsx"), webHomePageStub);
157
+ await ensureDirectoryAsync(srcPath("app/contact/controllers"));
158
+ await putFileAsync(srcPath("app/contact/controllers/contact.controller.ts"), webContactControllerStub);
159
+ await putFileAsync(srcPath("app/contact/routes.ts"), webContactRoutesStub);
160
+ console.log(`${colors.green("✓")} Created src/web/home.page.tsx`);
161
+ console.log(`${colors.green("✓")} Created POST /api/contact starter route`);
162
+ }
163
+ }
164
+ await registerWebConnector();
165
+ }
166
+ const webFeature = {
167
+ description: "Installs @warlock.js/web — SSR React pages served by the Warlock HTTP server. Scaffolds src/web (root.tsx + a home page) and registers the WebConnector in warlock.config.ts. Pages are opt-in: a Warlock app is an API until you add this.",
168
+ dependencies: {
169
+ "@warlock.js/web": INSTALLED_WARLOCK_VERSION,
170
+ "@mongez/http": "^3.5.0",
171
+ "@mongez/react-form": "^4.0.0",
172
+ "@mongez/react-localization": "^3.4.7",
173
+ react: "^19.2.3",
174
+ "react-dom": "^19.2.3"
175
+ },
176
+ devDependencies: {
177
+ "@types/react": "^19.2.7",
178
+ "@types/react-dom": "^19.2.3",
179
+ vite: "^7.3.5",
180
+ "@vitejs/plugin-react": "^5.2.0"
181
+ },
182
+ onExecuting: completeWebInstallation
183
+ };
184
+
185
+ //#endregion
186
+ export { webFeature };
187
+ //# sourceMappingURL=web.feature.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web.feature.mjs","names":[],"sources":["C:/Work/Warlock.js/core/src/generations/features/web.feature.ts"],"sourcesContent":["import { colors } from \"@mongez/copper\";\r\nimport {\r\n ensureDirectoryAsync,\r\n fileExistsAsync,\r\n getFileAsync,\r\n putFileAsync,\r\n} from \"@warlock.js/fs\";\r\nimport { CommandActionData } from \"../../commands/types\";\r\nimport { rootPath, srcPath } from \"../../utils\";\r\nimport {\n webContactControllerStub,\n webContactRoutesStub,\n webHomePageStub,\n webRootStub,\n} from \"../stubs\";\nimport { FeatureDefinition, INSTALLED_WARLOCK_VERSION } from \"./types\";\n\r\n/**\r\n * Register the WebConnector in `warlock.config.ts`, and ONLY there.\r\n *\r\n * It belongs to the config array or to app code, never both. Both halves are\r\n * registered before app code loads — the CLI preloader in dev, the generated\r\n * entry in production — so also calling `connectorsManager.register(...)` in\r\n * `src/app/main.ts` boots the connector twice and installs every page route\r\n * twice. That surfaces at PRODUCTION boot as `Route name \"...\" is already\r\n * taken`, because pages and API routes share one route-name namespace.\r\n *\r\n * The config array is the half to prefer: `warlock build` reads the same array\r\n * to drain each connector's build contribution, so \"built for\" and \"boots with\"\r\n * cannot drift.\r\n *\r\n * String surgery rather than a TypeScript parse: `warlock.config.ts` is an\r\n * app-owned file that may carry any formatting, and a parse-and-print would\r\n * reformat the parts we did not come to change.\r\n */\r\nasync function registerWebConnector(): Promise<void> {\r\n const configPath = rootPath(\"warlock.config.ts\");\r\n\r\n if (!(await fileExistsAsync(configPath))) {\r\n console.log(\r\n `${colors.yellowBright(\"warlock.config.ts\")} not found — add this yourself:\\n` +\r\n ` import { webConnector } from \"@warlock.js/web/connector\";\\n` +\r\n ` export default defineConfig({ connectors: [webConnector()] });`,\r\n );\r\n\r\n return;\r\n }\r\n\r\n const current = await getFileAsync(configPath);\r\n\r\n if (current.includes(\"webConnector\")) {\r\n console.log(`${colors.yellowBright(\"webConnector\")} already registered, skipping...`);\r\n\r\n return;\r\n }\r\n\r\n const importLine = 'import { webConnector } from \"@warlock.js/web/connector\";';\r\n let next = current.includes(importLine) ? current : `${importLine}\\n${current}`;\r\n\r\n // An existing `connectors: [` gains one entry; otherwise the key is added to\r\n // the object `defineConfig` receives.\r\n if (/connectors:\\s*\\[/.test(next)) {\r\n next = next.replace(/connectors:\\s*\\[/, \"connectors: [webConnector(),\");\r\n } else if (next.includes(\"defineConfig({\")) {\r\n next = next.replace(\"defineConfig({\", \"defineConfig({\\n connectors: [webConnector()],\");\r\n } else {\r\n console.log(\r\n `${colors.yellowBright(\"warlock.config.ts\")} has no recognisable defineConfig({...}) — ` +\r\n \"add `connectors: [webConnector()]` yourself.\",\r\n );\r\n\r\n return;\r\n }\r\n\r\n await putFileAsync(configPath, next);\r\n console.log(`${colors.green(\"✓\")} Registered webConnector in warlock.config.ts`);\r\n}\r\n\r\n/**\r\n * The app routes file the project template registers `GET /` in. Only this one\r\n * path is inspected: `warlock add web` is not a codebase-wide route auditor, and\r\n * a project that keeps its routes elsewhere lands on the `absent` outcome below,\r\n * which writes the page exactly as before.\r\n */\r\nconst APP_ROUTES_FILE = \"app/shared/routes.ts\";\r\n\r\n/**\r\n * A TOP-LEVEL `router.get(\"/\", ...)` — anchored at column 0 on purpose.\r\n *\r\n * Routes nested in a `router.group({ prefix: \"/x\" }, ...)` are indented by every\r\n * formatter this codebase runs, and their real path is `/x`, not `/`. Anchoring\r\n * is what keeps the notifications feature's own `router.get(\"/\", ...)` (inside\r\n * the `/notifications` group) from reading as a homepage collision.\r\n *\r\n * Only the path literal is captured. The handler — a bare identifier in the\r\n * template, but possibly an inline arrow spanning lines — is never matched, so\r\n * the rewrite below cannot damage it.\r\n */\r\nconst TOP_LEVEL_ROOT_GET = /^router\\s*\\.\\s*get\\(\\s*([\"'`])\\/\\1/gm;\r\n\r\n/**\r\n * Whether `/welcome` is already spoken for, so relocating onto it would trade\r\n * one duplicate-route 500 for another.\r\n */\r\nconst TOP_LEVEL_WELCOME_GET = /^router\\s*\\.\\s*get\\(\\s*([\"'`])\\/welcome\\1/m;\r\n\r\ntype HomeRouteCollision =\r\n /** No app routes file, or nothing claims `/` — write the page as normal. */\r\n | { outcome: \"absent\" }\r\n /** The template's `GET /` was moved to `/welcome`; the page is safe to write. */\r\n | { outcome: \"relocated\" }\r\n /** Something claims `/` that we will not rewrite. The page is NOT written. */\r\n | { outcome: \"conflict\"; reason: string }\r\n /** We tried to relocate and could not. The page is NOT written. */\r\n | { outcome: \"failed\"; reason: string };\r\n\r\n/**\r\n * Make room for a page that declares `route = \"/\"`.\r\n *\r\n * The project template registers `router.get(\"/\", homePageController)` and the\r\n * page stub declares `route = \"/\"`. Fastify rejects the second registration\r\n * (`Method 'GET' already declared for route '/'`) and the homepage 500s at\r\n * request time — so `warlock add web` cannot just write the page and hope.\r\n *\r\n * Of the three ways out, this RELOCATES the JSON route to `/welcome` rather than\r\n * deleting it or refusing to scaffold:\r\n *\r\n * - Deleting the controller is what the scaffolder's own `react` feature does,\r\n * but it may do that: it owns the file it is deleting, seconds after writing\r\n * it. `warlock add web` runs against a project a human has been living in, and\r\n * silently unlinking their code is not a thing an `add` command gets to do.\r\n * - Writing the page anyway and printing a warning ships a project whose\r\n * homepage 500s. A warning above a broken app is still a broken app.\r\n * - Relocating keeps BOTH surfaces working: the React homepage takes `/`, the\r\n * JSON welcome answers at `/welcome`, and no line of user code disappears.\r\n *\r\n * Only the exact top-level shape is rewritten, and only the path literal inside\r\n * it. Anything else that claims `/` is reported and left completely alone — we\r\n * do not guess at code we cannot recognise.\r\n */\r\nasync function relocateConflictingHomeRoute(): Promise<HomeRouteCollision> {\r\n const routesPath = srcPath(APP_ROUTES_FILE);\r\n\r\n // Not every project comes from the template. No file is not a problem.\r\n if (!(await fileExistsAsync(routesPath))) {\r\n return { outcome: \"absent\" };\r\n }\r\n\r\n let current: string;\r\n\r\n try {\r\n current = await getFileAsync(routesPath);\r\n } catch (error) {\r\n return {\r\n outcome: \"failed\",\r\n reason: `could not be read (${(error as Error).message})`,\r\n };\r\n }\r\n\r\n const matches = current.match(TOP_LEVEL_ROOT_GET) ?? [];\r\n\r\n if (matches.length === 0) {\r\n return { outcome: \"absent\" };\r\n }\r\n\r\n if (matches.length > 1) {\r\n return {\r\n outcome: \"conflict\",\r\n reason: `declares ${matches.length} top-level GET \"/\" routes`,\r\n };\r\n }\r\n\r\n if (TOP_LEVEL_WELCOME_GET.test(current)) {\r\n return {\r\n outcome: \"conflict\",\r\n reason: 'already declares GET \"/welcome\", so the usual relocation target is taken',\r\n };\r\n }\r\n\r\n const next = current.replace(TOP_LEVEL_ROOT_GET, (match, quote: string) =>\r\n match.replace(`${quote}/${quote}`, `${quote}/welcome${quote}`),\r\n );\r\n\r\n if (next === current) {\r\n return { outcome: \"conflict\", reason: 'its GET \"/\" route could not be rewritten' };\r\n }\r\n\r\n try {\r\n await putFileAsync(routesPath, next);\r\n } catch (error) {\r\n return {\r\n outcome: \"failed\",\r\n reason: `could not be written (${(error as Error).message})`,\r\n };\r\n }\r\n\r\n return { outcome: \"relocated\" };\r\n}\r\n\r\n/**\r\n * Scaffold the smallest page layer that renders, and register the connector.\r\n *\r\n * `src/web/root.tsx` is the sentinel for \"already scaffolded\" — the framework\r\n * ships a default root, so its presence means a human has been here.\r\n */\r\nasync function completeWebInstallation(_options: CommandActionData) {\r\n const rootFile = srcPath(\"web/root.tsx\");\r\n\r\n if (await fileExistsAsync(rootFile)) {\r\n console.log(`${colors.yellowBright(\"src/web\")} already scaffolded, skipping...`);\r\n } else {\r\n await ensureDirectoryAsync(srcPath(\"web\"));\r\n await putFileAsync(rootFile, webRootStub);\r\n console.log(`${colors.green(\"✓\")} Created src/web/root.tsx`);\r\n\r\n const collision = await relocateConflictingHomeRoute();\r\n\r\n if (collision.outcome === \"relocated\") {\r\n console.log(\r\n `${colors.green(\"✓\")} Moved the existing ${colors.yellowBright('GET \"/\"')} route to ` +\r\n `${colors.yellowBright('\"/welcome\"')} in ${colors.yellowBright(`src/${APP_ROUTES_FILE}`)} — ` +\r\n \"the new page owns `/` now, and the JSON welcome route still answers at /welcome.\",\r\n );\r\n }\r\n\r\n // The page is written ONLY when `/` is provably free. Writing it while\r\n // another handler holds `/` produces a homepage that 500s on first request,\r\n // which is precisely the outcome a scaffolder must never hand back.\r\n if (collision.outcome === \"conflict\" || collision.outcome === \"failed\") {\r\n const verb = collision.outcome === \"failed\" ? colors.redBright(\"✗\") : colors.yellowBright(\"!\");\r\n\r\n console.log(\r\n `${verb} Did not create src/web/home.page.tsx: ` +\r\n `${colors.yellowBright(`src/${APP_ROUTES_FILE}`)} ${collision.reason}.\\n` +\r\n ` The page stub declares ${colors.yellowBright('route = \"/\"')}, and two handlers on one ` +\r\n \"path is a 500 at request time, not a startup error.\\n\" +\r\n ` Free up ${colors.yellowBright('GET \"/\"')} in that file — move it to a path of its own, ` +\r\n \"or remove it — then create src/web/home.page.tsx yourself. Giving the page a `route` other \" +\r\n \"than `/` works too.\",\r\n );\r\n\r\n // Non-zero on BOTH branches. The page layer this command exists to\r\n // scaffold was not scaffolded, and a 0 here is the exact \"looked like it\r\n // worked\" signal that put `/` in this state to begin with — a conflict we\r\n // declined to guess at is still an incomplete install, not a success.\r\n //\r\n // `exitCode` rather than `exit(1)`: the connector below still has to be\r\n // registered, and any other feature in the same `warlock add` invocation\r\n // still has to install, or the project is left half-wired on top of this.\r\n process.exitCode = 1;\r\n } else {\n await putFileAsync(srcPath(\"web/home.page.tsx\"), webHomePageStub);\n await ensureDirectoryAsync(srcPath(\"app/contact/controllers\"));\n await putFileAsync(\n srcPath(\"app/contact/controllers/contact.controller.ts\"),\n webContactControllerStub,\n );\n await putFileAsync(srcPath(\"app/contact/routes.ts\"), webContactRoutesStub);\n console.log(`${colors.green(\"✓\")} Created src/web/home.page.tsx`);\n console.log(`${colors.green(\"✓\")} Created POST /api/contact starter route`);\n }\r\n }\r\n\r\n await registerWebConnector();\r\n}\r\n\r\nexport const webFeature: FeatureDefinition = {\r\n description:\r\n \"Installs @warlock.js/web — SSR React pages served by the Warlock HTTP server. Scaffolds src/web (root.tsx + a home page) and registers the WebConnector in warlock.config.ts. Pages are opt-in: a Warlock app is an API until you add this.\",\r\n dependencies: {\r\n \"@warlock.js/web\": INSTALLED_WARLOCK_VERSION,\n \"@mongez/http\": \"^3.5.0\",\n \"@mongez/react-form\": \"^4.0.0\",\n \"@mongez/react-localization\": \"^3.4.7\",\n react: \"^19.2.3\",\r\n \"react-dom\": \"^19.2.3\",\r\n },\r\n devDependencies: {\r\n \"@types/react\": \"^19.2.7\",\r\n \"@types/react-dom\": \"^19.2.3\",\r\n // Loaded through `await import()` by the dev server only, so both are\r\n // optional peers of `web` rather than hard dependencies.\r\n vite: \"^7.3.5\",\r\n \"@vitejs/plugin-react\": \"^5.2.0\",\r\n },\r\n onExecuting: completeWebInstallation,\r\n};\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAmCA,eAAe,uBAAsC;CACnD,MAAM,aAAa,SAAS,mBAAmB;CAE/C,IAAI,CAAE,MAAM,gBAAgB,UAAU,GAAI;EACxC,QAAQ,IACN,GAAG,OAAO,aAAa,mBAAmB,EAAE,+JAG9C;EAEA;CACF;CAEA,MAAM,UAAU,MAAM,aAAa,UAAU;CAE7C,IAAI,QAAQ,SAAS,cAAc,GAAG;EACpC,QAAQ,IAAI,GAAG,OAAO,aAAa,cAAc,EAAE,iCAAiC;EAEpF;CACF;CAEA,MAAM,aAAa;CACnB,IAAI,OAAO,QAAQ,SAAS,UAAU,IAAI,UAAU,GAAG,WAAW,IAAI;CAItE,IAAI,mBAAmB,KAAK,IAAI,GAC9B,OAAO,KAAK,QAAQ,oBAAoB,8BAA8B;MACjE,IAAI,KAAK,SAAS,gBAAgB,GACvC,OAAO,KAAK,QAAQ,kBAAkB,iDAAiD;MAClF;EACL,QAAQ,IACN,GAAG,OAAO,aAAa,mBAAmB,EAAE,0FAE9C;EAEA;CACF;CAEA,MAAM,aAAa,YAAY,IAAI;CACnC,QAAQ,IAAI,GAAG,OAAO,MAAM,GAAG,EAAE,8CAA8C;AACjF;;;;;;;AAQA,MAAM,kBAAkB;;;;;;;;;;;;;AAcxB,MAAM,qBAAqB;;;;;AAM3B,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;AAoC9B,eAAe,+BAA4D;CACzE,MAAM,aAAa,QAAQ,eAAe;CAG1C,IAAI,CAAE,MAAM,gBAAgB,UAAU,GACpC,OAAO,EAAE,SAAS,SAAS;CAG7B,IAAI;CAEJ,IAAI;EACF,UAAU,MAAM,aAAa,UAAU;CACzC,SAAS,OAAO;EACd,OAAO;GACL,SAAS;GACT,QAAQ,sBAAuB,MAAgB,QAAQ;EACzD;CACF;CAEA,MAAM,UAAU,QAAQ,MAAM,kBAAkB,KAAK,CAAC;CAEtD,IAAI,QAAQ,WAAW,GACrB,OAAO,EAAE,SAAS,SAAS;CAG7B,IAAI,QAAQ,SAAS,GACnB,OAAO;EACL,SAAS;EACT,QAAQ,YAAY,QAAQ,OAAO;CACrC;CAGF,IAAI,sBAAsB,KAAK,OAAO,GACpC,OAAO;EACL,SAAS;EACT,QAAQ;CACV;CAGF,MAAM,OAAO,QAAQ,QAAQ,qBAAqB,OAAO,UACvD,MAAM,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,UAAU,OAAO,CAC/D;CAEA,IAAI,SAAS,SACX,OAAO;EAAE,SAAS;EAAY,QAAQ;CAA2C;CAGnF,IAAI;EACF,MAAM,aAAa,YAAY,IAAI;CACrC,SAAS,OAAO;EACd,OAAO;GACL,SAAS;GACT,QAAQ,yBAA0B,MAAgB,QAAQ;EAC5D;CACF;CAEA,OAAO,EAAE,SAAS,YAAY;AAChC;;;;;;;AAQA,eAAe,wBAAwB,UAA6B;CAClE,MAAM,WAAW,QAAQ,cAAc;CAEvC,IAAI,MAAM,gBAAgB,QAAQ,GAChC,QAAQ,IAAI,GAAG,OAAO,aAAa,SAAS,EAAE,iCAAiC;MAC1E;EACL,MAAM,qBAAqB,QAAQ,KAAK,CAAC;EACzC,MAAM,aAAa,UAAU,WAAW;EACxC,QAAQ,IAAI,GAAG,OAAO,MAAM,GAAG,EAAE,0BAA0B;EAE3D,MAAM,YAAY,MAAM,6BAA6B;EAErD,IAAI,UAAU,YAAY,aACxB,QAAQ,IACN,GAAG,OAAO,MAAM,GAAG,EAAE,sBAAsB,OAAO,aAAa,WAAS,EAAE,YACrE,OAAO,aAAa,cAAY,EAAE,MAAM,OAAO,aAAa,OAAO,iBAAiB,EAAE,sFAE7F;EAMF,IAAI,UAAU,YAAY,cAAc,UAAU,YAAY,UAAU;GACtE,MAAM,OAAO,UAAU,YAAY,WAAW,OAAO,UAAU,GAAG,IAAI,OAAO,aAAa,GAAG;GAE7F,QAAQ,IACN,GAAG,KAAK,yCACH,OAAO,aAAa,OAAO,iBAAiB,EAAE,GAAG,UAAU,OAAO,8BACzC,OAAO,aAAa,eAAa,EAAE;YAElD,OAAO,aAAa,WAAS,EAAE,iKAGhD;GAUA,QAAQ,WAAW;EACrB,OAAO;GACL,MAAM,aAAa,QAAQ,mBAAmB,GAAG,eAAe;GAChE,MAAM,qBAAqB,QAAQ,yBAAyB,CAAC;GAC7D,MAAM,aACJ,QAAQ,+CAA+C,GACvD,wBACF;GACA,MAAM,aAAa,QAAQ,uBAAuB,GAAG,oBAAoB;GACzE,QAAQ,IAAI,GAAG,OAAO,MAAM,GAAG,EAAE,+BAA+B;GAChE,QAAQ,IAAI,GAAG,OAAO,MAAM,GAAG,EAAE,yCAAyC;EAC5E;CACF;CAEA,MAAM,qBAAqB;AAC7B;AAEA,MAAa,aAAgC;CAC3C,aACE;CACF,cAAc;EACZ,mBAAmB;EACnB,gBAAgB;EAChB,sBAAsB;EACtB,8BAA8B;EAC9B,OAAO;EACP,aAAa;CACf;CACA,iBAAiB;EACf,gBAAgB;EAChB,oBAAoB;EAGpB,MAAM;EACN,wBAAwB;CAC1B;CACA,aAAa;AACf"}