@warlock.js/core 5.28.0 → 5.30.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1396) hide show
  1. package/CHANGELOG.md +71 -0
  2. package/esm/application/app.d.mts +1 -1
  3. package/esm/application/app.d.mts.map +1 -1
  4. package/esm/application/app.mjs +1 -1
  5. package/esm/application/app.mjs.map +1 -1
  6. package/esm/application/application-config-types.d.mts +1 -1
  7. package/esm/application/application-config-types.d.mts.map +1 -1
  8. package/esm/application/application.d.mts +1 -1
  9. package/esm/application/application.d.mts.map +1 -1
  10. package/esm/application/application.mjs +1 -1
  11. package/esm/application/application.mjs.map +1 -1
  12. package/esm/application/boot-signal.d.mts +1 -1
  13. package/esm/application/boot-signal.d.mts.map +1 -1
  14. package/esm/application/boot-signal.mjs +1 -1
  15. package/esm/application/boot-signal.mjs.map +1 -1
  16. package/esm/application/public-url.d.mts +1 -1
  17. package/esm/application/public-url.d.mts.map +1 -1
  18. package/esm/application/public-url.mjs +1 -1
  19. package/esm/application/public-url.mjs.map +1 -1
  20. package/esm/application/roles.d.mts +1 -1
  21. package/esm/application/roles.d.mts.map +1 -1
  22. package/esm/application/roles.mjs +1 -1
  23. package/esm/application/roles.mjs.map +1 -1
  24. package/esm/benchmark/benchmark-snapshots.d.mts +1 -1
  25. package/esm/benchmark/benchmark-snapshots.d.mts.map +1 -1
  26. package/esm/benchmark/benchmark-snapshots.mjs +1 -1
  27. package/esm/benchmark/benchmark-snapshots.mjs.map +1 -1
  28. package/esm/benchmark/benchmark.d.mts +1 -1
  29. package/esm/benchmark/benchmark.d.mts.map +1 -1
  30. package/esm/benchmark/benchmark.mjs +1 -1
  31. package/esm/benchmark/benchmark.mjs.map +1 -1
  32. package/esm/benchmark/channels/console.channel.d.mts +1 -1
  33. package/esm/benchmark/channels/console.channel.d.mts.map +1 -1
  34. package/esm/benchmark/channels/console.channel.mjs +1 -1
  35. package/esm/benchmark/channels/console.channel.mjs.map +1 -1
  36. package/esm/benchmark/channels/noop.channel.d.mts +1 -1
  37. package/esm/benchmark/channels/noop.channel.d.mts.map +1 -1
  38. package/esm/benchmark/channels/noop.channel.mjs +1 -1
  39. package/esm/benchmark/channels/noop.channel.mjs.map +1 -1
  40. package/esm/benchmark/profiler.d.mts +1 -1
  41. package/esm/benchmark/profiler.d.mts.map +1 -1
  42. package/esm/benchmark/profiler.mjs +1 -1
  43. package/esm/benchmark/profiler.mjs.map +1 -1
  44. package/esm/benchmark/types.d.mts +1 -1
  45. package/esm/benchmark/types.d.mts.map +1 -1
  46. package/esm/bootstrap/setup.d.mts +1 -1
  47. package/esm/bootstrap/setup.d.mts.map +1 -1
  48. package/esm/bootstrap/setup.mjs +1 -1
  49. package/esm/bootstrap/setup.mjs.map +1 -1
  50. package/esm/bootstrap.d.mts +1 -1
  51. package/esm/bootstrap.d.mts.map +1 -1
  52. package/esm/bootstrap.mjs +1 -1
  53. package/esm/bootstrap.mjs.map +1 -1
  54. package/esm/cache/database-cache-driver.d.mts +1 -1
  55. package/esm/cache/database-cache-driver.d.mts.map +1 -1
  56. package/esm/cache/database-cache-driver.mjs +1 -1
  57. package/esm/cache/database-cache-driver.mjs.map +1 -1
  58. package/esm/cache/index.mjs +1 -1
  59. package/esm/cache/index.mjs.map +1 -1
  60. package/esm/cli/cli-commands.manager.mjs +1 -1
  61. package/esm/cli/cli-commands.manager.mjs.map +1 -1
  62. package/esm/cli/cli-commands.utils.mjs +1 -1
  63. package/esm/cli/cli-commands.utils.mjs.map +1 -1
  64. package/esm/cli/commands/add.command.mjs +1 -1
  65. package/esm/cli/commands/add.command.mjs.map +1 -1
  66. package/esm/cli/commands/build.command.mjs +1 -1
  67. package/esm/cli/commands/build.command.mjs.map +1 -1
  68. package/esm/cli/commands/create-database.command.mjs +1 -1
  69. package/esm/cli/commands/create-database.command.mjs.map +1 -1
  70. package/esm/cli/commands/dev-server.command.mjs +1 -1
  71. package/esm/cli/commands/dev-server.command.mjs.map +1 -1
  72. package/esm/cli/commands/doctor/boot-for-diagnostics.mjs +1 -1
  73. package/esm/cli/commands/doctor/boot-for-diagnostics.mjs.map +1 -1
  74. package/esm/cli/commands/doctor/checks/config.check.mjs +1 -1
  75. package/esm/cli/commands/doctor/checks/config.check.mjs.map +1 -1
  76. package/esm/cli/commands/doctor/checks/connectors.check.mjs +1 -1
  77. package/esm/cli/commands/doctor/checks/connectors.check.mjs.map +1 -1
  78. package/esm/cli/commands/doctor/checks/handler-signature.check.mjs +1 -1
  79. package/esm/cli/commands/doctor/checks/handler-signature.check.mjs.map +1 -1
  80. package/esm/cli/commands/doctor/checks/health.check.mjs +1 -1
  81. package/esm/cli/commands/doctor/checks/health.check.mjs.map +1 -1
  82. package/esm/cli/commands/doctor/checks/index.mjs +1 -1
  83. package/esm/cli/commands/doctor/checks/index.mjs.map +1 -1
  84. package/esm/cli/commands/doctor/checks/jwt-secret.check.mjs +1 -1
  85. package/esm/cli/commands/doctor/checks/jwt-secret.check.mjs.map +1 -1
  86. package/esm/cli/commands/doctor/checks/locales-ts-deprecated.check.mjs +1 -1
  87. package/esm/cli/commands/doctor/checks/locales-ts-deprecated.check.mjs.map +1 -1
  88. package/esm/cli/commands/doctor/checks/optional-peers.check.mjs +1 -1
  89. package/esm/cli/commands/doctor/checks/optional-peers.check.mjs.map +1 -1
  90. package/esm/cli/commands/doctor/checks/release-hygiene.check.mjs +1 -1
  91. package/esm/cli/commands/doctor/checks/release-hygiene.check.mjs.map +1 -1
  92. package/esm/cli/commands/doctor/checks/routes.check.mjs +1 -1
  93. package/esm/cli/commands/doctor/checks/routes.check.mjs.map +1 -1
  94. package/esm/cli/commands/doctor/doctor-command.action.mjs +1 -1
  95. package/esm/cli/commands/doctor/doctor-command.action.mjs.map +1 -1
  96. package/esm/cli/commands/doctor/format-report.mjs +1 -1
  97. package/esm/cli/commands/doctor/format-report.mjs.map +1 -1
  98. package/esm/cli/commands/doctor/run-checks.mjs +1 -1
  99. package/esm/cli/commands/doctor/run-checks.mjs.map +1 -1
  100. package/esm/cli/commands/doctor.command.mjs +1 -1
  101. package/esm/cli/commands/doctor.command.mjs.map +1 -1
  102. package/esm/cli/commands/drop-tables.command.mjs +1 -1
  103. package/esm/cli/commands/drop-tables.command.mjs.map +1 -1
  104. package/esm/cli/commands/generate/generate.command.mjs +1 -1
  105. package/esm/cli/commands/generate/generate.command.mjs.map +1 -1
  106. package/esm/cli/commands/generate/generators/column-dsl-parser.mjs +1 -1
  107. package/esm/cli/commands/generate/generators/column-dsl-parser.mjs.map +1 -1
  108. package/esm/cli/commands/generate/generators/controller.generator.mjs +1 -1
  109. package/esm/cli/commands/generate/generators/controller.generator.mjs.map +1 -1
  110. package/esm/cli/commands/generate/generators/migration.generator.mjs +1 -1
  111. package/esm/cli/commands/generate/generators/migration.generator.mjs.map +1 -1
  112. package/esm/cli/commands/generate/generators/model.generator.mjs +1 -1
  113. package/esm/cli/commands/generate/generators/model.generator.mjs.map +1 -1
  114. package/esm/cli/commands/generate/generators/module.generator.mjs +1 -1
  115. package/esm/cli/commands/generate/generators/module.generator.mjs.map +1 -1
  116. package/esm/cli/commands/generate/generators/repository.generator.mjs +1 -1
  117. package/esm/cli/commands/generate/generators/repository.generator.mjs.map +1 -1
  118. package/esm/cli/commands/generate/generators/resource.generator.mjs +1 -1
  119. package/esm/cli/commands/generate/generators/resource.generator.mjs.map +1 -1
  120. package/esm/cli/commands/generate/generators/service.generator.mjs +1 -1
  121. package/esm/cli/commands/generate/generators/service.generator.mjs.map +1 -1
  122. package/esm/cli/commands/generate/generators/use-case.generator.mjs +1 -1
  123. package/esm/cli/commands/generate/generators/use-case.generator.mjs.map +1 -1
  124. package/esm/cli/commands/generate/templates/stubs.mjs +1 -1
  125. package/esm/cli/commands/generate/templates/stubs.mjs.map +1 -1
  126. package/esm/cli/commands/generate/utils/name-parser.mjs +1 -1
  127. package/esm/cli/commands/generate/utils/name-parser.mjs.map +1 -1
  128. package/esm/cli/commands/generate/utils/path-resolver.mjs +1 -1
  129. package/esm/cli/commands/generate/utils/path-resolver.mjs.map +1 -1
  130. package/esm/cli/commands/generate/utils/prompt.mjs +1 -1
  131. package/esm/cli/commands/generate/utils/prompt.mjs.map +1 -1
  132. package/esm/cli/commands/generate/utils/writer.mjs +1 -1
  133. package/esm/cli/commands/generate/utils/writer.mjs.map +1 -1
  134. package/esm/cli/commands/migrate.command.mjs +1 -1
  135. package/esm/cli/commands/migrate.command.mjs.map +1 -1
  136. package/esm/cli/commands/openapi-generator.action.mjs +1 -1
  137. package/esm/cli/commands/openapi-generator.action.mjs.map +1 -1
  138. package/esm/cli/commands/openapi-generator.command.mjs +1 -1
  139. package/esm/cli/commands/openapi-generator.command.mjs.map +1 -1
  140. package/esm/cli/commands/postman-generator.action.mjs +1 -1
  141. package/esm/cli/commands/postman-generator.action.mjs.map +1 -1
  142. package/esm/cli/commands/postman-generator.command.mjs +1 -1
  143. package/esm/cli/commands/postman-generator.command.mjs.map +1 -1
  144. package/esm/cli/commands/routes/diff-page-routes.mjs +1 -1
  145. package/esm/cli/commands/routes/diff-page-routes.mjs.map +1 -1
  146. package/esm/cli/commands/routes/format-routes-table.mjs +1 -1
  147. package/esm/cli/commands/routes/format-routes-table.mjs.map +1 -1
  148. package/esm/cli/commands/routes/route-row.mjs +1 -1
  149. package/esm/cli/commands/routes/route-row.mjs.map +1 -1
  150. package/esm/cli/commands/routes/routes-command.action.mjs +1 -1
  151. package/esm/cli/commands/routes/routes-command.action.mjs.map +1 -1
  152. package/esm/cli/commands/routes/routes-diff.action.mjs +1 -1
  153. package/esm/cli/commands/routes/routes-diff.action.mjs.map +1 -1
  154. package/esm/cli/commands/routes/with-console-on-stderr.mjs +1 -1
  155. package/esm/cli/commands/routes/with-console-on-stderr.mjs.map +1 -1
  156. package/esm/cli/commands/routes.command.mjs +1 -1
  157. package/esm/cli/commands/routes.command.mjs.map +1 -1
  158. package/esm/cli/commands/seed.command.mjs +1 -1
  159. package/esm/cli/commands/seed.command.mjs.map +1 -1
  160. package/esm/cli/commands/start-production.command.mjs +1 -1
  161. package/esm/cli/commands/start-production.command.mjs.map +1 -1
  162. package/esm/cli/commands/storage-put.action.mjs +1 -1
  163. package/esm/cli/commands/storage-put.action.mjs.map +1 -1
  164. package/esm/cli/commands/storage-put.command.mjs +1 -1
  165. package/esm/cli/commands/storage-put.command.mjs.map +1 -1
  166. package/esm/cli/commands/typings-generator.command.mjs +1 -1
  167. package/esm/cli/commands/typings-generator.command.mjs.map +1 -1
  168. package/esm/cli/commands/update.command.mjs +1 -1
  169. package/esm/cli/commands/update.command.mjs.map +1 -1
  170. package/esm/cli/commands-loader.mjs +1 -1
  171. package/esm/cli/commands-loader.mjs.map +1 -1
  172. package/esm/cli/framework-cli-commands.mjs +1 -1
  173. package/esm/cli/framework-cli-commands.mjs.map +1 -1
  174. package/esm/cli/parse-cli-args.mjs +1 -1
  175. package/esm/cli/parse-cli-args.mjs.map +1 -1
  176. package/esm/cli/start.mjs +1 -1
  177. package/esm/cli/start.mjs.map +1 -1
  178. package/esm/cli/string-similarity.mjs +1 -1
  179. package/esm/cli/string-similarity.mjs.map +1 -1
  180. package/esm/commands/cli-command.d.mts +1 -1
  181. package/esm/commands/cli-command.d.mts.map +1 -1
  182. package/esm/commands/cli-command.mjs +1 -1
  183. package/esm/commands/cli-command.mjs.map +1 -1
  184. package/esm/commands/types.d.mts +1 -1
  185. package/esm/commands/types.d.mts.map +1 -1
  186. package/esm/config/config-getter.d.mts +1 -1
  187. package/esm/config/config-getter.d.mts.map +1 -1
  188. package/esm/config/config-getter.mjs +1 -1
  189. package/esm/config/config-getter.mjs.map +1 -1
  190. package/esm/config/config-handlers.d.mts +1 -1
  191. package/esm/config/config-handlers.d.mts.map +1 -1
  192. package/esm/config/config-handlers.mjs +1 -1
  193. package/esm/config/config-handlers.mjs.map +1 -1
  194. package/esm/config/config-key-from-path.mjs +1 -1
  195. package/esm/config/config-key-from-path.mjs.map +1 -1
  196. package/esm/config/config-loader.d.mts +1 -1
  197. package/esm/config/config-loader.d.mts.map +1 -1
  198. package/esm/config/config-loader.mjs +1 -1
  199. package/esm/config/config-loader.mjs.map +1 -1
  200. package/esm/config/config-manager.mjs +1 -1
  201. package/esm/config/config-manager.mjs.map +1 -1
  202. package/esm/config/config-setter.d.mts +1 -1
  203. package/esm/config/config-setter.d.mts.map +1 -1
  204. package/esm/config/config-setter.mjs +1 -1
  205. package/esm/config/config-setter.mjs.map +1 -1
  206. package/esm/config/config-special-handlers.d.mts +1 -1
  207. package/esm/config/config-special-handlers.d.mts.map +1 -1
  208. package/esm/config/config-special-handlers.mjs +1 -1
  209. package/esm/config/config-special-handlers.mjs.map +1 -1
  210. package/esm/config/load-config-files.mjs +1 -1
  211. package/esm/config/load-config-files.mjs.map +1 -1
  212. package/esm/config/locale-configuration.mjs +1 -1
  213. package/esm/config/locale-configuration.mjs.map +1 -1
  214. package/esm/config/types.d.mts +1 -1
  215. package/esm/config/types.d.mts.map +1 -1
  216. package/esm/connectors/access-connector.d.mts +1 -1
  217. package/esm/connectors/access-connector.d.mts.map +1 -1
  218. package/esm/connectors/access-connector.mjs +1 -1
  219. package/esm/connectors/access-connector.mjs.map +1 -1
  220. package/esm/connectors/ai-connector.d.mts +1 -1
  221. package/esm/connectors/ai-connector.d.mts.map +1 -1
  222. package/esm/connectors/ai-connector.mjs +1 -1
  223. package/esm/connectors/ai-connector.mjs.map +1 -1
  224. package/esm/connectors/assert-no-reserved-connector-names.d.mts +1 -1
  225. package/esm/connectors/assert-no-reserved-connector-names.d.mts.map +1 -1
  226. package/esm/connectors/assert-no-reserved-connector-names.mjs +1 -1
  227. package/esm/connectors/assert-no-reserved-connector-names.mjs.map +1 -1
  228. package/esm/connectors/assert-unique-connector-names.d.mts +1 -1
  229. package/esm/connectors/assert-unique-connector-names.d.mts.map +1 -1
  230. package/esm/connectors/assert-unique-connector-names.mjs +1 -1
  231. package/esm/connectors/assert-unique-connector-names.mjs.map +1 -1
  232. package/esm/connectors/base-connector.d.mts +1 -1
  233. package/esm/connectors/base-connector.d.mts.map +1 -1
  234. package/esm/connectors/base-connector.mjs +1 -1
  235. package/esm/connectors/base-connector.mjs.map +1 -1
  236. package/esm/connectors/cache-connector.d.mts +1 -1
  237. package/esm/connectors/cache-connector.d.mts.map +1 -1
  238. package/esm/connectors/cache-connector.mjs +1 -1
  239. package/esm/connectors/cache-connector.mjs.map +1 -1
  240. package/esm/connectors/connectors-manager.d.mts +1 -1
  241. package/esm/connectors/connectors-manager.d.mts.map +1 -1
  242. package/esm/connectors/connectors-manager.mjs +2 -2
  243. package/esm/connectors/connectors-manager.mjs.map +1 -1
  244. package/esm/connectors/database-connector.d.mts +1 -1
  245. package/esm/connectors/database-connector.d.mts.map +1 -1
  246. package/esm/connectors/database-connector.mjs +1 -1
  247. package/esm/connectors/database-connector.mjs.map +1 -1
  248. package/esm/connectors/describe-server-address.mjs +1 -1
  249. package/esm/connectors/describe-server-address.mjs.map +1 -1
  250. package/esm/connectors/herald-connector.d.mts +1 -1
  251. package/esm/connectors/herald-connector.d.mts.map +1 -1
  252. package/esm/connectors/herald-connector.mjs +1 -1
  253. package/esm/connectors/herald-connector.mjs.map +1 -1
  254. package/esm/connectors/http-connector.d.mts +1 -1
  255. package/esm/connectors/http-connector.d.mts.map +1 -1
  256. package/esm/connectors/http-connector.mjs +1 -1
  257. package/esm/connectors/http-connector.mjs.map +1 -1
  258. package/esm/connectors/logger-connector.d.mts +1 -1
  259. package/esm/connectors/logger-connector.d.mts.map +1 -1
  260. package/esm/connectors/logger-connector.mjs +1 -1
  261. package/esm/connectors/logger-connector.mjs.map +1 -1
  262. package/esm/connectors/mail-connector.d.mts +1 -1
  263. package/esm/connectors/mail-connector.d.mts.map +1 -1
  264. package/esm/connectors/mail-connector.mjs +1 -1
  265. package/esm/connectors/mail-connector.mjs.map +1 -1
  266. package/esm/connectors/notifications-connector.d.mts +1 -1
  267. package/esm/connectors/notifications-connector.d.mts.map +1 -1
  268. package/esm/connectors/notifications-connector.mjs +1 -1
  269. package/esm/connectors/notifications-connector.mjs.map +1 -1
  270. package/esm/connectors/read-bound-port.mjs +1 -1
  271. package/esm/connectors/read-bound-port.mjs.map +1 -1
  272. package/esm/connectors/register-configured-connectors.d.mts +1 -1
  273. package/esm/connectors/register-configured-connectors.d.mts.map +1 -1
  274. package/esm/connectors/register-configured-connectors.mjs +1 -1
  275. package/esm/connectors/register-configured-connectors.mjs.map +1 -1
  276. package/esm/connectors/single-server-warnings.mjs +1 -1
  277. package/esm/connectors/single-server-warnings.mjs.map +1 -1
  278. package/esm/connectors/socket-connector.d.mts +1 -1
  279. package/esm/connectors/socket-connector.d.mts.map +1 -1
  280. package/esm/connectors/socket-connector.mjs +1 -1
  281. package/esm/connectors/socket-connector.mjs.map +1 -1
  282. package/esm/connectors/storage.connector.d.mts +1 -1
  283. package/esm/connectors/storage.connector.d.mts.map +1 -1
  284. package/esm/connectors/storage.connector.mjs +1 -1
  285. package/esm/connectors/storage.connector.mjs.map +1 -1
  286. package/esm/connectors/types.d.mts +1 -1
  287. package/esm/connectors/types.d.mts.map +1 -1
  288. package/esm/connectors/types.mjs +1 -1
  289. package/esm/connectors/types.mjs.map +1 -1
  290. package/esm/container/container-instance-registry.mjs +1 -1
  291. package/esm/container/container-instance-registry.mjs.map +1 -1
  292. package/esm/container/development-app-modules.d.mts +31 -0
  293. package/esm/container/development-app-modules.d.mts.map +1 -0
  294. package/esm/container/development-model-modules.d.mts +1 -1
  295. package/esm/container/development-model-modules.d.mts.map +1 -1
  296. package/esm/container/index.d.mts +3 -1
  297. package/esm/container/index.d.mts.map +1 -1
  298. package/esm/container/index.mjs +1 -1
  299. package/esm/container/index.mjs.map +1 -1
  300. package/esm/database/create-database-action.mjs +1 -1
  301. package/esm/database/create-database-action.mjs.map +1 -1
  302. package/esm/database/drop-tables-action.mjs +1 -1
  303. package/esm/database/drop-tables-action.mjs.map +1 -1
  304. package/esm/database/migrate-action.mjs +1 -1
  305. package/esm/database/migrate-action.mjs.map +1 -1
  306. package/esm/database/models/database-log/database-log.d.mts +31 -39
  307. package/esm/database/models/database-log/database-log.d.mts.map +1 -1
  308. package/esm/database/models/database-log/database-log.mjs +1 -1
  309. package/esm/database/models/database-log/database-log.mjs.map +1 -1
  310. package/esm/database/pending-exit-code.mjs +1 -1
  311. package/esm/database/pending-exit-code.mjs.map +1 -1
  312. package/esm/database/resolve-pending-migrations.mjs +1 -1
  313. package/esm/database/resolve-pending-migrations.mjs.map +1 -1
  314. package/esm/database/seed-command-action.mjs +1 -1
  315. package/esm/database/seed-command-action.mjs.map +1 -1
  316. package/esm/database/seeds/seed-records-table-migration.mjs +1 -1
  317. package/esm/database/seeds/seed-records-table-migration.mjs.map +1 -1
  318. package/esm/database/seeds/seeder.d.mts +1 -1
  319. package/esm/database/seeds/seeder.d.mts.map +1 -1
  320. package/esm/database/seeds/seeder.errors.d.mts +1 -1
  321. package/esm/database/seeds/seeder.errors.d.mts.map +1 -1
  322. package/esm/database/seeds/seeder.errors.mjs +1 -1
  323. package/esm/database/seeds/seeder.errors.mjs.map +1 -1
  324. package/esm/database/seeds/seeder.mjs +1 -1
  325. package/esm/database/seeds/seeder.mjs.map +1 -1
  326. package/esm/database/seeds/seeders.manager.mjs +1 -1
  327. package/esm/database/seeds/seeders.manager.mjs.map +1 -1
  328. package/esm/database/seeds/seeds-table-migration.mjs +1 -1
  329. package/esm/database/seeds/seeds-table-migration.mjs.map +1 -1
  330. package/esm/database/seeds/types.d.mts +1 -1
  331. package/esm/database/seeds/types.d.mts.map +1 -1
  332. package/esm/database/seeds/utils.mjs +1 -1
  333. package/esm/database/seeds/utils.mjs.map +1 -1
  334. package/esm/database/utils.d.mts +1 -1
  335. package/esm/database/utils.d.mts.map +1 -1
  336. package/esm/database/utils.mjs +1 -1
  337. package/esm/database/utils.mjs.map +1 -1
  338. package/esm/dev-server/app-module-registry.mjs +52 -0
  339. package/esm/dev-server/app-module-registry.mjs.map +1 -0
  340. package/esm/dev-server/boot-precondition-error.mjs +1 -1
  341. package/esm/dev-server/boot-precondition-error.mjs.map +1 -1
  342. package/esm/dev-server/build-development-openapi-document.mjs +1 -1
  343. package/esm/dev-server/build-development-openapi-document.mjs.map +1 -1
  344. package/esm/dev-server/check-for-updates.mjs +1 -1
  345. package/esm/dev-server/check-for-updates.mjs.map +1 -1
  346. package/esm/dev-server/collect-development-api-routes.mjs +1 -1
  347. package/esm/dev-server/collect-development-api-routes.mjs.map +1 -1
  348. package/esm/dev-server/create-worker.mjs +1 -1
  349. package/esm/dev-server/create-worker.mjs.map +1 -1
  350. package/esm/dev-server/dependency-graph.d.mts +1 -1
  351. package/esm/dev-server/dependency-graph.d.mts.map +1 -1
  352. package/esm/dev-server/dependency-graph.mjs +1 -1
  353. package/esm/dev-server/dependency-graph.mjs.map +1 -1
  354. package/esm/dev-server/dev-logger.mjs +1 -1
  355. package/esm/dev-server/dev-logger.mjs.map +1 -1
  356. package/esm/dev-server/development-server.mjs +1 -1
  357. package/esm/dev-server/development-server.mjs.map +1 -1
  358. package/esm/dev-server/events.mjs +1 -1
  359. package/esm/dev-server/events.mjs.map +1 -1
  360. package/esm/dev-server/extract-translation-keys.mjs +1 -1
  361. package/esm/dev-server/extract-translation-keys.mjs.map +1 -1
  362. package/esm/dev-server/file-event-handler.mjs +1 -1
  363. package/esm/dev-server/file-event-handler.mjs.map +1 -1
  364. package/esm/dev-server/file-manager.d.mts +1 -1
  365. package/esm/dev-server/file-manager.d.mts.map +1 -1
  366. package/esm/dev-server/file-manager.mjs +1 -1
  367. package/esm/dev-server/file-manager.mjs.map +1 -1
  368. package/esm/dev-server/file-operations.d.mts +1 -1
  369. package/esm/dev-server/file-operations.d.mts.map +1 -1
  370. package/esm/dev-server/file-operations.mjs +1 -1
  371. package/esm/dev-server/file-operations.mjs.map +1 -1
  372. package/esm/dev-server/files-orchestrator.mjs +28 -14
  373. package/esm/dev-server/files-orchestrator.mjs.map +1 -1
  374. package/esm/dev-server/files-watcher.mjs +1 -1
  375. package/esm/dev-server/files-watcher.mjs.map +1 -1
  376. package/esm/dev-server/flags.mjs +1 -1
  377. package/esm/dev-server/flags.mjs.map +1 -1
  378. package/esm/dev-server/health-checker/checkers/base-health-checker.mjs +1 -1
  379. package/esm/dev-server/health-checker/checkers/base-health-checker.mjs.map +1 -1
  380. package/esm/dev-server/health-checker/checkers/eslint-health-checker.mjs +1 -1
  381. package/esm/dev-server/health-checker/checkers/eslint-health-checker.mjs.map +1 -1
  382. package/esm/dev-server/health-checker/checkers/typescript-health-checker.mjs +1 -1
  383. package/esm/dev-server/health-checker/checkers/typescript-health-checker.mjs.map +1 -1
  384. package/esm/dev-server/health-checker/file-health-checker.contract.d.mts +1 -1
  385. package/esm/dev-server/health-checker/file-health-checker.contract.d.mts.map +1 -1
  386. package/esm/dev-server/health-checker/file-health-result.d.mts +1 -1
  387. package/esm/dev-server/health-checker/file-health-result.d.mts.map +1 -1
  388. package/esm/dev-server/health-checker/file-health-result.mjs +1 -1
  389. package/esm/dev-server/health-checker/file-health-result.mjs.map +1 -1
  390. package/esm/dev-server/health-checker/files-healthcare.manager.mjs +1 -1
  391. package/esm/dev-server/health-checker/files-healthcare.manager.mjs.map +1 -1
  392. package/esm/dev-server/health-checker/workers/eslint-health.worker.mjs +1 -1
  393. package/esm/dev-server/health-checker/workers/eslint-health.worker.mjs.map +1 -1
  394. package/esm/dev-server/health-checker/workers/ts-health.worker.mjs +1 -1
  395. package/esm/dev-server/health-checker/workers/ts-health.worker.mjs.map +1 -1
  396. package/esm/dev-server/layer-executor.mjs +1 -1
  397. package/esm/dev-server/layer-executor.mjs.map +1 -1
  398. package/esm/dev-server/legacy-locales-warning.mjs +1 -1
  399. package/esm/dev-server/legacy-locales-warning.mjs.map +1 -1
  400. package/esm/dev-server/loader/build-transpile-init.mjs +1 -1
  401. package/esm/dev-server/loader/build-transpile-init.mjs.map +1 -1
  402. package/esm/dev-server/loader/hook-thread.d.mts +1 -1
  403. package/esm/dev-server/loader/hook-thread.d.mts.map +1 -1
  404. package/esm/dev-server/loader/hook-thread.mjs +1 -1
  405. package/esm/dev-server/loader/hook-thread.mjs.map +1 -1
  406. package/esm/dev-server/loader/load-hook.d.mts +1 -1
  407. package/esm/dev-server/loader/load-hook.d.mts.map +1 -1
  408. package/esm/dev-server/loader/load-hook.mjs +1 -1
  409. package/esm/dev-server/loader/load-hook.mjs.map +1 -1
  410. package/esm/dev-server/loader/loader-port-acks.mjs +34 -0
  411. package/esm/dev-server/loader/loader-port-acks.mjs.map +1 -0
  412. package/esm/dev-server/loader/own-resolver.mjs +1 -1
  413. package/esm/dev-server/loader/own-resolver.mjs.map +1 -1
  414. package/esm/dev-server/loader/register-loader.mjs +1 -1
  415. package/esm/dev-server/loader/register-loader.mjs.map +1 -1
  416. package/esm/dev-server/loader/resolve-capture.mjs +1 -1
  417. package/esm/dev-server/loader/resolve-capture.mjs.map +1 -1
  418. package/esm/dev-server/loader/resolve-hook.d.mts +1 -1
  419. package/esm/dev-server/loader/resolve-hook.d.mts.map +1 -1
  420. package/esm/dev-server/loader/resolve-hook.mjs +2 -2
  421. package/esm/dev-server/loader/resolve-hook.mjs.map +1 -1
  422. package/esm/dev-server/loader/source-slug.mjs +1 -1
  423. package/esm/dev-server/loader/source-slug.mjs.map +1 -1
  424. package/esm/dev-server/loader/transpile-cache.mjs +1 -1
  425. package/esm/dev-server/loader/transpile-cache.mjs.map +1 -1
  426. package/esm/dev-server/loader/version-registry.mjs +1 -1
  427. package/esm/dev-server/loader/version-registry.mjs.map +1 -1
  428. package/esm/dev-server/manifest-manager.d.mts +1 -1
  429. package/esm/dev-server/manifest-manager.d.mts.map +1 -1
  430. package/esm/dev-server/manifest-manager.mjs +1 -1
  431. package/esm/dev-server/manifest-manager.mjs.map +1 -1
  432. package/esm/dev-server/model-module-registry.mjs +1 -1
  433. package/esm/dev-server/model-module-registry.mjs.map +1 -1
  434. package/esm/dev-server/model-resource-typings.mjs +1 -1
  435. package/esm/dev-server/model-resource-typings.mjs.map +1 -1
  436. package/esm/dev-server/module-loader.mjs +1 -1
  437. package/esm/dev-server/module-loader.mjs.map +1 -1
  438. package/esm/dev-server/package-json-manager.mjs +1 -1
  439. package/esm/dev-server/package-json-manager.mjs.map +1 -1
  440. package/esm/dev-server/parse-imports.mjs +73 -6
  441. package/esm/dev-server/parse-imports.mjs.map +1 -1
  442. package/esm/dev-server/read-config-ast.mjs +1 -1
  443. package/esm/dev-server/read-config-ast.mjs.map +1 -1
  444. package/esm/dev-server/ready-block.mjs +1 -1
  445. package/esm/dev-server/ready-block.mjs.map +1 -1
  446. package/esm/dev-server/register-dev-shortcuts.mjs +1 -1
  447. package/esm/dev-server/register-dev-shortcuts.mjs.map +1 -1
  448. package/esm/dev-server/register-installed-devtools.mjs +1 -1
  449. package/esm/dev-server/register-installed-devtools.mjs.map +1 -1
  450. package/esm/dev-server/restart-dev-server.mjs +1 -1
  451. package/esm/dev-server/restart-dev-server.mjs.map +1 -1
  452. package/esm/dev-server/route-types-publisher.mjs +1 -1
  453. package/esm/dev-server/route-types-publisher.mjs.map +1 -1
  454. package/esm/dev-server/run-connector-typings.mjs +1 -1
  455. package/esm/dev-server/run-connector-typings.mjs.map +1 -1
  456. package/esm/dev-server/run-typings-generation.mjs +1 -1
  457. package/esm/dev-server/run-typings-generation.mjs.map +1 -1
  458. package/esm/dev-server/shortcuts.mjs +1 -1
  459. package/esm/dev-server/shortcuts.mjs.map +1 -1
  460. package/esm/dev-server/special-file-patterns.mjs +1 -1
  461. package/esm/dev-server/special-file-patterns.mjs.map +1 -1
  462. package/esm/dev-server/special-files-collector.d.mts +1 -1
  463. package/esm/dev-server/special-files-collector.d.mts.map +1 -1
  464. package/esm/dev-server/special-files-collector.mjs +1 -1
  465. package/esm/dev-server/special-files-collector.mjs.map +1 -1
  466. package/esm/dev-server/start-development-server.mjs +1 -1
  467. package/esm/dev-server/start-development-server.mjs.map +1 -1
  468. package/esm/dev-server/supervisor.mjs +1 -1
  469. package/esm/dev-server/supervisor.mjs.map +1 -1
  470. package/esm/dev-server/translation-keys-sources.mjs +1 -1
  471. package/esm/dev-server/translation-keys-sources.mjs.map +1 -1
  472. package/esm/dev-server/tsconfig-manager.mjs +1 -1
  473. package/esm/dev-server/tsconfig-manager.mjs.map +1 -1
  474. package/esm/dev-server/type-generator.mjs +32 -11
  475. package/esm/dev-server/type-generator.mjs.map +1 -1
  476. package/esm/dev-server/types.d.mts +1 -1
  477. package/esm/dev-server/types.d.mts.map +1 -1
  478. package/esm/dev-server/update-check-cache.mjs +1 -1
  479. package/esm/dev-server/update-check-cache.mjs.map +1 -1
  480. package/esm/dev-server/utils.mjs +1 -1
  481. package/esm/dev-server/utils.mjs.map +1 -1
  482. package/esm/encryption/encrypt.d.mts +1 -1
  483. package/esm/encryption/encrypt.d.mts.map +1 -1
  484. package/esm/encryption/encrypt.mjs +1 -1
  485. package/esm/encryption/encrypt.mjs.map +1 -1
  486. package/esm/encryption/hash.d.mts +1 -1
  487. package/esm/encryption/hash.d.mts.map +1 -1
  488. package/esm/encryption/hash.mjs +1 -1
  489. package/esm/encryption/hash.mjs.map +1 -1
  490. package/esm/encryption/password.d.mts +1 -1
  491. package/esm/encryption/password.d.mts.map +1 -1
  492. package/esm/encryption/password.mjs +1 -1
  493. package/esm/encryption/password.mjs.map +1 -1
  494. package/esm/encryption/types.d.mts +1 -1
  495. package/esm/encryption/types.d.mts.map +1 -1
  496. package/esm/errors/container-key-missing-error.mjs +1 -1
  497. package/esm/errors/container-key-missing-error.mjs.map +1 -1
  498. package/esm/errors/esbuild-binary-missing-error.mjs +1 -1
  499. package/esm/errors/esbuild-binary-missing-error.mjs.map +1 -1
  500. package/esm/errors/index.d.mts +2 -0
  501. package/esm/errors/index.mjs +3 -0
  502. package/esm/errors/unknown-locale-error.mjs +1 -1
  503. package/esm/errors/unknown-locale-error.mjs.map +1 -1
  504. package/esm/generations/add-command.action.mjs +29 -6
  505. package/esm/generations/add-command.action.mjs.map +1 -1
  506. package/esm/generations/features/access.feature.mjs +1 -1
  507. package/esm/generations/features/access.feature.mjs.map +1 -1
  508. package/esm/generations/features/ai-anthropic.feature.mjs +1 -1
  509. package/esm/generations/features/ai-anthropic.feature.mjs.map +1 -1
  510. package/esm/generations/features/ai-bedrock.feature.mjs +1 -1
  511. package/esm/generations/features/ai-bedrock.feature.mjs.map +1 -1
  512. package/esm/generations/features/ai-google.feature.mjs +1 -1
  513. package/esm/generations/features/ai-google.feature.mjs.map +1 -1
  514. package/esm/generations/features/ai-ollama.feature.mjs +1 -1
  515. package/esm/generations/features/ai-ollama.feature.mjs.map +1 -1
  516. package/esm/generations/features/ai-openai.feature.mjs +1 -1
  517. package/esm/generations/features/ai-openai.feature.mjs.map +1 -1
  518. package/esm/generations/features/ai-panoptic.feature.mjs +1 -1
  519. package/esm/generations/features/ai-panoptic.feature.mjs.map +1 -1
  520. package/esm/generations/features/ai-tools.feature.mjs +1 -1
  521. package/esm/generations/features/ai-tools.feature.mjs.map +1 -1
  522. package/esm/generations/features/ai-workspace.feature.mjs +1 -1
  523. package/esm/generations/features/ai-workspace.feature.mjs.map +1 -1
  524. package/esm/generations/features/ai.feature.mjs +1 -1
  525. package/esm/generations/features/ai.feature.mjs.map +1 -1
  526. package/esm/generations/features/auth-google.feature.mjs +1 -1
  527. package/esm/generations/features/auth-google.feature.mjs.map +1 -1
  528. package/esm/generations/features/auth-passkeys.feature.mjs +1 -1
  529. package/esm/generations/features/auth-passkeys.feature.mjs.map +1 -1
  530. package/esm/generations/features/bull-board.feature.mjs +1 -1
  531. package/esm/generations/features/bull-board.feature.mjs.map +1 -1
  532. package/esm/generations/features/devtools.feature.mjs +1 -1
  533. package/esm/generations/features/devtools.feature.mjs.map +1 -1
  534. package/esm/generations/features/herald.feature.mjs +1 -1
  535. package/esm/generations/features/herald.feature.mjs.map +1 -1
  536. package/esm/generations/features/image.feature.mjs +1 -1
  537. package/esm/generations/features/image.feature.mjs.map +1 -1
  538. package/esm/generations/features/index.mjs +1 -1
  539. package/esm/generations/features/index.mjs.map +1 -1
  540. package/esm/generations/features/mail.feature.mjs +1 -1
  541. package/esm/generations/features/mail.feature.mjs.map +1 -1
  542. package/esm/generations/features/mongodb.feature.mjs +1 -1
  543. package/esm/generations/features/mongodb.feature.mjs.map +1 -1
  544. package/esm/generations/features/mysql.feature.mjs +1 -1
  545. package/esm/generations/features/mysql.feature.mjs.map +1 -1
  546. package/esm/generations/features/notifications.feature.mjs +121 -17
  547. package/esm/generations/features/notifications.feature.mjs.map +1 -1
  548. package/esm/generations/features/postgres.feature.mjs +1 -1
  549. package/esm/generations/features/postgres.feature.mjs.map +1 -1
  550. package/esm/generations/features/queue.feature.mjs +1 -1
  551. package/esm/generations/features/queue.feature.mjs.map +1 -1
  552. package/esm/generations/features/react-email.feature.mjs +1 -1
  553. package/esm/generations/features/react-email.feature.mjs.map +1 -1
  554. package/esm/generations/features/react.feature.mjs +1 -1
  555. package/esm/generations/features/react.feature.mjs.map +1 -1
  556. package/esm/generations/features/redis.feature.mjs +1 -1
  557. package/esm/generations/features/redis.feature.mjs.map +1 -1
  558. package/esm/generations/features/s3.feature.mjs +1 -1
  559. package/esm/generations/features/s3.feature.mjs.map +1 -1
  560. package/esm/generations/features/scheduler.feature.mjs +1 -1
  561. package/esm/generations/features/scheduler.feature.mjs.map +1 -1
  562. package/esm/generations/features/ses.feature.mjs +1 -1
  563. package/esm/generations/features/ses.feature.mjs.map +1 -1
  564. package/esm/generations/features/shadcn.feature.mjs +1 -1
  565. package/esm/generations/features/shadcn.feature.mjs.map +1 -1
  566. package/esm/generations/features/shared/insert-connector-entry.mjs +1 -1
  567. package/esm/generations/features/shared/insert-connector-entry.mjs.map +1 -1
  568. package/esm/generations/features/shared/insert-queue-dashboard-block.mjs +1 -1
  569. package/esm/generations/features/shared/insert-queue-dashboard-block.mjs.map +1 -1
  570. package/esm/generations/features/shared/link-ai-package-import.mjs +1 -1
  571. package/esm/generations/features/shared/link-ai-package-import.mjs.map +1 -1
  572. package/esm/generations/features/shared/merge-web-sitemap-config.mjs +1 -1
  573. package/esm/generations/features/shared/merge-web-sitemap-config.mjs.map +1 -1
  574. package/esm/generations/features/shared/migration-timestamp.mjs +1 -1
  575. package/esm/generations/features/shared/migration-timestamp.mjs.map +1 -1
  576. package/esm/generations/features/shared/patch-tsconfig-include.mjs +1 -1
  577. package/esm/generations/features/shared/patch-tsconfig-include.mjs.map +1 -1
  578. package/esm/generations/features/shared/relocate-conflicting-home-route.mjs +1 -1
  579. package/esm/generations/features/shared/relocate-conflicting-home-route.mjs.map +1 -1
  580. package/esm/generations/features/shared/resolve-contact-scaffold.mjs +1 -1
  581. package/esm/generations/features/shared/resolve-contact-scaffold.mjs.map +1 -1
  582. package/esm/generations/features/sitemap.feature.mjs +1 -1
  583. package/esm/generations/features/sitemap.feature.mjs.map +1 -1
  584. package/esm/generations/features/socket.feature.mjs +1 -1
  585. package/esm/generations/features/socket.feature.mjs.map +1 -1
  586. package/esm/generations/features/tailwind.feature.mjs +1 -1
  587. package/esm/generations/features/tailwind.feature.mjs.map +1 -1
  588. package/esm/generations/features/test.feature.mjs +1 -1
  589. package/esm/generations/features/test.feature.mjs.map +1 -1
  590. package/esm/generations/features/types.mjs +1 -1
  591. package/esm/generations/features/types.mjs.map +1 -1
  592. package/esm/generations/features/web.feature.mjs +1 -1
  593. package/esm/generations/features/web.feature.mjs.map +1 -1
  594. package/esm/generations/pnpm-build-approvals.mjs +89 -3
  595. package/esm/generations/pnpm-build-approvals.mjs.map +1 -1
  596. package/esm/generations/stubs.mjs +184 -78
  597. package/esm/generations/stubs.mjs.map +1 -1
  598. package/esm/http/boot-port-preflight.d.mts +1 -1
  599. package/esm/http/boot-port-preflight.d.mts.map +1 -1
  600. package/esm/http/boot-port-preflight.mjs +1 -1
  601. package/esm/http/boot-port-preflight.mjs.map +1 -1
  602. package/esm/http/build-cors-options.mjs +1 -1
  603. package/esm/http/build-cors-options.mjs.map +1 -1
  604. package/esm/http/build-rate-limit-options.d.mts +22 -1
  605. package/esm/http/build-rate-limit-options.d.mts.map +1 -1
  606. package/esm/http/build-rate-limit-options.mjs +7 -1
  607. package/esm/http/build-rate-limit-options.mjs.map +1 -1
  608. package/esm/http/config.d.mts +1 -1
  609. package/esm/http/config.d.mts.map +1 -1
  610. package/esm/http/config.mjs +1 -1
  611. package/esm/http/config.mjs.map +1 -1
  612. package/esm/http/context/request-context.d.mts +1 -1
  613. package/esm/http/context/request-context.d.mts.map +1 -1
  614. package/esm/http/context/request-context.mjs +1 -1
  615. package/esm/http/context/request-context.mjs.map +1 -1
  616. package/esm/http/context/request-memo.d.mts +1 -1
  617. package/esm/http/context/request-memo.d.mts.map +1 -1
  618. package/esm/http/context/request-memo.mjs +1 -1
  619. package/esm/http/context/request-memo.mjs.map +1 -1
  620. package/esm/http/createHttpApplication.d.mts +1 -1
  621. package/esm/http/createHttpApplication.d.mts.map +1 -1
  622. package/esm/http/createHttpApplication.mjs +1 -1
  623. package/esm/http/createHttpApplication.mjs.map +1 -1
  624. package/esm/http/csp.d.mts +1 -1
  625. package/esm/http/csp.d.mts.map +1 -1
  626. package/esm/http/csp.mjs +1 -1
  627. package/esm/http/csp.mjs.map +1 -1
  628. package/esm/http/csrf-default-guard.d.mts +1 -1
  629. package/esm/http/csrf-default-guard.d.mts.map +1 -1
  630. package/esm/http/csrf-default-guard.mjs +1 -1
  631. package/esm/http/csrf-default-guard.mjs.map +1 -1
  632. package/esm/http/csrf-origin-policy.d.mts +1 -1
  633. package/esm/http/csrf-origin-policy.d.mts.map +1 -1
  634. package/esm/http/csrf-origin-policy.mjs +1 -1
  635. package/esm/http/csrf-origin-policy.mjs.map +1 -1
  636. package/esm/http/database/RequestLog.d.mts +63 -111
  637. package/esm/http/database/RequestLog.d.mts.map +1 -1
  638. package/esm/http/database/RequestLog.mjs +1 -1
  639. package/esm/http/database/RequestLog.mjs.map +1 -1
  640. package/esm/http/error-codes.d.mts +1 -1
  641. package/esm/http/error-codes.d.mts.map +1 -1
  642. package/esm/http/error-codes.mjs +1 -1
  643. package/esm/http/error-codes.mjs.map +1 -1
  644. package/esm/http/error-mapper.d.mts +48 -0
  645. package/esm/http/error-mapper.d.mts.map +1 -0
  646. package/esm/http/error-mapper.mjs +48 -0
  647. package/esm/http/error-mapper.mjs.map +1 -0
  648. package/esm/http/errors/errors.d.mts +1 -1
  649. package/esm/http/errors/errors.d.mts.map +1 -1
  650. package/esm/http/errors/errors.mjs +1 -1
  651. package/esm/http/errors/errors.mjs.map +1 -1
  652. package/esm/http/events.d.mts +1 -1
  653. package/esm/http/events.d.mts.map +1 -1
  654. package/esm/http/events.mjs +1 -1
  655. package/esm/http/events.mjs.map +1 -1
  656. package/esm/http/flush-pending-cookies.mjs +1 -1
  657. package/esm/http/flush-pending-cookies.mjs.map +1 -1
  658. package/esm/http/health.d.mts +1 -1
  659. package/esm/http/health.d.mts.map +1 -1
  660. package/esm/http/health.mjs +1 -1
  661. package/esm/http/health.mjs.map +1 -1
  662. package/esm/http/index.d.mts +10 -6
  663. package/esm/http/index.mjs +8 -5
  664. package/esm/http/middleware/cache-response-middleware.d.mts +1 -1
  665. package/esm/http/middleware/cache-response-middleware.d.mts.map +1 -1
  666. package/esm/http/middleware/cache-response-middleware.mjs +1 -1
  667. package/esm/http/middleware/cache-response-middleware.mjs.map +1 -1
  668. package/esm/http/middleware/concurrency-limit.middleware.d.mts +1 -1
  669. package/esm/http/middleware/concurrency-limit.middleware.d.mts.map +1 -1
  670. package/esm/http/middleware/concurrency-limit.middleware.mjs +1 -1
  671. package/esm/http/middleware/concurrency-limit.middleware.mjs.map +1 -1
  672. package/esm/http/middleware/idempotency.middleware.d.mts +1 -1
  673. package/esm/http/middleware/idempotency.middleware.d.mts.map +1 -1
  674. package/esm/http/middleware/idempotency.middleware.mjs +1 -1
  675. package/esm/http/middleware/idempotency.middleware.mjs.map +1 -1
  676. package/esm/http/middleware/inject-request-context.d.mts +1 -1
  677. package/esm/http/middleware/inject-request-context.d.mts.map +1 -1
  678. package/esm/http/middleware/inject-request-context.mjs +4 -2
  679. package/esm/http/middleware/inject-request-context.mjs.map +1 -1
  680. package/esm/http/middleware/ip-filter.middleware.d.mts +1 -1
  681. package/esm/http/middleware/ip-filter.middleware.d.mts.map +1 -1
  682. package/esm/http/middleware/ip-filter.middleware.mjs +1 -1
  683. package/esm/http/middleware/ip-filter.middleware.mjs.map +1 -1
  684. package/esm/http/middleware/maintenance.middleware.d.mts +1 -1
  685. package/esm/http/middleware/maintenance.middleware.d.mts.map +1 -1
  686. package/esm/http/middleware/maintenance.middleware.mjs +1 -1
  687. package/esm/http/middleware/maintenance.middleware.mjs.map +1 -1
  688. package/esm/http/middleware/max-body-size.middleware.d.mts +1 -1
  689. package/esm/http/middleware/max-body-size.middleware.d.mts.map +1 -1
  690. package/esm/http/middleware/max-body-size.middleware.mjs +1 -1
  691. package/esm/http/middleware/max-body-size.middleware.mjs.map +1 -1
  692. package/esm/http/middleware/middleware-list.d.mts +1 -1
  693. package/esm/http/middleware/middleware-list.d.mts.map +1 -1
  694. package/esm/http/middleware/middleware-list.mjs +1 -1
  695. package/esm/http/middleware/middleware-list.mjs.map +1 -1
  696. package/esm/http/middleware/rate-limit.middleware.d.mts +20 -5
  697. package/esm/http/middleware/rate-limit.middleware.d.mts.map +1 -1
  698. package/esm/http/middleware/rate-limit.middleware.mjs +34 -12
  699. package/esm/http/middleware/rate-limit.middleware.mjs.map +1 -1
  700. package/esm/http/middleware/utils/cidr-match.d.mts +1 -1
  701. package/esm/http/middleware/utils/cidr-match.d.mts.map +1 -1
  702. package/esm/http/middleware/utils/cidr-match.mjs +1 -1
  703. package/esm/http/middleware/utils/cidr-match.mjs.map +1 -1
  704. package/esm/http/middleware/utils/idempotency-key.d.mts +1 -1
  705. package/esm/http/middleware/utils/idempotency-key.d.mts.map +1 -1
  706. package/esm/http/middleware/utils/idempotency-key.mjs +1 -1
  707. package/esm/http/middleware/utils/idempotency-key.mjs.map +1 -1
  708. package/esm/http/middleware/utils/parse-size.d.mts +1 -1
  709. package/esm/http/middleware/utils/parse-size.d.mts.map +1 -1
  710. package/esm/http/middleware/utils/parse-size.mjs +1 -1
  711. package/esm/http/middleware/utils/parse-size.mjs.map +1 -1
  712. package/esm/http/parse-urlencoded-body.mjs +1 -1
  713. package/esm/http/parse-urlencoded-body.mjs.map +1 -1
  714. package/esm/http/plugins.d.mts +9 -2
  715. package/esm/http/plugins.d.mts.map +1 -1
  716. package/esm/http/plugins.mjs +18 -4
  717. package/esm/http/plugins.mjs.map +1 -1
  718. package/esm/http/port-preflight.d.mts +1 -1
  719. package/esm/http/port-preflight.d.mts.map +1 -1
  720. package/esm/http/port-preflight.mjs +1 -1
  721. package/esm/http/port-preflight.mjs.map +1 -1
  722. package/esm/http/rate-limit-cache-store.mjs +155 -0
  723. package/esm/http/rate-limit-cache-store.mjs.map +1 -0
  724. package/esm/http/ready-report.d.mts +1 -1
  725. package/esm/http/ready-report.d.mts.map +1 -1
  726. package/esm/http/ready-report.mjs +1 -1
  727. package/esm/http/ready-report.mjs.map +1 -1
  728. package/esm/http/request-controller.d.mts +1 -1
  729. package/esm/http/request-controller.d.mts.map +1 -1
  730. package/esm/http/request-controller.mjs +1 -1
  731. package/esm/http/request-controller.mjs.map +1 -1
  732. package/esm/http/request-log-snapshot.d.mts +123 -0
  733. package/esm/http/request-log-snapshot.d.mts.map +1 -0
  734. package/esm/http/request-log-snapshot.mjs +141 -0
  735. package/esm/http/request-log-snapshot.mjs.map +1 -0
  736. package/esm/http/request.d.mts +41 -2
  737. package/esm/http/request.d.mts.map +1 -1
  738. package/esm/http/request.mjs +65 -2
  739. package/esm/http/request.mjs.map +1 -1
  740. package/esm/http/resolve-bind-port.mjs +1 -1
  741. package/esm/http/resolve-bind-port.mjs.map +1 -1
  742. package/esm/http/response.d.mts +40 -8
  743. package/esm/http/response.d.mts.map +1 -1
  744. package/esm/http/response.mjs +173 -61
  745. package/esm/http/response.mjs.map +1 -1
  746. package/esm/http/serialized.d.mts +1 -1
  747. package/esm/http/serialized.d.mts.map +1 -1
  748. package/esm/http/server-rebuilt.d.mts +1 -1
  749. package/esm/http/server-rebuilt.d.mts.map +1 -1
  750. package/esm/http/server-rebuilt.mjs +1 -1
  751. package/esm/http/server-rebuilt.mjs.map +1 -1
  752. package/esm/http/server.d.mts +34 -6
  753. package/esm/http/server.d.mts.map +1 -1
  754. package/esm/http/server.mjs +70 -5
  755. package/esm/http/server.mjs.map +1 -1
  756. package/esm/http/stream-react-response.d.mts +1 -1
  757. package/esm/http/stream-react-response.d.mts.map +1 -1
  758. package/esm/http/stream-react-response.mjs +1 -1
  759. package/esm/http/stream-react-response.mjs.map +1 -1
  760. package/esm/http/stream-transport.mjs +75 -0
  761. package/esm/http/stream-transport.mjs.map +1 -0
  762. package/esm/http/tracing/trace-id.d.mts +1 -1
  763. package/esm/http/tracing/trace-id.d.mts.map +1 -1
  764. package/esm/http/tracing/trace-id.mjs +1 -1
  765. package/esm/http/tracing/trace-id.mjs.map +1 -1
  766. package/esm/http/tracing/tracing-dispatcher.d.mts +1 -1
  767. package/esm/http/tracing/tracing-dispatcher.d.mts.map +1 -1
  768. package/esm/http/tracing/tracing-dispatcher.mjs +1 -1
  769. package/esm/http/tracing/tracing-dispatcher.mjs.map +1 -1
  770. package/esm/http/tracing/tracing.type.d.mts +1 -1
  771. package/esm/http/tracing/tracing.type.d.mts.map +1 -1
  772. package/esm/http/types.d.mts +131 -6
  773. package/esm/http/types.d.mts.map +1 -1
  774. package/esm/http/uploaded-file.d.mts +2 -2
  775. package/esm/http/uploaded-file.d.mts.map +1 -1
  776. package/esm/http/uploaded-file.mjs +2 -2
  777. package/esm/http/uploaded-file.mjs.map +1 -1
  778. package/esm/http/uploads/detect-image-format.mjs +1 -1
  779. package/esm/http/uploads/detect-image-format.mjs.map +1 -1
  780. package/esm/http/uploads/generate-image-variant.mjs +1 -1
  781. package/esm/http/uploads/generate-image-variant.mjs.map +1 -1
  782. package/esm/http/uploads/generate-image-variants.d.mts +1 -1
  783. package/esm/http/uploads/generate-image-variants.d.mts.map +1 -1
  784. package/esm/http/uploads/generate-image-variants.mjs +15 -7
  785. package/esm/http/uploads/generate-image-variants.mjs.map +1 -1
  786. package/esm/http/uploads/image-variant-cache.mjs +143 -0
  787. package/esm/http/uploads/image-variant-cache.mjs.map +1 -0
  788. package/esm/http/uploads/image-variant-types.d.mts +1 -1
  789. package/esm/http/uploads/image-variant-types.d.mts.map +1 -1
  790. package/esm/http/uploads/image-variants-config-error.d.mts +1 -1
  791. package/esm/http/uploads/image-variants-config-error.d.mts.map +1 -1
  792. package/esm/http/uploads/image-variants-config-error.mjs +1 -1
  793. package/esm/http/uploads/image-variants-config-error.mjs.map +1 -1
  794. package/esm/http/uploads/index.d.mts +3 -1
  795. package/esm/http/uploads/index.mjs +3 -1
  796. package/esm/http/uploads/is-path-inside.mjs +1 -1
  797. package/esm/http/uploads/is-path-inside.mjs.map +1 -1
  798. package/esm/http/uploads/load-variant-source.mjs +1 -1
  799. package/esm/http/uploads/load-variant-source.mjs.map +1 -1
  800. package/esm/http/uploads/local-disk-root.mjs +24 -0
  801. package/esm/http/uploads/local-disk-root.mjs.map +1 -0
  802. package/esm/http/uploads/matches-if-none-match.mjs +1 -1
  803. package/esm/http/uploads/matches-if-none-match.mjs.map +1 -1
  804. package/esm/http/uploads/parse-uploaded-file-query.mjs +1 -1
  805. package/esm/http/uploads/parse-uploaded-file-query.mjs.map +1 -1
  806. package/esm/http/uploads/purge-image-variants.d.mts +32 -0
  807. package/esm/http/uploads/purge-image-variants.d.mts.map +1 -0
  808. package/esm/http/uploads/purge-image-variants.mjs +46 -0
  809. package/esm/http/uploads/purge-image-variants.mjs.map +1 -0
  810. package/esm/http/uploads/read-file-head.mjs +1 -1
  811. package/esm/http/uploads/read-file-head.mjs.map +1 -1
  812. package/esm/http/uploads/resolve-image-variant.d.mts +73 -0
  813. package/esm/http/uploads/resolve-image-variant.d.mts.map +1 -0
  814. package/esm/http/uploads/resolve-image-variant.mjs +107 -0
  815. package/esm/http/uploads/resolve-image-variant.mjs.map +1 -0
  816. package/esm/http/uploads/resolve-image-variants-config.mjs +1 -1
  817. package/esm/http/uploads/resolve-image-variants-config.mjs.map +1 -1
  818. package/esm/http/uploads/resolve-inline-image-content-type.mjs +1 -1
  819. package/esm/http/uploads/resolve-inline-image-content-type.mjs.map +1 -1
  820. package/esm/http/uploads/resolve-original-content-type.mjs +1 -1
  821. package/esm/http/uploads/resolve-original-content-type.mjs.map +1 -1
  822. package/esm/http/uploads/resolve-upload-path.mjs +3 -2
  823. package/esm/http/uploads/resolve-upload-path.mjs.map +1 -1
  824. package/esm/http/uploads/resolve-variant-candidate.mjs +1 -1
  825. package/esm/http/uploads/resolve-variant-candidate.mjs.map +1 -1
  826. package/esm/http/uploads/single-flight.mjs +1 -1
  827. package/esm/http/uploads/single-flight.mjs.map +1 -1
  828. package/esm/http/uploads/uploaded-file.controller.d.mts +24 -6
  829. package/esm/http/uploads/uploaded-file.controller.d.mts.map +1 -1
  830. package/esm/http/uploads/uploaded-file.controller.mjs +63 -91
  831. package/esm/http/uploads/uploaded-file.controller.mjs.map +1 -1
  832. package/esm/http/uploads/variant-cache-key.mjs +30 -5
  833. package/esm/http/uploads/variant-cache-key.mjs.map +1 -1
  834. package/esm/http/uploads/variant-generations.mjs +1 -1
  835. package/esm/http/uploads/variant-generations.mjs.map +1 -1
  836. package/esm/http/uploads-config.d.mts +1 -1
  837. package/esm/http/uploads-config.d.mts.map +1 -1
  838. package/esm/http/uploads-config.mjs +1 -1
  839. package/esm/http/uploads-config.mjs.map +1 -1
  840. package/esm/http/uploads-types.d.mts +1 -1
  841. package/esm/http/uploads-types.d.mts.map +1 -1
  842. package/esm/http/xmlable.d.mts +1 -1
  843. package/esm/http/xmlable.d.mts.map +1 -1
  844. package/esm/image/image.d.mts +1 -1
  845. package/esm/image/image.d.mts.map +1 -1
  846. package/esm/image/image.mjs +1 -1
  847. package/esm/image/image.mjs.map +1 -1
  848. package/esm/index.d.mts +15 -9
  849. package/esm/index.mjs +11 -7
  850. package/esm/loader/app-module-importer.d.mts +1 -1
  851. package/esm/loader/app-module-importer.d.mts.map +1 -1
  852. package/esm/loader/app-module-importer.mjs +1 -1
  853. package/esm/loader/app-module-importer.mjs.map +1 -1
  854. package/esm/localization/parse-locale-dictionary.d.mts +7 -2
  855. package/esm/localization/parse-locale-dictionary.d.mts.map +1 -1
  856. package/esm/localization/parse-locale-dictionary.mjs +6 -2
  857. package/esm/localization/parse-locale-dictionary.mjs.map +1 -1
  858. package/esm/localization/register-locale-dictionary.d.mts +1 -1
  859. package/esm/localization/register-locale-dictionary.d.mts.map +1 -1
  860. package/esm/localization/register-locale-dictionary.mjs +1 -1
  861. package/esm/localization/register-locale-dictionary.mjs.map +1 -1
  862. package/esm/logger/fatal-visibility.d.mts +1 -1
  863. package/esm/logger/fatal-visibility.d.mts.map +1 -1
  864. package/esm/logger/fatal-visibility.mjs +1 -1
  865. package/esm/logger/fatal-visibility.mjs.map +1 -1
  866. package/esm/logger/logger.d.mts +1 -1
  867. package/esm/logger/logger.d.mts.map +1 -1
  868. package/esm/logger/logger.mjs +1 -1
  869. package/esm/logger/logger.mjs.map +1 -1
  870. package/esm/logger/types.d.mts +1 -1
  871. package/esm/logger/types.d.mts.map +1 -1
  872. package/esm/mail/config.d.mts +1 -1
  873. package/esm/mail/config.d.mts.map +1 -1
  874. package/esm/mail/config.mjs +1 -1
  875. package/esm/mail/config.mjs.map +1 -1
  876. package/esm/mail/events.d.mts +1 -1
  877. package/esm/mail/events.d.mts.map +1 -1
  878. package/esm/mail/events.mjs +1 -1
  879. package/esm/mail/events.mjs.map +1 -1
  880. package/esm/mail/mail.d.mts +1 -1
  881. package/esm/mail/mail.d.mts.map +1 -1
  882. package/esm/mail/mail.mjs +1 -1
  883. package/esm/mail/mail.mjs.map +1 -1
  884. package/esm/mail/mailer-pool.d.mts +1 -1
  885. package/esm/mail/mailer-pool.d.mts.map +1 -1
  886. package/esm/mail/mailer-pool.mjs +1 -1
  887. package/esm/mail/mailer-pool.mjs.map +1 -1
  888. package/esm/mail/react-mail.d.mts +1 -1
  889. package/esm/mail/react-mail.d.mts.map +1 -1
  890. package/esm/mail/react-mail.mjs +1 -1
  891. package/esm/mail/react-mail.mjs.map +1 -1
  892. package/esm/mail/send-mail.d.mts +1 -1
  893. package/esm/mail/send-mail.d.mts.map +1 -1
  894. package/esm/mail/send-mail.mjs +7 -7
  895. package/esm/mail/send-mail.mjs.map +1 -1
  896. package/esm/mail/test-mailbox.d.mts +1 -1
  897. package/esm/mail/test-mailbox.d.mts.map +1 -1
  898. package/esm/mail/test-mailbox.mjs +1 -1
  899. package/esm/mail/test-mailbox.mjs.map +1 -1
  900. package/esm/mail/types.d.mts +1 -1
  901. package/esm/mail/types.d.mts.map +1 -1
  902. package/esm/mail/types.mjs +1 -1
  903. package/esm/mail/types.mjs.map +1 -1
  904. package/esm/manifest/manifest-manager.mjs +1 -1
  905. package/esm/manifest/manifest-manager.mjs.map +1 -1
  906. package/esm/openapi/build-openapi-document.d.mts +1 -1
  907. package/esm/openapi/build-openapi-document.d.mts.map +1 -1
  908. package/esm/openapi/build-openapi-document.mjs +1 -1
  909. package/esm/openapi/build-openapi-document.mjs.map +1 -1
  910. package/esm/openapi/cast-schema.mjs +1 -1
  911. package/esm/openapi/cast-schema.mjs.map +1 -1
  912. package/esm/openapi/collect-openapi-document.mjs +1 -1
  913. package/esm/openapi/collect-openapi-document.mjs.map +1 -1
  914. package/esm/openapi/development-openapi-provider.d.mts +1 -1
  915. package/esm/openapi/development-openapi-provider.d.mts.map +1 -1
  916. package/esm/openapi/development-openapi-provider.mjs +1 -1
  917. package/esm/openapi/development-openapi-provider.mjs.map +1 -1
  918. package/esm/openapi/error-responses.mjs +1 -1
  919. package/esm/openapi/error-responses.mjs.map +1 -1
  920. package/esm/openapi/openapi-child-output.mjs +1 -1
  921. package/esm/openapi/openapi-child-output.mjs.map +1 -1
  922. package/esm/openapi/openapi-protocol.mjs +1 -1
  923. package/esm/openapi/openapi-protocol.mjs.map +1 -1
  924. package/esm/openapi/paths.mjs +1 -1
  925. package/esm/openapi/paths.mjs.map +1 -1
  926. package/esm/openapi/postman/build-request-body.mjs +1 -1
  927. package/esm/openapi/postman/build-request-body.mjs.map +1 -1
  928. package/esm/openapi/postman/build-request-url.mjs +1 -1
  929. package/esm/openapi/postman/build-request-url.mjs.map +1 -1
  930. package/esm/openapi/postman/build-saved-responses.mjs +1 -1
  931. package/esm/openapi/postman/build-saved-responses.mjs.map +1 -1
  932. package/esm/openapi/postman/example-from-schema.d.mts +1 -1
  933. package/esm/openapi/postman/example-from-schema.d.mts.map +1 -1
  934. package/esm/openapi/postman/example-from-schema.mjs +1 -1
  935. package/esm/openapi/postman/example-from-schema.mjs.map +1 -1
  936. package/esm/openapi/postman/http-status-text.mjs +1 -1
  937. package/esm/openapi/postman/http-status-text.mjs.map +1 -1
  938. package/esm/openapi/postman/openapi-to-postman-collection.d.mts +1 -1
  939. package/esm/openapi/postman/openapi-to-postman-collection.d.mts.map +1 -1
  940. package/esm/openapi/postman/openapi-to-postman-collection.mjs +1 -1
  941. package/esm/openapi/postman/openapi-to-postman-collection.mjs.map +1 -1
  942. package/esm/openapi/postman/postman-types.d.mts +1 -1
  943. package/esm/openapi/postman/postman-types.d.mts.map +1 -1
  944. package/esm/openapi/postman/resolve-operation-auth.mjs +1 -1
  945. package/esm/openapi/postman/resolve-operation-auth.mjs.map +1 -1
  946. package/esm/openapi/postman/schema-refs.d.mts +1 -1
  947. package/esm/openapi/postman/schema-refs.d.mts.map +1 -1
  948. package/esm/openapi/postman/schema-refs.mjs +1 -1
  949. package/esm/openapi/postman/schema-refs.mjs.map +1 -1
  950. package/esm/openapi/postman/uuid-v5.mjs +1 -1
  951. package/esm/openapi/postman/uuid-v5.mjs.map +1 -1
  952. package/esm/openapi/request-schemas.mjs +1 -1
  953. package/esm/openapi/request-schemas.mjs.map +1 -1
  954. package/esm/openapi/response-schemas.mjs +5 -2
  955. package/esm/openapi/response-schemas.mjs.map +1 -1
  956. package/esm/openapi/schema-registry.mjs +7 -1
  957. package/esm/openapi/schema-registry.mjs.map +1 -1
  958. package/esm/openapi/security.mjs +1 -1
  959. package/esm/openapi/security.mjs.map +1 -1
  960. package/esm/openapi/types.d.mts +1 -1
  961. package/esm/openapi/types.d.mts.map +1 -1
  962. package/esm/production/assert-dist-ready-to-start.mjs +1 -1
  963. package/esm/production/assert-dist-ready-to-start.mjs.map +1 -1
  964. package/esm/production/assert-generated-imports.mjs +1 -1
  965. package/esm/production/assert-generated-imports.mjs.map +1 -1
  966. package/esm/production/build-app-production.mjs +1 -1
  967. package/esm/production/build-app-production.mjs.map +1 -1
  968. package/esm/production/build-contributions.mjs +1 -1
  969. package/esm/production/build-contributions.mjs.map +1 -1
  970. package/esm/production/bundle-framework-dependencies.mjs +1 -1
  971. package/esm/production/bundle-framework-dependencies.mjs.map +1 -1
  972. package/esm/production/dist-build-manifest.mjs +1 -1
  973. package/esm/production/dist-build-manifest.mjs.map +1 -1
  974. package/esm/production/esbuild-plugins.mjs +1 -1
  975. package/esm/production/esbuild-plugins.mjs.map +1 -1
  976. package/esm/production/esbuild-preflight.mjs +1 -1
  977. package/esm/production/esbuild-preflight.mjs.map +1 -1
  978. package/esm/production/production-builder.mjs +1 -1
  979. package/esm/production/production-builder.mjs.map +1 -1
  980. package/esm/production/production-supervisor.mjs +1 -1
  981. package/esm/production/production-supervisor.mjs.map +1 -1
  982. package/esm/production/promote-dist.mjs +1 -1
  983. package/esm/production/promote-dist.mjs.map +1 -1
  984. package/esm/production/registration-child-runner.mjs +1 -1
  985. package/esm/production/registration-child-runner.mjs.map +1 -1
  986. package/esm/production/resolve-build-config.d.mts +1 -1
  987. package/esm/production/resolve-build-config.d.mts.map +1 -1
  988. package/esm/production/resolve-build-config.mjs +1 -1
  989. package/esm/production/resolve-build-config.mjs.map +1 -1
  990. package/esm/production/route-registration-child.mjs +1 -1
  991. package/esm/production/route-registration-child.mjs.map +1 -1
  992. package/esm/production/route-registration-snapshot.mjs +1 -1
  993. package/esm/production/route-registration-snapshot.mjs.map +1 -1
  994. package/esm/production/tsconfig-path-aliases.mjs +1 -1
  995. package/esm/production/tsconfig-path-aliases.mjs.map +1 -1
  996. package/esm/react/index.d.mts +1 -1
  997. package/esm/react/index.d.mts.map +1 -1
  998. package/esm/react/index.mjs +1 -1
  999. package/esm/react/index.mjs.map +1 -1
  1000. package/esm/repositories/adapters/cascade/cascade-adapter.d.mts +1 -1
  1001. package/esm/repositories/adapters/cascade/cascade-adapter.d.mts.map +1 -1
  1002. package/esm/repositories/adapters/cascade/cascade-adapter.mjs +1 -1
  1003. package/esm/repositories/adapters/cascade/cascade-adapter.mjs.map +1 -1
  1004. package/esm/repositories/adapters/cascade/cascade-query-builder.d.mts +1 -1
  1005. package/esm/repositories/adapters/cascade/cascade-query-builder.d.mts.map +1 -1
  1006. package/esm/repositories/adapters/cascade/cascade-query-builder.mjs +1 -1
  1007. package/esm/repositories/adapters/cascade/cascade-query-builder.mjs.map +1 -1
  1008. package/esm/repositories/adapters/cascade/filter-applicator.mjs +1 -1
  1009. package/esm/repositories/adapters/cascade/filter-applicator.mjs.map +1 -1
  1010. package/esm/repositories/contracts/query-builder.contract.d.mts +1 -1
  1011. package/esm/repositories/contracts/query-builder.contract.d.mts.map +1 -1
  1012. package/esm/repositories/contracts/repository-adapter.contract.d.mts +1 -1
  1013. package/esm/repositories/contracts/repository-adapter.contract.d.mts.map +1 -1
  1014. package/esm/repositories/contracts/types.d.mts +1 -1
  1015. package/esm/repositories/contracts/types.d.mts.map +1 -1
  1016. package/esm/repositories/repository.manager.d.mts +1 -1
  1017. package/esm/repositories/repository.manager.d.mts.map +1 -1
  1018. package/esm/repositories/repository.manager.mjs +1 -1
  1019. package/esm/repositories/repository.manager.mjs.map +1 -1
  1020. package/esm/resource/define-resource.d.mts +1 -1
  1021. package/esm/resource/define-resource.d.mts.map +1 -1
  1022. package/esm/resource/define-resource.mjs +1 -1
  1023. package/esm/resource/define-resource.mjs.map +1 -1
  1024. package/esm/resource/index.d.mts +1 -0
  1025. package/esm/resource/index.mjs +1 -0
  1026. package/esm/resource/nullable-resource.d.mts +44 -0
  1027. package/esm/resource/nullable-resource.d.mts.map +1 -0
  1028. package/esm/resource/nullable-resource.mjs +38 -0
  1029. package/esm/resource/nullable-resource.mjs.map +1 -0
  1030. package/esm/resource/register-resource.d.mts +1 -1
  1031. package/esm/resource/register-resource.d.mts.map +1 -1
  1032. package/esm/resource/register-resource.mjs +1 -1
  1033. package/esm/resource/register-resource.mjs.map +1 -1
  1034. package/esm/resource/resource-field-builder.d.mts +1 -1
  1035. package/esm/resource/resource-field-builder.d.mts.map +1 -1
  1036. package/esm/resource/resource-field-builder.mjs +1 -1
  1037. package/esm/resource/resource-field-builder.mjs.map +1 -1
  1038. package/esm/resource/resource.d.mts +1 -1
  1039. package/esm/resource/resource.d.mts.map +1 -1
  1040. package/esm/resource/resource.mjs +23 -4
  1041. package/esm/resource/resource.mjs.map +1 -1
  1042. package/esm/resource/types.d.mts +11 -6
  1043. package/esm/resource/types.d.mts.map +1 -1
  1044. package/esm/restful/restful.d.mts +1 -1
  1045. package/esm/restful/restful.d.mts.map +1 -1
  1046. package/esm/restful/restful.mjs +1 -1
  1047. package/esm/restful/restful.mjs.map +1 -1
  1048. package/esm/router/build-route-rate-limit.mjs +1 -1
  1049. package/esm/router/build-route-rate-limit.mjs.map +1 -1
  1050. package/esm/router/describe-route-for-log.mjs +1 -1
  1051. package/esm/router/describe-route-for-log.mjs.map +1 -1
  1052. package/esm/router/dev-dispatch.mjs +1 -1
  1053. package/esm/router/dev-dispatch.mjs.map +1 -1
  1054. package/esm/router/log-request-lifecycle.mjs +1 -1
  1055. package/esm/router/log-request-lifecycle.mjs.map +1 -1
  1056. package/esm/router/named-api-routes-with-responses.mjs +1 -1
  1057. package/esm/router/named-api-routes-with-responses.mjs.map +1 -1
  1058. package/esm/router/normalize-request-path.d.mts +1 -1
  1059. package/esm/router/normalize-request-path.d.mts.map +1 -1
  1060. package/esm/router/normalize-request-path.mjs +1 -1
  1061. package/esm/router/normalize-request-path.mjs.map +1 -1
  1062. package/esm/router/normalize-route-path.d.mts +1 -1
  1063. package/esm/router/normalize-route-path.d.mts.map +1 -1
  1064. package/esm/router/normalize-route-path.mjs +1 -1
  1065. package/esm/router/normalize-route-path.mjs.map +1 -1
  1066. package/esm/router/positional-handler-diagnostics.d.mts +1 -1
  1067. package/esm/router/positional-handler-diagnostics.d.mts.map +1 -1
  1068. package/esm/router/positional-handler-diagnostics.mjs +1 -1
  1069. package/esm/router/positional-handler-diagnostics.mjs.map +1 -1
  1070. package/esm/router/response-schema-types.mjs +3 -1
  1071. package/esm/router/response-schema-types.mjs.map +1 -1
  1072. package/esm/router/route-builder.d.mts +1 -1
  1073. package/esm/router/route-builder.d.mts.map +1 -1
  1074. package/esm/router/route-builder.mjs +1 -1
  1075. package/esm/router/route-builder.mjs.map +1 -1
  1076. package/esm/router/route-name-method-suffix.d.mts +1 -1
  1077. package/esm/router/route-name-method-suffix.d.mts.map +1 -1
  1078. package/esm/router/route-name-method-suffix.mjs +1 -1
  1079. package/esm/router/route-name-method-suffix.mjs.map +1 -1
  1080. package/esm/router/route-registry.d.mts +1 -1
  1081. package/esm/router/route-registry.d.mts.map +1 -1
  1082. package/esm/router/route-registry.mjs +1 -1
  1083. package/esm/router/route-registry.mjs.map +1 -1
  1084. package/esm/router/router.d.mts +8 -1
  1085. package/esm/router/router.d.mts.map +1 -1
  1086. package/esm/router/router.mjs +20 -15
  1087. package/esm/router/router.mjs.map +1 -1
  1088. package/esm/router/types.d.mts +13 -1
  1089. package/esm/router/types.d.mts.map +1 -1
  1090. package/esm/socket/types.d.mts +1 -1
  1091. package/esm/socket/types.d.mts.map +1 -1
  1092. package/esm/socket/utils.d.mts +1 -1
  1093. package/esm/socket/utils.d.mts.map +1 -1
  1094. package/esm/socket/utils.mjs +1 -1
  1095. package/esm/socket/utils.mjs.map +1 -1
  1096. package/esm/storage/config.d.mts +1 -1
  1097. package/esm/storage/config.d.mts.map +1 -1
  1098. package/esm/storage/config.mjs +1 -1
  1099. package/esm/storage/config.mjs.map +1 -1
  1100. package/esm/storage/context/storage-driver-context.d.mts +1 -1
  1101. package/esm/storage/context/storage-driver-context.d.mts.map +1 -1
  1102. package/esm/storage/context/storage-driver-context.mjs +1 -1
  1103. package/esm/storage/context/storage-driver-context.mjs.map +1 -1
  1104. package/esm/storage/drivers/cloud-driver.d.mts +1 -1
  1105. package/esm/storage/drivers/cloud-driver.d.mts.map +1 -1
  1106. package/esm/storage/drivers/cloud-driver.mjs +1 -1
  1107. package/esm/storage/drivers/cloud-driver.mjs.map +1 -1
  1108. package/esm/storage/drivers/do-spaces-driver.d.mts +1 -1
  1109. package/esm/storage/drivers/do-spaces-driver.d.mts.map +1 -1
  1110. package/esm/storage/drivers/do-spaces-driver.mjs +1 -1
  1111. package/esm/storage/drivers/do-spaces-driver.mjs.map +1 -1
  1112. package/esm/storage/drivers/local-driver.d.mts +12 -1
  1113. package/esm/storage/drivers/local-driver.d.mts.map +1 -1
  1114. package/esm/storage/drivers/local-driver.mjs +33 -1
  1115. package/esm/storage/drivers/local-driver.mjs.map +1 -1
  1116. package/esm/storage/drivers/r2-driver.d.mts +1 -1
  1117. package/esm/storage/drivers/r2-driver.d.mts.map +1 -1
  1118. package/esm/storage/drivers/r2-driver.mjs +1 -1
  1119. package/esm/storage/drivers/r2-driver.mjs.map +1 -1
  1120. package/esm/storage/drivers/s3-driver.d.mts +1 -1
  1121. package/esm/storage/drivers/s3-driver.d.mts.map +1 -1
  1122. package/esm/storage/drivers/s3-driver.mjs +1 -1
  1123. package/esm/storage/drivers/s3-driver.mjs.map +1 -1
  1124. package/esm/storage/index.d.mts +1 -1
  1125. package/esm/storage/scoped-storage.d.mts +1 -1
  1126. package/esm/storage/scoped-storage.d.mts.map +1 -1
  1127. package/esm/storage/scoped-storage.mjs +1 -1
  1128. package/esm/storage/scoped-storage.mjs.map +1 -1
  1129. package/esm/storage/storage-file.d.mts +1 -1
  1130. package/esm/storage/storage-file.d.mts.map +1 -1
  1131. package/esm/storage/storage-file.mjs +1 -1
  1132. package/esm/storage/storage-file.mjs.map +1 -1
  1133. package/esm/storage/storage.d.mts +3 -3
  1134. package/esm/storage/storage.d.mts.map +1 -1
  1135. package/esm/storage/storage.mjs +1 -1
  1136. package/esm/storage/storage.mjs.map +1 -1
  1137. package/esm/storage/types.d.mts +3 -2
  1138. package/esm/storage/types.d.mts.map +1 -1
  1139. package/esm/storage/utils/classify-ip-address.d.mts +1 -1
  1140. package/esm/storage/utils/classify-ip-address.d.mts.map +1 -1
  1141. package/esm/storage/utils/classify-ip-address.mjs +1 -1
  1142. package/esm/storage/utils/classify-ip-address.mjs.map +1 -1
  1143. package/esm/storage/utils/contain-path.d.mts +1 -1
  1144. package/esm/storage/utils/contain-path.d.mts.map +1 -1
  1145. package/esm/storage/utils/contain-path.mjs +1 -1
  1146. package/esm/storage/utils/contain-path.mjs.map +1 -1
  1147. package/esm/storage/utils/mime.d.mts +1 -1
  1148. package/esm/storage/utils/mime.d.mts.map +1 -1
  1149. package/esm/storage/utils/mime.mjs +1 -1
  1150. package/esm/storage/utils/mime.mjs.map +1 -1
  1151. package/esm/storage/utils/safe-fetch.d.mts +1 -1
  1152. package/esm/storage/utils/safe-fetch.d.mts.map +1 -1
  1153. package/esm/storage/utils/safe-fetch.mjs +1 -1
  1154. package/esm/storage/utils/safe-fetch.mjs.map +1 -1
  1155. package/esm/storage/utils/storage-capability-error.d.mts +1 -1
  1156. package/esm/storage/utils/storage-capability-error.d.mts.map +1 -1
  1157. package/esm/storage/utils/storage-capability-error.mjs +1 -1
  1158. package/esm/storage/utils/storage-capability-error.mjs.map +1 -1
  1159. package/esm/storage/utils/storage-error.d.mts +1 -1
  1160. package/esm/storage/utils/storage-error.d.mts.map +1 -1
  1161. package/esm/storage/utils/storage-error.mjs +1 -1
  1162. package/esm/storage/utils/storage-error.mjs.map +1 -1
  1163. package/esm/storage/utils/storage-not-initialized-error.d.mts +1 -1
  1164. package/esm/storage/utils/storage-not-initialized-error.d.mts.map +1 -1
  1165. package/esm/storage/utils/storage-not-initialized-error.mjs +1 -1
  1166. package/esm/storage/utils/storage-not-initialized-error.mjs.map +1 -1
  1167. package/esm/tests/start-http-development-server.d.mts +1 -1
  1168. package/esm/tests/start-http-development-server.d.mts.map +1 -1
  1169. package/esm/tests/start-http-development-server.mjs +1 -1
  1170. package/esm/tests/start-http-development-server.mjs.map +1 -1
  1171. package/esm/tests/test-connectors-selection.d.mts +1 -1
  1172. package/esm/tests/test-connectors-selection.d.mts.map +1 -1
  1173. package/esm/tests/test-connectors-selection.mjs +1 -1
  1174. package/esm/tests/test-connectors-selection.mjs.map +1 -1
  1175. package/esm/tests/test-helpers.d.mts +1 -1
  1176. package/esm/tests/test-helpers.d.mts.map +1 -1
  1177. package/esm/tests/test-helpers.mjs +1 -1
  1178. package/esm/tests/test-helpers.mjs.map +1 -1
  1179. package/esm/tests/test-lifecycle-state.mjs +1 -1
  1180. package/esm/tests/test-lifecycle-state.mjs.map +1 -1
  1181. package/esm/tests/test-server-port-channel.mjs +1 -1
  1182. package/esm/tests/test-server-port-channel.mjs.map +1 -1
  1183. package/esm/tests/test-setup-timeout.mjs +1 -1
  1184. package/esm/tests/test-setup-timeout.mjs.map +1 -1
  1185. package/esm/tests/vitest-setup.d.mts +1 -1
  1186. package/esm/tests/vitest-setup.d.mts.map +1 -1
  1187. package/esm/tests/vitest-setup.mjs +1 -1
  1188. package/esm/tests/vitest-setup.mjs.map +1 -1
  1189. package/esm/updater/package-manager.mjs +1 -1
  1190. package/esm/updater/package-manager.mjs.map +1 -1
  1191. package/esm/updater/update-warlock-packages.mjs +1 -1
  1192. package/esm/updater/update-warlock-packages.mjs.map +1 -1
  1193. package/esm/use-cases/types.d.mts +1 -1
  1194. package/esm/use-cases/types.d.mts.map +1 -1
  1195. package/esm/use-cases/use-case-broadcast.d.mts +1 -1
  1196. package/esm/use-cases/use-case-broadcast.d.mts.map +1 -1
  1197. package/esm/use-cases/use-case-broadcast.mjs +1 -1
  1198. package/esm/use-cases/use-case-broadcast.mjs.map +1 -1
  1199. package/esm/use-cases/use-case-events.d.mts +1 -1
  1200. package/esm/use-cases/use-case-events.d.mts.map +1 -1
  1201. package/esm/use-cases/use-case-events.mjs +1 -1
  1202. package/esm/use-cases/use-case-events.mjs.map +1 -1
  1203. package/esm/use-cases/use-case-pipeline.d.mts +1 -1
  1204. package/esm/use-cases/use-case-pipeline.d.mts.map +1 -1
  1205. package/esm/use-cases/use-case-pipeline.mjs +1 -1
  1206. package/esm/use-cases/use-case-pipeline.mjs.map +1 -1
  1207. package/esm/use-cases/use-case.d.mts +1 -1
  1208. package/esm/use-cases/use-case.d.mts.map +1 -1
  1209. package/esm/use-cases/use-case.errors.d.mts +1 -1
  1210. package/esm/use-cases/use-case.errors.d.mts.map +1 -1
  1211. package/esm/use-cases/use-case.errors.mjs +1 -1
  1212. package/esm/use-cases/use-case.errors.mjs.map +1 -1
  1213. package/esm/use-cases/use-case.mjs +1 -1
  1214. package/esm/use-cases/use-case.mjs.map +1 -1
  1215. package/esm/use-cases/use-cases-registry.d.mts +1 -1
  1216. package/esm/use-cases/use-cases-registry.d.mts.map +1 -1
  1217. package/esm/use-cases/use-cases-registry.mjs +1 -1
  1218. package/esm/use-cases/use-cases-registry.mjs.map +1 -1
  1219. package/esm/utils/app-log.d.mts +6 -6
  1220. package/esm/utils/app-log.d.mts.map +1 -1
  1221. package/esm/utils/app-log.mjs +1 -1
  1222. package/esm/utils/app-log.mjs.map +1 -1
  1223. package/esm/utils/database-log.d.mts +1 -1
  1224. package/esm/utils/database-log.d.mts.map +1 -1
  1225. package/esm/utils/database-log.mjs +1 -1
  1226. package/esm/utils/database-log.mjs.map +1 -1
  1227. package/esm/utils/detect-environment-overrides.mjs +1 -1
  1228. package/esm/utils/detect-environment-overrides.mjs.map +1 -1
  1229. package/esm/utils/environment.d.mts +1 -1
  1230. package/esm/utils/environment.d.mts.map +1 -1
  1231. package/esm/utils/environment.mjs +1 -1
  1232. package/esm/utils/environment.mjs.map +1 -1
  1233. package/esm/utils/framework-vesion.mjs +1 -1
  1234. package/esm/utils/framework-vesion.mjs.map +1 -1
  1235. package/esm/utils/get-localized.d.mts +1 -1
  1236. package/esm/utils/get-localized.d.mts.map +1 -1
  1237. package/esm/utils/get-localized.mjs +1 -1
  1238. package/esm/utils/get-localized.mjs.map +1 -1
  1239. package/esm/utils/is-test-file.mjs +1 -1
  1240. package/esm/utils/is-test-file.mjs.map +1 -1
  1241. package/esm/utils/load-environment.mjs +1 -1
  1242. package/esm/utils/load-environment.mjs.map +1 -1
  1243. package/esm/utils/normalized-path.d.mts +1 -1
  1244. package/esm/utils/normalized-path.d.mts.map +1 -1
  1245. package/esm/utils/normalized-path.mjs +1 -1
  1246. package/esm/utils/normalized-path.mjs.map +1 -1
  1247. package/esm/utils/npm-registry.d.mts +1 -1
  1248. package/esm/utils/npm-registry.d.mts.map +1 -1
  1249. package/esm/utils/npm-registry.mjs +1 -1
  1250. package/esm/utils/npm-registry.mjs.map +1 -1
  1251. package/esm/utils/paths.d.mts +1 -1
  1252. package/esm/utils/paths.d.mts.map +1 -1
  1253. package/esm/utils/paths.mjs +1 -1
  1254. package/esm/utils/paths.mjs.map +1 -1
  1255. package/esm/utils/promise-all-object.d.mts +1 -1
  1256. package/esm/utils/promise-all-object.d.mts.map +1 -1
  1257. package/esm/utils/promise-all-object.mjs +1 -1
  1258. package/esm/utils/promise-all-object.mjs.map +1 -1
  1259. package/esm/utils/queue.d.mts +1 -1
  1260. package/esm/utils/queue.d.mts.map +1 -1
  1261. package/esm/utils/queue.mjs +1 -1
  1262. package/esm/utils/queue.mjs.map +1 -1
  1263. package/esm/utils/recorded-environment-overrides.mjs +1 -1
  1264. package/esm/utils/recorded-environment-overrides.mjs.map +1 -1
  1265. package/esm/utils/report-environment-overrides.mjs +1 -1
  1266. package/esm/utils/report-environment-overrides.mjs.map +1 -1
  1267. package/esm/utils/sleep.d.mts +1 -1
  1268. package/esm/utils/sleep.d.mts.map +1 -1
  1269. package/esm/utils/sleep.mjs +1 -1
  1270. package/esm/utils/sleep.mjs.map +1 -1
  1271. package/esm/utils/sluggable.d.mts +1 -1
  1272. package/esm/utils/sluggable.d.mts.map +1 -1
  1273. package/esm/utils/sluggable.mjs +1 -1
  1274. package/esm/utils/sluggable.mjs.map +1 -1
  1275. package/esm/utils/to-json.d.mts +1 -1
  1276. package/esm/utils/to-json.d.mts.map +1 -1
  1277. package/esm/utils/to-json.mjs +1 -1
  1278. package/esm/utils/to-json.mjs.map +1 -1
  1279. package/esm/utils/types.d.mts +1 -1
  1280. package/esm/utils/types.d.mts.map +1 -1
  1281. package/esm/utils/urls.d.mts +1 -1
  1282. package/esm/utils/urls.d.mts.map +1 -1
  1283. package/esm/utils/urls.mjs +1 -1
  1284. package/esm/utils/urls.mjs.map +1 -1
  1285. package/esm/utils/version-compare.d.mts +1 -1
  1286. package/esm/utils/version-compare.d.mts.map +1 -1
  1287. package/esm/utils/version-compare.mjs +1 -1
  1288. package/esm/utils/version-compare.mjs.map +1 -1
  1289. package/esm/validation/database/exists-except-current-id.d.mts +1 -1
  1290. package/esm/validation/database/exists-except-current-id.d.mts.map +1 -1
  1291. package/esm/validation/database/exists-except-current-id.mjs +1 -1
  1292. package/esm/validation/database/exists-except-current-id.mjs.map +1 -1
  1293. package/esm/validation/database/exists-except-current-user.d.mts +1 -1
  1294. package/esm/validation/database/exists-except-current-user.d.mts.map +1 -1
  1295. package/esm/validation/database/exists-except-current-user.mjs +1 -1
  1296. package/esm/validation/database/exists-except-current-user.mjs.map +1 -1
  1297. package/esm/validation/database/types.d.mts +1 -1
  1298. package/esm/validation/database/types.d.mts.map +1 -1
  1299. package/esm/validation/database/unique-except-current-id.d.mts +1 -1
  1300. package/esm/validation/database/unique-except-current-id.d.mts.map +1 -1
  1301. package/esm/validation/database/unique-except-current-id.mjs +1 -1
  1302. package/esm/validation/database/unique-except-current-id.mjs.map +1 -1
  1303. package/esm/validation/database/unique-except-current-user.d.mts +1 -1
  1304. package/esm/validation/database/unique-except-current-user.d.mts.map +1 -1
  1305. package/esm/validation/database/unique-except-current-user.mjs +1 -1
  1306. package/esm/validation/database/unique-except-current-user.mjs.map +1 -1
  1307. package/esm/validation/file/file.d.mts +1 -1
  1308. package/esm/validation/file/file.d.mts.map +1 -1
  1309. package/esm/validation/file/file.mjs +1 -1
  1310. package/esm/validation/file/file.mjs.map +1 -1
  1311. package/esm/validation/init.mjs +1 -1
  1312. package/esm/validation/init.mjs.map +1 -1
  1313. package/esm/validation/plugins/database-plugin.mjs +1 -1
  1314. package/esm/validation/plugins/database-plugin.mjs.map +1 -1
  1315. package/esm/validation/plugins/file-plugin.mjs +1 -1
  1316. package/esm/validation/plugins/file-plugin.mjs.map +1 -1
  1317. package/esm/validation/plugins/localized-plugin.mjs +1 -1
  1318. package/esm/validation/plugins/localized-plugin.mjs.map +1 -1
  1319. package/esm/validation/types.d.mts +1 -1
  1320. package/esm/validation/types.d.mts.map +1 -1
  1321. package/esm/validation/validateAll.mjs +1 -1
  1322. package/esm/validation/validateAll.mjs.map +1 -1
  1323. package/esm/validation/validators/file-validator.d.mts +44 -41
  1324. package/esm/validation/validators/file-validator.d.mts.map +1 -1
  1325. package/esm/validation/validators/file-validator.mjs +4 -1
  1326. package/esm/validation/validators/file-validator.mjs.map +1 -1
  1327. package/esm/vite/lower-stage3-decorators.d.mts +1 -1
  1328. package/esm/vite/lower-stage3-decorators.d.mts.map +1 -1
  1329. package/esm/vite/lower-stage3-decorators.mjs +1 -1
  1330. package/esm/vite/lower-stage3-decorators.mjs.map +1 -1
  1331. package/esm/warlock-config/bundle-config.mjs +148 -0
  1332. package/esm/warlock-config/bundle-config.mjs.map +1 -0
  1333. package/esm/warlock-config/default-configurations.mjs +1 -1
  1334. package/esm/warlock-config/default-configurations.mjs.map +1 -1
  1335. package/esm/warlock-config/define-config.d.mts +1 -1
  1336. package/esm/warlock-config/define-config.d.mts.map +1 -1
  1337. package/esm/warlock-config/define-config.mjs +1 -1
  1338. package/esm/warlock-config/define-config.mjs.map +1 -1
  1339. package/esm/warlock-config/index.d.mts +1 -1
  1340. package/esm/warlock-config/index.mjs +1 -1
  1341. package/esm/warlock-config/normalize-build-config.mjs +1 -1
  1342. package/esm/warlock-config/normalize-build-config.mjs.map +1 -1
  1343. package/esm/warlock-config/types.d.mts +1 -1
  1344. package/esm/warlock-config/types.d.mts.map +1 -1
  1345. package/esm/warlock-config/warlock-config.manager.d.mts +32 -7
  1346. package/esm/warlock-config/warlock-config.manager.d.mts.map +1 -1
  1347. package/esm/warlock-config/warlock-config.manager.mjs +94 -18
  1348. package/esm/warlock-config/warlock-config.manager.mjs.map +1 -1
  1349. package/esm/warlock-config/warn-deprecated-config.mjs +1 -1
  1350. package/esm/warlock-config/warn-deprecated-config.mjs.map +1 -1
  1351. package/llms-full.txt +306 -249
  1352. package/llms.txt +42 -42
  1353. package/package.json +20 -13
  1354. package/skills/README.md +39 -39
  1355. package/skills/add-connector/SKILL.md +4 -4
  1356. package/skills/benchmark-code/SKILL.md +3 -3
  1357. package/skills/build-restful/SKILL.md +5 -5
  1358. package/skills/build-url/SKILL.md +7 -7
  1359. package/skills/configure-app/SKILL.md +30 -8
  1360. package/skills/create-controller/SKILL.md +12 -8
  1361. package/skills/create-module/SKILL.md +9 -9
  1362. package/skills/define-resource/SKILL.md +4 -4
  1363. package/skills/encrypt-data/SKILL.md +7 -7
  1364. package/skills/generate-openapi/SKILL.md +5 -5
  1365. package/skills/hash-password/SKILL.md +8 -8
  1366. package/skills/health-checks/SKILL.md +8 -6
  1367. package/skills/lower-stage3-decorators/SKILL.md +4 -4
  1368. package/skills/process-image/SKILL.md +5 -5
  1369. package/skills/register-route/SKILL.md +16 -6
  1370. package/skills/request-memo/SKILL.md +4 -4
  1371. package/skills/request-tracing/SKILL.md +6 -6
  1372. package/skills/resolve-path/SKILL.md +6 -6
  1373. package/skills/retry-operation/SKILL.md +4 -4
  1374. package/skills/run-app/SKILL.md +20 -13
  1375. package/skills/send-mail/SKILL.md +3 -3
  1376. package/skills/send-response/SKILL.md +16 -8
  1377. package/skills/store-file/SKILL.md +9 -5
  1378. package/skills/test-http/SKILL.md +5 -5
  1379. package/skills/test-service/SKILL.md +5 -5
  1380. package/skills/update-packages/SKILL.md +6 -6
  1381. package/skills/upload-file/SKILL.md +7 -7
  1382. package/skills/use-app-context/SKILL.md +7 -7
  1383. package/skills/use-localization/SKILL.md +6 -6
  1384. package/skills/use-middleware/SKILL.md +8 -8
  1385. package/skills/use-model-transformers/SKILL.md +6 -6
  1386. package/skills/use-repository/SKILL.md +7 -7
  1387. package/skills/use-request-locals/SKILL.md +4 -4
  1388. package/skills/validate-input/SKILL.md +7 -7
  1389. package/skills/warlock-conventions/SKILL.md +6 -6
  1390. package/skills/warlock-doctor/SKILL.md +5 -5
  1391. package/skills/warlock-routes/SKILL.md +6 -6
  1392. package/skills/wire-socket/SKILL.md +4 -4
  1393. package/skills/write-cli-command/SKILL.md +6 -6
  1394. package/skills/write-middleware/SKILL.md +8 -8
  1395. package/skills/write-seeder/SKILL.md +5 -5
  1396. package/skills/write-use-case/SKILL.md +3 -3
@@ -1,6 +1,6 @@
1
1
  import { URL, fileURLToPath, pathToFileURL } from "node:url";
2
2
 
3
- //#region ../core/src/dev-server/loader/own-resolver.ts
3
+ //#region ../../packages/core/src/dev-server/loader/own-resolver.ts
4
4
  /**
5
5
  * Extension/`index` probing for one candidate base path, mirroring tsx's
6
6
  * TypeScript-aware order:
@@ -1 +1 @@
1
- {"version":3,"file":"own-resolver.mjs","names":[],"sources":["../../../../../../../../core/src/dev-server/loader/own-resolver.ts"],"sourcesContent":["import { fileURLToPath, pathToFileURL, URL } from \"node:url\";\n\n/**\n * The framework's own ESM `resolve()` core — the Phase B replacement for\n * delegating resolution to tsx.\n *\n * Scope by design: it owns exactly what Node's default resolver cannot do\n * (TypeScript extension/`index` probing and tsconfig `paths` aliases). For\n * anything else — bare npm packages, `node:` builtins, `file:`/`data:`\n * specifiers — it returns `null`, meaning \"not mine, fall through to the\n * next resolver\" (Node default, which already honours `node_modules` and\n * package `exports`). That keeps the risky surface minimal: we only have\n * to reproduce tsx's TS-path behaviour, not re-implement npm resolution.\n *\n * Pure and dependency-injected (`pathsMatcher`, `fileExists`) so the whole\n * thing is unit-testable and verifiable against the captured tsx-4.21\n * golden fixture without booting.\n */\n\nexport type PathsMatcher = (specifier: string) => string[];\nexport type FileExists = (absolutePath: string) => boolean;\n\n/**\n * Extension/`index` probing for one candidate base path, mirroring tsx's\n * TypeScript-aware order:\n *\n * 1. exact (if it already has a real extension that exists)\n * 2. `.js`/`.jsx`/`.mjs`/`.cjs` specifier → the TS source it compiles from\n * (`.ts`/`.tsx`) — the standard \"import the .js, ship the .ts\" ESM style\n * 3. append `.ts`, `.tsx`, `.js`, `.jsx`, `.json`\n * 4. directory index: `<dir>/index.{ts,tsx,js,jsx}`\n *\n * Returns the resolved absolute path, or `null` if nothing exists.\n */\nexport function probeFile(basePath: string, fileExists: FileExists): string | null {\n // 2. `.js` → `.ts`/`.tsx` rewrite (checked before the literal .js so a\n // co-located source wins, matching tsx).\n const jsRewrite = basePath.match(/\\.(js|jsx|mjs|cjs)$/);\n if (jsRewrite) {\n const stem = basePath.slice(0, -jsRewrite[0].length);\n for (const ext of [\".ts\", \".tsx\"]) {\n if (fileExists(stem + ext)) return stem + ext;\n }\n }\n\n // 1. exact (real extension already present and on disk)\n if (/\\.[a-z]+$/i.test(basePath) && fileExists(basePath)) {\n return basePath;\n }\n\n // 3. append source/asset extensions\n for (const ext of [\".ts\", \".tsx\", \".js\", \".jsx\", \".json\"]) {\n if (fileExists(basePath + ext)) return basePath + ext;\n }\n\n // 4. directory index\n for (const ext of [\".ts\", \".tsx\", \".js\", \".jsx\"]) {\n const candidate = `${basePath}/index${ext}`;\n if (fileExists(candidate)) return candidate;\n }\n\n return null;\n}\n\nfunction isRelative(specifier: string): boolean {\n return specifier.startsWith(\"./\") || specifier.startsWith(\"../\");\n}\n\n/**\n * Resolve `specifier` to a `file://` URL we own, or `null` to fall through\n * to the next resolver.\n *\n * @param specifier - The import specifier.\n * @param parentURL - Importing module's URL (already `?v=N`-stripped).\n * @param pathsMatcher - `get-tsconfig` paths matcher (alias → candidates).\n * @param fileExists - Existence probe (injected for testing).\n */\nexport function ownResolve(\n specifier: string,\n parentURL: string | undefined,\n pathsMatcher: PathsMatcher | null,\n fileExists: FileExists,\n): string | null {\n // Not ours: builtins and already-formed URLs (config-loader imports by\n // file: URL). Node default handles these.\n if (\n specifier.startsWith(\"node:\") ||\n specifier.startsWith(\"file:\") ||\n specifier.startsWith(\"data:\")\n ) {\n return null;\n }\n\n // Relative / absolute path imports → probe against the parent's dir.\n if (isRelative(specifier) || specifier.startsWith(\"/\") || /^[a-zA-Z]:[\\\\/]/.test(specifier)) {\n if (!parentURL) return null;\n const base = fileURLToPath(new URL(specifier, parentURL));\n const hit = probeFile(base.replace(/\\\\/g, \"/\"), fileExists);\n return hit ? pathToFileURL(hit).href : null;\n }\n\n // Bare / aliased: try tsconfig `paths`. Each candidate is probed; the\n // first that exists on disk wins. If none do (e.g. a real npm package\n // whose name happened to match a baseUrl guess), return null so Node\n // default resolves it from node_modules with full `exports` support.\n if (pathsMatcher) {\n for (const candidate of pathsMatcher(specifier)) {\n const hit = probeFile(candidate.replace(/\\\\/g, \"/\"), fileExists);\n if (hit) return pathToFileURL(hit).href;\n }\n }\n\n return null;\n}\n"],"mappings":";;;;;;;;;;;;;;;AAkCA,SAAgB,UAAU,UAAkB,YAAuC;CAGjF,MAAM,YAAY,SAAS,MAAM,qBAAqB;CACtD,IAAI,WAAW;EACb,MAAM,OAAO,SAAS,MAAM,GAAG,CAAC,UAAU,EAAE,CAAC,MAAM;EACnD,KAAK,MAAM,OAAO,CAAC,OAAO,MAAM,GAC9B,IAAI,WAAW,OAAO,GAAG,GAAG,OAAO,OAAO;CAE9C;CAGA,IAAI,aAAa,KAAK,QAAQ,KAAK,WAAW,QAAQ,GACpD,OAAO;CAIT,KAAK,MAAM,OAAO;EAAC;EAAO;EAAQ;EAAO;EAAQ;CAAO,GACtD,IAAI,WAAW,WAAW,GAAG,GAAG,OAAO,WAAW;CAIpD,KAAK,MAAM,OAAO;EAAC;EAAO;EAAQ;EAAO;CAAM,GAAG;EAChD,MAAM,YAAY,GAAG,SAAS,QAAQ;EACtC,IAAI,WAAW,SAAS,GAAG,OAAO;CACpC;CAEA,OAAO;AACT;AAEA,SAAS,WAAW,WAA4B;CAC9C,OAAO,UAAU,WAAW,IAAI,KAAK,UAAU,WAAW,KAAK;AACjE;;;;;;;;;;AAWA,SAAgB,WACd,WACA,WACA,cACA,YACe;CAGf,IACE,UAAU,WAAW,OAAO,KAC5B,UAAU,WAAW,OAAO,KAC5B,UAAU,WAAW,OAAO,GAE5B,OAAO;CAIT,IAAI,WAAW,SAAS,KAAK,UAAU,WAAW,GAAG,KAAK,kBAAkB,KAAK,SAAS,GAAG;EAC3F,IAAI,CAAC,WAAW,OAAO;EAEvB,MAAM,MAAM,UADC,cAAc,IAAI,IAAI,WAAW,SAAS,CAC9B,CAAC,CAAC,QAAQ,OAAO,GAAG,GAAG,UAAU;EAC1D,OAAO,MAAM,cAAc,GAAG,CAAC,CAAC,OAAO;CACzC;CAMA,IAAI,cACF,KAAK,MAAM,aAAa,aAAa,SAAS,GAAG;EAC/C,MAAM,MAAM,UAAU,UAAU,QAAQ,OAAO,GAAG,GAAG,UAAU;EAC/D,IAAI,KAAK,OAAO,cAAc,GAAG,CAAC,CAAC;CACrC;CAGF,OAAO;AACT"}
1
+ {"version":3,"file":"own-resolver.mjs","names":[],"sources":["../../../../../../../../../packages/core/src/dev-server/loader/own-resolver.ts"],"sourcesContent":["import { fileURLToPath, pathToFileURL, URL } from \"node:url\";\n\n/**\n * The framework's own ESM `resolve()` core — the Phase B replacement for\n * delegating resolution to tsx.\n *\n * Scope by design: it owns exactly what Node's default resolver cannot do\n * (TypeScript extension/`index` probing and tsconfig `paths` aliases). For\n * anything else — bare npm packages, `node:` builtins, `file:`/`data:`\n * specifiers — it returns `null`, meaning \"not mine, fall through to the\n * next resolver\" (Node default, which already honours `node_modules` and\n * package `exports`). That keeps the risky surface minimal: we only have\n * to reproduce tsx's TS-path behaviour, not re-implement npm resolution.\n *\n * Pure and dependency-injected (`pathsMatcher`, `fileExists`) so the whole\n * thing is unit-testable and verifiable against the captured tsx-4.21\n * golden fixture without booting.\n */\n\nexport type PathsMatcher = (specifier: string) => string[];\nexport type FileExists = (absolutePath: string) => boolean;\n\n/**\n * Extension/`index` probing for one candidate base path, mirroring tsx's\n * TypeScript-aware order:\n *\n * 1. exact (if it already has a real extension that exists)\n * 2. `.js`/`.jsx`/`.mjs`/`.cjs` specifier → the TS source it compiles from\n * (`.ts`/`.tsx`) — the standard \"import the .js, ship the .ts\" ESM style\n * 3. append `.ts`, `.tsx`, `.js`, `.jsx`, `.json`\n * 4. directory index: `<dir>/index.{ts,tsx,js,jsx}`\n *\n * Returns the resolved absolute path, or `null` if nothing exists.\n */\nexport function probeFile(basePath: string, fileExists: FileExists): string | null {\n // 2. `.js` → `.ts`/`.tsx` rewrite (checked before the literal .js so a\n // co-located source wins, matching tsx).\n const jsRewrite = basePath.match(/\\.(js|jsx|mjs|cjs)$/);\n if (jsRewrite) {\n const stem = basePath.slice(0, -jsRewrite[0].length);\n for (const ext of [\".ts\", \".tsx\"]) {\n if (fileExists(stem + ext)) return stem + ext;\n }\n }\n\n // 1. exact (real extension already present and on disk)\n if (/\\.[a-z]+$/i.test(basePath) && fileExists(basePath)) {\n return basePath;\n }\n\n // 3. append source/asset extensions\n for (const ext of [\".ts\", \".tsx\", \".js\", \".jsx\", \".json\"]) {\n if (fileExists(basePath + ext)) return basePath + ext;\n }\n\n // 4. directory index\n for (const ext of [\".ts\", \".tsx\", \".js\", \".jsx\"]) {\n const candidate = `${basePath}/index${ext}`;\n if (fileExists(candidate)) return candidate;\n }\n\n return null;\n}\n\nfunction isRelative(specifier: string): boolean {\n return specifier.startsWith(\"./\") || specifier.startsWith(\"../\");\n}\n\n/**\n * Resolve `specifier` to a `file://` URL we own, or `null` to fall through\n * to the next resolver.\n *\n * @param specifier - The import specifier.\n * @param parentURL - Importing module's URL (already `?v=N`-stripped).\n * @param pathsMatcher - `get-tsconfig` paths matcher (alias → candidates).\n * @param fileExists - Existence probe (injected for testing).\n */\nexport function ownResolve(\n specifier: string,\n parentURL: string | undefined,\n pathsMatcher: PathsMatcher | null,\n fileExists: FileExists,\n): string | null {\n // Not ours: builtins and already-formed URLs (config-loader imports by\n // file: URL). Node default handles these.\n if (\n specifier.startsWith(\"node:\") ||\n specifier.startsWith(\"file:\") ||\n specifier.startsWith(\"data:\")\n ) {\n return null;\n }\n\n // Relative / absolute path imports → probe against the parent's dir.\n if (isRelative(specifier) || specifier.startsWith(\"/\") || /^[a-zA-Z]:[\\\\/]/.test(specifier)) {\n if (!parentURL) return null;\n const base = fileURLToPath(new URL(specifier, parentURL));\n const hit = probeFile(base.replace(/\\\\/g, \"/\"), fileExists);\n return hit ? pathToFileURL(hit).href : null;\n }\n\n // Bare / aliased: try tsconfig `paths`. Each candidate is probed; the\n // first that exists on disk wins. If none do (e.g. a real npm package\n // whose name happened to match a baseUrl guess), return null so Node\n // default resolves it from node_modules with full `exports` support.\n if (pathsMatcher) {\n for (const candidate of pathsMatcher(specifier)) {\n const hit = probeFile(candidate.replace(/\\\\/g, \"/\"), fileExists);\n if (hit) return pathToFileURL(hit).href;\n }\n }\n\n return null;\n}\n"],"mappings":";;;;;;;;;;;;;;;AAkCA,SAAgB,UAAU,UAAkB,YAAuC;CAGjF,MAAM,YAAY,SAAS,MAAM,qBAAqB;CACtD,IAAI,WAAW;EACb,MAAM,OAAO,SAAS,MAAM,GAAG,CAAC,UAAU,EAAE,CAAC,MAAM;EACnD,KAAK,MAAM,OAAO,CAAC,OAAO,MAAM,GAC9B,IAAI,WAAW,OAAO,GAAG,GAAG,OAAO,OAAO;CAE9C;CAGA,IAAI,aAAa,KAAK,QAAQ,KAAK,WAAW,QAAQ,GACpD,OAAO;CAIT,KAAK,MAAM,OAAO;EAAC;EAAO;EAAQ;EAAO;EAAQ;CAAO,GACtD,IAAI,WAAW,WAAW,GAAG,GAAG,OAAO,WAAW;CAIpD,KAAK,MAAM,OAAO;EAAC;EAAO;EAAQ;EAAO;CAAM,GAAG;EAChD,MAAM,YAAY,GAAG,SAAS,QAAQ;EACtC,IAAI,WAAW,SAAS,GAAG,OAAO;CACpC;CAEA,OAAO;AACT;AAEA,SAAS,WAAW,WAA4B;CAC9C,OAAO,UAAU,WAAW,IAAI,KAAK,UAAU,WAAW,KAAK;AACjE;;;;;;;;;;AAWA,SAAgB,WACd,WACA,WACA,cACA,YACe;CAGf,IACE,UAAU,WAAW,OAAO,KAC5B,UAAU,WAAW,OAAO,KAC5B,UAAU,WAAW,OAAO,GAE5B,OAAO;CAIT,IAAI,WAAW,SAAS,KAAK,UAAU,WAAW,GAAG,KAAK,kBAAkB,KAAK,SAAS,GAAG;EAC3F,IAAI,CAAC,WAAW,OAAO;EAEvB,MAAM,MAAM,UADC,cAAc,IAAI,IAAI,WAAW,SAAS,CAC9B,CAAC,CAAC,QAAQ,OAAO,GAAG,GAAG,UAAU;EAC1D,OAAO,MAAM,cAAc,GAAG,CAAC,CAAC,OAAO;CACzC;CAMA,IAAI,cACF,KAAK,MAAM,aAAa,aAAa,SAAS,GAAG;EAC/C,MAAM,MAAM,UAAU,UAAU,QAAQ,OAAO,GAAG,GAAG,UAAU;EAC/D,IAAI,KAAK,OAAO,cAAc,GAAG,CAAC,CAAC;CACrC;CAGF,OAAO;AACT"}
@@ -5,7 +5,7 @@ import { fileURLToPath, pathToFileURL } from "node:url";
5
5
  import { build } from "esbuild";
6
6
  import { MessageChannel } from "node:worker_threads";
7
7
 
8
- //#region ../core/src/dev-server/loader/register-loader.ts
8
+ //#region ../../packages/core/src/dev-server/loader/register-loader.ts
9
9
  /**
10
10
  * Rewrite the hook bundle's remaining npm imports to absolute paths resolved
11
11
  * from **core's own** location.
@@ -1 +1 @@
1
- {"version":3,"file":"register-loader.mjs","names":[],"sources":["../../../../../../../../core/src/dev-server/loader/register-loader.ts"],"sourcesContent":["import { putFileAsync } from \"@warlock.js/fs\";\nimport { build, type Plugin } from \"esbuild\";\nimport { register } from \"node:module\";\nimport path from \"node:path\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\nimport { type MessagePort, MessageChannel } from \"node:worker_threads\";\nimport type { TranspileInit } from \"./load-hook.js\";\n\n/**\n * Rewrite the hook bundle's remaining npm imports to absolute paths resolved\n * from **core's own** location.\n *\n * The bundle is written into the consuming app's `.warlock/` directory, so a\n * bare `import \"esbuild\"` in it resolves starting from the *app*, walking up\n * the app's `node_modules`. `esbuild` and `get-tsconfig` are core's\n * dependencies, not the app's — under npm/yarn's flat hoisting they happen to\n * be reachable anyway, but under pnpm's strict layout they are not, and the\n * dev server dies with `ERR_MODULE_NOT_FOUND` for a package the app never\n * imported. That is a phantom dependency baked into generated code.\n *\n * Bundling them in instead is not an option for `esbuild`: its JS API is a\n * thin wrapper that spawns a platform-specific native binary, so inlining the\n * JavaScript would not remove the need for the package on disk. Resolving to\n * an absolute `file://` URL at generation time does — the generated file then\n * points straight at the copy core itself is using, whatever the installer's\n * layout.\n */\nexport const resolveExternalsFromCore: Plugin = {\n name: \"warlock-resolve-externals-from-core\",\n setup(build) {\n // The filter is deliberately loose — anything not starting `.` or `/` —\n // so the guards below carry the real logic.\n build.onResolve({ filter: /^[^./]/ }, (args) => {\n // The entry point comes through here too, and on Windows its absolute\n // path (\"D:\\\\…\") is not `.` or `/`. Marking it external fails the build.\n if (args.kind === \"entry-point\" || path.isAbsolute(args.path)) {\n return null;\n }\n\n if (args.path.startsWith(\"node:\")) {\n return { external: true };\n }\n\n try {\n return { path: import.meta.resolve(args.path), external: true };\n } catch {\n // Unresolvable from here — leave it bare and let Node try, which is\n // exactly the previous behaviour rather than a hard failure.\n return { external: true };\n }\n });\n },\n};\n\n/**\n * Bundle, write, and register the ESM loader hook.\n *\n * **Why bundle?**\n * `module.register()` runs the hook file in a fresh Node.js worker thread that\n * has no tsx hook of its own. The hook source is TypeScript, so we must produce\n * a plain ESM bundle before registering. esbuild inline-bundles all three hook\n * modules (`hook-thread`, `resolve-hook`, `load-hook`, `version-registry`)\n * into a single `.mjs` file written to `.warlock/`. External npm packages\n * (`esbuild`, `node:*`) are kept external — the hook thread can resolve those\n * from `node_modules` normally.\n *\n * **Why a file and not a `data:` URL?**\n * Some Node versions have issues resolving `import.meta.url` inside `data:`\n * modules. A real file under `.warlock/` is simpler and debuggable.\n *\n * **Timing**\n * Called from `FilesOrchestrator.init()` before any user `src/` module is\n * dynamically imported. `module.register()` takes effect for all subsequent\n * `import()` calls, which is exactly the window we need.\n *\n * @param transpile - Transpile-cache config to ship into the hook worker,\n * or `null` to keep the hook in tsx-passthrough mode.\n *\n * @returns The main-thread side of the MessageChannel. Callers post\n * `{ type: \"bump\", absolutePath }` messages on it to invalidate modules.\n *\n * @example\n * const port = await registerLoader(transpileInit);\n * // Later, when a file changes:\n * port.postMessage({ type: \"bump\", absolutePath: \"/abs/path/to/user.model.ts\" });\n */\nexport async function registerLoader(transpile: TranspileInit): Promise<MessagePort> {\n const { port1, port2 } = new MessageChannel();\n\n // hook-thread is a sibling module, so it shares THIS file's extension:\n // `.ts` when core runs from source (tsx), `.mjs` when published.\n const selfPath = fileURLToPath(import.meta.url);\n const hookThreadPath = path.join(path.dirname(selfPath), `hook-thread${path.extname(selfPath)}`);\n\n const bundleResult = await build({\n entryPoints: [hookThreadPath],\n bundle: true,\n format: \"esm\",\n write: false,\n platform: \"node\",\n target: \"node20\",\n // npm packages and Node built-ins stay external, but the plugin rewrites\n // each remaining npm specifier to an absolute path resolved from core's\n // own install — see `resolveExternalsFromCore` for why bare imports break\n // under pnpm's strict layout.\n packages: \"external\",\n plugins: [resolveExternalsFromCore],\n });\n\n const bundledCode = bundleResult.outputFiles[0].text;\n // Caller (filesOrchestrator.init) guarantees .warlock/ exists before this runs.\n const hookBundlePath = path.join(process.cwd(), \".warlock\", \"loader-hook.mjs\");\n await putFileAsync(hookBundlePath, bundledCode);\n\n const srcRoot = path.join(process.cwd(), \"src\");\n\n // No tsx registration: our hook owns resolution (own-resolver) and the\n // transpile of every `.ts`/`.tsx` (esbuild, in the load hook). The chain\n // is simply [our hook] → [Node default] for non-TS (npm/.js, node:).\n // In this monorepo tsx is still the *launcher* (`tsx start.ts`) so its\n // loader is present anyway, but it is never consulted for TypeScript —\n // our hook short-circuits first. A released `node bin/warlock.js` has no\n // tsx at all and relies entirely on this hook.\n\n register(pathToFileURL(hookBundlePath).href, import.meta.url, {\n data: { port: port2, srcRoot, transpile },\n transferList: [port2],\n });\n\n return port1;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BA,MAAa,2BAAmC;CAC9C,MAAM;CACN,MAAM,OAAO;EAGX,MAAM,UAAU,EAAE,QAAQ,SAAS,IAAI,SAAS;GAG9C,IAAI,KAAK,SAAS,iBAAiB,KAAK,WAAW,KAAK,IAAI,GAC1D,OAAO;GAGT,IAAI,KAAK,KAAK,WAAW,OAAO,GAC9B,OAAO,EAAE,UAAU,KAAK;GAG1B,IAAI;IACF,OAAO;KAAE,MAAM,OAAO,KAAK,QAAQ,KAAK,IAAI;KAAG,UAAU;IAAK;GAChE,QAAQ;IAGN,OAAO,EAAE,UAAU,KAAK;GAC1B;EACF,CAAC;CACH;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkCA,eAAsB,eAAe,WAAgD;CACnF,MAAM,EAAE,OAAO,UAAU,IAAI,eAAe;CAI5C,MAAM,WAAW,cAAc,OAAO,KAAK,GAAG;CAkB9C,MAAM,eAAc,MAfO,MAAM;EAC/B,aAAa,CAHQ,KAAK,KAAK,KAAK,QAAQ,QAAQ,GAAG,cAAc,KAAK,QAAQ,QAAQ,GAG/D,CAAC;EAC5B,QAAQ;EACR,QAAQ;EACR,OAAO;EACP,UAAU;EACV,QAAQ;EAKR,UAAU;EACV,SAAS,CAAC,wBAAwB;CACpC,CAAC,EAE+B,CAAC,YAAY,EAAE,CAAC;CAEhD,MAAM,iBAAiB,KAAK,KAAK,QAAQ,IAAI,GAAG,YAAY,iBAAiB;CAC7E,MAAM,aAAa,gBAAgB,WAAW;CAE9C,MAAM,UAAU,KAAK,KAAK,QAAQ,IAAI,GAAG,KAAK;CAU9C,SAAS,cAAc,cAAc,CAAC,CAAC,MAAM,OAAO,KAAK,KAAK;EAC5D,MAAM;GAAE,MAAM;GAAO;GAAS;EAAU;EACxC,cAAc,CAAC,KAAK;CACtB,CAAC;CAED,OAAO;AACT"}
1
+ {"version":3,"file":"register-loader.mjs","names":[],"sources":["../../../../../../../../../packages/core/src/dev-server/loader/register-loader.ts"],"sourcesContent":["import { putFileAsync } from \"@warlock.js/fs\";\nimport { build, type Plugin } from \"esbuild\";\nimport { register } from \"node:module\";\nimport path from \"node:path\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\nimport { type MessagePort, MessageChannel } from \"node:worker_threads\";\nimport type { TranspileInit } from \"./load-hook.js\";\n\n/**\n * Rewrite the hook bundle's remaining npm imports to absolute paths resolved\n * from **core's own** location.\n *\n * The bundle is written into the consuming app's `.warlock/` directory, so a\n * bare `import \"esbuild\"` in it resolves starting from the *app*, walking up\n * the app's `node_modules`. `esbuild` and `get-tsconfig` are core's\n * dependencies, not the app's — under npm/yarn's flat hoisting they happen to\n * be reachable anyway, but under pnpm's strict layout they are not, and the\n * dev server dies with `ERR_MODULE_NOT_FOUND` for a package the app never\n * imported. That is a phantom dependency baked into generated code.\n *\n * Bundling them in instead is not an option for `esbuild`: its JS API is a\n * thin wrapper that spawns a platform-specific native binary, so inlining the\n * JavaScript would not remove the need for the package on disk. Resolving to\n * an absolute `file://` URL at generation time does — the generated file then\n * points straight at the copy core itself is using, whatever the installer's\n * layout.\n */\nexport const resolveExternalsFromCore: Plugin = {\n name: \"warlock-resolve-externals-from-core\",\n setup(build) {\n // The filter is deliberately loose — anything not starting `.` or `/` —\n // so the guards below carry the real logic.\n build.onResolve({ filter: /^[^./]/ }, (args) => {\n // The entry point comes through here too, and on Windows its absolute\n // path (\"D:\\\\…\") is not `.` or `/`. Marking it external fails the build.\n if (args.kind === \"entry-point\" || path.isAbsolute(args.path)) {\n return null;\n }\n\n if (args.path.startsWith(\"node:\")) {\n return { external: true };\n }\n\n try {\n return { path: import.meta.resolve(args.path), external: true };\n } catch {\n // Unresolvable from here — leave it bare and let Node try, which is\n // exactly the previous behaviour rather than a hard failure.\n return { external: true };\n }\n });\n },\n};\n\n/**\n * Bundle, write, and register the ESM loader hook.\n *\n * **Why bundle?**\n * `module.register()` runs the hook file in a fresh Node.js worker thread that\n * has no tsx hook of its own. The hook source is TypeScript, so we must produce\n * a plain ESM bundle before registering. esbuild inline-bundles all three hook\n * modules (`hook-thread`, `resolve-hook`, `load-hook`, `version-registry`)\n * into a single `.mjs` file written to `.warlock/`. External npm packages\n * (`esbuild`, `node:*`) are kept external — the hook thread can resolve those\n * from `node_modules` normally.\n *\n * **Why a file and not a `data:` URL?**\n * Some Node versions have issues resolving `import.meta.url` inside `data:`\n * modules. A real file under `.warlock/` is simpler and debuggable.\n *\n * **Timing**\n * Called from `FilesOrchestrator.init()` before any user `src/` module is\n * dynamically imported. `module.register()` takes effect for all subsequent\n * `import()` calls, which is exactly the window we need.\n *\n * @param transpile - Transpile-cache config to ship into the hook worker,\n * or `null` to keep the hook in tsx-passthrough mode.\n *\n * @returns The main-thread side of the MessageChannel. Callers post\n * `{ type: \"bump\", absolutePath }` messages on it to invalidate modules.\n *\n * @example\n * const port = await registerLoader(transpileInit);\n * // Later, when a file changes:\n * port.postMessage({ type: \"bump\", absolutePath: \"/abs/path/to/user.model.ts\" });\n */\nexport async function registerLoader(transpile: TranspileInit): Promise<MessagePort> {\n const { port1, port2 } = new MessageChannel();\n\n // hook-thread is a sibling module, so it shares THIS file's extension:\n // `.ts` when core runs from source (tsx), `.mjs` when published.\n const selfPath = fileURLToPath(import.meta.url);\n const hookThreadPath = path.join(path.dirname(selfPath), `hook-thread${path.extname(selfPath)}`);\n\n const bundleResult = await build({\n entryPoints: [hookThreadPath],\n bundle: true,\n format: \"esm\",\n write: false,\n platform: \"node\",\n target: \"node20\",\n // npm packages and Node built-ins stay external, but the plugin rewrites\n // each remaining npm specifier to an absolute path resolved from core's\n // own install — see `resolveExternalsFromCore` for why bare imports break\n // under pnpm's strict layout.\n packages: \"external\",\n plugins: [resolveExternalsFromCore],\n });\n\n const bundledCode = bundleResult.outputFiles[0].text;\n // Caller (filesOrchestrator.init) guarantees .warlock/ exists before this runs.\n const hookBundlePath = path.join(process.cwd(), \".warlock\", \"loader-hook.mjs\");\n await putFileAsync(hookBundlePath, bundledCode);\n\n const srcRoot = path.join(process.cwd(), \"src\");\n\n // No tsx registration: our hook owns resolution (own-resolver) and the\n // transpile of every `.ts`/`.tsx` (esbuild, in the load hook). The chain\n // is simply [our hook] → [Node default] for non-TS (npm/.js, node:).\n // In this monorepo tsx is still the *launcher* (`tsx start.ts`) so its\n // loader is present anyway, but it is never consulted for TypeScript —\n // our hook short-circuits first. A released `node bin/warlock.js` has no\n // tsx at all and relies entirely on this hook.\n\n register(pathToFileURL(hookBundlePath).href, import.meta.url, {\n data: { port: port2, srcRoot, transpile },\n transferList: [port2],\n });\n\n return port1;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BA,MAAa,2BAAmC;CAC9C,MAAM;CACN,MAAM,OAAO;EAGX,MAAM,UAAU,EAAE,QAAQ,SAAS,IAAI,SAAS;GAG9C,IAAI,KAAK,SAAS,iBAAiB,KAAK,WAAW,KAAK,IAAI,GAC1D,OAAO;GAGT,IAAI,KAAK,KAAK,WAAW,OAAO,GAC9B,OAAO,EAAE,UAAU,KAAK;GAG1B,IAAI;IACF,OAAO;KAAE,MAAM,OAAO,KAAK,QAAQ,KAAK,IAAI;KAAG,UAAU;IAAK;GAChE,QAAQ;IAGN,OAAO,EAAE,UAAU,KAAK;GAC1B;EACF,CAAC;CACH;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkCA,eAAsB,eAAe,WAAgD;CACnF,MAAM,EAAE,OAAO,UAAU,IAAI,eAAe;CAI5C,MAAM,WAAW,cAAc,OAAO,KAAK,GAAG;CAkB9C,MAAM,eAAc,MAfO,MAAM;EAC/B,aAAa,CAHQ,KAAK,KAAK,KAAK,QAAQ,QAAQ,GAAG,cAAc,KAAK,QAAQ,QAAQ,GAG/D,CAAC;EAC5B,QAAQ;EACR,QAAQ;EACR,OAAO;EACP,UAAU;EACV,QAAQ;EAKR,UAAU;EACV,SAAS,CAAC,wBAAwB;CACpC,CAAC,EAE+B,CAAC,YAAY,EAAE,CAAC;CAEhD,MAAM,iBAAiB,KAAK,KAAK,QAAQ,IAAI,GAAG,YAAY,iBAAiB;CAC7E,MAAM,aAAa,gBAAgB,WAAW;CAE9C,MAAM,UAAU,KAAK,KAAK,QAAQ,IAAI,GAAG,KAAK;CAU9C,SAAS,cAAc,cAAc,CAAC,CAAC,MAAM,OAAO,KAAK,KAAK;EAC5D,MAAM;GAAE,MAAM;GAAO;GAAS;EAAU;EACxC,cAAc,CAAC,KAAK;CACtB,CAAC;CAED,OAAO;AACT"}
@@ -1,6 +1,6 @@
1
1
  import { appendFileSync } from "node:fs";
2
2
 
3
- //#region ../core/src/dev-server/loader/resolve-capture.ts
3
+ //#region ../../packages/core/src/dev-server/loader/resolve-capture.ts
4
4
  /**
5
5
  * Golden-fixture recorder for the Phase B resolver work.
6
6
  *
@@ -1 +1 @@
1
- {"version":3,"file":"resolve-capture.mjs","names":[],"sources":["../../../../../../../../core/src/dev-server/loader/resolve-capture.ts"],"sourcesContent":["import { appendFileSync } from \"node:fs\";\n\n/**\n * Golden-fixture recorder for the Phase B resolver work.\n *\n * When `WARLOCK_RESOLVE_CAPTURE` points at a file path, every resolution\n * the *current* (tsx-backed) hook performs is appended there as one JSON\n * object per line: `{ specifier, parentURL, url, format }`, all with the\n * `?v=N` HMR token stripped so the record is stable across runs.\n *\n * A full `yarn start` boot then yields the real import graph's resolutions\n * — tsconfig paths, workspace `@warlock.js/*`, relative/extensionless,\n * package `exports`, bare npm, `node:` builtins — as the ground truth the\n * replacement resolver must reproduce exactly.\n *\n * Disabled (the default) it is a single env-var read and an immediate\n * return: no measurable cost on the resolve hot path.\n */\n\nconst VERSION_QUERY = /\\?v=\\d+$/;\n\nlet resolvedPath: string | null | undefined;\n\nfunction targetFile(): string | null {\n if (resolvedPath !== undefined) return resolvedPath;\n resolvedPath = process.env.WARLOCK_RESOLVE_CAPTURE || null;\n return resolvedPath;\n}\n\nexport type ResolutionRecord = {\n specifier: string;\n parentURL: string | undefined;\n url: string;\n format: string | undefined;\n};\n\nexport function captureResolution(record: ResolutionRecord): void {\n const file = targetFile();\n if (!file) return;\n\n const line =\n JSON.stringify({\n specifier: record.specifier,\n parentURL: record.parentURL?.replace(VERSION_QUERY, \"\"),\n url: record.url.replace(VERSION_QUERY, \"\"),\n format: record.format,\n }) + \"\\n\";\n\n try {\n appendFileSync(file, line);\n } catch {\n // Capture is a diagnostic aid — never let it break resolution.\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAmBA,MAAM,gBAAgB;AAEtB,IAAI;AAEJ,SAAS,aAA4B;CACnC,IAAI,iBAAiB,QAAW,OAAO;CACvC,eAAe,QAAQ,IAAI,2BAA2B;CACtD,OAAO;AACT;AASA,SAAgB,kBAAkB,QAAgC;CAChE,MAAM,OAAO,WAAW;CACxB,IAAI,CAAC,MAAM;CAEX,MAAM,OACJ,KAAK,UAAU;EACb,WAAW,OAAO;EAClB,WAAW,OAAO,WAAW,QAAQ,eAAe,EAAE;EACtD,KAAK,OAAO,IAAI,QAAQ,eAAe,EAAE;EACzC,QAAQ,OAAO;CACjB,CAAC,IAAI;CAEP,IAAI;EACF,eAAe,MAAM,IAAI;CAC3B,QAAQ,CAER;AACF"}
1
+ {"version":3,"file":"resolve-capture.mjs","names":[],"sources":["../../../../../../../../../packages/core/src/dev-server/loader/resolve-capture.ts"],"sourcesContent":["import { appendFileSync } from \"node:fs\";\n\n/**\n * Golden-fixture recorder for the Phase B resolver work.\n *\n * When `WARLOCK_RESOLVE_CAPTURE` points at a file path, every resolution\n * the *current* (tsx-backed) hook performs is appended there as one JSON\n * object per line: `{ specifier, parentURL, url, format }`, all with the\n * `?v=N` HMR token stripped so the record is stable across runs.\n *\n * A full `yarn start` boot then yields the real import graph's resolutions\n * — tsconfig paths, workspace `@warlock.js/*`, relative/extensionless,\n * package `exports`, bare npm, `node:` builtins — as the ground truth the\n * replacement resolver must reproduce exactly.\n *\n * Disabled (the default) it is a single env-var read and an immediate\n * return: no measurable cost on the resolve hot path.\n */\n\nconst VERSION_QUERY = /\\?v=\\d+$/;\n\nlet resolvedPath: string | null | undefined;\n\nfunction targetFile(): string | null {\n if (resolvedPath !== undefined) return resolvedPath;\n resolvedPath = process.env.WARLOCK_RESOLVE_CAPTURE || null;\n return resolvedPath;\n}\n\nexport type ResolutionRecord = {\n specifier: string;\n parentURL: string | undefined;\n url: string;\n format: string | undefined;\n};\n\nexport function captureResolution(record: ResolutionRecord): void {\n const file = targetFile();\n if (!file) return;\n\n const line =\n JSON.stringify({\n specifier: record.specifier,\n parentURL: record.parentURL?.replace(VERSION_QUERY, \"\"),\n url: record.url.replace(VERSION_QUERY, \"\"),\n format: record.format,\n }) + \"\\n\";\n\n try {\n appendFileSync(file, line);\n } catch {\n // Capture is a diagnostic aid — never let it break resolution.\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAmBA,MAAM,gBAAgB;AAEtB,IAAI;AAEJ,SAAS,aAA4B;CACnC,IAAI,iBAAiB,QAAW,OAAO;CACvC,eAAe,QAAQ,IAAI,2BAA2B;CACtD,OAAO;AACT;AASA,SAAgB,kBAAkB,QAAgC;CAChE,MAAM,OAAO,WAAW;CACxB,IAAI,CAAC,MAAM;CAEX,MAAM,OACJ,KAAK,UAAU;EACb,WAAW,OAAO;EAClB,WAAW,OAAO,WAAW,QAAQ,eAAe,EAAE;EACtD,KAAK,OAAO,IAAI,QAAQ,eAAe,EAAE;EACzC,QAAQ,OAAO;CACjB,CAAC,IAAI;CAEP,IAAI;EACF,eAAe,MAAM,IAAI;CAC3B,QAAQ,CAER;AACF"}
@@ -1,4 +1,4 @@
1
- //#region ../core/src/dev-server/loader/resolve-hook.d.ts
1
+ //#region ../../packages/core/src/dev-server/loader/resolve-hook.d.ts
2
2
  type ResolveContext = {
3
3
  parentURL?: string;
4
4
  conditions?: string[];
@@ -1 +1 @@
1
- {"version":3,"file":"resolve-hook.d.mts","names":[],"sources":["../../../../../../../../core/src/dev-server/loader/resolve-hook.ts"],"mappings":";KAqCK,cAAA;EACH,SAAA;EACA,UAAA;EACA,gBAAA,GAAmB,MAAM;AAAA;AAAA,KAGtB,aAAA;EACH,GAAA;EACA,MAAA;EACA,YAAA;AAAA;AAAA,KAGG,WAAA,IAAe,SAAA,UAAmB,OAAA,GAAU,cAAA,KAAmB,OAAA,CAAQ,aAAA;;AAH9D;AAAA;;;;;;;;;;;;;;AAG2E;AA2BzF;;;;;;;;iBAAsB,OAAA,CACpB,SAAA,UACA,OAAA,EAAS,cAAA,EACT,WAAA,EAAa,WAAA,GACZ,OAAA,CAAQ,aAAA"}
1
+ {"version":3,"file":"resolve-hook.d.mts","names":[],"sources":["../../../../../../../../../packages/core/src/dev-server/loader/resolve-hook.ts"],"mappings":";KAqCK,cAAA;EACH,SAAA;EACA,UAAA;EACA,gBAAA,GAAmB,MAAM;AAAA;AAAA,KAGtB,aAAA;EACH,GAAA;EACA,MAAA;EACA,YAAA;AAAA;AAAA,KAGG,WAAA,IAAe,SAAA,UAAmB,OAAA,GAAU,cAAA,KAAmB,OAAA,CAAQ,aAAA;;AAH9D;AAAA;;;;;;;;;;;;;;AAG2E;AA2BzF;;;;;;;;iBAAsB,OAAA,CACpB,SAAA,UACA,OAAA,EAAS,cAAA,EACT,WAAA,EAAa,WAAA,GACZ,OAAA,CAAQ,aAAA"}
@@ -2,10 +2,10 @@ import { ownResolve } from "./own-resolver.mjs";
2
2
  import { captureResolution } from "./resolve-capture.mjs";
3
3
  import { getVersion } from "./version-registry.mjs";
4
4
  import { existsSync } from "node:fs";
5
- import { fileURLToPath, pathToFileURL } from "node:url";
6
5
  import { getTsconfig, resolvePathAlias } from "get-tsconfig";
6
+ import { fileURLToPath, pathToFileURL } from "node:url";
7
7
 
8
- //#region ../core/src/dev-server/loader/resolve-hook.ts
8
+ //#region ../../packages/core/src/dev-server/loader/resolve-hook.ts
9
9
  /**
10
10
  * The `file://` URL prefix for the project's `src/` root, set once during
11
11
  * `initialize()`. Used to identify which resolved URLs belong to user code.
@@ -1 +1 @@
1
- {"version":3,"file":"resolve-hook.mjs","names":[],"sources":["../../../../../../../../core/src/dev-server/loader/resolve-hook.ts"],"sourcesContent":["import { getTsconfig, resolvePathAlias } from \"get-tsconfig\";\nimport { existsSync } from \"node:fs\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\nimport { ownResolve, type PathsMatcher } from \"./own-resolver.js\";\nimport { captureResolution } from \"./resolve-capture.js\";\nimport { getVersion } from \"./version-registry.js\";\n\n/**\n * The `file://` URL prefix for the project's `src/` root, set once during\n * `initialize()`. Used to identify which resolved URLs belong to user code.\n */\nlet srcRootUrl = \"\";\n\n/**\n * Configure the source root used by the resolve hook.\n * Must be called from `initialize()` before any imports are resolved.\n *\n * @param srcRoot - Absolute filesystem path to the project `src/` directory.\n */\nexport function setSrcRoot(srcRoot: string): void {\n srcRootUrl = pathToFileURL(srcRoot).href + \"/\";\n}\n\n/** Lazily-built tsconfig `paths` matcher (worker has no startup hook). */\nlet pathsMatcher: PathsMatcher | null = null;\nlet pathsMatcherBuilt = false;\n\nfunction getPathsMatcher(): PathsMatcher | null {\n if (pathsMatcherBuilt) return pathsMatcher;\n pathsMatcherBuilt = true;\n const tsconfig = getTsconfig(process.cwd());\n // get-tsconfig v5 renamed the curried `createPathsMatcher(t)(spec)` to a direct\n // `resolvePathAlias(t, spec)`. Wrap it to keep the PathsMatcher closure shape.\n pathsMatcher = tsconfig ? (specifier: string) => resolvePathAlias(tsconfig, specifier) : null;\n return pathsMatcher;\n}\n\ntype ResolveContext = {\n parentURL?: string;\n conditions?: string[];\n importAttributes?: Record<string, string>;\n};\n\ntype ResolveResult = {\n url: string;\n format?: string;\n shortCircuit?: boolean;\n};\n\ntype NextResolve = (specifier: string, context?: ResolveContext) => Promise<ResolveResult>;\n\n/**\n * ESM loader `resolve()` hook.\n *\n * The framework's own resolver (`ownResolve`) handles tsconfig `paths`,\n * aliases, and TS extension/`index` probing. Specifiers it doesn't own\n * (bare npm, `node:`, `file:`) fall through to `nextResolve` (Node\n * default). After resolution, stamps a `?v=<N>` version token onto any\n * `.ts` / `.tsx` file that lives under the configured `src/` root.\n *\n * The version token is the cache-bust mechanism: when a file changes the main\n * thread bumps its counter, the next `import()` produces a new URL, Node sees\n * a cache miss, and loads fresh content — native ESM cycles are preserved\n * because static imports remain static throughout.\n *\n * **parentURL cleaning**: the resolved URL carries `?v=N` as a suffix. If a\n * module loaded this way statically imports a relative sibling, Node uses that\n * `?v=N` URL as the `parentURL` for the next `resolve()` call. Passing it\n * unmodified to `nextResolve()` causes tsx to produce paths like\n * `some-sibling.ts?v=0` (the query leaks into URL joining). We strip `?v=N`\n * from `parentURL` before forwarding to prevent this.\n *\n * @example\n * // First import of user.model.ts → ?v=0\n * // File watcher bumps → next import → ?v=1 → fresh module\n */\nexport async function resolve(\n specifier: string,\n context: ResolveContext,\n nextResolve: NextResolve,\n): Promise<ResolveResult> {\n const cleanContext = context.parentURL?.includes(\"?v=\")\n ? { ...context, parentURL: context.parentURL.replace(/\\?v=\\d+$/, \"\") }\n : context;\n\n // The framework's own resolver owns tsconfig `paths` + TS\n // extension/index probing. Anything it returns `null` for (bare npm,\n // `node:`, `file:`) falls through to Node default via `nextResolve`.\n const owned = ownResolve(specifier, cleanContext.parentURL, getPathsMatcher(), existsSync);\n // When we produced the URL ourselves we did NOT call nextResolve, so the\n // result must short-circuit the loader chain or Node throws\n // ERR_LOADER_CHAIN_INCOMPLETE (e.g. for @warlock.js/* .ts that resolve\n // outside the project src root and hit the early return below).\n const result: ResolveResult = owned\n ? { url: owned, shortCircuit: true }\n : await nextResolve(specifier, cleanContext);\n\n const { url } = result;\n\n // Ground-truth recorder (no-op unless WARLOCK_RESOLVE_CAPTURE is set):\n // logs the answer for this (specifier, parentURL) so the Phase B\n // resolver can be proven to reproduce tsx exactly.\n captureResolution({\n specifier,\n parentURL: cleanContext.parentURL,\n url,\n format: result.format,\n });\n\n const cleanUrl = url.replace(/\\?v=\\d+$/, \"\");\n\n if (\n !cleanUrl.startsWith(srcRootUrl) ||\n (!cleanUrl.endsWith(\".ts\") && !cleanUrl.endsWith(\".tsx\"))\n ) {\n return result;\n }\n\n const absolutePath = fileURLToPath(cleanUrl);\n const version = getVersion(absolutePath);\n\n // Spread the full result from nextResolve (preserves `format` and any other\n // fields tsx sets) and only override `url`. Dropping `format` would cause\n // tsx's load hook to see an undefined format and fall through to Node's\n // default loader, which rejects unknown extensions like .tsx.\n return { ...result, url: `${cleanUrl}?v=${version}`, shortCircuit: true };\n}\n"],"mappings":";;;;;;;;;;;;AAWA,IAAI,aAAa;;;;;;;AAQjB,SAAgB,WAAW,SAAuB;CAChD,aAAa,cAAc,OAAO,CAAC,CAAC,OAAO;AAC7C;;AAGA,IAAI,eAAoC;AACxC,IAAI,oBAAoB;AAExB,SAAS,kBAAuC;CAC9C,IAAI,mBAAmB,OAAO;CAC9B,oBAAoB;CACpB,MAAM,WAAW,YAAY,QAAQ,IAAI,CAAC;CAG1C,eAAe,YAAY,cAAsB,iBAAiB,UAAU,SAAS,IAAI;CACzF,OAAO;AACT;;;;;;;;;;;;;;;;;;;;;;;;;;AAyCA,eAAsB,QACpB,WACA,SACA,aACwB;CACxB,MAAM,eAAe,QAAQ,WAAW,SAAS,KAAK,IAClD;EAAE,GAAG;EAAS,WAAW,QAAQ,UAAU,QAAQ,YAAY,EAAE;CAAE,IACnE;CAKJ,MAAM,QAAQ,WAAW,WAAW,aAAa,WAAW,gBAAgB,GAAG,UAAU;CAKzF,MAAM,SAAwB,QAC1B;EAAE,KAAK;EAAO,cAAc;CAAK,IACjC,MAAM,YAAY,WAAW,YAAY;CAE7C,MAAM,EAAE,QAAQ;CAKhB,kBAAkB;EAChB;EACA,WAAW,aAAa;EACxB;EACA,QAAQ,OAAO;CACjB,CAAC;CAED,MAAM,WAAW,IAAI,QAAQ,YAAY,EAAE;CAE3C,IACE,CAAC,SAAS,WAAW,UAAU,KAC9B,CAAC,SAAS,SAAS,KAAK,KAAK,CAAC,SAAS,SAAS,MAAM,GAEvD,OAAO;CAIT,MAAM,UAAU,WADK,cAAc,QACG,CAAC;CAMvC,OAAO;EAAE,GAAG;EAAQ,KAAK,GAAG,SAAS,KAAK;EAAW,cAAc;CAAK;AAC1E"}
1
+ {"version":3,"file":"resolve-hook.mjs","names":[],"sources":["../../../../../../../../../packages/core/src/dev-server/loader/resolve-hook.ts"],"sourcesContent":["import { getTsconfig, resolvePathAlias } from \"get-tsconfig\";\nimport { existsSync } from \"node:fs\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\nimport { ownResolve, type PathsMatcher } from \"./own-resolver.js\";\nimport { captureResolution } from \"./resolve-capture.js\";\nimport { getVersion } from \"./version-registry.js\";\n\n/**\n * The `file://` URL prefix for the project's `src/` root, set once during\n * `initialize()`. Used to identify which resolved URLs belong to user code.\n */\nlet srcRootUrl = \"\";\n\n/**\n * Configure the source root used by the resolve hook.\n * Must be called from `initialize()` before any imports are resolved.\n *\n * @param srcRoot - Absolute filesystem path to the project `src/` directory.\n */\nexport function setSrcRoot(srcRoot: string): void {\n srcRootUrl = pathToFileURL(srcRoot).href + \"/\";\n}\n\n/** Lazily-built tsconfig `paths` matcher (worker has no startup hook). */\nlet pathsMatcher: PathsMatcher | null = null;\nlet pathsMatcherBuilt = false;\n\nfunction getPathsMatcher(): PathsMatcher | null {\n if (pathsMatcherBuilt) return pathsMatcher;\n pathsMatcherBuilt = true;\n const tsconfig = getTsconfig(process.cwd());\n // get-tsconfig v5 renamed the curried `createPathsMatcher(t)(spec)` to a direct\n // `resolvePathAlias(t, spec)`. Wrap it to keep the PathsMatcher closure shape.\n pathsMatcher = tsconfig ? (specifier: string) => resolvePathAlias(tsconfig, specifier) : null;\n return pathsMatcher;\n}\n\ntype ResolveContext = {\n parentURL?: string;\n conditions?: string[];\n importAttributes?: Record<string, string>;\n};\n\ntype ResolveResult = {\n url: string;\n format?: string;\n shortCircuit?: boolean;\n};\n\ntype NextResolve = (specifier: string, context?: ResolveContext) => Promise<ResolveResult>;\n\n/**\n * ESM loader `resolve()` hook.\n *\n * The framework's own resolver (`ownResolve`) handles tsconfig `paths`,\n * aliases, and TS extension/`index` probing. Specifiers it doesn't own\n * (bare npm, `node:`, `file:`) fall through to `nextResolve` (Node\n * default). After resolution, stamps a `?v=<N>` version token onto any\n * `.ts` / `.tsx` file that lives under the configured `src/` root.\n *\n * The version token is the cache-bust mechanism: when a file changes the main\n * thread bumps its counter, the next `import()` produces a new URL, Node sees\n * a cache miss, and loads fresh content — native ESM cycles are preserved\n * because static imports remain static throughout.\n *\n * **parentURL cleaning**: the resolved URL carries `?v=N` as a suffix. If a\n * module loaded this way statically imports a relative sibling, Node uses that\n * `?v=N` URL as the `parentURL` for the next `resolve()` call. Passing it\n * unmodified to `nextResolve()` causes tsx to produce paths like\n * `some-sibling.ts?v=0` (the query leaks into URL joining). We strip `?v=N`\n * from `parentURL` before forwarding to prevent this.\n *\n * @example\n * // First import of user.model.ts → ?v=0\n * // File watcher bumps → next import → ?v=1 → fresh module\n */\nexport async function resolve(\n specifier: string,\n context: ResolveContext,\n nextResolve: NextResolve,\n): Promise<ResolveResult> {\n const cleanContext = context.parentURL?.includes(\"?v=\")\n ? { ...context, parentURL: context.parentURL.replace(/\\?v=\\d+$/, \"\") }\n : context;\n\n // The framework's own resolver owns tsconfig `paths` + TS\n // extension/index probing. Anything it returns `null` for (bare npm,\n // `node:`, `file:`) falls through to Node default via `nextResolve`.\n const owned = ownResolve(specifier, cleanContext.parentURL, getPathsMatcher(), existsSync);\n // When we produced the URL ourselves we did NOT call nextResolve, so the\n // result must short-circuit the loader chain or Node throws\n // ERR_LOADER_CHAIN_INCOMPLETE (e.g. for @warlock.js/* .ts that resolve\n // outside the project src root and hit the early return below).\n const result: ResolveResult = owned\n ? { url: owned, shortCircuit: true }\n : await nextResolve(specifier, cleanContext);\n\n const { url } = result;\n\n // Ground-truth recorder (no-op unless WARLOCK_RESOLVE_CAPTURE is set):\n // logs the answer for this (specifier, parentURL) so the Phase B\n // resolver can be proven to reproduce tsx exactly.\n captureResolution({\n specifier,\n parentURL: cleanContext.parentURL,\n url,\n format: result.format,\n });\n\n const cleanUrl = url.replace(/\\?v=\\d+$/, \"\");\n\n if (\n !cleanUrl.startsWith(srcRootUrl) ||\n (!cleanUrl.endsWith(\".ts\") && !cleanUrl.endsWith(\".tsx\"))\n ) {\n return result;\n }\n\n const absolutePath = fileURLToPath(cleanUrl);\n const version = getVersion(absolutePath);\n\n // Spread the full result from nextResolve (preserves `format` and any other\n // fields tsx sets) and only override `url`. Dropping `format` would cause\n // tsx's load hook to see an undefined format and fall through to Node's\n // default loader, which rejects unknown extensions like .tsx.\n return { ...result, url: `${cleanUrl}?v=${version}`, shortCircuit: true };\n}\n"],"mappings":";;;;;;;;;;;;AAWA,IAAI,aAAa;;;;;;;AAQjB,SAAgB,WAAW,SAAuB;CAChD,aAAa,cAAc,OAAO,CAAC,CAAC,OAAO;AAC7C;;AAGA,IAAI,eAAoC;AACxC,IAAI,oBAAoB;AAExB,SAAS,kBAAuC;CAC9C,IAAI,mBAAmB,OAAO;CAC9B,oBAAoB;CACpB,MAAM,WAAW,YAAY,QAAQ,IAAI,CAAC;CAG1C,eAAe,YAAY,cAAsB,iBAAiB,UAAU,SAAS,IAAI;CACzF,OAAO;AACT;;;;;;;;;;;;;;;;;;;;;;;;;;AAyCA,eAAsB,QACpB,WACA,SACA,aACwB;CACxB,MAAM,eAAe,QAAQ,WAAW,SAAS,KAAK,IAClD;EAAE,GAAG;EAAS,WAAW,QAAQ,UAAU,QAAQ,YAAY,EAAE;CAAE,IACnE;CAKJ,MAAM,QAAQ,WAAW,WAAW,aAAa,WAAW,gBAAgB,GAAG,UAAU;CAKzF,MAAM,SAAwB,QAC1B;EAAE,KAAK;EAAO,cAAc;CAAK,IACjC,MAAM,YAAY,WAAW,YAAY;CAE7C,MAAM,EAAE,QAAQ;CAKhB,kBAAkB;EAChB;EACA,WAAW,aAAa;EACxB;EACA,QAAQ,OAAO;CACjB,CAAC;CAED,MAAM,WAAW,IAAI,QAAQ,YAAY,EAAE;CAE3C,IACE,CAAC,SAAS,WAAW,UAAU,KAC9B,CAAC,SAAS,SAAS,KAAK,KAAK,CAAC,SAAS,SAAS,MAAM,GAEvD,OAAO;CAIT,MAAM,UAAU,WADK,cAAc,QACG,CAAC;CAMvC,OAAO;EAAE,GAAG;EAAQ,KAAK,GAAG,SAAS,KAAK;EAAW,cAAc;CAAK;AAC1E"}
@@ -1,4 +1,4 @@
1
- //#region ../core/src/dev-server/loader/source-slug.ts
1
+ //#region ../../packages/core/src/dev-server/loader/source-slug.ts
2
2
  /**
3
3
  * Human-readable label for a cached transpile file, derived from the last
4
4
  * three path segments of the source file.
@@ -1 +1 @@
1
- {"version":3,"file":"source-slug.mjs","names":[],"sources":["../../../../../../../../core/src/dev-server/loader/source-slug.ts"],"sourcesContent":["/**\n * Human-readable label for a cached transpile file, derived from the last\n * three path segments of the source file.\n *\n * Purely cosmetic: it rides in front of the content hash in the cache\n * filename so `ls .warlock/transpile/<shard>/` is browsable when debugging.\n * It is **never** used as a cache key, module URL, or source-map\n * `sourcefile` — correctness still rests entirely on the content hash, so\n * the slug is allowed to be lossy (sanitised, capped).\n *\n * @example\n * sourceSlug(\"D:/proj/src/app/vectors/utils/locales.ts\")\n * // → \"vectors-utils-locales\"\n */\nexport function sourceSlug(absolutePath: string): string {\n const noExt = absolutePath.replace(/\\\\/g, \"/\").replace(/\\.[cm]?[jt]sx?$/, \"\");\n\n const slug = noExt\n .split(\"/\")\n .filter(Boolean)\n .slice(-3)\n .join(\"-\")\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n\n // The hash guarantees uniqueness; the slug is just a label, so capping it\n // is safe and keeps total path length sane on deep trees / Windows.\n return slug.slice(0, 60) || \"src\";\n}\n"],"mappings":";;;;;;;;;;;;;;;AAcA,SAAgB,WAAW,cAA8B;CAcvD,OAbc,aAAa,QAAQ,OAAO,GAAG,CAAC,CAAC,QAAQ,mBAAmB,EAEzD,CAAC,CACf,MAAM,GAAG,CAAC,CACV,OAAO,OAAO,CAAC,CACf,MAAM,EAAE,CAAC,CACT,KAAK,GAAG,CAAC,CACT,YAAY,CAAC,CACb,QAAQ,eAAe,GAAG,CAAC,CAC3B,QAAQ,YAAY,EAIb,CAAC,CAAC,MAAM,GAAG,EAAE,KAAK;AAC9B"}
1
+ {"version":3,"file":"source-slug.mjs","names":[],"sources":["../../../../../../../../../packages/core/src/dev-server/loader/source-slug.ts"],"sourcesContent":["/**\n * Human-readable label for a cached transpile file, derived from the last\n * three path segments of the source file.\n *\n * Purely cosmetic: it rides in front of the content hash in the cache\n * filename so `ls .warlock/transpile/<shard>/` is browsable when debugging.\n * It is **never** used as a cache key, module URL, or source-map\n * `sourcefile` — correctness still rests entirely on the content hash, so\n * the slug is allowed to be lossy (sanitised, capped).\n *\n * @example\n * sourceSlug(\"D:/proj/src/app/vectors/utils/locales.ts\")\n * // → \"vectors-utils-locales\"\n */\nexport function sourceSlug(absolutePath: string): string {\n const noExt = absolutePath.replace(/\\\\/g, \"/\").replace(/\\.[cm]?[jt]sx?$/, \"\");\n\n const slug = noExt\n .split(\"/\")\n .filter(Boolean)\n .slice(-3)\n .join(\"-\")\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n\n // The hash guarantees uniqueness; the slug is just a label, so capping it\n // is safe and keeps total path length sane on deep trees / Windows.\n return slug.slice(0, 60) || \"src\";\n}\n"],"mappings":";;;;;;;;;;;;;;;AAcA,SAAgB,WAAW,cAA8B;CAcvD,OAbc,aAAa,QAAQ,OAAO,GAAG,CAAC,CAAC,QAAQ,mBAAmB,EAEzD,CAAC,CACf,MAAM,GAAG,CAAC,CACV,OAAO,OAAO,CAAC,CACf,MAAM,EAAE,CAAC,CACT,KAAK,GAAG,CAAC,CACT,YAAY,CAAC,CACb,QAAQ,eAAe,GAAG,CAAC,CAC3B,QAAQ,YAAY,EAIb,CAAC,CAAC,MAAM,GAAG,EAAE,KAAK;AAC9B"}
@@ -2,7 +2,7 @@ import path from "node:path";
2
2
  import { createHash, randomUUID } from "node:crypto";
3
3
  import { mkdirSync, readFileSync, readdirSync, renameSync, rmSync, statSync, writeFileSync } from "node:fs";
4
4
 
5
- //#region ../core/src/dev-server/loader/transpile-cache.ts
5
+ //#region ../../packages/core/src/dev-server/loader/transpile-cache.ts
6
6
  /**
7
7
  * Persisted transpile cache.
8
8
  *
@@ -1 +1 @@
1
- {"version":3,"file":"transpile-cache.mjs","names":[],"sources":["../../../../../../../../core/src/dev-server/loader/transpile-cache.ts"],"sourcesContent":["/**\n * Persisted transpile cache.\n *\n * Keyed by a hash of *source content* plus a transform-options fingerprint.\n * Same source + same options → same key → same output, always. Changed\n * content → different key → fresh transpile. There is no path-keyed entry\n * anywhere, so the old \"stack trace points at a mangled cache filename\" bug\n * class is structurally impossible — the on-disk filename is opaque and the\n * source identity lives only inside the source map.\n *\n * This module is pure and hook-agnostic on purpose: it knows how to read,\n * write and evict cache entries given a key, nothing about the ESM loader,\n * `?v=N` versioning, or esbuild. Phase 2 wires it into the load hook.\n *\n * @example\n * const fp = computeFingerprint({\n * esbuildVersion: esbuild.version,\n * cacheEpoch: CACHE_EPOCH,\n * compilerOptions,\n * });\n * const key = cacheKey(sourceText, fp);\n * const hit = cache.get(key);\n * if (!hit) cache.put(key, { code, map });\n */\n\nimport { createHash, randomUUID } from \"node:crypto\";\nimport {\n mkdirSync,\n readdirSync,\n readFileSync,\n renameSync,\n rmSync,\n statSync,\n writeFileSync,\n} from \"node:fs\";\nimport path from \"node:path\";\n\n/**\n * A cached transpile result: the emitted JS and its source map (raw JSON\n * string, exactly as esbuild produced it). Either may be empty for code\n * that produced no map.\n */\nexport type TranspileEntry = {\n code: string;\n map: string;\n};\n\n/**\n * Inputs that change transpiled output for identical source text. Bumping\n * any of these must invalidate every entry — that is achieved structurally\n * by folding them into the key, not by sweeping the cache.\n */\nexport type FingerprintParts = {\n /** `esbuild.version` — a transform-engine upgrade can change output. */\n esbuildVersion: string;\n /**\n * Monotonic cache-format epoch owned by the framework. Bump it whenever\n * the cache contract (entry shape, map handling, key derivation) changes\n * so old entries are guaranteed to miss after a framework upgrade.\n */\n cacheEpoch: number;\n /**\n * The resolved tsconfig `compilerOptions` blob, hashed wholesale rather\n * than cherry-picking fields — safer against tsconfig drift (a new option\n * that affects output can't silently serve stale code).\n */\n compilerOptions: unknown;\n};\n\n/**\n * Current cache-format epoch. Bump on any change to {@link TranspileEntry}\n * shape, the storage layout, or how the loader consumes entries.\n */\nexport const CACHE_EPOCH = 1;\n\n/**\n * Stable JSON stringify — object keys sorted recursively so semantically\n * equal option blobs always produce the same fingerprint regardless of key\n * insertion order.\n */\nfunction stableStringify(value: unknown): string {\n if (value === null || typeof value !== \"object\") {\n return JSON.stringify(value) ?? \"null\";\n }\n\n if (Array.isArray(value)) {\n return `[${value.map(stableStringify).join(\",\")}]`;\n }\n\n const entries = Object.keys(value as Record<string, unknown>)\n .sort()\n .map((key) => {\n const child = stableStringify((value as Record<string, unknown>)[key]);\n return `${JSON.stringify(key)}:${child}`;\n });\n\n return `{${entries.join(\",\")}}`;\n}\n\n/**\n * Fold every output-affecting input into one short hex fingerprint that\n * becomes part of every cache key.\n */\nexport function computeFingerprint(parts: FingerprintParts): string {\n const canonical = stableStringify({\n esbuildVersion: parts.esbuildVersion,\n cacheEpoch: parts.cacheEpoch,\n compilerOptions: parts.compilerOptions,\n });\n\n return createHash(\"sha256\").update(canonical).digest(\"hex\").slice(0, 16);\n}\n\n/**\n * Derive the cache key for a source file. The NUL separator makes\n * `sourceText` and `fingerprint` unambiguous (no concatenation collision).\n */\nexport function cacheKey(sourceText: string, fingerprint: string): string {\n return createHash(\"sha256\").update(sourceText).update(\"\\0\").update(fingerprint).digest(\"hex\");\n}\n\n/** Options for {@link TranspileCache.gc}. */\nexport type GcOptions = {\n /** Evict least-recently-modified entries once total size exceeds this. */\n maxBytes?: number;\n /** Evict entries whose mtime is older than this many milliseconds. */\n maxAgeMs?: number;\n};\n\ntype CacheFileInfo = {\n codePath: string;\n mapPath: string;\n size: number;\n mtimeMs: number;\n};\n\n/**\n * Content-hash-addressed transpile cache stored on disk.\n *\n * Layout: `<cacheDir>/<first2-of-key>/<key>.js` plus a sibling `.js.map`.\n * Sharding by the first two hex chars keeps any single directory small on\n * large projects. GC metadata is derived from filesystem mtime so there is\n * no second source of truth (no sidecar index to keep consistent).\n */\nexport class TranspileCache {\n public constructor(private readonly cacheDir: string) {}\n\n private shardDir(key: string): string {\n return path.join(this.cacheDir, key.slice(0, 2));\n }\n\n /**\n * `label` is an optional human-readable prefix (e.g. a path slug). It is\n * cosmetic only — the content `key` is still what makes the name unique,\n * so the same `(key, label)` pair must be passed to `get` and `put`.\n */\n private fileName(key: string, label: string | undefined, ext: string): string {\n return label ? `${label}.${key}${ext}` : `${key}${ext}`;\n }\n\n private codePath(key: string, label?: string): string {\n return path.join(this.shardDir(key), this.fileName(key, label, \".js\"));\n }\n\n private mapPath(key: string, label?: string): string {\n return path.join(this.shardDir(key), this.fileName(key, label, \".js.map\"));\n }\n\n /**\n * Return the cached entry for `key`, or `null` on a miss. Synchronous on\n * purpose: this sits on the module-load hot path and must not pay an\n * event-loop hop per import.\n */\n public get(key: string, label?: string): TranspileEntry | null {\n try {\n const code = readFileSync(this.codePath(key, label), \"utf8\");\n let map = \"\";\n try {\n map = readFileSync(this.mapPath(key, label), \"utf8\");\n } catch {\n // A code entry with no map is valid (e.g. map-less transform).\n }\n return { code, map };\n } catch {\n return null;\n }\n }\n\n /**\n * Store an entry for `key`. Written atomically (temp file + rename) so a\n * concurrent {@link get} never observes a half-written module.\n */\n public put(key: string, entry: TranspileEntry, label?: string): void {\n const shard = this.shardDir(key);\n mkdirSync(shard, { recursive: true });\n\n this.atomicWrite(this.codePath(key, label), entry.code);\n if (entry.map) {\n this.atomicWrite(this.mapPath(key, label), entry.map);\n }\n }\n\n private atomicWrite(filePath: string, content: string): void {\n const tempPath = `${filePath}.${process.pid}.${randomUUID()}.tmp`;\n try {\n writeFileSync(tempPath, content);\n renameSync(tempPath, filePath);\n } catch (error) {\n // Windows can report EPERM/EACCES when another loader process wins the\n // rename to this content-addressed destination. The winner's file is a\n // valid commit only when it contains the exact bytes we meant to store;\n // otherwise preserve the original error instead of accepting corruption.\n const code = (error as NodeJS.ErrnoException).code;\n const mayBeConcurrentCommit = code === \"EEXIST\" || code === \"EPERM\" || code === \"EACCES\";\n\n if (!mayBeConcurrentCommit || !this.hasCommittedContent(filePath, content)) {\n throw error;\n }\n } finally {\n try {\n rmSync(tempPath, { force: true });\n } catch {\n // Best effort: a cleanup failure must not mask the rename result.\n }\n }\n }\n\n private hasCommittedContent(filePath: string, content: string): boolean {\n try {\n return readFileSync(filePath, \"utf8\") === content;\n } catch {\n return false;\n }\n }\n\n /**\n * Opportunistic eviction. Cheap, runs at boot (not on the hot path).\n * Removes age-expired entries first, then trims to the size budget by\n * evicting least-recently-modified entries. Both bounds are optional;\n * with neither set this is a no-op.\n */\n public gc(options: GcOptions = {}): void {\n const { maxBytes, maxAgeMs } = options;\n if (maxBytes === undefined && maxAgeMs === undefined) return;\n\n const files = this.scan();\n const now = Date.now();\n\n let live = files;\n\n if (maxAgeMs !== undefined) {\n live = [];\n for (const file of files) {\n if (now - file.mtimeMs > maxAgeMs) {\n this.evict(file);\n } else {\n live.push(file);\n }\n }\n }\n\n if (maxBytes !== undefined) {\n let total = live.reduce((sum, file) => sum + file.size, 0);\n if (total > maxBytes) {\n // Oldest first — least-recently-modified is the eviction order.\n live.sort((a, b) => a.mtimeMs - b.mtimeMs);\n for (const file of live) {\n if (total <= maxBytes) break;\n total -= file.size;\n this.evict(file);\n }\n }\n }\n }\n\n private scan(): CacheFileInfo[] {\n const result: CacheFileInfo[] = [];\n\n let shards: string[];\n try {\n shards = readdirSync(this.cacheDir);\n } catch {\n return result;\n }\n\n for (const shard of shards) {\n const shardPath = path.join(this.cacheDir, shard);\n let entries: string[];\n try {\n entries = readdirSync(shardPath);\n } catch {\n continue;\n }\n\n for (const entry of entries) {\n if (!entry.endsWith(\".js\")) continue;\n const codePath = path.join(shardPath, entry);\n try {\n const stat = statSync(codePath);\n const mapPath = `${codePath}.map`;\n let mapSize = 0;\n try {\n mapSize = statSync(mapPath).size;\n } catch {\n // no map sidecar — fine\n }\n result.push({\n codePath,\n mapPath,\n size: stat.size + mapSize,\n mtimeMs: stat.mtimeMs,\n });\n } catch {\n // entry vanished mid-scan — skip\n }\n }\n }\n\n return result;\n }\n\n private evict(file: CacheFileInfo): void {\n try {\n rmSync(file.codePath, { force: true });\n } catch {\n // best effort\n }\n try {\n rmSync(file.mapPath, { force: true });\n } catch {\n // best effort\n }\n }\n\n /** Remove the entire cache directory (used by `--fresh`). */\n public clear(): void {\n try {\n rmSync(this.cacheDir, { recursive: true, force: true });\n } catch {\n // best effort\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgFA,SAAS,gBAAgB,OAAwB;CAC/C,IAAI,UAAU,QAAQ,OAAO,UAAU,UACrC,OAAO,KAAK,UAAU,KAAK,KAAK;CAGlC,IAAI,MAAM,QAAQ,KAAK,GACrB,OAAO,IAAI,MAAM,IAAI,eAAe,CAAC,CAAC,KAAK,GAAG,EAAE;CAUlD,OAAO,IAPS,OAAO,KAAK,KAAgC,CAAC,CAC1D,KAAK,CAAC,CACN,KAAK,QAAQ;EACZ,MAAM,QAAQ,gBAAiB,MAAkC,IAAI;EACrE,OAAO,GAAG,KAAK,UAAU,GAAG,EAAE,GAAG;CACnC,CAEe,CAAC,CAAC,KAAK,GAAG,EAAE;AAC/B;;;;;AAMA,SAAgB,mBAAmB,OAAiC;CAClE,MAAM,YAAY,gBAAgB;EAChC,gBAAgB,MAAM;EACtB,YAAY,MAAM;EAClB,iBAAiB,MAAM;CACzB,CAAC;CAED,OAAO,WAAW,QAAQ,CAAC,CAAC,OAAO,SAAS,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,MAAM,GAAG,EAAE;AACzE;;;;;AAMA,SAAgB,SAAS,YAAoB,aAA6B;CACxE,OAAO,WAAW,QAAQ,CAAC,CAAC,OAAO,UAAU,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,WAAW,CAAC,CAAC,OAAO,KAAK;AAC9F;;;;;;;;;AAyBA,IAAa,iBAAb,MAA4B;CAC1B,AAAO,YAAY,AAAiB,UAAkB;EAAlB;CAAmB;CAEvD,AAAQ,SAAS,KAAqB;EACpC,OAAO,KAAK,KAAK,KAAK,UAAU,IAAI,MAAM,GAAG,CAAC,CAAC;CACjD;;;;;;CAOA,AAAQ,SAAS,KAAa,OAA2B,KAAqB;EAC5E,OAAO,QAAQ,GAAG,MAAM,GAAG,MAAM,QAAQ,GAAG,MAAM;CACpD;CAEA,AAAQ,SAAS,KAAa,OAAwB;EACpD,OAAO,KAAK,KAAK,KAAK,SAAS,GAAG,GAAG,KAAK,SAAS,KAAK,OAAO,KAAK,CAAC;CACvE;CAEA,AAAQ,QAAQ,KAAa,OAAwB;EACnD,OAAO,KAAK,KAAK,KAAK,SAAS,GAAG,GAAG,KAAK,SAAS,KAAK,OAAO,SAAS,CAAC;CAC3E;;;;;;CAOA,AAAO,IAAI,KAAa,OAAuC;EAC7D,IAAI;GACF,MAAM,OAAO,aAAa,KAAK,SAAS,KAAK,KAAK,GAAG,MAAM;GAC3D,IAAI,MAAM;GACV,IAAI;IACF,MAAM,aAAa,KAAK,QAAQ,KAAK,KAAK,GAAG,MAAM;GACrD,QAAQ,CAER;GACA,OAAO;IAAE;IAAM;GAAI;EACrB,QAAQ;GACN,OAAO;EACT;CACF;;;;;CAMA,AAAO,IAAI,KAAa,OAAuB,OAAsB;EAEnE,UADc,KAAK,SAAS,GACd,GAAG,EAAE,WAAW,KAAK,CAAC;EAEpC,KAAK,YAAY,KAAK,SAAS,KAAK,KAAK,GAAG,MAAM,IAAI;EACtD,IAAI,MAAM,KACR,KAAK,YAAY,KAAK,QAAQ,KAAK,KAAK,GAAG,MAAM,GAAG;CAExD;CAEA,AAAQ,YAAY,UAAkB,SAAuB;EAC3D,MAAM,WAAW,GAAG,SAAS,GAAG,QAAQ,IAAI,GAAG,WAAW,EAAE;EAC5D,IAAI;GACF,cAAc,UAAU,OAAO;GAC/B,WAAW,UAAU,QAAQ;EAC/B,SAAS,OAAO;GAKd,MAAM,OAAQ,MAAgC;GAG9C,IAAI,EAF0B,SAAS,YAAY,SAAS,WAAW,SAAS,aAElD,CAAC,KAAK,oBAAoB,UAAU,OAAO,GACvE,MAAM;EAEV,UAAU;GACR,IAAI;IACF,OAAO,UAAU,EAAE,OAAO,KAAK,CAAC;GAClC,QAAQ,CAER;EACF;CACF;CAEA,AAAQ,oBAAoB,UAAkB,SAA0B;EACtE,IAAI;GACF,OAAO,aAAa,UAAU,MAAM,MAAM;EAC5C,QAAQ;GACN,OAAO;EACT;CACF;;;;;;;CAQA,AAAO,GAAG,UAAqB,CAAC,GAAS;EACvC,MAAM,EAAE,UAAU,aAAa;EAC/B,IAAI,aAAa,UAAa,aAAa,QAAW;EAEtD,MAAM,QAAQ,KAAK,KAAK;EACxB,MAAM,MAAM,KAAK,IAAI;EAErB,IAAI,OAAO;EAEX,IAAI,aAAa,QAAW;GAC1B,OAAO,CAAC;GACR,KAAK,MAAM,QAAQ,OACjB,IAAI,MAAM,KAAK,UAAU,UACvB,KAAK,MAAM,IAAI;QAEf,KAAK,KAAK,IAAI;EAGpB;EAEA,IAAI,aAAa,QAAW;GAC1B,IAAI,QAAQ,KAAK,QAAQ,KAAK,SAAS,MAAM,KAAK,MAAM,CAAC;GACzD,IAAI,QAAQ,UAAU;IAEpB,KAAK,MAAM,GAAG,MAAM,EAAE,UAAU,EAAE,OAAO;IACzC,KAAK,MAAM,QAAQ,MAAM;KACvB,IAAI,SAAS,UAAU;KACvB,SAAS,KAAK;KACd,KAAK,MAAM,IAAI;IACjB;GACF;EACF;CACF;CAEA,AAAQ,OAAwB;EAC9B,MAAM,SAA0B,CAAC;EAEjC,IAAI;EACJ,IAAI;GACF,SAAS,YAAY,KAAK,QAAQ;EACpC,QAAQ;GACN,OAAO;EACT;EAEA,KAAK,MAAM,SAAS,QAAQ;GAC1B,MAAM,YAAY,KAAK,KAAK,KAAK,UAAU,KAAK;GAChD,IAAI;GACJ,IAAI;IACF,UAAU,YAAY,SAAS;GACjC,QAAQ;IACN;GACF;GAEA,KAAK,MAAM,SAAS,SAAS;IAC3B,IAAI,CAAC,MAAM,SAAS,KAAK,GAAG;IAC5B,MAAM,WAAW,KAAK,KAAK,WAAW,KAAK;IAC3C,IAAI;KACF,MAAM,OAAO,SAAS,QAAQ;KAC9B,MAAM,UAAU,GAAG,SAAS;KAC5B,IAAI,UAAU;KACd,IAAI;MACF,UAAU,SAAS,OAAO,CAAC,CAAC;KAC9B,QAAQ,CAER;KACA,OAAO,KAAK;MACV;MACA;MACA,MAAM,KAAK,OAAO;MAClB,SAAS,KAAK;KAChB,CAAC;IACH,QAAQ,CAER;GACF;EACF;EAEA,OAAO;CACT;CAEA,AAAQ,MAAM,MAA2B;EACvC,IAAI;GACF,OAAO,KAAK,UAAU,EAAE,OAAO,KAAK,CAAC;EACvC,QAAQ,CAER;EACA,IAAI;GACF,OAAO,KAAK,SAAS,EAAE,OAAO,KAAK,CAAC;EACtC,QAAQ,CAER;CACF;;CAGA,AAAO,QAAc;EACnB,IAAI;GACF,OAAO,KAAK,UAAU;IAAE,WAAW;IAAM,OAAO;GAAK,CAAC;EACxD,QAAQ,CAER;CACF;AACF"}
1
+ {"version":3,"file":"transpile-cache.mjs","names":[],"sources":["../../../../../../../../../packages/core/src/dev-server/loader/transpile-cache.ts"],"sourcesContent":["/**\n * Persisted transpile cache.\n *\n * Keyed by a hash of *source content* plus a transform-options fingerprint.\n * Same source + same options → same key → same output, always. Changed\n * content → different key → fresh transpile. There is no path-keyed entry\n * anywhere, so the old \"stack trace points at a mangled cache filename\" bug\n * class is structurally impossible — the on-disk filename is opaque and the\n * source identity lives only inside the source map.\n *\n * This module is pure and hook-agnostic on purpose: it knows how to read,\n * write and evict cache entries given a key, nothing about the ESM loader,\n * `?v=N` versioning, or esbuild. Phase 2 wires it into the load hook.\n *\n * @example\n * const fp = computeFingerprint({\n * esbuildVersion: esbuild.version,\n * cacheEpoch: CACHE_EPOCH,\n * compilerOptions,\n * });\n * const key = cacheKey(sourceText, fp);\n * const hit = cache.get(key);\n * if (!hit) cache.put(key, { code, map });\n */\n\nimport { createHash, randomUUID } from \"node:crypto\";\nimport {\n mkdirSync,\n readdirSync,\n readFileSync,\n renameSync,\n rmSync,\n statSync,\n writeFileSync,\n} from \"node:fs\";\nimport path from \"node:path\";\n\n/**\n * A cached transpile result: the emitted JS and its source map (raw JSON\n * string, exactly as esbuild produced it). Either may be empty for code\n * that produced no map.\n */\nexport type TranspileEntry = {\n code: string;\n map: string;\n};\n\n/**\n * Inputs that change transpiled output for identical source text. Bumping\n * any of these must invalidate every entry — that is achieved structurally\n * by folding them into the key, not by sweeping the cache.\n */\nexport type FingerprintParts = {\n /** `esbuild.version` — a transform-engine upgrade can change output. */\n esbuildVersion: string;\n /**\n * Monotonic cache-format epoch owned by the framework. Bump it whenever\n * the cache contract (entry shape, map handling, key derivation) changes\n * so old entries are guaranteed to miss after a framework upgrade.\n */\n cacheEpoch: number;\n /**\n * The resolved tsconfig `compilerOptions` blob, hashed wholesale rather\n * than cherry-picking fields — safer against tsconfig drift (a new option\n * that affects output can't silently serve stale code).\n */\n compilerOptions: unknown;\n};\n\n/**\n * Current cache-format epoch. Bump on any change to {@link TranspileEntry}\n * shape, the storage layout, or how the loader consumes entries.\n */\nexport const CACHE_EPOCH = 1;\n\n/**\n * Stable JSON stringify — object keys sorted recursively so semantically\n * equal option blobs always produce the same fingerprint regardless of key\n * insertion order.\n */\nfunction stableStringify(value: unknown): string {\n if (value === null || typeof value !== \"object\") {\n return JSON.stringify(value) ?? \"null\";\n }\n\n if (Array.isArray(value)) {\n return `[${value.map(stableStringify).join(\",\")}]`;\n }\n\n const entries = Object.keys(value as Record<string, unknown>)\n .sort()\n .map((key) => {\n const child = stableStringify((value as Record<string, unknown>)[key]);\n return `${JSON.stringify(key)}:${child}`;\n });\n\n return `{${entries.join(\",\")}}`;\n}\n\n/**\n * Fold every output-affecting input into one short hex fingerprint that\n * becomes part of every cache key.\n */\nexport function computeFingerprint(parts: FingerprintParts): string {\n const canonical = stableStringify({\n esbuildVersion: parts.esbuildVersion,\n cacheEpoch: parts.cacheEpoch,\n compilerOptions: parts.compilerOptions,\n });\n\n return createHash(\"sha256\").update(canonical).digest(\"hex\").slice(0, 16);\n}\n\n/**\n * Derive the cache key for a source file. The NUL separator makes\n * `sourceText` and `fingerprint` unambiguous (no concatenation collision).\n */\nexport function cacheKey(sourceText: string, fingerprint: string): string {\n return createHash(\"sha256\").update(sourceText).update(\"\\0\").update(fingerprint).digest(\"hex\");\n}\n\n/** Options for {@link TranspileCache.gc}. */\nexport type GcOptions = {\n /** Evict least-recently-modified entries once total size exceeds this. */\n maxBytes?: number;\n /** Evict entries whose mtime is older than this many milliseconds. */\n maxAgeMs?: number;\n};\n\ntype CacheFileInfo = {\n codePath: string;\n mapPath: string;\n size: number;\n mtimeMs: number;\n};\n\n/**\n * Content-hash-addressed transpile cache stored on disk.\n *\n * Layout: `<cacheDir>/<first2-of-key>/<key>.js` plus a sibling `.js.map`.\n * Sharding by the first two hex chars keeps any single directory small on\n * large projects. GC metadata is derived from filesystem mtime so there is\n * no second source of truth (no sidecar index to keep consistent).\n */\nexport class TranspileCache {\n public constructor(private readonly cacheDir: string) {}\n\n private shardDir(key: string): string {\n return path.join(this.cacheDir, key.slice(0, 2));\n }\n\n /**\n * `label` is an optional human-readable prefix (e.g. a path slug). It is\n * cosmetic only — the content `key` is still what makes the name unique,\n * so the same `(key, label)` pair must be passed to `get` and `put`.\n */\n private fileName(key: string, label: string | undefined, ext: string): string {\n return label ? `${label}.${key}${ext}` : `${key}${ext}`;\n }\n\n private codePath(key: string, label?: string): string {\n return path.join(this.shardDir(key), this.fileName(key, label, \".js\"));\n }\n\n private mapPath(key: string, label?: string): string {\n return path.join(this.shardDir(key), this.fileName(key, label, \".js.map\"));\n }\n\n /**\n * Return the cached entry for `key`, or `null` on a miss. Synchronous on\n * purpose: this sits on the module-load hot path and must not pay an\n * event-loop hop per import.\n */\n public get(key: string, label?: string): TranspileEntry | null {\n try {\n const code = readFileSync(this.codePath(key, label), \"utf8\");\n let map = \"\";\n try {\n map = readFileSync(this.mapPath(key, label), \"utf8\");\n } catch {\n // A code entry with no map is valid (e.g. map-less transform).\n }\n return { code, map };\n } catch {\n return null;\n }\n }\n\n /**\n * Store an entry for `key`. Written atomically (temp file + rename) so a\n * concurrent {@link get} never observes a half-written module.\n */\n public put(key: string, entry: TranspileEntry, label?: string): void {\n const shard = this.shardDir(key);\n mkdirSync(shard, { recursive: true });\n\n this.atomicWrite(this.codePath(key, label), entry.code);\n if (entry.map) {\n this.atomicWrite(this.mapPath(key, label), entry.map);\n }\n }\n\n private atomicWrite(filePath: string, content: string): void {\n const tempPath = `${filePath}.${process.pid}.${randomUUID()}.tmp`;\n try {\n writeFileSync(tempPath, content);\n renameSync(tempPath, filePath);\n } catch (error) {\n // Windows can report EPERM/EACCES when another loader process wins the\n // rename to this content-addressed destination. The winner's file is a\n // valid commit only when it contains the exact bytes we meant to store;\n // otherwise preserve the original error instead of accepting corruption.\n const code = (error as NodeJS.ErrnoException).code;\n const mayBeConcurrentCommit = code === \"EEXIST\" || code === \"EPERM\" || code === \"EACCES\";\n\n if (!mayBeConcurrentCommit || !this.hasCommittedContent(filePath, content)) {\n throw error;\n }\n } finally {\n try {\n rmSync(tempPath, { force: true });\n } catch {\n // Best effort: a cleanup failure must not mask the rename result.\n }\n }\n }\n\n private hasCommittedContent(filePath: string, content: string): boolean {\n try {\n return readFileSync(filePath, \"utf8\") === content;\n } catch {\n return false;\n }\n }\n\n /**\n * Opportunistic eviction. Cheap, runs at boot (not on the hot path).\n * Removes age-expired entries first, then trims to the size budget by\n * evicting least-recently-modified entries. Both bounds are optional;\n * with neither set this is a no-op.\n */\n public gc(options: GcOptions = {}): void {\n const { maxBytes, maxAgeMs } = options;\n if (maxBytes === undefined && maxAgeMs === undefined) return;\n\n const files = this.scan();\n const now = Date.now();\n\n let live = files;\n\n if (maxAgeMs !== undefined) {\n live = [];\n for (const file of files) {\n if (now - file.mtimeMs > maxAgeMs) {\n this.evict(file);\n } else {\n live.push(file);\n }\n }\n }\n\n if (maxBytes !== undefined) {\n let total = live.reduce((sum, file) => sum + file.size, 0);\n if (total > maxBytes) {\n // Oldest first — least-recently-modified is the eviction order.\n live.sort((a, b) => a.mtimeMs - b.mtimeMs);\n for (const file of live) {\n if (total <= maxBytes) break;\n total -= file.size;\n this.evict(file);\n }\n }\n }\n }\n\n private scan(): CacheFileInfo[] {\n const result: CacheFileInfo[] = [];\n\n let shards: string[];\n try {\n shards = readdirSync(this.cacheDir);\n } catch {\n return result;\n }\n\n for (const shard of shards) {\n const shardPath = path.join(this.cacheDir, shard);\n let entries: string[];\n try {\n entries = readdirSync(shardPath);\n } catch {\n continue;\n }\n\n for (const entry of entries) {\n if (!entry.endsWith(\".js\")) continue;\n const codePath = path.join(shardPath, entry);\n try {\n const stat = statSync(codePath);\n const mapPath = `${codePath}.map`;\n let mapSize = 0;\n try {\n mapSize = statSync(mapPath).size;\n } catch {\n // no map sidecar — fine\n }\n result.push({\n codePath,\n mapPath,\n size: stat.size + mapSize,\n mtimeMs: stat.mtimeMs,\n });\n } catch {\n // entry vanished mid-scan — skip\n }\n }\n }\n\n return result;\n }\n\n private evict(file: CacheFileInfo): void {\n try {\n rmSync(file.codePath, { force: true });\n } catch {\n // best effort\n }\n try {\n rmSync(file.mapPath, { force: true });\n } catch {\n // best effort\n }\n }\n\n /** Remove the entire cache directory (used by `--fresh`). */\n public clear(): void {\n try {\n rmSync(this.cacheDir, { recursive: true, force: true });\n } catch {\n // best effort\n }\n }\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- //#region ../core/src/dev-server/loader/version-registry.ts
1
+ //#region ../../packages/core/src/dev-server/loader/version-registry.ts
2
2
  /**
3
3
  * Version registry for the ESM loader hook.
4
4
  *
@@ -1 +1 @@
1
- {"version":3,"file":"version-registry.mjs","names":[],"sources":["../../../../../../../../core/src/dev-server/loader/version-registry.ts"],"sourcesContent":["/**\n * Version registry for the ESM loader hook.\n *\n * Lives in the hook worker thread. The main thread sends bump messages via\n * MessageChannel; each bump increments the monotonic counter for that path,\n * which causes `resolve()` to produce a new URL — Node sees a fresh module.\n *\n * Monotonic integers are used instead of timestamps so there is no clock-drift\n * risk and the version is trivial to reason about during debugging.\n *\n * @example\n * // Hook worker receives a bump from the file watcher:\n * bumpVersion(\"/abs/path/to/user.model.ts\");\n * // → getVersion returns 1, resolve() appends ?v=1 to the URL\n */\n\nconst versionMap = new Map<string, number>();\n\n/**\n * Normalize a filesystem path to a single canonical form so the main thread\n * (which often holds forward-slash paths from posix-style joins) and the\n * hook worker (which gets backslash paths from `fileURLToPath` on Windows)\n * agree on map keys.\n */\nfunction normalizeKey(absolutePath: string): string {\n return absolutePath.replace(/\\\\/g, \"/\").toLowerCase();\n}\n\n/**\n * Increment the version counter for the given absolute path.\n * Called when the file watcher detects a change.\n */\nexport function bumpVersion(absolutePath: string): void {\n const key = normalizeKey(absolutePath);\n versionMap.set(key, (versionMap.get(key) ?? 0) + 1);\n}\n\n/**\n * Return the current version counter for the given absolute path.\n * Returns 0 for paths not yet seen (first import).\n */\nexport function getVersion(absolutePath: string): number {\n return versionMap.get(normalizeKey(absolutePath)) ?? 0;\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAgBA,MAAM,6BAAa,IAAI,IAAoB;;;;;;;AAQ3C,SAAS,aAAa,cAA8B;CAClD,OAAO,aAAa,QAAQ,OAAO,GAAG,CAAC,CAAC,YAAY;AACtD;;;;;AAMA,SAAgB,YAAY,cAA4B;CACtD,MAAM,MAAM,aAAa,YAAY;CACrC,WAAW,IAAI,MAAM,WAAW,IAAI,GAAG,KAAK,KAAK,CAAC;AACpD;;;;;AAMA,SAAgB,WAAW,cAA8B;CACvD,OAAO,WAAW,IAAI,aAAa,YAAY,CAAC,KAAK;AACvD"}
1
+ {"version":3,"file":"version-registry.mjs","names":[],"sources":["../../../../../../../../../packages/core/src/dev-server/loader/version-registry.ts"],"sourcesContent":["/**\n * Version registry for the ESM loader hook.\n *\n * Lives in the hook worker thread. The main thread sends bump messages via\n * MessageChannel; each bump increments the monotonic counter for that path,\n * which causes `resolve()` to produce a new URL — Node sees a fresh module.\n *\n * Monotonic integers are used instead of timestamps so there is no clock-drift\n * risk and the version is trivial to reason about during debugging.\n *\n * @example\n * // Hook worker receives a bump from the file watcher:\n * bumpVersion(\"/abs/path/to/user.model.ts\");\n * // → getVersion returns 1, resolve() appends ?v=1 to the URL\n */\n\nconst versionMap = new Map<string, number>();\n\n/**\n * Normalize a filesystem path to a single canonical form so the main thread\n * (which often holds forward-slash paths from posix-style joins) and the\n * hook worker (which gets backslash paths from `fileURLToPath` on Windows)\n * agree on map keys.\n */\nfunction normalizeKey(absolutePath: string): string {\n return absolutePath.replace(/\\\\/g, \"/\").toLowerCase();\n}\n\n/**\n * Increment the version counter for the given absolute path.\n * Called when the file watcher detects a change.\n */\nexport function bumpVersion(absolutePath: string): void {\n const key = normalizeKey(absolutePath);\n versionMap.set(key, (versionMap.get(key) ?? 0) + 1);\n}\n\n/**\n * Return the current version counter for the given absolute path.\n * Returns 0 for paths not yet seen (first import).\n */\nexport function getVersion(absolutePath: string): number {\n return versionMap.get(normalizeKey(absolutePath)) ?? 0;\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAgBA,MAAM,6BAAa,IAAI,IAAoB;;;;;;;AAQ3C,SAAS,aAAa,cAA8B;CAClD,OAAO,aAAa,QAAQ,OAAO,GAAG,CAAC,CAAC,YAAY;AACtD;;;;;AAMA,SAAgB,YAAY,cAA4B;CACtD,MAAM,MAAM,aAAa,YAAY;CACrC,WAAW,IAAI,MAAM,WAAW,IAAI,GAAG,KAAK,KAAK,CAAC;AACpD;;;;;AAMA,SAAgB,WAAW,cAA8B;CACvD,OAAO,WAAW,IAAI,aAAa,YAAY,CAAC,KAAK;AACvD"}
@@ -1,7 +1,7 @@
1
1
  import { FileManifest } from "./types.mjs";
2
2
  import { FileManager } from "./file-manager.mjs";
3
3
 
4
- //#region ../core/src/dev-server/manifest-manager.d.ts
4
+ //#region ../../packages/core/src/dev-server/manifest-manager.d.ts
5
5
  declare class ManifestManager {
6
6
  private readonly files;
7
7
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"manifest-manager.d.mts","names":[],"sources":["../../../../../../../core/src/dev-server/manifest-manager.ts"],"mappings":";;;;cAqBa,eAAA;EAAA,iBAiByB,KAAA;EAAA;;;EAAA,QAb5B,QAAA;EAa+C;;;cAAnB,KAAA,EAAO,GAAA,SAAY,WAAA;EA6B1C;;;;EAvBA,IAAA,IAAQ,OAAA;EA0Cd;;;EAnBM,IAAA,IAAQ,OAAA;EA0B0B;;;EAdxC,OAAA,CAAQ,QAAA,WAAmB,YAAA;EA4B3B;;;EArBA,OAAA,CAAQ,QAAA;EAmCR;;;EA5BA,OAAA,CAAQ,QAAA,UAAkB,YAAA,EAAc,YAAA;;;;EAOxC,UAAA,CAAW,QAAA;EA2CX;;AAAK;EApCL,eAAA;;;;EAOA,WAAA,IAAe,MAAA,SAAe,YAAA;;;;EAO9B,WAAA;;;;;;;;;;;;UAYC,0BAAA;;;;EAUD,KAAA;AAAA"}
1
+ {"version":3,"file":"manifest-manager.d.mts","names":[],"sources":["../../../../../../../../packages/core/src/dev-server/manifest-manager.ts"],"mappings":";;;;cAqBa,eAAA;EAAA,iBAiByB,KAAA;EAAA;;;EAAA,QAb5B,QAAA;EAa+C;;;cAAnB,KAAA,EAAO,GAAA,SAAY,WAAA;EA6B1C;;;;EAvBA,IAAA,IAAQ,OAAA;EA0Cd;;;EAnBM,IAAA,IAAQ,OAAA;EA0B0B;;;EAdxC,OAAA,CAAQ,QAAA,WAAmB,YAAA;EA4B3B;;;EArBA,OAAA,CAAQ,QAAA;EAmCR;;;EA5BA,OAAA,CAAQ,QAAA,UAAkB,YAAA,EAAc,YAAA;;;;EAOxC,UAAA,CAAW,QAAA;EA2CX;;AAAK;EApCL,eAAA;;;;EAOA,WAAA,IAAe,MAAA,SAAe,YAAA;;;;EAO9B,WAAA;;;;;;;;;;;;UAYC,0BAAA;;;;EAUD,KAAA;AAAA"}
@@ -1,7 +1,7 @@
1
1
  import { MANIFEST_PATH } from "./flags.mjs";
2
2
  import { atomicWriteAsync, fileExistsAsync, getJsonFileAsync } from "@warlock.js/fs";
3
3
 
4
- //#region ../core/src/dev-server/manifest-manager.ts
4
+ //#region ../../packages/core/src/dev-server/manifest-manager.ts
5
5
  const MANIFEST_VERSION = "1.0.0";
6
6
  var ManifestManager = class {
7
7
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"manifest-manager.mjs","names":[],"sources":["../../../../../../../core/src/dev-server/manifest-manager.ts"],"sourcesContent":["import { atomicWriteAsync, fileExistsAsync, getJsonFileAsync } from \"@warlock.js/fs\";\nimport { FileManager } from \"./file-manager\";\nimport type { FileManifest } from \"./types\";\nimport { MANIFEST_PATH } from \"./flags\";\n\nconst MANIFEST_VERSION = \"1.0.0\";\n\n/**\n * Manifest structure with metadata and files\n */\nexport type Manifest = {\n version: string;\n lastBuildTime: number;\n projectHash?: string;\n stats: {\n totalFiles: number;\n totalDependencies: number;\n };\n files: Record<string, FileManifest>;\n};\n\nexport class ManifestManager {\n /**\n * Manifest data with metadata\n */\n private manifest: Manifest = {\n version: MANIFEST_VERSION,\n lastBuildTime: Date.now(),\n stats: {\n totalFiles: 0,\n totalDependencies: 0,\n },\n files: {},\n };\n\n /**\n * Constructor\n */\n public constructor(private readonly files: Map<string, FileManager>) {}\n\n /**\n * Initialize manifest manager\n * @returns true if manifest exists, false otherwise\n */\n public async init(): Promise<boolean> {\n if (await fileExistsAsync(MANIFEST_PATH)) {\n try {\n const loaded = await getJsonFileAsync<Manifest>(MANIFEST_PATH);\n\n // A torn write or a format change across upgrades is treated as absent.\n if (loaded?.version !== MANIFEST_VERSION || typeof loaded.files !== \"object\") {\n return false;\n }\n\n this.manifest = loaded;\n return true;\n } catch {\n return false;\n }\n }\n\n return false;\n }\n\n /**\n * Save manifest to disk\n */\n public async save(): Promise<void> {\n // Update stats before saving\n this.manifest.stats.totalFiles = Object.keys(this.manifest.files).length;\n this.manifest.stats.totalDependencies = this.calculateTotalDependencies();\n this.manifest.lastBuildTime = Date.now();\n\n await atomicWriteAsync(MANIFEST_PATH, JSON.stringify(this.manifest, null, 2));\n }\n\n /**\n * Get file manifest data\n */\n public getFile(filePath: string): FileManifest | undefined {\n return this.manifest.files[filePath];\n }\n\n /**\n * Check if file exists in manifest\n */\n public hasFile(filePath: string): boolean {\n return filePath in this.manifest.files;\n }\n\n /**\n * Set file manifest data\n */\n public setFile(filePath: string, fileManifest: FileManifest): void {\n this.manifest.files[filePath] = fileManifest;\n }\n\n /**\n * Remove file from manifest\n */\n public removeFile(filePath: string): void {\n delete this.manifest.files[filePath];\n }\n\n /**\n * Get all file paths in manifest\n */\n public getAllFilePaths(): string[] {\n return Object.keys(this.manifest.files);\n }\n\n /**\n * Get all file manifests\n */\n public getAllFiles(): Record<string, FileManifest> {\n return this.manifest.files;\n }\n\n /**\n * Get manifest metadata\n */\n public getMetadata() {\n return {\n version: this.manifest.version,\n lastBuildTime: this.manifest.lastBuildTime,\n projectHash: this.manifest.projectHash,\n stats: this.manifest.stats,\n };\n }\n\n /**\n * Calculate total dependencies across all files\n */\n private calculateTotalDependencies(): number {\n return Object.values(this.manifest.files).reduce(\n (total, file) => total + (file.dependencies?.length || 0),\n 0,\n );\n }\n\n /**\n * Clear all files from manifest\n */\n public clear(): void {\n this.manifest.files = {};\n this.manifest.stats = {\n totalFiles: 0,\n totalDependencies: 0,\n };\n }\n}\n"],"mappings":";;;;AAKA,MAAM,mBAAmB;AAgBzB,IAAa,kBAAb,MAA6B;;;;CAiB3B,AAAO,YAAY,AAAiB,OAAiC;EAAjC;kBAbP;GAC3B,SAAS;GACT,eAAe,KAAK,IAAI;GACxB,OAAO;IACL,YAAY;IACZ,mBAAmB;GACrB;GACA,OAAO,CAAC;EACV;CAKsE;;;;;CAMtE,MAAa,OAAyB;EACpC,IAAI,MAAM,gBAAgB,aAAa,GACrC,IAAI;GACF,MAAM,SAAS,MAAM,iBAA2B,aAAa;GAG7D,IAAI,QAAQ,YAAY,oBAAoB,OAAO,OAAO,UAAU,UAClE,OAAO;GAGT,KAAK,WAAW;GAChB,OAAO;EACT,QAAQ;GACN,OAAO;EACT;EAGF,OAAO;CACT;;;;CAKA,MAAa,OAAsB;EAEjC,KAAK,SAAS,MAAM,aAAa,OAAO,KAAK,KAAK,SAAS,KAAK,CAAC,CAAC;EAClE,KAAK,SAAS,MAAM,oBAAoB,KAAK,2BAA2B;EACxE,KAAK,SAAS,gBAAgB,KAAK,IAAI;EAEvC,MAAM,iBAAiB,eAAe,KAAK,UAAU,KAAK,UAAU,MAAM,CAAC,CAAC;CAC9E;;;;CAKA,AAAO,QAAQ,UAA4C;EACzD,OAAO,KAAK,SAAS,MAAM;CAC7B;;;;CAKA,AAAO,QAAQ,UAA2B;EACxC,OAAO,YAAY,KAAK,SAAS;CACnC;;;;CAKA,AAAO,QAAQ,UAAkB,cAAkC;EACjE,KAAK,SAAS,MAAM,YAAY;CAClC;;;;CAKA,AAAO,WAAW,UAAwB;EACxC,OAAO,KAAK,SAAS,MAAM;CAC7B;;;;CAKA,AAAO,kBAA4B;EACjC,OAAO,OAAO,KAAK,KAAK,SAAS,KAAK;CACxC;;;;CAKA,AAAO,cAA4C;EACjD,OAAO,KAAK,SAAS;CACvB;;;;CAKA,AAAO,cAAc;EACnB,OAAO;GACL,SAAS,KAAK,SAAS;GACvB,eAAe,KAAK,SAAS;GAC7B,aAAa,KAAK,SAAS;GAC3B,OAAO,KAAK,SAAS;EACvB;CACF;;;;CAKA,AAAQ,6BAAqC;EAC3C,OAAO,OAAO,OAAO,KAAK,SAAS,KAAK,CAAC,CAAC,QACvC,OAAO,SAAS,SAAS,KAAK,cAAc,UAAU,IACvD,CACF;CACF;;;;CAKA,AAAO,QAAc;EACnB,KAAK,SAAS,QAAQ,CAAC;EACvB,KAAK,SAAS,QAAQ;GACpB,YAAY;GACZ,mBAAmB;EACrB;CACF;AACF"}
1
+ {"version":3,"file":"manifest-manager.mjs","names":[],"sources":["../../../../../../../../packages/core/src/dev-server/manifest-manager.ts"],"sourcesContent":["import { atomicWriteAsync, fileExistsAsync, getJsonFileAsync } from \"@warlock.js/fs\";\nimport { FileManager } from \"./file-manager\";\nimport type { FileManifest } from \"./types\";\nimport { MANIFEST_PATH } from \"./flags\";\n\nconst MANIFEST_VERSION = \"1.0.0\";\n\n/**\n * Manifest structure with metadata and files\n */\nexport type Manifest = {\n version: string;\n lastBuildTime: number;\n projectHash?: string;\n stats: {\n totalFiles: number;\n totalDependencies: number;\n };\n files: Record<string, FileManifest>;\n};\n\nexport class ManifestManager {\n /**\n * Manifest data with metadata\n */\n private manifest: Manifest = {\n version: MANIFEST_VERSION,\n lastBuildTime: Date.now(),\n stats: {\n totalFiles: 0,\n totalDependencies: 0,\n },\n files: {},\n };\n\n /**\n * Constructor\n */\n public constructor(private readonly files: Map<string, FileManager>) {}\n\n /**\n * Initialize manifest manager\n * @returns true if manifest exists, false otherwise\n */\n public async init(): Promise<boolean> {\n if (await fileExistsAsync(MANIFEST_PATH)) {\n try {\n const loaded = await getJsonFileAsync<Manifest>(MANIFEST_PATH);\n\n // A torn write or a format change across upgrades is treated as absent.\n if (loaded?.version !== MANIFEST_VERSION || typeof loaded.files !== \"object\") {\n return false;\n }\n\n this.manifest = loaded;\n return true;\n } catch {\n return false;\n }\n }\n\n return false;\n }\n\n /**\n * Save manifest to disk\n */\n public async save(): Promise<void> {\n // Update stats before saving\n this.manifest.stats.totalFiles = Object.keys(this.manifest.files).length;\n this.manifest.stats.totalDependencies = this.calculateTotalDependencies();\n this.manifest.lastBuildTime = Date.now();\n\n await atomicWriteAsync(MANIFEST_PATH, JSON.stringify(this.manifest, null, 2));\n }\n\n /**\n * Get file manifest data\n */\n public getFile(filePath: string): FileManifest | undefined {\n return this.manifest.files[filePath];\n }\n\n /**\n * Check if file exists in manifest\n */\n public hasFile(filePath: string): boolean {\n return filePath in this.manifest.files;\n }\n\n /**\n * Set file manifest data\n */\n public setFile(filePath: string, fileManifest: FileManifest): void {\n this.manifest.files[filePath] = fileManifest;\n }\n\n /**\n * Remove file from manifest\n */\n public removeFile(filePath: string): void {\n delete this.manifest.files[filePath];\n }\n\n /**\n * Get all file paths in manifest\n */\n public getAllFilePaths(): string[] {\n return Object.keys(this.manifest.files);\n }\n\n /**\n * Get all file manifests\n */\n public getAllFiles(): Record<string, FileManifest> {\n return this.manifest.files;\n }\n\n /**\n * Get manifest metadata\n */\n public getMetadata() {\n return {\n version: this.manifest.version,\n lastBuildTime: this.manifest.lastBuildTime,\n projectHash: this.manifest.projectHash,\n stats: this.manifest.stats,\n };\n }\n\n /**\n * Calculate total dependencies across all files\n */\n private calculateTotalDependencies(): number {\n return Object.values(this.manifest.files).reduce(\n (total, file) => total + (file.dependencies?.length || 0),\n 0,\n );\n }\n\n /**\n * Clear all files from manifest\n */\n public clear(): void {\n this.manifest.files = {};\n this.manifest.stats = {\n totalFiles: 0,\n totalDependencies: 0,\n };\n }\n}\n"],"mappings":";;;;AAKA,MAAM,mBAAmB;AAgBzB,IAAa,kBAAb,MAA6B;;;;CAiB3B,AAAO,YAAY,AAAiB,OAAiC;EAAjC;kBAbP;GAC3B,SAAS;GACT,eAAe,KAAK,IAAI;GACxB,OAAO;IACL,YAAY;IACZ,mBAAmB;GACrB;GACA,OAAO,CAAC;EACV;CAKsE;;;;;CAMtE,MAAa,OAAyB;EACpC,IAAI,MAAM,gBAAgB,aAAa,GACrC,IAAI;GACF,MAAM,SAAS,MAAM,iBAA2B,aAAa;GAG7D,IAAI,QAAQ,YAAY,oBAAoB,OAAO,OAAO,UAAU,UAClE,OAAO;GAGT,KAAK,WAAW;GAChB,OAAO;EACT,QAAQ;GACN,OAAO;EACT;EAGF,OAAO;CACT;;;;CAKA,MAAa,OAAsB;EAEjC,KAAK,SAAS,MAAM,aAAa,OAAO,KAAK,KAAK,SAAS,KAAK,CAAC,CAAC;EAClE,KAAK,SAAS,MAAM,oBAAoB,KAAK,2BAA2B;EACxE,KAAK,SAAS,gBAAgB,KAAK,IAAI;EAEvC,MAAM,iBAAiB,eAAe,KAAK,UAAU,KAAK,UAAU,MAAM,CAAC,CAAC;CAC9E;;;;CAKA,AAAO,QAAQ,UAA4C;EACzD,OAAO,KAAK,SAAS,MAAM;CAC7B;;;;CAKA,AAAO,QAAQ,UAA2B;EACxC,OAAO,YAAY,KAAK,SAAS;CACnC;;;;CAKA,AAAO,QAAQ,UAAkB,cAAkC;EACjE,KAAK,SAAS,MAAM,YAAY;CAClC;;;;CAKA,AAAO,WAAW,UAAwB;EACxC,OAAO,KAAK,SAAS,MAAM;CAC7B;;;;CAKA,AAAO,kBAA4B;EACjC,OAAO,OAAO,KAAK,KAAK,SAAS,KAAK;CACxC;;;;CAKA,AAAO,cAA4C;EACjD,OAAO,KAAK,SAAS;CACvB;;;;CAKA,AAAO,cAAc;EACnB,OAAO;GACL,SAAS,KAAK,SAAS;GACvB,eAAe,KAAK,SAAS;GAC7B,aAAa,KAAK,SAAS;GAC3B,OAAO,KAAK,SAAS;EACvB;CACF;;;;CAKA,AAAQ,6BAAqC;EAC3C,OAAO,OAAO,OAAO,KAAK,SAAS,KAAK,CAAC,CAAC,QACvC,OAAO,SAAS,SAAS,KAAK,cAAc,UAAU,IACvD,CACF;CACF;;;;CAKA,AAAO,QAAc;EACnB,KAAK,SAAS,QAAQ,CAAC;EACvB,KAAK,SAAS,QAAQ;GACpB,YAAY;GACZ,mBAAmB;EACrB;CACF;AACF"}
@@ -3,7 +3,7 @@ import path from "node:path";
3
3
  import fs from "node:fs";
4
4
  import { pathToFileURL } from "node:url";
5
5
 
6
- //#region ../core/src/dev-server/model-module-registry.ts
6
+ //#region ../../packages/core/src/dev-server/model-module-registry.ts
7
7
  function normalizeInputPath(absolutePath) {
8
8
  const slashNormalized = path.resolve(absolutePath).replaceAll("\\", "/");
9
9
  return process.platform === "win32" ? slashNormalized.toLowerCase() : slashNormalized;
@@ -1 +1 @@
1
- {"version":3,"file":"model-module-registry.mjs","names":[],"sources":["../../../../../../../core/src/dev-server/model-module-registry.ts"],"sourcesContent":["import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { container } from \"../container\";\nimport type {\n DevelopmentModelModuleEntry,\n DevelopmentModelModules,\n} from \"../container/development-model-modules\";\n\ntype StoredEntry = DevelopmentModelModuleEntry & { readonly namespace?: object };\n\nfunction normalizeInputPath(absolutePath: string): string {\n const slashNormalized = path.resolve(absolutePath).replaceAll(\"\\\\\", \"/\");\n return process.platform === \"win32\" ? slashNormalized.toLowerCase() : slashNormalized;\n}\n\nfunction canonicalPath(absolutePath: string): string {\n let resolvedPath = path.resolve(absolutePath);\n\n try {\n resolvedPath = fs.realpathSync.native(resolvedPath);\n } catch {\n // A deleted model must still resolve to the key it had before deletion.\n }\n\n return normalizeInputPath(resolvedPath);\n}\n\n/** Internal writer for the container's read-only development model carrier. */\nexport class DevelopmentModelModuleRegistry implements DevelopmentModelModules {\n private readonly entries = new Map<string, StoredEntry>();\n private readonly aliases = new Map<string, string>();\n private readonly listeners = new Set<(entry: DevelopmentModelModuleEntry) => void>();\n\n public get(absolutePath: string): DevelopmentModelModuleEntry | undefined {\n const inputPath = normalizeInputPath(absolutePath);\n const key = this.aliases.get(inputPath) ?? canonicalPath(absolutePath);\n const entry = this.entries.get(key);\n if (entry !== undefined) this.aliases.set(inputPath, key);\n return entry === undefined ? undefined : this.toPublicEntry(entry);\n }\n\n public subscribe(listener: (entry: DevelopmentModelModuleEntry) => void): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n public publish(absolutePath: string, url: string, namespace: object): void {\n const inputPath = normalizeInputPath(absolutePath);\n const key = canonicalPath(absolutePath);\n this.aliases.set(inputPath, key);\n const current = this.entries.get(key);\n\n if (current?.state === \"ready\" && current.namespace === namespace) return;\n\n const entry: StoredEntry = {\n url,\n generation: (current?.generation ?? 0) + 1,\n hasDefault: Object.hasOwn(namespace, \"default\"),\n state: \"ready\",\n namespace,\n };\n this.entries.set(key, entry);\n this.notify(entry);\n }\n\n public remove(absolutePath: string): void {\n const inputPath = normalizeInputPath(absolutePath);\n const key = this.aliases.get(inputPath) ?? canonicalPath(absolutePath);\n this.aliases.set(inputPath, key);\n const current = this.entries.get(key);\n\n if (current?.state === \"removed\") return;\n\n const entry: DevelopmentModelModuleEntry = {\n url: current?.url ?? pathToFileURL(absolutePath).href,\n generation: (current?.generation ?? 0) + 1,\n hasDefault: false,\n state: \"removed\",\n };\n this.entries.set(key, entry);\n this.notify(entry);\n }\n\n private notify(entry: DevelopmentModelModuleEntry): void {\n const publicEntry = this.toPublicEntry(entry);\n for (const listener of this.listeners) listener(publicEntry);\n }\n\n private toPublicEntry(entry: DevelopmentModelModuleEntry): DevelopmentModelModuleEntry {\n return {\n url: entry.url,\n generation: entry.generation,\n hasDefault: entry.hasDefault,\n state: entry.state,\n };\n }\n}\n\nexport function getDevelopmentModelModuleRegistry(): DevelopmentModelModuleRegistry {\n const existing = container.tryGet(\"development.modelModules\");\n\n if (existing instanceof DevelopmentModelModuleRegistry) return existing;\n\n const registry = new DevelopmentModelModuleRegistry();\n container.set(\"development.modelModules\", registry);\n return registry;\n}\n"],"mappings":";;;;;;AAWA,SAAS,mBAAmB,cAA8B;CACxD,MAAM,kBAAkB,KAAK,QAAQ,YAAY,CAAC,CAAC,WAAW,MAAM,GAAG;CACvE,OAAO,QAAQ,aAAa,UAAU,gBAAgB,YAAY,IAAI;AACxE;AAEA,SAAS,cAAc,cAA8B;CACnD,IAAI,eAAe,KAAK,QAAQ,YAAY;CAE5C,IAAI;EACF,eAAe,GAAG,aAAa,OAAO,YAAY;CACpD,QAAQ,CAER;CAEA,OAAO,mBAAmB,YAAY;AACxC;;AAGA,IAAa,iCAAb,MAA+E;;iCAClD,IAAI,IAAyB;iCAC7B,IAAI,IAAoB;mCACtB,IAAI,IAAkD;;CAEnF,AAAO,IAAI,cAA+D;EACxE,MAAM,YAAY,mBAAmB,YAAY;EACjD,MAAM,MAAM,KAAK,QAAQ,IAAI,SAAS,KAAK,cAAc,YAAY;EACrE,MAAM,QAAQ,KAAK,QAAQ,IAAI,GAAG;EAClC,IAAI,UAAU,QAAW,KAAK,QAAQ,IAAI,WAAW,GAAG;EACxD,OAAO,UAAU,SAAY,SAAY,KAAK,cAAc,KAAK;CACnE;CAEA,AAAO,UAAU,UAAoE;EACnF,KAAK,UAAU,IAAI,QAAQ;EAC3B,aAAa,KAAK,UAAU,OAAO,QAAQ;CAC7C;CAEA,AAAO,QAAQ,cAAsB,KAAa,WAAyB;EACzE,MAAM,YAAY,mBAAmB,YAAY;EACjD,MAAM,MAAM,cAAc,YAAY;EACtC,KAAK,QAAQ,IAAI,WAAW,GAAG;EAC/B,MAAM,UAAU,KAAK,QAAQ,IAAI,GAAG;EAEpC,IAAI,SAAS,UAAU,WAAW,QAAQ,cAAc,WAAW;EAEnE,MAAM,QAAqB;GACzB;GACA,aAAa,SAAS,cAAc,KAAK;GACzC,YAAY,OAAO,OAAO,WAAW,SAAS;GAC9C,OAAO;GACP;EACF;EACA,KAAK,QAAQ,IAAI,KAAK,KAAK;EAC3B,KAAK,OAAO,KAAK;CACnB;CAEA,AAAO,OAAO,cAA4B;EACxC,MAAM,YAAY,mBAAmB,YAAY;EACjD,MAAM,MAAM,KAAK,QAAQ,IAAI,SAAS,KAAK,cAAc,YAAY;EACrE,KAAK,QAAQ,IAAI,WAAW,GAAG;EAC/B,MAAM,UAAU,KAAK,QAAQ,IAAI,GAAG;EAEpC,IAAI,SAAS,UAAU,WAAW;EAElC,MAAM,QAAqC;GACzC,KAAK,SAAS,OAAO,cAAc,YAAY,CAAC,CAAC;GACjD,aAAa,SAAS,cAAc,KAAK;GACzC,YAAY;GACZ,OAAO;EACT;EACA,KAAK,QAAQ,IAAI,KAAK,KAAK;EAC3B,KAAK,OAAO,KAAK;CACnB;CAEA,AAAQ,OAAO,OAA0C;EACvD,MAAM,cAAc,KAAK,cAAc,KAAK;EAC5C,KAAK,MAAM,YAAY,KAAK,WAAW,SAAS,WAAW;CAC7D;CAEA,AAAQ,cAAc,OAAiE;EACrF,OAAO;GACL,KAAK,MAAM;GACX,YAAY,MAAM;GAClB,YAAY,MAAM;GAClB,OAAO,MAAM;EACf;CACF;AACF;AAEA,SAAgB,oCAAoE;CAClF,MAAM,WAAW,UAAU,OAAO,0BAA0B;CAE5D,IAAI,oBAAoB,gCAAgC,OAAO;CAE/D,MAAM,WAAW,IAAI,+BAA+B;CACpD,UAAU,IAAI,4BAA4B,QAAQ;CAClD,OAAO;AACT"}
1
+ {"version":3,"file":"model-module-registry.mjs","names":[],"sources":["../../../../../../../../packages/core/src/dev-server/model-module-registry.ts"],"sourcesContent":["import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { container } from \"../container\";\nimport type {\n DevelopmentModelModuleEntry,\n DevelopmentModelModules,\n} from \"../container/development-model-modules\";\n\ntype StoredEntry = DevelopmentModelModuleEntry & { readonly namespace?: object };\n\nfunction normalizeInputPath(absolutePath: string): string {\n const slashNormalized = path.resolve(absolutePath).replaceAll(\"\\\\\", \"/\");\n return process.platform === \"win32\" ? slashNormalized.toLowerCase() : slashNormalized;\n}\n\nfunction canonicalPath(absolutePath: string): string {\n let resolvedPath = path.resolve(absolutePath);\n\n try {\n resolvedPath = fs.realpathSync.native(resolvedPath);\n } catch {\n // A deleted model must still resolve to the key it had before deletion.\n }\n\n return normalizeInputPath(resolvedPath);\n}\n\n/** Internal writer for the container's read-only development model carrier. */\nexport class DevelopmentModelModuleRegistry implements DevelopmentModelModules {\n private readonly entries = new Map<string, StoredEntry>();\n private readonly aliases = new Map<string, string>();\n private readonly listeners = new Set<(entry: DevelopmentModelModuleEntry) => void>();\n\n public get(absolutePath: string): DevelopmentModelModuleEntry | undefined {\n const inputPath = normalizeInputPath(absolutePath);\n const key = this.aliases.get(inputPath) ?? canonicalPath(absolutePath);\n const entry = this.entries.get(key);\n if (entry !== undefined) this.aliases.set(inputPath, key);\n return entry === undefined ? undefined : this.toPublicEntry(entry);\n }\n\n public subscribe(listener: (entry: DevelopmentModelModuleEntry) => void): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n public publish(absolutePath: string, url: string, namespace: object): void {\n const inputPath = normalizeInputPath(absolutePath);\n const key = canonicalPath(absolutePath);\n this.aliases.set(inputPath, key);\n const current = this.entries.get(key);\n\n if (current?.state === \"ready\" && current.namespace === namespace) return;\n\n const entry: StoredEntry = {\n url,\n generation: (current?.generation ?? 0) + 1,\n hasDefault: Object.hasOwn(namespace, \"default\"),\n state: \"ready\",\n namespace,\n };\n this.entries.set(key, entry);\n this.notify(entry);\n }\n\n public remove(absolutePath: string): void {\n const inputPath = normalizeInputPath(absolutePath);\n const key = this.aliases.get(inputPath) ?? canonicalPath(absolutePath);\n this.aliases.set(inputPath, key);\n const current = this.entries.get(key);\n\n if (current?.state === \"removed\") return;\n\n const entry: DevelopmentModelModuleEntry = {\n url: current?.url ?? pathToFileURL(absolutePath).href,\n generation: (current?.generation ?? 0) + 1,\n hasDefault: false,\n state: \"removed\",\n };\n this.entries.set(key, entry);\n this.notify(entry);\n }\n\n private notify(entry: DevelopmentModelModuleEntry): void {\n const publicEntry = this.toPublicEntry(entry);\n for (const listener of this.listeners) listener(publicEntry);\n }\n\n private toPublicEntry(entry: DevelopmentModelModuleEntry): DevelopmentModelModuleEntry {\n return {\n url: entry.url,\n generation: entry.generation,\n hasDefault: entry.hasDefault,\n state: entry.state,\n };\n }\n}\n\nexport function getDevelopmentModelModuleRegistry(): DevelopmentModelModuleRegistry {\n const existing = container.tryGet(\"development.modelModules\");\n\n if (existing instanceof DevelopmentModelModuleRegistry) return existing;\n\n const registry = new DevelopmentModelModuleRegistry();\n container.set(\"development.modelModules\", registry);\n return registry;\n}\n"],"mappings":";;;;;;AAWA,SAAS,mBAAmB,cAA8B;CACxD,MAAM,kBAAkB,KAAK,QAAQ,YAAY,CAAC,CAAC,WAAW,MAAM,GAAG;CACvE,OAAO,QAAQ,aAAa,UAAU,gBAAgB,YAAY,IAAI;AACxE;AAEA,SAAS,cAAc,cAA8B;CACnD,IAAI,eAAe,KAAK,QAAQ,YAAY;CAE5C,IAAI;EACF,eAAe,GAAG,aAAa,OAAO,YAAY;CACpD,QAAQ,CAER;CAEA,OAAO,mBAAmB,YAAY;AACxC;;AAGA,IAAa,iCAAb,MAA+E;;iCAClD,IAAI,IAAyB;iCAC7B,IAAI,IAAoB;mCACtB,IAAI,IAAkD;;CAEnF,AAAO,IAAI,cAA+D;EACxE,MAAM,YAAY,mBAAmB,YAAY;EACjD,MAAM,MAAM,KAAK,QAAQ,IAAI,SAAS,KAAK,cAAc,YAAY;EACrE,MAAM,QAAQ,KAAK,QAAQ,IAAI,GAAG;EAClC,IAAI,UAAU,QAAW,KAAK,QAAQ,IAAI,WAAW,GAAG;EACxD,OAAO,UAAU,SAAY,SAAY,KAAK,cAAc,KAAK;CACnE;CAEA,AAAO,UAAU,UAAoE;EACnF,KAAK,UAAU,IAAI,QAAQ;EAC3B,aAAa,KAAK,UAAU,OAAO,QAAQ;CAC7C;CAEA,AAAO,QAAQ,cAAsB,KAAa,WAAyB;EACzE,MAAM,YAAY,mBAAmB,YAAY;EACjD,MAAM,MAAM,cAAc,YAAY;EACtC,KAAK,QAAQ,IAAI,WAAW,GAAG;EAC/B,MAAM,UAAU,KAAK,QAAQ,IAAI,GAAG;EAEpC,IAAI,SAAS,UAAU,WAAW,QAAQ,cAAc,WAAW;EAEnE,MAAM,QAAqB;GACzB;GACA,aAAa,SAAS,cAAc,KAAK;GACzC,YAAY,OAAO,OAAO,WAAW,SAAS;GAC9C,OAAO;GACP;EACF;EACA,KAAK,QAAQ,IAAI,KAAK,KAAK;EAC3B,KAAK,OAAO,KAAK;CACnB;CAEA,AAAO,OAAO,cAA4B;EACxC,MAAM,YAAY,mBAAmB,YAAY;EACjD,MAAM,MAAM,KAAK,QAAQ,IAAI,SAAS,KAAK,cAAc,YAAY;EACrE,KAAK,QAAQ,IAAI,WAAW,GAAG;EAC/B,MAAM,UAAU,KAAK,QAAQ,IAAI,GAAG;EAEpC,IAAI,SAAS,UAAU,WAAW;EAElC,MAAM,QAAqC;GACzC,KAAK,SAAS,OAAO,cAAc,YAAY,CAAC,CAAC;GACjD,aAAa,SAAS,cAAc,KAAK;GACzC,YAAY;GACZ,OAAO;EACT;EACA,KAAK,QAAQ,IAAI,KAAK,KAAK;EAC3B,KAAK,OAAO,KAAK;CACnB;CAEA,AAAQ,OAAO,OAA0C;EACvD,MAAM,cAAc,KAAK,cAAc,KAAK;EAC5C,KAAK,MAAM,YAAY,KAAK,WAAW,SAAS,WAAW;CAC7D;CAEA,AAAQ,cAAc,OAAiE;EACrF,OAAO;GACL,KAAK,MAAM;GACX,YAAY,MAAM;GAClB,YAAY,MAAM;GAClB,OAAO,MAAM;EACf;CACF;AACF;AAEA,SAAgB,oCAAoE;CAClF,MAAM,WAAW,UAAU,OAAO,0BAA0B;CAE5D,IAAI,oBAAoB,gCAAgC,OAAO;CAE/D,MAAM,WAAW,IAAI,+BAA+B;CACpD,UAAU,IAAI,4BAA4B,QAAQ;CAClD,OAAO;AACT"}
@@ -2,7 +2,7 @@ import { dirname, isAbsolute, relative } from "node:path";
2
2
  import { mkdir, readFile, rename, rm, writeFile } from "node:fs/promises";
3
3
  import ts from "typescript";
4
4
 
5
- //#region ../core/src/dev-server/model-resource-typings.ts
5
+ //#region ../../packages/core/src/dev-server/model-resource-typings.ts
6
6
  const IDENTIFIER = /^[A-Za-z_$][A-Za-z0-9_$]*$/;
7
7
  function hasModifier(node, kind) {
8
8
  return ts.canHaveModifiers(node) && (ts.getModifiers(node)?.some((m) => m.kind === kind) ?? false);
@@ -1 +1 @@
1
- {"version":3,"file":"model-resource-typings.mjs","names":[],"sources":["../../../../../../../core/src/dev-server/model-resource-typings.ts"],"sourcesContent":["import { mkdir, readFile, rename, rm, writeFile } from \"node:fs/promises\";\nimport { dirname, isAbsolute, relative } from \"node:path\";\nimport ts from \"typescript\";\n\n/**\n * Static `ModelResourceRegistry` generation.\n *\n * `Serialized<User>` can only resolve a model to its resource output through an\n * entry in the augmentable `ModelResourceRegistry` (see `http/serialized.ts`).\n * This module derives those entries from source: a model class that declares\n * `static resource = UserResource` produces\n *\n * ```ts\n * \"User\": { model: import(\"<model file>\").User; resource: typeof import(\"<resource file>\").UserResource };\n * ```\n *\n * Everything here is syntactic. It reads one `ts.createSourceFile` AST per model\n * file, follows the identifier through that file's own imports, and never\n * imports or executes application code (`read-config-ast.ts` explains why a\n * type checker is not an option). Anything it cannot prove from the AST alone\n * (a computed expression, `lazy(...)`, a namespace import, a class that is not\n * exported) is skipped, and nothing is recorded for it: a guessed entry would\n * make `Serialized` lie, which is worse than the raw-data type it falls back to.\n */\n\n/** One model class whose resource could be resolved statically. */\nexport type ModelResourceEntry = {\n /** The model class name (the registry key before de-duplication). */\n className: string;\n /** Absolute path of the model file. */\n modelFile: string;\n /** How the model file exports the class: its export name, or `\"default\"`. */\n modelExport: string;\n /** Absolute path of the module that exports the resource. */\n resourceFile: string;\n /** How that module exports the resource: its export name, or `\"default\"`. */\n resourceExport: string;\n};\n\n/** A model that declares `static resource` but could not be resolved. */\nexport type SkippedModelResource = {\n className: string;\n modelFile: string;\n reason: string;\n};\n\nexport type ModelResourceExtraction = {\n entries: ModelResourceEntry[];\n skipped: SkippedModelResource[];\n};\n\nexport type ExtractModelResourcesInput = {\n /** Source text of the model file. */\n source: string;\n /** Absolute path of the model file. */\n absolutePath: string;\n /**\n * Resolve an import specifier of the model file (relative or tsconfig alias) to\n * an absolute file path, or `undefined` when it does not point at app source.\n */\n resolveImport: (specifier: string) => string | undefined;\n};\n\ntype ImportBinding = { specifier: string; exportName: string };\n\nconst IDENTIFIER = /^[A-Za-z_$][A-Za-z0-9_$]*$/;\n\nfunction hasModifier(node: ts.Node, kind: ts.SyntaxKind): boolean {\n return ts.canHaveModifiers(node) && (ts.getModifiers(node)?.some((m) => m.kind === kind) ?? false);\n}\n\nfunction unwrapParentheses(expression: ts.Expression): ts.Expression {\n let current = expression;\n\n while (ts.isParenthesizedExpression(current)) {\n current = current.expression;\n }\n\n return current;\n}\n\n/** Top-level names this file declares, and the names each is exported under. */\nfunction readLocalDeclarations(sourceFile: ts.SourceFile): {\n declared: Set<string>;\n exportNames: Map<string, string[]>;\n} {\n const declared = new Set<string>();\n const exportNames = new Map<string, string[]>();\n\n const addExport = (local: string, exported: string): void => {\n const names = exportNames.get(local) ?? [];\n\n names.push(exported);\n exportNames.set(local, names);\n };\n\n for (const statement of sourceFile.statements) {\n const exported = hasModifier(statement, ts.SyntaxKind.ExportKeyword);\n const isDefault = hasModifier(statement, ts.SyntaxKind.DefaultKeyword);\n\n if (\n (ts.isClassDeclaration(statement) ||\n ts.isFunctionDeclaration(statement) ||\n ts.isEnumDeclaration(statement)) &&\n statement.name\n ) {\n declared.add(statement.name.text);\n\n if (exported) {\n addExport(statement.name.text, isDefault ? \"default\" : statement.name.text);\n }\n\n continue;\n }\n\n if (ts.isVariableStatement(statement)) {\n for (const declaration of statement.declarationList.declarations) {\n if (!ts.isIdentifier(declaration.name)) continue;\n\n declared.add(declaration.name.text);\n\n if (exported) {\n addExport(declaration.name.text, declaration.name.text);\n }\n }\n\n continue;\n }\n\n // `export { A, B as C }` (local form only; a `from` clause re-exports a foreign name).\n if (\n ts.isExportDeclaration(statement) &&\n !statement.moduleSpecifier &&\n !statement.isTypeOnly &&\n statement.exportClause &&\n ts.isNamedExports(statement.exportClause)\n ) {\n for (const element of statement.exportClause.elements) {\n if (element.isTypeOnly) continue;\n\n addExport((element.propertyName ?? element.name).text, element.name.text);\n }\n\n continue;\n }\n\n // `export default UserResource;`\n if (\n ts.isExportAssignment(statement) &&\n !statement.isExportEquals &&\n ts.isIdentifier(statement.expression)\n ) {\n addExport(statement.expression.text, \"default\");\n }\n }\n\n return { declared, exportNames };\n}\n\n/** Prefer a named export over `default`; among named exports, the first sorted. */\nfunction pickExportName(names: readonly string[] | undefined): string | undefined {\n if (!names || names.length === 0) return undefined;\n\n const named = names.filter((name) => name !== \"default\").sort();\n\n return named[0] ?? \"default\";\n}\n\nfunction readImportBindings(sourceFile: ts.SourceFile): Map<string, ImportBinding> {\n const bindings = new Map<string, ImportBinding>();\n\n for (const statement of sourceFile.statements) {\n if (!ts.isImportDeclaration(statement) || !ts.isStringLiteral(statement.moduleSpecifier)) {\n continue;\n }\n\n const clause = statement.importClause;\n const specifier = statement.moduleSpecifier.text;\n\n if (!clause) continue;\n\n if (clause.name) {\n bindings.set(clause.name.text, { specifier, exportName: \"default\" });\n }\n\n // A namespace import (`import * as ns`) cannot be the bare identifier a\n // `static resource = X` reads, so it never becomes a binding.\n if (clause.namedBindings && ts.isNamedImports(clause.namedBindings)) {\n for (const element of clause.namedBindings.elements) {\n bindings.set(element.name.text, {\n specifier,\n exportName: (element.propertyName ?? element.name).text,\n });\n }\n }\n }\n\n return bindings;\n}\n\n/** The identifier a class assigns to `static resource`, when it is a bare identifier. */\nfunction readStaticResourceReference(\n member: ts.ClassElement,\n): { name: string } | \"computed\" | undefined {\n if (!ts.isPropertyDeclaration(member)) return undefined;\n if (!hasModifier(member, ts.SyntaxKind.StaticKeyword)) return undefined;\n if (hasModifier(member, ts.SyntaxKind.DeclareKeyword)) return undefined;\n\n const isResourceName =\n (ts.isIdentifier(member.name) || ts.isStringLiteral(member.name)) &&\n member.name.text === \"resource\";\n\n if (!isResourceName) return undefined;\n if (!member.initializer) return undefined;\n\n const initializer = unwrapParentheses(member.initializer);\n\n return ts.isIdentifier(initializer) ? { name: initializer.text } : \"computed\";\n}\n\n/**\n * Read every model class of one file that declares `static resource = <Identifier>`\n * and resolve it to a model export plus a resource export. Pure: the only\n * outside knowledge is the injected {@link ExtractModelResourcesInput.resolveImport}.\n */\nexport function extractModelResourceEntries(\n input: ExtractModelResourcesInput,\n): ModelResourceExtraction {\n const result: ModelResourceExtraction = { entries: [], skipped: [] };\n\n // Cheap exit: most model files declare no resource.\n if (!input.source.includes(\"resource\")) return result;\n\n const sourceFile = ts.createSourceFile(\n input.absolutePath,\n input.source,\n ts.ScriptTarget.ESNext,\n /* setParentNodes */ false,\n input.absolutePath.endsWith(\"x\") ? ts.ScriptKind.TSX : ts.ScriptKind.TS,\n );\n\n const { declared, exportNames } = readLocalDeclarations(sourceFile);\n const imports = readImportBindings(sourceFile);\n\n for (const statement of sourceFile.statements) {\n if (!ts.isClassDeclaration(statement) || !statement.name) continue;\n\n const className = statement.name.text;\n\n let reference: { name: string } | \"computed\" | undefined;\n\n for (const member of statement.members) {\n reference = readStaticResourceReference(member) ?? reference;\n }\n\n if (reference === undefined) continue;\n\n const skip = (reason: string): void => {\n result.skipped.push({ className, modelFile: input.absolutePath, reason });\n };\n\n if (reference === \"computed\") {\n skip(\"`static resource` is not a plain identifier\");\n continue;\n }\n\n const requiresTypeArguments = statement.typeParameters?.some(\n (parameter) => parameter.default === undefined,\n );\n\n if (requiresTypeArguments) {\n skip(\"the model class is generic\");\n continue;\n }\n\n const modelExport = pickExportName(exportNames.get(className));\n\n if (modelExport === undefined) {\n skip(\"the model class is not exported\");\n continue;\n }\n\n if (modelExport !== \"default\" && !IDENTIFIER.test(modelExport)) {\n skip(\"the model export name is not an identifier\");\n continue;\n }\n\n const binding = imports.get(reference.name);\n\n let resourceFile: string | undefined;\n let resourceExport: string | undefined;\n\n if (binding) {\n resourceFile = input.resolveImport(binding.specifier);\n resourceExport = binding.exportName;\n } else if (declared.has(reference.name)) {\n resourceFile = input.absolutePath;\n resourceExport = pickExportName(exportNames.get(reference.name));\n }\n\n if (resourceFile === undefined || resourceExport === undefined) {\n skip(`\\`${reference.name}\\` cannot be resolved to an exported module member`);\n continue;\n }\n\n if (resourceExport !== \"default\" && !IDENTIFIER.test(resourceExport)) {\n skip(\"the resource export name is not an identifier\");\n continue;\n }\n\n result.entries.push({\n className,\n modelFile: input.absolutePath,\n modelExport,\n resourceFile,\n resourceExport,\n });\n }\n\n return result;\n}\n\n/** Module specifier, relative to the typings directory, without a TypeScript extension. */\nfunction toTypeImportSpecifier(typingsDirectory: string, absoluteFile: string): string | undefined {\n const path = relative(typingsDirectory, absoluteFile).replaceAll(\"\\\\\", \"/\");\n\n // A different drive (Windows) has no relative form; do not emit a guess.\n if (isAbsolute(path)) return undefined;\n\n const withoutExtension = path.replace(/\\.(?:d\\.)?(?:ts|tsx|mts|cts)$/, \"\");\n\n return withoutExtension.startsWith(\".\") ? withoutExtension : `./${withoutExtension}`;\n}\n\n/**\n * Registry keys: the class name, suffixed `_2`, `_3`, ... when several model\n * files declare the same class name. Order is by class name, then by file path,\n * so the same set of models always yields the same keys and the same text.\n */\nexport function assignRegistryKeys(\n entries: readonly ModelResourceEntry[],\n): Array<{ key: string; entry: ModelResourceEntry }> {\n const sorted = [...entries].sort(\n (a, b) =>\n a.className.localeCompare(b.className, \"en\") ||\n a.modelFile.localeCompare(b.modelFile, \"en\") ||\n a.modelExport.localeCompare(b.modelExport, \"en\"),\n );\n\n const taken = new Set<string>();\n const counts = new Map<string, number>();\n\n return sorted.map((entry) => {\n let count = (counts.get(entry.className) ?? 0) + 1;\n let key = count === 1 ? entry.className : `${entry.className}_${count}`;\n\n while (taken.has(key)) {\n count += 1;\n key = `${entry.className}_${count}`;\n }\n\n counts.set(entry.className, count);\n taken.add(key);\n\n return { key, entry };\n });\n}\n\n/**\n * Text of the generated declaration file.\n *\n * @param entries Every resolved model, in any order.\n * @param typingsDirectory Absolute directory the file is written to; import\n * specifiers are relative to it.\n */\nexport function renderModelResourceRegistry(\n entries: readonly ModelResourceEntry[],\n typingsDirectory: string,\n): string {\n const lines: string[] = [];\n\n for (const { key, entry } of assignRegistryKeys(entries)) {\n const modelPath = toTypeImportSpecifier(typingsDirectory, entry.modelFile);\n const resourcePath = toTypeImportSpecifier(typingsDirectory, entry.resourceFile);\n\n if (modelPath === undefined || resourcePath === undefined) continue;\n\n const model = `import(${JSON.stringify(modelPath)}).${entry.modelExport}`;\n const resource = `typeof import(${JSON.stringify(resourcePath)}).${entry.resourceExport}`;\n\n lines.push(` ${JSON.stringify(key)}: { model: ${model}; resource: ${resource} };`);\n }\n\n return `// Auto-generated by Warlock.js - DO NOT EDIT\n// One entry per model class that declares \\`static resource = <Resource>\\`, so\n// \\`Serialized<Model>\\` resolves to the resource output. Models whose resource\n// cannot be resolved statically are left out.\n\nimport \"@warlock.js/core\";\n\ndeclare module \"@warlock.js/core\" {\n interface ModelResourceRegistry {\n${lines.join(\"\\n\")}\n }\n}\n`;\n}\n\n/**\n * Write `content` to `filePath` through a temporary sibling and a rename, so a\n * reader (the editor's TypeScript server) never sees a half-written file, and\n * skip the write entirely when the file already holds exactly this text.\n *\n * @returns `true` when the file was written.\n */\nexport async function writeFileIfChanged(filePath: string, content: string): Promise<boolean> {\n try {\n if ((await readFile(filePath, \"utf-8\")) === content) return false;\n } catch {\n // Missing file: write it.\n }\n\n await mkdir(dirname(filePath), { recursive: true });\n\n const temporaryPath = `${filePath}.${process.pid}.tmp`;\n\n try {\n await writeFile(temporaryPath, content, \"utf-8\");\n await rename(temporaryPath, filePath);\n } catch (error) {\n await rm(temporaryPath, { force: true });\n\n throw error;\n }\n\n return true;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"model-resource-typings.mjs","names":[],"sources":["../../../../../../../../packages/core/src/dev-server/model-resource-typings.ts"],"sourcesContent":["import { mkdir, readFile, rename, rm, writeFile } from \"node:fs/promises\";\nimport { dirname, isAbsolute, relative } from \"node:path\";\nimport ts from \"typescript\";\n\n/**\n * Static `ModelResourceRegistry` generation.\n *\n * `Serialized<User>` can only resolve a model to its resource output through an\n * entry in the augmentable `ModelResourceRegistry` (see `http/serialized.ts`).\n * This module derives those entries from source: a model class that declares\n * `static resource = UserResource` produces\n *\n * ```ts\n * \"User\": { model: import(\"<model file>\").User; resource: typeof import(\"<resource file>\").UserResource };\n * ```\n *\n * Everything here is syntactic. It reads one `ts.createSourceFile` AST per model\n * file, follows the identifier through that file's own imports, and never\n * imports or executes application code (`read-config-ast.ts` explains why a\n * type checker is not an option). Anything it cannot prove from the AST alone\n * (a computed expression, `lazy(...)`, a namespace import, a class that is not\n * exported) is skipped, and nothing is recorded for it: a guessed entry would\n * make `Serialized` lie, which is worse than the raw-data type it falls back to.\n */\n\n/** One model class whose resource could be resolved statically. */\nexport type ModelResourceEntry = {\n /** The model class name (the registry key before de-duplication). */\n className: string;\n /** Absolute path of the model file. */\n modelFile: string;\n /** How the model file exports the class: its export name, or `\"default\"`. */\n modelExport: string;\n /** Absolute path of the module that exports the resource. */\n resourceFile: string;\n /** How that module exports the resource: its export name, or `\"default\"`. */\n resourceExport: string;\n};\n\n/** A model that declares `static resource` but could not be resolved. */\nexport type SkippedModelResource = {\n className: string;\n modelFile: string;\n reason: string;\n};\n\nexport type ModelResourceExtraction = {\n entries: ModelResourceEntry[];\n skipped: SkippedModelResource[];\n};\n\nexport type ExtractModelResourcesInput = {\n /** Source text of the model file. */\n source: string;\n /** Absolute path of the model file. */\n absolutePath: string;\n /**\n * Resolve an import specifier of the model file (relative or tsconfig alias) to\n * an absolute file path, or `undefined` when it does not point at app source.\n */\n resolveImport: (specifier: string) => string | undefined;\n};\n\ntype ImportBinding = { specifier: string; exportName: string };\n\nconst IDENTIFIER = /^[A-Za-z_$][A-Za-z0-9_$]*$/;\n\nfunction hasModifier(node: ts.Node, kind: ts.SyntaxKind): boolean {\n return ts.canHaveModifiers(node) && (ts.getModifiers(node)?.some((m) => m.kind === kind) ?? false);\n}\n\nfunction unwrapParentheses(expression: ts.Expression): ts.Expression {\n let current = expression;\n\n while (ts.isParenthesizedExpression(current)) {\n current = current.expression;\n }\n\n return current;\n}\n\n/** Top-level names this file declares, and the names each is exported under. */\nfunction readLocalDeclarations(sourceFile: ts.SourceFile): {\n declared: Set<string>;\n exportNames: Map<string, string[]>;\n} {\n const declared = new Set<string>();\n const exportNames = new Map<string, string[]>();\n\n const addExport = (local: string, exported: string): void => {\n const names = exportNames.get(local) ?? [];\n\n names.push(exported);\n exportNames.set(local, names);\n };\n\n for (const statement of sourceFile.statements) {\n const exported = hasModifier(statement, ts.SyntaxKind.ExportKeyword);\n const isDefault = hasModifier(statement, ts.SyntaxKind.DefaultKeyword);\n\n if (\n (ts.isClassDeclaration(statement) ||\n ts.isFunctionDeclaration(statement) ||\n ts.isEnumDeclaration(statement)) &&\n statement.name\n ) {\n declared.add(statement.name.text);\n\n if (exported) {\n addExport(statement.name.text, isDefault ? \"default\" : statement.name.text);\n }\n\n continue;\n }\n\n if (ts.isVariableStatement(statement)) {\n for (const declaration of statement.declarationList.declarations) {\n if (!ts.isIdentifier(declaration.name)) continue;\n\n declared.add(declaration.name.text);\n\n if (exported) {\n addExport(declaration.name.text, declaration.name.text);\n }\n }\n\n continue;\n }\n\n // `export { A, B as C }` (local form only; a `from` clause re-exports a foreign name).\n if (\n ts.isExportDeclaration(statement) &&\n !statement.moduleSpecifier &&\n !statement.isTypeOnly &&\n statement.exportClause &&\n ts.isNamedExports(statement.exportClause)\n ) {\n for (const element of statement.exportClause.elements) {\n if (element.isTypeOnly) continue;\n\n addExport((element.propertyName ?? element.name).text, element.name.text);\n }\n\n continue;\n }\n\n // `export default UserResource;`\n if (\n ts.isExportAssignment(statement) &&\n !statement.isExportEquals &&\n ts.isIdentifier(statement.expression)\n ) {\n addExport(statement.expression.text, \"default\");\n }\n }\n\n return { declared, exportNames };\n}\n\n/** Prefer a named export over `default`; among named exports, the first sorted. */\nfunction pickExportName(names: readonly string[] | undefined): string | undefined {\n if (!names || names.length === 0) return undefined;\n\n const named = names.filter((name) => name !== \"default\").sort();\n\n return named[0] ?? \"default\";\n}\n\nfunction readImportBindings(sourceFile: ts.SourceFile): Map<string, ImportBinding> {\n const bindings = new Map<string, ImportBinding>();\n\n for (const statement of sourceFile.statements) {\n if (!ts.isImportDeclaration(statement) || !ts.isStringLiteral(statement.moduleSpecifier)) {\n continue;\n }\n\n const clause = statement.importClause;\n const specifier = statement.moduleSpecifier.text;\n\n if (!clause) continue;\n\n if (clause.name) {\n bindings.set(clause.name.text, { specifier, exportName: \"default\" });\n }\n\n // A namespace import (`import * as ns`) cannot be the bare identifier a\n // `static resource = X` reads, so it never becomes a binding.\n if (clause.namedBindings && ts.isNamedImports(clause.namedBindings)) {\n for (const element of clause.namedBindings.elements) {\n bindings.set(element.name.text, {\n specifier,\n exportName: (element.propertyName ?? element.name).text,\n });\n }\n }\n }\n\n return bindings;\n}\n\n/** The identifier a class assigns to `static resource`, when it is a bare identifier. */\nfunction readStaticResourceReference(\n member: ts.ClassElement,\n): { name: string } | \"computed\" | undefined {\n if (!ts.isPropertyDeclaration(member)) return undefined;\n if (!hasModifier(member, ts.SyntaxKind.StaticKeyword)) return undefined;\n if (hasModifier(member, ts.SyntaxKind.DeclareKeyword)) return undefined;\n\n const isResourceName =\n (ts.isIdentifier(member.name) || ts.isStringLiteral(member.name)) &&\n member.name.text === \"resource\";\n\n if (!isResourceName) return undefined;\n if (!member.initializer) return undefined;\n\n const initializer = unwrapParentheses(member.initializer);\n\n return ts.isIdentifier(initializer) ? { name: initializer.text } : \"computed\";\n}\n\n/**\n * Read every model class of one file that declares `static resource = <Identifier>`\n * and resolve it to a model export plus a resource export. Pure: the only\n * outside knowledge is the injected {@link ExtractModelResourcesInput.resolveImport}.\n */\nexport function extractModelResourceEntries(\n input: ExtractModelResourcesInput,\n): ModelResourceExtraction {\n const result: ModelResourceExtraction = { entries: [], skipped: [] };\n\n // Cheap exit: most model files declare no resource.\n if (!input.source.includes(\"resource\")) return result;\n\n const sourceFile = ts.createSourceFile(\n input.absolutePath,\n input.source,\n ts.ScriptTarget.ESNext,\n /* setParentNodes */ false,\n input.absolutePath.endsWith(\"x\") ? ts.ScriptKind.TSX : ts.ScriptKind.TS,\n );\n\n const { declared, exportNames } = readLocalDeclarations(sourceFile);\n const imports = readImportBindings(sourceFile);\n\n for (const statement of sourceFile.statements) {\n if (!ts.isClassDeclaration(statement) || !statement.name) continue;\n\n const className = statement.name.text;\n\n let reference: { name: string } | \"computed\" | undefined;\n\n for (const member of statement.members) {\n reference = readStaticResourceReference(member) ?? reference;\n }\n\n if (reference === undefined) continue;\n\n const skip = (reason: string): void => {\n result.skipped.push({ className, modelFile: input.absolutePath, reason });\n };\n\n if (reference === \"computed\") {\n skip(\"`static resource` is not a plain identifier\");\n continue;\n }\n\n const requiresTypeArguments = statement.typeParameters?.some(\n (parameter) => parameter.default === undefined,\n );\n\n if (requiresTypeArguments) {\n skip(\"the model class is generic\");\n continue;\n }\n\n const modelExport = pickExportName(exportNames.get(className));\n\n if (modelExport === undefined) {\n skip(\"the model class is not exported\");\n continue;\n }\n\n if (modelExport !== \"default\" && !IDENTIFIER.test(modelExport)) {\n skip(\"the model export name is not an identifier\");\n continue;\n }\n\n const binding = imports.get(reference.name);\n\n let resourceFile: string | undefined;\n let resourceExport: string | undefined;\n\n if (binding) {\n resourceFile = input.resolveImport(binding.specifier);\n resourceExport = binding.exportName;\n } else if (declared.has(reference.name)) {\n resourceFile = input.absolutePath;\n resourceExport = pickExportName(exportNames.get(reference.name));\n }\n\n if (resourceFile === undefined || resourceExport === undefined) {\n skip(`\\`${reference.name}\\` cannot be resolved to an exported module member`);\n continue;\n }\n\n if (resourceExport !== \"default\" && !IDENTIFIER.test(resourceExport)) {\n skip(\"the resource export name is not an identifier\");\n continue;\n }\n\n result.entries.push({\n className,\n modelFile: input.absolutePath,\n modelExport,\n resourceFile,\n resourceExport,\n });\n }\n\n return result;\n}\n\n/** Module specifier, relative to the typings directory, without a TypeScript extension. */\nfunction toTypeImportSpecifier(typingsDirectory: string, absoluteFile: string): string | undefined {\n const path = relative(typingsDirectory, absoluteFile).replaceAll(\"\\\\\", \"/\");\n\n // A different drive (Windows) has no relative form; do not emit a guess.\n if (isAbsolute(path)) return undefined;\n\n const withoutExtension = path.replace(/\\.(?:d\\.)?(?:ts|tsx|mts|cts)$/, \"\");\n\n return withoutExtension.startsWith(\".\") ? withoutExtension : `./${withoutExtension}`;\n}\n\n/**\n * Registry keys: the class name, suffixed `_2`, `_3`, ... when several model\n * files declare the same class name. Order is by class name, then by file path,\n * so the same set of models always yields the same keys and the same text.\n */\nexport function assignRegistryKeys(\n entries: readonly ModelResourceEntry[],\n): Array<{ key: string; entry: ModelResourceEntry }> {\n const sorted = [...entries].sort(\n (a, b) =>\n a.className.localeCompare(b.className, \"en\") ||\n a.modelFile.localeCompare(b.modelFile, \"en\") ||\n a.modelExport.localeCompare(b.modelExport, \"en\"),\n );\n\n const taken = new Set<string>();\n const counts = new Map<string, number>();\n\n return sorted.map((entry) => {\n let count = (counts.get(entry.className) ?? 0) + 1;\n let key = count === 1 ? entry.className : `${entry.className}_${count}`;\n\n while (taken.has(key)) {\n count += 1;\n key = `${entry.className}_${count}`;\n }\n\n counts.set(entry.className, count);\n taken.add(key);\n\n return { key, entry };\n });\n}\n\n/**\n * Text of the generated declaration file.\n *\n * @param entries Every resolved model, in any order.\n * @param typingsDirectory Absolute directory the file is written to; import\n * specifiers are relative to it.\n */\nexport function renderModelResourceRegistry(\n entries: readonly ModelResourceEntry[],\n typingsDirectory: string,\n): string {\n const lines: string[] = [];\n\n for (const { key, entry } of assignRegistryKeys(entries)) {\n const modelPath = toTypeImportSpecifier(typingsDirectory, entry.modelFile);\n const resourcePath = toTypeImportSpecifier(typingsDirectory, entry.resourceFile);\n\n if (modelPath === undefined || resourcePath === undefined) continue;\n\n const model = `import(${JSON.stringify(modelPath)}).${entry.modelExport}`;\n const resource = `typeof import(${JSON.stringify(resourcePath)}).${entry.resourceExport}`;\n\n lines.push(` ${JSON.stringify(key)}: { model: ${model}; resource: ${resource} };`);\n }\n\n return `// Auto-generated by Warlock.js - DO NOT EDIT\n// One entry per model class that declares \\`static resource = <Resource>\\`, so\n// \\`Serialized<Model>\\` resolves to the resource output. Models whose resource\n// cannot be resolved statically are left out.\n\nimport \"@warlock.js/core\";\n\ndeclare module \"@warlock.js/core\" {\n interface ModelResourceRegistry {\n${lines.join(\"\\n\")}\n }\n}\n`;\n}\n\n/**\n * Write `content` to `filePath` through a temporary sibling and a rename, so a\n * reader (the editor's TypeScript server) never sees a half-written file, and\n * skip the write entirely when the file already holds exactly this text.\n *\n * @returns `true` when the file was written.\n */\nexport async function writeFileIfChanged(filePath: string, content: string): Promise<boolean> {\n try {\n if ((await readFile(filePath, \"utf-8\")) === content) return false;\n } catch {\n // Missing file: write it.\n }\n\n await mkdir(dirname(filePath), { recursive: true });\n\n const temporaryPath = `${filePath}.${process.pid}.tmp`;\n\n try {\n await writeFile(temporaryPath, content, \"utf-8\");\n await rename(temporaryPath, filePath);\n } catch (error) {\n await rm(temporaryPath, { force: true });\n\n throw error;\n }\n\n return true;\n}\n"],"mappings":"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"}
@@ -9,7 +9,7 @@ import { getDevelopmentModelModuleRegistry } from "./model-module-registry.mjs";
9
9
  import { pathToFileURL } from "node:url";
10
10
  import ts from "typescript";
11
11
 
12
- //#region ../core/src/dev-server/module-loader.ts
12
+ //#region ../../packages/core/src/dev-server/module-loader.ts
13
13
  /**
14
14
  * Thrown when a special file (route/event/main/locale) fails to import or
15
15
  * register. Carries the file that failed and the original cause so a broken
@@ -1 +1 @@
1
- {"version":3,"file":"module-loader.mjs","names":[],"sources":["../../../../../../../core/src/dev-server/module-loader.ts"],"sourcesContent":["import { pathToFileURL } from \"node:url\";\nimport ts from \"typescript\";\nimport { importAppModule } from \"../loader/app-module-importer\";\nimport { registerGroupedTranslationKeys, registerLocaleDictionary } from \"../localization\";\nimport { router } from \"../router/router\";\nimport { devLogError, formatModuleNotFoundError } from \"./dev-logger\";\nimport { extractTranslationKeys } from \"./extract-translation-keys\";\nimport type { CleanupFunction, FileManager } from \"./file-manager\";\nimport { warnForLegacyLocales } from \"./legacy-locales-warning\";\nimport { getDevelopmentModelModuleRegistry } from \"./model-module-registry\";\nimport type { SpecialFileType, SpecialFilesCollector } from \"./special-files-collector\";\n\ndeclare global {\n var __currentModuleFile: FileManager | undefined;\n}\n\n/**\n * Thrown when a special file (route/event/main/locale) fails to import or\n * register. Carries the file that failed and the original cause so a broken\n * module surfaces with its origin instead of vanishing into a 404.\n */\nexport class ModuleLoadError extends Error {\n public constructor(\n public readonly type: string,\n public readonly file: FileManager,\n public readonly cause: unknown,\n ) {\n const reason = cause instanceof Error ? cause.message : String(cause);\n super(`Failed to load ${type}: ${file.relativePath} - ${reason}`);\n this.name = \"ModuleLoadError\";\n }\n}\n\n/**\n * The \"special\" file kinds that the dev server eagerly imports at boot.\n * Order matters: locales first (used by everything), events before main so\n * listeners are registered when main runs, routes after main so handlers are\n * bound, worker last so scheduled jobs and queue definitions see routes\n * already registered. Dev always loads worker files since dev runs every role.\n */\nconst SPECIAL_TYPES: readonly SpecialFileType[] = [\n \"locale\",\n \"event\",\n \"main\",\n \"route\",\n \"worker\",\n] as const;\n\n/**\n * Loads application modules through the ESM loader hook. The hook stamps\n * `?v=N` on every import, so each reload is a fresh module without any\n * userland cache-busting plumbing.\n */\nexport class ModuleLoader {\n private readonly loadedModules = new Map<string, unknown>();\n\n public constructor(private readonly specialFilesCollector: SpecialFilesCollector) {\n // Web creates its Vite bridge after Core's development orchestration has\n // constructed ModuleLoader. Create the carrier now so a zero-model app can\n // subscribe before a model is added later through HMR.\n getDevelopmentModelModuleRegistry();\n }\n\n /**\n * Eagerly load every special file at boot, in the canonical order so\n * later phases (e.g. routes) see state earlier phases registered.\n *\n * A failing module no longer vanishes silently: each failure is collected\n * (so one broken file doesn't hide the others) and, once every file has been\n * attempted, an aggregate error is thrown. The boot callers\n * (`DevelopmentServer.start`, the HTTP test bootstrap) already wrap this in a\n * try/catch that logs and aborts the boot — so a broken route module aborts\n * boot loudly rather than booting into a surface that 404s.\n */\n public async loadAll(\n options: { onBeforeLoad?: (file: FileManager) => void | Promise<void> } = {},\n ): Promise<void> {\n const failures: ModuleLoadError[] = [];\n\n for (const type of SPECIAL_TYPES) {\n for (const file of this.specialFilesCollector.getFilesByType(type)) {\n try {\n await options.onBeforeLoad?.(file);\n await this.loadModule(file, type);\n } catch (error) {\n failures.push(\n error instanceof ModuleLoadError ? error : new ModuleLoadError(type, file, error),\n );\n }\n }\n }\n\n if (failures.length > 0) {\n throw new AggregateError(\n failures,\n `${failures.length} module(s) failed to load during boot:\\n` +\n failures.map((failure) => ` - ${failure.message}`).join(\"\\n\"),\n );\n }\n }\n\n /**\n * Import a file through the loader hook. For routes, scopes the import in\n * `router.withSourceFile()` so the added routes carry their origin.\n */\n public async loadModule<T = unknown>(file: FileManager, type: string): Promise<T | undefined> {\n if (file.relativePath.endsWith(\".env\")) return undefined;\n\n if (type === \"locale\" && /\\/utils\\/locales\\.(ts|tsx)$/.test(file.relativePath)) {\n warnForLegacyLocales(\n this.specialFilesCollector.getFilesByType(\"locale\").map((locale) => locale.relativePath),\n );\n }\n\n if (type === \"locale\" && file.relativePath.endsWith(\".json\")) {\n const cleanup = registerLocaleDictionary({\n sourceFile: file.relativePath,\n source: file.source,\n defaultNamespace: file.relativePath.split(\"/\")[2]!,\n });\n file.addCleanup(cleanup);\n return undefined;\n }\n\n if (type === \"locale\") {\n registerGroupedTranslationKeys(\n file.relativePath,\n extractTranslationKeys(\n ts.createSourceFile(file.relativePath, file.source, ts.ScriptTarget.Latest),\n ),\n );\n }\n\n globalThis.__currentModuleFile = file;\n\n try {\n const fileUrl = pathToFileURL(file.absolutePath).href;\n\n const load = async () => {\n const module = (await importAppModule(fileUrl)) as Record<string, unknown>;\n this.loadedModules.set(file.absolutePath, module);\n this.registerCleanup(file, module);\n if (type === \"model\") {\n getDevelopmentModelModuleRegistry().publish(file.absolutePath, fileUrl, module);\n }\n return module as T;\n };\n\n return type === \"route\" ? await router.withSourceFile(file.relativePath, load) : await load();\n } catch (error: any) {\n if (error.code === \"ERR_MODULE_NOT_FOUND\") {\n devLogError(formatModuleNotFoundError(error));\n } else {\n // Pass the error through so devLogError prints the stack. With dev\n // source maps enabled, frames remap to the original `.ts` line/col\n // (e.g. the actual call site of an undefined symbol) instead of\n // vanishing — a one-line \"x is not defined\" is undebuggable.\n devLogError(\n `Failed to load ${type}: ${file.relativePath} - ${error?.message || error}`,\n error,\n );\n }\n\n // RETHROW after logging. Previously this returned undefined, so a route\n // file that threw on import or registration disappeared with no boot\n // error — the whole surface 404'd silently. Boot callers abort on the\n // throw; the HMR batch-reload handler catches it, keeps the server\n // alive, and shows it loudly.\n throw error instanceof ModuleLoadError ? error : new ModuleLoadError(type, file, error);\n } finally {\n globalThis.__currentModuleFile = undefined;\n }\n }\n\n /**\n * Reload a previously-loaded special file. The version-bump that makes the\n * import fresh is done by the caller (layer-executor) before invoking this.\n * Routes are removed from the registry first so re-registration is clean.\n */\n public async reloadModule(file: FileManager): Promise<void> {\n const moduleType = this.specialFilesCollector.getFileType(file.relativePath);\n if (!moduleType) return;\n\n this.runCleanup(file);\n\n if (moduleType === \"route\") {\n router.removeRoutesBySourceFile(file.relativePath);\n }\n\n this.loadedModules.delete(file.absolutePath);\n await this.loadModule(file, moduleType);\n }\n\n /**\n * Run every cleanup hook the file registered (or `$cleanup` on its exports)\n * and reset the list. Called once per HMR reload.\n */\n public runCleanup(file: FileManager): void {\n for (const hook of file.cleanup) {\n try {\n if (typeof hook === \"function\") {\n hook();\n } else if (\n hook &&\n typeof (hook as { unsubscribe?: () => void }).unsubscribe === \"function\"\n ) {\n (hook as { unsubscribe: () => void }).unsubscribe();\n }\n } catch {\n // Cleanup errors shouldn't break HMR.\n }\n }\n file.resetCleanup();\n }\n\n /**\n * Clean up after a file whose source was deleted from disk.\n */\n public cleanupDeletedModule(file: FileManager): void {\n this.loadedModules.delete(file.absolutePath);\n\n if (file.type === \"model\") {\n getDevelopmentModelModuleRegistry().remove(file.absolutePath);\n }\n\n if (file.type === \"route\") {\n router.removeRoutesBySourceFile(file.relativePath);\n }\n\n this.runCleanup(file);\n }\n\n /**\n * Scan a freshly-loaded module for cleanup handlers and register them on\n * the FileManager so they run before the next reload. Priority: explicit\n * `export function cleanup()` → `.$cleanup` on any exported value.\n */\n private registerCleanup(file: FileManager, module: Record<string, unknown>): void {\n if (typeof module.cleanup === \"function\") {\n file.addCleanup(module.cleanup as CleanupFunction);\n return;\n }\n\n const cleanups: CleanupFunction[] = [];\n\n for (const exportedValue of Object.values(module)) {\n const cleanup = (exportedValue as { $cleanup?: unknown })?.$cleanup;\n if (typeof cleanup === \"function\") {\n cleanups.push(cleanup.bind(exportedValue) as CleanupFunction);\n }\n }\n\n if (cleanups.length > 0) {\n file.addCleanup(cleanups);\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"module-loader.mjs","names":[],"sources":["../../../../../../../../packages/core/src/dev-server/module-loader.ts"],"sourcesContent":["import { pathToFileURL } from \"node:url\";\nimport ts from \"typescript\";\nimport { importAppModule } from \"../loader/app-module-importer\";\nimport { registerGroupedTranslationKeys, registerLocaleDictionary } from \"../localization\";\nimport { router } from \"../router/router\";\nimport { devLogError, formatModuleNotFoundError } from \"./dev-logger\";\nimport { extractTranslationKeys } from \"./extract-translation-keys\";\nimport type { CleanupFunction, FileManager } from \"./file-manager\";\nimport { warnForLegacyLocales } from \"./legacy-locales-warning\";\nimport { getDevelopmentModelModuleRegistry } from \"./model-module-registry\";\nimport type { SpecialFileType, SpecialFilesCollector } from \"./special-files-collector\";\n\ndeclare global {\n var __currentModuleFile: FileManager | undefined;\n}\n\n/**\n * Thrown when a special file (route/event/main/locale) fails to import or\n * register. Carries the file that failed and the original cause so a broken\n * module surfaces with its origin instead of vanishing into a 404.\n */\nexport class ModuleLoadError extends Error {\n public constructor(\n public readonly type: string,\n public readonly file: FileManager,\n public readonly cause: unknown,\n ) {\n const reason = cause instanceof Error ? cause.message : String(cause);\n super(`Failed to load ${type}: ${file.relativePath} - ${reason}`);\n this.name = \"ModuleLoadError\";\n }\n}\n\n/**\n * The \"special\" file kinds that the dev server eagerly imports at boot.\n * Order matters: locales first (used by everything), events before main so\n * listeners are registered when main runs, routes after main so handlers are\n * bound, worker last so scheduled jobs and queue definitions see routes\n * already registered. Dev always loads worker files since dev runs every role.\n */\nconst SPECIAL_TYPES: readonly SpecialFileType[] = [\n \"locale\",\n \"event\",\n \"main\",\n \"route\",\n \"worker\",\n] as const;\n\n/**\n * Loads application modules through the ESM loader hook. The hook stamps\n * `?v=N` on every import, so each reload is a fresh module without any\n * userland cache-busting plumbing.\n */\nexport class ModuleLoader {\n private readonly loadedModules = new Map<string, unknown>();\n\n public constructor(private readonly specialFilesCollector: SpecialFilesCollector) {\n // Web creates its Vite bridge after Core's development orchestration has\n // constructed ModuleLoader. Create the carrier now so a zero-model app can\n // subscribe before a model is added later through HMR.\n getDevelopmentModelModuleRegistry();\n }\n\n /**\n * Eagerly load every special file at boot, in the canonical order so\n * later phases (e.g. routes) see state earlier phases registered.\n *\n * A failing module no longer vanishes silently: each failure is collected\n * (so one broken file doesn't hide the others) and, once every file has been\n * attempted, an aggregate error is thrown. The boot callers\n * (`DevelopmentServer.start`, the HTTP test bootstrap) already wrap this in a\n * try/catch that logs and aborts the boot — so a broken route module aborts\n * boot loudly rather than booting into a surface that 404s.\n */\n public async loadAll(\n options: { onBeforeLoad?: (file: FileManager) => void | Promise<void> } = {},\n ): Promise<void> {\n const failures: ModuleLoadError[] = [];\n\n for (const type of SPECIAL_TYPES) {\n for (const file of this.specialFilesCollector.getFilesByType(type)) {\n try {\n await options.onBeforeLoad?.(file);\n await this.loadModule(file, type);\n } catch (error) {\n failures.push(\n error instanceof ModuleLoadError ? error : new ModuleLoadError(type, file, error),\n );\n }\n }\n }\n\n if (failures.length > 0) {\n throw new AggregateError(\n failures,\n `${failures.length} module(s) failed to load during boot:\\n` +\n failures.map((failure) => ` - ${failure.message}`).join(\"\\n\"),\n );\n }\n }\n\n /**\n * Import a file through the loader hook. For routes, scopes the import in\n * `router.withSourceFile()` so the added routes carry their origin.\n */\n public async loadModule<T = unknown>(file: FileManager, type: string): Promise<T | undefined> {\n if (file.relativePath.endsWith(\".env\")) return undefined;\n\n if (type === \"locale\" && /\\/utils\\/locales\\.(ts|tsx)$/.test(file.relativePath)) {\n warnForLegacyLocales(\n this.specialFilesCollector.getFilesByType(\"locale\").map((locale) => locale.relativePath),\n );\n }\n\n if (type === \"locale\" && file.relativePath.endsWith(\".json\")) {\n const cleanup = registerLocaleDictionary({\n sourceFile: file.relativePath,\n source: file.source,\n defaultNamespace: file.relativePath.split(\"/\")[2]!,\n });\n file.addCleanup(cleanup);\n return undefined;\n }\n\n if (type === \"locale\") {\n registerGroupedTranslationKeys(\n file.relativePath,\n extractTranslationKeys(\n ts.createSourceFile(file.relativePath, file.source, ts.ScriptTarget.Latest),\n ),\n );\n }\n\n globalThis.__currentModuleFile = file;\n\n try {\n const fileUrl = pathToFileURL(file.absolutePath).href;\n\n const load = async () => {\n const module = (await importAppModule(fileUrl)) as Record<string, unknown>;\n this.loadedModules.set(file.absolutePath, module);\n this.registerCleanup(file, module);\n if (type === \"model\") {\n getDevelopmentModelModuleRegistry().publish(file.absolutePath, fileUrl, module);\n }\n return module as T;\n };\n\n return type === \"route\" ? await router.withSourceFile(file.relativePath, load) : await load();\n } catch (error: any) {\n if (error.code === \"ERR_MODULE_NOT_FOUND\") {\n devLogError(formatModuleNotFoundError(error));\n } else {\n // Pass the error through so devLogError prints the stack. With dev\n // source maps enabled, frames remap to the original `.ts` line/col\n // (e.g. the actual call site of an undefined symbol) instead of\n // vanishing — a one-line \"x is not defined\" is undebuggable.\n devLogError(\n `Failed to load ${type}: ${file.relativePath} - ${error?.message || error}`,\n error,\n );\n }\n\n // RETHROW after logging. Previously this returned undefined, so a route\n // file that threw on import or registration disappeared with no boot\n // error — the whole surface 404'd silently. Boot callers abort on the\n // throw; the HMR batch-reload handler catches it, keeps the server\n // alive, and shows it loudly.\n throw error instanceof ModuleLoadError ? error : new ModuleLoadError(type, file, error);\n } finally {\n globalThis.__currentModuleFile = undefined;\n }\n }\n\n /**\n * Reload a previously-loaded special file. The version-bump that makes the\n * import fresh is done by the caller (layer-executor) before invoking this.\n * Routes are removed from the registry first so re-registration is clean.\n */\n public async reloadModule(file: FileManager): Promise<void> {\n const moduleType = this.specialFilesCollector.getFileType(file.relativePath);\n if (!moduleType) return;\n\n this.runCleanup(file);\n\n if (moduleType === \"route\") {\n router.removeRoutesBySourceFile(file.relativePath);\n }\n\n this.loadedModules.delete(file.absolutePath);\n await this.loadModule(file, moduleType);\n }\n\n /**\n * Run every cleanup hook the file registered (or `$cleanup` on its exports)\n * and reset the list. Called once per HMR reload.\n */\n public runCleanup(file: FileManager): void {\n for (const hook of file.cleanup) {\n try {\n if (typeof hook === \"function\") {\n hook();\n } else if (\n hook &&\n typeof (hook as { unsubscribe?: () => void }).unsubscribe === \"function\"\n ) {\n (hook as { unsubscribe: () => void }).unsubscribe();\n }\n } catch {\n // Cleanup errors shouldn't break HMR.\n }\n }\n file.resetCleanup();\n }\n\n /**\n * Clean up after a file whose source was deleted from disk.\n */\n public cleanupDeletedModule(file: FileManager): void {\n this.loadedModules.delete(file.absolutePath);\n\n if (file.type === \"model\") {\n getDevelopmentModelModuleRegistry().remove(file.absolutePath);\n }\n\n if (file.type === \"route\") {\n router.removeRoutesBySourceFile(file.relativePath);\n }\n\n this.runCleanup(file);\n }\n\n /**\n * Scan a freshly-loaded module for cleanup handlers and register them on\n * the FileManager so they run before the next reload. Priority: explicit\n * `export function cleanup()` → `.$cleanup` on any exported value.\n */\n private registerCleanup(file: FileManager, module: Record<string, unknown>): void {\n if (typeof module.cleanup === \"function\") {\n file.addCleanup(module.cleanup as CleanupFunction);\n return;\n }\n\n const cleanups: CleanupFunction[] = [];\n\n for (const exportedValue of Object.values(module)) {\n const cleanup = (exportedValue as { $cleanup?: unknown })?.$cleanup;\n if (typeof cleanup === \"function\") {\n cleanups.push(cleanup.bind(exportedValue) as CleanupFunction);\n }\n }\n\n if (cleanups.length > 0) {\n file.addCleanup(cleanups);\n }\n }\n}\n"],"mappings":"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"}