@warlock.js/core 4.8.2 → 4.9.1

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 (854) hide show
  1. package/CHANGELOG.md +25 -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/benchmark/benchmark-snapshots.d.mts +1 -1
  13. package/esm/benchmark/benchmark-snapshots.d.mts.map +1 -1
  14. package/esm/benchmark/benchmark-snapshots.mjs +1 -1
  15. package/esm/benchmark/benchmark-snapshots.mjs.map +1 -1
  16. package/esm/benchmark/benchmark.d.mts +1 -1
  17. package/esm/benchmark/benchmark.d.mts.map +1 -1
  18. package/esm/benchmark/benchmark.mjs +1 -1
  19. package/esm/benchmark/benchmark.mjs.map +1 -1
  20. package/esm/benchmark/channels/console.channel.d.mts +1 -1
  21. package/esm/benchmark/channels/console.channel.d.mts.map +1 -1
  22. package/esm/benchmark/channels/console.channel.mjs +1 -1
  23. package/esm/benchmark/channels/console.channel.mjs.map +1 -1
  24. package/esm/benchmark/channels/noop.channel.d.mts +1 -1
  25. package/esm/benchmark/channels/noop.channel.d.mts.map +1 -1
  26. package/esm/benchmark/channels/noop.channel.mjs +1 -1
  27. package/esm/benchmark/channels/noop.channel.mjs.map +1 -1
  28. package/esm/benchmark/profiler.d.mts +1 -1
  29. package/esm/benchmark/profiler.d.mts.map +1 -1
  30. package/esm/benchmark/profiler.mjs +1 -1
  31. package/esm/benchmark/profiler.mjs.map +1 -1
  32. package/esm/benchmark/types.d.mts +1 -1
  33. package/esm/benchmark/types.d.mts.map +1 -1
  34. package/esm/bootstrap/setup.d.mts +1 -1
  35. package/esm/bootstrap/setup.d.mts.map +1 -1
  36. package/esm/bootstrap/setup.mjs +1 -1
  37. package/esm/bootstrap/setup.mjs.map +1 -1
  38. package/esm/bootstrap.d.mts +1 -1
  39. package/esm/bootstrap.d.mts.map +1 -1
  40. package/esm/bootstrap.mjs +1 -1
  41. package/esm/bootstrap.mjs.map +1 -1
  42. package/esm/cache/database-cache-driver.d.mts +1 -1
  43. package/esm/cache/database-cache-driver.d.mts.map +1 -1
  44. package/esm/cache/database-cache-driver.mjs +1 -1
  45. package/esm/cache/database-cache-driver.mjs.map +1 -1
  46. package/esm/cache/index.mjs +1 -1
  47. package/esm/cache/index.mjs.map +1 -1
  48. package/esm/cli/cli-command.d.mts +1 -1
  49. package/esm/cli/cli-command.d.mts.map +1 -1
  50. package/esm/cli/cli-command.mjs +1 -1
  51. package/esm/cli/cli-command.mjs.map +1 -1
  52. package/esm/cli/cli-commands.manager.mjs +1 -1
  53. package/esm/cli/cli-commands.manager.mjs.map +1 -1
  54. package/esm/cli/cli-commands.utils.mjs +1 -1
  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 +5 -4
  63. package/esm/cli/commands/dev-server.command.mjs.map +1 -1
  64. package/esm/cli/commands/doctor/checks/config.check.mjs +1 -1
  65. package/esm/cli/commands/doctor/checks/config.check.mjs.map +1 -1
  66. package/esm/cli/commands/doctor/checks/connectors.check.mjs +1 -1
  67. package/esm/cli/commands/doctor/checks/connectors.check.mjs.map +1 -1
  68. package/esm/cli/commands/doctor/checks/health.check.mjs +1 -1
  69. package/esm/cli/commands/doctor/checks/health.check.mjs.map +1 -1
  70. package/esm/cli/commands/doctor/checks/index.mjs +1 -1
  71. package/esm/cli/commands/doctor/checks/index.mjs.map +1 -1
  72. package/esm/cli/commands/doctor/checks/optional-peers.check.mjs +1 -1
  73. package/esm/cli/commands/doctor/checks/optional-peers.check.mjs.map +1 -1
  74. package/esm/cli/commands/doctor/checks/release-hygiene.check.mjs +1 -1
  75. package/esm/cli/commands/doctor/checks/release-hygiene.check.mjs.map +1 -1
  76. package/esm/cli/commands/doctor/checks/routes.check.mjs +1 -1
  77. package/esm/cli/commands/doctor/checks/routes.check.mjs.map +1 -1
  78. package/esm/cli/commands/doctor/doctor-command.action.mjs +1 -1
  79. package/esm/cli/commands/doctor/doctor-command.action.mjs.map +1 -1
  80. package/esm/cli/commands/doctor/format-report.mjs +1 -1
  81. package/esm/cli/commands/doctor/format-report.mjs.map +1 -1
  82. package/esm/cli/commands/doctor/run-checks.mjs +1 -1
  83. package/esm/cli/commands/doctor/run-checks.mjs.map +1 -1
  84. package/esm/cli/commands/doctor.command.mjs +1 -1
  85. package/esm/cli/commands/doctor.command.mjs.map +1 -1
  86. package/esm/cli/commands/drop-tables.command.mjs +1 -1
  87. package/esm/cli/commands/drop-tables.command.mjs.map +1 -1
  88. package/esm/cli/commands/generate/generate.command.mjs +1 -1
  89. package/esm/cli/commands/generate/generate.command.mjs.map +1 -1
  90. package/esm/cli/commands/generate/generators/column-dsl-parser.mjs +1 -1
  91. package/esm/cli/commands/generate/generators/column-dsl-parser.mjs.map +1 -1
  92. package/esm/cli/commands/generate/generators/controller.generator.mjs +1 -1
  93. package/esm/cli/commands/generate/generators/controller.generator.mjs.map +1 -1
  94. package/esm/cli/commands/generate/generators/migration.generator.mjs +1 -1
  95. package/esm/cli/commands/generate/generators/migration.generator.mjs.map +1 -1
  96. package/esm/cli/commands/generate/generators/model.generator.mjs +1 -1
  97. package/esm/cli/commands/generate/generators/model.generator.mjs.map +1 -1
  98. package/esm/cli/commands/generate/generators/module.generator.mjs +1 -1
  99. package/esm/cli/commands/generate/generators/module.generator.mjs.map +1 -1
  100. package/esm/cli/commands/generate/generators/repository.generator.mjs +1 -1
  101. package/esm/cli/commands/generate/generators/repository.generator.mjs.map +1 -1
  102. package/esm/cli/commands/generate/generators/resource.generator.mjs +1 -1
  103. package/esm/cli/commands/generate/generators/resource.generator.mjs.map +1 -1
  104. package/esm/cli/commands/generate/generators/service.generator.mjs +1 -1
  105. package/esm/cli/commands/generate/generators/service.generator.mjs.map +1 -1
  106. package/esm/cli/commands/generate/templates/stubs.mjs +1 -1
  107. package/esm/cli/commands/generate/templates/stubs.mjs.map +1 -1
  108. package/esm/cli/commands/generate/utils/name-parser.mjs +1 -1
  109. package/esm/cli/commands/generate/utils/name-parser.mjs.map +1 -1
  110. package/esm/cli/commands/generate/utils/path-resolver.mjs +1 -1
  111. package/esm/cli/commands/generate/utils/path-resolver.mjs.map +1 -1
  112. package/esm/cli/commands/generate/utils/prompt.mjs +1 -1
  113. package/esm/cli/commands/generate/utils/prompt.mjs.map +1 -1
  114. package/esm/cli/commands/generate/utils/writer.mjs +1 -1
  115. package/esm/cli/commands/generate/utils/writer.mjs.map +1 -1
  116. package/esm/cli/commands/migrate.command.mjs +1 -1
  117. package/esm/cli/commands/migrate.command.mjs.map +1 -1
  118. package/esm/cli/commands/routes/format-routes-table.mjs +1 -1
  119. package/esm/cli/commands/routes/format-routes-table.mjs.map +1 -1
  120. package/esm/cli/commands/routes/route-row.mjs +1 -1
  121. package/esm/cli/commands/routes/route-row.mjs.map +1 -1
  122. package/esm/cli/commands/routes/routes-command.action.mjs +1 -1
  123. package/esm/cli/commands/routes/routes-command.action.mjs.map +1 -1
  124. package/esm/cli/commands/routes.command.mjs +1 -1
  125. package/esm/cli/commands/routes.command.mjs.map +1 -1
  126. package/esm/cli/commands/seed.command.mjs +1 -1
  127. package/esm/cli/commands/seed.command.mjs.map +1 -1
  128. package/esm/cli/commands/start-production.command.mjs +2 -2
  129. package/esm/cli/commands/start-production.command.mjs.map +1 -1
  130. package/esm/cli/commands/storage-put.action.mjs +1 -1
  131. package/esm/cli/commands/storage-put.action.mjs.map +1 -1
  132. package/esm/cli/commands/storage-put.command.mjs +1 -1
  133. package/esm/cli/commands/storage-put.command.mjs.map +1 -1
  134. package/esm/cli/commands/typings-generator.command.mjs +1 -1
  135. package/esm/cli/commands/typings-generator.command.mjs.map +1 -1
  136. package/esm/cli/commands/update.command.mjs +30 -7
  137. package/esm/cli/commands/update.command.mjs.map +1 -1
  138. package/esm/cli/commands-loader.mjs +1 -1
  139. package/esm/cli/commands-loader.mjs.map +1 -1
  140. package/esm/cli/framework-cli-commands.mjs +1 -1
  141. package/esm/cli/framework-cli-commands.mjs.map +1 -1
  142. package/esm/cli/parse-cli-args.mjs +1 -1
  143. package/esm/cli/parse-cli-args.mjs.map +1 -1
  144. package/esm/cli/start.mjs +1 -1
  145. package/esm/cli/start.mjs.map +1 -1
  146. package/esm/cli/string-similarity.mjs +1 -1
  147. package/esm/cli/string-similarity.mjs.map +1 -1
  148. package/esm/cli/types.d.mts +1 -1
  149. package/esm/cli/types.d.mts.map +1 -1
  150. package/esm/config/config-getter.d.mts +1 -1
  151. package/esm/config/config-getter.d.mts.map +1 -1
  152. package/esm/config/config-getter.mjs +1 -1
  153. package/esm/config/config-getter.mjs.map +1 -1
  154. package/esm/config/config-handlers.d.mts +1 -1
  155. package/esm/config/config-handlers.d.mts.map +1 -1
  156. package/esm/config/config-handlers.mjs +1 -1
  157. package/esm/config/config-handlers.mjs.map +1 -1
  158. package/esm/config/config-loader.d.mts +1 -1
  159. package/esm/config/config-loader.d.mts.map +1 -1
  160. package/esm/config/config-loader.mjs +1 -1
  161. package/esm/config/config-loader.mjs.map +1 -1
  162. package/esm/config/config-manager.mjs +1 -1
  163. package/esm/config/config-manager.mjs.map +1 -1
  164. package/esm/config/config-special-handlers.d.mts +1 -1
  165. package/esm/config/config-special-handlers.d.mts.map +1 -1
  166. package/esm/config/config-special-handlers.mjs +1 -1
  167. package/esm/config/config-special-handlers.mjs.map +1 -1
  168. package/esm/config/load-config-files.mjs +1 -1
  169. package/esm/config/load-config-files.mjs.map +1 -1
  170. package/esm/config/types.d.mts +1 -1
  171. package/esm/config/types.d.mts.map +1 -1
  172. package/esm/connectors/access-connector.d.mts +1 -1
  173. package/esm/connectors/access-connector.d.mts.map +1 -1
  174. package/esm/connectors/access-connector.mjs +1 -1
  175. package/esm/connectors/access-connector.mjs.map +1 -1
  176. package/esm/connectors/ai-connector.d.mts +1 -1
  177. package/esm/connectors/ai-connector.d.mts.map +1 -1
  178. package/esm/connectors/ai-connector.mjs +1 -1
  179. package/esm/connectors/ai-connector.mjs.map +1 -1
  180. package/esm/connectors/base-connector.d.mts +1 -1
  181. package/esm/connectors/base-connector.d.mts.map +1 -1
  182. package/esm/connectors/base-connector.mjs +1 -1
  183. package/esm/connectors/base-connector.mjs.map +1 -1
  184. package/esm/connectors/cache-connector.d.mts +1 -1
  185. package/esm/connectors/cache-connector.d.mts.map +1 -1
  186. package/esm/connectors/cache-connector.mjs +1 -1
  187. package/esm/connectors/cache-connector.mjs.map +1 -1
  188. package/esm/connectors/connectors-manager.d.mts +1 -1
  189. package/esm/connectors/connectors-manager.d.mts.map +1 -1
  190. package/esm/connectors/connectors-manager.mjs +1 -1
  191. package/esm/connectors/connectors-manager.mjs.map +1 -1
  192. package/esm/connectors/database-connector.d.mts +1 -1
  193. package/esm/connectors/database-connector.d.mts.map +1 -1
  194. package/esm/connectors/database-connector.mjs +1 -1
  195. package/esm/connectors/database-connector.mjs.map +1 -1
  196. package/esm/connectors/herald-connector.d.mts +1 -1
  197. package/esm/connectors/herald-connector.d.mts.map +1 -1
  198. package/esm/connectors/herald-connector.mjs +1 -1
  199. package/esm/connectors/herald-connector.mjs.map +1 -1
  200. package/esm/connectors/http-connector.d.mts +1 -1
  201. package/esm/connectors/http-connector.d.mts.map +1 -1
  202. package/esm/connectors/http-connector.mjs +1 -1
  203. package/esm/connectors/http-connector.mjs.map +1 -1
  204. package/esm/connectors/logger-connector.d.mts +1 -1
  205. package/esm/connectors/logger-connector.d.mts.map +1 -1
  206. package/esm/connectors/logger-connector.mjs +1 -1
  207. package/esm/connectors/logger-connector.mjs.map +1 -1
  208. package/esm/connectors/mail-connector.d.mts +1 -1
  209. package/esm/connectors/mail-connector.d.mts.map +1 -1
  210. package/esm/connectors/mail-connector.mjs +1 -1
  211. package/esm/connectors/mail-connector.mjs.map +1 -1
  212. package/esm/connectors/notifications-connector.d.mts +1 -1
  213. package/esm/connectors/notifications-connector.d.mts.map +1 -1
  214. package/esm/connectors/notifications-connector.mjs +1 -1
  215. package/esm/connectors/notifications-connector.mjs.map +1 -1
  216. package/esm/connectors/socket-connector.d.mts +1 -1
  217. package/esm/connectors/socket-connector.d.mts.map +1 -1
  218. package/esm/connectors/socket-connector.mjs +1 -1
  219. package/esm/connectors/socket-connector.mjs.map +1 -1
  220. package/esm/connectors/storage.connector.d.mts +1 -1
  221. package/esm/connectors/storage.connector.d.mts.map +1 -1
  222. package/esm/connectors/storage.connector.mjs +1 -1
  223. package/esm/connectors/storage.connector.mjs.map +1 -1
  224. package/esm/connectors/types.d.mts +1 -1
  225. package/esm/connectors/types.d.mts.map +1 -1
  226. package/esm/connectors/types.mjs +1 -1
  227. package/esm/connectors/types.mjs.map +1 -1
  228. package/esm/container/index.d.mts +1 -1
  229. package/esm/container/index.d.mts.map +1 -1
  230. package/esm/container/index.mjs +1 -1
  231. package/esm/container/index.mjs.map +1 -1
  232. package/esm/database/create-database-action.mjs +1 -1
  233. package/esm/database/create-database-action.mjs.map +1 -1
  234. package/esm/database/drop-tables-action.mjs +1 -1
  235. package/esm/database/drop-tables-action.mjs.map +1 -1
  236. package/esm/database/migrate-action.mjs +1 -1
  237. package/esm/database/migrate-action.mjs.map +1 -1
  238. package/esm/database/models/database-log/database-log.d.mts +1 -1
  239. package/esm/database/models/database-log/database-log.d.mts.map +1 -1
  240. package/esm/database/models/database-log/database-log.mjs +1 -1
  241. package/esm/database/models/database-log/database-log.mjs.map +1 -1
  242. package/esm/database/seed-command-action.mjs +1 -1
  243. package/esm/database/seed-command-action.mjs.map +1 -1
  244. package/esm/database/seeds/seed-records-table-migration.mjs +1 -1
  245. package/esm/database/seeds/seed-records-table-migration.mjs.map +1 -1
  246. package/esm/database/seeds/seeder.d.mts +1 -1
  247. package/esm/database/seeds/seeder.d.mts.map +1 -1
  248. package/esm/database/seeds/seeder.errors.d.mts +1 -1
  249. package/esm/database/seeds/seeder.errors.d.mts.map +1 -1
  250. package/esm/database/seeds/seeder.errors.mjs +1 -1
  251. package/esm/database/seeds/seeder.errors.mjs.map +1 -1
  252. package/esm/database/seeds/seeder.mjs +1 -1
  253. package/esm/database/seeds/seeder.mjs.map +1 -1
  254. package/esm/database/seeds/seeders.manager.mjs +1 -1
  255. package/esm/database/seeds/seeders.manager.mjs.map +1 -1
  256. package/esm/database/seeds/seeds-table-migration.mjs +1 -1
  257. package/esm/database/seeds/seeds-table-migration.mjs.map +1 -1
  258. package/esm/database/seeds/types.d.mts +1 -1
  259. package/esm/database/seeds/types.d.mts.map +1 -1
  260. package/esm/database/seeds/utils.mjs +1 -1
  261. package/esm/database/seeds/utils.mjs.map +1 -1
  262. package/esm/database/utils.d.mts +1 -1
  263. package/esm/database/utils.d.mts.map +1 -1
  264. package/esm/database/utils.mjs +1 -1
  265. package/esm/database/utils.mjs.map +1 -1
  266. package/esm/dev-server/check-for-updates.mjs +91 -8
  267. package/esm/dev-server/check-for-updates.mjs.map +1 -1
  268. package/esm/dev-server/create-worker.mjs +1 -1
  269. package/esm/dev-server/create-worker.mjs.map +1 -1
  270. package/esm/dev-server/dependency-graph.d.mts +1 -1
  271. package/esm/dev-server/dependency-graph.d.mts.map +1 -1
  272. package/esm/dev-server/dependency-graph.mjs +1 -1
  273. package/esm/dev-server/dependency-graph.mjs.map +1 -1
  274. package/esm/dev-server/dev-logger.mjs +1 -1
  275. package/esm/dev-server/dev-logger.mjs.map +1 -1
  276. package/esm/dev-server/development-server.mjs +32 -3
  277. package/esm/dev-server/development-server.mjs.map +1 -1
  278. package/esm/dev-server/events.mjs +1 -1
  279. package/esm/dev-server/events.mjs.map +1 -1
  280. package/esm/dev-server/file-event-handler.mjs +1 -1
  281. package/esm/dev-server/file-event-handler.mjs.map +1 -1
  282. package/esm/dev-server/file-manager.d.mts +1 -1
  283. package/esm/dev-server/file-manager.d.mts.map +1 -1
  284. package/esm/dev-server/file-manager.mjs +1 -1
  285. package/esm/dev-server/file-manager.mjs.map +1 -1
  286. package/esm/dev-server/file-operations.d.mts +1 -1
  287. package/esm/dev-server/file-operations.d.mts.map +1 -1
  288. package/esm/dev-server/file-operations.mjs +1 -1
  289. package/esm/dev-server/file-operations.mjs.map +1 -1
  290. package/esm/dev-server/files-orchestrator.d.mts +1 -1
  291. package/esm/dev-server/files-orchestrator.d.mts.map +1 -1
  292. package/esm/dev-server/files-orchestrator.mjs +1 -1
  293. package/esm/dev-server/files-orchestrator.mjs.map +1 -1
  294. package/esm/dev-server/files-watcher.d.mts +1 -1
  295. package/esm/dev-server/files-watcher.d.mts.map +1 -1
  296. package/esm/dev-server/files-watcher.mjs +1 -1
  297. package/esm/dev-server/files-watcher.mjs.map +1 -1
  298. package/esm/dev-server/flags.mjs +1 -1
  299. package/esm/dev-server/flags.mjs.map +1 -1
  300. package/esm/dev-server/health-checker/checkers/base-health-checker.d.mts +1 -1
  301. package/esm/dev-server/health-checker/checkers/base-health-checker.d.mts.map +1 -1
  302. package/esm/dev-server/health-checker/checkers/base-health-checker.mjs +1 -1
  303. package/esm/dev-server/health-checker/checkers/base-health-checker.mjs.map +1 -1
  304. package/esm/dev-server/health-checker/checkers/eslint-health-checker.d.mts +1 -1
  305. package/esm/dev-server/health-checker/checkers/eslint-health-checker.d.mts.map +1 -1
  306. package/esm/dev-server/health-checker/checkers/eslint-health-checker.mjs +1 -1
  307. package/esm/dev-server/health-checker/checkers/eslint-health-checker.mjs.map +1 -1
  308. package/esm/dev-server/health-checker/checkers/typescript-health-checker.d.mts +1 -1
  309. package/esm/dev-server/health-checker/checkers/typescript-health-checker.d.mts.map +1 -1
  310. package/esm/dev-server/health-checker/checkers/typescript-health-checker.mjs +1 -1
  311. package/esm/dev-server/health-checker/checkers/typescript-health-checker.mjs.map +1 -1
  312. package/esm/dev-server/health-checker/file-health-checker.contract.d.mts +1 -1
  313. package/esm/dev-server/health-checker/file-health-checker.contract.d.mts.map +1 -1
  314. package/esm/dev-server/health-checker/file-health-result.d.mts +1 -1
  315. package/esm/dev-server/health-checker/file-health-result.d.mts.map +1 -1
  316. package/esm/dev-server/health-checker/file-health-result.mjs +1 -1
  317. package/esm/dev-server/health-checker/file-health-result.mjs.map +1 -1
  318. package/esm/dev-server/health-checker/files-healthcare.manager.d.mts +1 -1
  319. package/esm/dev-server/health-checker/files-healthcare.manager.d.mts.map +1 -1
  320. package/esm/dev-server/health-checker/files-healthcare.manager.mjs +1 -1
  321. package/esm/dev-server/health-checker/files-healthcare.manager.mjs.map +1 -1
  322. package/esm/dev-server/health-checker/workers/eslint-health.worker.mjs +1 -1
  323. package/esm/dev-server/health-checker/workers/eslint-health.worker.mjs.map +1 -1
  324. package/esm/dev-server/health-checker/workers/ts-health.worker.mjs +1 -1
  325. package/esm/dev-server/health-checker/workers/ts-health.worker.mjs.map +1 -1
  326. package/esm/dev-server/layer-executor.mjs +1 -1
  327. package/esm/dev-server/layer-executor.mjs.map +1 -1
  328. package/esm/dev-server/loader/build-transpile-init.mjs +1 -1
  329. package/esm/dev-server/loader/build-transpile-init.mjs.map +1 -1
  330. package/esm/dev-server/loader/hook-thread.d.mts +1 -1
  331. package/esm/dev-server/loader/hook-thread.d.mts.map +1 -1
  332. package/esm/dev-server/loader/hook-thread.mjs +1 -1
  333. package/esm/dev-server/loader/hook-thread.mjs.map +1 -1
  334. package/esm/dev-server/loader/load-hook.d.mts +1 -1
  335. package/esm/dev-server/loader/load-hook.d.mts.map +1 -1
  336. package/esm/dev-server/loader/load-hook.mjs +1 -1
  337. package/esm/dev-server/loader/load-hook.mjs.map +1 -1
  338. package/esm/dev-server/loader/own-resolver.mjs +1 -1
  339. package/esm/dev-server/loader/own-resolver.mjs.map +1 -1
  340. package/esm/dev-server/loader/register-loader.mjs +1 -1
  341. package/esm/dev-server/loader/register-loader.mjs.map +1 -1
  342. package/esm/dev-server/loader/resolve-capture.mjs +1 -1
  343. package/esm/dev-server/loader/resolve-capture.mjs.map +1 -1
  344. package/esm/dev-server/loader/resolve-hook.d.mts +1 -1
  345. package/esm/dev-server/loader/resolve-hook.d.mts.map +1 -1
  346. package/esm/dev-server/loader/resolve-hook.mjs +1 -1
  347. package/esm/dev-server/loader/resolve-hook.mjs.map +1 -1
  348. package/esm/dev-server/loader/source-slug.mjs +1 -1
  349. package/esm/dev-server/loader/source-slug.mjs.map +1 -1
  350. package/esm/dev-server/loader/transpile-cache.mjs +1 -1
  351. package/esm/dev-server/loader/transpile-cache.mjs.map +1 -1
  352. package/esm/dev-server/loader/version-registry.mjs +1 -1
  353. package/esm/dev-server/loader/version-registry.mjs.map +1 -1
  354. package/esm/dev-server/manifest-manager.d.mts +1 -1
  355. package/esm/dev-server/manifest-manager.d.mts.map +1 -1
  356. package/esm/dev-server/manifest-manager.mjs +1 -1
  357. package/esm/dev-server/manifest-manager.mjs.map +1 -1
  358. package/esm/dev-server/module-loader.d.mts +1 -1
  359. package/esm/dev-server/module-loader.d.mts.map +1 -1
  360. package/esm/dev-server/module-loader.mjs +1 -1
  361. package/esm/dev-server/module-loader.mjs.map +1 -1
  362. package/esm/dev-server/package-json-manager.mjs +1 -1
  363. package/esm/dev-server/package-json-manager.mjs.map +1 -1
  364. package/esm/dev-server/parse-imports.mjs +1 -1
  365. package/esm/dev-server/parse-imports.mjs.map +1 -1
  366. package/esm/dev-server/path.mjs +1 -1
  367. package/esm/dev-server/path.mjs.map +1 -1
  368. package/esm/dev-server/register-dev-shortcuts.mjs +70 -0
  369. package/esm/dev-server/register-dev-shortcuts.mjs.map +1 -0
  370. package/esm/dev-server/restart-dev-server.mjs +36 -0
  371. package/esm/dev-server/restart-dev-server.mjs.map +1 -0
  372. package/esm/dev-server/shortcuts.mjs +121 -0
  373. package/esm/dev-server/shortcuts.mjs.map +1 -0
  374. package/esm/dev-server/special-files-collector.d.mts +1 -1
  375. package/esm/dev-server/special-files-collector.d.mts.map +1 -1
  376. package/esm/dev-server/special-files-collector.mjs +1 -1
  377. package/esm/dev-server/special-files-collector.mjs.map +1 -1
  378. package/esm/dev-server/start-development-server.mjs +3 -1
  379. package/esm/dev-server/start-development-server.mjs.map +1 -1
  380. package/esm/dev-server/supervisor.mjs +141 -0
  381. package/esm/dev-server/supervisor.mjs.map +1 -0
  382. package/esm/dev-server/tsconfig-manager.mjs +1 -1
  383. package/esm/dev-server/tsconfig-manager.mjs.map +1 -1
  384. package/esm/dev-server/type-generator.mjs +1 -1
  385. package/esm/dev-server/type-generator.mjs.map +1 -1
  386. package/esm/dev-server/types.d.mts +1 -1
  387. package/esm/dev-server/types.d.mts.map +1 -1
  388. package/esm/dev-server/update-check-cache.mjs +53 -0
  389. package/esm/dev-server/update-check-cache.mjs.map +1 -0
  390. package/esm/dev-server/utils.mjs +1 -1
  391. package/esm/dev-server/utils.mjs.map +1 -1
  392. package/esm/encryption/encrypt.d.mts +1 -1
  393. package/esm/encryption/encrypt.d.mts.map +1 -1
  394. package/esm/encryption/encrypt.mjs +1 -1
  395. package/esm/encryption/encrypt.mjs.map +1 -1
  396. package/esm/encryption/hash.d.mts +1 -1
  397. package/esm/encryption/hash.d.mts.map +1 -1
  398. package/esm/encryption/hash.mjs +1 -1
  399. package/esm/encryption/hash.mjs.map +1 -1
  400. package/esm/encryption/password.d.mts +1 -1
  401. package/esm/encryption/password.d.mts.map +1 -1
  402. package/esm/encryption/password.mjs +1 -1
  403. package/esm/encryption/password.mjs.map +1 -1
  404. package/esm/encryption/types.d.mts +1 -1
  405. package/esm/encryption/types.d.mts.map +1 -1
  406. package/esm/generations/add-command.action.mjs +3 -13
  407. package/esm/generations/add-command.action.mjs.map +1 -1
  408. package/esm/generations/stubs.mjs +1 -1
  409. package/esm/generations/stubs.mjs.map +1 -1
  410. package/esm/http/config.d.mts +1 -1
  411. package/esm/http/config.d.mts.map +1 -1
  412. package/esm/http/config.mjs +1 -1
  413. package/esm/http/config.mjs.map +1 -1
  414. package/esm/http/context/request-context.d.mts +1 -1
  415. package/esm/http/context/request-context.d.mts.map +1 -1
  416. package/esm/http/context/request-context.mjs +1 -1
  417. package/esm/http/context/request-context.mjs.map +1 -1
  418. package/esm/http/createHttpApplication.d.mts +1 -1
  419. package/esm/http/createHttpApplication.d.mts.map +1 -1
  420. package/esm/http/createHttpApplication.mjs +1 -1
  421. package/esm/http/createHttpApplication.mjs.map +1 -1
  422. package/esm/http/database/RequestLog.d.mts +1 -1
  423. package/esm/http/database/RequestLog.d.mts.map +1 -1
  424. package/esm/http/database/RequestLog.mjs +1 -1
  425. package/esm/http/database/RequestLog.mjs.map +1 -1
  426. package/esm/http/error-codes.d.mts +1 -1
  427. package/esm/http/error-codes.d.mts.map +1 -1
  428. package/esm/http/error-codes.mjs +1 -1
  429. package/esm/http/error-codes.mjs.map +1 -1
  430. package/esm/http/errors/errors.d.mts +1 -1
  431. package/esm/http/errors/errors.d.mts.map +1 -1
  432. package/esm/http/errors/errors.mjs +1 -1
  433. package/esm/http/errors/errors.mjs.map +1 -1
  434. package/esm/http/events.d.mts +1 -1
  435. package/esm/http/events.d.mts.map +1 -1
  436. package/esm/http/events.mjs +1 -1
  437. package/esm/http/events.mjs.map +1 -1
  438. package/esm/http/health.d.mts +1 -1
  439. package/esm/http/health.d.mts.map +1 -1
  440. package/esm/http/health.mjs +1 -1
  441. package/esm/http/health.mjs.map +1 -1
  442. package/esm/http/middleware/cache-response-middleware.d.mts +1 -1
  443. package/esm/http/middleware/cache-response-middleware.d.mts.map +1 -1
  444. package/esm/http/middleware/cache-response-middleware.mjs +1 -1
  445. package/esm/http/middleware/cache-response-middleware.mjs.map +1 -1
  446. package/esm/http/middleware/concurrency-limit.middleware.d.mts +1 -1
  447. package/esm/http/middleware/concurrency-limit.middleware.d.mts.map +1 -1
  448. package/esm/http/middleware/concurrency-limit.middleware.mjs +1 -1
  449. package/esm/http/middleware/concurrency-limit.middleware.mjs.map +1 -1
  450. package/esm/http/middleware/idempotency.middleware.d.mts +1 -1
  451. package/esm/http/middleware/idempotency.middleware.d.mts.map +1 -1
  452. package/esm/http/middleware/idempotency.middleware.mjs +1 -1
  453. package/esm/http/middleware/idempotency.middleware.mjs.map +1 -1
  454. package/esm/http/middleware/inject-request-context.d.mts +1 -1
  455. package/esm/http/middleware/inject-request-context.d.mts.map +1 -1
  456. package/esm/http/middleware/inject-request-context.mjs +1 -1
  457. package/esm/http/middleware/inject-request-context.mjs.map +1 -1
  458. package/esm/http/middleware/ip-filter.middleware.d.mts +1 -1
  459. package/esm/http/middleware/ip-filter.middleware.d.mts.map +1 -1
  460. package/esm/http/middleware/ip-filter.middleware.mjs +1 -1
  461. package/esm/http/middleware/ip-filter.middleware.mjs.map +1 -1
  462. package/esm/http/middleware/maintenance.middleware.d.mts +1 -1
  463. package/esm/http/middleware/maintenance.middleware.d.mts.map +1 -1
  464. package/esm/http/middleware/maintenance.middleware.mjs +1 -1
  465. package/esm/http/middleware/maintenance.middleware.mjs.map +1 -1
  466. package/esm/http/middleware/max-body-size.middleware.d.mts +1 -1
  467. package/esm/http/middleware/max-body-size.middleware.d.mts.map +1 -1
  468. package/esm/http/middleware/max-body-size.middleware.mjs +1 -1
  469. package/esm/http/middleware/max-body-size.middleware.mjs.map +1 -1
  470. package/esm/http/middleware/middleware-list.d.mts +1 -1
  471. package/esm/http/middleware/middleware-list.d.mts.map +1 -1
  472. package/esm/http/middleware/middleware-list.mjs +1 -1
  473. package/esm/http/middleware/middleware-list.mjs.map +1 -1
  474. package/esm/http/middleware/rate-limit.middleware.d.mts +1 -1
  475. package/esm/http/middleware/rate-limit.middleware.d.mts.map +1 -1
  476. package/esm/http/middleware/rate-limit.middleware.mjs +1 -1
  477. package/esm/http/middleware/rate-limit.middleware.mjs.map +1 -1
  478. package/esm/http/middleware/utils/cidr-match.d.mts +1 -1
  479. package/esm/http/middleware/utils/cidr-match.d.mts.map +1 -1
  480. package/esm/http/middleware/utils/cidr-match.mjs +1 -1
  481. package/esm/http/middleware/utils/cidr-match.mjs.map +1 -1
  482. package/esm/http/middleware/utils/idempotency-key.d.mts +1 -1
  483. package/esm/http/middleware/utils/idempotency-key.d.mts.map +1 -1
  484. package/esm/http/middleware/utils/idempotency-key.mjs +1 -1
  485. package/esm/http/middleware/utils/idempotency-key.mjs.map +1 -1
  486. package/esm/http/middleware/utils/parse-size.d.mts +1 -1
  487. package/esm/http/middleware/utils/parse-size.d.mts.map +1 -1
  488. package/esm/http/middleware/utils/parse-size.mjs +1 -1
  489. package/esm/http/middleware/utils/parse-size.mjs.map +1 -1
  490. package/esm/http/plugins.d.mts +1 -1
  491. package/esm/http/plugins.d.mts.map +1 -1
  492. package/esm/http/plugins.mjs +1 -1
  493. package/esm/http/plugins.mjs.map +1 -1
  494. package/esm/http/request-controller.d.mts +1 -1
  495. package/esm/http/request-controller.d.mts.map +1 -1
  496. package/esm/http/request-controller.mjs +1 -1
  497. package/esm/http/request-controller.mjs.map +1 -1
  498. package/esm/http/request.d.mts +1 -1
  499. package/esm/http/request.d.mts.map +1 -1
  500. package/esm/http/request.mjs +1 -1
  501. package/esm/http/request.mjs.map +1 -1
  502. package/esm/http/response.d.mts +1 -1
  503. package/esm/http/response.d.mts.map +1 -1
  504. package/esm/http/response.mjs +1 -1
  505. package/esm/http/response.mjs.map +1 -1
  506. package/esm/http/server.d.mts +1 -1
  507. package/esm/http/server.d.mts.map +1 -1
  508. package/esm/http/server.mjs +1 -1
  509. package/esm/http/server.mjs.map +1 -1
  510. package/esm/http/types.d.mts +1 -1
  511. package/esm/http/types.d.mts.map +1 -1
  512. package/esm/http/uploaded-file.d.mts +1 -1
  513. package/esm/http/uploaded-file.d.mts.map +1 -1
  514. package/esm/http/uploaded-file.mjs +1 -1
  515. package/esm/http/uploaded-file.mjs.map +1 -1
  516. package/esm/http/uploads-config.d.mts +1 -1
  517. package/esm/http/uploads-config.d.mts.map +1 -1
  518. package/esm/http/uploads-config.mjs +1 -1
  519. package/esm/http/uploads-config.mjs.map +1 -1
  520. package/esm/http/uploads-types.d.mts +1 -1
  521. package/esm/http/uploads-types.d.mts.map +1 -1
  522. package/esm/image/image.d.mts +1 -1
  523. package/esm/image/image.d.mts.map +1 -1
  524. package/esm/image/image.mjs +1 -1
  525. package/esm/image/image.mjs.map +1 -1
  526. package/esm/logger/logger.d.mts +1 -1
  527. package/esm/logger/logger.d.mts.map +1 -1
  528. package/esm/logger/logger.mjs +1 -1
  529. package/esm/logger/logger.mjs.map +1 -1
  530. package/esm/logger/types.d.mts +1 -1
  531. package/esm/logger/types.d.mts.map +1 -1
  532. package/esm/mail/config.d.mts +1 -1
  533. package/esm/mail/config.d.mts.map +1 -1
  534. package/esm/mail/config.mjs +1 -1
  535. package/esm/mail/config.mjs.map +1 -1
  536. package/esm/mail/events.d.mts +1 -1
  537. package/esm/mail/events.d.mts.map +1 -1
  538. package/esm/mail/events.mjs +1 -1
  539. package/esm/mail/events.mjs.map +1 -1
  540. package/esm/mail/mail.d.mts +1 -1
  541. package/esm/mail/mail.d.mts.map +1 -1
  542. package/esm/mail/mail.mjs +1 -1
  543. package/esm/mail/mail.mjs.map +1 -1
  544. package/esm/mail/mailer-pool.d.mts +1 -1
  545. package/esm/mail/mailer-pool.d.mts.map +1 -1
  546. package/esm/mail/mailer-pool.mjs +1 -1
  547. package/esm/mail/mailer-pool.mjs.map +1 -1
  548. package/esm/mail/react-mail.d.mts +1 -1
  549. package/esm/mail/react-mail.d.mts.map +1 -1
  550. package/esm/mail/react-mail.mjs +1 -1
  551. package/esm/mail/react-mail.mjs.map +1 -1
  552. package/esm/mail/send-mail.d.mts +1 -1
  553. package/esm/mail/send-mail.d.mts.map +1 -1
  554. package/esm/mail/send-mail.mjs +1 -1
  555. package/esm/mail/send-mail.mjs.map +1 -1
  556. package/esm/mail/test-mailbox.d.mts +1 -1
  557. package/esm/mail/test-mailbox.d.mts.map +1 -1
  558. package/esm/mail/test-mailbox.mjs +1 -1
  559. package/esm/mail/test-mailbox.mjs.map +1 -1
  560. package/esm/mail/types.d.mts +1 -1
  561. package/esm/mail/types.d.mts.map +1 -1
  562. package/esm/mail/types.mjs +1 -1
  563. package/esm/mail/types.mjs.map +1 -1
  564. package/esm/manifest/manifest-manager.mjs +1 -1
  565. package/esm/manifest/manifest-manager.mjs.map +1 -1
  566. package/esm/production/build-app-production.mjs +1 -1
  567. package/esm/production/build-app-production.mjs.map +1 -1
  568. package/esm/production/esbuild-plugins.mjs +1 -1
  569. package/esm/production/esbuild-plugins.mjs.map +1 -1
  570. package/esm/production/production-builder.mjs +1 -1
  571. package/esm/production/production-builder.mjs.map +1 -1
  572. package/esm/production/resolve-build-config.mjs +3 -2
  573. package/esm/production/resolve-build-config.mjs.map +1 -1
  574. package/esm/react/index.d.mts +1 -1
  575. package/esm/react/index.d.mts.map +1 -1
  576. package/esm/react/index.mjs +1 -1
  577. package/esm/react/index.mjs.map +1 -1
  578. package/esm/repositories/adapters/cascade/cascade-adapter.d.mts +1 -1
  579. package/esm/repositories/adapters/cascade/cascade-adapter.d.mts.map +1 -1
  580. package/esm/repositories/adapters/cascade/cascade-adapter.mjs +1 -1
  581. package/esm/repositories/adapters/cascade/cascade-adapter.mjs.map +1 -1
  582. package/esm/repositories/adapters/cascade/cascade-query-builder.d.mts +1 -1
  583. package/esm/repositories/adapters/cascade/cascade-query-builder.d.mts.map +1 -1
  584. package/esm/repositories/adapters/cascade/cascade-query-builder.mjs +1 -1
  585. package/esm/repositories/adapters/cascade/cascade-query-builder.mjs.map +1 -1
  586. package/esm/repositories/adapters/cascade/filter-applicator.mjs +1 -1
  587. package/esm/repositories/adapters/cascade/filter-applicator.mjs.map +1 -1
  588. package/esm/repositories/contracts/query-builder.contract.d.mts +1 -1
  589. package/esm/repositories/contracts/query-builder.contract.d.mts.map +1 -1
  590. package/esm/repositories/contracts/repository-adapter.contract.d.mts +1 -1
  591. package/esm/repositories/contracts/repository-adapter.contract.d.mts.map +1 -1
  592. package/esm/repositories/contracts/types.d.mts +1 -1
  593. package/esm/repositories/contracts/types.d.mts.map +1 -1
  594. package/esm/repositories/repository.manager.d.mts +1 -1
  595. package/esm/repositories/repository.manager.d.mts.map +1 -1
  596. package/esm/repositories/repository.manager.mjs +1 -1
  597. package/esm/repositories/repository.manager.mjs.map +1 -1
  598. package/esm/resource/define-resource.d.mts +1 -1
  599. package/esm/resource/define-resource.d.mts.map +1 -1
  600. package/esm/resource/define-resource.mjs +1 -1
  601. package/esm/resource/define-resource.mjs.map +1 -1
  602. package/esm/resource/register-resource.d.mts +1 -1
  603. package/esm/resource/register-resource.d.mts.map +1 -1
  604. package/esm/resource/register-resource.mjs +1 -1
  605. package/esm/resource/register-resource.mjs.map +1 -1
  606. package/esm/resource/resource-field-builder.d.mts +1 -1
  607. package/esm/resource/resource-field-builder.d.mts.map +1 -1
  608. package/esm/resource/resource-field-builder.mjs +1 -1
  609. package/esm/resource/resource-field-builder.mjs.map +1 -1
  610. package/esm/resource/resource.d.mts +1 -1
  611. package/esm/resource/resource.d.mts.map +1 -1
  612. package/esm/resource/resource.mjs +1 -1
  613. package/esm/resource/resource.mjs.map +1 -1
  614. package/esm/resource/types.d.mts +1 -1
  615. package/esm/resource/types.d.mts.map +1 -1
  616. package/esm/restful/restful.d.mts +1 -1
  617. package/esm/restful/restful.d.mts.map +1 -1
  618. package/esm/restful/restful.mjs +1 -1
  619. package/esm/restful/restful.mjs.map +1 -1
  620. package/esm/router/route-builder.d.mts +1 -1
  621. package/esm/router/route-builder.d.mts.map +1 -1
  622. package/esm/router/route-builder.mjs +1 -1
  623. package/esm/router/route-builder.mjs.map +1 -1
  624. package/esm/router/route-registry.mjs +1 -1
  625. package/esm/router/route-registry.mjs.map +1 -1
  626. package/esm/router/router.d.mts +1 -1
  627. package/esm/router/router.d.mts.map +1 -1
  628. package/esm/router/router.mjs +1 -1
  629. package/esm/router/router.mjs.map +1 -1
  630. package/esm/router/types.d.mts +1 -1
  631. package/esm/router/types.d.mts.map +1 -1
  632. package/esm/socket/types.d.mts +1 -1
  633. package/esm/socket/types.d.mts.map +1 -1
  634. package/esm/socket/utils.d.mts +1 -1
  635. package/esm/socket/utils.d.mts.map +1 -1
  636. package/esm/socket/utils.mjs +1 -1
  637. package/esm/socket/utils.mjs.map +1 -1
  638. package/esm/storage/config.d.mts +1 -1
  639. package/esm/storage/config.d.mts.map +1 -1
  640. package/esm/storage/config.mjs +1 -1
  641. package/esm/storage/config.mjs.map +1 -1
  642. package/esm/storage/context/storage-driver-context.d.mts +1 -1
  643. package/esm/storage/context/storage-driver-context.d.mts.map +1 -1
  644. package/esm/storage/context/storage-driver-context.mjs +1 -1
  645. package/esm/storage/context/storage-driver-context.mjs.map +1 -1
  646. package/esm/storage/drivers/cloud-driver.d.mts +1 -1
  647. package/esm/storage/drivers/cloud-driver.d.mts.map +1 -1
  648. package/esm/storage/drivers/cloud-driver.mjs +1 -1
  649. package/esm/storage/drivers/cloud-driver.mjs.map +1 -1
  650. package/esm/storage/drivers/do-spaces-driver.d.mts +1 -1
  651. package/esm/storage/drivers/do-spaces-driver.d.mts.map +1 -1
  652. package/esm/storage/drivers/do-spaces-driver.mjs +1 -1
  653. package/esm/storage/drivers/do-spaces-driver.mjs.map +1 -1
  654. package/esm/storage/drivers/local-driver.d.mts +1 -1
  655. package/esm/storage/drivers/local-driver.d.mts.map +1 -1
  656. package/esm/storage/drivers/local-driver.mjs +1 -1
  657. package/esm/storage/drivers/local-driver.mjs.map +1 -1
  658. package/esm/storage/drivers/r2-driver.d.mts +1 -1
  659. package/esm/storage/drivers/r2-driver.d.mts.map +1 -1
  660. package/esm/storage/drivers/r2-driver.mjs +1 -1
  661. package/esm/storage/drivers/r2-driver.mjs.map +1 -1
  662. package/esm/storage/drivers/s3-driver.d.mts +1 -1
  663. package/esm/storage/drivers/s3-driver.d.mts.map +1 -1
  664. package/esm/storage/drivers/s3-driver.mjs +1 -1
  665. package/esm/storage/drivers/s3-driver.mjs.map +1 -1
  666. package/esm/storage/scoped-storage.d.mts +1 -1
  667. package/esm/storage/scoped-storage.d.mts.map +1 -1
  668. package/esm/storage/scoped-storage.mjs +1 -1
  669. package/esm/storage/scoped-storage.mjs.map +1 -1
  670. package/esm/storage/storage-file.d.mts +1 -1
  671. package/esm/storage/storage-file.d.mts.map +1 -1
  672. package/esm/storage/storage-file.mjs +1 -1
  673. package/esm/storage/storage-file.mjs.map +1 -1
  674. package/esm/storage/storage.d.mts +1 -1
  675. package/esm/storage/storage.d.mts.map +1 -1
  676. package/esm/storage/storage.mjs +1 -1
  677. package/esm/storage/storage.mjs.map +1 -1
  678. package/esm/storage/types.d.mts +1 -1
  679. package/esm/storage/types.d.mts.map +1 -1
  680. package/esm/storage/utils/contain-path.d.mts +1 -1
  681. package/esm/storage/utils/contain-path.d.mts.map +1 -1
  682. package/esm/storage/utils/contain-path.mjs +1 -1
  683. package/esm/storage/utils/contain-path.mjs.map +1 -1
  684. package/esm/storage/utils/mime.d.mts +1 -1
  685. package/esm/storage/utils/mime.d.mts.map +1 -1
  686. package/esm/storage/utils/mime.mjs +1 -1
  687. package/esm/storage/utils/mime.mjs.map +1 -1
  688. package/esm/storage/utils/safe-fetch.d.mts +1 -1
  689. package/esm/storage/utils/safe-fetch.d.mts.map +1 -1
  690. package/esm/storage/utils/safe-fetch.mjs +1 -1
  691. package/esm/storage/utils/safe-fetch.mjs.map +1 -1
  692. package/esm/storage/utils/storage-error.d.mts +1 -1
  693. package/esm/storage/utils/storage-error.d.mts.map +1 -1
  694. package/esm/storage/utils/storage-error.mjs +1 -1
  695. package/esm/storage/utils/storage-error.mjs.map +1 -1
  696. package/esm/tests/start-http-development-server.d.mts +1 -1
  697. package/esm/tests/start-http-development-server.d.mts.map +1 -1
  698. package/esm/tests/start-http-development-server.mjs +1 -1
  699. package/esm/tests/start-http-development-server.mjs.map +1 -1
  700. package/esm/tests/test-helpers.d.mts +1 -1
  701. package/esm/tests/test-helpers.d.mts.map +1 -1
  702. package/esm/tests/test-helpers.mjs +1 -1
  703. package/esm/tests/test-helpers.mjs.map +1 -1
  704. package/esm/tests/vitest-setup.d.mts +1 -1
  705. package/esm/tests/vitest-setup.d.mts.map +1 -1
  706. package/esm/tests/vitest-setup.mjs +1 -1
  707. package/esm/tests/vitest-setup.mjs.map +1 -1
  708. package/esm/updater/package-manager.mjs +47 -7
  709. package/esm/updater/package-manager.mjs.map +1 -1
  710. package/esm/updater/update-warlock-packages.mjs +63 -10
  711. package/esm/updater/update-warlock-packages.mjs.map +1 -1
  712. package/esm/use-cases/types.d.mts +1 -1
  713. package/esm/use-cases/types.d.mts.map +1 -1
  714. package/esm/use-cases/use-case-broadcast.d.mts +1 -1
  715. package/esm/use-cases/use-case-broadcast.d.mts.map +1 -1
  716. package/esm/use-cases/use-case-broadcast.mjs +1 -1
  717. package/esm/use-cases/use-case-broadcast.mjs.map +1 -1
  718. package/esm/use-cases/use-case-events.d.mts +1 -1
  719. package/esm/use-cases/use-case-events.d.mts.map +1 -1
  720. package/esm/use-cases/use-case-events.mjs +1 -1
  721. package/esm/use-cases/use-case-events.mjs.map +1 -1
  722. package/esm/use-cases/use-case-pipeline.d.mts +1 -1
  723. package/esm/use-cases/use-case-pipeline.d.mts.map +1 -1
  724. package/esm/use-cases/use-case-pipeline.mjs +1 -1
  725. package/esm/use-cases/use-case-pipeline.mjs.map +1 -1
  726. package/esm/use-cases/use-case.d.mts +1 -1
  727. package/esm/use-cases/use-case.d.mts.map +1 -1
  728. package/esm/use-cases/use-case.errors.d.mts +1 -1
  729. package/esm/use-cases/use-case.errors.d.mts.map +1 -1
  730. package/esm/use-cases/use-case.errors.mjs +1 -1
  731. package/esm/use-cases/use-case.errors.mjs.map +1 -1
  732. package/esm/use-cases/use-case.mjs +1 -1
  733. package/esm/use-cases/use-case.mjs.map +1 -1
  734. package/esm/use-cases/use-cases-registry.d.mts +1 -1
  735. package/esm/use-cases/use-cases-registry.d.mts.map +1 -1
  736. package/esm/use-cases/use-cases-registry.mjs +1 -1
  737. package/esm/use-cases/use-cases-registry.mjs.map +1 -1
  738. package/esm/utils/app-log.d.mts +1 -1
  739. package/esm/utils/app-log.d.mts.map +1 -1
  740. package/esm/utils/app-log.mjs +1 -1
  741. package/esm/utils/app-log.mjs.map +1 -1
  742. package/esm/utils/database-log.d.mts +1 -1
  743. package/esm/utils/database-log.d.mts.map +1 -1
  744. package/esm/utils/database-log.mjs +1 -1
  745. package/esm/utils/database-log.mjs.map +1 -1
  746. package/esm/utils/environment.d.mts +1 -1
  747. package/esm/utils/environment.d.mts.map +1 -1
  748. package/esm/utils/environment.mjs +1 -1
  749. package/esm/utils/environment.mjs.map +1 -1
  750. package/esm/utils/framework-vesion.mjs +1 -1
  751. package/esm/utils/framework-vesion.mjs.map +1 -1
  752. package/esm/utils/get-localized.d.mts +1 -1
  753. package/esm/utils/get-localized.d.mts.map +1 -1
  754. package/esm/utils/get-localized.mjs +1 -1
  755. package/esm/utils/get-localized.mjs.map +1 -1
  756. package/esm/utils/npm-registry.d.mts +1 -1
  757. package/esm/utils/npm-registry.d.mts.map +1 -1
  758. package/esm/utils/npm-registry.mjs +1 -1
  759. package/esm/utils/npm-registry.mjs.map +1 -1
  760. package/esm/utils/paths.d.mts +1 -1
  761. package/esm/utils/paths.d.mts.map +1 -1
  762. package/esm/utils/paths.mjs +1 -1
  763. package/esm/utils/paths.mjs.map +1 -1
  764. package/esm/utils/promise-all-object.d.mts +1 -1
  765. package/esm/utils/promise-all-object.d.mts.map +1 -1
  766. package/esm/utils/promise-all-object.mjs +1 -1
  767. package/esm/utils/promise-all-object.mjs.map +1 -1
  768. package/esm/utils/queue.d.mts +1 -1
  769. package/esm/utils/queue.d.mts.map +1 -1
  770. package/esm/utils/queue.mjs +1 -1
  771. package/esm/utils/queue.mjs.map +1 -1
  772. package/esm/utils/sleep.d.mts +1 -1
  773. package/esm/utils/sleep.d.mts.map +1 -1
  774. package/esm/utils/sleep.mjs +1 -1
  775. package/esm/utils/sleep.mjs.map +1 -1
  776. package/esm/utils/sluggable.d.mts +1 -1
  777. package/esm/utils/sluggable.d.mts.map +1 -1
  778. package/esm/utils/sluggable.mjs +1 -1
  779. package/esm/utils/sluggable.mjs.map +1 -1
  780. package/esm/utils/to-json.d.mts +1 -1
  781. package/esm/utils/to-json.d.mts.map +1 -1
  782. package/esm/utils/to-json.mjs +1 -1
  783. package/esm/utils/to-json.mjs.map +1 -1
  784. package/esm/utils/types.d.mts +1 -1
  785. package/esm/utils/types.d.mts.map +1 -1
  786. package/esm/utils/urls.d.mts +1 -1
  787. package/esm/utils/urls.d.mts.map +1 -1
  788. package/esm/utils/urls.mjs +1 -1
  789. package/esm/utils/urls.mjs.map +1 -1
  790. package/esm/utils/version-compare.d.mts +1 -1
  791. package/esm/utils/version-compare.d.mts.map +1 -1
  792. package/esm/utils/version-compare.mjs +1 -1
  793. package/esm/utils/version-compare.mjs.map +1 -1
  794. package/esm/validation/database/exists-except-current-id.d.mts +1 -1
  795. package/esm/validation/database/exists-except-current-id.d.mts.map +1 -1
  796. package/esm/validation/database/exists-except-current-id.mjs +1 -1
  797. package/esm/validation/database/exists-except-current-id.mjs.map +1 -1
  798. package/esm/validation/database/exists-except-current-user.d.mts +1 -1
  799. package/esm/validation/database/exists-except-current-user.d.mts.map +1 -1
  800. package/esm/validation/database/exists-except-current-user.mjs +1 -1
  801. package/esm/validation/database/exists-except-current-user.mjs.map +1 -1
  802. package/esm/validation/database/types.d.mts +1 -1
  803. package/esm/validation/database/types.d.mts.map +1 -1
  804. package/esm/validation/database/unique-except-current-id.d.mts +1 -1
  805. package/esm/validation/database/unique-except-current-id.d.mts.map +1 -1
  806. package/esm/validation/database/unique-except-current-id.mjs +1 -1
  807. package/esm/validation/database/unique-except-current-id.mjs.map +1 -1
  808. package/esm/validation/database/unique-except-current-user.d.mts +1 -1
  809. package/esm/validation/database/unique-except-current-user.d.mts.map +1 -1
  810. package/esm/validation/database/unique-except-current-user.mjs +1 -1
  811. package/esm/validation/database/unique-except-current-user.mjs.map +1 -1
  812. package/esm/validation/file/file.d.mts +1 -1
  813. package/esm/validation/file/file.d.mts.map +1 -1
  814. package/esm/validation/file/file.mjs +1 -1
  815. package/esm/validation/file/file.mjs.map +1 -1
  816. package/esm/validation/init.mjs +1 -1
  817. package/esm/validation/init.mjs.map +1 -1
  818. package/esm/validation/plugins/database-plugin.mjs +1 -1
  819. package/esm/validation/plugins/database-plugin.mjs.map +1 -1
  820. package/esm/validation/plugins/file-plugin.mjs +1 -1
  821. package/esm/validation/plugins/file-plugin.mjs.map +1 -1
  822. package/esm/validation/plugins/localized-plugin.mjs +1 -1
  823. package/esm/validation/plugins/localized-plugin.mjs.map +1 -1
  824. package/esm/validation/types.d.mts +1 -1
  825. package/esm/validation/types.d.mts.map +1 -1
  826. package/esm/validation/validateAll.mjs +1 -1
  827. package/esm/validation/validateAll.mjs.map +1 -1
  828. package/esm/validation/validators/file-validator.d.mts +1 -1
  829. package/esm/validation/validators/file-validator.d.mts.map +1 -1
  830. package/esm/validation/validators/file-validator.mjs +1 -1
  831. package/esm/validation/validators/file-validator.mjs.map +1 -1
  832. package/esm/vite/lower-stage3-decorators.d.mts +1 -1
  833. package/esm/vite/lower-stage3-decorators.d.mts.map +1 -1
  834. package/esm/vite/lower-stage3-decorators.mjs +1 -1
  835. package/esm/vite/lower-stage3-decorators.mjs.map +1 -1
  836. package/esm/warlock-config/default-configurations.mjs +1 -1
  837. package/esm/warlock-config/default-configurations.mjs.map +1 -1
  838. package/esm/warlock-config/define-config.d.mts +1 -1
  839. package/esm/warlock-config/define-config.d.mts.map +1 -1
  840. package/esm/warlock-config/define-config.mjs +6 -2
  841. package/esm/warlock-config/define-config.mjs.map +1 -1
  842. package/esm/warlock-config/normalize-build-config.mjs +24 -0
  843. package/esm/warlock-config/normalize-build-config.mjs.map +1 -0
  844. package/esm/warlock-config/types.d.mts +21 -1
  845. package/esm/warlock-config/types.d.mts.map +1 -1
  846. package/esm/warlock-config/warlock-config.manager.d.mts +1 -1
  847. package/esm/warlock-config/warlock-config.manager.d.mts.map +1 -1
  848. package/esm/warlock-config/warlock-config.manager.mjs +1 -1
  849. package/esm/warlock-config/warlock-config.manager.mjs.map +1 -1
  850. package/llms-full.txt +131 -13
  851. package/llms.txt +2 -2
  852. package/package.json +12 -12
  853. package/skills/run-app/SKILL.md +70 -7
  854. package/skills/update-packages/SKILL.md +61 -6
@@ -1 +1 @@
1
- {"version":3,"file":"seed-command-action.mjs","names":["runInTransaction"],"sources":["../../../../../../../@warlock.js/core/src/database/seed-command-action.ts"],"sourcesContent":["import { colors } from \"@mongez/copper\";\nimport {\n DataSource,\n dataSourceRegistry,\n transaction as runInTransaction,\n} from \"@warlock.js/cascade\";\nimport { CommandActionData } from \"../cli/types\";\nimport { filesOrchestrator } from \"../dev-server/files-orchestrator\";\nimport { Path } from \"../dev-server/path\";\nimport { getFilesFromDirectory } from \"../dev-server/utils\";\nimport { srcPath } from \"../utils\";\nimport { Seeder } from \"./seeds/seeder\";\nimport { SeedersManager } from \"./seeds/seeders.manager\";\nimport { SeedClock, SeedRecordRef } from \"./seeds/types\";\nimport { seedRecordsTableName, seedsTableName } from \"./seeds/utils\";\n\n/**\n * Programmatic-only overrides for {@link seedCommandAction}.\n *\n * Not derived from CLI flags (the CLI passes only {@link CommandActionData}),\n * so a back-fill script or a test can inject behaviour the command line can't\n * express.\n */\nexport type SeedCommandOverrides = {\n /**\n * Clock the run reads for the `now` handed to each seeder and for the\n * seeds-log metadata timestamps. Defaults to `() => new Date()`. Forwarded to\n * {@link SeedersManager}'s `clock` option.\n */\n clock?: SeedClock;\n};\n\nasync function clearAllTables(datasource: DataSource) {\n const tables = await datasource.driver.blueprint.listTables();\n\n for (const table of tables) {\n await datasource.driver.truncateTable(table, { cascade: true });\n }\n}\n\ntype SeedRecordRow = SeedRecordRef & { id: number };\n\n/**\n * Undo seeded data by deleting the records a seeder tracked via `track`.\n *\n * Reads `seed_records` (all seeders, or a single `seederName`), then deletes\n * the referenced records in REVERSE seed-order and, within each seed, in\n * reverse insertion-order. Insertion id is strictly increasing across the\n * whole run, so deleting by descending `id` satisfies both at once. The whole\n * operation runs in a single transaction, and the matching seeds-log rows are\n * reset afterwards so `once: true` seeds re-run on the next `warlock seed`.\n *\n * @returns the number of tracked records deleted.\n */\nexport async function dropSeedRecords(\n datasource: DataSource,\n seederName?: string,\n): Promise<number> {\n const driver = datasource.driver;\n\n if (!(await driver.blueprint.tableExists(seedRecordsTableName))) {\n return 0;\n }\n\n const query = driver.queryBuilder<SeedRecordRow>(seedRecordsTableName);\n\n if (seederName) {\n query.where(\"seeder\", seederName);\n }\n\n const rows = await query.get();\n\n if (rows.length === 0) {\n return 0;\n }\n\n // Descending insertion id == reverse seed-order + reverse within-seed order.\n const ordered = [...rows].sort((a, b) => b.id - a.id);\n\n await runInTransaction(async () => {\n for (const row of ordered) {\n await driver.deleteMany(row.table, { id: row.recordId });\n }\n\n // Clear the tracked refs we just acted on.\n if (seederName) {\n await driver.deleteMany(seedRecordsTableName, { seeder: seederName });\n } else {\n await driver.deleteMany(seedRecordsTableName, {});\n }\n\n // Reset the seeds-log rows so `once: true` seeds re-run.\n const seederNames = seederName\n ? [seederName]\n : [...new Set(ordered.map((row) => row.seeder))];\n\n for (const name of seederNames) {\n await driver.deleteMany(seedsTableName, { name });\n }\n });\n\n return ordered.length;\n}\n\n/**\n * Run database seeds.\n *\n * @example\n * ```ts\n * import { seedCommandAction } from \"@warlock.js/core\";\n *\n * await seedCommandAction({\n * command: \"seed\",\n * options: { fresh: true, list: false }\n * });\n * ```\n *\n * @param overrides Programmatic-only overrides (e.g. an injected `clock`); the\n * CLI never passes this, so the command-line signature stays unchanged.\n */\nexport async function seedCommandAction(\n options: CommandActionData,\n overrides?: SeedCommandOverrides,\n) {\n const { path, fresh, transaction, list, drop } = options.options;\n\n const datasource = dataSourceRegistry.get();\n\n if (drop) {\n // `--drop` (boolean) undoes every tracked record; `--drop=<name>` scopes to\n // a single seeder.\n const seederName = typeof drop === \"string\" ? drop : undefined;\n\n const deleted = await dropSeedRecords(datasource, seederName);\n\n const scope = seederName ? colors.cyan(seederName) : \"all seeders\";\n console.log(\n `🗑️ Dropped ${colors.redBright(deleted)} tracked record(s) for ${scope}; matching seeds-log entries reset.`,\n );\n return;\n }\n\n if (fresh) {\n await clearAllTables(datasource);\n }\n\n if (list) {\n const seedFiles = await listSeedsFiles();\n\n if (seedFiles.length === 0) {\n console.log(\"No seeds found.\");\n return;\n }\n\n const seedersManager = new SeedersManager();\n\n seedersManager.register(...seedFiles);\n\n const seeds = seedersManager.sort().seeders.map((seed) => {\n return {\n name: seed.name,\n order: seed.order,\n enabled: seed.enabled,\n };\n });\n\n console.table(seeds);\n\n console.log(\n `Total Seeds: ${colors.blueBright(seeds.length)}, enabled: ${colors.greenBright(seeds.filter((seed) => seed.enabled !== false).length)}, disabled: ${colors.redBright(seeds.filter((seed) => seed.enabled === false).length)}`,\n );\n return;\n }\n\n const seeds = path\n ? [await loadSeedFile(Path.toAbsolute(path as string))]\n : await listSeedsFiles();\n\n const seedersManager = new SeedersManager({ clock: overrides?.clock });\n\n seedersManager.register(...seeds);\n\n await seedersManager.run(transaction as boolean);\n}\n\nasync function listSeedsFiles() {\n const seedsFiles = await getFilesFromDirectory(srcPath(\"app\"), \"*/seeds/*.ts\");\n\n const seeds = [];\n\n for (const seedFile of seedsFiles) {\n const seed = await loadSeedFile(seedFile);\n seeds.push(seed);\n }\n\n return seeds;\n}\n\nasync function loadSeedFile(absPath: string): Promise<Seeder> {\n const relativePath = Path.toRelative(absPath);\n const seedImport = await filesOrchestrator.load<{ default: Seeder }>(relativePath);\n\n if (!seedImport || !seedImport.default) {\n throw new Error(`Seeder file ${relativePath} does not export a default seeder.`);\n }\n\n return seedImport.default;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"seed-command-action.mjs","names":["runInTransaction"],"sources":["../../../../../../../core/src/database/seed-command-action.ts"],"sourcesContent":["import { colors } from \"@mongez/copper\";\nimport {\n DataSource,\n dataSourceRegistry,\n transaction as runInTransaction,\n} from \"@warlock.js/cascade\";\nimport { CommandActionData } from \"../cli/types\";\nimport { filesOrchestrator } from \"../dev-server/files-orchestrator\";\nimport { Path } from \"../dev-server/path\";\nimport { getFilesFromDirectory } from \"../dev-server/utils\";\nimport { srcPath } from \"../utils\";\nimport { Seeder } from \"./seeds/seeder\";\nimport { SeedersManager } from \"./seeds/seeders.manager\";\nimport { SeedClock, SeedRecordRef } from \"./seeds/types\";\nimport { seedRecordsTableName, seedsTableName } from \"./seeds/utils\";\n\n/**\n * Programmatic-only overrides for {@link seedCommandAction}.\n *\n * Not derived from CLI flags (the CLI passes only {@link CommandActionData}),\n * so a back-fill script or a test can inject behaviour the command line can't\n * express.\n */\nexport type SeedCommandOverrides = {\n /**\n * Clock the run reads for the `now` handed to each seeder and for the\n * seeds-log metadata timestamps. Defaults to `() => new Date()`. Forwarded to\n * {@link SeedersManager}'s `clock` option.\n */\n clock?: SeedClock;\n};\n\nasync function clearAllTables(datasource: DataSource) {\n const tables = await datasource.driver.blueprint.listTables();\n\n for (const table of tables) {\n await datasource.driver.truncateTable(table, { cascade: true });\n }\n}\n\ntype SeedRecordRow = SeedRecordRef & { id: number };\n\n/**\n * Undo seeded data by deleting the records a seeder tracked via `track`.\n *\n * Reads `seed_records` (all seeders, or a single `seederName`), then deletes\n * the referenced records in REVERSE seed-order and, within each seed, in\n * reverse insertion-order. Insertion id is strictly increasing across the\n * whole run, so deleting by descending `id` satisfies both at once. The whole\n * operation runs in a single transaction, and the matching seeds-log rows are\n * reset afterwards so `once: true` seeds re-run on the next `warlock seed`.\n *\n * @returns the number of tracked records deleted.\n */\nexport async function dropSeedRecords(\n datasource: DataSource,\n seederName?: string,\n): Promise<number> {\n const driver = datasource.driver;\n\n if (!(await driver.blueprint.tableExists(seedRecordsTableName))) {\n return 0;\n }\n\n const query = driver.queryBuilder<SeedRecordRow>(seedRecordsTableName);\n\n if (seederName) {\n query.where(\"seeder\", seederName);\n }\n\n const rows = await query.get();\n\n if (rows.length === 0) {\n return 0;\n }\n\n // Descending insertion id == reverse seed-order + reverse within-seed order.\n const ordered = [...rows].sort((a, b) => b.id - a.id);\n\n await runInTransaction(async () => {\n for (const row of ordered) {\n await driver.deleteMany(row.table, { id: row.recordId });\n }\n\n // Clear the tracked refs we just acted on.\n if (seederName) {\n await driver.deleteMany(seedRecordsTableName, { seeder: seederName });\n } else {\n await driver.deleteMany(seedRecordsTableName, {});\n }\n\n // Reset the seeds-log rows so `once: true` seeds re-run.\n const seederNames = seederName\n ? [seederName]\n : [...new Set(ordered.map((row) => row.seeder))];\n\n for (const name of seederNames) {\n await driver.deleteMany(seedsTableName, { name });\n }\n });\n\n return ordered.length;\n}\n\n/**\n * Run database seeds.\n *\n * @example\n * ```ts\n * import { seedCommandAction } from \"@warlock.js/core\";\n *\n * await seedCommandAction({\n * command: \"seed\",\n * options: { fresh: true, list: false }\n * });\n * ```\n *\n * @param overrides Programmatic-only overrides (e.g. an injected `clock`); the\n * CLI never passes this, so the command-line signature stays unchanged.\n */\nexport async function seedCommandAction(\n options: CommandActionData,\n overrides?: SeedCommandOverrides,\n) {\n const { path, fresh, transaction, list, drop } = options.options;\n\n const datasource = dataSourceRegistry.get();\n\n if (drop) {\n // `--drop` (boolean) undoes every tracked record; `--drop=<name>` scopes to\n // a single seeder.\n const seederName = typeof drop === \"string\" ? drop : undefined;\n\n const deleted = await dropSeedRecords(datasource, seederName);\n\n const scope = seederName ? colors.cyan(seederName) : \"all seeders\";\n console.log(\n `🗑️ Dropped ${colors.redBright(deleted)} tracked record(s) for ${scope}; matching seeds-log entries reset.`,\n );\n return;\n }\n\n if (fresh) {\n await clearAllTables(datasource);\n }\n\n if (list) {\n const seedFiles = await listSeedsFiles();\n\n if (seedFiles.length === 0) {\n console.log(\"No seeds found.\");\n return;\n }\n\n const seedersManager = new SeedersManager();\n\n seedersManager.register(...seedFiles);\n\n const seeds = seedersManager.sort().seeders.map((seed) => {\n return {\n name: seed.name,\n order: seed.order,\n enabled: seed.enabled,\n };\n });\n\n console.table(seeds);\n\n console.log(\n `Total Seeds: ${colors.blueBright(seeds.length)}, enabled: ${colors.greenBright(seeds.filter((seed) => seed.enabled !== false).length)}, disabled: ${colors.redBright(seeds.filter((seed) => seed.enabled === false).length)}`,\n );\n return;\n }\n\n const seeds = path\n ? [await loadSeedFile(Path.toAbsolute(path as string))]\n : await listSeedsFiles();\n\n const seedersManager = new SeedersManager({ clock: overrides?.clock });\n\n seedersManager.register(...seeds);\n\n await seedersManager.run(transaction as boolean);\n}\n\nasync function listSeedsFiles() {\n const seedsFiles = await getFilesFromDirectory(srcPath(\"app\"), \"*/seeds/*.ts\");\n\n const seeds = [];\n\n for (const seedFile of seedsFiles) {\n const seed = await loadSeedFile(seedFile);\n seeds.push(seed);\n }\n\n return seeds;\n}\n\nasync function loadSeedFile(absPath: string): Promise<Seeder> {\n const relativePath = Path.toRelative(absPath);\n const seedImport = await filesOrchestrator.load<{ default: Seeder }>(relativePath);\n\n if (!seedImport || !seedImport.default) {\n throw new Error(`Seeder file ${relativePath} does not export a default seeder.`);\n }\n\n return seedImport.default;\n}\n"],"mappings":";;;;;;;;;;;AAgCA,eAAe,eAAe,YAAwB;CACpD,MAAM,SAAS,MAAM,WAAW,OAAO,UAAU,WAAW;CAE5D,KAAK,MAAM,SAAS,QAClB,MAAM,WAAW,OAAO,cAAc,OAAO,EAAE,SAAS,KAAK,CAAC;AAElE;;;;;;;;;;;;;AAgBA,eAAsB,gBACpB,YACA,YACiB;CACjB,MAAM,SAAS,WAAW;CAE1B,IAAI,CAAE,MAAM,OAAO,UAAU,2BAAgC,GAC3D,OAAO;CAGT,MAAM,QAAQ,OAAO,aAA4B,oBAAoB;CAErE,IAAI,YACF,MAAM,MAAM,UAAU,UAAU;CAGlC,MAAM,OAAO,MAAM,MAAM,IAAI;CAE7B,IAAI,KAAK,WAAW,GAClB,OAAO;CAIT,MAAM,UAAU,CAAC,GAAG,IAAI,CAAC,CAAC,MAAM,GAAG,MAAM,EAAE,KAAK,EAAE,EAAE;CAEpD,MAAMA,YAAiB,YAAY;EACjC,KAAK,MAAM,OAAO,SAChB,MAAM,OAAO,WAAW,IAAI,OAAO,EAAE,IAAI,IAAI,SAAS,CAAC;EAIzD,IAAI,YACF,MAAM,OAAO,WAAW,sBAAsB,EAAE,QAAQ,WAAW,CAAC;OAEpE,MAAM,OAAO,WAAW,sBAAsB,CAAC,CAAC;EAIlD,MAAM,cAAc,aAChB,CAAC,UAAU,IACX,CAAC,GAAG,IAAI,IAAI,QAAQ,KAAK,QAAQ,IAAI,MAAM,CAAC,CAAC;EAEjD,KAAK,MAAM,QAAQ,aACjB,MAAM,OAAO,WAAW,gBAAgB,EAAE,KAAK,CAAC;CAEpD,CAAC;CAED,OAAO,QAAQ;AACjB;;;;;;;;;;;;;;;;;AAkBA,eAAsB,kBACpB,SACA,WACA;CACA,MAAM,EAAE,MAAM,OAAO,aAAa,MAAM,SAAS,QAAQ;CAEzD,MAAM,aAAa,mBAAmB,IAAI;CAE1C,IAAI,MAAM;EAGR,MAAM,aAAa,OAAO,SAAS,WAAW,OAAO;EAErD,MAAM,UAAU,MAAM,gBAAgB,YAAY,UAAU;EAE5D,MAAM,QAAQ,aAAa,OAAO,KAAK,UAAU,IAAI;EACrD,QAAQ,IACN,gBAAgB,OAAO,UAAU,OAAO,EAAE,yBAAyB,MAAM,oCAC3E;EACA;CACF;CAEA,IAAI,OACF,MAAM,eAAe,UAAU;CAGjC,IAAI,MAAM;EACR,MAAM,YAAY,MAAM,eAAe;EAEvC,IAAI,UAAU,WAAW,GAAG;GAC1B,QAAQ,IAAI,iBAAiB;GAC7B;EACF;EAEA,MAAM,iBAAiB,IAAI,eAAe;EAE1C,eAAe,SAAS,GAAG,SAAS;EAEpC,MAAM,QAAQ,eAAe,KAAK,CAAC,CAAC,QAAQ,KAAK,SAAS;GACxD,OAAO;IACL,MAAM,KAAK;IACX,OAAO,KAAK;IACZ,SAAS,KAAK;GAChB;EACF,CAAC;EAED,QAAQ,MAAM,KAAK;EAEnB,QAAQ,IACN,gBAAgB,OAAO,WAAW,MAAM,MAAM,EAAE,aAAa,OAAO,YAAY,MAAM,QAAQ,SAAS,KAAK,YAAY,KAAK,CAAC,CAAC,MAAM,EAAE,cAAc,OAAO,UAAU,MAAM,QAAQ,SAAS,KAAK,YAAY,KAAK,CAAC,CAAC,MAAM,GAC7N;EACA;CACF;CAEA,MAAM,QAAQ,OACV,CAAC,MAAM,aAAa,KAAK,WAAW,IAAc,CAAC,CAAC,IACpD,MAAM,eAAe;CAEzB,MAAM,iBAAiB,IAAI,eAAe,EAAE,OAAO,WAAW,MAAM,CAAC;CAErE,eAAe,SAAS,GAAG,KAAK;CAEhC,MAAM,eAAe,IAAI,WAAsB;AACjD;AAEA,eAAe,iBAAiB;CAC9B,MAAM,aAAa,MAAM,sBAAsB,QAAQ,KAAK,GAAG,cAAc;CAE7E,MAAM,QAAQ,CAAC;CAEf,KAAK,MAAM,YAAY,YAAY;EACjC,MAAM,OAAO,MAAM,aAAa,QAAQ;EACxC,MAAM,KAAK,IAAI;CACjB;CAEA,OAAO;AACT;AAEA,eAAe,aAAa,SAAkC;CAC5D,MAAM,eAAe,KAAK,WAAW,OAAO;CAC5C,MAAM,aAAa,MAAM,kBAAkB,KAA0B,YAAY;CAEjF,IAAI,CAAC,cAAc,CAAC,WAAW,SAC7B,MAAM,IAAI,MAAM,eAAe,aAAa,mCAAmC;CAGjF,OAAO,WAAW;AACpB"}
@@ -1,7 +1,7 @@
1
1
  import { seedRecordsTableName } from "./utils.mjs";
2
2
  import { Migration } from "@warlock.js/cascade";
3
3
 
4
- //#region ../@warlock.js/core/src/database/seeds/seed-records-table-migration.ts
4
+ //#region ../core/src/database/seeds/seed-records-table-migration.ts
5
5
  /**
6
6
  * Creates the `seed_records` table that backs `warlock seed --drop`.
7
7
  *
@@ -1 +1 @@
1
- {"version":3,"file":"seed-records-table-migration.mjs","names":[],"sources":["../../../../../../../../@warlock.js/core/src/database/seeds/seed-records-table-migration.ts"],"sourcesContent":["import { Migration } from \"@warlock.js/cascade\";\nimport { seedRecordsTableName } from \"./utils\";\n\n/**\n * Creates the `seed_records` table that backs `warlock seed --drop`.\n *\n * Each row is a reference to a single record a seeder created, captured via the\n * `track` helper inside the same transaction the seed ran in. `--drop` reads\n * these refs to delete exactly (and only) the records a seed produced, then\n * resets the matching seeds-log row so a `once: true` seed can re-run.\n */\nexport class SeedRecordsTableMigration extends Migration {\n public static migrationName = \"seed-records-table-migration\";\n public table = seedRecordsTableName;\n\n public up() {\n this.createTableIfNotExists();\n\n this.id();\n this.text(\"seeder\");\n this.text(\"table\");\n this.text(\"recordId\");\n this.dateTime(\"runAt\").useCurrent();\n }\n\n public down() {\n this.dropTableIfExists(seedRecordsTableName);\n }\n}\n"],"mappings":";;;;;;;;;;;;AAWA,IAAa,4BAAb,cAA+C,UAAU;;;eAExC;;;uBADe;;CAG9B,AAAO,KAAK;EACV,KAAK,uBAAuB;EAE5B,KAAK,GAAG;EACR,KAAK,KAAK,QAAQ;EAClB,KAAK,KAAK,OAAO;EACjB,KAAK,KAAK,UAAU;EACpB,KAAK,SAAS,OAAO,CAAC,CAAC,WAAW;CACpC;CAEA,AAAO,OAAO;EACZ,KAAK,kBAAkB,oBAAoB;CAC7C;AACF"}
1
+ {"version":3,"file":"seed-records-table-migration.mjs","names":[],"sources":["../../../../../../../../core/src/database/seeds/seed-records-table-migration.ts"],"sourcesContent":["import { Migration } from \"@warlock.js/cascade\";\nimport { seedRecordsTableName } from \"./utils\";\n\n/**\n * Creates the `seed_records` table that backs `warlock seed --drop`.\n *\n * Each row is a reference to a single record a seeder created, captured via the\n * `track` helper inside the same transaction the seed ran in. `--drop` reads\n * these refs to delete exactly (and only) the records a seed produced, then\n * resets the matching seeds-log row so a `once: true` seed can re-run.\n */\nexport class SeedRecordsTableMigration extends Migration {\n public static migrationName = \"seed-records-table-migration\";\n public table = seedRecordsTableName;\n\n public up() {\n this.createTableIfNotExists();\n\n this.id();\n this.text(\"seeder\");\n this.text(\"table\");\n this.text(\"recordId\");\n this.dateTime(\"runAt\").useCurrent();\n }\n\n public down() {\n this.dropTableIfExists(seedRecordsTableName);\n }\n}\n"],"mappings":";;;;;;;;;;;;AAWA,IAAa,4BAAb,cAA+C,UAAU;;;eAExC;;;uBADe;;CAG9B,AAAO,KAAK;EACV,KAAK,uBAAuB;EAE5B,KAAK,GAAG;EACR,KAAK,KAAK,QAAQ;EAClB,KAAK,KAAK,OAAO;EACjB,KAAK,KAAK,UAAU;EACpB,KAAK,SAAS,OAAO,CAAC,CAAC,WAAW;CACpC;CAEA,AAAO,OAAO;EACZ,KAAK,kBAAkB,oBAAoB;CAC7C;AACF"}
@@ -1,6 +1,6 @@
1
1
  import { SeedContext, SeedResult } from "./types.mjs";
2
2
 
3
- //#region ../@warlock.js/core/src/database/seeds/seeder.d.ts
3
+ //#region ../core/src/database/seeds/seeder.d.ts
4
4
  type Seeder = {
5
5
  /**
6
6
  * Seed name
@@ -1 +1 @@
1
- {"version":3,"file":"seeder.d.mts","names":[],"sources":["../../../../../../../../@warlock.js/core/src/database/seeds/seeder.ts"],"mappings":";;;KAEY,MAAA;;AAAZ;;EAIE,IAAA;EA6CS;;;EAzCT,OAAA;EAyC8B;;;EArC9B,WAAA;EAIA;;;EAAA,SAAA;EAiCA;;;EA7BA,IAAA;EA6B+B;;AAAU;EAzBzC,KAAA;EA+BoB;;;;;;;EAvBpB,SAAA;;;;;;;;;;;;;;;;;EAiBA,GAAA,CAAI,GAAA,EAAK,WAAA,GAAc,OAAA,CAAQ,UAAA;AAAA;;;;iBAMjB,MAAA,CAAO,MAAA,EAAQ,MAAA,GAAM,MAAA"}
1
+ {"version":3,"file":"seeder.d.mts","names":[],"sources":["../../../../../../../../core/src/database/seeds/seeder.ts"],"mappings":";;;KAEY,MAAA;;AAAZ;;EAIE,IAAA;EA6CS;;;EAzCT,OAAA;EAyC8B;;;EArC9B,WAAA;EAIA;;;EAAA,SAAA;EAiCA;;;EA7BA,IAAA;EA6B+B;;AAAU;EAzBzC,KAAA;EA+BoB;;;;;;;EAvBpB,SAAA;;;;;;;;;;;;;;;;;EAiBA,GAAA,CAAI,GAAA,EAAK,WAAA,GAAc,OAAA,CAAQ,UAAA;AAAA;;;;iBAMjB,MAAA,CAAO,MAAA,EAAQ,MAAA,GAAM,MAAA"}
@@ -1,4 +1,4 @@
1
- //#region ../@warlock.js/core/src/database/seeds/seeder.errors.d.ts
1
+ //#region ../core/src/database/seeds/seeder.errors.d.ts
2
2
  /**
3
3
  * Thrown when a seeder's `dependsOn` references a seeder name that is not
4
4
  * registered with the manager. Surfaces the offending dependent + the missing
@@ -1 +1 @@
1
- {"version":3,"file":"seeder.errors.d.mts","names":[],"sources":["../../../../../../../../@warlock.js/core/src/database/seeds/seeder.errors.ts"],"mappings":";;AAKA;;;;cAAa,4BAAA,SAAqC,KAAK;EAAA,SAEnC,MAAA;EAAA,SACA,UAAA;cADA,MAAA,UACA,UAAA;AAAA;;;AAAkB;AAatC;cAAa,0BAAA,SAAmC,KAAK;EAAA,SAChB,KAAA;cAAA,KAAA;AAAA"}
1
+ {"version":3,"file":"seeder.errors.d.mts","names":[],"sources":["../../../../../../../../core/src/database/seeds/seeder.errors.ts"],"mappings":";;AAKA;;;;cAAa,4BAAA,SAAqC,KAAK;EAAA,SAEnC,MAAA;EAAA,SACA,UAAA;cADA,MAAA,UACA,UAAA;AAAA;;;AAAkB;AAatC;cAAa,0BAAA,SAAmC,KAAK;EAAA,SAChB,KAAA;cAAA,KAAA;AAAA"}
@@ -1,4 +1,4 @@
1
- //#region ../@warlock.js/core/src/database/seeds/seeder.errors.ts
1
+ //#region ../core/src/database/seeds/seeder.errors.ts
2
2
  /**
3
3
  * Thrown when a seeder's `dependsOn` references a seeder name that is not
4
4
  * registered with the manager. Surfaces the offending dependent + the missing
@@ -1 +1 @@
1
- {"version":3,"file":"seeder.errors.mjs","names":[],"sources":["../../../../../../../../@warlock.js/core/src/database/seeds/seeder.errors.ts"],"sourcesContent":["/**\n * Thrown when a seeder's `dependsOn` references a seeder name that is not\n * registered with the manager. Surfaces the offending dependent + the missing\n * dependency so the misconfiguration is obvious without spelunking.\n */\nexport class UnknownSeederDependencyError extends Error {\n public constructor(\n public readonly seeder: string,\n public readonly dependency: string,\n ) {\n super(\n `Seeder \"${seeder}\" depends on \"${dependency}\", but no seeder with that name is registered.`,\n );\n this.name = \"UnknownSeederDependencyError\";\n }\n}\n\n/**\n * Thrown when the `dependsOn` graph contains a cycle, which would make a\n * deterministic run order impossible. Carries the cycle path for diagnosis.\n */\nexport class SeederDependencyCycleError extends Error {\n public constructor(public readonly cycle: string[]) {\n super(`Seeder dependency cycle detected: ${cycle.join(\" -> \")}`);\n this.name = \"SeederDependencyCycleError\";\n }\n}\n"],"mappings":";;;;;;AAKA,IAAa,+BAAb,cAAkD,MAAM;CACtD,AAAO,YACL,AAAgB,QAChB,AAAgB,YAChB;EACA,MACE,WAAW,OAAO,gBAAgB,WAAW,+CAC/C;EALgB;EACA;EAKhB,KAAK,OAAO;CACd;AACF;;;;;AAMA,IAAa,6BAAb,cAAgD,MAAM;CACpD,AAAO,YAAY,AAAgB,OAAiB;EAClD,MAAM,qCAAqC,MAAM,KAAK,MAAM,GAAG;EAD9B;EAEjC,KAAK,OAAO;CACd;AACF"}
1
+ {"version":3,"file":"seeder.errors.mjs","names":[],"sources":["../../../../../../../../core/src/database/seeds/seeder.errors.ts"],"sourcesContent":["/**\n * Thrown when a seeder's `dependsOn` references a seeder name that is not\n * registered with the manager. Surfaces the offending dependent + the missing\n * dependency so the misconfiguration is obvious without spelunking.\n */\nexport class UnknownSeederDependencyError extends Error {\n public constructor(\n public readonly seeder: string,\n public readonly dependency: string,\n ) {\n super(\n `Seeder \"${seeder}\" depends on \"${dependency}\", but no seeder with that name is registered.`,\n );\n this.name = \"UnknownSeederDependencyError\";\n }\n}\n\n/**\n * Thrown when the `dependsOn` graph contains a cycle, which would make a\n * deterministic run order impossible. Carries the cycle path for diagnosis.\n */\nexport class SeederDependencyCycleError extends Error {\n public constructor(public readonly cycle: string[]) {\n super(`Seeder dependency cycle detected: ${cycle.join(\" -> \")}`);\n this.name = \"SeederDependencyCycleError\";\n }\n}\n"],"mappings":";;;;;;AAKA,IAAa,+BAAb,cAAkD,MAAM;CACtD,AAAO,YACL,AAAgB,QAChB,AAAgB,YAChB;EACA,MACE,WAAW,OAAO,gBAAgB,WAAW,+CAC/C;EALgB;EACA;EAKhB,KAAK,OAAO;CACd;AACF;;;;;AAMA,IAAa,6BAAb,cAAgD,MAAM;CACpD,AAAO,YAAY,AAAgB,OAAiB;EAClD,MAAM,qCAAqC,MAAM,KAAK,MAAM,GAAG;EAD9B;EAEjC,KAAK,OAAO;CACd;AACF"}
@@ -1,4 +1,4 @@
1
- //#region ../@warlock.js/core/src/database/seeds/seeder.ts
1
+ //#region ../core/src/database/seeds/seeder.ts
2
2
  /**
3
3
  * Create a new seeder
4
4
  */
@@ -1 +1 @@
1
- {"version":3,"file":"seeder.mjs","names":[],"sources":["../../../../../../../../@warlock.js/core/src/database/seeds/seeder.ts"],"sourcesContent":["import { SeedContext, SeedResult } from \"./types\";\n\nexport type Seeder = {\n /**\n * Seed name\n */\n name: string;\n /**\n * Whether to enable it\n */\n enabled?: boolean;\n /**\n * Seed description\n */\n description?: string;\n /**\n * List of dependent seeds to run first\n */\n dependsOn?: string[];\n /**\n * Whether to run it once\n */\n once?: boolean;\n /**\n * Seed execution order\n */\n order?: number;\n /**\n * Batch size.\n *\n * Surfaced to `run()` as {@link SeedContext.batchSize} (defaulting to this\n * value, or `0` when unset) so a seed can forward it to\n * `Model.createMany(rows, { batchSize })`.\n */\n batchSize?: number;\n /**\n * Run seed.\n *\n * Receives a {@link SeedContext} exposing:\n * - `track` — registers the records this seed creates so they can be undone\n * by `warlock seed --drop`. Auto-derives `recordsCreated` from the track\n * count; an explicitly returned {@link SeedResult} is an optional fallback.\n * - `now` — the injectable clock to read instead of an ambient `new Date()` /\n * `dayjs()`, so historical seeds and the seeds-log share one overridable\n * clock.\n * - `batchSize` — the suggested bulk-insert batch size (from this seeder's\n * `batchSize`, default `0`).\n *\n * The `ctx` parameter is optional at the call site — an existing zero-arg\n * `run()` keeps working unchanged.\n */\n run(ctx: SeedContext): Promise<SeedResult | void>;\n};\n\n/**\n * Create a new seeder\n */\nexport function seeder(seeder: Seeder) {\n return seeder;\n}\n"],"mappings":";;;;AAyDA,SAAgB,OAAO,QAAgB;CACrC,OAAO;AACT"}
1
+ {"version":3,"file":"seeder.mjs","names":[],"sources":["../../../../../../../../core/src/database/seeds/seeder.ts"],"sourcesContent":["import { SeedContext, SeedResult } from \"./types\";\n\nexport type Seeder = {\n /**\n * Seed name\n */\n name: string;\n /**\n * Whether to enable it\n */\n enabled?: boolean;\n /**\n * Seed description\n */\n description?: string;\n /**\n * List of dependent seeds to run first\n */\n dependsOn?: string[];\n /**\n * Whether to run it once\n */\n once?: boolean;\n /**\n * Seed execution order\n */\n order?: number;\n /**\n * Batch size.\n *\n * Surfaced to `run()` as {@link SeedContext.batchSize} (defaulting to this\n * value, or `0` when unset) so a seed can forward it to\n * `Model.createMany(rows, { batchSize })`.\n */\n batchSize?: number;\n /**\n * Run seed.\n *\n * Receives a {@link SeedContext} exposing:\n * - `track` — registers the records this seed creates so they can be undone\n * by `warlock seed --drop`. Auto-derives `recordsCreated` from the track\n * count; an explicitly returned {@link SeedResult} is an optional fallback.\n * - `now` — the injectable clock to read instead of an ambient `new Date()` /\n * `dayjs()`, so historical seeds and the seeds-log share one overridable\n * clock.\n * - `batchSize` — the suggested bulk-insert batch size (from this seeder's\n * `batchSize`, default `0`).\n *\n * The `ctx` parameter is optional at the call site — an existing zero-arg\n * `run()` keeps working unchanged.\n */\n run(ctx: SeedContext): Promise<SeedResult | void>;\n};\n\n/**\n * Create a new seeder\n */\nexport function seeder(seeder: Seeder) {\n return seeder;\n}\n"],"mappings":";;;;AAyDA,SAAgB,OAAO,QAAgB;CACrC,OAAO;AACT"}
@@ -5,7 +5,7 @@ import { SeedsTableMigration } from "./seeds-table-migration.mjs";
5
5
  import { DatabaseWriterValidationError, dataSourceRegistry, migrationRunner, transaction } from "@warlock.js/cascade";
6
6
  import { colors } from "@mongez/copper";
7
7
 
8
- //#region ../@warlock.js/core/src/database/seeds/seeders.manager.ts
8
+ //#region ../core/src/database/seeds/seeders.manager.ts
9
9
  var SeedersManager = class {
10
10
  constructor(options) {
11
11
  this.options = options;
@@ -1 +1 @@
1
- {"version":3,"file":"seeders.manager.mjs","names":[],"sources":["../../../../../../../../@warlock.js/core/src/database/seeds/seeders.manager.ts"],"sourcesContent":["import { colors } from \"@mongez/copper\";\nimport {\n type DataSource,\n type DriverContract,\n DatabaseWriterValidationError,\n dataSourceRegistry,\n migrationRunner,\n transaction,\n} from \"@warlock.js/cascade\";\nimport { Seeder } from \"./seeder\";\nimport { SeederDependencyCycleError, UnknownSeederDependencyError } from \"./seeder.errors\";\nimport { SeedRecordsTableMigration } from \"./seed-records-table-migration\";\nimport { SeedsTableMigration } from \"./seeds-table-migration\";\nimport {\n SeedClock,\n SeederMetadata,\n SeedRecordRef,\n SeedResult,\n Track,\n TrackableModel,\n} from \"./types\";\nimport { seedRecordsTableName, seedsTableName } from \"./utils\";\n\nexport type SeedersManagerOptions = {\n datasource?: DataSource;\n /**\n * Clock the manager reads for the `now` it hands each seeder AND for its own\n * metadata timestamps (`createdAt` / `firstRunAt` / `lastRunAt` / a tracked\n * ref's `runAt`). Defaults to `() => new Date()`. Override it to make a\n * historical back-fill or a test deterministic — every timestamp a run\n * produces then comes from this one clock.\n */\n clock?: SeedClock;\n};\n\nexport class SeedersManager {\n public seeders: Seeder[] = [];\n\n protected datasource?: DataSource;\n\n /**\n * The single clock every timestamp in a run reads from. Defaults to\n * `() => new Date()`; overridable via {@link SeedersManagerOptions.clock}.\n */\n protected readonly now: SeedClock;\n\n public constructor(protected options?: SeedersManagerOptions) {\n this.datasource = options?.datasource ?? dataSourceRegistry.get();\n this.now = options?.clock ?? (() => new Date());\n }\n\n /**\n * Register new seeder\n */\n public register(...seeders: Seeder[]) {\n this.seeders.push(...seeders);\n return this;\n }\n\n /**\n * Initialize before running\n */\n protected async init() {\n if (!(await this.driver.blueprint.tableExists(seedsTableName))) {\n await migrationRunner.run(SeedsTableMigration);\n }\n\n if (!(await this.driver.blueprint.tableExists(seedRecordsTableName))) {\n await migrationRunner.run(SeedRecordsTableMigration);\n }\n }\n\n /**\n * Run seeders\n */\n public async run(withTransaction = true) {\n await this.init();\n\n this.prepareSeeders();\n\n console.log(`🌱 Running ${this.seeders.length} seeder(s)...\\n`);\n\n let successCount = 0;\n let skippedCount = 0;\n let failedCount = 0;\n\n for (const seeder of this.seeders) {\n // Check if already executed\n if (seeder.once && (await this.seederIsExecutedBefore(seeder))) {\n console.log(`⏭️ Skipping ${colors.yellow(seeder.name)} (already executed)`);\n skippedCount++;\n continue;\n }\n\n try {\n console.log(`🔄 Running ${colors.green(seeder.name)}...`);\n const startTime = Date.now();\n\n const refs: SeedRecordRef[] = [];\n const track = this.createTracker(seeder, refs);\n\n const runSeeder = async () => {\n // Keep LAST-RUN refs only: drop the prior refs for this seeder before\n // writing the new ones, so `--drop` undo stays bounded.\n await this.driver.deleteMany(seedRecordsTableName, { seeder: seeder.name });\n\n const result = await seeder.run({\n track,\n now: this.now,\n batchSize: seeder.batchSize ?? 0,\n });\n\n if (refs.length > 0) {\n await this.driver.insertMany(\n seedRecordsTableName,\n refs.map((ref) => ({ ...ref })),\n );\n }\n\n return result;\n };\n\n const result = withTransaction ? await transaction(runSeeder) : await runSeeder();\n\n const duration = Date.now() - startTime;\n\n // Auto-derive recordsCreated from the track count; a returned\n // SeedResult is an optional fallback when nothing was tracked.\n const recordsCreated = refs.length > 0 ? refs.length : (result?.recordsCreated ?? 0);\n\n await this.storeSeedsResults(seeder, { recordsCreated });\n\n console.log(\n `✅ ${colors.green(seeder.name)} completed (${duration}ms, ${recordsCreated} records)\\n`,\n );\n successCount++;\n } catch (error: any) {\n const err = error as Error;\n console.error(`❌ ${colors.red(seeder.name)} failed:`, err.message);\n console.log(err);\n failedCount++;\n\n if (error instanceof DatabaseWriterValidationError) {\n console.log(error.errors);\n }\n\n // Re-throw to stop execution (or continue to next seed based on your preference)\n throw error;\n }\n }\n\n // Summary\n console.log(\"\\n\" + \"=\".repeat(50));\n console.log(`✅ Success: ${successCount}`);\n\n if (skippedCount > 0) console.log(`⏭️ Skipped: ${skippedCount}`);\n\n if (failedCount > 0) console.log(`❌ Failed: ${failedCount}`);\n\n console.log(\"=\".repeat(50));\n }\n\n /**\n * Build a `track` helper bound to the given seeder. Tracked refs are pushed\n * into `refs` and persisted (within the run transaction) by the caller.\n *\n * Every overload returns its first argument so it can be chained inline.\n */\n protected createTracker(seeder: Seeder, refs: SeedRecordRef[]): Track {\n const push = (table: string, recordId: number | string) => {\n refs.push({ seeder: seeder.name, table, recordId, runAt: this.now() });\n };\n\n function track<T extends TrackableModel>(model: T): T;\n function track<T extends TrackableModel>(models: T[]): T[];\n function track(table: string, id: number | string): string;\n function track(\n arg: TrackableModel | TrackableModel[] | string,\n id?: number | string,\n ): TrackableModel | TrackableModel[] | string {\n if (typeof arg === \"string\") {\n push(arg, id as number | string);\n\n return arg;\n }\n\n if (Array.isArray(arg)) {\n for (const model of arg) {\n push(model.getTableName(), model.id);\n }\n\n return arg;\n }\n\n push(arg.getTableName(), arg.id);\n\n return arg;\n }\n\n return track;\n }\n\n /**\n * Sort seeds\n */\n public sort() {\n this.seeders = this.seeders.sort((a, b) => {\n const orderA = a.order ?? Number.MAX_SAFE_INTEGER;\n const orderB = b.order ?? Number.MAX_SAFE_INTEGER;\n return orderA - orderB;\n });\n\n return this;\n }\n\n /**\n * Prepare seeders to order by the seeder order, then resolve `dependsOn`.\n *\n * Dependencies are honored via a topological sort layered over the existing\n * numeric `order` tie-break: among seeders whose dependencies are already\n * satisfied, the lowest `order` (then registration order) runs first. Throws\n * {@link UnknownSeederDependencyError} for a missing dependency and\n * {@link SeederDependencyCycleError} for a cycle.\n */\n public prepareSeeders() {\n this.seeders = this.seeders.filter((seeder) => seeder.enabled !== false);\n\n this.sort();\n\n this.seeders = this.resolveDependencies(this.seeders);\n\n return this;\n }\n\n /**\n * Topologically sort `seeders` by their `dependsOn` names. The input is\n * assumed pre-sorted by `order` (see {@link sort}); that ordering is used as\n * the tie-break so dependency-free siblings keep their `order` sequence.\n */\n protected resolveDependencies(seeders: Seeder[]): Seeder[] {\n const byName = new Map<string, Seeder>();\n\n for (const seeder of seeders) {\n byName.set(seeder.name, seeder);\n }\n\n // Validate dependencies up-front so an unknown name is a clear error rather\n // than a silently dropped edge.\n for (const seeder of seeders) {\n for (const dependency of seeder.dependsOn ?? []) {\n if (!byName.has(dependency)) {\n throw new UnknownSeederDependencyError(seeder.name, dependency);\n }\n }\n }\n\n const sorted: Seeder[] = [];\n const state = new Map<string, \"visiting\" | \"visited\">();\n\n const visit = (seeder: Seeder, path: string[]) => {\n const status = state.get(seeder.name);\n\n if (status === \"visited\") {\n return;\n }\n\n if (status === \"visiting\") {\n const cycleStart = path.indexOf(seeder.name);\n const cycle = path.slice(cycleStart >= 0 ? cycleStart : 0).concat(seeder.name);\n\n throw new SeederDependencyCycleError(cycle);\n }\n\n state.set(seeder.name, \"visiting\");\n\n for (const dependency of seeder.dependsOn ?? []) {\n // Presence already validated above; the `!` is safe.\n visit(byName.get(dependency)!, [...path, seeder.name]);\n }\n\n state.set(seeder.name, \"visited\");\n sorted.push(seeder);\n };\n\n // Iterate in the incoming (order-sorted, registration-stable) sequence so\n // dependency-free seeders preserve their `order` tie-break.\n for (const seeder of seeders) {\n visit(seeder, []);\n }\n\n return sorted;\n }\n\n /**\n * Store seed results in db\n */\n public async storeSeedsResults(seeder: Seeder, result: SeedResult) {\n const oldResult = await this.getMetadata(seeder);\n\n // log with an emoji icon at beginning of text no of total craeted records\n console.log(`📊 Total records created: ${result.recordsCreated}`);\n\n // Read the single overridable clock once so every timestamp in this write\n // is identical (and pinned in a deterministic / historical run).\n const now = this.now();\n\n if (oldResult) {\n // Update existing record - use query builder with WHERE clause\n await this.driver\n .queryBuilder(seedsTableName)\n .where(\"name\", seeder.name)\n .update({\n runCount: oldResult.runCount + 1,\n lastRunAt: now,\n totalRecordsCreated: oldResult.totalRecordsCreated + result.recordsCreated,\n lastRunRecordsCreated: result.recordsCreated,\n });\n\n // now display total created records so far\n console.log(\n `📊 Total records created so far: ${oldResult.totalRecordsCreated + result.recordsCreated}`,\n );\n } else {\n // Insert new record\n await this.driver.insert(seedsTableName, {\n name: seeder.name,\n createdAt: now,\n firstRunAt: now,\n lastRunAt: now,\n runCount: 1,\n totalRecordsCreated: result.recordsCreated,\n lastRunRecordsCreated: result.recordsCreated,\n });\n }\n }\n\n /**\n * Get seed info from database\n */\n protected getMetadata(seeder: Seeder): Promise<SeederMetadata> {\n const driver = this.datasource.driver;\n\n return driver.queryBuilder(seedsTableName).where(\"name\", seeder.name).first();\n }\n\n /**\n * Get driver instance\n */\n protected get driver(): DriverContract {\n return this.datasource.driver;\n }\n\n /**\n * Check if seeder has been executed before\n */\n protected async seederIsExecutedBefore(seeder: Seeder) {\n return !!(await this.getMetadata(seeder));\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"seeders.manager.mjs","names":[],"sources":["../../../../../../../../core/src/database/seeds/seeders.manager.ts"],"sourcesContent":["import { colors } from \"@mongez/copper\";\nimport {\n type DataSource,\n type DriverContract,\n DatabaseWriterValidationError,\n dataSourceRegistry,\n migrationRunner,\n transaction,\n} from \"@warlock.js/cascade\";\nimport { Seeder } from \"./seeder\";\nimport { SeederDependencyCycleError, UnknownSeederDependencyError } from \"./seeder.errors\";\nimport { SeedRecordsTableMigration } from \"./seed-records-table-migration\";\nimport { SeedsTableMigration } from \"./seeds-table-migration\";\nimport {\n SeedClock,\n SeederMetadata,\n SeedRecordRef,\n SeedResult,\n Track,\n TrackableModel,\n} from \"./types\";\nimport { seedRecordsTableName, seedsTableName } from \"./utils\";\n\nexport type SeedersManagerOptions = {\n datasource?: DataSource;\n /**\n * Clock the manager reads for the `now` it hands each seeder AND for its own\n * metadata timestamps (`createdAt` / `firstRunAt` / `lastRunAt` / a tracked\n * ref's `runAt`). Defaults to `() => new Date()`. Override it to make a\n * historical back-fill or a test deterministic — every timestamp a run\n * produces then comes from this one clock.\n */\n clock?: SeedClock;\n};\n\nexport class SeedersManager {\n public seeders: Seeder[] = [];\n\n protected datasource?: DataSource;\n\n /**\n * The single clock every timestamp in a run reads from. Defaults to\n * `() => new Date()`; overridable via {@link SeedersManagerOptions.clock}.\n */\n protected readonly now: SeedClock;\n\n public constructor(protected options?: SeedersManagerOptions) {\n this.datasource = options?.datasource ?? dataSourceRegistry.get();\n this.now = options?.clock ?? (() => new Date());\n }\n\n /**\n * Register new seeder\n */\n public register(...seeders: Seeder[]) {\n this.seeders.push(...seeders);\n return this;\n }\n\n /**\n * Initialize before running\n */\n protected async init() {\n if (!(await this.driver.blueprint.tableExists(seedsTableName))) {\n await migrationRunner.run(SeedsTableMigration);\n }\n\n if (!(await this.driver.blueprint.tableExists(seedRecordsTableName))) {\n await migrationRunner.run(SeedRecordsTableMigration);\n }\n }\n\n /**\n * Run seeders\n */\n public async run(withTransaction = true) {\n await this.init();\n\n this.prepareSeeders();\n\n console.log(`🌱 Running ${this.seeders.length} seeder(s)...\\n`);\n\n let successCount = 0;\n let skippedCount = 0;\n let failedCount = 0;\n\n for (const seeder of this.seeders) {\n // Check if already executed\n if (seeder.once && (await this.seederIsExecutedBefore(seeder))) {\n console.log(`⏭️ Skipping ${colors.yellow(seeder.name)} (already executed)`);\n skippedCount++;\n continue;\n }\n\n try {\n console.log(`🔄 Running ${colors.green(seeder.name)}...`);\n const startTime = Date.now();\n\n const refs: SeedRecordRef[] = [];\n const track = this.createTracker(seeder, refs);\n\n const runSeeder = async () => {\n // Keep LAST-RUN refs only: drop the prior refs for this seeder before\n // writing the new ones, so `--drop` undo stays bounded.\n await this.driver.deleteMany(seedRecordsTableName, { seeder: seeder.name });\n\n const result = await seeder.run({\n track,\n now: this.now,\n batchSize: seeder.batchSize ?? 0,\n });\n\n if (refs.length > 0) {\n await this.driver.insertMany(\n seedRecordsTableName,\n refs.map((ref) => ({ ...ref })),\n );\n }\n\n return result;\n };\n\n const result = withTransaction ? await transaction(runSeeder) : await runSeeder();\n\n const duration = Date.now() - startTime;\n\n // Auto-derive recordsCreated from the track count; a returned\n // SeedResult is an optional fallback when nothing was tracked.\n const recordsCreated = refs.length > 0 ? refs.length : (result?.recordsCreated ?? 0);\n\n await this.storeSeedsResults(seeder, { recordsCreated });\n\n console.log(\n `✅ ${colors.green(seeder.name)} completed (${duration}ms, ${recordsCreated} records)\\n`,\n );\n successCount++;\n } catch (error: any) {\n const err = error as Error;\n console.error(`❌ ${colors.red(seeder.name)} failed:`, err.message);\n console.log(err);\n failedCount++;\n\n if (error instanceof DatabaseWriterValidationError) {\n console.log(error.errors);\n }\n\n // Re-throw to stop execution (or continue to next seed based on your preference)\n throw error;\n }\n }\n\n // Summary\n console.log(\"\\n\" + \"=\".repeat(50));\n console.log(`✅ Success: ${successCount}`);\n\n if (skippedCount > 0) console.log(`⏭️ Skipped: ${skippedCount}`);\n\n if (failedCount > 0) console.log(`❌ Failed: ${failedCount}`);\n\n console.log(\"=\".repeat(50));\n }\n\n /**\n * Build a `track` helper bound to the given seeder. Tracked refs are pushed\n * into `refs` and persisted (within the run transaction) by the caller.\n *\n * Every overload returns its first argument so it can be chained inline.\n */\n protected createTracker(seeder: Seeder, refs: SeedRecordRef[]): Track {\n const push = (table: string, recordId: number | string) => {\n refs.push({ seeder: seeder.name, table, recordId, runAt: this.now() });\n };\n\n function track<T extends TrackableModel>(model: T): T;\n function track<T extends TrackableModel>(models: T[]): T[];\n function track(table: string, id: number | string): string;\n function track(\n arg: TrackableModel | TrackableModel[] | string,\n id?: number | string,\n ): TrackableModel | TrackableModel[] | string {\n if (typeof arg === \"string\") {\n push(arg, id as number | string);\n\n return arg;\n }\n\n if (Array.isArray(arg)) {\n for (const model of arg) {\n push(model.getTableName(), model.id);\n }\n\n return arg;\n }\n\n push(arg.getTableName(), arg.id);\n\n return arg;\n }\n\n return track;\n }\n\n /**\n * Sort seeds\n */\n public sort() {\n this.seeders = this.seeders.sort((a, b) => {\n const orderA = a.order ?? Number.MAX_SAFE_INTEGER;\n const orderB = b.order ?? Number.MAX_SAFE_INTEGER;\n return orderA - orderB;\n });\n\n return this;\n }\n\n /**\n * Prepare seeders to order by the seeder order, then resolve `dependsOn`.\n *\n * Dependencies are honored via a topological sort layered over the existing\n * numeric `order` tie-break: among seeders whose dependencies are already\n * satisfied, the lowest `order` (then registration order) runs first. Throws\n * {@link UnknownSeederDependencyError} for a missing dependency and\n * {@link SeederDependencyCycleError} for a cycle.\n */\n public prepareSeeders() {\n this.seeders = this.seeders.filter((seeder) => seeder.enabled !== false);\n\n this.sort();\n\n this.seeders = this.resolveDependencies(this.seeders);\n\n return this;\n }\n\n /**\n * Topologically sort `seeders` by their `dependsOn` names. The input is\n * assumed pre-sorted by `order` (see {@link sort}); that ordering is used as\n * the tie-break so dependency-free siblings keep their `order` sequence.\n */\n protected resolveDependencies(seeders: Seeder[]): Seeder[] {\n const byName = new Map<string, Seeder>();\n\n for (const seeder of seeders) {\n byName.set(seeder.name, seeder);\n }\n\n // Validate dependencies up-front so an unknown name is a clear error rather\n // than a silently dropped edge.\n for (const seeder of seeders) {\n for (const dependency of seeder.dependsOn ?? []) {\n if (!byName.has(dependency)) {\n throw new UnknownSeederDependencyError(seeder.name, dependency);\n }\n }\n }\n\n const sorted: Seeder[] = [];\n const state = new Map<string, \"visiting\" | \"visited\">();\n\n const visit = (seeder: Seeder, path: string[]) => {\n const status = state.get(seeder.name);\n\n if (status === \"visited\") {\n return;\n }\n\n if (status === \"visiting\") {\n const cycleStart = path.indexOf(seeder.name);\n const cycle = path.slice(cycleStart >= 0 ? cycleStart : 0).concat(seeder.name);\n\n throw new SeederDependencyCycleError(cycle);\n }\n\n state.set(seeder.name, \"visiting\");\n\n for (const dependency of seeder.dependsOn ?? []) {\n // Presence already validated above; the `!` is safe.\n visit(byName.get(dependency)!, [...path, seeder.name]);\n }\n\n state.set(seeder.name, \"visited\");\n sorted.push(seeder);\n };\n\n // Iterate in the incoming (order-sorted, registration-stable) sequence so\n // dependency-free seeders preserve their `order` tie-break.\n for (const seeder of seeders) {\n visit(seeder, []);\n }\n\n return sorted;\n }\n\n /**\n * Store seed results in db\n */\n public async storeSeedsResults(seeder: Seeder, result: SeedResult) {\n const oldResult = await this.getMetadata(seeder);\n\n // log with an emoji icon at beginning of text no of total craeted records\n console.log(`📊 Total records created: ${result.recordsCreated}`);\n\n // Read the single overridable clock once so every timestamp in this write\n // is identical (and pinned in a deterministic / historical run).\n const now = this.now();\n\n if (oldResult) {\n // Update existing record - use query builder with WHERE clause\n await this.driver\n .queryBuilder(seedsTableName)\n .where(\"name\", seeder.name)\n .update({\n runCount: oldResult.runCount + 1,\n lastRunAt: now,\n totalRecordsCreated: oldResult.totalRecordsCreated + result.recordsCreated,\n lastRunRecordsCreated: result.recordsCreated,\n });\n\n // now display total created records so far\n console.log(\n `📊 Total records created so far: ${oldResult.totalRecordsCreated + result.recordsCreated}`,\n );\n } else {\n // Insert new record\n await this.driver.insert(seedsTableName, {\n name: seeder.name,\n createdAt: now,\n firstRunAt: now,\n lastRunAt: now,\n runCount: 1,\n totalRecordsCreated: result.recordsCreated,\n lastRunRecordsCreated: result.recordsCreated,\n });\n }\n }\n\n /**\n * Get seed info from database\n */\n protected getMetadata(seeder: Seeder): Promise<SeederMetadata> {\n const driver = this.datasource.driver;\n\n return driver.queryBuilder(seedsTableName).where(\"name\", seeder.name).first();\n }\n\n /**\n * Get driver instance\n */\n protected get driver(): DriverContract {\n return this.datasource.driver;\n }\n\n /**\n * Check if seeder has been executed before\n */\n protected async seederIsExecutedBefore(seeder: Seeder) {\n return !!(await this.getMetadata(seeder));\n }\n}\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { seedsTableName } from "./utils.mjs";
2
2
  import { Migration } from "@warlock.js/cascade";
3
3
 
4
- //#region ../@warlock.js/core/src/database/seeds/seeds-table-migration.ts
4
+ //#region ../core/src/database/seeds/seeds-table-migration.ts
5
5
  var SeedsTableMigration = class extends Migration {
6
6
  constructor(..._args) {
7
7
  super(..._args);
@@ -1 +1 @@
1
- {"version":3,"file":"seeds-table-migration.mjs","names":[],"sources":["../../../../../../../../@warlock.js/core/src/database/seeds/seeds-table-migration.ts"],"sourcesContent":["import { Migration } from \"@warlock.js/cascade\";\nimport { seedsTableName } from \"./utils\";\n\nexport class SeedsTableMigration extends Migration {\n public static migrationName = \"seeds-table-migration\";\n public table = seedsTableName;\n\n public up() {\n this.createTableIfNotExists();\n\n this.id();\n this.text(\"name\").unique();\n this.int(\"runCount\").default(0);\n this.dateTime(\"createdAt\").useCurrent();\n this.dateTime(\"firstRunAt\").useCurrent();\n this.dateTime(\"lastRunAt\").useCurrent();\n this.int(\"totalRecordsCreated\").default(0);\n this.int(\"lastRunRecordsCreated\").default(0);\n }\n\n public down() {\n this.dropTableIfExists(seedsTableName);\n }\n}\n"],"mappings":";;;;AAGA,IAAa,sBAAb,cAAyC,UAAU;;;eAElC;;;uBADe;;CAG9B,AAAO,KAAK;EACV,KAAK,uBAAuB;EAE5B,KAAK,GAAG;EACR,KAAK,KAAK,MAAM,CAAC,CAAC,OAAO;EACzB,KAAK,IAAI,UAAU,CAAC,CAAC,QAAQ,CAAC;EAC9B,KAAK,SAAS,WAAW,CAAC,CAAC,WAAW;EACtC,KAAK,SAAS,YAAY,CAAC,CAAC,WAAW;EACvC,KAAK,SAAS,WAAW,CAAC,CAAC,WAAW;EACtC,KAAK,IAAI,qBAAqB,CAAC,CAAC,QAAQ,CAAC;EACzC,KAAK,IAAI,uBAAuB,CAAC,CAAC,QAAQ,CAAC;CAC7C;CAEA,AAAO,OAAO;EACZ,KAAK,kBAAkB,cAAc;CACvC;AACF"}
1
+ {"version":3,"file":"seeds-table-migration.mjs","names":[],"sources":["../../../../../../../../core/src/database/seeds/seeds-table-migration.ts"],"sourcesContent":["import { Migration } from \"@warlock.js/cascade\";\nimport { seedsTableName } from \"./utils\";\n\nexport class SeedsTableMigration extends Migration {\n public static migrationName = \"seeds-table-migration\";\n public table = seedsTableName;\n\n public up() {\n this.createTableIfNotExists();\n\n this.id();\n this.text(\"name\").unique();\n this.int(\"runCount\").default(0);\n this.dateTime(\"createdAt\").useCurrent();\n this.dateTime(\"firstRunAt\").useCurrent();\n this.dateTime(\"lastRunAt\").useCurrent();\n this.int(\"totalRecordsCreated\").default(0);\n this.int(\"lastRunRecordsCreated\").default(0);\n }\n\n public down() {\n this.dropTableIfExists(seedsTableName);\n }\n}\n"],"mappings":";;;;AAGA,IAAa,sBAAb,cAAyC,UAAU;;;eAElC;;;uBADe;;CAG9B,AAAO,KAAK;EACV,KAAK,uBAAuB;EAE5B,KAAK,GAAG;EACR,KAAK,KAAK,MAAM,CAAC,CAAC,OAAO;EACzB,KAAK,IAAI,UAAU,CAAC,CAAC,QAAQ,CAAC;EAC9B,KAAK,SAAS,WAAW,CAAC,CAAC,WAAW;EACtC,KAAK,SAAS,YAAY,CAAC,CAAC,WAAW;EACvC,KAAK,SAAS,WAAW,CAAC,CAAC,WAAW;EACtC,KAAK,IAAI,qBAAqB,CAAC,CAAC,QAAQ,CAAC;EACzC,KAAK,IAAI,uBAAuB,CAAC,CAAC,QAAQ,CAAC;CAC7C;CAEA,AAAO,OAAO;EACZ,KAAK,kBAAkB,cAAc;CACvC;AACF"}
@@ -1,4 +1,4 @@
1
- //#region ../@warlock.js/core/src/database/seeds/types.d.ts
1
+ //#region ../core/src/database/seeds/types.d.ts
2
2
  type SeedResult = {
3
3
  recordsCreated: number;
4
4
  };
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.mts","names":[],"sources":["../../../../../../../../@warlock.js/core/src/database/seeds/types.ts"],"mappings":";KAAY,UAAA;EACV,cAAc;AAAA;AAAA,KAGJ,cAAA;EACV,IAAA;EACA,SAAA;EACA,UAAA;EACA,SAAA;EACA,QAAA;EACA,mBAAA;EACA,qBAAA;AAAA;;;;;;;AAAqB;KAUX,cAAA;EAAc;;;EAIxB,YAAA;EAUU;;;EANV,EAAE;AAAA;;;;KAMQ,aAAA;EAgBC;AAAA;AAcb;EA1BE,MAAA;EA0Be;;;EAtBf,KAAA;EAkCW;;;EA9BX,QAAA;EA8B0C;;;EA1B1C,KAAA,EAAO,IAAI;AAAA;;;;;;;;;;AAgCwB;AAYrC;KA9BY,KAAA;;;AA8BsB;AAKlC;;aA7Ba,cAAA,EAAgB,KAAA,EAAO,CAAA,GAAI,CAAA;EAgDxB;;;;;EAAA,WA1CH,cAAA,EAAgB,MAAA,EAAQ,CAAA,KAAM,CAAA;EAuDhC;AAAA;;;;EAAA,CAjDR,KAAA,UAAe,EAAA;AAAA;;;;;;;;;;KAYN,SAAA,SAAkB,IAAI;;;;KAKtB,WAAA;;;;;EAKV,KAAA,EAAO,KAAA;;;;;;;;;;;;;;EAcP,GAAA,EAAK,SAAS;;;;;;;;;;;;;EAad,SAAA;AAAA"}
1
+ {"version":3,"file":"types.d.mts","names":[],"sources":["../../../../../../../../core/src/database/seeds/types.ts"],"mappings":";KAAY,UAAA;EACV,cAAc;AAAA;AAAA,KAGJ,cAAA;EACV,IAAA;EACA,SAAA;EACA,UAAA;EACA,SAAA;EACA,QAAA;EACA,mBAAA;EACA,qBAAA;AAAA;;;;;;;AAAqB;KAUX,cAAA;EAAc;;;EAIxB,YAAA;EAUU;;;EANV,EAAE;AAAA;;;;KAMQ,aAAA;EAgBC;AAAA;AAcb;EA1BE,MAAA;EA0Be;;;EAtBf,KAAA;EAkCW;;;EA9BX,QAAA;EA8B0C;;;EA1B1C,KAAA,EAAO,IAAI;AAAA;;;;;;;;;;AAgCwB;AAYrC;KA9BY,KAAA;;;AA8BsB;AAKlC;;aA7Ba,cAAA,EAAgB,KAAA,EAAO,CAAA,GAAI,CAAA;EAgDxB;;;;;EAAA,WA1CH,cAAA,EAAgB,MAAA,EAAQ,CAAA,KAAM,CAAA;EAuDhC;AAAA;;;;EAAA,CAjDR,KAAA,UAAe,EAAA;AAAA;;;;;;;;;;KAYN,SAAA,SAAkB,IAAI;;;;KAKtB,WAAA;;;;;EAKV,KAAA,EAAO,KAAA;;;;;;;;;;;;;;EAcP,GAAA,EAAK,SAAS;;;;;;;;;;;;;EAad,SAAA;AAAA"}
@@ -1,4 +1,4 @@
1
- //#region ../@warlock.js/core/src/database/seeds/utils.ts
1
+ //#region ../core/src/database/seeds/utils.ts
2
2
  const seedsTableName = "_seeds";
3
3
  /**
4
4
  * Table that stores per-record references created by seeders, written via the
@@ -1 +1 @@
1
- {"version":3,"file":"utils.mjs","names":[],"sources":["../../../../../../../../@warlock.js/core/src/database/seeds/utils.ts"],"sourcesContent":["export const seedsTableName = \"_seeds\";\n\n/**\n * Table that stores per-record references created by seeders, written via the\n * `track` helper. Backs `warlock seed --drop`.\n */\nexport const seedRecordsTableName = \"_seed_records\";\n"],"mappings":";AAAA,MAAa,iBAAiB;;;;;AAM9B,MAAa,uBAAuB"}
1
+ {"version":3,"file":"utils.mjs","names":[],"sources":["../../../../../../../../core/src/database/seeds/utils.ts"],"sourcesContent":["export const seedsTableName = \"_seeds\";\n\n/**\n * Table that stores per-record references created by seeders, written via the\n * `track` helper. Backs `warlock seed --drop`.\n */\nexport const seedRecordsTableName = \"_seed_records\";\n"],"mappings":";AAAA,MAAa,iBAAiB;;;;;AAM9B,MAAa,uBAAuB"}
@@ -1,7 +1,7 @@
1
1
  import { SchemaContext } from "@warlock.js/seal";
2
2
  import { Model } from "@warlock.js/cascade";
3
3
 
4
- //#region ../@warlock.js/core/src/database/utils.d.ts
4
+ //#region ../core/src/database/utils.d.ts
5
5
  /**
6
6
  * Hash password on saving if password changes
7
7
  */
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.mts","names":[],"sources":["../../../../../../../@warlock.js/core/src/database/utils.ts"],"mappings":";;;;;;AASA;cAAa,iBAAA;AAAA,KASR,qBAAA,IACH,IAAA,OACA,KAAA,EAAO,KAAA,EACP,OAAA,EAAS,aAAA,WACA,OAAA;;AANP;AAAC;iBAWW,gBAAA,CAAiB,QAAA,EAAU,qBAAA,GAAqB,gBAAA;;;;iBAWhD,eAAA,CAAgB,KAAA,WAAiB,KAAA,0BAAuC,gBAAA"}
1
+ {"version":3,"file":"utils.d.mts","names":[],"sources":["../../../../../../../core/src/database/utils.ts"],"mappings":";;;;;;AASA;cAAa,iBAAA;AAAA,KASR,qBAAA,IACH,IAAA,OACA,KAAA,EAAO,KAAA,EACP,OAAA,EAAS,aAAA,WACA,OAAA;;AANP;AAAC;iBAWW,gBAAA,CAAiB,QAAA,EAAU,qBAAA,GAAqB,gBAAA;;;;iBAWhD,eAAA,CAAgB,KAAA,WAAiB,KAAA,0BAAuC,gBAAA"}
@@ -3,7 +3,7 @@ import { slugify } from "@mongez/slug";
3
3
  import { get } from "@mongez/reinforcements";
4
4
  import { authService } from "@warlock.js/auth";
5
5
 
6
- //#region ../@warlock.js/core/src/database/utils.ts
6
+ //#region ../core/src/database/utils.ts
7
7
  /**
8
8
  * Hash password on saving if password changes
9
9
  */
@@ -1 +1 @@
1
- {"version":3,"file":"utils.mjs","names":[],"sources":["../../../../../../../@warlock.js/core/src/database/utils.ts"],"sourcesContent":["import { get } from \"@mongez/reinforcements\";\nimport { slugify } from \"@mongez/slug\";\nimport { authService } from \"@warlock.js/auth\";\nimport { Model, useModelTransformer } from \"@warlock.js/cascade\";\nimport { ComputedCallback, SchemaContext } from \"@warlock.js/seal\";\n\n/**\n * Hash password on saving if password changes\n */\nexport const useHashedPassword = () =>\n useModelTransformer(({ value, isChanged, isNew }) => {\n if (!value) return value;\n\n if (!isNew && !isChanged) return value;\n\n return authService.hashPassword(String(value));\n });\n\ntype ComputedCallbackModel = (\n data: any,\n model: Model,\n context: SchemaContext,\n) => any | Promise<any>;\n\n/**\n * Generate computed value based on other fields\n */\nexport function useComputedModel(callback: ComputedCallbackModel) {\n const computedCallback: ComputedCallback = (data, context) => {\n return callback(data, context.rootContext!.model, context);\n };\n\n return computedCallback;\n}\n\n/**\n * Generate slug based on a field on saving\n */\nexport function useComputedSlug(field = \"title\", scope: \"global\" | \"sibling\" = \"sibling\") {\n return useComputedModel((data, model, context) => {\n const value = scope === \"sibling\" ? data[field] : get(context.allValues, field);\n\n if (!value) return model.get(field);\n\n return slugify(value);\n });\n}\n"],"mappings":";;;;;;;;;AASA,MAAa,0BACX,qBAAqB,EAAE,OAAO,WAAW,YAAY;CACnD,IAAI,CAAC,OAAO,OAAO;CAEnB,IAAI,CAAC,SAAS,CAAC,WAAW,OAAO;CAEjC,OAAO,YAAY,aAAa,OAAO,KAAK,CAAC;AAC/C,CAAC;;;;AAWH,SAAgB,iBAAiB,UAAiC;CAChE,MAAM,oBAAsC,MAAM,YAAY;EAC5D,OAAO,SAAS,MAAM,QAAQ,YAAa,OAAO,OAAO;CAC3D;CAEA,OAAO;AACT;;;;AAKA,SAAgB,gBAAgB,QAAQ,SAAS,QAA8B,WAAW;CACxF,OAAO,kBAAkB,MAAM,OAAO,YAAY;EAChD,MAAM,QAAQ,UAAU,YAAY,KAAK,SAAS,IAAI,QAAQ,WAAW,KAAK;EAE9E,IAAI,CAAC,OAAO,OAAO,MAAM,IAAI,KAAK;EAElC,OAAO,QAAQ,KAAK;CACtB,CAAC;AACH"}
1
+ {"version":3,"file":"utils.mjs","names":[],"sources":["../../../../../../../core/src/database/utils.ts"],"sourcesContent":["import { get } from \"@mongez/reinforcements\";\nimport { slugify } from \"@mongez/slug\";\nimport { authService } from \"@warlock.js/auth\";\nimport { Model, useModelTransformer } from \"@warlock.js/cascade\";\nimport { ComputedCallback, SchemaContext } from \"@warlock.js/seal\";\n\n/**\n * Hash password on saving if password changes\n */\nexport const useHashedPassword = () =>\n useModelTransformer(({ value, isChanged, isNew }) => {\n if (!value) return value;\n\n if (!isNew && !isChanged) return value;\n\n return authService.hashPassword(String(value));\n });\n\ntype ComputedCallbackModel = (\n data: any,\n model: Model,\n context: SchemaContext,\n) => any | Promise<any>;\n\n/**\n * Generate computed value based on other fields\n */\nexport function useComputedModel(callback: ComputedCallbackModel) {\n const computedCallback: ComputedCallback = (data, context) => {\n return callback(data, context.rootContext!.model, context);\n };\n\n return computedCallback;\n}\n\n/**\n * Generate slug based on a field on saving\n */\nexport function useComputedSlug(field = \"title\", scope: \"global\" | \"sibling\" = \"sibling\") {\n return useComputedModel((data, model, context) => {\n const value = scope === \"sibling\" ? data[field] : get(context.allValues, field);\n\n if (!value) return model.get(field);\n\n return slugify(value);\n });\n}\n"],"mappings":";;;;;;;;;AASA,MAAa,0BACX,qBAAqB,EAAE,OAAO,WAAW,YAAY;CACnD,IAAI,CAAC,OAAO,OAAO;CAEnB,IAAI,CAAC,SAAS,CAAC,WAAW,OAAO;CAEjC,OAAO,YAAY,aAAa,OAAO,KAAK,CAAC;AAC/C,CAAC;;;;AAWH,SAAgB,iBAAiB,UAAiC;CAChE,MAAM,oBAAsC,MAAM,YAAY;EAC5D,OAAO,SAAS,MAAM,QAAQ,YAAa,OAAO,OAAO;CAC3D;CAEA,OAAO;AACT;;;;AAKA,SAAgB,gBAAgB,QAAQ,SAAS,QAA8B,WAAW;CACxF,OAAO,kBAAkB,MAAM,OAAO,YAAY;EAChD,MAAM,QAAQ,UAAU,YAAY,KAAK,SAAS,IAAI,QAAQ,WAAW,KAAK;EAE9E,IAAI,CAAC,OAAO,OAAO,MAAM,IAAI,KAAK;EAElC,OAAO,QAAQ,KAAK;CACtB,CAAC;AACH"}
@@ -3,36 +3,65 @@ import { isNewerVersion } from "../utils/version-compare.mjs";
3
3
  import { getWarlockVersion } from "../utils/framework-vesion.mjs";
4
4
  import { warlockConfigManager } from "../warlock-config/warlock-config.manager.mjs";
5
5
  import "../warlock-config/index.mjs";
6
+ import { updateWarlockPackages } from "../updater/update-warlock-packages.mjs";
7
+ import { restartDevServer } from "./restart-dev-server.mjs";
8
+ import { devServerShortcuts } from "./shortcuts.mjs";
9
+ import { clearCachedLatestVersion, readCachedLatestVersion, writeCachedLatestVersion } from "./update-check-cache.mjs";
6
10
  import { colors } from "@mongez/copper";
7
11
 
8
- //#region ../@warlock.js/core/src/dev-server/check-for-updates.ts
12
+ //#region ../core/src/dev-server/check-for-updates.ts
9
13
  /** The package whose version represents the whole (lockstep) family. */
10
14
  const CORE_PACKAGE = "@warlock.js/core";
11
15
  /** Where developers can read what changed between releases. */
12
16
  const CHANGELOG_URL = "https://warlock.js.org/changelog/";
17
+ /** The key that applies the update without leaving the dev server. */
18
+ const UPDATE_SHORTCUT_KEY = "u";
19
+ /**
20
+ * Abort budget for the notice's registry lookup. Deliberately much shorter
21
+ * than the `warlock update` command's: nobody is waiting on this answer, and
22
+ * a network that hangs (captive portal, dead VPN, flaky DNS) must not leave a
23
+ * pending request and a live timer sitting around behind a running dev server.
24
+ */
25
+ const UPDATE_CHECK_TIMEOUT_MS = 5e3;
13
26
  /**
14
27
  * Check npm for a newer `@warlock.js/core` release and, if one exists, print
15
28
  * a short non-blocking notice to the terminal. Because the whole family is
16
29
  * released in lockstep, core's version stands in for every `@warlock.js/*`
17
30
  * package, so a single lookup is enough.
18
31
  *
19
- * Designed to be called fire-and-forget right after the dev server is ready:
20
- * it never throws, never blocks startup, and stays silent unless there is a
32
+ * When a `devServer` is passed and the terminal is interactive, the notice
33
+ * also arms the `u` shortcut: one keypress updates every `@warlock.js/*`
34
+ * dependency, installs, and restarts the server.
35
+ *
36
+ * Designed to be called fire-and-forget once the dev server is ready: it
37
+ * never throws, never blocks startup, and stays silent unless there is a
21
38
  * genuinely newer version to report. Automatically skipped in CI, in
22
39
  * non-interactive (non-TTY) shells, and when `devServer.checkForUpdates` is
23
40
  * set to `false`.
24
41
  */
25
- async function checkForFrameworkUpdate() {
42
+ async function checkForFrameworkUpdate(devServer) {
26
43
  try {
27
44
  if (!isUpdateCheckEnabled()) return;
28
45
  if ((await warlockConfigManager.get("devServer"))?.checkForUpdates === false) return;
29
46
  const currentVersion = await getWarlockVersion();
30
- const latestVersion = await fetchLatestVersion(CORE_PACKAGE);
47
+ const latestVersion = await resolveLatestVersion();
31
48
  if (!latestVersion || !isNewerVersion(latestVersion, currentVersion)) return;
32
- printUpdateNotice(currentVersion, latestVersion);
49
+ printUpdateNotice(currentVersion, latestVersion, offerUpdateShortcut(devServer));
33
50
  } catch {}
34
51
  }
35
52
  /**
53
+ * The latest published core version, preferring a recent cached answer over a
54
+ * network round-trip. Every `warlock dev` boot would otherwise hit npm, which
55
+ * is a lot of traffic for a question whose answer changes a few times a month.
56
+ */
57
+ async function resolveLatestVersion() {
58
+ const cached = await readCachedLatestVersion();
59
+ if (cached) return cached;
60
+ const latestVersion = await fetchLatestVersion(CORE_PACKAGE, UPDATE_CHECK_TIMEOUT_MS);
61
+ if (latestVersion) await writeCachedLatestVersion(latestVersion);
62
+ return latestVersion;
63
+ }
64
+ /**
36
65
  * Whether an update check should run at all in the current environment.
37
66
  * Mirrors npm's own update-notifier conventions: stay quiet in CI, in
38
67
  * non-interactive shells, and when explicitly opted out via env.
@@ -44,15 +73,69 @@ function isUpdateCheckEnabled() {
44
73
  return true;
45
74
  }
46
75
  /**
76
+ * Arm the `u` shortcut, if there is a server to restart and a terminal that
77
+ * can deliver keypresses. Returns whether the notice may advertise it.
78
+ */
79
+ function offerUpdateShortcut(devServer) {
80
+ if (!devServer) return false;
81
+ return devServerShortcuts.register({
82
+ key: UPDATE_SHORTCUT_KEY,
83
+ description: "update @warlock.js packages and restart",
84
+ handler: () => updateAndRestart(devServer)
85
+ });
86
+ }
87
+ /**
88
+ * The `u` handler: rewrite the `@warlock.js/*` versions, install them, and
89
+ * come back up on the new ones.
90
+ *
91
+ * The shortcut is dropped and the terminal released first, so the package
92
+ * manager child owns stdin (and a second `u` can't stack a parallel install).
93
+ * Releasing has to be explicit: the standing shortcut bar keeps other keys
94
+ * registered, so dropping `u` alone would leave us in raw mode.
95
+ *
96
+ * The terminal is taken back — and `u` re-armed — only for the cases worth
97
+ * retrying: an unreachable registry, or a restart that could not be started.
98
+ */
99
+ async function updateAndRestart(devServer) {
100
+ devServerShortcuts.unregister(UPDATE_SHORTCUT_KEY);
101
+ devServerShortcuts.release();
102
+ console.log();
103
+ const result = await updateWarlockPackages();
104
+ if (result.outcome === "updated") {
105
+ await clearCachedLatestVersion();
106
+ if (!await restartDevServer(devServer)) {
107
+ devServerShortcuts.resume();
108
+ console.log(` ${colors.dim("Restart the dev server manually to load the new version.")}`);
109
+ }
110
+ return;
111
+ }
112
+ devServerShortcuts.resume();
113
+ if (result.outcome === "registry-unreachable") {
114
+ printShortcutRetryHint();
115
+ offerUpdateShortcut(devServer);
116
+ return;
117
+ }
118
+ }
119
+ /**
47
120
  * Print the "update available" notice in the dev-logger's visual style.
121
+ *
122
+ * @param canPressKey Whether the `u` shortcut is armed. When it is not (piped
123
+ * stdin, CI, a supervisor), fall back to the command the
124
+ * developer can run by hand.
48
125
  */
49
- function printUpdateNotice(currentVersion, latestVersion) {
126
+ function printUpdateNotice(currentVersion, latestVersion, canPressKey) {
50
127
  console.log();
51
128
  console.log(` ${colors.yellow("⚡")} ${colors.bold("A new version of Warlock.js is available")} ${colors.dim(currentVersion)} ${colors.dim("→")} ${colors.greenBright(latestVersion)}`);
52
- console.log(` ${colors.dim("Run")} ${colors.cyan("npx warlock update")} ${colors.dim("to update all @warlock.js packages")}`);
129
+ if (canPressKey) console.log(` ${colors.dim("Press")} ${colors.bold(colors.cyan(UPDATE_SHORTCUT_KEY))} ${colors.dim("to update all @warlock.js packages and restart")}`);
130
+ else console.log(` ${colors.dim("Run")} ${colors.cyan("npx warlock update")} ${colors.dim("to update all @warlock.js packages")}`);
53
131
  console.log(` ${colors.dim("Changelog")} ${colors.cyan(CHANGELOG_URL)}`);
54
132
  console.log();
55
133
  }
134
+ /** Tell the developer the shortcut is still available after a failed try. */
135
+ function printShortcutRetryHint() {
136
+ console.log(` ${colors.dim("Press")} ${colors.bold(colors.cyan(UPDATE_SHORTCUT_KEY))} ${colors.dim("to try again once you are back online")}`);
137
+ console.log();
138
+ }
56
139
 
57
140
  //#endregion
58
141
  export { checkForFrameworkUpdate };
@@ -1 +1 @@
1
- {"version":3,"file":"check-for-updates.mjs","names":[],"sources":["../../../../../../../@warlock.js/core/src/dev-server/check-for-updates.ts"],"sourcesContent":["import { colors } from \"@mongez/copper\";\nimport { getWarlockVersion } from \"../utils/framework-vesion\";\nimport { fetchLatestVersion } from \"../utils/npm-registry\";\nimport { isNewerVersion } from \"../utils/version-compare\";\nimport { warlockConfigManager } from \"../warlock-config\";\n\n/** The package whose version represents the whole (lockstep) family. */\nconst CORE_PACKAGE = \"@warlock.js/core\";\n\n/** Where developers can read what changed between releases. */\nconst CHANGELOG_URL = \"https://warlock.js.org/changelog/\";\n\n/**\n * Check npm for a newer `@warlock.js/core` release and, if one exists, print\n * a short non-blocking notice to the terminal. Because the whole family is\n * released in lockstep, core's version stands in for every `@warlock.js/*`\n * package, so a single lookup is enough.\n *\n * Designed to be called fire-and-forget right after the dev server is ready:\n * it never throws, never blocks startup, and stays silent unless there is a\n * genuinely newer version to report. Automatically skipped in CI, in\n * non-interactive (non-TTY) shells, and when `devServer.checkForUpdates` is\n * set to `false`.\n */\nexport async function checkForFrameworkUpdate(): Promise<void> {\n try {\n if (!isUpdateCheckEnabled()) {\n return;\n }\n\n const devServerConfig = await warlockConfigManager.get(\"devServer\");\n\n if (devServerConfig?.checkForUpdates === false) {\n return;\n }\n\n const currentVersion = await getWarlockVersion();\n const latestVersion = await fetchLatestVersion(CORE_PACKAGE);\n\n if (!latestVersion || !isNewerVersion(latestVersion, currentVersion)) {\n return;\n }\n\n printUpdateNotice(currentVersion, latestVersion);\n } catch {\n // An update check is a convenience — never let it disrupt the dev server.\n }\n}\n\n/**\n * Whether an update check should run at all in the current environment.\n * Mirrors npm's own update-notifier conventions: stay quiet in CI, in\n * non-interactive shells, and when explicitly opted out via env.\n */\nfunction isUpdateCheckEnabled(): boolean {\n if (process.env.CI) {\n return false;\n }\n\n if (process.env.NO_UPDATE_NOTIFIER) {\n return false;\n }\n\n if (!process.stdout.isTTY) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Print the \"update available\" notice in the dev-logger's visual style.\n */\nfunction printUpdateNotice(currentVersion: string, latestVersion: string): void {\n console.log();\n console.log(\n ` ${colors.yellow(\"⚡\")} ${colors.bold(\"A new version of Warlock.js is available\")} ` +\n `${colors.dim(currentVersion)} ${colors.dim(\"→\")} ${colors.greenBright(latestVersion)}`,\n );\n console.log(\n ` ${colors.dim(\"Run\")} ${colors.cyan(\"npx warlock update\")} ` +\n `${colors.dim(\"to update all @warlock.js packages\")}`,\n );\n console.log(` ${colors.dim(\"Changelog\")} ${colors.cyan(CHANGELOG_URL)}`);\n console.log();\n}\n"],"mappings":";;;;;;;;;AAOA,MAAM,eAAe;;AAGrB,MAAM,gBAAgB;;;;;;;;;;;;;AActB,eAAsB,0BAAyC;CAC7D,IAAI;EACF,IAAI,CAAC,qBAAqB,GACxB;EAKF,KAAI,MAF0B,qBAAqB,IAAI,WAAW,EAE/C,EAAE,oBAAoB,OACvC;EAGF,MAAM,iBAAiB,MAAM,kBAAkB;EAC/C,MAAM,gBAAgB,MAAM,mBAAmB,YAAY;EAE3D,IAAI,CAAC,iBAAiB,CAAC,eAAe,eAAe,cAAc,GACjE;EAGF,kBAAkB,gBAAgB,aAAa;CACjD,QAAQ,CAER;AACF;;;;;;AAOA,SAAS,uBAAgC;CACvC,IAAI,QAAQ,IAAI,IACd,OAAO;CAGT,IAAI,QAAQ,IAAI,oBACd,OAAO;CAGT,IAAI,CAAC,QAAQ,OAAO,OAClB,OAAO;CAGT,OAAO;AACT;;;;AAKA,SAAS,kBAAkB,gBAAwB,eAA6B;CAC9E,QAAQ,IAAI;CACZ,QAAQ,IACN,KAAK,OAAO,OAAO,GAAG,EAAE,GAAG,OAAO,KAAK,0CAA0C,EAAE,IAC9E,OAAO,IAAI,cAAc,EAAE,GAAG,OAAO,IAAI,GAAG,EAAE,GAAG,OAAO,YAAY,aAAa,GACxF;CACA,QAAQ,IACN,QAAQ,OAAO,IAAI,KAAK,EAAE,GAAG,OAAO,KAAK,oBAAoB,EAAE,GAC1D,OAAO,IAAI,oCAAoC,GACtD;CACA,QAAQ,IAAI,QAAQ,OAAO,IAAI,WAAW,EAAE,GAAG,OAAO,KAAK,aAAa,GAAG;CAC3E,QAAQ,IAAI;AACd"}
1
+ {"version":3,"file":"check-for-updates.mjs","names":[],"sources":["../../../../../../../core/src/dev-server/check-for-updates.ts"],"sourcesContent":["import { colors } from \"@mongez/copper\";\nimport { updateWarlockPackages } from \"../updater/update-warlock-packages\";\nimport { getWarlockVersion } from \"../utils/framework-vesion\";\nimport { fetchLatestVersion } from \"../utils/npm-registry\";\nimport { isNewerVersion } from \"../utils/version-compare\";\nimport { warlockConfigManager } from \"../warlock-config\";\nimport type { DevelopmentServer } from \"./development-server\";\nimport { restartDevServer } from \"./restart-dev-server\";\nimport { devServerShortcuts } from \"./shortcuts\";\nimport {\n clearCachedLatestVersion,\n readCachedLatestVersion,\n writeCachedLatestVersion,\n} from \"./update-check-cache\";\n\n/** The package whose version represents the whole (lockstep) family. */\nconst CORE_PACKAGE = \"@warlock.js/core\";\n\n/** Where developers can read what changed between releases. */\nconst CHANGELOG_URL = \"https://warlock.js.org/changelog/\";\n\n/** The key that applies the update without leaving the dev server. */\nconst UPDATE_SHORTCUT_KEY = \"u\";\n\n/**\n * Abort budget for the notice's registry lookup. Deliberately much shorter\n * than the `warlock update` command's: nobody is waiting on this answer, and\n * a network that hangs (captive portal, dead VPN, flaky DNS) must not leave a\n * pending request and a live timer sitting around behind a running dev server.\n */\nconst UPDATE_CHECK_TIMEOUT_MS = 5_000;\n\n/**\n * Check npm for a newer `@warlock.js/core` release and, if one exists, print\n * a short non-blocking notice to the terminal. Because the whole family is\n * released in lockstep, core's version stands in for every `@warlock.js/*`\n * package, so a single lookup is enough.\n *\n * When a `devServer` is passed and the terminal is interactive, the notice\n * also arms the `u` shortcut: one keypress updates every `@warlock.js/*`\n * dependency, installs, and restarts the server.\n *\n * Designed to be called fire-and-forget once the dev server is ready: it\n * never throws, never blocks startup, and stays silent unless there is a\n * genuinely newer version to report. Automatically skipped in CI, in\n * non-interactive (non-TTY) shells, and when `devServer.checkForUpdates` is\n * set to `false`.\n */\nexport async function checkForFrameworkUpdate(devServer?: DevelopmentServer): Promise<void> {\n try {\n if (!isUpdateCheckEnabled()) {\n return;\n }\n\n const devServerConfig = await warlockConfigManager.get(\"devServer\");\n\n if (devServerConfig?.checkForUpdates === false) {\n return;\n }\n\n const currentVersion = await getWarlockVersion();\n const latestVersion = await resolveLatestVersion();\n\n if (!latestVersion || !isNewerVersion(latestVersion, currentVersion)) {\n return;\n }\n\n printUpdateNotice(currentVersion, latestVersion, offerUpdateShortcut(devServer));\n } catch {\n // An update check is a convenience — never let it disrupt the dev server.\n }\n}\n\n/**\n * The latest published core version, preferring a recent cached answer over a\n * network round-trip. Every `warlock dev` boot would otherwise hit npm, which\n * is a lot of traffic for a question whose answer changes a few times a month.\n */\nasync function resolveLatestVersion(): Promise<string | undefined> {\n const cached = await readCachedLatestVersion();\n\n if (cached) {\n return cached;\n }\n\n const latestVersion = await fetchLatestVersion(CORE_PACKAGE, UPDATE_CHECK_TIMEOUT_MS);\n\n // A failed lookup is deliberately NOT cached as \"no version\" — that would\n // silence the notice for a day over one flaky moment. Only real answers are\n // remembered; offline simply re-asks next boot.\n if (latestVersion) {\n await writeCachedLatestVersion(latestVersion);\n }\n\n return latestVersion;\n}\n\n/**\n * Whether an update check should run at all in the current environment.\n * Mirrors npm's own update-notifier conventions: stay quiet in CI, in\n * non-interactive shells, and when explicitly opted out via env.\n */\nfunction isUpdateCheckEnabled(): boolean {\n if (process.env.CI) {\n return false;\n }\n\n if (process.env.NO_UPDATE_NOTIFIER) {\n return false;\n }\n\n if (!process.stdout.isTTY) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Arm the `u` shortcut, if there is a server to restart and a terminal that\n * can deliver keypresses. Returns whether the notice may advertise it.\n */\nfunction offerUpdateShortcut(devServer?: DevelopmentServer): boolean {\n if (!devServer) {\n return false;\n }\n\n return devServerShortcuts.register({\n key: UPDATE_SHORTCUT_KEY,\n description: \"update @warlock.js packages and restart\",\n handler: () => updateAndRestart(devServer),\n });\n}\n\n/**\n * The `u` handler: rewrite the `@warlock.js/*` versions, install them, and\n * come back up on the new ones.\n *\n * The shortcut is dropped and the terminal released first, so the package\n * manager child owns stdin (and a second `u` can't stack a parallel install).\n * Releasing has to be explicit: the standing shortcut bar keeps other keys\n * registered, so dropping `u` alone would leave us in raw mode.\n *\n * The terminal is taken back — and `u` re-armed — only for the cases worth\n * retrying: an unreachable registry, or a restart that could not be started.\n */\nasync function updateAndRestart(devServer: DevelopmentServer): Promise<void> {\n devServerShortcuts.unregister(UPDATE_SHORTCUT_KEY);\n devServerShortcuts.release();\n\n console.log();\n\n const result = await updateWarlockPackages();\n\n if (result.outcome === \"updated\") {\n // The remembered answer described the version we just replaced.\n await clearCachedLatestVersion();\n\n const restarted = await restartDevServer(devServer);\n\n if (!restarted) {\n devServerShortcuts.resume();\n console.log(` ${colors.dim(\"Restart the dev server manually to load the new version.\")}`);\n }\n\n return;\n }\n\n devServerShortcuts.resume();\n\n if (result.outcome === \"registry-unreachable\") {\n printShortcutRetryHint();\n offerUpdateShortcut(devServer);\n return;\n }\n\n // Anything else — a failed install, or a notice that turned out to be stale —\n // leaves the shortcut off on purpose: package.json is already rewritten, so a\n // second `u` would just report \"up to date\" and hide the real problem.\n}\n\n/**\n * Print the \"update available\" notice in the dev-logger's visual style.\n *\n * @param canPressKey Whether the `u` shortcut is armed. When it is not (piped\n * stdin, CI, a supervisor), fall back to the command the\n * developer can run by hand.\n */\nfunction printUpdateNotice(\n currentVersion: string,\n latestVersion: string,\n canPressKey: boolean,\n): void {\n console.log();\n console.log(\n ` ${colors.yellow(\"⚡\")} ${colors.bold(\"A new version of Warlock.js is available\")} ` +\n `${colors.dim(currentVersion)} ${colors.dim(\"→\")} ${colors.greenBright(latestVersion)}`,\n );\n\n if (canPressKey) {\n console.log(\n ` ${colors.dim(\"Press\")} ${colors.bold(colors.cyan(UPDATE_SHORTCUT_KEY))} ` +\n `${colors.dim(\"to update all @warlock.js packages and restart\")}`,\n );\n } else {\n console.log(\n ` ${colors.dim(\"Run\")} ${colors.cyan(\"npx warlock update\")} ` +\n `${colors.dim(\"to update all @warlock.js packages\")}`,\n );\n }\n\n console.log(` ${colors.dim(\"Changelog\")} ${colors.cyan(CHANGELOG_URL)}`);\n console.log();\n}\n\n/** Tell the developer the shortcut is still available after a failed try. */\nfunction printShortcutRetryHint(): void {\n console.log(\n ` ${colors.dim(\"Press\")} ${colors.bold(colors.cyan(UPDATE_SHORTCUT_KEY))} ` +\n `${colors.dim(\"to try again once you are back online\")}`,\n );\n console.log();\n}\n"],"mappings":";;;;;;;;;;;;;AAgBA,MAAM,eAAe;;AAGrB,MAAM,gBAAgB;;AAGtB,MAAM,sBAAsB;;;;;;;AAQ5B,MAAM,0BAA0B;;;;;;;;;;;;;;;;;AAkBhC,eAAsB,wBAAwB,WAA8C;CAC1F,IAAI;EACF,IAAI,CAAC,qBAAqB,GACxB;EAKF,KAAI,MAF0B,qBAAqB,IAAI,WAAW,EAE/C,EAAE,oBAAoB,OACvC;EAGF,MAAM,iBAAiB,MAAM,kBAAkB;EAC/C,MAAM,gBAAgB,MAAM,qBAAqB;EAEjD,IAAI,CAAC,iBAAiB,CAAC,eAAe,eAAe,cAAc,GACjE;EAGF,kBAAkB,gBAAgB,eAAe,oBAAoB,SAAS,CAAC;CACjF,QAAQ,CAER;AACF;;;;;;AAOA,eAAe,uBAAoD;CACjE,MAAM,SAAS,MAAM,wBAAwB;CAE7C,IAAI,QACF,OAAO;CAGT,MAAM,gBAAgB,MAAM,mBAAmB,cAAc,uBAAuB;CAKpF,IAAI,eACF,MAAM,yBAAyB,aAAa;CAG9C,OAAO;AACT;;;;;;AAOA,SAAS,uBAAgC;CACvC,IAAI,QAAQ,IAAI,IACd,OAAO;CAGT,IAAI,QAAQ,IAAI,oBACd,OAAO;CAGT,IAAI,CAAC,QAAQ,OAAO,OAClB,OAAO;CAGT,OAAO;AACT;;;;;AAMA,SAAS,oBAAoB,WAAwC;CACnE,IAAI,CAAC,WACH,OAAO;CAGT,OAAO,mBAAmB,SAAS;EACjC,KAAK;EACL,aAAa;EACb,eAAe,iBAAiB,SAAS;CAC3C,CAAC;AACH;;;;;;;;;;;;;AAcA,eAAe,iBAAiB,WAA6C;CAC3E,mBAAmB,WAAW,mBAAmB;CACjD,mBAAmB,QAAQ;CAE3B,QAAQ,IAAI;CAEZ,MAAM,SAAS,MAAM,sBAAsB;CAE3C,IAAI,OAAO,YAAY,WAAW;EAEhC,MAAM,yBAAyB;EAI/B,IAAI,CAAC,MAFmB,iBAAiB,SAAS,GAElC;GACd,mBAAmB,OAAO;GAC1B,QAAQ,IAAI,QAAQ,OAAO,IAAI,0DAA0D,GAAG;EAC9F;EAEA;CACF;CAEA,mBAAmB,OAAO;CAE1B,IAAI,OAAO,YAAY,wBAAwB;EAC7C,uBAAuB;EACvB,oBAAoB,SAAS;EAC7B;CACF;AAKF;;;;;;;;AASA,SAAS,kBACP,gBACA,eACA,aACM;CACN,QAAQ,IAAI;CACZ,QAAQ,IACN,KAAK,OAAO,OAAO,GAAG,EAAE,GAAG,OAAO,KAAK,0CAA0C,EAAE,IAC9E,OAAO,IAAI,cAAc,EAAE,GAAG,OAAO,IAAI,GAAG,EAAE,GAAG,OAAO,YAAY,aAAa,GACxF;CAEA,IAAI,aACF,QAAQ,IACN,QAAQ,OAAO,IAAI,OAAO,EAAE,GAAG,OAAO,KAAK,OAAO,KAAK,mBAAmB,CAAC,EAAE,GACxE,OAAO,IAAI,gDAAgD,GAClE;MAEA,QAAQ,IACN,QAAQ,OAAO,IAAI,KAAK,EAAE,GAAG,OAAO,KAAK,oBAAoB,EAAE,GAC1D,OAAO,IAAI,oCAAoC,GACtD;CAGF,QAAQ,IAAI,QAAQ,OAAO,IAAI,WAAW,EAAE,GAAG,OAAO,KAAK,aAAa,GAAG;CAC3E,QAAQ,IAAI;AACd;;AAGA,SAAS,yBAA+B;CACtC,QAAQ,IACN,QAAQ,OAAO,IAAI,OAAO,EAAE,GAAG,OAAO,KAAK,OAAO,KAAK,mBAAmB,CAAC,EAAE,GACxE,OAAO,IAAI,uCAAuC,GACzD;CACA,QAAQ,IAAI;AACd"}
@@ -2,7 +2,7 @@ import path from "node:path";
2
2
  import { fileURLToPath } from "url";
3
3
  import { Worker } from "worker_threads";
4
4
 
5
- //#region ../@warlock.js/core/src/dev-server/create-worker.ts
5
+ //#region ../core/src/dev-server/create-worker.ts
6
6
  /**
7
7
  * Create a worker that works in both dev (TypeScript) and production (JavaScript) environments.
8
8
  *
@@ -1 +1 @@
1
- {"version":3,"file":"create-worker.mjs","names":[],"sources":["../../../../../../../@warlock.js/core/src/dev-server/create-worker.ts"],"sourcesContent":["import path from \"node:path\";\nimport { fileURLToPath } from \"url\";\nimport { Worker, type WorkerOptions } from \"worker_threads\";\n\n/**\n * Options for creating a health check worker\n */\nexport type CreateWorkerOptions = WorkerOptions & {\n /**\n * Worker data to pass to the worker thread\n */\n workerData?: Record<string, unknown>;\n};\n\n/**\n * Create a worker that works in both dev (TypeScript) and production (JavaScript) environments.\n *\n * The worker shares the CALLING module's extension: `.ts` when core runs from\n * source (loaded via tsx), `.mjs` when core is published. Source workers are\n * run through the tsx loader; published `.mjs` workers run as-is.\n *\n * @param workerPath - Relative path to worker file WITHOUT extension (e.g., \"./workers/ts-health.worker\")\n * @param baseUrl - The import.meta.url of the calling module (used to resolve relative paths)\n * @param options - Additional worker options\n * @returns A new Worker instance\n *\n * @example\n * ```typescript\n * // In FilesHealthcareManager\n * const worker = createWorker(\n * \"./workers/ts-health.worker\",\n * import.meta.url,\n * { workerData: { cwd: process.cwd() } }\n * );\n * ```\n */\nexport function createWorker(\n workerPath: string,\n baseUrl: string,\n options?: CreateWorkerOptions,\n): Worker {\n // The worker shares the CALLING module's extension: `.ts` from source (needs the\n // tsx loader to execute), `.mjs` when core is published.\n const callerExtension = path.extname(fileURLToPath(baseUrl));\n const isSource = callerExtension === \".ts\" || callerExtension === \".tsx\";\n const workerUrl = new URL(`${workerPath}${callerExtension}`, baseUrl);\n const workerFilePath = fileURLToPath(workerUrl);\n\n const workerOptions: WorkerOptions = {\n ...options,\n };\n\n // Source workers are TypeScript — run them through the tsx loader.\n if (isSource) {\n workerOptions.execArgv = [...(options?.execArgv || []), \"--import\", \"tsx/esm\"];\n }\n\n return new Worker(workerFilePath, workerOptions);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCA,SAAgB,aACd,YACA,SACA,SACQ;CAGR,MAAM,kBAAkB,KAAK,QAAQ,cAAc,OAAO,CAAC;CAC3D,MAAM,WAAW,oBAAoB,SAAS,oBAAoB;CAElE,MAAM,iBAAiB,cAAc,IADf,IAAI,GAAG,aAAa,mBAAmB,OAChB,CAAC;CAE9C,MAAM,gBAA+B,EACnC,GAAG,QACL;CAGA,IAAI,UACF,cAAc,WAAW;EAAC,GAAI,SAAS,YAAY,CAAC;EAAI;EAAY;CAAS;CAG/E,OAAO,IAAI,OAAO,gBAAgB,aAAa;AACjD"}
1
+ {"version":3,"file":"create-worker.mjs","names":[],"sources":["../../../../../../../core/src/dev-server/create-worker.ts"],"sourcesContent":["import path from \"node:path\";\nimport { fileURLToPath } from \"url\";\nimport { Worker, type WorkerOptions } from \"worker_threads\";\n\n/**\n * Options for creating a health check worker\n */\nexport type CreateWorkerOptions = WorkerOptions & {\n /**\n * Worker data to pass to the worker thread\n */\n workerData?: Record<string, unknown>;\n};\n\n/**\n * Create a worker that works in both dev (TypeScript) and production (JavaScript) environments.\n *\n * The worker shares the CALLING module's extension: `.ts` when core runs from\n * source (loaded via tsx), `.mjs` when core is published. Source workers are\n * run through the tsx loader; published `.mjs` workers run as-is.\n *\n * @param workerPath - Relative path to worker file WITHOUT extension (e.g., \"./workers/ts-health.worker\")\n * @param baseUrl - The import.meta.url of the calling module (used to resolve relative paths)\n * @param options - Additional worker options\n * @returns A new Worker instance\n *\n * @example\n * ```typescript\n * // In FilesHealthcareManager\n * const worker = createWorker(\n * \"./workers/ts-health.worker\",\n * import.meta.url,\n * { workerData: { cwd: process.cwd() } }\n * );\n * ```\n */\nexport function createWorker(\n workerPath: string,\n baseUrl: string,\n options?: CreateWorkerOptions,\n): Worker {\n // The worker shares the CALLING module's extension: `.ts` from source (needs the\n // tsx loader to execute), `.mjs` when core is published.\n const callerExtension = path.extname(fileURLToPath(baseUrl));\n const isSource = callerExtension === \".ts\" || callerExtension === \".tsx\";\n const workerUrl = new URL(`${workerPath}${callerExtension}`, baseUrl);\n const workerFilePath = fileURLToPath(workerUrl);\n\n const workerOptions: WorkerOptions = {\n ...options,\n };\n\n // Source workers are TypeScript — run them through the tsx loader.\n if (isSource) {\n workerOptions.execArgv = [...(options?.execArgv || []), \"--import\", \"tsx/esm\"];\n }\n\n return new Worker(workerFilePath, workerOptions);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCA,SAAgB,aACd,YACA,SACA,SACQ;CAGR,MAAM,kBAAkB,KAAK,QAAQ,cAAc,OAAO,CAAC;CAC3D,MAAM,WAAW,oBAAoB,SAAS,oBAAoB;CAElE,MAAM,iBAAiB,cAAc,IADf,IAAI,GAAG,aAAa,mBAAmB,OAChB,CAAC;CAE9C,MAAM,gBAA+B,EACnC,GAAG,QACL;CAGA,IAAI,UACF,cAAc,WAAW;EAAC,GAAI,SAAS,YAAY,CAAC;EAAI;EAAY;CAAS;CAG/E,OAAO,IAAI,OAAO,gBAAgB,aAAa;AACjD"}
@@ -1,6 +1,6 @@
1
1
  import { FileManager } from "./file-manager.mjs";
2
2
 
3
- //#region ../@warlock.js/core/src/dev-server/dependency-graph.d.ts
3
+ //#region ../core/src/dev-server/dependency-graph.d.ts
4
4
  /**
5
5
  * Dependency Graph
6
6
  * Tracks bidirectional relationships between files:
@@ -1 +1 @@
1
- {"version":3,"file":"dependency-graph.d.mts","names":[],"sources":["../../../../../../../@warlock.js/core/src/dev-server/dependency-graph.ts"],"mappings":";;;;;AAYA;;;;;;;;cAAa,eAAA;EA0L4B;;;;;EAAA,QApL/B,YAAA;EAkBY;;;;;EAAA,QAXZ,UAAA;EAiD+C;;;;EAAA,QA3C/C,KAAA;EA8EU;;;EAzEX,KAAA,CAAM,KAAA,EAAO,GAAA,SAAY,WAAA;EA2G9B;;;;;;;;;EArEK,aAAA,CAAc,IAAA,UAAc,UAAA,UAAoB,UAAA;EA4HlC;;;;;EAlGd,gBAAA,CAAiB,IAAA,UAAc,UAAA;EAwM9B;;;;EA/LD,UAAA,CAAW,IAAA;;;;;;;;;;;;EAgCX,UAAA,CACL,IAAA,UACA,eAAA,EAAiB,GAAA,UACjB,oBAAA,GAAsB,GAAA;;;;;;EA+BjB,eAAA,CAAgB,IAAA,WAAe,GAAA;;;;;EAc/B,cAAA,CAAe,IAAA,UAAc,UAAA;;;;;;EAS7B,aAAA,CAAc,IAAA,WAAe,GAAA;;;;;;;;EAW7B,oBAAA,CAAqB,IAAA;;;;;;;;;;;;;EA+BrB,0BAAA;;;;;;;UA2CC,cAAA;;;;;UAiBA,iCAAA;;;;EAgGD,QAAA"}
1
+ {"version":3,"file":"dependency-graph.d.mts","names":[],"sources":["../../../../../../../core/src/dev-server/dependency-graph.ts"],"mappings":";;;;;AAYA;;;;;;;;cAAa,eAAA;EA0L4B;;;;;EAAA,QApL/B,YAAA;EAkBY;;;;;EAAA,QAXZ,UAAA;EAiD+C;;;;EAAA,QA3C/C,KAAA;EA8EU;;;EAzEX,KAAA,CAAM,KAAA,EAAO,GAAA,SAAY,WAAA;EA2G9B;;;;;;;;;EArEK,aAAA,CAAc,IAAA,UAAc,UAAA,UAAoB,UAAA;EA4HlC;;;;;EAlGd,gBAAA,CAAiB,IAAA,UAAc,UAAA;EAwM9B;;;;EA/LD,UAAA,CAAW,IAAA;;;;;;;;;;;;EAgCX,UAAA,CACL,IAAA,UACA,eAAA,EAAiB,GAAA,UACjB,oBAAA,GAAsB,GAAA;;;;;;EA+BjB,eAAA,CAAgB,IAAA,WAAe,GAAA;;;;;EAc/B,cAAA,CAAe,IAAA,UAAc,UAAA;;;;;;EAS7B,aAAA,CAAc,IAAA,WAAe,GAAA;;;;;;;;EAW7B,oBAAA,CAAqB,IAAA;;;;;;;;;;;;;EA+BrB,0BAAA;;;;;;;UA2CC,cAAA;;;;;UAiBA,iCAAA;;;;EAgGD,QAAA"}
@@ -1,4 +1,4 @@
1
- //#region ../@warlock.js/core/src/dev-server/dependency-graph.ts
1
+ //#region ../core/src/dev-server/dependency-graph.ts
2
2
  /**
3
3
  * Dependency Graph
4
4
  * Tracks bidirectional relationships between files: