@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":"type-generator.mjs","names":[],"sources":["../../../../../../../@warlock.js/core/src/dev-server/type-generator.ts"],"sourcesContent":["import { env } from \"@mongez/dotenv\";\r\nimport { ensureDirectoryAsync } from \"@warlock.js/fs\";\r\nimport { spawn } from \"child_process\";\r\nimport { constants } from \"fs\";\r\nimport { access, readFile, writeFile } from \"fs/promises\";\r\nimport { join, resolve } from \"path\";\r\nimport ts from \"typescript\";\r\nimport { warlockPath } from \"../utils\";\r\nimport { devLogError, devLogInfo, devLogSuccess, devServeLog } from \"./dev-logger\";\r\nimport { filesOrchestrator } from \"./files-orchestrator\";\r\nimport { Path } from \"./path\";\r\n\r\n/**\r\n * Typings manifest structure for tracking file hashes\r\n */\r\ntype TypingsManifest = {\r\n version: string;\r\n lastBuildTime: number;\r\n storage: {\r\n sourceHash: string;\r\n drivers: string[];\r\n } | null;\r\n config: Record<\r\n string,\r\n {\r\n sourceHash: string;\r\n typeName: string | null;\r\n importSource: string | null;\r\n keys: string[];\r\n }\r\n >;\r\n};\r\n\r\n/**\r\n * TypeGenerator - Generates TypeScript type definitions from config files\r\n *\r\n * Parses source config files using the TypeScript Compiler API to extract\r\n * keys and generate module augmentation types for IDE autocomplete.\r\n *\r\n * Uses manifest-based reconciliation to only regenerate when source files change.\r\n */\r\nexport class TypeGenerator {\r\n /**\r\n * Output directory for generated typings\r\n */\r\n private outputDir = warlockPath(\"typings\");\r\n\r\n /**\r\n * Path to typings manifest file\r\n */\r\n private manifestPath = join(this.outputDir, \"typings-manifest.json\");\r\n\r\n /**\r\n * Cached manifest data\r\n */\r\n private manifest: TypingsManifest | null = null;\r\n\r\n /**\r\n * Cache for config type info and keys\r\n */\r\n private configCache = new Map<\r\n string,\r\n {\r\n sourceHash: string;\r\n typeName: string | null;\r\n importSource: string | null;\r\n keys: string[];\r\n }\r\n >();\r\n\r\n /**\r\n * Generate all framework type definitions\r\n *\r\n * Uses manifest-based reconciliation:\r\n * - If output files don't exist: full regeneration\r\n * - If files exist: only regenerate changed configs\r\n */\r\n public async generateAll(): Promise<void> {\r\n await this.ensureOutputDir();\r\n\r\n const storageFile = join(this.outputDir, \"storage.d.ts\");\r\n const configFile = join(this.outputDir, \"config.d.ts\");\r\n\r\n const [manifestExists, storageExists, configExists] = await Promise.all([\r\n this.exists(this.manifestPath),\r\n this.exists(storageFile),\r\n this.exists(configFile),\r\n ]);\r\n\r\n if (!manifestExists || !storageExists || !configExists) {\r\n // Full regeneration (first run or files deleted)\r\n await this.fullGeneration();\r\n } else {\r\n // Load manifest for hash comparison\r\n await this.loadManifest();\r\n // Reconciliation: only regenerate changed files\r\n await this.reconcile();\r\n }\r\n\r\n await this.saveManifest();\r\n }\r\n\r\n /**\r\n * Full regeneration of all type files\r\n */\r\n private async fullGeneration(): Promise<void> {\r\n // Generate storage types\r\n const storageConfigPath = await this.findConfigFile(\"storage\");\r\n if (storageConfigPath) {\r\n this.generateStorageTypes(storageConfigPath);\r\n }\r\n\r\n // Generate config types\r\n await this.generateConfigTypes();\r\n }\r\n\r\n /**\r\n * Reconcile: only regenerate changed files\r\n */\r\n private async reconcile(): Promise<void> {\r\n const files = filesOrchestrator.getFiles();\r\n let storageChanged = false;\r\n let configChanged = false;\r\n let unchangedCount = 0;\r\n\r\n // Check storage config\r\n for (const [path, fileManager] of files) {\r\n if (path.startsWith(\"src/config/storage\")) {\r\n const manifestEntry = this.manifest?.storage;\r\n if (!manifestEntry || manifestEntry.sourceHash !== fileManager.hash) {\r\n storageChanged = true;\r\n await this.generateStorageTypes(path);\r\n }\r\n break;\r\n }\r\n }\r\n\r\n // Check config files\r\n for (const [path, fileManager] of files) {\r\n if (!path.startsWith(\"src/config/\")) continue;\r\n if (path.includes(\"index\")) continue;\r\n\r\n // Extract config name (remove dir prefix and extension)\r\n const configName = path.replace(\"src/config/\", \"\").replace(/\\.[^.]+$/, \"\");\r\n\r\n const manifestEntry = this.manifest?.config[configName];\r\n\r\n if (!manifestEntry || manifestEntry.sourceHash !== fileManager.hash) {\r\n // File changed or new - regenerate\r\n configChanged = true;\r\n const info = await this.extractConfigInfo(fileManager.absolutePath, configName);\r\n\r\n this.configCache.set(configName, {\r\n sourceHash: fileManager.hash,\r\n typeName: info.typeName,\r\n importSource: info.importSource,\r\n keys: info.keys,\r\n });\r\n } else {\r\n // Unchanged - load from manifest\r\n unchangedCount++;\r\n this.configCache.set(configName, manifestEntry);\r\n }\r\n }\r\n\r\n if (configChanged) {\r\n await this.writeConfigTypesFromCache();\r\n } else {\r\n devLogInfo(`Config types unchanged (${unchangedCount} configs cached)`);\r\n }\r\n }\r\n\r\n /**\r\n * Generate storage driver name types\r\n */\r\n public async generateStorageTypes(configPath: string): Promise<void> {\r\n try {\r\n const driverKeys = await this.extractStorageDriverKeys(configPath);\r\n\r\n if (driverKeys.length === 0) {\r\n devServeLog(\"⚠️ No storage drivers found in config\");\r\n return;\r\n }\r\n\r\n // Get file hash from filesOrchestrator\r\n const fileManager = filesOrchestrator.getFiles().get(configPath);\r\n const sourceHash = fileManager?.hash || \"\";\r\n\r\n // Update manifest\r\n if (!this.manifest) {\r\n this.manifest = this.createEmptyManifest();\r\n }\r\n this.manifest.storage = {\r\n sourceHash,\r\n drivers: driverKeys,\r\n };\r\n\r\n const interfaceContent = driverKeys.map((k) => ` ${this.toInterfaceKey(k)}: true;`).join(\"\\n\");\r\n\r\n const content = `// Auto-generated by Warlock.js - DO NOT EDIT\r\n// Generated from: ${configPath}\r\n// Regenerates on dev-server start and when storage config changes\r\n\r\nimport \"@warlock.js/core\";\r\n\r\ndeclare module \"@warlock.js/core\" {\r\n interface StorageDriverRegistry {\r\n${interfaceContent}\r\n }\r\n}\r\n`;\r\n\r\n const outputPath = join(this.outputDir, \"storage.d.ts\");\r\n await writeFile(outputPath, content, \"utf-8\");\r\n\r\n devLogSuccess(`Generated storage types: ${driverKeys.join(\", \")}`);\r\n } catch (error) {\r\n devServeLog(`⚠️ Failed to generate storage types: ${error}`);\r\n }\r\n }\r\n\r\n /**\r\n * Check if a file change should trigger type regeneration\r\n */\r\n public shouldRegenerateTypes(changedPath: string): boolean {\r\n return changedPath.includes(\"src/config/\") || changedPath.includes(\"config/\");\r\n }\r\n\r\n /**\r\n * Handle file change - uses incremental update via cache\r\n */\r\n public async handleFileChange(changedPath: string): Promise<void> {\r\n if (!this.shouldRegenerateTypes(changedPath)) {\r\n return;\r\n }\r\n\r\n // Regenerate storage types if storage config changed\r\n if (changedPath.includes(\"config/storage\")) {\r\n await this.generateStorageTypes(changedPath);\r\n await this.saveManifest();\r\n return;\r\n }\r\n\r\n // Extract config name from path\r\n const match = changedPath.match(/config\\/([^/]+)\\.[^.]+$/);\r\n if (!match) {\r\n return;\r\n }\r\n\r\n const configName = match[1];\r\n if (configName === \"index\") return;\r\n\r\n devLogInfo(`Config changed: ${configName}, updating...`);\r\n\r\n // Get file manager for hash\r\n const fileManager = filesOrchestrator.getFiles().get(changedPath);\r\n const sourceHash = fileManager?.hash || Date.now().toString();\r\n\r\n // Update only the changed config in cache (use optimized combined extraction)\r\n const configDir = join(process.cwd(), \"src/config\");\r\n const configPath = join(configDir, `${configName}.ts`);\r\n\r\n const info = await this.extractConfigInfo(configPath, configName);\r\n\r\n this.configCache.set(configName, {\r\n sourceHash,\r\n typeName: info.typeName,\r\n importSource: info.importSource,\r\n keys: info.keys,\r\n });\r\n\r\n // Regenerate config.d.ts from cache\r\n await this.writeConfigTypesFromCache();\r\n await this.saveManifest();\r\n }\r\n\r\n /**\r\n * Generate config types - populates cache and writes file\r\n */\r\n public async generateConfigTypes(): Promise<void> {\r\n try {\r\n const files = filesOrchestrator.getFiles();\r\n\r\n // Clear and repopulate cache\r\n this.configCache.clear();\r\n\r\n for (const [path, fileManager] of files) {\r\n if (!path.startsWith(\"src/config/\")) continue;\r\n if (path.includes(\"index\")) continue;\r\n\r\n // Extract config name\r\n const configName = path.replace(\"src/config/\", \"\").replace(/\\.[^.]+$/, \"\");\r\n\r\n // Use optimized combined extraction (single ts.createProgram call)\r\n const info = await this.extractConfigInfo(fileManager.absolutePath, configName);\r\n\r\n this.configCache.set(configName, {\r\n sourceHash: fileManager.hash,\r\n typeName: info.typeName,\r\n importSource: info.importSource,\r\n keys: info.keys,\r\n });\r\n }\r\n\r\n await this.writeConfigTypesFromCache();\r\n } catch (error) {\r\n devServeLog(`⚠️ Failed to generate config types: ${error}`);\r\n }\r\n }\r\n\r\n /**\r\n * Quote an interface key that isn't a valid JS identifier (e.g. a config\r\n * named `use-cases` or a storage driver `do-spaces`) so the generated\r\n * `.d.ts` stays syntactically valid. Identifier-safe names are left bare\r\n * to keep the output clean.\r\n */\r\n private toInterfaceKey(name: string): string {\r\n return /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(name) ? name : JSON.stringify(name);\r\n }\r\n\r\n /**\r\n * Write config.d.ts from cached data\r\n */\r\n private async writeConfigTypesFromCache(): Promise<void> {\r\n const configTypeInfos: Array<{\r\n name: string;\r\n typeName: string | null;\r\n importSource: string | null;\r\n }> = [];\r\n const allKeys: string[] = [];\r\n\r\n // Update manifest config section\r\n if (!this.manifest) {\r\n this.manifest = this.createEmptyManifest();\r\n }\r\n this.manifest.config = {};\r\n\r\n for (const [name, data] of this.configCache) {\r\n configTypeInfos.push({\r\n name,\r\n typeName: data.typeName,\r\n importSource: data.importSource,\r\n });\r\n allKeys.push(...data.keys);\r\n\r\n // Store in manifest\r\n this.manifest.config[name] = data;\r\n }\r\n\r\n // Group imports by source\r\n const imports = new Map<string, Set<string>>();\r\n for (const info of configTypeInfos) {\r\n if (info.typeName && info.importSource) {\r\n if (!imports.has(info.importSource)) {\r\n imports.set(info.importSource, new Set());\r\n }\r\n imports.get(info.importSource)!.add(info.typeName);\r\n }\r\n }\r\n\r\n const importStatements = Array.from(imports.entries())\r\n .map(([source, types]) => `import type { ${Array.from(types).join(\", \")} } from \"${source}\";`)\r\n .join(\"\\n\");\r\n\r\n const configEntries = configTypeInfos\r\n .map((info) => ` ${this.toInterfaceKey(info.name)}: ${info.typeName || \"unknown\"};`)\r\n .join(\"\\n\");\r\n\r\n const keyEntries = allKeys.map((key) => ` \"${key}\": true;`).join(\"\\n\");\r\n\r\n const content = `// Auto-generated by Warlock.js - DO NOT EDIT\r\n// Regenerates on dev-server start and when config files change\r\n\r\n${importStatements}\r\nimport \"@warlock.js/core\";\r\n\r\ndeclare module \"@warlock.js/core\" {\r\n interface ConfigRegistry {\r\n${configEntries}\r\n }\r\n\r\n interface ConfigKeyRegistry {\r\n${keyEntries}\r\n }\r\n}\r\n`;\r\n\r\n const outputPath = join(this.outputDir, \"config.d.ts\");\r\n await writeFile(outputPath, content, \"utf-8\");\r\n\r\n devLogSuccess(\r\n `Generated config types: ${this.configCache.size} configs, ${allKeys.length} keys`,\r\n );\r\n }\r\n\r\n // ============================================================\r\n // Manifest Management\r\n // ============================================================\r\n\r\n /**\r\n * Load manifest from disk\r\n */\r\n private async loadManifest(): Promise<boolean> {\r\n try {\r\n if (await this.exists(this.manifestPath)) {\r\n const content = await readFile(this.manifestPath, \"utf-8\");\r\n this.manifest = JSON.parse(content);\r\n return true;\r\n }\r\n } catch {\r\n // Manifest corrupted or missing\r\n }\r\n this.manifest = null;\r\n return false;\r\n }\r\n\r\n /**\r\n * Save manifest to disk\r\n */\r\n private async saveManifest(): Promise<void> {\r\n if (!this.manifest) {\r\n this.manifest = this.createEmptyManifest();\r\n }\r\n this.manifest.lastBuildTime = Date.now();\r\n\r\n await writeFile(this.manifestPath, JSON.stringify(this.manifest, null, 2), \"utf-8\");\r\n }\r\n\r\n /**\r\n * Create empty manifest structure\r\n */\r\n private createEmptyManifest(): TypingsManifest {\r\n return {\r\n version: \"1.0.0\",\r\n lastBuildTime: Date.now(),\r\n storage: null,\r\n config: {},\r\n };\r\n }\r\n\r\n // ============================================================\r\n // Type Extraction Methods\r\n // ============================================================\r\n\r\n /**\r\n * Extract BOTH type info AND keys in a single pass\r\n *\r\n * This is optimized to create ts.createProgram() only ONCE per file\r\n * instead of twice (once for type extraction, once for keys).\r\n * This reduces parsing time by ~50%.\r\n *\r\n * @param configPath Absolute path to the config file\r\n * @param configName Config name (e.g., \"auth\", \"notifications\")\r\n * @returns Combined result with type info and keys\r\n */\r\n private async extractConfigInfo(\r\n configPath: string,\r\n configName: string,\r\n ): Promise<{\r\n typeName: string | null;\r\n importSource: string | null;\r\n keys: string[];\r\n }> {\r\n if (!(await this.exists(configPath))) {\r\n return { typeName: null, importSource: null, keys: [] };\r\n }\r\n\r\n // Create program ONCE (this is the expensive operation)\r\n const program = ts.createProgram([configPath], {\r\n target: ts.ScriptTarget.ESNext,\r\n module: ts.ModuleKind.ESNext,\r\n moduleResolution: ts.ModuleResolutionKind.NodeJs,\r\n });\r\n\r\n const sourceFile = program.getSourceFile(configPath);\r\n if (!sourceFile) {\r\n return { typeName: null, importSource: null, keys: [] };\r\n }\r\n\r\n // === Type Info Extraction ===\r\n const importedTypes = new Map<string, string>();\r\n const localExportedTypes = new Set<string>();\r\n let foundTypeName: string | null = null;\r\n\r\n // === Keys Extraction ===\r\n const keys: string[] = [];\r\n\r\n const visitForTypes = (node: ts.Node): void => {\r\n // Collect imported types\r\n if (ts.isImportDeclaration(node)) {\r\n const moduleSpecifier = node.moduleSpecifier;\r\n if (ts.isStringLiteral(moduleSpecifier)) {\r\n const source = moduleSpecifier.text;\r\n const importClause = node.importClause;\r\n if (importClause?.namedBindings && ts.isNamedImports(importClause.namedBindings)) {\r\n for (const element of importClause.namedBindings.elements) {\r\n importedTypes.set(element.name.text, source);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Collect locally exported types\r\n if (ts.isTypeAliasDeclaration(node)) {\r\n const modifiers = ts.getModifiers(node);\r\n if (modifiers?.some((m) => m.kind === ts.SyntaxKind.ExportKeyword)) {\r\n localExportedTypes.add(node.name.text);\r\n }\r\n }\r\n\r\n // Collect locally exported interfaces\r\n if (ts.isInterfaceDeclaration(node)) {\r\n const modifiers = ts.getModifiers(node);\r\n if (modifiers?.some((m) => m.kind === ts.SyntaxKind.ExportKeyword)) {\r\n localExportedTypes.add(node.name.text);\r\n }\r\n }\r\n\r\n // Find type used on config variable + extract keys\r\n if (ts.isVariableDeclaration(node)) {\r\n // Type info\r\n if (node.type && ts.isTypeReferenceNode(node.type)) {\r\n foundTypeName = node.type.typeName.getText(sourceFile);\r\n }\r\n\r\n // Keys extraction\r\n if (node.initializer && ts.isObjectLiteralExpression(node.initializer)) {\r\n const visitKeys = (objNode: ts.ObjectLiteralExpression, prefix: string): void => {\r\n for (const prop of objNode.properties) {\r\n if (ts.isPropertyAssignment(prop) && prop.name) {\r\n const keyName = prop.name.getText(sourceFile);\r\n const fullKey = prefix ? `${prefix}.${keyName}` : keyName;\r\n keys.push(fullKey);\r\n if (ts.isObjectLiteralExpression(prop.initializer)) {\r\n visitKeys(prop.initializer, fullKey);\r\n }\r\n }\r\n }\r\n };\r\n visitKeys(node.initializer, configName);\r\n }\r\n }\r\n\r\n ts.forEachChild(node, visitForTypes);\r\n };\r\n\r\n ts.forEachChild(sourceFile, visitForTypes);\r\n\r\n // Resolve type info\r\n let typeName: string | null = null;\r\n let importSource: string | null = null;\r\n\r\n if (foundTypeName) {\r\n if (importedTypes.has(foundTypeName)) {\r\n typeName = foundTypeName;\r\n importSource = importedTypes.get(foundTypeName)!;\r\n } else if (localExportedTypes.has(foundTypeName)) {\r\n typeName = foundTypeName;\r\n const relativePath = Path.toRelative(configPath).replace(/\\.(ts|tsx)$/, \"\");\r\n importSource = `../../${relativePath}`;\r\n }\r\n }\r\n\r\n return { typeName, importSource, keys };\r\n }\r\n\r\n /**\r\n * Extract driver keys from storage config\r\n */\r\n private async extractStorageDriverKeys(configPath: string): Promise<string[]> {\r\n const absolutePath = resolve(configPath);\r\n\r\n if (!(await this.exists(absolutePath))) {\r\n devServeLog(`⚠️ Storage config not found: ${absolutePath}`);\r\n return [];\r\n }\r\n\r\n const program = ts.createProgram([absolutePath], {\r\n target: ts.ScriptTarget.ESNext,\r\n module: ts.ModuleKind.ESNext,\r\n moduleResolution: ts.ModuleResolutionKind.NodeJs,\r\n });\r\n\r\n const sourceFile = program.getSourceFile(absolutePath);\r\n\r\n if (!sourceFile) {\r\n devServeLog(`⚠️ Could not parse storage config: ${absolutePath}`);\r\n return [];\r\n }\r\n\r\n const keys: string[] = [];\r\n\r\n const visit = (node: ts.Node): void => {\r\n if (ts.isPropertyAssignment(node)) {\r\n const propName = node.name.getText(sourceFile);\r\n\r\n if (propName === \"drivers\" && ts.isObjectLiteralExpression(node.initializer)) {\r\n for (const prop of node.initializer.properties) {\r\n if (ts.isPropertyAssignment(prop) || ts.isShorthandPropertyAssignment(prop)) {\r\n const keyName = prop.name?.getText(sourceFile);\r\n\r\n if (keyName) {\r\n keys.push(keyName);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n ts.forEachChild(node, visit);\r\n };\r\n\r\n ts.forEachChild(sourceFile, visit);\r\n\r\n return keys;\r\n }\r\n\r\n /**\r\n * Find a config file by name\r\n */\r\n private async findConfigFile(configName: string): Promise<string | undefined> {\r\n const possiblePaths = [`src/config/${configName}.ts`, `config/${configName}.ts`];\r\n\r\n for (const path of possiblePaths) {\r\n const fullPath = join(process.cwd(), path);\r\n\r\n if (await this.exists(fullPath)) {\r\n return path;\r\n }\r\n }\r\n\r\n try {\r\n const files = filesOrchestrator.getFiles();\r\n\r\n for (const [filePath] of files) {\r\n if (filePath.includes(`config/${configName}`)) {\r\n return filePath;\r\n }\r\n }\r\n } catch {\r\n // Files orchestrator not initialized yet\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Ensure output directory exists\r\n */\r\n private async ensureOutputDir(): Promise<void> {\r\n await ensureDirectoryAsync(this.outputDir);\r\n }\r\n\r\n /**\r\n * Check if a path exists (async wrapper)\r\n */\r\n private async exists(path: string): Promise<boolean> {\r\n try {\r\n await access(path, constants.F_OK);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Execute generateAll command using spawn\r\n */\r\n public async executeGenerateAllCommand(): Promise<void> {\r\n devLogInfo(\"Checking for types generation\");\r\n const isDevServeCore = env(\"DEV_SERVER_CORE\");\r\n const childProcess = spawn(\r\n isDevServeCore ? \"yarn\" : \"npx\",\r\n [isDevServeCore ? \"cli\" : \"warlock\", \"generate.typings\"],\r\n {\r\n // const childProcess = spawn(\"yarn\", [\"cli\", \"generate.typings\"], {\r\n stdio: \"inherit\",\r\n cwd: process.cwd(),\r\n shell: true, // Required on Windows to find yarn in PATH\r\n },\r\n );\r\n\r\n childProcess.on(\"exit\", (code) => {\r\n if (code === 0) {\r\n devLogSuccess(\"Types generated successfully\");\r\n } else {\r\n devLogError(\"Failed to generate types\");\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Execute a typings generator for the given files\r\n */\r\n public async executeTypingsGenerator(upcomingFiles: string[]): Promise<void> {\r\n const uniqueFiles = Array.from(new Set(upcomingFiles));\r\n\r\n const configFilesOnly = uniqueFiles.filter((file) =>\r\n Path.normalize(file).includes(\"src/config/\"),\r\n );\r\n\r\n if (configFilesOnly.length === 0) return;\r\n\r\n const files = configFilesOnly.map((file) => \"./\" + Path.toRelative(file));\r\n\r\n const isDevServeCore = env(\"DEV_SERVER_CORE\");\r\n\r\n const childProcess = spawn(\r\n isDevServeCore ? \"yarn\" : \"npx\",\r\n [isDevServeCore ? \"cli\" : \"warlock\", \"generate.typings\"],\r\n {\r\n stdio: \"inherit\",\r\n cwd: process.cwd(),\r\n shell: true, // Required on Windows to find yarn in PATH\r\n },\r\n );\r\n\r\n childProcess.on(\"exit\", (code) => {\r\n if (code === 0) {\r\n devLogSuccess(\"Types generated successfully\");\r\n } else {\r\n devLogError(\"Failed to generate types\");\r\n }\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * Singleton instance for use throughout dev-server\r\n */\r\nexport const typeGenerator = new TypeGenerator();\r\n"],"mappings":"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"}
1
+ {"version":3,"file":"type-generator.mjs","names":[],"sources":["../../../../../../../core/src/dev-server/type-generator.ts"],"sourcesContent":["import { env } from \"@mongez/dotenv\";\r\nimport { ensureDirectoryAsync } from \"@warlock.js/fs\";\r\nimport { spawn } from \"child_process\";\r\nimport { constants } from \"fs\";\r\nimport { access, readFile, writeFile } from \"fs/promises\";\r\nimport { join, resolve } from \"path\";\r\nimport ts from \"typescript\";\r\nimport { warlockPath } from \"../utils\";\r\nimport { devLogError, devLogInfo, devLogSuccess, devServeLog } from \"./dev-logger\";\r\nimport { filesOrchestrator } from \"./files-orchestrator\";\r\nimport { Path } from \"./path\";\r\n\r\n/**\r\n * Typings manifest structure for tracking file hashes\r\n */\r\ntype TypingsManifest = {\r\n version: string;\r\n lastBuildTime: number;\r\n storage: {\r\n sourceHash: string;\r\n drivers: string[];\r\n } | null;\r\n config: Record<\r\n string,\r\n {\r\n sourceHash: string;\r\n typeName: string | null;\r\n importSource: string | null;\r\n keys: string[];\r\n }\r\n >;\r\n};\r\n\r\n/**\r\n * TypeGenerator - Generates TypeScript type definitions from config files\r\n *\r\n * Parses source config files using the TypeScript Compiler API to extract\r\n * keys and generate module augmentation types for IDE autocomplete.\r\n *\r\n * Uses manifest-based reconciliation to only regenerate when source files change.\r\n */\r\nexport class TypeGenerator {\r\n /**\r\n * Output directory for generated typings\r\n */\r\n private outputDir = warlockPath(\"typings\");\r\n\r\n /**\r\n * Path to typings manifest file\r\n */\r\n private manifestPath = join(this.outputDir, \"typings-manifest.json\");\r\n\r\n /**\r\n * Cached manifest data\r\n */\r\n private manifest: TypingsManifest | null = null;\r\n\r\n /**\r\n * Cache for config type info and keys\r\n */\r\n private configCache = new Map<\r\n string,\r\n {\r\n sourceHash: string;\r\n typeName: string | null;\r\n importSource: string | null;\r\n keys: string[];\r\n }\r\n >();\r\n\r\n /**\r\n * Generate all framework type definitions\r\n *\r\n * Uses manifest-based reconciliation:\r\n * - If output files don't exist: full regeneration\r\n * - If files exist: only regenerate changed configs\r\n */\r\n public async generateAll(): Promise<void> {\r\n await this.ensureOutputDir();\r\n\r\n const storageFile = join(this.outputDir, \"storage.d.ts\");\r\n const configFile = join(this.outputDir, \"config.d.ts\");\r\n\r\n const [manifestExists, storageExists, configExists] = await Promise.all([\r\n this.exists(this.manifestPath),\r\n this.exists(storageFile),\r\n this.exists(configFile),\r\n ]);\r\n\r\n if (!manifestExists || !storageExists || !configExists) {\r\n // Full regeneration (first run or files deleted)\r\n await this.fullGeneration();\r\n } else {\r\n // Load manifest for hash comparison\r\n await this.loadManifest();\r\n // Reconciliation: only regenerate changed files\r\n await this.reconcile();\r\n }\r\n\r\n await this.saveManifest();\r\n }\r\n\r\n /**\r\n * Full regeneration of all type files\r\n */\r\n private async fullGeneration(): Promise<void> {\r\n // Generate storage types\r\n const storageConfigPath = await this.findConfigFile(\"storage\");\r\n if (storageConfigPath) {\r\n this.generateStorageTypes(storageConfigPath);\r\n }\r\n\r\n // Generate config types\r\n await this.generateConfigTypes();\r\n }\r\n\r\n /**\r\n * Reconcile: only regenerate changed files\r\n */\r\n private async reconcile(): Promise<void> {\r\n const files = filesOrchestrator.getFiles();\r\n let storageChanged = false;\r\n let configChanged = false;\r\n let unchangedCount = 0;\r\n\r\n // Check storage config\r\n for (const [path, fileManager] of files) {\r\n if (path.startsWith(\"src/config/storage\")) {\r\n const manifestEntry = this.manifest?.storage;\r\n if (!manifestEntry || manifestEntry.sourceHash !== fileManager.hash) {\r\n storageChanged = true;\r\n await this.generateStorageTypes(path);\r\n }\r\n break;\r\n }\r\n }\r\n\r\n // Check config files\r\n for (const [path, fileManager] of files) {\r\n if (!path.startsWith(\"src/config/\")) continue;\r\n if (path.includes(\"index\")) continue;\r\n\r\n // Extract config name (remove dir prefix and extension)\r\n const configName = path.replace(\"src/config/\", \"\").replace(/\\.[^.]+$/, \"\");\r\n\r\n const manifestEntry = this.manifest?.config[configName];\r\n\r\n if (!manifestEntry || manifestEntry.sourceHash !== fileManager.hash) {\r\n // File changed or new - regenerate\r\n configChanged = true;\r\n const info = await this.extractConfigInfo(fileManager.absolutePath, configName);\r\n\r\n this.configCache.set(configName, {\r\n sourceHash: fileManager.hash,\r\n typeName: info.typeName,\r\n importSource: info.importSource,\r\n keys: info.keys,\r\n });\r\n } else {\r\n // Unchanged - load from manifest\r\n unchangedCount++;\r\n this.configCache.set(configName, manifestEntry);\r\n }\r\n }\r\n\r\n if (configChanged) {\r\n await this.writeConfigTypesFromCache();\r\n } else {\r\n devLogInfo(`Config types unchanged (${unchangedCount} configs cached)`);\r\n }\r\n }\r\n\r\n /**\r\n * Generate storage driver name types\r\n */\r\n public async generateStorageTypes(configPath: string): Promise<void> {\r\n try {\r\n const driverKeys = await this.extractStorageDriverKeys(configPath);\r\n\r\n if (driverKeys.length === 0) {\r\n devServeLog(\"⚠️ No storage drivers found in config\");\r\n return;\r\n }\r\n\r\n // Get file hash from filesOrchestrator\r\n const fileManager = filesOrchestrator.getFiles().get(configPath);\r\n const sourceHash = fileManager?.hash || \"\";\r\n\r\n // Update manifest\r\n if (!this.manifest) {\r\n this.manifest = this.createEmptyManifest();\r\n }\r\n this.manifest.storage = {\r\n sourceHash,\r\n drivers: driverKeys,\r\n };\r\n\r\n const interfaceContent = driverKeys.map((k) => ` ${this.toInterfaceKey(k)}: true;`).join(\"\\n\");\r\n\r\n const content = `// Auto-generated by Warlock.js - DO NOT EDIT\r\n// Generated from: ${configPath}\r\n// Regenerates on dev-server start and when storage config changes\r\n\r\nimport \"@warlock.js/core\";\r\n\r\ndeclare module \"@warlock.js/core\" {\r\n interface StorageDriverRegistry {\r\n${interfaceContent}\r\n }\r\n}\r\n`;\r\n\r\n const outputPath = join(this.outputDir, \"storage.d.ts\");\r\n await writeFile(outputPath, content, \"utf-8\");\r\n\r\n devLogSuccess(`Generated storage types: ${driverKeys.join(\", \")}`);\r\n } catch (error) {\r\n devServeLog(`⚠️ Failed to generate storage types: ${error}`);\r\n }\r\n }\r\n\r\n /**\r\n * Check if a file change should trigger type regeneration\r\n */\r\n public shouldRegenerateTypes(changedPath: string): boolean {\r\n return changedPath.includes(\"src/config/\") || changedPath.includes(\"config/\");\r\n }\r\n\r\n /**\r\n * Handle file change - uses incremental update via cache\r\n */\r\n public async handleFileChange(changedPath: string): Promise<void> {\r\n if (!this.shouldRegenerateTypes(changedPath)) {\r\n return;\r\n }\r\n\r\n // Regenerate storage types if storage config changed\r\n if (changedPath.includes(\"config/storage\")) {\r\n await this.generateStorageTypes(changedPath);\r\n await this.saveManifest();\r\n return;\r\n }\r\n\r\n // Extract config name from path\r\n const match = changedPath.match(/config\\/([^/]+)\\.[^.]+$/);\r\n if (!match) {\r\n return;\r\n }\r\n\r\n const configName = match[1];\r\n if (configName === \"index\") return;\r\n\r\n devLogInfo(`Config changed: ${configName}, updating...`);\r\n\r\n // Get file manager for hash\r\n const fileManager = filesOrchestrator.getFiles().get(changedPath);\r\n const sourceHash = fileManager?.hash || Date.now().toString();\r\n\r\n // Update only the changed config in cache (use optimized combined extraction)\r\n const configDir = join(process.cwd(), \"src/config\");\r\n const configPath = join(configDir, `${configName}.ts`);\r\n\r\n const info = await this.extractConfigInfo(configPath, configName);\r\n\r\n this.configCache.set(configName, {\r\n sourceHash,\r\n typeName: info.typeName,\r\n importSource: info.importSource,\r\n keys: info.keys,\r\n });\r\n\r\n // Regenerate config.d.ts from cache\r\n await this.writeConfigTypesFromCache();\r\n await this.saveManifest();\r\n }\r\n\r\n /**\r\n * Generate config types - populates cache and writes file\r\n */\r\n public async generateConfigTypes(): Promise<void> {\r\n try {\r\n const files = filesOrchestrator.getFiles();\r\n\r\n // Clear and repopulate cache\r\n this.configCache.clear();\r\n\r\n for (const [path, fileManager] of files) {\r\n if (!path.startsWith(\"src/config/\")) continue;\r\n if (path.includes(\"index\")) continue;\r\n\r\n // Extract config name\r\n const configName = path.replace(\"src/config/\", \"\").replace(/\\.[^.]+$/, \"\");\r\n\r\n // Use optimized combined extraction (single ts.createProgram call)\r\n const info = await this.extractConfigInfo(fileManager.absolutePath, configName);\r\n\r\n this.configCache.set(configName, {\r\n sourceHash: fileManager.hash,\r\n typeName: info.typeName,\r\n importSource: info.importSource,\r\n keys: info.keys,\r\n });\r\n }\r\n\r\n await this.writeConfigTypesFromCache();\r\n } catch (error) {\r\n devServeLog(`⚠️ Failed to generate config types: ${error}`);\r\n }\r\n }\r\n\r\n /**\r\n * Quote an interface key that isn't a valid JS identifier (e.g. a config\r\n * named `use-cases` or a storage driver `do-spaces`) so the generated\r\n * `.d.ts` stays syntactically valid. Identifier-safe names are left bare\r\n * to keep the output clean.\r\n */\r\n private toInterfaceKey(name: string): string {\r\n return /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(name) ? name : JSON.stringify(name);\r\n }\r\n\r\n /**\r\n * Write config.d.ts from cached data\r\n */\r\n private async writeConfigTypesFromCache(): Promise<void> {\r\n const configTypeInfos: Array<{\r\n name: string;\r\n typeName: string | null;\r\n importSource: string | null;\r\n }> = [];\r\n const allKeys: string[] = [];\r\n\r\n // Update manifest config section\r\n if (!this.manifest) {\r\n this.manifest = this.createEmptyManifest();\r\n }\r\n this.manifest.config = {};\r\n\r\n for (const [name, data] of this.configCache) {\r\n configTypeInfos.push({\r\n name,\r\n typeName: data.typeName,\r\n importSource: data.importSource,\r\n });\r\n allKeys.push(...data.keys);\r\n\r\n // Store in manifest\r\n this.manifest.config[name] = data;\r\n }\r\n\r\n // Group imports by source\r\n const imports = new Map<string, Set<string>>();\r\n for (const info of configTypeInfos) {\r\n if (info.typeName && info.importSource) {\r\n if (!imports.has(info.importSource)) {\r\n imports.set(info.importSource, new Set());\r\n }\r\n imports.get(info.importSource)!.add(info.typeName);\r\n }\r\n }\r\n\r\n const importStatements = Array.from(imports.entries())\r\n .map(([source, types]) => `import type { ${Array.from(types).join(\", \")} } from \"${source}\";`)\r\n .join(\"\\n\");\r\n\r\n const configEntries = configTypeInfos\r\n .map((info) => ` ${this.toInterfaceKey(info.name)}: ${info.typeName || \"unknown\"};`)\r\n .join(\"\\n\");\r\n\r\n const keyEntries = allKeys.map((key) => ` \"${key}\": true;`).join(\"\\n\");\r\n\r\n const content = `// Auto-generated by Warlock.js - DO NOT EDIT\r\n// Regenerates on dev-server start and when config files change\r\n\r\n${importStatements}\r\nimport \"@warlock.js/core\";\r\n\r\ndeclare module \"@warlock.js/core\" {\r\n interface ConfigRegistry {\r\n${configEntries}\r\n }\r\n\r\n interface ConfigKeyRegistry {\r\n${keyEntries}\r\n }\r\n}\r\n`;\r\n\r\n const outputPath = join(this.outputDir, \"config.d.ts\");\r\n await writeFile(outputPath, content, \"utf-8\");\r\n\r\n devLogSuccess(\r\n `Generated config types: ${this.configCache.size} configs, ${allKeys.length} keys`,\r\n );\r\n }\r\n\r\n // ============================================================\r\n // Manifest Management\r\n // ============================================================\r\n\r\n /**\r\n * Load manifest from disk\r\n */\r\n private async loadManifest(): Promise<boolean> {\r\n try {\r\n if (await this.exists(this.manifestPath)) {\r\n const content = await readFile(this.manifestPath, \"utf-8\");\r\n this.manifest = JSON.parse(content);\r\n return true;\r\n }\r\n } catch {\r\n // Manifest corrupted or missing\r\n }\r\n this.manifest = null;\r\n return false;\r\n }\r\n\r\n /**\r\n * Save manifest to disk\r\n */\r\n private async saveManifest(): Promise<void> {\r\n if (!this.manifest) {\r\n this.manifest = this.createEmptyManifest();\r\n }\r\n this.manifest.lastBuildTime = Date.now();\r\n\r\n await writeFile(this.manifestPath, JSON.stringify(this.manifest, null, 2), \"utf-8\");\r\n }\r\n\r\n /**\r\n * Create empty manifest structure\r\n */\r\n private createEmptyManifest(): TypingsManifest {\r\n return {\r\n version: \"1.0.0\",\r\n lastBuildTime: Date.now(),\r\n storage: null,\r\n config: {},\r\n };\r\n }\r\n\r\n // ============================================================\r\n // Type Extraction Methods\r\n // ============================================================\r\n\r\n /**\r\n * Extract BOTH type info AND keys in a single pass\r\n *\r\n * This is optimized to create ts.createProgram() only ONCE per file\r\n * instead of twice (once for type extraction, once for keys).\r\n * This reduces parsing time by ~50%.\r\n *\r\n * @param configPath Absolute path to the config file\r\n * @param configName Config name (e.g., \"auth\", \"notifications\")\r\n * @returns Combined result with type info and keys\r\n */\r\n private async extractConfigInfo(\r\n configPath: string,\r\n configName: string,\r\n ): Promise<{\r\n typeName: string | null;\r\n importSource: string | null;\r\n keys: string[];\r\n }> {\r\n if (!(await this.exists(configPath))) {\r\n return { typeName: null, importSource: null, keys: [] };\r\n }\r\n\r\n // Create program ONCE (this is the expensive operation)\r\n const program = ts.createProgram([configPath], {\r\n target: ts.ScriptTarget.ESNext,\r\n module: ts.ModuleKind.ESNext,\r\n moduleResolution: ts.ModuleResolutionKind.NodeJs,\r\n });\r\n\r\n const sourceFile = program.getSourceFile(configPath);\r\n if (!sourceFile) {\r\n return { typeName: null, importSource: null, keys: [] };\r\n }\r\n\r\n // === Type Info Extraction ===\r\n const importedTypes = new Map<string, string>();\r\n const localExportedTypes = new Set<string>();\r\n let foundTypeName: string | null = null;\r\n\r\n // === Keys Extraction ===\r\n const keys: string[] = [];\r\n\r\n const visitForTypes = (node: ts.Node): void => {\r\n // Collect imported types\r\n if (ts.isImportDeclaration(node)) {\r\n const moduleSpecifier = node.moduleSpecifier;\r\n if (ts.isStringLiteral(moduleSpecifier)) {\r\n const source = moduleSpecifier.text;\r\n const importClause = node.importClause;\r\n if (importClause?.namedBindings && ts.isNamedImports(importClause.namedBindings)) {\r\n for (const element of importClause.namedBindings.elements) {\r\n importedTypes.set(element.name.text, source);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Collect locally exported types\r\n if (ts.isTypeAliasDeclaration(node)) {\r\n const modifiers = ts.getModifiers(node);\r\n if (modifiers?.some((m) => m.kind === ts.SyntaxKind.ExportKeyword)) {\r\n localExportedTypes.add(node.name.text);\r\n }\r\n }\r\n\r\n // Collect locally exported interfaces\r\n if (ts.isInterfaceDeclaration(node)) {\r\n const modifiers = ts.getModifiers(node);\r\n if (modifiers?.some((m) => m.kind === ts.SyntaxKind.ExportKeyword)) {\r\n localExportedTypes.add(node.name.text);\r\n }\r\n }\r\n\r\n // Find type used on config variable + extract keys\r\n if (ts.isVariableDeclaration(node)) {\r\n // Type info\r\n if (node.type && ts.isTypeReferenceNode(node.type)) {\r\n foundTypeName = node.type.typeName.getText(sourceFile);\r\n }\r\n\r\n // Keys extraction\r\n if (node.initializer && ts.isObjectLiteralExpression(node.initializer)) {\r\n const visitKeys = (objNode: ts.ObjectLiteralExpression, prefix: string): void => {\r\n for (const prop of objNode.properties) {\r\n if (ts.isPropertyAssignment(prop) && prop.name) {\r\n const keyName = prop.name.getText(sourceFile);\r\n const fullKey = prefix ? `${prefix}.${keyName}` : keyName;\r\n keys.push(fullKey);\r\n if (ts.isObjectLiteralExpression(prop.initializer)) {\r\n visitKeys(prop.initializer, fullKey);\r\n }\r\n }\r\n }\r\n };\r\n visitKeys(node.initializer, configName);\r\n }\r\n }\r\n\r\n ts.forEachChild(node, visitForTypes);\r\n };\r\n\r\n ts.forEachChild(sourceFile, visitForTypes);\r\n\r\n // Resolve type info\r\n let typeName: string | null = null;\r\n let importSource: string | null = null;\r\n\r\n if (foundTypeName) {\r\n if (importedTypes.has(foundTypeName)) {\r\n typeName = foundTypeName;\r\n importSource = importedTypes.get(foundTypeName)!;\r\n } else if (localExportedTypes.has(foundTypeName)) {\r\n typeName = foundTypeName;\r\n const relativePath = Path.toRelative(configPath).replace(/\\.(ts|tsx)$/, \"\");\r\n importSource = `../../${relativePath}`;\r\n }\r\n }\r\n\r\n return { typeName, importSource, keys };\r\n }\r\n\r\n /**\r\n * Extract driver keys from storage config\r\n */\r\n private async extractStorageDriverKeys(configPath: string): Promise<string[]> {\r\n const absolutePath = resolve(configPath);\r\n\r\n if (!(await this.exists(absolutePath))) {\r\n devServeLog(`⚠️ Storage config not found: ${absolutePath}`);\r\n return [];\r\n }\r\n\r\n const program = ts.createProgram([absolutePath], {\r\n target: ts.ScriptTarget.ESNext,\r\n module: ts.ModuleKind.ESNext,\r\n moduleResolution: ts.ModuleResolutionKind.NodeJs,\r\n });\r\n\r\n const sourceFile = program.getSourceFile(absolutePath);\r\n\r\n if (!sourceFile) {\r\n devServeLog(`⚠️ Could not parse storage config: ${absolutePath}`);\r\n return [];\r\n }\r\n\r\n const keys: string[] = [];\r\n\r\n const visit = (node: ts.Node): void => {\r\n if (ts.isPropertyAssignment(node)) {\r\n const propName = node.name.getText(sourceFile);\r\n\r\n if (propName === \"drivers\" && ts.isObjectLiteralExpression(node.initializer)) {\r\n for (const prop of node.initializer.properties) {\r\n if (ts.isPropertyAssignment(prop) || ts.isShorthandPropertyAssignment(prop)) {\r\n const keyName = prop.name?.getText(sourceFile);\r\n\r\n if (keyName) {\r\n keys.push(keyName);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n ts.forEachChild(node, visit);\r\n };\r\n\r\n ts.forEachChild(sourceFile, visit);\r\n\r\n return keys;\r\n }\r\n\r\n /**\r\n * Find a config file by name\r\n */\r\n private async findConfigFile(configName: string): Promise<string | undefined> {\r\n const possiblePaths = [`src/config/${configName}.ts`, `config/${configName}.ts`];\r\n\r\n for (const path of possiblePaths) {\r\n const fullPath = join(process.cwd(), path);\r\n\r\n if (await this.exists(fullPath)) {\r\n return path;\r\n }\r\n }\r\n\r\n try {\r\n const files = filesOrchestrator.getFiles();\r\n\r\n for (const [filePath] of files) {\r\n if (filePath.includes(`config/${configName}`)) {\r\n return filePath;\r\n }\r\n }\r\n } catch {\r\n // Files orchestrator not initialized yet\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Ensure output directory exists\r\n */\r\n private async ensureOutputDir(): Promise<void> {\r\n await ensureDirectoryAsync(this.outputDir);\r\n }\r\n\r\n /**\r\n * Check if a path exists (async wrapper)\r\n */\r\n private async exists(path: string): Promise<boolean> {\r\n try {\r\n await access(path, constants.F_OK);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Execute generateAll command using spawn\r\n */\r\n public async executeGenerateAllCommand(): Promise<void> {\r\n devLogInfo(\"Checking for types generation\");\r\n const isDevServeCore = env(\"DEV_SERVER_CORE\");\r\n const childProcess = spawn(\r\n isDevServeCore ? \"yarn\" : \"npx\",\r\n [isDevServeCore ? \"cli\" : \"warlock\", \"generate.typings\"],\r\n {\r\n // const childProcess = spawn(\"yarn\", [\"cli\", \"generate.typings\"], {\r\n stdio: \"inherit\",\r\n cwd: process.cwd(),\r\n shell: true, // Required on Windows to find yarn in PATH\r\n },\r\n );\r\n\r\n childProcess.on(\"exit\", (code) => {\r\n if (code === 0) {\r\n devLogSuccess(\"Types generated successfully\");\r\n } else {\r\n devLogError(\"Failed to generate types\");\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Execute a typings generator for the given files\r\n */\r\n public async executeTypingsGenerator(upcomingFiles: string[]): Promise<void> {\r\n const uniqueFiles = Array.from(new Set(upcomingFiles));\r\n\r\n const configFilesOnly = uniqueFiles.filter((file) =>\r\n Path.normalize(file).includes(\"src/config/\"),\r\n );\r\n\r\n if (configFilesOnly.length === 0) return;\r\n\r\n const files = configFilesOnly.map((file) => \"./\" + Path.toRelative(file));\r\n\r\n const isDevServeCore = env(\"DEV_SERVER_CORE\");\r\n\r\n const childProcess = spawn(\r\n isDevServeCore ? \"yarn\" : \"npx\",\r\n [isDevServeCore ? \"cli\" : \"warlock\", \"generate.typings\"],\r\n {\r\n stdio: \"inherit\",\r\n cwd: process.cwd(),\r\n shell: true, // Required on Windows to find yarn in PATH\r\n },\r\n );\r\n\r\n childProcess.on(\"exit\", (code) => {\r\n if (code === 0) {\r\n devLogSuccess(\"Types generated successfully\");\r\n } else {\r\n devLogError(\"Failed to generate types\");\r\n }\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * Singleton instance for use throughout dev-server\r\n */\r\nexport const typeGenerator = new TypeGenerator();\r\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- //#region ../@warlock.js/core/src/dev-server/types.d.ts
1
+ //#region ../core/src/dev-server/types.d.ts
2
2
  type FileType = "main" | "config" | "event" | "route" | "controller" | "service" | "model" | "other";
3
3
  type FileManifest = {
4
4
  absolutePath: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.mts","names":[],"sources":["../../../../../../../@warlock.js/core/src/dev-server/types.ts"],"mappings":";KAAY,QAAA;AAAA,KAUA,YAAA;EACV,YAAA;EACA,YAAA;EACA,YAAA;EACA,IAAA;EACA,YAAA;EALsB;;;;;;;EAatB,oBAAA;EACA,UAAA;EACA,IAAA,EAAM,QAAQ;AAAA;;;AAAA;AAWhB;;;;AAAqB;KAAT,SAAA"}
1
+ {"version":3,"file":"types.d.mts","names":[],"sources":["../../../../../../../core/src/dev-server/types.ts"],"mappings":";KAAY,QAAA;AAAA,KAUA,YAAA;EACV,YAAA;EACA,YAAA;EACA,YAAA;EACA,IAAA;EACA,YAAA;EALsB;;;;;;;EAatB,oBAAA;EACA,UAAA;EACA,IAAA,EAAM,QAAQ;AAAA;;;AAAA;AAWhB;;;;AAAqB;KAAT,SAAA"}
@@ -0,0 +1,53 @@
1
+ import { warlockPath } from "../utils/paths.mjs";
2
+ import { ensureDirectoryAsync, fileExistsAsync, getJsonFileAsync, putJsonFileAsync, unlinkAsync } from "@warlock.js/fs";
3
+
4
+ //#region ../core/src/dev-server/update-check-cache.ts
5
+ /** Where the last registry answer is remembered, inside the project's `.warlock/`. */
6
+ const CACHE_PATH = warlockPath("update-check.json");
7
+ /**
8
+ * How long a registry answer stays good. A day matches npm's own
9
+ * update-notifier: long enough that a normal day of `warlock dev` restarts
10
+ * costs one lookup, short enough that a release never goes unnoticed for long.
11
+ */
12
+ const CACHE_TTL_MS = 1440 * 60 * 1e3;
13
+ /**
14
+ * The remembered latest version, or `undefined` when there is nothing usable —
15
+ * no cache, a stale one, or a corrupt one. Callers treat `undefined` as
16
+ * "ask npm".
17
+ */
18
+ async function readCachedLatestVersion(now = Date.now()) {
19
+ try {
20
+ if (!await fileExistsAsync(CACHE_PATH)) return;
21
+ const cache = await getJsonFileAsync(CACHE_PATH);
22
+ if (typeof cache?.checkedAt !== "number" || typeof cache?.latest !== "string") return;
23
+ const age = now - cache.checkedAt;
24
+ if (age < 0 || age > 864e5) return;
25
+ return cache.latest;
26
+ } catch {
27
+ return;
28
+ }
29
+ }
30
+ /** Remember a successful registry answer. Failures are silent by design. */
31
+ async function writeCachedLatestVersion(latest, now = Date.now()) {
32
+ try {
33
+ await ensureDirectoryAsync(warlockPath());
34
+ await putJsonFileAsync(CACHE_PATH, {
35
+ checkedAt: now,
36
+ latest
37
+ });
38
+ } catch {}
39
+ }
40
+ /**
41
+ * Forget the cached answer — called once an update has actually been applied,
42
+ * so the next boot re-checks against the version we just installed instead of
43
+ * reasoning from an answer that predates it.
44
+ */
45
+ async function clearCachedLatestVersion() {
46
+ try {
47
+ if (await fileExistsAsync(CACHE_PATH)) await unlinkAsync(CACHE_PATH);
48
+ } catch {}
49
+ }
50
+
51
+ //#endregion
52
+ export { clearCachedLatestVersion, readCachedLatestVersion, writeCachedLatestVersion };
53
+ //# sourceMappingURL=update-check-cache.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-check-cache.mjs","names":[],"sources":["../../../../../../../core/src/dev-server/update-check-cache.ts"],"sourcesContent":["import {\n ensureDirectoryAsync,\n fileExistsAsync,\n getJsonFileAsync,\n putJsonFileAsync,\n unlinkAsync,\n} from \"@warlock.js/fs\";\nimport { warlockPath } from \"../utils/paths\";\n\n/** Where the last registry answer is remembered, inside the project's `.warlock/`. */\nconst CACHE_PATH = warlockPath(\"update-check.json\");\n\n/**\n * How long a registry answer stays good. A day matches npm's own\n * update-notifier: long enough that a normal day of `warlock dev` restarts\n * costs one lookup, short enough that a release never goes unnoticed for long.\n */\nexport const CACHE_TTL_MS = 24 * 60 * 60 * 1000;\n\n/** What we remember between runs. Only successful lookups are ever stored. */\ntype UpdateCheckCache = {\n /** Epoch millis of the lookup. */\n checkedAt: number;\n /** The version the registry reported. */\n latest: string;\n};\n\n/**\n * The remembered latest version, or `undefined` when there is nothing usable —\n * no cache, a stale one, or a corrupt one. Callers treat `undefined` as\n * \"ask npm\".\n */\nexport async function readCachedLatestVersion(\n now: number = Date.now(),\n): Promise<string | undefined> {\n try {\n if (!(await fileExistsAsync(CACHE_PATH))) {\n return undefined;\n }\n\n const cache = (await getJsonFileAsync(CACHE_PATH)) as Partial<UpdateCheckCache>;\n\n if (typeof cache?.checkedAt !== \"number\" || typeof cache?.latest !== \"string\") {\n return undefined;\n }\n\n // A clock that moved backwards (timezone change, VM resume, a hand-edited\n // file) would otherwise pin the cache as \"fresh\" indefinitely.\n const age = now - cache.checkedAt;\n\n if (age < 0 || age > CACHE_TTL_MS) {\n return undefined;\n }\n\n return cache.latest;\n } catch {\n // The cache is an optimisation — an unreadable one just means \"ask npm\".\n return undefined;\n }\n}\n\n/** Remember a successful registry answer. Failures are silent by design. */\nexport async function writeCachedLatestVersion(\n latest: string,\n now: number = Date.now(),\n): Promise<void> {\n try {\n await ensureDirectoryAsync(warlockPath());\n await putJsonFileAsync(CACHE_PATH, { checkedAt: now, latest } satisfies UpdateCheckCache);\n } catch {\n // Not being able to remember is not a reason to fail the check.\n }\n}\n\n/**\n * Forget the cached answer — called once an update has actually been applied,\n * so the next boot re-checks against the version we just installed instead of\n * reasoning from an answer that predates it.\n */\nexport async function clearCachedLatestVersion(): Promise<void> {\n try {\n if (await fileExistsAsync(CACHE_PATH)) {\n await unlinkAsync(CACHE_PATH);\n }\n } catch {\n // Worst case the next boot reads a stale-but-harmless entry.\n }\n}\n"],"mappings":";;;;;AAUA,MAAM,aAAa,YAAY,mBAAmB;;;;;;AAOlD,MAAa,eAAe,OAAU,KAAK;;;;;;AAe3C,eAAsB,wBACpB,MAAc,KAAK,IAAI,GACM;CAC7B,IAAI;EACF,IAAI,CAAE,MAAM,gBAAgB,UAAU,GACpC;EAGF,MAAM,QAAS,MAAM,iBAAiB,UAAU;EAEhD,IAAI,OAAO,OAAO,cAAc,YAAY,OAAO,OAAO,WAAW,UACnE;EAKF,MAAM,MAAM,MAAM,MAAM;EAExB,IAAI,MAAM,KAAK,aACb;EAGF,OAAO,MAAM;CACf,QAAQ;EAEN;CACF;AACF;;AAGA,eAAsB,yBACpB,QACA,MAAc,KAAK,IAAI,GACR;CACf,IAAI;EACF,MAAM,qBAAqB,YAAY,CAAC;EACxC,MAAM,iBAAiB,YAAY;GAAE,WAAW;GAAK;EAAO,CAA4B;CAC1F,QAAQ,CAER;AACF;;;;;;AAOA,eAAsB,2BAA0C;CAC9D,IAAI;EACF,IAAI,MAAM,gBAAgB,UAAU,GAClC,MAAM,YAAY,UAAU;CAEhC,QAAQ,CAER;AACF"}
@@ -4,7 +4,7 @@ import { Path } from "./path.mjs";
4
4
  import { ensureDirectoryAsync } from "@warlock.js/fs";
5
5
  import glob from "fast-glob";
6
6
 
7
- //#region ../@warlock.js/core/src/dev-server/utils.ts
7
+ //#region ../core/src/dev-server/utils.ts
8
8
  /**
9
9
  * Ensure the .warlock/ directory exists. Used by the loader-hook
10
10
  * registration which writes its bundled hook file into this directory.
@@ -1 +1 @@
1
- {"version":3,"file":"utils.mjs","names":[],"sources":["../../../../../../../@warlock.js/core/src/dev-server/utils.ts"],"sourcesContent":["import { ensureDirectoryAsync } from \"@warlock.js/fs\";\r\nimport glob from \"fast-glob\";\r\nimport { srcPath, warlockPath } from \"../utils\";\r\nimport { Path } from \"./path\";\r\n\r\n/**\r\n * Ensure the .warlock/ directory exists. Used by the loader-hook\r\n * registration which writes its bundled hook file into this directory.\r\n */\r\nexport async function ensureWarlockDirectory() {\r\n await ensureDirectoryAsync(warlockPath());\r\n}\r\n\r\n/**\r\n * Glob the project's `src/` directory for `.ts`/`.tsx` files. Returns\r\n * normalised absolute paths.\r\n */\r\nexport async function getFilesFromDirectory(directoryPath = srcPath(), pattern = \"**/*.{ts,tsx}\") {\r\n const files = await glob(`${Path.normalize(directoryPath)}/${pattern}`, { absolute: true });\r\n return files.map(file => Path.normalize(file));\r\n}\r\n\r\nexport async function getCertainFilesFromDirectory(directoryPath: string, filesNames: string[]) {\r\n const pattern = filesNames.length === 1 ? filesNames[0] : `(${filesNames.join(\"|\")})`;\r\n return getFilesFromDirectory(directoryPath, pattern + \".{ts,tsx}\");\r\n}\r\n\r\nexport function areSetsEqual<T>(set1: Set<T>, set2: Set<T>): boolean {\r\n if (set1.size !== set2.size) return false;\r\n for (const item of set1) {\r\n if (!set2.has(item)) return false;\r\n }\r\n return true;\r\n}\r\n"],"mappings":";;;;;;;;;;;AASA,eAAsB,yBAAyB;CAC7C,MAAM,qBAAqB,YAAY,CAAC;AAC1C;;;;;AAMA,eAAsB,sBAAsB,gBAAgB,QAAQ,GAAG,UAAU,iBAAiB;CAEhG,QAAO,MADa,KAAK,GAAG,KAAK,UAAU,aAAa,EAAE,GAAG,WAAW,EAAE,UAAU,KAAK,CAAC,EAC9E,CAAC,KAAI,SAAQ,KAAK,UAAU,IAAI,CAAC;AAC/C;AAEA,eAAsB,6BAA6B,eAAuB,YAAsB;CAE9F,OAAO,sBAAsB,gBADb,WAAW,WAAW,IAAI,WAAW,KAAK,IAAI,WAAW,KAAK,GAAG,EAAE,MAC7B,WAAW;AACnE;AAEA,SAAgB,aAAgB,MAAc,MAAuB;CACnE,IAAI,KAAK,SAAS,KAAK,MAAM,OAAO;CACpC,KAAK,MAAM,QAAQ,MACjB,IAAI,CAAC,KAAK,IAAI,IAAI,GAAG,OAAO;CAE9B,OAAO;AACT"}
1
+ {"version":3,"file":"utils.mjs","names":[],"sources":["../../../../../../../core/src/dev-server/utils.ts"],"sourcesContent":["import { ensureDirectoryAsync } from \"@warlock.js/fs\";\r\nimport glob from \"fast-glob\";\r\nimport { srcPath, warlockPath } from \"../utils\";\r\nimport { Path } from \"./path\";\r\n\r\n/**\r\n * Ensure the .warlock/ directory exists. Used by the loader-hook\r\n * registration which writes its bundled hook file into this directory.\r\n */\r\nexport async function ensureWarlockDirectory() {\r\n await ensureDirectoryAsync(warlockPath());\r\n}\r\n\r\n/**\r\n * Glob the project's `src/` directory for `.ts`/`.tsx` files. Returns\r\n * normalised absolute paths.\r\n */\r\nexport async function getFilesFromDirectory(directoryPath = srcPath(), pattern = \"**/*.{ts,tsx}\") {\r\n const files = await glob(`${Path.normalize(directoryPath)}/${pattern}`, { absolute: true });\r\n return files.map(file => Path.normalize(file));\r\n}\r\n\r\nexport async function getCertainFilesFromDirectory(directoryPath: string, filesNames: string[]) {\r\n const pattern = filesNames.length === 1 ? filesNames[0] : `(${filesNames.join(\"|\")})`;\r\n return getFilesFromDirectory(directoryPath, pattern + \".{ts,tsx}\");\r\n}\r\n\r\nexport function areSetsEqual<T>(set1: Set<T>, set2: Set<T>): boolean {\r\n if (set1.size !== set2.size) return false;\r\n for (const item of set1) {\r\n if (!set2.has(item)) return false;\r\n }\r\n return true;\r\n}\r\n"],"mappings":";;;;;;;;;;;AASA,eAAsB,yBAAyB;CAC7C,MAAM,qBAAqB,YAAY,CAAC;AAC1C;;;;;AAMA,eAAsB,sBAAsB,gBAAgB,QAAQ,GAAG,UAAU,iBAAiB;CAEhG,QAAO,MADa,KAAK,GAAG,KAAK,UAAU,aAAa,EAAE,GAAG,WAAW,EAAE,UAAU,KAAK,CAAC,EAC9E,CAAC,KAAI,SAAQ,KAAK,UAAU,IAAI,CAAC;AAC/C;AAEA,eAAsB,6BAA6B,eAAuB,YAAsB;CAE9F,OAAO,sBAAsB,gBADb,WAAW,WAAW,IAAI,WAAW,KAAK,IAAI,WAAW,KAAK,GAAG,EAAE,MAC7B,WAAW;AACnE;AAEA,SAAgB,aAAgB,MAAc,MAAuB;CACnE,IAAI,KAAK,SAAS,KAAK,MAAM,OAAO;CACpC,KAAK,MAAM,QAAQ,MACjB,IAAI,CAAC,KAAK,IAAI,IAAI,GAAG,OAAO;CAE9B,OAAO;AACT"}
@@ -1,4 +1,4 @@
1
- //#region ../@warlock.js/core/src/encryption/encrypt.d.ts
1
+ //#region ../core/src/encryption/encrypt.d.ts
2
2
  /**
3
3
  * Encrypts a plaintext string using AES-256-GCM (or the configured algorithm).
4
4
  * Returns a combined string in the format `iv:ciphertext:authTag`.
@@ -1 +1 @@
1
- {"version":3,"file":"encrypt.d.mts","names":[],"sources":["../../../../../../../@warlock.js/core/src/encryption/encrypt.ts"],"mappings":";;AAoDA;;;;AAAyC;AAiCzC;;;;iBAjCgB,OAAA,CAAQ,SAAiB;;;;;;;;;;;iBAiCzB,OAAA,CAAQ,UAAkB"}
1
+ {"version":3,"file":"encrypt.d.mts","names":[],"sources":["../../../../../../../core/src/encryption/encrypt.ts"],"mappings":";;AAoDA;;;;AAAyC;AAiCzC;;;;iBAjCgB,OAAA,CAAQ,SAAiB;;;;;;;;;;;iBAiCzB,OAAA,CAAQ,UAAkB"}
@@ -2,7 +2,7 @@ import { config } from "../config/config-getter.mjs";
2
2
  import "../config/index.mjs";
3
3
  import crypto from "crypto";
4
4
 
5
- //#region ../@warlock.js/core/src/encryption/encrypt.ts
5
+ //#region ../core/src/encryption/encrypt.ts
6
6
  /**
7
7
  * Default encryption algorithm.
8
8
  */
@@ -1 +1 @@
1
- {"version":3,"file":"encrypt.mjs","names":[],"sources":["../../../../../../../@warlock.js/core/src/encryption/encrypt.ts"],"sourcesContent":["import crypto from \"crypto\";\nimport { config } from \"../config\";\nimport { EncryptionConfigurations } from \"./types\";\n\n/**\n * Default encryption algorithm.\n */\nconst DEFAULT_ALGORITHM = \"aes-256-gcm\";\n\n/**\n * Get the encryption key from config, validated as a 32-byte hex string.\n */\nfunction getEncryptionKey(): Buffer {\n const key = config.key<EncryptionConfigurations[\"key\"]>(\"encryption.key\");\n\n if (!key) {\n throw new Error(\n \"Missing encryption key. Set 'encryption.key' in your config (64 hex characters = 32 bytes).\",\n );\n }\n\n const buffer = Buffer.from(key, \"hex\");\n\n if (buffer.length !== 32) {\n throw new Error(\n `Encryption key must be exactly 32 bytes (64 hex characters). Got ${buffer.length} bytes for key ${key}.`,\n );\n }\n\n return buffer;\n}\n\n/**\n * Get the configured encryption algorithm, defaults to aes-256-gcm.\n */\nfunction getAlgorithm(): string {\n return config.key<EncryptionConfigurations[\"algorithm\"]>(\n \"encryption.algorithm\",\n DEFAULT_ALGORITHM,\n )!;\n}\n\n/**\n * Encrypts a plaintext string using AES-256-GCM (or the configured algorithm).\n * Returns a combined string in the format `iv:ciphertext:authTag`.\n *\n * @example\n * import { encrypt } from \"@warlock.js/core\";\n *\n * const encrypted = encrypt(\"sk-proj-12345\");\n * // => \"a1b2c3...:d4e5f6...:g7h8i9...\"\n */\nexport function encrypt(plainText: string): string {\n if (!plainText) return plainText;\n\n const keyBuffer = getEncryptionKey();\n const algorithm = getAlgorithm();\n\n try {\n // IV must be unique per encryption. 16 bytes is standard for AES.\n const iv = crypto.randomBytes(16);\n const cipher = crypto.createCipheriv(algorithm, keyBuffer, iv);\n\n let encrypted = cipher.update(plainText, \"utf8\", \"hex\");\n encrypted += cipher.final(\"hex\");\n\n // Auth tag validates ciphertext integrity (tamper detection)\n const authTag = (cipher as crypto.CipherGCM).getAuthTag().toString(\"hex\");\n\n return `${iv.toString(\"hex\")}:${encrypted}:${authTag}`;\n } catch (error) {\n throw new Error(`Encryption failed: ${(error as Error).message}`);\n }\n}\n\n/**\n * Decrypts a string previously encrypted with {@link encrypt}.\n * Expects the format `iv:ciphertext:authTag`.\n *\n * @example\n * import { decrypt } from \"@warlock.js/core\";\n *\n * const original = decrypt(encryptedString);\n * // => \"sk-proj-12345\"\n */\nexport function decrypt(cipherText: string): string {\n if (!cipherText) return cipherText;\n\n const keyBuffer = getEncryptionKey();\n const algorithm = getAlgorithm();\n\n try {\n const parts = cipherText.split(\":\");\n\n if (parts.length !== 3) {\n throw new Error(\"Invalid encrypted format. Expected iv:ciphertext:authTag\");\n }\n\n const [ivHex, encryptedHex, authTagHex] = parts;\n\n const decipher = crypto.createDecipheriv(algorithm, keyBuffer, Buffer.from(ivHex, \"hex\"));\n\n (decipher as crypto.DecipherGCM).setAuthTag(Buffer.from(authTagHex, \"hex\"));\n\n let decrypted = decipher.update(encryptedHex, \"hex\", \"utf8\");\n // .final() throws if auth tag is invalid (data tampered)\n decrypted += decipher.final(\"utf8\");\n\n return decrypted;\n } catch (error) {\n throw new Error(`Decryption failed: ${(error as Error).message}`);\n }\n}\n"],"mappings":";;;;;;;;AAOA,MAAM,oBAAoB;;;;AAK1B,SAAS,mBAA2B;CAClC,MAAM,MAAM,OAAO,IAAqC,gBAAgB;CAExE,IAAI,CAAC,KACH,MAAM,IAAI,MACR,6FACF;CAGF,MAAM,SAAS,OAAO,KAAK,KAAK,KAAK;CAErC,IAAI,OAAO,WAAW,IACpB,MAAM,IAAI,MACR,oEAAoE,OAAO,OAAO,iBAAiB,IAAI,EACzG;CAGF,OAAO;AACT;;;;AAKA,SAAS,eAAuB;CAC9B,OAAO,OAAO,IACZ,wBACA,iBACF;AACF;;;;;;;;;;;AAYA,SAAgB,QAAQ,WAA2B;CACjD,IAAI,CAAC,WAAW,OAAO;CAEvB,MAAM,YAAY,iBAAiB;CACnC,MAAM,YAAY,aAAa;CAE/B,IAAI;EAEF,MAAM,KAAK,OAAO,YAAY,EAAE;EAChC,MAAM,SAAS,OAAO,eAAe,WAAW,WAAW,EAAE;EAE7D,IAAI,YAAY,OAAO,OAAO,WAAW,QAAQ,KAAK;EACtD,aAAa,OAAO,MAAM,KAAK;EAG/B,MAAM,UAAW,OAA4B,WAAW,CAAC,CAAC,SAAS,KAAK;EAExE,OAAO,GAAG,GAAG,SAAS,KAAK,EAAE,GAAG,UAAU,GAAG;CAC/C,SAAS,OAAO;EACd,MAAM,IAAI,MAAM,sBAAuB,MAAgB,SAAS;CAClE;AACF;;;;;;;;;;;AAYA,SAAgB,QAAQ,YAA4B;CAClD,IAAI,CAAC,YAAY,OAAO;CAExB,MAAM,YAAY,iBAAiB;CACnC,MAAM,YAAY,aAAa;CAE/B,IAAI;EACF,MAAM,QAAQ,WAAW,MAAM,GAAG;EAElC,IAAI,MAAM,WAAW,GACnB,MAAM,IAAI,MAAM,0DAA0D;EAG5E,MAAM,CAAC,OAAO,cAAc,cAAc;EAE1C,MAAM,WAAW,OAAO,iBAAiB,WAAW,WAAW,OAAO,KAAK,OAAO,KAAK,CAAC;EAExF,AAAC,SAAgC,WAAW,OAAO,KAAK,YAAY,KAAK,CAAC;EAE1E,IAAI,YAAY,SAAS,OAAO,cAAc,OAAO,MAAM;EAE3D,aAAa,SAAS,MAAM,MAAM;EAElC,OAAO;CACT,SAAS,OAAO;EACd,MAAM,IAAI,MAAM,sBAAuB,MAAgB,SAAS;CAClE;AACF"}
1
+ {"version":3,"file":"encrypt.mjs","names":[],"sources":["../../../../../../../core/src/encryption/encrypt.ts"],"sourcesContent":["import crypto from \"crypto\";\nimport { config } from \"../config\";\nimport { EncryptionConfigurations } from \"./types\";\n\n/**\n * Default encryption algorithm.\n */\nconst DEFAULT_ALGORITHM = \"aes-256-gcm\";\n\n/**\n * Get the encryption key from config, validated as a 32-byte hex string.\n */\nfunction getEncryptionKey(): Buffer {\n const key = config.key<EncryptionConfigurations[\"key\"]>(\"encryption.key\");\n\n if (!key) {\n throw new Error(\n \"Missing encryption key. Set 'encryption.key' in your config (64 hex characters = 32 bytes).\",\n );\n }\n\n const buffer = Buffer.from(key, \"hex\");\n\n if (buffer.length !== 32) {\n throw new Error(\n `Encryption key must be exactly 32 bytes (64 hex characters). Got ${buffer.length} bytes for key ${key}.`,\n );\n }\n\n return buffer;\n}\n\n/**\n * Get the configured encryption algorithm, defaults to aes-256-gcm.\n */\nfunction getAlgorithm(): string {\n return config.key<EncryptionConfigurations[\"algorithm\"]>(\n \"encryption.algorithm\",\n DEFAULT_ALGORITHM,\n )!;\n}\n\n/**\n * Encrypts a plaintext string using AES-256-GCM (or the configured algorithm).\n * Returns a combined string in the format `iv:ciphertext:authTag`.\n *\n * @example\n * import { encrypt } from \"@warlock.js/core\";\n *\n * const encrypted = encrypt(\"sk-proj-12345\");\n * // => \"a1b2c3...:d4e5f6...:g7h8i9...\"\n */\nexport function encrypt(plainText: string): string {\n if (!plainText) return plainText;\n\n const keyBuffer = getEncryptionKey();\n const algorithm = getAlgorithm();\n\n try {\n // IV must be unique per encryption. 16 bytes is standard for AES.\n const iv = crypto.randomBytes(16);\n const cipher = crypto.createCipheriv(algorithm, keyBuffer, iv);\n\n let encrypted = cipher.update(plainText, \"utf8\", \"hex\");\n encrypted += cipher.final(\"hex\");\n\n // Auth tag validates ciphertext integrity (tamper detection)\n const authTag = (cipher as crypto.CipherGCM).getAuthTag().toString(\"hex\");\n\n return `${iv.toString(\"hex\")}:${encrypted}:${authTag}`;\n } catch (error) {\n throw new Error(`Encryption failed: ${(error as Error).message}`);\n }\n}\n\n/**\n * Decrypts a string previously encrypted with {@link encrypt}.\n * Expects the format `iv:ciphertext:authTag`.\n *\n * @example\n * import { decrypt } from \"@warlock.js/core\";\n *\n * const original = decrypt(encryptedString);\n * // => \"sk-proj-12345\"\n */\nexport function decrypt(cipherText: string): string {\n if (!cipherText) return cipherText;\n\n const keyBuffer = getEncryptionKey();\n const algorithm = getAlgorithm();\n\n try {\n const parts = cipherText.split(\":\");\n\n if (parts.length !== 3) {\n throw new Error(\"Invalid encrypted format. Expected iv:ciphertext:authTag\");\n }\n\n const [ivHex, encryptedHex, authTagHex] = parts;\n\n const decipher = crypto.createDecipheriv(algorithm, keyBuffer, Buffer.from(ivHex, \"hex\"));\n\n (decipher as crypto.DecipherGCM).setAuthTag(Buffer.from(authTagHex, \"hex\"));\n\n let decrypted = decipher.update(encryptedHex, \"hex\", \"utf8\");\n // .final() throws if auth tag is invalid (data tampered)\n decrypted += decipher.final(\"utf8\");\n\n return decrypted;\n } catch (error) {\n throw new Error(`Decryption failed: ${(error as Error).message}`);\n }\n}\n"],"mappings":";;;;;;;;AAOA,MAAM,oBAAoB;;;;AAK1B,SAAS,mBAA2B;CAClC,MAAM,MAAM,OAAO,IAAqC,gBAAgB;CAExE,IAAI,CAAC,KACH,MAAM,IAAI,MACR,6FACF;CAGF,MAAM,SAAS,OAAO,KAAK,KAAK,KAAK;CAErC,IAAI,OAAO,WAAW,IACpB,MAAM,IAAI,MACR,oEAAoE,OAAO,OAAO,iBAAiB,IAAI,EACzG;CAGF,OAAO;AACT;;;;AAKA,SAAS,eAAuB;CAC9B,OAAO,OAAO,IACZ,wBACA,iBACF;AACF;;;;;;;;;;;AAYA,SAAgB,QAAQ,WAA2B;CACjD,IAAI,CAAC,WAAW,OAAO;CAEvB,MAAM,YAAY,iBAAiB;CACnC,MAAM,YAAY,aAAa;CAE/B,IAAI;EAEF,MAAM,KAAK,OAAO,YAAY,EAAE;EAChC,MAAM,SAAS,OAAO,eAAe,WAAW,WAAW,EAAE;EAE7D,IAAI,YAAY,OAAO,OAAO,WAAW,QAAQ,KAAK;EACtD,aAAa,OAAO,MAAM,KAAK;EAG/B,MAAM,UAAW,OAA4B,WAAW,CAAC,CAAC,SAAS,KAAK;EAExE,OAAO,GAAG,GAAG,SAAS,KAAK,EAAE,GAAG,UAAU,GAAG;CAC/C,SAAS,OAAO;EACd,MAAM,IAAI,MAAM,sBAAuB,MAAgB,SAAS;CAClE;AACF;;;;;;;;;;;AAYA,SAAgB,QAAQ,YAA4B;CAClD,IAAI,CAAC,YAAY,OAAO;CAExB,MAAM,YAAY,iBAAiB;CACnC,MAAM,YAAY,aAAa;CAE/B,IAAI;EACF,MAAM,QAAQ,WAAW,MAAM,GAAG;EAElC,IAAI,MAAM,WAAW,GACnB,MAAM,IAAI,MAAM,0DAA0D;EAG5E,MAAM,CAAC,OAAO,cAAc,cAAc;EAE1C,MAAM,WAAW,OAAO,iBAAiB,WAAW,WAAW,OAAO,KAAK,OAAO,KAAK,CAAC;EAExF,AAAC,SAAgC,WAAW,OAAO,KAAK,YAAY,KAAK,CAAC;EAE1E,IAAI,YAAY,SAAS,OAAO,cAAc,OAAO,MAAM;EAE3D,aAAa,SAAS,MAAM,MAAM;EAElC,OAAO;CACT,SAAS,OAAO;EACd,MAAM,IAAI,MAAM,sBAAuB,MAAgB,SAAS;CAClE;AACF"}
@@ -1,4 +1,4 @@
1
- //#region ../@warlock.js/core/src/encryption/hash.d.ts
1
+ //#region ../core/src/encryption/hash.d.ts
2
2
  /**
3
3
  * Creates a deterministic HMAC-SHA256 hash of the given string.
4
4
  *
@@ -1 +1 @@
1
- {"version":3,"file":"hash.d.mts","names":[],"sources":["../../../../../../../@warlock.js/core/src/encryption/hash.ts"],"mappings":";;AAmBA;;;;AAA0C;;;;;;;;;;iBAA1B,QAAA,CAAS,SAAiB"}
1
+ {"version":3,"file":"hash.d.mts","names":[],"sources":["../../../../../../../core/src/encryption/hash.ts"],"mappings":";;AAmBA;;;;AAA0C;;;;;;;;;;iBAA1B,QAAA,CAAS,SAAiB"}
@@ -2,7 +2,7 @@ import { config } from "../config/config-getter.mjs";
2
2
  import "../config/index.mjs";
3
3
  import crypto from "crypto";
4
4
 
5
- //#region ../@warlock.js/core/src/encryption/hash.ts
5
+ //#region ../core/src/encryption/hash.ts
6
6
  /**
7
7
  * Creates a deterministic HMAC-SHA256 hash of the given string.
8
8
  *
@@ -1 +1 @@
1
- {"version":3,"file":"hash.mjs","names":[],"sources":["../../../../../../../@warlock.js/core/src/encryption/hash.ts"],"sourcesContent":["import crypto from \"crypto\";\nimport { config } from \"../config\";\nimport { EncryptionConfigurations } from \"./types\";\n\n/**\n * Creates a deterministic HMAC-SHA256 hash of the given string.\n *\n * Useful for creating searchable, unique fingerprints of sensitive data\n * (e.g., an API key) without storing the plaintext.\n *\n * Uses a dedicated HMAC key from config. Falls back to the encryption key\n * if no separate HMAC key is configured.\n *\n * @example\n * import { hmacHash } from \"@warlock.js/core\";\n *\n * const fingerprint = hmacHash(\"sk-proj-12345\");\n * // Store `fingerprint` in DB for lookups, store encrypted value separately\n */\nexport function hmacHash(plainText: string): string {\n if (!plainText) return plainText;\n\n const hmacKey =\n config.key<EncryptionConfigurations[\"hmacKey\"]>(\"encryption.hmacKey\") ||\n config.key<EncryptionConfigurations[\"key\"]>(\"encryption.key\");\n\n if (!hmacKey) {\n throw new Error(\n \"Missing HMAC key. Set 'encryption.hmacKey' (or 'encryption.key') in your config.\",\n );\n }\n\n const keyBuffer = Buffer.from(hmacKey, \"hex\");\n\n return crypto.createHmac(\"sha256\", keyBuffer).update(plainText).digest(\"hex\");\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAmBA,SAAgB,SAAS,WAA2B;CAClD,IAAI,CAAC,WAAW,OAAO;CAEvB,MAAM,UACJ,OAAO,IAAyC,oBAAoB,KACpE,OAAO,IAAqC,gBAAgB;CAE9D,IAAI,CAAC,SACH,MAAM,IAAI,MACR,kFACF;CAGF,MAAM,YAAY,OAAO,KAAK,SAAS,KAAK;CAE5C,OAAO,OAAO,WAAW,UAAU,SAAS,CAAC,CAAC,OAAO,SAAS,CAAC,CAAC,OAAO,KAAK;AAC9E"}
1
+ {"version":3,"file":"hash.mjs","names":[],"sources":["../../../../../../../core/src/encryption/hash.ts"],"sourcesContent":["import crypto from \"crypto\";\nimport { config } from \"../config\";\nimport { EncryptionConfigurations } from \"./types\";\n\n/**\n * Creates a deterministic HMAC-SHA256 hash of the given string.\n *\n * Useful for creating searchable, unique fingerprints of sensitive data\n * (e.g., an API key) without storing the plaintext.\n *\n * Uses a dedicated HMAC key from config. Falls back to the encryption key\n * if no separate HMAC key is configured.\n *\n * @example\n * import { hmacHash } from \"@warlock.js/core\";\n *\n * const fingerprint = hmacHash(\"sk-proj-12345\");\n * // Store `fingerprint` in DB for lookups, store encrypted value separately\n */\nexport function hmacHash(plainText: string): string {\n if (!plainText) return plainText;\n\n const hmacKey =\n config.key<EncryptionConfigurations[\"hmacKey\"]>(\"encryption.hmacKey\") ||\n config.key<EncryptionConfigurations[\"key\"]>(\"encryption.key\");\n\n if (!hmacKey) {\n throw new Error(\n \"Missing HMAC key. Set 'encryption.hmacKey' (or 'encryption.key') in your config.\",\n );\n }\n\n const keyBuffer = Buffer.from(hmacKey, \"hex\");\n\n return crypto.createHmac(\"sha256\", keyBuffer).update(plainText).digest(\"hex\");\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAmBA,SAAgB,SAAS,WAA2B;CAClD,IAAI,CAAC,WAAW,OAAO;CAEvB,MAAM,UACJ,OAAO,IAAyC,oBAAoB,KACpE,OAAO,IAAqC,gBAAgB;CAE9D,IAAI,CAAC,SACH,MAAM,IAAI,MACR,kFACF;CAGF,MAAM,YAAY,OAAO,KAAK,SAAS,KAAK;CAE5C,OAAO,OAAO,WAAW,UAAU,SAAS,CAAC,CAAC,OAAO,SAAS,CAAC,CAAC,OAAO,KAAK;AAC9E"}
@@ -1,4 +1,4 @@
1
- //#region ../@warlock.js/core/src/encryption/password.d.ts
1
+ //#region ../core/src/encryption/password.d.ts
2
2
  /**
3
3
  * Hashes a password using bcrypt (async — does not block the event loop).
4
4
  *
@@ -1 +1 @@
1
- {"version":3,"file":"password.d.mts","names":[],"sources":["../../../../../../../@warlock.js/core/src/encryption/password.ts"],"mappings":";;AA6DA;;;;AAA6D;AAqB7D;;;;;;iBArBsB,YAAA,CAAa,QAAA,WAAmB,OAAO;;AAwBnD;;;;;;;iBAHY,cAAA,CACpB,aAAA,UACA,cAAA,WACC,OAAO"}
1
+ {"version":3,"file":"password.d.mts","names":[],"sources":["../../../../../../../core/src/encryption/password.ts"],"mappings":";;AA6DA;;;;AAA6D;AAqB7D;;;;;;iBArBsB,YAAA,CAAa,QAAA,WAAmB,OAAO;;AAwBnD;;;;;;;iBAHY,cAAA,CACpB,aAAA,UACA,cAAA,WACC,OAAO"}
@@ -1,7 +1,7 @@
1
1
  import { config } from "../config/config-getter.mjs";
2
2
  import "../config/index.mjs";
3
3
 
4
- //#region ../@warlock.js/core/src/encryption/password.ts
4
+ //#region ../core/src/encryption/password.ts
5
5
  /**
6
6
  * Default bcrypt salt rounds.
7
7
  */
@@ -1 +1 @@
1
- {"version":3,"file":"password.mjs","names":[],"sources":["../../../../../../../@warlock.js/core/src/encryption/password.ts"],"sourcesContent":["import { config } from \"../config\";\r\nimport { EncryptionPasswordConfigurations } from \"./types\";\r\n\r\n/**\r\n * Default bcrypt salt rounds.\r\n */\r\nconst DEFAULT_SALT_ROUNDS = 12;\r\n\r\n// ============================================================\r\n// Lazy-loaded bcryptjs SDK Types\r\n// ============================================================\r\n\r\n/**\r\n * Cached bcryptjs module (loaded once, reused)\r\n */\r\nlet Bcryptjs: typeof import(\"bcryptjs\");\r\n\r\nlet isModuleExists: boolean | null = null;\r\n\r\n/**\r\n * Installation instructions for bcryptjs package\r\n */\r\nconst BCRYPTJS_INSTALL_INSTRUCTIONS = `\r\nPassword encryption requires the bcryptjs package.\r\nInstall it with:\r\n\r\n yarn add bcryptjs\r\n\r\nOr with your preferred package manager:\r\n\r\n npm install bcryptjs\r\n pnpm add bcryptjs\r\n yarn add bcryptjs\r\n`.trim();\r\n\r\n/**\r\n * Load bcryptjs module\r\n */\r\nasync function loadBcryptjs() {\r\n try {\r\n Bcryptjs = await import(\"bcryptjs\");\r\n isModuleExists = true;\r\n } catch {\r\n isModuleExists = false;\r\n }\r\n}\r\n\r\nloadBcryptjs();\r\n\r\n/**\r\n * Hashes a password using bcrypt (async — does not block the event loop).\r\n *\r\n * Salt rounds are read from \\`encryption.password.saltRounds\\` config,\r\n * defaulting to 12.\r\n *\r\n * @example\r\n * import { hashPassword } from \"@warlock.js/core\";\r\n *\r\n * const hashed = await hashPassword(\"user-password-123\");\r\n * // Store \\`hashed\\` in the database\r\n */\r\nexport async function hashPassword(password: string): Promise<string> {\r\n if (!isModuleExists) {\r\n throw new Error(BCRYPTJS_INSTALL_INSTRUCTIONS);\r\n }\r\n\r\n const saltRounds = config.key<EncryptionPasswordConfigurations[\"salt\"]>(\r\n \"encryption.password.salt\",\r\n DEFAULT_SALT_ROUNDS,\r\n )!;\r\n\r\n return Bcryptjs.hash(String(password), saltRounds);\r\n}\r\n\r\n/**\r\n * Verifies a plain password against a bcrypt hash (async — does not block the event loop).\r\n *\r\n * @example\r\n * import { verifyPassword } from \"@warlock.js/core\";\r\n *\r\n * const isValid = await verifyPassword(\"user-password-123\", storedHash);\r\n */\r\nexport async function verifyPassword(\r\n plainPassword: string,\r\n hashedPassword: string,\r\n): Promise<boolean> {\r\n if (!isModuleExists) {\r\n throw new Error(BCRYPTJS_INSTALL_INSTRUCTIONS);\r\n }\r\n\r\n return Bcryptjs.compare(String(plainPassword), String(hashedPassword));\r\n}\r\n"],"mappings":";;;;;;;AAMA,MAAM,sBAAsB;;;;AAS5B,IAAI;AAEJ,IAAI,iBAAiC;;;;AAKrC,MAAM,gCAAgC;;;;;;;;;;;EAWpC,KAAK;;;;AAKP,eAAe,eAAe;CAC5B,IAAI;EACF,WAAW,MAAM,OAAO;EACxB,iBAAiB;CACnB,QAAQ;EACN,iBAAiB;CACnB;AACF;AAEA,aAAa;;;;;;;;;;;;;AAcb,eAAsB,aAAa,UAAmC;CACpE,IAAI,CAAC,gBACH,MAAM,IAAI,MAAM,6BAA6B;CAG/C,MAAM,aAAa,OAAO,IACxB,4BACA,mBACF;CAEA,OAAO,SAAS,KAAK,OAAO,QAAQ,GAAG,UAAU;AACnD;;;;;;;;;AAUA,eAAsB,eACpB,eACA,gBACkB;CAClB,IAAI,CAAC,gBACH,MAAM,IAAI,MAAM,6BAA6B;CAG/C,OAAO,SAAS,QAAQ,OAAO,aAAa,GAAG,OAAO,cAAc,CAAC;AACvE"}
1
+ {"version":3,"file":"password.mjs","names":[],"sources":["../../../../../../../core/src/encryption/password.ts"],"sourcesContent":["import { config } from \"../config\";\r\nimport { EncryptionPasswordConfigurations } from \"./types\";\r\n\r\n/**\r\n * Default bcrypt salt rounds.\r\n */\r\nconst DEFAULT_SALT_ROUNDS = 12;\r\n\r\n// ============================================================\r\n// Lazy-loaded bcryptjs SDK Types\r\n// ============================================================\r\n\r\n/**\r\n * Cached bcryptjs module (loaded once, reused)\r\n */\r\nlet Bcryptjs: typeof import(\"bcryptjs\");\r\n\r\nlet isModuleExists: boolean | null = null;\r\n\r\n/**\r\n * Installation instructions for bcryptjs package\r\n */\r\nconst BCRYPTJS_INSTALL_INSTRUCTIONS = `\r\nPassword encryption requires the bcryptjs package.\r\nInstall it with:\r\n\r\n yarn add bcryptjs\r\n\r\nOr with your preferred package manager:\r\n\r\n npm install bcryptjs\r\n pnpm add bcryptjs\r\n yarn add bcryptjs\r\n`.trim();\r\n\r\n/**\r\n * Load bcryptjs module\r\n */\r\nasync function loadBcryptjs() {\r\n try {\r\n Bcryptjs = await import(\"bcryptjs\");\r\n isModuleExists = true;\r\n } catch {\r\n isModuleExists = false;\r\n }\r\n}\r\n\r\nloadBcryptjs();\r\n\r\n/**\r\n * Hashes a password using bcrypt (async — does not block the event loop).\r\n *\r\n * Salt rounds are read from \\`encryption.password.saltRounds\\` config,\r\n * defaulting to 12.\r\n *\r\n * @example\r\n * import { hashPassword } from \"@warlock.js/core\";\r\n *\r\n * const hashed = await hashPassword(\"user-password-123\");\r\n * // Store \\`hashed\\` in the database\r\n */\r\nexport async function hashPassword(password: string): Promise<string> {\r\n if (!isModuleExists) {\r\n throw new Error(BCRYPTJS_INSTALL_INSTRUCTIONS);\r\n }\r\n\r\n const saltRounds = config.key<EncryptionPasswordConfigurations[\"salt\"]>(\r\n \"encryption.password.salt\",\r\n DEFAULT_SALT_ROUNDS,\r\n )!;\r\n\r\n return Bcryptjs.hash(String(password), saltRounds);\r\n}\r\n\r\n/**\r\n * Verifies a plain password against a bcrypt hash (async — does not block the event loop).\r\n *\r\n * @example\r\n * import { verifyPassword } from \"@warlock.js/core\";\r\n *\r\n * const isValid = await verifyPassword(\"user-password-123\", storedHash);\r\n */\r\nexport async function verifyPassword(\r\n plainPassword: string,\r\n hashedPassword: string,\r\n): Promise<boolean> {\r\n if (!isModuleExists) {\r\n throw new Error(BCRYPTJS_INSTALL_INSTRUCTIONS);\r\n }\r\n\r\n return Bcryptjs.compare(String(plainPassword), String(hashedPassword));\r\n}\r\n"],"mappings":";;;;;;;AAMA,MAAM,sBAAsB;;;;AAS5B,IAAI;AAEJ,IAAI,iBAAiC;;;;AAKrC,MAAM,gCAAgC;;;;;;;;;;;EAWpC,KAAK;;;;AAKP,eAAe,eAAe;CAC5B,IAAI;EACF,WAAW,MAAM,OAAO;EACxB,iBAAiB;CACnB,QAAQ;EACN,iBAAiB;CACnB;AACF;AAEA,aAAa;;;;;;;;;;;;;AAcb,eAAsB,aAAa,UAAmC;CACpE,IAAI,CAAC,gBACH,MAAM,IAAI,MAAM,6BAA6B;CAG/C,MAAM,aAAa,OAAO,IACxB,4BACA,mBACF;CAEA,OAAO,SAAS,KAAK,OAAO,QAAQ,GAAG,UAAU;AACnD;;;;;;;;;AAUA,eAAsB,eACpB,eACA,gBACkB;CAClB,IAAI,CAAC,gBACH,MAAM,IAAI,MAAM,6BAA6B;CAG/C,OAAO,SAAS,QAAQ,OAAO,aAAa,GAAG,OAAO,cAAc,CAAC;AACvE"}
@@ -1,4 +1,4 @@
1
- //#region ../@warlock.js/core/src/encryption/types.d.ts
1
+ //#region ../core/src/encryption/types.d.ts
2
2
  /**
3
3
  * Configuration for the encryption module.
4
4
  *
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.mts","names":[],"sources":["../../../../../../../@warlock.js/core/src/encryption/types.ts"],"mappings":";;AAmBA;;;;;;;;;;AAyB6C;AAG7C;;;;AAKM;;;KAjCM,wBAAA;;;;;;EAMV,GAAA;;;;;EAMA,SAAA;;;;;;;EAQA,OAAA;;;;EAKA,QAAA,GAAW,gCAAgC;AAAA;AAAA,KAGjC,gCAAA;;;;;EAKV,IAAI;AAAA"}
1
+ {"version":3,"file":"types.d.mts","names":[],"sources":["../../../../../../../core/src/encryption/types.ts"],"mappings":";;AAmBA;;;;;;;;;;AAyB6C;AAG7C;;;;AAKM;;;KAjCM,wBAAA;;;;;;EAMV,GAAA;;;;;EAMA,SAAA;;;;;;;EAQA,OAAA;;;;EAKA,QAAA,GAAW,gCAAgC;AAAA;AAAA,KAGjC,gCAAA;;;;;EAKV,IAAI;AAAA"}
@@ -1,12 +1,13 @@
1
1
  import { rootPath, srcPath } from "../utils/paths.mjs";
2
2
  import "../utils/index.mjs";
3
3
  import { getWarlockVersion } from "../utils/framework-vesion.mjs";
4
+ import { detectPackageManager, getAddCommand } from "../updater/package-manager.mjs";
4
5
  import { accessConfigStub, accessResolverStub, accessRoleMigrationStub, accessRoleModelIndexStub, accessRoleModelStub, accessUserRoleMigrationStub, accessUserRoleModelIndexStub, accessUserRoleModelStub, aiConfigStub, communicatorsConfigStub, notificationControllersStub, notificationMigrationStub, notificationModelStub, notificationRoutesStub, notificationsConfigStub, socketConfigStub } from "./stubs.mjs";
5
6
  import { colors } from "@mongez/copper";
6
7
  import { ensureDirectoryAsync, fileExistsAsync, getFileAsync, getJsonFileAsync, putFileAsync, putJsonFileAsync } from "@warlock.js/fs";
7
8
  import { execSync } from "node:child_process";
8
9
 
9
- //#region ../@warlock.js/core/src/generations/add-command.action.ts
10
+ //#region ../core/src/generations/add-command.action.ts
10
11
  /**
11
12
  * Build a migration filename timestamp prefix in the framework's
12
13
  * MM-DD-YYYY_HH-MM-SS form. Cascade infers a migration's createdAt from this
@@ -478,7 +479,7 @@ async function addCommandAction(options) {
478
479
  * Runs two passes (prod then dev) so each lands in the correct section.
479
480
  */
480
481
  async function installDependencies(packageManager, dependencies, devDependencies) {
481
- const packageManagerCommand = await getPackageManagerCommand(packageManager);
482
+ const packageManagerCommand = getAddCommand(packageManager ?? await detectPackageManager());
482
483
  if (Object.keys(dependencies).length > 0) {
483
484
  console.log(`Installing dependencies ${colors.magenta(Object.keys(dependencies).join(", "))}`);
484
485
  execSync(`${packageManagerCommand} ${Object.keys(dependencies).join(" ")}`, {
@@ -519,17 +520,6 @@ function validateFeatures(features) {
519
520
  process.exit(1);
520
521
  }
521
522
  }
522
- async function getPackageManagerCommand(packageManager) {
523
- if (!packageManager) packageManager = await detectPackageManager();
524
- if (packageManager === "npm") return "npm install";
525
- if (packageManager === "yarn") return "yarn add";
526
- if (packageManager === "pnpm") return "pnpm add";
527
- }
528
- async function detectPackageManager() {
529
- if (await fileExistsAsync(rootPath("package-lock.json"))) return "npm";
530
- if (await fileExistsAsync(rootPath("yarn.lock"))) return "yarn";
531
- if (await fileExistsAsync(rootPath("pnpm-lock.yaml"))) return "pnpm";
532
- }
533
523
 
534
524
  //#endregion
535
525
  export { addCommandAction };