@warlock.js/core 5.30.0 → 5.31.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 (797) hide show
  1. package/CHANGELOG.md +142 -36
  2. package/README.md +28 -23
  3. package/bin/source-load-hook.mjs +63 -0
  4. package/bin/warlock.js +102 -42
  5. package/esm/cli/commands/add.command.mjs +4 -2
  6. package/esm/cli/commands/add.command.mjs.map +1 -1
  7. package/esm/cli/commands/agents-md/agents-md-command.action.mjs +69 -0
  8. package/esm/cli/commands/agents-md/agents-md-command.action.mjs.map +1 -0
  9. package/esm/cli/commands/agents-md.command.mjs +38 -0
  10. package/esm/cli/commands/agents-md.command.mjs.map +1 -0
  11. package/esm/cli/commands/board/board-command.action.mjs +279 -0
  12. package/esm/cli/commands/board/board-command.action.mjs.map +1 -0
  13. package/esm/cli/commands/board.command.mjs +78 -0
  14. package/esm/cli/commands/board.command.mjs.map +1 -0
  15. package/esm/cli/commands/build.command.mjs +6 -1
  16. package/esm/cli/commands/build.command.mjs.map +1 -1
  17. package/esm/cli/commands/check/check-command.action.mjs +57 -0
  18. package/esm/cli/commands/check/check-command.action.mjs.map +1 -0
  19. package/esm/cli/commands/check/child-typecheck.mjs +66 -0
  20. package/esm/cli/commands/check/child-typecheck.mjs.map +1 -0
  21. package/esm/cli/commands/check/format-problems.mjs +43 -0
  22. package/esm/cli/commands/check/format-problems.mjs.map +1 -0
  23. package/esm/cli/commands/check/typecheck-command.action.mjs +61 -0
  24. package/esm/cli/commands/check/typecheck-command.action.mjs.map +1 -0
  25. package/esm/cli/commands/check.command.mjs +50 -0
  26. package/esm/cli/commands/check.command.mjs.map +1 -0
  27. package/esm/cli/commands/dev-server.command.mjs +9 -1
  28. package/esm/cli/commands/dev-server.command.mjs.map +1 -1
  29. package/esm/cli/commands/doctor/boot-for-diagnostics.mjs +8 -3
  30. package/esm/cli/commands/doctor/boot-for-diagnostics.mjs.map +1 -1
  31. package/esm/cli/commands/doctor/check.types.d.mts +76 -0
  32. package/esm/cli/commands/doctor/check.types.d.mts.map +1 -0
  33. package/esm/cli/commands/doctor/checks/config.check.mjs +1 -0
  34. package/esm/cli/commands/doctor/checks/config.check.mjs.map +1 -1
  35. package/esm/cli/commands/doctor/checks/connectors.check.mjs +2 -0
  36. package/esm/cli/commands/doctor/checks/connectors.check.mjs.map +1 -1
  37. package/esm/cli/commands/doctor/checks/handler-signature.check.mjs +1 -0
  38. package/esm/cli/commands/doctor/checks/handler-signature.check.mjs.map +1 -1
  39. package/esm/cli/commands/doctor/checks/health.check.mjs +3 -0
  40. package/esm/cli/commands/doctor/checks/health.check.mjs.map +1 -1
  41. package/esm/cli/commands/doctor/checks/jwt-secret.check.mjs +1 -0
  42. package/esm/cli/commands/doctor/checks/jwt-secret.check.mjs.map +1 -1
  43. package/esm/cli/commands/doctor/checks/locales-ts-deprecated.check.mjs +1 -0
  44. package/esm/cli/commands/doctor/checks/locales-ts-deprecated.check.mjs.map +1 -1
  45. package/esm/cli/commands/doctor/checks/optional-peers.check.mjs +1 -0
  46. package/esm/cli/commands/doctor/checks/optional-peers.check.mjs.map +1 -1
  47. package/esm/cli/commands/doctor/checks/release-hygiene.check.mjs +4 -0
  48. package/esm/cli/commands/doctor/checks/release-hygiene.check.mjs.map +1 -1
  49. package/esm/cli/commands/doctor/checks/routes.check.mjs +3 -0
  50. package/esm/cli/commands/doctor/checks/routes.check.mjs.map +1 -1
  51. package/esm/cli/commands/doctor/doctor-command.action.mjs +14 -6
  52. package/esm/cli/commands/doctor/doctor-command.action.mjs.map +1 -1
  53. package/esm/cli/commands/doctor/format-report.mjs +30 -2
  54. package/esm/cli/commands/doctor/format-report.mjs.map +1 -1
  55. package/esm/cli/commands/doctor.command.mjs +4 -0
  56. package/esm/cli/commands/doctor.command.mjs.map +1 -1
  57. package/esm/cli/commands/explain/explain-command.action.mjs +64 -0
  58. package/esm/cli/commands/explain/explain-command.action.mjs.map +1 -0
  59. package/esm/cli/commands/explain.command.mjs +23 -0
  60. package/esm/cli/commands/explain.command.mjs.map +1 -0
  61. package/esm/cli/commands/generate/generate.command.mjs +124 -124
  62. package/esm/cli/commands/generate/generate.command.mjs.map +1 -1
  63. package/esm/cli/commands/generate/generators/endpoint.generator.mjs +311 -0
  64. package/esm/cli/commands/generate/generators/endpoint.generator.mjs.map +1 -0
  65. package/esm/cli/commands/generate/generators/migration.generator.mjs +1 -1
  66. package/esm/cli/commands/generate/generators/migration.generator.mjs.map +1 -1
  67. package/esm/cli/commands/generate/generators/model.generator.mjs +1 -1
  68. package/esm/cli/commands/generate/templates/endpoint-stubs.mjs +341 -0
  69. package/esm/cli/commands/generate/templates/endpoint-stubs.mjs.map +1 -0
  70. package/esm/cli/commands/generate/templates/stubs.mjs +19 -6
  71. package/esm/cli/commands/generate/templates/stubs.mjs.map +1 -1
  72. package/esm/cli/commands/generate/utils/endpoint-schema.mjs +137 -0
  73. package/esm/cli/commands/generate/utils/endpoint-schema.mjs.map +1 -0
  74. package/esm/cli/commands/generate/utils/name-parser.mjs +1 -1
  75. package/esm/cli/commands/generate/utils/name-parser.mjs.map +1 -1
  76. package/esm/cli/commands/generate/utils/prompt.mjs.map +1 -1
  77. package/esm/cli/commands/generate/utils/writer.mjs +38 -13
  78. package/esm/cli/commands/generate/utils/writer.mjs.map +1 -1
  79. package/esm/cli/commands/inspect/inspect-command.action.mjs +72 -0
  80. package/esm/cli/commands/inspect/inspect-command.action.mjs.map +1 -0
  81. package/esm/cli/commands/inspect.command.mjs +39 -0
  82. package/esm/cli/commands/inspect.command.mjs.map +1 -0
  83. package/esm/cli/commands/mcp/mcp-command.action.mjs +103 -0
  84. package/esm/cli/commands/mcp/mcp-command.action.mjs.map +1 -0
  85. package/esm/cli/commands/mcp.command.mjs +76 -0
  86. package/esm/cli/commands/mcp.command.mjs.map +1 -0
  87. package/esm/cli/commands/openapi-generator.action.mjs.map +1 -1
  88. package/esm/cli/commands/openapi-generator.command.mjs.map +1 -1
  89. package/esm/cli/commands/postman-generator.action.mjs.map +1 -1
  90. package/esm/cli/commands/postman-generator.command.mjs.map +1 -1
  91. package/esm/cli/commands/routes/routes-diff.action.mjs +1 -1
  92. package/esm/cli/commands/test.command.mjs +131 -0
  93. package/esm/cli/commands/test.command.mjs.map +1 -0
  94. package/esm/cli/commands/trace/trace-command.action.mjs +145 -0
  95. package/esm/cli/commands/trace/trace-command.action.mjs.map +1 -0
  96. package/esm/cli/commands/trace.command.mjs +60 -0
  97. package/esm/cli/commands/trace.command.mjs.map +1 -0
  98. package/esm/cli/commands/typecheck.command.mjs +40 -0
  99. package/esm/cli/commands/typecheck.command.mjs.map +1 -0
  100. package/esm/cli/commands/upgrade.command.mjs +46 -0
  101. package/esm/cli/commands/upgrade.command.mjs.map +1 -0
  102. package/esm/cli/flush-and-exit.mjs +34 -0
  103. package/esm/cli/flush-and-exit.mjs.map +1 -0
  104. package/esm/cli/framework-cli-commands.mjs +23 -1
  105. package/esm/cli/framework-cli-commands.mjs.map +1 -1
  106. package/esm/cli/parse-cli-args.mjs +1 -0
  107. package/esm/cli/parse-cli-args.mjs.map +1 -1
  108. package/esm/config/config-loader.d.mts.map +1 -1
  109. package/esm/config/config-loader.mjs +34 -13
  110. package/esm/config/config-loader.mjs.map +1 -1
  111. package/esm/config/config-schema.d.mts +67 -0
  112. package/esm/config/config-schema.d.mts.map +1 -0
  113. package/esm/config/config-schema.mjs +77 -0
  114. package/esm/config/config-schema.mjs.map +1 -0
  115. package/esm/config/index.d.mts +6 -0
  116. package/esm/config/index.mjs +1 -0
  117. package/esm/connectors/assert-no-reserved-connector-names.d.mts.map +1 -1
  118. package/esm/connectors/assert-no-reserved-connector-names.mjs +2 -1
  119. package/esm/connectors/assert-no-reserved-connector-names.mjs.map +1 -1
  120. package/esm/connectors/assert-unique-connector-names.d.mts.map +1 -1
  121. package/esm/connectors/assert-unique-connector-names.mjs +26 -2
  122. package/esm/connectors/assert-unique-connector-names.mjs.map +1 -1
  123. package/esm/connectors/http-connector.d.mts.map +1 -1
  124. package/esm/connectors/http-connector.mjs +3 -2
  125. package/esm/connectors/http-connector.mjs.map +1 -1
  126. package/esm/connectors/single-server-warnings.mjs.map +1 -1
  127. package/esm/connectors/socket-connector.d.mts.map +1 -1
  128. package/esm/connectors/socket-connector.mjs.map +1 -1
  129. package/esm/container/index.d.mts.map +1 -1
  130. package/esm/container/index.mjs.map +1 -1
  131. package/esm/database/migrate-action.mjs.map +1 -1
  132. package/esm/database/models/database-log/database-log.d.mts +0 -28
  133. package/esm/database/models/database-log/database-log.d.mts.map +1 -1
  134. package/esm/database/seeds/seeder.errors.d.mts +4 -0
  135. package/esm/database/seeds/seeder.errors.d.mts.map +1 -1
  136. package/esm/database/seeds/seeder.errors.mjs +2 -0
  137. package/esm/database/seeds/seeder.errors.mjs.map +1 -1
  138. package/esm/dev-server/boot-precondition-error.mjs +1 -0
  139. package/esm/dev-server/boot-precondition-error.mjs.map +1 -1
  140. package/esm/dev-server/create-worker.mjs +15 -9
  141. package/esm/dev-server/create-worker.mjs.map +1 -1
  142. package/esm/dev-server/dev-agent-tooling.mjs +135 -0
  143. package/esm/dev-server/dev-agent-tooling.mjs.map +1 -0
  144. package/esm/dev-server/dev-logger.mjs.map +1 -1
  145. package/esm/dev-server/development-server.mjs +8 -0
  146. package/esm/dev-server/development-server.mjs.map +1 -1
  147. package/esm/dev-server/files-orchestrator.mjs +4 -5
  148. package/esm/dev-server/files-orchestrator.mjs.map +1 -1
  149. package/esm/dev-server/files-watcher.mjs +1 -1
  150. package/esm/dev-server/health-checker/checkers/eslint-health-checker.mjs +2 -3
  151. package/esm/dev-server/health-checker/checkers/eslint-health-checker.mjs.map +1 -1
  152. package/esm/dev-server/health-checker/checkers/oxlint-health-checker.mjs +33 -0
  153. package/esm/dev-server/health-checker/checkers/oxlint-health-checker.mjs.map +1 -0
  154. package/esm/dev-server/health-checker/default-health-checkers.mjs +31 -0
  155. package/esm/dev-server/health-checker/default-health-checkers.mjs.map +1 -0
  156. package/esm/dev-server/health-checker/file-health-checker.contract.d.mts +9 -3
  157. package/esm/dev-server/health-checker/file-health-checker.contract.d.mts.map +1 -1
  158. package/esm/dev-server/health-checker/files-healthcare.manager.mjs +15 -4
  159. package/esm/dev-server/health-checker/files-healthcare.manager.mjs.map +1 -1
  160. package/esm/dev-server/health-checker/oxlint-runner.mjs +302 -0
  161. package/esm/dev-server/health-checker/oxlint-runner.mjs.map +1 -0
  162. package/esm/dev-server/health-checker/workers/oxlint-health.worker.d.mts +1 -0
  163. package/esm/dev-server/health-checker/workers/oxlint-health.worker.mjs +42 -0
  164. package/esm/dev-server/health-checker/workers/oxlint-health.worker.mjs.map +1 -0
  165. package/esm/dev-server/loader/loader-port-acks.mjs +1 -1
  166. package/esm/dev-server/loader/loader-port-acks.mjs.map +1 -1
  167. package/esm/dev-server/loader/register-loader.mjs +1 -1
  168. package/esm/dev-server/loader/register-loader.mjs.map +1 -1
  169. package/esm/dev-server/loader/resolve-hook.mjs +1 -1
  170. package/esm/dev-server/loader/transpile-cache.mjs +1 -1
  171. package/esm/dev-server/model-resource-typings.mjs.map +1 -1
  172. package/esm/dev-server/module-loader.mjs +1 -0
  173. package/esm/dev-server/module-loader.mjs.map +1 -1
  174. package/esm/dev-server/parse-imports.mjs +1 -1
  175. package/esm/dev-server/parse-imports.mjs.map +1 -1
  176. package/esm/dev-server/route-types-publisher.mjs +1 -1
  177. package/esm/dev-server/start-development-server.mjs.map +1 -1
  178. package/esm/dev-server/translation-keys-sources.mjs +1 -1
  179. package/esm/dev-server/translation-keys-sources.mjs.map +1 -1
  180. package/esm/dev-server/tsconfig-manager.mjs.map +1 -1
  181. package/esm/dev-server/type-generator.mjs +3 -3
  182. package/esm/dev-server/type-generator.mjs.map +1 -1
  183. package/esm/dev-server/types.d.mts.map +1 -1
  184. package/esm/errors/container-key-missing-error.mjs +1 -0
  185. package/esm/errors/container-key-missing-error.mjs.map +1 -1
  186. package/esm/errors/error-codes.d.mts +653 -0
  187. package/esm/errors/error-codes.d.mts.map +1 -0
  188. package/esm/errors/error-codes.mjs +634 -0
  189. package/esm/errors/error-codes.mjs.map +1 -0
  190. package/esm/errors/esbuild-binary-missing-error.mjs +1 -0
  191. package/esm/errors/esbuild-binary-missing-error.mjs.map +1 -1
  192. package/esm/errors/index.d.mts +3 -1
  193. package/esm/errors/index.mjs +3 -1
  194. package/esm/errors/unknown-locale-error.mjs +1 -0
  195. package/esm/errors/unknown-locale-error.mjs.map +1 -1
  196. package/esm/errors/warlock-error.d.mts +23 -0
  197. package/esm/errors/warlock-error.d.mts.map +1 -0
  198. package/esm/errors/warlock-error.mjs +22 -0
  199. package/esm/errors/warlock-error.mjs.map +1 -0
  200. package/esm/generations/add-command.action.mjs +19 -3
  201. package/esm/generations/add-command.action.mjs.map +1 -1
  202. package/esm/generations/features/access.feature.mjs +1 -1
  203. package/esm/generations/features/access.feature.mjs.map +1 -1
  204. package/esm/generations/features/bull-board.feature.mjs +1 -1
  205. package/esm/generations/features/bull-board.feature.mjs.map +1 -1
  206. package/esm/generations/features/mysql.feature.mjs.map +1 -1
  207. package/esm/generations/features/notifications.feature.mjs +5 -2
  208. package/esm/generations/features/notifications.feature.mjs.map +1 -1
  209. package/esm/generations/features/queue.feature.mjs +1 -1
  210. package/esm/generations/features/queue.feature.mjs.map +1 -1
  211. package/esm/generations/features/react-email.feature.mjs +1 -1
  212. package/esm/generations/features/react-email.feature.mjs.map +1 -1
  213. package/esm/generations/features/shadcn.feature.mjs +1 -1
  214. package/esm/generations/features/shadcn.feature.mjs.map +1 -1
  215. package/esm/generations/features/shared/link-ai-package-import.mjs +1 -1
  216. package/esm/generations/features/shared/link-ai-package-import.mjs.map +1 -1
  217. package/esm/generations/features/shared/merge-web-sitemap-config.mjs.map +1 -1
  218. package/esm/generations/features/shared/patch-tsconfig-include.mjs +1 -1
  219. package/esm/generations/features/shared/patch-tsconfig-include.mjs.map +1 -1
  220. package/esm/generations/features/shared/relocate-conflicting-home-route.mjs +1 -1
  221. package/esm/generations/features/shared/relocate-conflicting-home-route.mjs.map +1 -1
  222. package/esm/generations/features/sitemap.feature.mjs +1 -1
  223. package/esm/generations/features/sitemap.feature.mjs.map +1 -1
  224. package/esm/generations/features/tailwind.feature.mjs +1 -1
  225. package/esm/generations/features/tailwind.feature.mjs.map +1 -1
  226. package/esm/generations/features/test.feature.mjs +11 -6
  227. package/esm/generations/features/test.feature.mjs.map +1 -1
  228. package/esm/generations/features/web.feature.mjs +1 -1
  229. package/esm/generations/features/web.feature.mjs.map +1 -1
  230. package/esm/generations/generation-fs.mjs +73 -0
  231. package/esm/generations/generation-fs.mjs.map +1 -0
  232. package/esm/generations/generation-run.mjs +185 -0
  233. package/esm/generations/generation-run.mjs.map +1 -0
  234. package/esm/generations/stubs.mjs +155 -13
  235. package/esm/generations/stubs.mjs.map +1 -1
  236. package/esm/http/bounded-stream-queue.d.mts +10 -0
  237. package/esm/http/bounded-stream-queue.d.mts.map +1 -0
  238. package/esm/http/bounded-stream-queue.mjs +97 -0
  239. package/esm/http/bounded-stream-queue.mjs.map +1 -0
  240. package/esm/http/build-rate-limit-options.d.mts +13 -0
  241. package/esm/http/build-rate-limit-options.d.mts.map +1 -1
  242. package/esm/http/build-rate-limit-options.mjs.map +1 -1
  243. package/esm/http/conditional-request.d.mts +86 -0
  244. package/esm/http/conditional-request.d.mts.map +1 -0
  245. package/esm/http/conditional-request.mjs +121 -0
  246. package/esm/http/conditional-request.mjs.map +1 -0
  247. package/esm/http/csp.d.mts +2 -0
  248. package/esm/http/csp.d.mts.map +1 -1
  249. package/esm/http/csp.mjs +1 -0
  250. package/esm/http/csp.mjs.map +1 -1
  251. package/esm/http/csrf-origin-policy.mjs.map +1 -1
  252. package/esm/http/database/RequestLog.d.mts +24 -84
  253. package/esm/http/database/RequestLog.d.mts.map +1 -1
  254. package/esm/http/errors/errors.d.mts +2 -0
  255. package/esm/http/errors/errors.d.mts.map +1 -1
  256. package/esm/http/errors/errors.mjs +1 -0
  257. package/esm/http/errors/errors.mjs.map +1 -1
  258. package/esm/http/escape-header-value.d.mts +18 -0
  259. package/esm/http/escape-header-value.d.mts.map +1 -0
  260. package/esm/http/escape-header-value.mjs +27 -0
  261. package/esm/http/escape-header-value.mjs.map +1 -0
  262. package/esm/http/flush-pending-cookies.mjs.map +1 -1
  263. package/esm/http/index.d.mts +5 -2
  264. package/esm/http/index.mjs +4 -1
  265. package/esm/http/lazy-static.mjs +194 -0
  266. package/esm/http/lazy-static.mjs.map +1 -0
  267. package/esm/http/middleware/idempotency.middleware.mjs.map +1 -1
  268. package/esm/http/plugins.d.mts.map +1 -1
  269. package/esm/http/plugins.mjs +7 -4
  270. package/esm/http/plugins.mjs.map +1 -1
  271. package/esm/http/rate-limit-cache-store.mjs +2 -1
  272. package/esm/http/rate-limit-cache-store.mjs.map +1 -1
  273. package/esm/http/request-log-snapshot.d.mts +12 -5
  274. package/esm/http/request-log-snapshot.d.mts.map +1 -1
  275. package/esm/http/request-log-snapshot.mjs +83 -4
  276. package/esm/http/request-log-snapshot.mjs.map +1 -1
  277. package/esm/http/request.d.mts +2 -2
  278. package/esm/http/request.d.mts.map +1 -1
  279. package/esm/http/request.mjs +5 -4
  280. package/esm/http/request.mjs.map +1 -1
  281. package/esm/http/response.d.mts +11 -1
  282. package/esm/http/response.d.mts.map +1 -1
  283. package/esm/http/response.mjs +164 -76
  284. package/esm/http/response.mjs.map +1 -1
  285. package/esm/http/safe-redirect.d.mts +51 -0
  286. package/esm/http/safe-redirect.d.mts.map +1 -0
  287. package/esm/http/safe-redirect.mjs +80 -0
  288. package/esm/http/safe-redirect.mjs.map +1 -0
  289. package/esm/http/serialized.d.mts.map +1 -1
  290. package/esm/http/server.d.mts +3 -1
  291. package/esm/http/server.d.mts.map +1 -1
  292. package/esm/http/server.mjs +14 -4
  293. package/esm/http/server.mjs.map +1 -1
  294. package/esm/http/stream-transport.mjs +4 -2
  295. package/esm/http/stream-transport.mjs.map +1 -1
  296. package/esm/http/types.d.mts +44 -11
  297. package/esm/http/types.d.mts.map +1 -1
  298. package/esm/http/uploads/generate-image-variant.mjs +1 -1
  299. package/esm/http/uploads/generate-image-variants.d.mts +10 -7
  300. package/esm/http/uploads/generate-image-variants.d.mts.map +1 -1
  301. package/esm/http/uploads/generate-image-variants.mjs +61 -24
  302. package/esm/http/uploads/generate-image-variants.mjs.map +1 -1
  303. package/esm/http/uploads/image-variant-cache-entries.mjs +78 -0
  304. package/esm/http/uploads/image-variant-cache-entries.mjs.map +1 -0
  305. package/esm/http/uploads/image-variant-cache.mjs +72 -30
  306. package/esm/http/uploads/image-variant-cache.mjs.map +1 -1
  307. package/esm/http/uploads/image-variant-types.d.mts +2 -0
  308. package/esm/http/uploads/image-variant-types.d.mts.map +1 -1
  309. package/esm/http/uploads/image-variants-config-error.d.mts +3 -1
  310. package/esm/http/uploads/image-variants-config-error.d.mts.map +1 -1
  311. package/esm/http/uploads/image-variants-config-error.mjs +3 -2
  312. package/esm/http/uploads/image-variants-config-error.mjs.map +1 -1
  313. package/esm/http/uploads/load-variant-source.mjs +1 -1
  314. package/esm/http/uploads/load-variant-source.mjs.map +1 -1
  315. package/esm/http/uploads/purge-image-variants.d.mts +7 -2
  316. package/esm/http/uploads/purge-image-variants.d.mts.map +1 -1
  317. package/esm/http/uploads/purge-image-variants.mjs +16 -16
  318. package/esm/http/uploads/purge-image-variants.mjs.map +1 -1
  319. package/esm/http/uploads/remote-variant-source.mjs +115 -0
  320. package/esm/http/uploads/remote-variant-source.mjs.map +1 -0
  321. package/esm/http/uploads/resolve-image-variant.d.mts +3 -4
  322. package/esm/http/uploads/resolve-image-variant.d.mts.map +1 -1
  323. package/esm/http/uploads/resolve-image-variant.mjs +10 -18
  324. package/esm/http/uploads/resolve-image-variant.mjs.map +1 -1
  325. package/esm/http/uploads/resolve-image-variants-config.mjs +5 -3
  326. package/esm/http/uploads/resolve-image-variants-config.mjs.map +1 -1
  327. package/esm/http/uploads/resolve-remote-image-variant.mjs +89 -0
  328. package/esm/http/uploads/resolve-remote-image-variant.mjs.map +1 -0
  329. package/esm/http/uploads/trim-image-variant-cache.mjs +193 -0
  330. package/esm/http/uploads/trim-image-variant-cache.mjs.map +1 -0
  331. package/esm/http/uploads/uploaded-file.controller.d.mts +5 -3
  332. package/esm/http/uploads/uploaded-file.controller.d.mts.map +1 -1
  333. package/esm/http/uploads/uploaded-file.controller.mjs +16 -8
  334. package/esm/http/uploads/uploaded-file.controller.mjs.map +1 -1
  335. package/esm/http/uploads/variant-cache-key.mjs +1 -1
  336. package/esm/http/uploads-types.d.mts +6 -2
  337. package/esm/http/uploads-types.d.mts.map +1 -1
  338. package/esm/index.d.mts +17 -6
  339. package/esm/index.mjs +14 -3
  340. package/esm/localization/parse-locale-dictionary.d.mts +2 -0
  341. package/esm/localization/parse-locale-dictionary.d.mts.map +1 -1
  342. package/esm/localization/parse-locale-dictionary.mjs +1 -0
  343. package/esm/localization/parse-locale-dictionary.mjs.map +1 -1
  344. package/esm/mail/config.d.mts +12 -1
  345. package/esm/mail/config.d.mts.map +1 -1
  346. package/esm/mail/config.mjs +16 -1
  347. package/esm/mail/config.mjs.map +1 -1
  348. package/esm/mail/index.d.mts +1 -1
  349. package/esm/mail/index.mjs +1 -1
  350. package/esm/net/index.d.mts +2 -0
  351. package/esm/net/index.mjs +3 -0
  352. package/esm/openapi/build-openapi-document.d.mts.map +1 -1
  353. package/esm/openapi/build-openapi-document.mjs +8 -5
  354. package/esm/openapi/build-openapi-document.mjs.map +1 -1
  355. package/esm/openapi/error-responses.mjs +28 -2
  356. package/esm/openapi/error-responses.mjs.map +1 -1
  357. package/esm/openapi/postman/build-request-body.mjs.map +1 -1
  358. package/esm/openapi/postman/build-request-url.mjs.map +1 -1
  359. package/esm/openapi/postman/build-saved-responses.mjs.map +1 -1
  360. package/esm/openapi/postman/example-from-schema.d.mts.map +1 -1
  361. package/esm/openapi/postman/example-from-schema.mjs.map +1 -1
  362. package/esm/openapi/postman/openapi-to-postman-collection.d.mts.map +1 -1
  363. package/esm/openapi/postman/openapi-to-postman-collection.mjs.map +1 -1
  364. package/esm/openapi/postman/schema-refs.mjs.map +1 -1
  365. package/esm/openapi/postman/uuid-v5.mjs.map +1 -1
  366. package/esm/openapi/request-schemas.mjs.map +1 -1
  367. package/esm/openapi/response-schemas.mjs.map +1 -1
  368. package/esm/openapi/schema-registry.d.mts +1 -0
  369. package/esm/openapi/schema-registry.mjs.map +1 -1
  370. package/esm/openapi/security.mjs.map +1 -1
  371. package/esm/openapi/types.d.mts +3 -2
  372. package/esm/openapi/types.d.mts.map +1 -1
  373. package/esm/production/assert-generated-imports.mjs +1 -0
  374. package/esm/production/assert-generated-imports.mjs.map +1 -1
  375. package/esm/production/production-builder.mjs +12 -4
  376. package/esm/production/production-builder.mjs.map +1 -1
  377. package/esm/production/resolve-build-config.mjs +1 -0
  378. package/esm/production/resolve-build-config.mjs.map +1 -1
  379. package/esm/production/route-registration-child.mjs.map +1 -1
  380. package/esm/production/route-registration-snapshot.mjs.map +1 -1
  381. package/esm/repositories/contracts/query-builder.contract.d.mts.map +1 -1
  382. package/esm/repositories/contracts/types.d.mts.map +1 -1
  383. package/esm/repositories/repository.manager.mjs.map +1 -1
  384. package/esm/resource/resource.d.mts.map +1 -1
  385. package/esm/resource/resource.mjs.map +1 -1
  386. package/esm/resource/types.d.mts.map +1 -1
  387. package/esm/restful/restful.d.mts +5 -5
  388. package/esm/restful/restful.d.mts.map +1 -1
  389. package/esm/restful/restful.mjs.map +1 -1
  390. package/esm/router/build-route-rate-limit.mjs.map +1 -1
  391. package/esm/router/dev-dispatch.mjs +31 -12
  392. package/esm/router/dev-dispatch.mjs.map +1 -1
  393. package/esm/router/index.d.mts +4 -2
  394. package/esm/router/index.mjs +2 -0
  395. package/esm/router/log-request-lifecycle.mjs.map +1 -1
  396. package/esm/router/positional-handler-diagnostics.d.mts.map +1 -1
  397. package/esm/router/positional-handler-diagnostics.mjs.map +1 -1
  398. package/esm/router/resolve-route-rate-limit.mjs +47 -0
  399. package/esm/router/resolve-route-rate-limit.mjs.map +1 -0
  400. package/esm/router/resolve-route-validation.mjs +19 -0
  401. package/esm/router/resolve-route-validation.mjs.map +1 -0
  402. package/esm/router/route-guard-names.mjs +30 -0
  403. package/esm/router/route-guard-names.mjs.map +1 -0
  404. package/esm/router/route-name-taken-error.d.mts +14 -0
  405. package/esm/router/route-name-taken-error.d.mts.map +1 -0
  406. package/esm/router/route-name-taken-error.mjs +18 -0
  407. package/esm/router/route-name-taken-error.mjs.map +1 -0
  408. package/esm/router/router.d.mts +32 -13
  409. package/esm/router/router.d.mts.map +1 -1
  410. package/esm/router/router.mjs +71 -38
  411. package/esm/router/router.mjs.map +1 -1
  412. package/esm/router/types.d.mts +137 -17
  413. package/esm/router/types.d.mts.map +1 -1
  414. package/esm/router/unguarded-route-diagnostics.d.mts +40 -0
  415. package/esm/router/unguarded-route-diagnostics.d.mts.map +1 -0
  416. package/esm/router/unguarded-route-diagnostics.mjs +95 -0
  417. package/esm/router/unguarded-route-diagnostics.mjs.map +1 -0
  418. package/esm/storage/drivers/cloud-driver.d.mts.map +1 -1
  419. package/esm/storage/drivers/cloud-driver.mjs.map +1 -1
  420. package/esm/storage/drivers/local-driver.d.mts.map +1 -1
  421. package/esm/storage/drivers/local-driver.mjs.map +1 -1
  422. package/esm/storage/local-disk-roots.mjs +24 -0
  423. package/esm/storage/local-disk-roots.mjs.map +1 -0
  424. package/esm/storage/storage.d.mts +14 -0
  425. package/esm/storage/storage.d.mts.map +1 -1
  426. package/esm/storage/storage.mjs +22 -0
  427. package/esm/storage/storage.mjs.map +1 -1
  428. package/esm/storage/types.d.mts.map +1 -1
  429. package/esm/storage/utils/storage-not-initialized-error.d.mts +2 -0
  430. package/esm/storage/utils/storage-not-initialized-error.d.mts.map +1 -1
  431. package/esm/storage/utils/storage-not-initialized-error.mjs +1 -0
  432. package/esm/storage/utils/storage-not-initialized-error.mjs.map +1 -1
  433. package/esm/tests/authenticated-test-client.d.mts +32 -0
  434. package/esm/tests/authenticated-test-client.d.mts.map +1 -0
  435. package/esm/tests/authenticated-test-client.mjs +40 -0
  436. package/esm/tests/authenticated-test-client.mjs.map +1 -0
  437. package/esm/tests/factories.d.mts +59 -0
  438. package/esm/tests/factories.d.mts.map +1 -0
  439. package/esm/tests/factories.mjs +105 -0
  440. package/esm/tests/factories.mjs.map +1 -0
  441. package/esm/tests/fakes/cache-fake.d.mts +29 -0
  442. package/esm/tests/fakes/cache-fake.d.mts.map +1 -0
  443. package/esm/tests/fakes/cache-fake.mjs +79 -0
  444. package/esm/tests/fakes/cache-fake.mjs.map +1 -0
  445. package/esm/tests/fakes/clock-fake.d.mts +32 -0
  446. package/esm/tests/fakes/clock-fake.d.mts.map +1 -0
  447. package/esm/tests/fakes/clock-fake.mjs +69 -0
  448. package/esm/tests/fakes/clock-fake.mjs.map +1 -0
  449. package/esm/tests/fakes/fake-assertion-error.d.mts +13 -0
  450. package/esm/tests/fakes/fake-assertion-error.d.mts.map +1 -0
  451. package/esm/tests/fakes/fake-assertion-error.mjs +20 -0
  452. package/esm/tests/fakes/fake-assertion-error.mjs.map +1 -0
  453. package/esm/tests/fakes/ids-fake.d.mts +22 -0
  454. package/esm/tests/fakes/ids-fake.d.mts.map +1 -0
  455. package/esm/tests/fakes/ids-fake.mjs +57 -0
  456. package/esm/tests/fakes/ids-fake.mjs.map +1 -0
  457. package/esm/tests/fakes/index.d.mts +8 -0
  458. package/esm/tests/fakes/index.mjs +10 -0
  459. package/esm/tests/fakes/mail-fake.d.mts +41 -0
  460. package/esm/tests/fakes/mail-fake.d.mts.map +1 -0
  461. package/esm/tests/fakes/mail-fake.mjs +111 -0
  462. package/esm/tests/fakes/mail-fake.mjs.map +1 -0
  463. package/esm/tests/fakes/queue-fake.d.mts +48 -0
  464. package/esm/tests/fakes/queue-fake.d.mts.map +1 -0
  465. package/esm/tests/fakes/queue-fake.mjs +134 -0
  466. package/esm/tests/fakes/queue-fake.mjs.map +1 -0
  467. package/esm/tests/fakes/storage-fake.d.mts +31 -0
  468. package/esm/tests/fakes/storage-fake.d.mts.map +1 -0
  469. package/esm/tests/fakes/storage-fake.mjs +122 -0
  470. package/esm/tests/fakes/storage-fake.mjs.map +1 -0
  471. package/esm/tests/fakes/test-fakes.d.mts +39 -0
  472. package/esm/tests/fakes/test-fakes.d.mts.map +1 -0
  473. package/esm/tests/fakes/test-fakes.mjs +90 -0
  474. package/esm/tests/fakes/test-fakes.mjs.map +1 -0
  475. package/esm/tests/index.d.mts +14 -2
  476. package/esm/tests/index.mjs +15 -2
  477. package/esm/tests/snapshot-response.d.mts +34 -0
  478. package/esm/tests/snapshot-response.d.mts.map +1 -0
  479. package/esm/tests/snapshot-response.mjs +42 -0
  480. package/esm/tests/snapshot-response.mjs.map +1 -0
  481. package/esm/tests/start-http-development-server.d.mts +22 -0
  482. package/esm/tests/start-http-development-server.d.mts.map +1 -1
  483. package/esm/tests/start-http-development-server.mjs +36 -3
  484. package/esm/tests/start-http-development-server.mjs.map +1 -1
  485. package/esm/tests/test-helpers.d.mts +20 -1
  486. package/esm/tests/test-helpers.d.mts.map +1 -1
  487. package/esm/tests/test-helpers.mjs +40 -27
  488. package/esm/tests/test-helpers.mjs.map +1 -1
  489. package/esm/tests/test-http-server.d.mts +62 -0
  490. package/esm/tests/test-http-server.d.mts.map +1 -0
  491. package/esm/tests/test-http-server.mjs +119 -0
  492. package/esm/tests/test-http-server.mjs.map +1 -0
  493. package/esm/tests/vitest-setup.d.mts +11 -0
  494. package/esm/tests/vitest-setup.d.mts.map +1 -1
  495. package/esm/tests/vitest-setup.mjs +12 -4
  496. package/esm/tests/vitest-setup.mjs.map +1 -1
  497. package/esm/tooling/agents-md/agents-md-markers.d.mts +27 -0
  498. package/esm/tooling/agents-md/agents-md-markers.d.mts.map +1 -0
  499. package/esm/tooling/agents-md/agents-md-markers.mjs +59 -0
  500. package/esm/tooling/agents-md/agents-md-markers.mjs.map +1 -0
  501. package/esm/tooling/agents-md/agents-md-refresher.d.mts +36 -0
  502. package/esm/tooling/agents-md/agents-md-refresher.d.mts.map +1 -0
  503. package/esm/tooling/agents-md/agents-md-refresher.mjs +72 -0
  504. package/esm/tooling/agents-md/agents-md-refresher.mjs.map +1 -0
  505. package/esm/tooling/agents-md/index.mjs +7 -0
  506. package/esm/tooling/agents-md/installed-skills.d.mts +30 -0
  507. package/esm/tooling/agents-md/installed-skills.d.mts.map +1 -0
  508. package/esm/tooling/agents-md/installed-skills.mjs +74 -0
  509. package/esm/tooling/agents-md/installed-skills.mjs.map +1 -0
  510. package/esm/tooling/agents-md/render-agents-md.d.mts +33 -0
  511. package/esm/tooling/agents-md/render-agents-md.d.mts.map +1 -0
  512. package/esm/tooling/agents-md/render-agents-md.mjs +195 -0
  513. package/esm/tooling/agents-md/render-agents-md.mjs.map +1 -0
  514. package/esm/tooling/agents-md/write-agents-md.d.mts +33 -0
  515. package/esm/tooling/agents-md/write-agents-md.d.mts.map +1 -0
  516. package/esm/tooling/agents-md/write-agents-md.mjs +49 -0
  517. package/esm/tooling/agents-md/write-agents-md.mjs.map +1 -0
  518. package/esm/tooling/board/board-message.d.mts +31 -0
  519. package/esm/tooling/board/board-message.d.mts.map +1 -0
  520. package/esm/tooling/board/board-message.mjs +86 -0
  521. package/esm/tooling/board/board-message.mjs.map +1 -0
  522. package/esm/tooling/board/board.d.mts +109 -0
  523. package/esm/tooling/board/board.d.mts.map +1 -0
  524. package/esm/tooling/board/board.mjs +406 -0
  525. package/esm/tooling/board/board.mjs.map +1 -0
  526. package/esm/tooling/board/board.types.d.mts +72 -0
  527. package/esm/tooling/board/board.types.d.mts.map +1 -0
  528. package/esm/tooling/board/board.types.mjs +54 -0
  529. package/esm/tooling/board/board.types.mjs.map +1 -0
  530. package/esm/tooling/check/changed-files.d.mts +33 -0
  531. package/esm/tooling/check/changed-files.d.mts.map +1 -0
  532. package/esm/tooling/check/changed-files.mjs +73 -0
  533. package/esm/tooling/check/changed-files.mjs.map +1 -0
  534. package/esm/tooling/check/check-report.types.d.mts +62 -0
  535. package/esm/tooling/check/check-report.types.d.mts.map +1 -0
  536. package/esm/tooling/check/check-report.types.mjs +37 -0
  537. package/esm/tooling/check/check-report.types.mjs.map +1 -0
  538. package/esm/tooling/check/code-style-conventions.mjs +106 -0
  539. package/esm/tooling/check/code-style-conventions.mjs.map +1 -0
  540. package/esm/tooling/check/conventions-step.d.mts +34 -0
  541. package/esm/tooling/check/conventions-step.d.mts.map +1 -0
  542. package/esm/tooling/check/conventions-step.mjs +184 -0
  543. package/esm/tooling/check/conventions-step.mjs.map +1 -0
  544. package/esm/tooling/check/environment-step.d.mts +18 -0
  545. package/esm/tooling/check/environment-step.d.mts.map +1 -0
  546. package/esm/tooling/check/environment-step.mjs +78 -0
  547. package/esm/tooling/check/environment-step.mjs.map +1 -0
  548. package/esm/tooling/check/index.d.mts +8 -0
  549. package/esm/tooling/check/index.mjs +10 -0
  550. package/esm/tooling/check/lint-step.d.mts +19 -0
  551. package/esm/tooling/check/lint-step.d.mts.map +1 -0
  552. package/esm/tooling/check/lint-step.mjs +111 -0
  553. package/esm/tooling/check/lint-step.mjs.map +1 -0
  554. package/esm/tooling/check/request-input.mjs +132 -0
  555. package/esm/tooling/check/request-input.mjs.map +1 -0
  556. package/esm/tooling/check/run-check.d.mts +35 -0
  557. package/esm/tooling/check/run-check.d.mts.map +1 -0
  558. package/esm/tooling/check/run-check.mjs +192 -0
  559. package/esm/tooling/check/run-check.mjs.map +1 -0
  560. package/esm/tooling/check/run-tests.d.mts +48 -0
  561. package/esm/tooling/check/run-tests.d.mts.map +1 -0
  562. package/esm/tooling/check/run-tests.mjs +93 -0
  563. package/esm/tooling/check/run-tests.mjs.map +1 -0
  564. package/esm/tooling/check/security-conventions.mjs +648 -0
  565. package/esm/tooling/check/security-conventions.mjs.map +1 -0
  566. package/esm/tooling/check/source-ast.mjs +195 -0
  567. package/esm/tooling/check/source-ast.mjs.map +1 -0
  568. package/esm/tooling/check/source-files.mjs +27 -0
  569. package/esm/tooling/check/source-files.mjs.map +1 -0
  570. package/esm/tooling/check/tests-step.d.mts +34 -0
  571. package/esm/tooling/check/tests-step.d.mts.map +1 -0
  572. package/esm/tooling/check/tests-step.mjs +177 -0
  573. package/esm/tooling/check/tests-step.mjs.map +1 -0
  574. package/esm/tooling/dev-state/dev-server-state.d.mts +39 -0
  575. package/esm/tooling/dev-state/dev-server-state.d.mts.map +1 -0
  576. package/esm/tooling/dev-state/dev-server-state.mjs +67 -0
  577. package/esm/tooling/dev-state/dev-server-state.mjs.map +1 -0
  578. package/esm/tooling/devtools/devtools-client.d.mts +91 -0
  579. package/esm/tooling/devtools/devtools-client.d.mts.map +1 -0
  580. package/esm/tooling/devtools/devtools-client.mjs +155 -0
  581. package/esm/tooling/devtools/devtools-client.mjs.map +1 -0
  582. package/esm/tooling/generate/generation.d.mts +78 -0
  583. package/esm/tooling/generate/generation.d.mts.map +1 -0
  584. package/esm/tooling/generate/generation.mjs +123 -0
  585. package/esm/tooling/generate/generation.mjs.map +1 -0
  586. package/esm/tooling/generate/generator-spec.d.mts +57 -0
  587. package/esm/tooling/generate/generator-spec.d.mts.map +1 -0
  588. package/esm/tooling/generate/generator-spec.mjs +102 -0
  589. package/esm/tooling/generate/generator-spec.mjs.map +1 -0
  590. package/esm/tooling/generate/index.mjs +6 -0
  591. package/esm/tooling/generate/project-files.mjs +121 -0
  592. package/esm/tooling/generate/project-files.mjs.map +1 -0
  593. package/esm/tooling/generate/run-cli.d.mts +40 -0
  594. package/esm/tooling/generate/run-cli.d.mts.map +1 -0
  595. package/esm/tooling/generate/run-cli.mjs +93 -0
  596. package/esm/tooling/generate/run-cli.mjs.map +1 -0
  597. package/esm/tooling/generate/unified-diff.d.mts +37 -0
  598. package/esm/tooling/generate/unified-diff.d.mts.map +1 -0
  599. package/esm/tooling/generate/unified-diff.mjs +161 -0
  600. package/esm/tooling/generate/unified-diff.mjs.map +1 -0
  601. package/esm/tooling/index.d.mts +41 -0
  602. package/esm/tooling/index.mjs +45 -0
  603. package/esm/tooling/inspect/boot-for-inspect.d.mts +23 -0
  604. package/esm/tooling/inspect/boot-for-inspect.d.mts.map +1 -0
  605. package/esm/tooling/inspect/boot-for-inspect.mjs +63 -0
  606. package/esm/tooling/inspect/boot-for-inspect.mjs.map +1 -0
  607. package/esm/tooling/inspect/collect-config.mjs +77 -0
  608. package/esm/tooling/inspect/collect-config.mjs.map +1 -0
  609. package/esm/tooling/inspect/collect-models.d.mts +9 -0
  610. package/esm/tooling/inspect/collect-models.d.mts.map +1 -0
  611. package/esm/tooling/inspect/collect-models.mjs +154 -0
  612. package/esm/tooling/inspect/collect-models.mjs.map +1 -0
  613. package/esm/tooling/inspect/collect-packages.d.mts +10 -0
  614. package/esm/tooling/inspect/collect-packages.d.mts.map +1 -0
  615. package/esm/tooling/inspect/collect-packages.mjs +157 -0
  616. package/esm/tooling/inspect/collect-packages.mjs.map +1 -0
  617. package/esm/tooling/inspect/collect-pages.mjs +108 -0
  618. package/esm/tooling/inspect/collect-pages.mjs.map +1 -0
  619. package/esm/tooling/inspect/collect-routes.mjs +168 -0
  620. package/esm/tooling/inspect/collect-routes.mjs.map +1 -0
  621. package/esm/tooling/inspect/event-recorder.d.mts +37 -0
  622. package/esm/tooling/inspect/event-recorder.d.mts.map +1 -0
  623. package/esm/tooling/inspect/event-recorder.mjs +91 -0
  624. package/esm/tooling/inspect/event-recorder.mjs.map +1 -0
  625. package/esm/tooling/inspect/index.d.mts +7 -0
  626. package/esm/tooling/inspect/index.mjs +7 -0
  627. package/esm/tooling/inspect/inspect-app.d.mts +53 -0
  628. package/esm/tooling/inspect/inspect-app.d.mts.map +1 -0
  629. package/esm/tooling/inspect/inspect-app.mjs +92 -0
  630. package/esm/tooling/inspect/inspect-app.mjs.map +1 -0
  631. package/esm/tooling/inspect/inspect-report.schema.d.mts +15 -0
  632. package/esm/tooling/inspect/inspect-report.schema.d.mts.map +1 -0
  633. package/esm/tooling/inspect/inspect-report.schema.mjs +463 -0
  634. package/esm/tooling/inspect/inspect-report.schema.mjs.map +1 -0
  635. package/esm/tooling/inspect/inspect-report.types.d.mts +196 -0
  636. package/esm/tooling/inspect/inspect-report.types.d.mts.map +1 -0
  637. package/esm/tooling/inspect/inspect-report.types.mjs +33 -0
  638. package/esm/tooling/inspect/inspect-report.types.mjs.map +1 -0
  639. package/esm/tooling/mcp/create-mcp-context.d.mts +26 -0
  640. package/esm/tooling/mcp/create-mcp-context.d.mts.map +1 -0
  641. package/esm/tooling/mcp/create-mcp-context.mjs +75 -0
  642. package/esm/tooling/mcp/create-mcp-context.mjs.map +1 -0
  643. package/esm/tooling/mcp/db-schema.d.mts +49 -0
  644. package/esm/tooling/mcp/db-schema.d.mts.map +1 -0
  645. package/esm/tooling/mcp/db-schema.mjs +56 -0
  646. package/esm/tooling/mcp/db-schema.mjs.map +1 -0
  647. package/esm/tooling/mcp/docs-search.d.mts +72 -0
  648. package/esm/tooling/mcp/docs-search.d.mts.map +1 -0
  649. package/esm/tooling/mcp/docs-search.mjs +178 -0
  650. package/esm/tooling/mcp/docs-search.mjs.map +1 -0
  651. package/esm/tooling/mcp/index.mjs +9 -0
  652. package/esm/tooling/mcp/load-ai-tools.d.mts +62 -0
  653. package/esm/tooling/mcp/load-ai-tools.d.mts.map +1 -0
  654. package/esm/tooling/mcp/load-ai-tools.mjs +44 -0
  655. package/esm/tooling/mcp/load-ai-tools.mjs.map +1 -0
  656. package/esm/tooling/mcp/mcp-tools.d.mts +60 -0
  657. package/esm/tooling/mcp/mcp-tools.d.mts.map +1 -0
  658. package/esm/tooling/mcp/mcp-tools.mjs +513 -0
  659. package/esm/tooling/mcp/mcp-tools.mjs.map +1 -0
  660. package/esm/tooling/mcp/start-mcp-server.d.mts +56 -0
  661. package/esm/tooling/mcp/start-mcp-server.d.mts.map +1 -0
  662. package/esm/tooling/mcp/start-mcp-server.mjs +126 -0
  663. package/esm/tooling/mcp/start-mcp-server.mjs.map +1 -0
  664. package/esm/tooling/mcp/tool-input.d.mts +75 -0
  665. package/esm/tooling/mcp/tool-input.d.mts.map +1 -0
  666. package/esm/tooling/mcp/tool-input.mjs +72 -0
  667. package/esm/tooling/mcp/tool-input.mjs.map +1 -0
  668. package/esm/tooling/problem.d.mts +45 -0
  669. package/esm/tooling/problem.d.mts.map +1 -0
  670. package/esm/tooling/problem.mjs +28 -0
  671. package/esm/tooling/problem.mjs.map +1 -0
  672. package/esm/tooling/trace/trace-report.types.d.mts +71 -0
  673. package/esm/tooling/trace/trace-report.types.d.mts.map +1 -0
  674. package/esm/tooling/trace/trace-report.types.mjs +7 -0
  675. package/esm/tooling/trace/trace-report.types.mjs.map +1 -0
  676. package/esm/tooling/trace/trace-request.d.mts +83 -0
  677. package/esm/tooling/trace/trace-request.d.mts.map +1 -0
  678. package/esm/tooling/trace/trace-request.mjs +241 -0
  679. package/esm/tooling/trace/trace-request.mjs.map +1 -0
  680. package/esm/tooling/typecheck/index.d.mts +1 -0
  681. package/esm/tooling/typecheck/index.mjs +3 -0
  682. package/esm/tooling/typecheck/run-typecheck.d.mts +59 -0
  683. package/esm/tooling/typecheck/run-typecheck.d.mts.map +1 -0
  684. package/esm/tooling/typecheck/run-typecheck.mjs +153 -0
  685. package/esm/tooling/typecheck/run-typecheck.mjs.map +1 -0
  686. package/esm/upgrade/codemods/head-viewport.mjs +46 -0
  687. package/esm/upgrade/codemods/head-viewport.mjs.map +1 -0
  688. package/esm/upgrade/codemods/helpers.mjs +81 -0
  689. package/esm/upgrade/codemods/helpers.mjs.map +1 -0
  690. package/esm/upgrade/codemods/index.mjs +34 -0
  691. package/esm/upgrade/codemods/index.mjs.map +1 -0
  692. package/esm/upgrade/codemods/logger-sync-calls.mjs +57 -0
  693. package/esm/upgrade/codemods/logger-sync-calls.mjs.map +1 -0
  694. package/esm/upgrade/codemods/package-json.mjs +122 -0
  695. package/esm/upgrade/codemods/package-json.mjs.map +1 -0
  696. package/esm/upgrade/codemods/request-log-snapshot.mjs +82 -0
  697. package/esm/upgrade/codemods/request-log-snapshot.mjs.map +1 -0
  698. package/esm/upgrade/codemods/review-sites.mjs +262 -0
  699. package/esm/upgrade/codemods/review-sites.mjs.map +1 -0
  700. package/esm/upgrade/diff.mjs +119 -0
  701. package/esm/upgrade/diff.mjs.map +1 -0
  702. package/esm/upgrade/format-upgrade-report.mjs +32 -0
  703. package/esm/upgrade/format-upgrade-report.mjs.map +1 -0
  704. package/esm/upgrade/load-ts-morph.mjs +48 -0
  705. package/esm/upgrade/load-ts-morph.mjs.map +1 -0
  706. package/esm/upgrade/notes.mjs +16 -0
  707. package/esm/upgrade/notes.mjs.map +1 -0
  708. package/esm/upgrade/run-upgrade.mjs +246 -0
  709. package/esm/upgrade/run-upgrade.mjs.map +1 -0
  710. package/esm/upgrade/upgrade-command.action.mjs +37 -0
  711. package/esm/upgrade/upgrade-command.action.mjs.map +1 -0
  712. package/esm/upgrade/version.mjs +39 -0
  713. package/esm/upgrade/version.mjs.map +1 -0
  714. package/esm/use-cases/use-cases-registry.mjs.map +1 -1
  715. package/esm/utils/clock.d.mts +33 -0
  716. package/esm/utils/clock.d.mts.map +1 -0
  717. package/esm/utils/clock.mjs +27 -0
  718. package/esm/utils/clock.mjs.map +1 -0
  719. package/esm/utils/framework-vesion.mjs +1 -1
  720. package/esm/utils/framework-vesion.mjs.map +1 -1
  721. package/esm/utils/ids.d.mts +32 -0
  722. package/esm/utils/ids.d.mts.map +1 -0
  723. package/esm/utils/ids.mjs +33 -0
  724. package/esm/utils/ids.mjs.map +1 -0
  725. package/esm/utils/index.d.mts +3 -0
  726. package/esm/utils/index.mjs +3 -0
  727. package/esm/utils/runtime.d.mts +59 -0
  728. package/esm/utils/runtime.d.mts.map +1 -0
  729. package/esm/utils/runtime.mjs +85 -0
  730. package/esm/utils/runtime.mjs.map +1 -0
  731. package/esm/validation/index.d.mts +1 -1
  732. package/esm/validation/types.d.mts +57 -2
  733. package/esm/validation/types.d.mts.map +1 -1
  734. package/esm/validation/validateAll.mjs +19 -2
  735. package/esm/validation/validateAll.mjs.map +1 -1
  736. package/esm/validation/validation-failure-status.mjs +15 -0
  737. package/esm/validation/validation-failure-status.mjs.map +1 -0
  738. package/esm/validation/validators/file-validator.d.mts +0 -16
  739. package/esm/validation/validators/file-validator.d.mts.map +1 -1
  740. package/esm/warlock-config/bundle-config.mjs +1 -1
  741. package/esm/warlock-config/types.d.mts +27 -3
  742. package/esm/warlock-config/types.d.mts.map +1 -1
  743. package/llms-full.txt +3166 -736
  744. package/llms.txt +16 -6
  745. package/package.json +43 -13
  746. package/schemas/inspect-report.schema.json +554 -0
  747. package/skills/README.md +9 -0
  748. package/skills/add-connector/SKILL.md +26 -38
  749. package/skills/benchmark-code/SKILL.md +30 -24
  750. package/skills/build-restful/SKILL.md +14 -14
  751. package/skills/build-url/SKILL.md +18 -18
  752. package/skills/configure-app/SKILL.md +107 -14
  753. package/skills/create-controller/SKILL.md +25 -12
  754. package/skills/create-module/SKILL.md +3 -3
  755. package/skills/define-resource/SKILL.md +32 -29
  756. package/skills/encrypt-data/SKILL.md +21 -19
  757. package/skills/generate-openapi/SKILL.md +50 -24
  758. package/skills/hash-password/SKILL.md +2 -2
  759. package/skills/health-checks/SKILL.md +24 -7
  760. package/skills/index.md +9 -4
  761. package/skills/lower-stage3-decorators/SKILL.md +4 -4
  762. package/skills/make-endpoint/SKILL.md +110 -0
  763. package/skills/model-factories/SKILL.md +92 -0
  764. package/skills/process-image/SKILL.md +32 -30
  765. package/skills/register-route/SKILL.md +109 -10
  766. package/skills/request-memo/SKILL.md +1 -1
  767. package/skills/request-tracing/SKILL.md +4 -1
  768. package/skills/resolve-path/SKILL.md +45 -44
  769. package/skills/retry-operation/SKILL.md +20 -11
  770. package/skills/run-app/SKILL.md +106 -22
  771. package/skills/send-response/SKILL.md +179 -14
  772. package/skills/store-file/SKILL.md +93 -53
  773. package/skills/test-fakes/SKILL.md +123 -0
  774. package/skills/test-http/SKILL.md +125 -21
  775. package/skills/test-service/SKILL.md +41 -1
  776. package/skills/update-packages/SKILL.md +29 -18
  777. package/skills/upgrade-from-5-29/SKILL.md +413 -0
  778. package/skills/upload-file/SKILL.md +31 -33
  779. package/skills/use-app-context/SKILL.md +38 -31
  780. package/skills/use-middleware/SKILL.md +45 -25
  781. package/skills/use-model-transformers/SKILL.md +37 -28
  782. package/skills/use-repository/SKILL.md +2 -2
  783. package/skills/validate-input/SKILL.md +72 -28
  784. package/skills/warlock-agents-md/SKILL.md +96 -0
  785. package/skills/warlock-board/SKILL.md +123 -0
  786. package/skills/warlock-check/SKILL.md +132 -0
  787. package/skills/warlock-conventions/SKILL.md +115 -0
  788. package/skills/warlock-doctor/SKILL.md +55 -22
  789. package/skills/warlock-inspect/SKILL.md +134 -0
  790. package/skills/warlock-mcp/SKILL.md +120 -0
  791. package/skills/warlock-routes/SKILL.md +18 -11
  792. package/skills/warlock-trace/SKILL.md +81 -0
  793. package/skills/wire-socket/SKILL.md +8 -8
  794. package/skills/write-seeder/SKILL.md +46 -32
  795. package/skills/write-use-case/SKILL.md +40 -27
  796. package/esm/http/uploads/matches-if-none-match.mjs +0 -13
  797. package/esm/http/uploads/matches-if-none-match.mjs.map +0 -1
@@ -0,0 +1,76 @@
1
+ import { command } from "../../commands/cli-command.mjs";
2
+ import { mcpCommandAction, routeConsoleToStderr } from "./mcp/mcp-command.action.mjs";
3
+
4
+ //#region ../../packages/core/src/cli/commands/mcp.command.ts
5
+ /**
6
+ * `warlock mcp` — serve the app to coding agents over the Model Context
7
+ * Protocol: `inspect_*` (routes, models, config keys, events, pages, jobs…),
8
+ * `db_schema`, `docs_search` / `docs_read` (installed skills and docs only,
9
+ * offline), `explain`, `check_run`, `test_run`, `requests_recent` (from
10
+ * devtools) and `generate_make` / `generate_add` (a diff by default).
11
+ *
12
+ * stdio by default; `--http` serves Streamable HTTP on loopback (a token is
13
+ * required off loopback). Read-only unless `--allow-writes`. Needs
14
+ * `@warlock.js/ai-tools` (optional peer). Boots like `warlock inspect` — no
15
+ * database connection, no port bound for the app — on the first tool call.
16
+ */
17
+ const mcpCommand = command({
18
+ name: "mcp",
19
+ description: "Serve the app to coding agents over MCP (stdio, or --http): inspect, db schema, installed docs, check, tests, devtools requests, generator diffs; read-only unless --allow-writes",
20
+ action: mcpCommandAction,
21
+ persistent: true,
22
+ preAction: async (data) => {
23
+ if (!(data.options.http === true || data.options.host !== void 0 || data.options.port !== void 0)) routeConsoleToStderr();
24
+ },
25
+ preload: {
26
+ runtimeStrategy: "development",
27
+ config: true,
28
+ bootstrap: true
29
+ },
30
+ options: [
31
+ {
32
+ text: "--http",
33
+ description: "Serve MCP Streamable HTTP instead of stdio (loopback, a free port unless --port)",
34
+ type: "boolean"
35
+ },
36
+ {
37
+ text: "--host",
38
+ description: "HTTP bind address (default 127.0.0.1); anything but loopback requires --token",
39
+ type: "string"
40
+ },
41
+ {
42
+ text: "--port",
43
+ description: "HTTP port (default 0: a free port, printed on stderr)",
44
+ type: "string"
45
+ },
46
+ {
47
+ text: "--path",
48
+ description: "HTTP endpoint path (default /mcp)",
49
+ type: "string"
50
+ },
51
+ {
52
+ text: "--token",
53
+ description: "Bearer token HTTP clients must send (or WARLOCK_MCP_TOKEN)",
54
+ type: "string"
55
+ },
56
+ {
57
+ text: "--allow-writes",
58
+ description: "Let generate_make / generate_add write into the project (default: diff only)",
59
+ type: "boolean"
60
+ },
61
+ {
62
+ text: "--url",
63
+ description: "The dev server origin for requests_recent (default: read from .warlock/dev-server.json)",
64
+ type: "string"
65
+ },
66
+ {
67
+ text: "--devtools-path",
68
+ description: "The devtools mount for requests_recent (default /__warlock)",
69
+ type: "string"
70
+ }
71
+ ]
72
+ });
73
+
74
+ //#endregion
75
+ export { mcpCommand };
76
+ //# sourceMappingURL=mcp.command.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.command.mjs","names":[],"sources":["../../../../../../../../../packages/core/src/cli/commands/mcp.command.ts"],"sourcesContent":["import { command } from \"../../commands/cli-command\";\nimport { mcpCommandAction, routeConsoleToStderr } from \"./mcp/mcp-command.action\";\n\n/**\n * `warlock mcp` — serve the app to coding agents over the Model Context\n * Protocol: `inspect_*` (routes, models, config keys, events, pages, jobs…),\n * `db_schema`, `docs_search` / `docs_read` (installed skills and docs only,\n * offline), `explain`, `check_run`, `test_run`, `requests_recent` (from\n * devtools) and `generate_make` / `generate_add` (a diff by default).\n *\n * stdio by default; `--http` serves Streamable HTTP on loopback (a token is\n * required off loopback). Read-only unless `--allow-writes`. Needs\n * `@warlock.js/ai-tools` (optional peer). Boots like `warlock inspect` — no\n * database connection, no port bound for the app — on the first tool call.\n */\nexport const mcpCommand = command({\n name: \"mcp\",\n description:\n \"Serve the app to coding agents over MCP (stdio, or --http): inspect, db schema, installed docs, check, tests, devtools requests, generator diffs; read-only unless --allow-writes\",\n action: mcpCommandAction,\n persistent: true,\n preAction: async (data) => {\n // Before the preloaders: over stdio, anything printed while config loads\n // would corrupt the JSON-RPC stream on stdout.\n const http =\n data.options.http === true ||\n data.options.host !== undefined ||\n data.options.port !== undefined;\n\n if (!http) routeConsoleToStderr();\n },\n preload: {\n runtimeStrategy: \"development\",\n config: true,\n bootstrap: true,\n },\n options: [\n {\n text: \"--http\",\n description:\n \"Serve MCP Streamable HTTP instead of stdio (loopback, a free port unless --port)\",\n type: \"boolean\",\n },\n {\n text: \"--host\",\n description: \"HTTP bind address (default 127.0.0.1); anything but loopback requires --token\",\n type: \"string\",\n },\n {\n text: \"--port\",\n description: \"HTTP port (default 0: a free port, printed on stderr)\",\n type: \"string\",\n },\n {\n text: \"--path\",\n description: \"HTTP endpoint path (default /mcp)\",\n type: \"string\",\n },\n {\n text: \"--token\",\n description: \"Bearer token HTTP clients must send (or WARLOCK_MCP_TOKEN)\",\n type: \"string\",\n },\n {\n text: \"--allow-writes\",\n description: \"Let generate_make / generate_add write into the project (default: diff only)\",\n type: \"boolean\",\n },\n {\n text: \"--url\",\n description:\n \"The dev server origin for requests_recent (default: read from .warlock/dev-server.json)\",\n type: \"string\",\n },\n {\n text: \"--devtools-path\",\n description: \"The devtools mount for requests_recent (default /__warlock)\",\n type: \"string\",\n },\n ],\n});\n"],"mappings":";;;;;;;;;;;;;;;;AAeA,MAAa,aAAa,QAAQ;CAChC,MAAM;CACN,aACE;CACF,QAAQ;CACR,YAAY;CACZ,WAAW,OAAO,SAAS;EAQzB,IAAI,EAJF,KAAK,QAAQ,SAAS,QACtB,KAAK,QAAQ,SAAS,UACtB,KAAK,QAAQ,SAAS,SAEb,qBAAqB;CAClC;CACA,SAAS;EACP,iBAAiB;EACjB,QAAQ;EACR,WAAW;CACb;CACA,SAAS;EACP;GACE,MAAM;GACN,aACE;GACF,MAAM;EACR;EACA;GACE,MAAM;GACN,aAAa;GACb,MAAM;EACR;EACA;GACE,MAAM;GACN,aAAa;GACb,MAAM;EACR;EACA;GACE,MAAM;GACN,aAAa;GACb,MAAM;EACR;EACA;GACE,MAAM;GACN,aAAa;GACb,MAAM;EACR;EACA;GACE,MAAM;GACN,aAAa;GACb,MAAM;EACR;EACA;GACE,MAAM;GACN,aACE;GACF,MAAM;EACR;EACA;GACE,MAAM;GACN,aAAa;GACb,MAAM;EACR;CACF;AACF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"openapi-generator.action.mjs","names":[],"sources":["../../../../../../../../../packages/core/src/cli/commands/openapi-generator.action.ts"],"sourcesContent":["import { mkdir, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { colors } from \"@mongez/copper\";\nimport type { CommandActionData } from \"../../commands/types\";\nimport { collectOpenApiDocument } from \"../../openapi/collect-openapi-document\";\nimport { resolveBuildConfig } from \"../../production/resolve-build-config\";\nimport { rootPath } from \"../../utils/paths\";\n\n/** Where the document goes unless `--out` says otherwise. */\nexport const DEFAULT_OPENAPI_OUTPUT = \"storage/openapi/openapi.json\";\n\ntype OptionValue = CommandActionData[\"options\"][string];\n\nexport function stringOption(value: OptionValue | undefined): string | undefined {\n return typeof value === \"string\" && value.trim().length > 0 ? value.trim() : undefined;\n}\n\n/**\n * Action behind `warlock generate.openapi`.\n *\n * Builds the OpenAPI 3.1 document in a fresh registration child (no connectors are booted),\n * writes it as pretty JSON to `--out` (default `storage/openapi/openapi.json`) and prints the\n * per-route gaps it found as warnings. A child failure is fatal and rejects; gaps never are.\n */\nexport async function generateOpenApiAction({ options }: CommandActionData): Promise<void> {\n const cwd = rootPath();\n const output = path.resolve(cwd, stringOption(options.out) ?? DEFAULT_OPENAPI_OUTPUT);\n\n const { document, warnings } = await collectOpenApiDocument({\n cwd,\n timeoutMs: resolveBuildConfig().routeRegistrationTimeoutMs,\n title: stringOption(options.title),\n server: stringOption(options.server),\n includePages: options.includePages === true,\n });\n\n await mkdir(path.dirname(output), { recursive: true });\n await writeFile(output, `${JSON.stringify(document, null, 2)}\\n`, \"utf8\");\n\n const operations = Object.values(document.paths).reduce(\n (total, item) => total + Object.keys(item).length,\n 0,\n );\n\n console.log(\n colors.greenBright(\n `OpenAPI ${document.openapi} written to ${output} (${Object.keys(document.paths).length} paths, ${operations} operations).`,\n ),\n );\n\n if (warnings.length > 0) {\n console.warn(colors.yellowBright(`\\n${warnings.length} warning${warnings.length === 1 ? \"\" : \"s\"}:`));\n\n for (const warning of warnings) {\n console.warn(` - ${warning}`);\n }\n }\n}\n"],"mappings":";;;;;;;;;AASA,MAAa,yBAAyB;AAItC,SAAgB,aAAa,OAAoD;CAC/E,OAAO,OAAO,UAAU,YAAY,MAAM,KAAK,CAAC,CAAC,SAAS,IAAI,MAAM,KAAK,IAAI;AAC/E;;;;;;;;AASA,eAAsB,sBAAsB,EAAE,WAA6C;CACzF,MAAM,MAAM,SAAS;CACrB,MAAM,SAAS,KAAK,QAAQ,KAAK,aAAa,QAAQ,GAAG,mCAA2B;CAEpF,MAAM,EAAE,UAAU,aAAa,MAAM,uBAAuB;EAC1D;EACA,WAAW,mBAAmB,CAAC,CAAC;EAChC,OAAO,aAAa,QAAQ,KAAK;EACjC,QAAQ,aAAa,QAAQ,MAAM;EACnC,cAAc,QAAQ,iBAAiB;CACzC,CAAC;CAED,MAAM,MAAM,KAAK,QAAQ,MAAM,GAAG,EAAE,WAAW,KAAK,CAAC;CACrD,MAAM,UAAU,QAAQ,GAAG,KAAK,UAAU,UAAU,MAAM,CAAC,EAAE,KAAK,MAAM;CAExE,MAAM,aAAa,OAAO,OAAO,SAAS,KAAK,CAAC,CAAC,QAC9C,OAAO,SAAS,QAAQ,OAAO,KAAK,IAAI,CAAC,CAAC,QAC3C,CACF;CAEA,QAAQ,IACN,OAAO,YACL,WAAW,SAAS,QAAQ,cAAc,OAAO,IAAI,OAAO,KAAK,SAAS,KAAK,CAAC,CAAC,OAAO,UAAU,WAAW,cAC/G,CACF;CAEA,IAAI,SAAS,SAAS,GAAG;EACvB,QAAQ,KAAK,OAAO,aAAa,KAAK,SAAS,OAAO,UAAU,SAAS,WAAW,IAAI,KAAK,IAAI,EAAE,CAAC;EAEpG,KAAK,MAAM,WAAW,UACpB,QAAQ,KAAK,OAAO,SAAS;CAEjC;AACF"}
1
+ {"version":3,"file":"openapi-generator.action.mjs","names":[],"sources":["../../../../../../../../../packages/core/src/cli/commands/openapi-generator.action.ts"],"sourcesContent":["import { mkdir, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { colors } from \"@mongez/copper\";\nimport type { CommandActionData } from \"../../commands/types\";\nimport { collectOpenApiDocument } from \"../../openapi/collect-openapi-document\";\nimport { resolveBuildConfig } from \"../../production/resolve-build-config\";\nimport { rootPath } from \"../../utils/paths\";\n\n/** Where the document goes unless `--out` says otherwise. */\nexport const DEFAULT_OPENAPI_OUTPUT = \"storage/openapi/openapi.json\";\n\ntype OptionValue = CommandActionData[\"options\"][string];\n\nexport function stringOption(value: OptionValue | undefined): string | undefined {\n return typeof value === \"string\" && value.trim().length > 0 ? value.trim() : undefined;\n}\n\n/**\n * Action behind `warlock generate.openapi`.\n *\n * Builds the OpenAPI 3.1 document in a fresh registration child (no connectors are booted),\n * writes it as pretty JSON to `--out` (default `storage/openapi/openapi.json`) and prints the\n * per-route gaps it found as warnings. A child failure is fatal and rejects; gaps never are.\n */\nexport async function generateOpenApiAction({ options }: CommandActionData): Promise<void> {\n const cwd = rootPath();\n const output = path.resolve(cwd, stringOption(options.out) ?? DEFAULT_OPENAPI_OUTPUT);\n\n const { document, warnings } = await collectOpenApiDocument({\n cwd,\n timeoutMs: resolveBuildConfig().routeRegistrationTimeoutMs,\n title: stringOption(options.title),\n server: stringOption(options.server),\n includePages: options.includePages === true,\n });\n\n await mkdir(path.dirname(output), { recursive: true });\n await writeFile(output, `${JSON.stringify(document, null, 2)}\\n`, \"utf8\");\n\n const operations = Object.values(document.paths).reduce(\n (total, item) => total + Object.keys(item).length,\n 0,\n );\n\n console.log(\n colors.greenBright(\n `OpenAPI ${document.openapi} written to ${output} (${Object.keys(document.paths).length} paths, ${operations} operations).`,\n ),\n );\n\n if (warnings.length > 0) {\n console.warn(\n colors.yellowBright(`\\n${warnings.length} warning${warnings.length === 1 ? \"\" : \"s\"}:`),\n );\n\n for (const warning of warnings) {\n console.warn(` - ${warning}`);\n }\n }\n}\n"],"mappings":";;;;;;;;;AASA,MAAa,yBAAyB;AAItC,SAAgB,aAAa,OAAoD;CAC/E,OAAO,OAAO,UAAU,YAAY,MAAM,KAAK,CAAC,CAAC,SAAS,IAAI,MAAM,KAAK,IAAI;AAC/E;;;;;;;;AASA,eAAsB,sBAAsB,EAAE,WAA6C;CACzF,MAAM,MAAM,SAAS;CACrB,MAAM,SAAS,KAAK,QAAQ,KAAK,aAAa,QAAQ,GAAG,mCAA2B;CAEpF,MAAM,EAAE,UAAU,aAAa,MAAM,uBAAuB;EAC1D;EACA,WAAW,mBAAmB,CAAC,CAAC;EAChC,OAAO,aAAa,QAAQ,KAAK;EACjC,QAAQ,aAAa,QAAQ,MAAM;EACnC,cAAc,QAAQ,iBAAiB;CACzC,CAAC;CAED,MAAM,MAAM,KAAK,QAAQ,MAAM,GAAG,EAAE,WAAW,KAAK,CAAC;CACrD,MAAM,UAAU,QAAQ,GAAG,KAAK,UAAU,UAAU,MAAM,CAAC,EAAE,KAAK,MAAM;CAExE,MAAM,aAAa,OAAO,OAAO,SAAS,KAAK,CAAC,CAAC,QAC9C,OAAO,SAAS,QAAQ,OAAO,KAAK,IAAI,CAAC,CAAC,QAC3C,CACF;CAEA,QAAQ,IACN,OAAO,YACL,WAAW,SAAS,QAAQ,cAAc,OAAO,IAAI,OAAO,KAAK,SAAS,KAAK,CAAC,CAAC,OAAO,UAAU,WAAW,cAC/G,CACF;CAEA,IAAI,SAAS,SAAS,GAAG;EACvB,QAAQ,KACN,OAAO,aAAa,KAAK,SAAS,OAAO,UAAU,SAAS,WAAW,IAAI,KAAK,IAAI,EAAE,CACxF;EAEA,KAAK,MAAM,WAAW,UACpB,QAAQ,KAAK,OAAO,SAAS;CAEjC;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"openapi-generator.command.mjs","names":[],"sources":["../../../../../../../../../packages/core/src/cli/commands/openapi-generator.command.ts"],"sourcesContent":["import { command } from \"../../commands/cli-command\";\nimport { generateOpenApiAction } from \"./openapi-generator.action\";\n\n/**\n * `warlock generate.openapi` — write an OpenAPI 3.1 document derived from the registered\n * routes, handler validation, declared `responseSchema` and auth middleware.\n *\n * Named with a dot like `generate.typings`; the `generate` command itself is the scaffolder.\n * Routes are read in the same isolated child process `warlock build` uses, so no connector\n * is started and the app keeps running untouched.\n */\nexport const openApiGeneratorCommand = command({\n name: \"generate.openapi\",\n description: \"Generate an OpenAPI 3.1 document (storage/openapi/openapi.json) from the routes\",\n action: generateOpenApiAction,\n preload: {\n warlockConfig: true,\n },\n options: [\n {\n text: \"--out, -o\",\n description: \"Output file, relative to the project root (default storage/openapi/openapi.json)\",\n type: \"string\",\n },\n {\n text: \"--title\",\n description: \"info.title (default: the name in package.json)\",\n type: \"string\",\n },\n {\n text: \"--server\",\n description: \"servers[0].url (default: built from the http config)\",\n type: \"string\",\n },\n {\n text: \"--include-pages\",\n description: \"Also document page (SSR) routes\",\n type: \"boolean\",\n },\n ],\n});\n"],"mappings":";;;;;;;;;;;;AAWA,MAAa,0BAA0B,QAAQ;CAC7C,MAAM;CACN,aAAa;CACb,QAAQ;CACR,SAAS,EACP,eAAe,KACjB;CACA,SAAS;EACP;GACE,MAAM;GACN,aAAa;GACb,MAAM;EACR;EACA;GACE,MAAM;GACN,aAAa;GACb,MAAM;EACR;EACA;GACE,MAAM;GACN,aAAa;GACb,MAAM;EACR;EACA;GACE,MAAM;GACN,aAAa;GACb,MAAM;EACR;CACF;AACF,CAAC"}
1
+ {"version":3,"file":"openapi-generator.command.mjs","names":[],"sources":["../../../../../../../../../packages/core/src/cli/commands/openapi-generator.command.ts"],"sourcesContent":["import { command } from \"../../commands/cli-command\";\nimport { generateOpenApiAction } from \"./openapi-generator.action\";\n\n/**\n * `warlock generate.openapi` — write an OpenAPI 3.1 document derived from the registered\n * routes, handler validation, declared `responseSchema` and auth middleware.\n *\n * Named with a dot like `generate.typings`; the `generate` command itself is the scaffolder.\n * Routes are read in the same isolated child process `warlock build` uses, so no connector\n * is started and the app keeps running untouched.\n */\nexport const openApiGeneratorCommand = command({\n name: \"generate.openapi\",\n description: \"Generate an OpenAPI 3.1 document (storage/openapi/openapi.json) from the routes\",\n action: generateOpenApiAction,\n preload: {\n warlockConfig: true,\n },\n options: [\n {\n text: \"--out, -o\",\n description:\n \"Output file, relative to the project root (default storage/openapi/openapi.json)\",\n type: \"string\",\n },\n {\n text: \"--title\",\n description: \"info.title (default: the name in package.json)\",\n type: \"string\",\n },\n {\n text: \"--server\",\n description: \"servers[0].url (default: built from the http config)\",\n type: \"string\",\n },\n {\n text: \"--include-pages\",\n description: \"Also document page (SSR) routes\",\n type: \"boolean\",\n },\n ],\n});\n"],"mappings":";;;;;;;;;;;;AAWA,MAAa,0BAA0B,QAAQ;CAC7C,MAAM;CACN,aAAa;CACb,QAAQ;CACR,SAAS,EACP,eAAe,KACjB;CACA,SAAS;EACP;GACE,MAAM;GACN,aACE;GACF,MAAM;EACR;EACA;GACE,MAAM;GACN,aAAa;GACb,MAAM;EACR;EACA;GACE,MAAM;GACN,aAAa;GACb,MAAM;EACR;EACA;GACE,MAAM;GACN,aAAa;GACb,MAAM;EACR;CACF;AACF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"postman-generator.action.mjs","names":[],"sources":["../../../../../../../../../packages/core/src/cli/commands/postman-generator.action.ts"],"sourcesContent":["import { mkdir, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { colors } from \"@mongez/copper\";\nimport type { CommandActionData } from \"../../commands/types\";\nimport { collectOpenApiDocument } from \"../../openapi/collect-openapi-document\";\nimport { openApiToPostmanCollection } from \"../../openapi/postman/openapi-to-postman-collection\";\nimport type { PostmanItem } from \"../../openapi/postman/postman-types\";\nimport { resolveBuildConfig } from \"../../production/resolve-build-config\";\nimport { rootPath } from \"../../utils/paths\";\nimport { stringOption } from \"./openapi-generator.action\";\n\n/** Where the collection goes unless `--out` says otherwise. */\nexport const DEFAULT_POSTMAN_OUTPUT = \"storage/postman/collection.json\";\n\nfunction countRequests(items: readonly PostmanItem[]): number {\n return items.reduce((total, item) => total + (\"item\" in item ? countRequests(item.item) : 1), 0);\n}\n\n/**\n * Action behind `warlock generate.postman`.\n *\n * Gets the OpenAPI document exactly as `generate.openapi` does (same registration child, same\n * options), converts it to a Postman Collection v2.1.0 in this process and writes it as\n * pretty JSON to `--out` (default `storage/postman/collection.json`). The per-route gaps the\n * document builder found are printed as warnings. A child failure is fatal and rejects.\n */\nexport async function generatePostmanAction({ options }: CommandActionData): Promise<void> {\n const cwd = rootPath();\n const output = path.resolve(cwd, stringOption(options.out) ?? DEFAULT_POSTMAN_OUTPUT);\n\n const { document, warnings } = await collectOpenApiDocument({\n cwd,\n timeoutMs: resolveBuildConfig().routeRegistrationTimeoutMs,\n title: stringOption(options.title),\n server: stringOption(options.server),\n includePages: options.includePages === true,\n });\n\n const collection = openApiToPostmanCollection(document);\n\n await mkdir(path.dirname(output), { recursive: true });\n await writeFile(output, `${JSON.stringify(collection, null, 2)}\\n`, \"utf8\");\n\n const folders = collection.item.filter((item) => \"item\" in item).length;\n\n console.log(\n colors.greenBright(\n `Postman collection written to ${output} (${folders} folder${folders === 1 ? \"\" : \"s\"}, ${countRequests(collection.item)} requests). Import it in Postman and set the {{token}} variable.`,\n ),\n );\n\n if (warnings.length > 0) {\n console.warn(colors.yellowBright(`\\n${warnings.length} warning${warnings.length === 1 ? \"\" : \"s\"}:`));\n\n for (const warning of warnings) {\n console.warn(` - ${warning}`);\n }\n }\n}\n"],"mappings":";;;;;;;;;;;AAYA,MAAa,yBAAyB;AAEtC,SAAS,cAAc,OAAuC;CAC5D,OAAO,MAAM,QAAQ,OAAO,SAAS,SAAS,UAAU,OAAO,cAAc,KAAK,IAAI,IAAI,IAAI,CAAC;AACjG;;;;;;;;;AAUA,eAAsB,sBAAsB,EAAE,WAA6C;CACzF,MAAM,MAAM,SAAS;CACrB,MAAM,SAAS,KAAK,QAAQ,KAAK,aAAa,QAAQ,GAAG,sCAA2B;CAEpF,MAAM,EAAE,UAAU,aAAa,MAAM,uBAAuB;EAC1D;EACA,WAAW,mBAAmB,CAAC,CAAC;EAChC,OAAO,aAAa,QAAQ,KAAK;EACjC,QAAQ,aAAa,QAAQ,MAAM;EACnC,cAAc,QAAQ,iBAAiB;CACzC,CAAC;CAED,MAAM,aAAa,2BAA2B,QAAQ;CAEtD,MAAM,MAAM,KAAK,QAAQ,MAAM,GAAG,EAAE,WAAW,KAAK,CAAC;CACrD,MAAM,UAAU,QAAQ,GAAG,KAAK,UAAU,YAAY,MAAM,CAAC,EAAE,KAAK,MAAM;CAE1E,MAAM,UAAU,WAAW,KAAK,QAAQ,SAAS,UAAU,IAAI,CAAC,CAAC;CAEjE,QAAQ,IACN,OAAO,YACL,iCAAiC,OAAO,IAAI,QAAQ,SAAS,YAAY,IAAI,KAAK,IAAI,IAAI,cAAc,WAAW,IAAI,EAAE,iEAC3H,CACF;CAEA,IAAI,SAAS,SAAS,GAAG;EACvB,QAAQ,KAAK,OAAO,aAAa,KAAK,SAAS,OAAO,UAAU,SAAS,WAAW,IAAI,KAAK,IAAI,EAAE,CAAC;EAEpG,KAAK,MAAM,WAAW,UACpB,QAAQ,KAAK,OAAO,SAAS;CAEjC;AACF"}
1
+ {"version":3,"file":"postman-generator.action.mjs","names":[],"sources":["../../../../../../../../../packages/core/src/cli/commands/postman-generator.action.ts"],"sourcesContent":["import { mkdir, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { colors } from \"@mongez/copper\";\nimport type { CommandActionData } from \"../../commands/types\";\nimport { collectOpenApiDocument } from \"../../openapi/collect-openapi-document\";\nimport { openApiToPostmanCollection } from \"../../openapi/postman/openapi-to-postman-collection\";\nimport type { PostmanItem } from \"../../openapi/postman/postman-types\";\nimport { resolveBuildConfig } from \"../../production/resolve-build-config\";\nimport { rootPath } from \"../../utils/paths\";\nimport { stringOption } from \"./openapi-generator.action\";\n\n/** Where the collection goes unless `--out` says otherwise. */\nexport const DEFAULT_POSTMAN_OUTPUT = \"storage/postman/collection.json\";\n\nfunction countRequests(items: readonly PostmanItem[]): number {\n return items.reduce((total, item) => total + (\"item\" in item ? countRequests(item.item) : 1), 0);\n}\n\n/**\n * Action behind `warlock generate.postman`.\n *\n * Gets the OpenAPI document exactly as `generate.openapi` does (same registration child, same\n * options), converts it to a Postman Collection v2.1.0 in this process and writes it as\n * pretty JSON to `--out` (default `storage/postman/collection.json`). The per-route gaps the\n * document builder found are printed as warnings. A child failure is fatal and rejects.\n */\nexport async function generatePostmanAction({ options }: CommandActionData): Promise<void> {\n const cwd = rootPath();\n const output = path.resolve(cwd, stringOption(options.out) ?? DEFAULT_POSTMAN_OUTPUT);\n\n const { document, warnings } = await collectOpenApiDocument({\n cwd,\n timeoutMs: resolveBuildConfig().routeRegistrationTimeoutMs,\n title: stringOption(options.title),\n server: stringOption(options.server),\n includePages: options.includePages === true,\n });\n\n const collection = openApiToPostmanCollection(document);\n\n await mkdir(path.dirname(output), { recursive: true });\n await writeFile(output, `${JSON.stringify(collection, null, 2)}\\n`, \"utf8\");\n\n const folders = collection.item.filter((item) => \"item\" in item).length;\n\n console.log(\n colors.greenBright(\n `Postman collection written to ${output} (${folders} folder${folders === 1 ? \"\" : \"s\"}, ${countRequests(collection.item)} requests). Import it in Postman and set the {{token}} variable.`,\n ),\n );\n\n if (warnings.length > 0) {\n console.warn(\n colors.yellowBright(`\\n${warnings.length} warning${warnings.length === 1 ? \"\" : \"s\"}:`),\n );\n\n for (const warning of warnings) {\n console.warn(` - ${warning}`);\n }\n }\n}\n"],"mappings":";;;;;;;;;;;AAYA,MAAa,yBAAyB;AAEtC,SAAS,cAAc,OAAuC;CAC5D,OAAO,MAAM,QAAQ,OAAO,SAAS,SAAS,UAAU,OAAO,cAAc,KAAK,IAAI,IAAI,IAAI,CAAC;AACjG;;;;;;;;;AAUA,eAAsB,sBAAsB,EAAE,WAA6C;CACzF,MAAM,MAAM,SAAS;CACrB,MAAM,SAAS,KAAK,QAAQ,KAAK,aAAa,QAAQ,GAAG,sCAA2B;CAEpF,MAAM,EAAE,UAAU,aAAa,MAAM,uBAAuB;EAC1D;EACA,WAAW,mBAAmB,CAAC,CAAC;EAChC,OAAO,aAAa,QAAQ,KAAK;EACjC,QAAQ,aAAa,QAAQ,MAAM;EACnC,cAAc,QAAQ,iBAAiB;CACzC,CAAC;CAED,MAAM,aAAa,2BAA2B,QAAQ;CAEtD,MAAM,MAAM,KAAK,QAAQ,MAAM,GAAG,EAAE,WAAW,KAAK,CAAC;CACrD,MAAM,UAAU,QAAQ,GAAG,KAAK,UAAU,YAAY,MAAM,CAAC,EAAE,KAAK,MAAM;CAE1E,MAAM,UAAU,WAAW,KAAK,QAAQ,SAAS,UAAU,IAAI,CAAC,CAAC;CAEjE,QAAQ,IACN,OAAO,YACL,iCAAiC,OAAO,IAAI,QAAQ,SAAS,YAAY,IAAI,KAAK,IAAI,IAAI,cAAc,WAAW,IAAI,EAAE,iEAC3H,CACF;CAEA,IAAI,SAAS,SAAS,GAAG;EACvB,QAAQ,KACN,OAAO,aAAa,KAAK,SAAS,OAAO,UAAU,SAAS,WAAW,IAAI,KAAK,IAAI,EAAE,CACxF;EAEA,KAAK,MAAM,WAAW,UACpB,QAAQ,KAAK,OAAO,SAAS;CAEjC;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"postman-generator.command.mjs","names":[],"sources":["../../../../../../../../../packages/core/src/cli/commands/postman-generator.command.ts"],"sourcesContent":["import { command } from \"../../commands/cli-command\";\nimport { generatePostmanAction } from \"./postman-generator.action\";\n\n/**\n * `warlock generate.postman` — write a Postman Collection v2.1.0 derived from the same\n * OpenAPI document `generate.openapi` produces, so the two never disagree.\n *\n * Routes are read in the same isolated child process `warlock build` uses; the conversion\n * itself is pure and runs in the CLI process.\n */\nexport const postmanGeneratorCommand = command({\n name: \"generate.postman\",\n description: \"Generate a Postman collection (storage/postman/collection.json) from the routes\",\n action: generatePostmanAction,\n preload: {\n warlockConfig: true,\n },\n options: [\n {\n text: \"--out, -o\",\n description: \"Output file, relative to the project root (default storage/postman/collection.json)\",\n type: \"string\",\n },\n {\n text: \"--title\",\n description: \"Collection name (default: the name in package.json)\",\n type: \"string\",\n },\n {\n text: \"--server\",\n description: \"Value of {{baseUrl}} (default: built from the http config)\",\n type: \"string\",\n },\n {\n text: \"--include-pages\",\n description: \"Also include page (SSR) routes\",\n type: \"boolean\",\n },\n ],\n});\n"],"mappings":";;;;;;;;;;;AAUA,MAAa,0BAA0B,QAAQ;CAC7C,MAAM;CACN,aAAa;CACb,QAAQ;CACR,SAAS,EACP,eAAe,KACjB;CACA,SAAS;EACP;GACE,MAAM;GACN,aAAa;GACb,MAAM;EACR;EACA;GACE,MAAM;GACN,aAAa;GACb,MAAM;EACR;EACA;GACE,MAAM;GACN,aAAa;GACb,MAAM;EACR;EACA;GACE,MAAM;GACN,aAAa;GACb,MAAM;EACR;CACF;AACF,CAAC"}
1
+ {"version":3,"file":"postman-generator.command.mjs","names":[],"sources":["../../../../../../../../../packages/core/src/cli/commands/postman-generator.command.ts"],"sourcesContent":["import { command } from \"../../commands/cli-command\";\nimport { generatePostmanAction } from \"./postman-generator.action\";\n\n/**\n * `warlock generate.postman` — write a Postman Collection v2.1.0 derived from the same\n * OpenAPI document `generate.openapi` produces, so the two never disagree.\n *\n * Routes are read in the same isolated child process `warlock build` uses; the conversion\n * itself is pure and runs in the CLI process.\n */\nexport const postmanGeneratorCommand = command({\n name: \"generate.postman\",\n description: \"Generate a Postman collection (storage/postman/collection.json) from the routes\",\n action: generatePostmanAction,\n preload: {\n warlockConfig: true,\n },\n options: [\n {\n text: \"--out, -o\",\n description:\n \"Output file, relative to the project root (default storage/postman/collection.json)\",\n type: \"string\",\n },\n {\n text: \"--title\",\n description: \"Collection name (default: the name in package.json)\",\n type: \"string\",\n },\n {\n text: \"--server\",\n description: \"Value of {{baseUrl}} (default: built from the http config)\",\n type: \"string\",\n },\n {\n text: \"--include-pages\",\n description: \"Also include page (SSR) routes\",\n type: \"boolean\",\n },\n ],\n});\n"],"mappings":";;;;;;;;;;;AAUA,MAAa,0BAA0B,QAAQ;CAC7C,MAAM;CACN,aAAa;CACb,QAAQ;CACR,SAAS,EACP,eAAe,KACjB;CACA,SAAS;EACP;GACE,MAAM;GACN,aACE;GACF,MAAM;EACR;EACA;GACE,MAAM;GACN,aAAa;GACb,MAAM;EACR;EACA;GACE,MAAM;GACN,aAAa;GACb,MAAM;EACR;EACA;GACE,MAAM;GACN,aAAa;GACb,MAAM;EACR;CACF;AACF,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import { router } from "../../../router/router.mjs";
2
- import { resolveBuildConfig } from "../../../production/resolve-build-config.mjs";
3
2
  import { bootForDiagnostics } from "../doctor/boot-for-diagnostics.mjs";
3
+ import { resolveBuildConfig } from "../../../production/resolve-build-config.mjs";
4
4
  import { comparePageRoutes, diffPageRoutes } from "./diff-page-routes.mjs";
5
5
  import path from "node:path";
6
6
  import fs from "node:fs";
@@ -0,0 +1,131 @@
1
+ import { command } from "../../commands/cli-command.mjs";
2
+ import { createRequire } from "node:module";
3
+ import path from "node:path";
4
+ import { existsSync, readFileSync } from "node:fs";
5
+ import { spawn } from "node:child_process";
6
+
7
+ //#region ../../packages/core/src/cli/commands/test.command.ts
8
+ /**
9
+ * Translate `warlock test` options into Vitest arguments. Pure, so the mapping
10
+ * is pinned by a test rather than discovered in CI.
11
+ *
12
+ * Flags used (verified against `vitest --help`, Vitest 4.1):
13
+ * `run`, `related [...filters]`, `--changed [since]`, `--passWithNoTests`,
14
+ * `--reporter <name>`, `--testNamePattern <pattern>`.
15
+ */
16
+ function buildVitestArguments(options) {
17
+ const related = options.related ?? [];
18
+ const args = [];
19
+ if (related.length > 0) {
20
+ args.push("related", ...related, ...options.filters);
21
+ if (!options.watch) args.push("--run");
22
+ } else {
23
+ if (!options.watch) args.push("run");
24
+ args.push(...options.filters);
25
+ }
26
+ if (options.changed || options.since) {
27
+ args.push("--changed");
28
+ if (options.since) args.push(options.since);
29
+ }
30
+ if (related.length > 0 || options.changed || options.since) args.push("--passWithNoTests");
31
+ if (options.testNamePattern) args.push("--testNamePattern", options.testNamePattern);
32
+ if (options.json) args.push("--reporter=json");
33
+ return args;
34
+ }
35
+ /** Read `warlock test`'s parsed CLI input into {@link TestCommandOptions}. */
36
+ function readTestCommandOptions(data) {
37
+ const text = (value) => typeof value === "string" && value.trim() !== "" ? value.trim() : void 0;
38
+ const relatedOption = text(data.options.related);
39
+ return {
40
+ filters: data.args,
41
+ changed: data.options.changed === true,
42
+ since: text(data.options.since),
43
+ related: relatedOption ? relatedOption.split(",").map((file) => file.trim()).filter(Boolean) : void 0,
44
+ watch: data.options.watch === true,
45
+ json: data.options.json === true,
46
+ testNamePattern: text(data.options.testNamePattern) ?? text(data.options.t)
47
+ };
48
+ }
49
+ /**
50
+ * The project's own Vitest entry (`vitest.mjs`), resolved from the project
51
+ * root — never a global or an `npx` download.
52
+ */
53
+ function resolveProjectVitest(projectRoot, resolve = createRequire(path.join(projectRoot, "package.json")).resolve) {
54
+ let manifestPath;
55
+ try {
56
+ manifestPath = resolve("vitest/package.json");
57
+ } catch {
58
+ throw new Error(`Vitest is not installed in ${projectRoot}. Run \`warlock add test\` (or install vitest as a dev dependency) first.`);
59
+ }
60
+ const manifest = JSON.parse(readFileSync(manifestPath, "utf8"));
61
+ const bin = typeof manifest.bin === "string" ? manifest.bin : manifest.bin?.vitest;
62
+ const entry = path.join(path.dirname(manifestPath), bin ?? "vitest.mjs");
63
+ if (!existsSync(entry)) throw new Error(`Vitest's entry point was not found at ${entry}. Reinstall vitest.`);
64
+ return entry;
65
+ }
66
+ async function testCommandAction(data) {
67
+ const options = readTestCommandOptions(data);
68
+ const vitest = resolveProjectVitest(process.cwd());
69
+ const args = buildVitestArguments(options);
70
+ const exitCode = await new Promise((resolve, reject) => {
71
+ const child = spawn(process.execPath, [vitest, ...args], {
72
+ cwd: process.cwd(),
73
+ env: {
74
+ ...process.env,
75
+ NODE_ENV: "test"
76
+ },
77
+ stdio: "inherit"
78
+ });
79
+ child.once("error", reject);
80
+ child.once("exit", (code, signal) => resolve(code ?? (signal ? 1 : 0)));
81
+ });
82
+ if (exitCode !== 0) process.exit(exitCode);
83
+ }
84
+ /**
85
+ * `warlock test` — run the project's tests through its own Vitest.
86
+ *
87
+ * @example
88
+ * warlock test # everything, once
89
+ * warlock test --changed # tests affected by uncommitted changes
90
+ * warlock test --changed --since main # ... by changes since main
91
+ * warlock test --related src/app/posts/services/create-post.service.ts
92
+ * warlock test src/app/posts --json # one folder, JSON report on stdout
93
+ */
94
+ const testCommand = command({
95
+ name: "test [filters...]",
96
+ description: "Run the project's tests with Vitest; --changed / --related run only the tests your change affects",
97
+ action: testCommandAction,
98
+ options: [
99
+ {
100
+ text: "--changed",
101
+ description: "Only run tests affected by uncommitted changes (git)",
102
+ type: "boolean"
103
+ },
104
+ {
105
+ text: "--since <ref>",
106
+ description: "With --changed: tests affected by changes since this git ref (e.g. main)"
107
+ },
108
+ {
109
+ text: "--related <files>",
110
+ description: "Comma-separated source files: only run the tests that import them"
111
+ },
112
+ {
113
+ text: "--watch, -w",
114
+ description: "Re-run on change instead of running once",
115
+ type: "boolean"
116
+ },
117
+ {
118
+ text: "--test-name-pattern, -t",
119
+ description: "Only run tests whose name matches this pattern"
120
+ },
121
+ {
122
+ text: "--json",
123
+ description: "Print Vitest's JSON report on stdout",
124
+ type: "boolean"
125
+ }
126
+ ]
127
+ });
128
+
129
+ //#endregion
130
+ export { testCommand };
131
+ //# sourceMappingURL=test.command.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.command.mjs","names":[],"sources":["../../../../../../../../../packages/core/src/cli/commands/test.command.ts"],"sourcesContent":["import { spawn } from \"node:child_process\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport path from \"node:path\";\nimport { command } from \"../../commands/cli-command\";\nimport type { CommandActionData } from \"../../commands/types\";\n\n/** What `warlock test` was asked for. */\nexport type TestCommandOptions = {\n /** Positional filters: file paths or name fragments, passed to Vitest. */\n filters: string[];\n /** Only the tests affected by uncommitted changes (or by changes since `since`). */\n changed?: boolean;\n /** A git ref for `changed`: tests affected by changes since this commit or branch. */\n since?: string;\n /** Only the tests that import these source files, directly or not. */\n related?: string[];\n /** Keep running and re-run on change instead of running once. */\n watch?: boolean;\n /** Print Vitest's JSON report on stdout. */\n json?: boolean;\n /** Only tests whose name matches this pattern. */\n testNamePattern?: string;\n};\n\n/**\n * Translate `warlock test` options into Vitest arguments. Pure, so the mapping\n * is pinned by a test rather than discovered in CI.\n *\n * Flags used (verified against `vitest --help`, Vitest 4.1):\n * `run`, `related [...filters]`, `--changed [since]`, `--passWithNoTests`,\n * `--reporter <name>`, `--testNamePattern <pattern>`.\n */\nexport function buildVitestArguments(options: TestCommandOptions): string[] {\n const related = options.related ?? [];\n const args: string[] = [];\n\n if (related.length > 0) {\n // `vitest related` watches by default; `--run` makes it run once.\n args.push(\"related\", ...related, ...options.filters);\n\n if (!options.watch) args.push(\"--run\");\n } else {\n if (!options.watch) args.push(\"run\");\n\n args.push(...options.filters);\n }\n\n if (options.changed || options.since) {\n args.push(\"--changed\");\n\n if (options.since) args.push(options.since);\n }\n\n // \"Run what my change affects\" finding nothing to run is a pass, not an error.\n if (related.length > 0 || options.changed || options.since) args.push(\"--passWithNoTests\");\n\n if (options.testNamePattern) args.push(\"--testNamePattern\", options.testNamePattern);\n\n if (options.json) args.push(\"--reporter=json\");\n\n return args;\n}\n\n/** Read `warlock test`'s parsed CLI input into {@link TestCommandOptions}. */\nexport function readTestCommandOptions(data: CommandActionData): TestCommandOptions {\n const text = (value: unknown): string | undefined =>\n typeof value === \"string\" && value.trim() !== \"\" ? value.trim() : undefined;\n const relatedOption = text(data.options.related);\n\n return {\n filters: data.args,\n changed: data.options.changed === true,\n since: text(data.options.since),\n related: relatedOption\n ? relatedOption\n .split(\",\")\n .map((file) => file.trim())\n .filter(Boolean)\n : undefined,\n watch: data.options.watch === true,\n json: data.options.json === true,\n testNamePattern: text(data.options.testNamePattern) ?? text(data.options.t),\n };\n}\n\n/**\n * The project's own Vitest entry (`vitest.mjs`), resolved from the project\n * root — never a global or an `npx` download.\n */\nexport function resolveProjectVitest(\n projectRoot: string,\n resolve: (specifier: string) => string = createRequire(path.join(projectRoot, \"package.json\"))\n .resolve,\n): string {\n let manifestPath: string;\n\n try {\n manifestPath = resolve(\"vitest/package.json\");\n } catch {\n throw new Error(\n `Vitest is not installed in ${projectRoot}. Run \\`warlock add test\\` (or install vitest as a dev dependency) first.`,\n );\n }\n\n const manifest = JSON.parse(readFileSync(manifestPath, \"utf8\")) as {\n bin?: string | Record<string, string>;\n };\n const bin = typeof manifest.bin === \"string\" ? manifest.bin : manifest.bin?.vitest;\n const entry = path.join(path.dirname(manifestPath), bin ?? \"vitest.mjs\");\n\n if (!existsSync(entry)) {\n throw new Error(`Vitest's entry point was not found at ${entry}. Reinstall vitest.`);\n }\n\n return entry;\n}\n\nasync function testCommandAction(data: CommandActionData): Promise<void> {\n const options = readTestCommandOptions(data);\n const vitest = resolveProjectVitest(process.cwd());\n const args = buildVitestArguments(options);\n\n const exitCode = await new Promise<number>((resolve, reject) => {\n const child = spawn(process.execPath, [vitest, ...args], {\n cwd: process.cwd(),\n // Vitest only defaults NODE_ENV to \"test\" when it is unset; an exported\n // NODE_ENV=production would otherwise reach the test server and be refused.\n env: { ...process.env, NODE_ENV: \"test\" },\n stdio: \"inherit\",\n });\n\n child.once(\"error\", reject);\n child.once(\"exit\", (code, signal) => resolve(code ?? (signal ? 1 : 0)));\n });\n\n if (exitCode !== 0) process.exit(exitCode);\n}\n\n/**\n * `warlock test` — run the project's tests through its own Vitest.\n *\n * @example\n * warlock test # everything, once\n * warlock test --changed # tests affected by uncommitted changes\n * warlock test --changed --since main # ... by changes since main\n * warlock test --related src/app/posts/services/create-post.service.ts\n * warlock test src/app/posts --json # one folder, JSON report on stdout\n */\nexport const testCommand = command({\n name: \"test [filters...]\",\n description:\n \"Run the project's tests with Vitest; --changed / --related run only the tests your change affects\",\n action: testCommandAction,\n options: [\n {\n text: \"--changed\",\n description: \"Only run tests affected by uncommitted changes (git)\",\n type: \"boolean\",\n },\n {\n text: \"--since <ref>\",\n description: \"With --changed: tests affected by changes since this git ref (e.g. main)\",\n },\n {\n text: \"--related <files>\",\n description: \"Comma-separated source files: only run the tests that import them\",\n },\n {\n text: \"--watch, -w\",\n description: \"Re-run on change instead of running once\",\n type: \"boolean\",\n },\n {\n text: \"--test-name-pattern, -t\",\n description: \"Only run tests whose name matches this pattern\",\n },\n {\n text: \"--json\",\n description: \"Print Vitest's JSON report on stdout\",\n type: \"boolean\",\n },\n ],\n});\n"],"mappings":"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"}
@@ -0,0 +1,145 @@
1
+ import { ERROR_CODES, errorCodeOf } from "../../../errors/error-codes.mjs";
2
+ import { flushAndExit } from "../../flush-and-exit.mjs";
3
+ import { traceRequest } from "../../../tooling/trace/trace-request.mjs";
4
+ import path from "node:path";
5
+ import { readFileSync } from "node:fs";
6
+ import { colors } from "@mongez/copper";
7
+
8
+ //#region ../../packages/core/src/cli/commands/trace/trace-command.action.ts
9
+ function stringOption(value) {
10
+ return typeof value === "string" && value.trim().length > 0 ? value.trim() : void 0;
11
+ }
12
+ /**
13
+ * Every `--header` / `-H` value in `argv`, in order. The CLI parser keeps only
14
+ * the last value of a repeated option, so headers are read from argv directly.
15
+ * Accepts `--header k:v`, `--header=k:v`, `-H k:v` and `-H=k:v`.
16
+ */
17
+ function collectHeaderValues(argv) {
18
+ const values = [];
19
+ for (let index = 0; index < argv.length; index++) {
20
+ const token = argv[index];
21
+ if (token === void 0) continue;
22
+ const inline = /^(?:--header|-H)=(.*)$/s.exec(token);
23
+ if (inline) {
24
+ values.push(inline[1] ?? "");
25
+ continue;
26
+ }
27
+ if (token === "--header" || token === "-H") {
28
+ const next = argv[index + 1];
29
+ if (next !== void 0) {
30
+ values.push(next);
31
+ index++;
32
+ }
33
+ }
34
+ }
35
+ return values;
36
+ }
37
+ /**
38
+ * Turn `name:value` strings into a header object. The first colon splits; both
39
+ * sides are trimmed. Throws on a value without a colon or with an empty name.
40
+ */
41
+ function parseHeaderValues(values) {
42
+ const headers = {};
43
+ for (const value of values) {
44
+ const colon = value.indexOf(":");
45
+ const name = colon === -1 ? "" : value.slice(0, colon).trim();
46
+ if (name.length === 0) throw new Error(`Invalid --header ${JSON.stringify(value)}: expected name:value.`);
47
+ headers[name] = value.slice(colon + 1).trim();
48
+ }
49
+ return headers;
50
+ }
51
+ /**
52
+ * The request body for `--body`: `@path` reads the file (relative to `cwd`);
53
+ * text that parses as JSON becomes that value (sent as JSON); anything else is
54
+ * sent as the text itself. `undefined` without `--body`.
55
+ */
56
+ function parseTraceBody(value, cwd = process.cwd(), readFile = (file) => readFileSync(file, "utf8")) {
57
+ if (value === void 0) return void 0;
58
+ const text = value.startsWith("@") ? readFile(path.resolve(cwd, value.slice(1))) : value;
59
+ try {
60
+ return JSON.parse(text);
61
+ } catch {
62
+ return text;
63
+ }
64
+ }
65
+ function ms(value) {
66
+ return value === null ? "-" : `${value.toFixed(1)}ms`;
67
+ }
68
+ /** The human summary `warlock trace` prints without `--json`. Uncolored, so it is testable. */
69
+ function formatTraceSummary(report) {
70
+ const { timeline } = report;
71
+ const lines = [`${report.request.method} ${report.request.url} → ${report.response.status} (${report.route ?? "no route"}, id ${report.requestId})`, ` total ${ms(report.timings.totalMs)} server, ${ms(report.timings.clientMs)} round trip`];
72
+ if (timeline.routeMatch) lines.push(` route.match ${ms(timeline.routeMatch.durationMs)}`);
73
+ for (const middleware of timeline.middleware) lines.push(` middleware ${middleware.name ?? "(anonymous)"} ${ms(middleware.durationMs)}`);
74
+ if (timeline.validation.ran) {
75
+ const verdict = timeline.validation.passed ? "passed" : "failed";
76
+ lines.push(` validation ${verdict} ${ms(timeline.validation.durationMs)}`);
77
+ }
78
+ if (timeline.handler) lines.push(` handler ${ms(timeline.handler.durationMs)}`);
79
+ const nPlusOne = report.queries.filter((query) => query.nPlusOne).length;
80
+ lines.push(` queries ${report.queries.length}${nPlusOne > 0 ? ` (${nPlusOne} N+1)` : ""} · logs ${report.logs.length} · cache ${report.cache.length} · mails ${report.mails.length}`);
81
+ for (const warning of report.warnings) if (typeof warning.message === "string") lines.push(` ! ${warning.message}`);
82
+ if (report.error) lines.push(` error: ${report.error}`);
83
+ lines.push("", "Run with --json for the full timeline.");
84
+ return lines;
85
+ }
86
+ /** The exit code for a failed trace: 2 for this machine (WL8xxx), 1 otherwise. */
87
+ function traceFailureExitCode(error) {
88
+ const code = errorCodeOf(error);
89
+ return code !== void 0 && ERROR_CODES[code].category === "environment" ? 2 : 1;
90
+ }
91
+ /**
92
+ * Action behind `warlock trace <method> <url>`.
93
+ *
94
+ * Sends the request to the running dev server and prints its devtools
95
+ * timeline; with `--json`, stdout carries exactly the report. A failure
96
+ * (no dev server, no devtools, no record) prints the coded error — as
97
+ * `{ ok: false, code, message }` with `--json` — and exits 2 for this machine
98
+ * or 1 otherwise.
99
+ *
100
+ * @param data Parsed CLI args: `[method, url]`, `body`, `url`, `devtoolsPath`, `idHeader`, `timeout`, `json`.
101
+ */
102
+ async function traceCommandAction({ args, options }) {
103
+ const json = options.json === true;
104
+ const [method, url] = args;
105
+ try {
106
+ if (!method || !url) throw new Error("Usage: warlock trace <method> <url> [--body json|@file] [--header k:v]");
107
+ const timeout = stringOption(options.timeout);
108
+ const timeoutMs = timeout === void 0 ? void 0 : Number(timeout);
109
+ if (timeoutMs !== void 0 && (!Number.isFinite(timeoutMs) || timeoutMs < 0)) throw new Error(`Invalid --timeout ${JSON.stringify(timeout)}: expected milliseconds.`);
110
+ const report = await traceRequest({
111
+ method,
112
+ url,
113
+ body: parseTraceBody(stringOption(options.body)),
114
+ headers: parseHeaderValues(collectHeaderValues(process.argv)),
115
+ serverUrl: stringOption(options.url),
116
+ devtoolsPath: stringOption(options.devtoolsPath),
117
+ requestIdHeader: stringOption(options.idHeader),
118
+ timeoutMs
119
+ });
120
+ if (json) {
121
+ console.log(JSON.stringify(report, null, 2));
122
+ return;
123
+ }
124
+ const [heading, ...rest] = formatTraceSummary(report);
125
+ console.log(colors.bold(heading ?? ""));
126
+ for (const line of rest) console.log(line);
127
+ } catch (error) {
128
+ const code = errorCodeOf(error) ?? null;
129
+ const message = error instanceof Error ? error.message : String(error);
130
+ if (json) console.log(JSON.stringify({
131
+ ok: false,
132
+ code,
133
+ message
134
+ }, null, 2));
135
+ else {
136
+ console.error(colors.red(`${code ? `${code} ` : ""}${message}`));
137
+ if (code) console.error(` → ${ERROR_CODES[code].fix}`);
138
+ }
139
+ await flushAndExit(traceFailureExitCode(error));
140
+ }
141
+ }
142
+
143
+ //#endregion
144
+ export { traceCommandAction };
145
+ //# sourceMappingURL=trace-command.action.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace-command.action.mjs","names":[],"sources":["../../../../../../../../../../packages/core/src/cli/commands/trace/trace-command.action.ts"],"sourcesContent":["import { readFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { colors } from \"@mongez/copper\";\nimport type { CommandActionData } from \"../../../commands/types\";\nimport { ERROR_CODES, errorCodeOf } from \"../../../errors/error-codes\";\nimport type { TraceReport } from \"../../../tooling/trace/trace-report.types\";\nimport { traceRequest } from \"../../../tooling/trace/trace-request\";\nimport { flushAndExit } from \"../../flush-and-exit\";\n\nfunction stringOption(value: string | number | boolean | undefined): string | undefined {\n return typeof value === \"string\" && value.trim().length > 0 ? value.trim() : undefined;\n}\n\n/**\n * Every `--header` / `-H` value in `argv`, in order. The CLI parser keeps only\n * the last value of a repeated option, so headers are read from argv directly.\n * Accepts `--header k:v`, `--header=k:v`, `-H k:v` and `-H=k:v`.\n */\nexport function collectHeaderValues(argv: readonly string[]): string[] {\n const values: string[] = [];\n\n for (let index = 0; index < argv.length; index++) {\n const token = argv[index];\n\n if (token === undefined) continue;\n\n const inline = /^(?:--header|-H)=(.*)$/s.exec(token);\n\n if (inline) {\n values.push(inline[1] ?? \"\");\n continue;\n }\n\n if (token === \"--header\" || token === \"-H\") {\n const next = argv[index + 1];\n\n if (next !== undefined) {\n values.push(next);\n index++;\n }\n }\n }\n\n return values;\n}\n\n/**\n * Turn `name:value` strings into a header object. The first colon splits; both\n * sides are trimmed. Throws on a value without a colon or with an empty name.\n */\nexport function parseHeaderValues(values: readonly string[]): Record<string, string> {\n const headers: Record<string, string> = {};\n\n for (const value of values) {\n const colon = value.indexOf(\":\");\n const name = colon === -1 ? \"\" : value.slice(0, colon).trim();\n\n if (name.length === 0) {\n throw new Error(`Invalid --header ${JSON.stringify(value)}: expected name:value.`);\n }\n\n headers[name] = value.slice(colon + 1).trim();\n }\n\n return headers;\n}\n\n/**\n * The request body for `--body`: `@path` reads the file (relative to `cwd`);\n * text that parses as JSON becomes that value (sent as JSON); anything else is\n * sent as the text itself. `undefined` without `--body`.\n */\nexport function parseTraceBody(\n value: string | undefined,\n cwd = process.cwd(),\n readFile: (file: string) => string = (file) => readFileSync(file, \"utf8\"),\n): unknown {\n if (value === undefined) return undefined;\n\n const text = value.startsWith(\"@\") ? readFile(path.resolve(cwd, value.slice(1))) : value;\n\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n}\n\nfunction ms(value: number | null): string {\n return value === null ? \"-\" : `${value.toFixed(1)}ms`;\n}\n\n/** The human summary `warlock trace` prints without `--json`. Uncolored, so it is testable. */\nexport function formatTraceSummary(report: TraceReport): string[] {\n const { timeline } = report;\n const lines = [\n `${report.request.method} ${report.request.url} → ${report.response.status} (${report.route ?? \"no route\"}, id ${report.requestId})`,\n ` total ${ms(report.timings.totalMs)} server, ${ms(report.timings.clientMs)} round trip`,\n ];\n\n if (timeline.routeMatch) lines.push(` route.match ${ms(timeline.routeMatch.durationMs)}`);\n\n for (const middleware of timeline.middleware) {\n lines.push(` middleware ${middleware.name ?? \"(anonymous)\"} ${ms(middleware.durationMs)}`);\n }\n\n if (timeline.validation.ran) {\n const verdict = timeline.validation.passed ? \"passed\" : \"failed\";\n\n lines.push(` validation ${verdict} ${ms(timeline.validation.durationMs)}`);\n }\n\n if (timeline.handler) lines.push(` handler ${ms(timeline.handler.durationMs)}`);\n\n const nPlusOne = report.queries.filter((query) => query.nPlusOne).length;\n\n lines.push(\n ` queries ${report.queries.length}${nPlusOne > 0 ? ` (${nPlusOne} N+1)` : \"\"} · logs ${report.logs.length} · cache ${report.cache.length} · mails ${report.mails.length}`,\n );\n\n for (const warning of report.warnings) {\n if (typeof warning.message === \"string\") lines.push(` ! ${warning.message}`);\n }\n\n if (report.error) lines.push(` error: ${report.error}`);\n\n lines.push(\"\", \"Run with --json for the full timeline.\");\n\n return lines;\n}\n\n/** The exit code for a failed trace: 2 for this machine (WL8xxx), 1 otherwise. */\nexport function traceFailureExitCode(error: unknown): 1 | 2 {\n const code = errorCodeOf(error);\n\n return code !== undefined && ERROR_CODES[code].category === \"environment\" ? 2 : 1;\n}\n\n/**\n * Action behind `warlock trace <method> <url>`.\n *\n * Sends the request to the running dev server and prints its devtools\n * timeline; with `--json`, stdout carries exactly the report. A failure\n * (no dev server, no devtools, no record) prints the coded error — as\n * `{ ok: false, code, message }` with `--json` — and exits 2 for this machine\n * or 1 otherwise.\n *\n * @param data Parsed CLI args: `[method, url]`, `body`, `url`, `devtoolsPath`, `idHeader`, `timeout`, `json`.\n */\nexport async function traceCommandAction({ args, options }: CommandActionData): Promise<void> {\n const json = options.json === true;\n const [method, url] = args;\n\n try {\n if (!method || !url) {\n throw new Error(\"Usage: warlock trace <method> <url> [--body json|@file] [--header k:v]\");\n }\n\n const timeout = stringOption(options.timeout);\n const timeoutMs = timeout === undefined ? undefined : Number(timeout);\n\n if (timeoutMs !== undefined && (!Number.isFinite(timeoutMs) || timeoutMs < 0)) {\n throw new Error(`Invalid --timeout ${JSON.stringify(timeout)}: expected milliseconds.`);\n }\n\n const report = await traceRequest({\n method,\n url,\n body: parseTraceBody(stringOption(options.body)),\n headers: parseHeaderValues(collectHeaderValues(process.argv)),\n serverUrl: stringOption(options.url),\n devtoolsPath: stringOption(options.devtoolsPath),\n requestIdHeader: stringOption(options.idHeader),\n timeoutMs,\n });\n\n if (json) {\n console.log(JSON.stringify(report, null, 2));\n return;\n }\n\n const [heading, ...rest] = formatTraceSummary(report);\n\n console.log(colors.bold(heading ?? \"\"));\n\n for (const line of rest) {\n console.log(line);\n }\n } catch (error) {\n const code = errorCodeOf(error) ?? null;\n const message = error instanceof Error ? error.message : String(error);\n\n if (json) {\n console.log(JSON.stringify({ ok: false, code, message }, null, 2));\n } else {\n console.error(colors.red(`${code ? `${code} ` : \"\"}${message}`));\n\n if (code) console.error(` → ${ERROR_CODES[code].fix}`);\n }\n\n await flushAndExit(traceFailureExitCode(error));\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ import { command } from "../../commands/cli-command.mjs";
2
+ import { traceCommandAction } from "./trace/trace-command.action.mjs";
3
+
4
+ //#region ../../packages/core/src/cli/commands/trace.command.ts
5
+ /**
6
+ * `warlock trace <method> <url>` — send one request to the running dev server
7
+ * and print its devtools timeline: middleware, validation result, handler,
8
+ * queries with N+1 flags, logs, cache operations, the response and timings.
9
+ * `--json` prints the versioned report (`schemaVersion: 1`).
10
+ *
11
+ * No preload: nothing boots here. The dev server (`warlock dev` with
12
+ * `@warlock.js/devtools` installed) does the work; this command finds it
13
+ * through `.warlock/dev-server.json` or `--url`.
14
+ */
15
+ const traceCommand = command({
16
+ name: "trace <method> <url>",
17
+ description: "Send a request to the running dev server and print its devtools timeline (middleware, validation, queries, logs, response, timings); --json for the report",
18
+ action: traceCommandAction,
19
+ options: [
20
+ {
21
+ text: "--body, -b",
22
+ description: "Request body: JSON text, plain text, or @file to read it from a file",
23
+ type: "string"
24
+ },
25
+ {
26
+ text: "--header, -H",
27
+ description: "A request header as name:value (repeatable)",
28
+ type: "string"
29
+ },
30
+ {
31
+ text: "--url, -u",
32
+ description: "Dev server origin (default: read from .warlock/dev-server.json)",
33
+ type: "string"
34
+ },
35
+ {
36
+ text: "--devtools-path",
37
+ description: "Devtools mount path (default /__warlock)",
38
+ type: "string"
39
+ },
40
+ {
41
+ text: "--id-header",
42
+ description: "The app's request id header (http.requestId.header; default x-request-id)",
43
+ type: "string"
44
+ },
45
+ {
46
+ text: "--timeout, -t",
47
+ description: "How long to wait for the devtools record, in ms (default 5000)",
48
+ type: "string"
49
+ },
50
+ {
51
+ text: "--json, -j",
52
+ description: "Print the trace report as JSON (schemaVersion 1)",
53
+ type: "boolean"
54
+ }
55
+ ]
56
+ });
57
+
58
+ //#endregion
59
+ export { traceCommand };
60
+ //# sourceMappingURL=trace.command.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace.command.mjs","names":[],"sources":["../../../../../../../../../packages/core/src/cli/commands/trace.command.ts"],"sourcesContent":["import { command } from \"../../commands/cli-command\";\nimport { traceCommandAction } from \"./trace/trace-command.action\";\n\n/**\n * `warlock trace <method> <url>` — send one request to the running dev server\n * and print its devtools timeline: middleware, validation result, handler,\n * queries with N+1 flags, logs, cache operations, the response and timings.\n * `--json` prints the versioned report (`schemaVersion: 1`).\n *\n * No preload: nothing boots here. The dev server (`warlock dev` with\n * `@warlock.js/devtools` installed) does the work; this command finds it\n * through `.warlock/dev-server.json` or `--url`.\n */\nexport const traceCommand = command({\n name: \"trace <method> <url>\",\n description:\n \"Send a request to the running dev server and print its devtools timeline (middleware, validation, queries, logs, response, timings); --json for the report\",\n action: traceCommandAction,\n options: [\n {\n text: \"--body, -b\",\n description: \"Request body: JSON text, plain text, or @file to read it from a file\",\n type: \"string\",\n },\n {\n text: \"--header, -H\",\n description: \"A request header as name:value (repeatable)\",\n type: \"string\",\n },\n {\n text: \"--url, -u\",\n description: \"Dev server origin (default: read from .warlock/dev-server.json)\",\n type: \"string\",\n },\n {\n text: \"--devtools-path\",\n description: \"Devtools mount path (default /__warlock)\",\n type: \"string\",\n },\n {\n text: \"--id-header\",\n description: \"The app's request id header (http.requestId.header; default x-request-id)\",\n type: \"string\",\n },\n {\n text: \"--timeout, -t\",\n description: \"How long to wait for the devtools record, in ms (default 5000)\",\n type: \"string\",\n },\n {\n text: \"--json, -j\",\n description: \"Print the trace report as JSON (schemaVersion 1)\",\n type: \"boolean\",\n },\n ],\n});\n"],"mappings":";;;;;;;;;;;;;;AAaA,MAAa,eAAe,QAAQ;CAClC,MAAM;CACN,aACE;CACF,QAAQ;CACR,SAAS;EACP;GACE,MAAM;GACN,aAAa;GACb,MAAM;EACR;EACA;GACE,MAAM;GACN,aAAa;GACb,MAAM;EACR;EACA;GACE,MAAM;GACN,aAAa;GACb,MAAM;EACR;EACA;GACE,MAAM;GACN,aAAa;GACb,MAAM;EACR;EACA;GACE,MAAM;GACN,aAAa;GACb,MAAM;EACR;EACA;GACE,MAAM;GACN,aAAa;GACb,MAAM;EACR;EACA;GACE,MAAM;GACN,aAAa;GACb,MAAM;EACR;CACF;AACF,CAAC"}
@@ -0,0 +1,40 @@
1
+ import { command } from "../../commands/cli-command.mjs";
2
+ import { typecheckCommandAction } from "./check/typecheck-command.action.mjs";
3
+
4
+ //#region ../../packages/core/src/cli/commands/typecheck.command.ts
5
+ /**
6
+ * `warlock typecheck` — incremental TypeScript check through the compiler
7
+ * API, with `--changed` to limit it to the changed files and their importers.
8
+ * The same problem shape and exit codes as `warlock check`. No preload.
9
+ */
10
+ const typecheckCommand = command({
11
+ name: "typecheck",
12
+ description: "Typecheck the project incrementally; --changed limits it to changed files and the files importing them",
13
+ action: typecheckCommandAction,
14
+ options: [
15
+ {
16
+ text: "--changed, -c",
17
+ description: "Only the files changed against HEAD (plus untracked files) and their importers",
18
+ type: "boolean"
19
+ },
20
+ {
21
+ text: "--base, -b",
22
+ description: "Compare with the merge base of this ref instead of HEAD (implies --changed)",
23
+ type: "string"
24
+ },
25
+ {
26
+ text: "--project, -p",
27
+ description: "tsconfig path (default tsconfig.json)",
28
+ type: "string"
29
+ },
30
+ {
31
+ text: "--json, -j",
32
+ description: "Print the result as JSON",
33
+ type: "boolean"
34
+ }
35
+ ]
36
+ });
37
+
38
+ //#endregion
39
+ export { typecheckCommand };
40
+ //# sourceMappingURL=typecheck.command.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typecheck.command.mjs","names":[],"sources":["../../../../../../../../../packages/core/src/cli/commands/typecheck.command.ts"],"sourcesContent":["import { command } from \"../../commands/cli-command\";\nimport { typecheckCommandAction } from \"./check/typecheck-command.action\";\n\n/**\n * `warlock typecheck` — incremental TypeScript check through the compiler\n * API, with `--changed` to limit it to the changed files and their importers.\n * The same problem shape and exit codes as `warlock check`. No preload.\n */\nexport const typecheckCommand = command({\n name: \"typecheck\",\n description:\n \"Typecheck the project incrementally; --changed limits it to changed files and the files importing them\",\n action: typecheckCommandAction,\n options: [\n {\n text: \"--changed, -c\",\n description: \"Only the files changed against HEAD (plus untracked files) and their importers\",\n type: \"boolean\",\n },\n {\n text: \"--base, -b\",\n description: \"Compare with the merge base of this ref instead of HEAD (implies --changed)\",\n type: \"string\",\n },\n {\n text: \"--project, -p\",\n description: \"tsconfig path (default tsconfig.json)\",\n type: \"string\",\n },\n {\n text: \"--json, -j\",\n description: \"Print the result as JSON\",\n type: \"boolean\",\n },\n ],\n});\n"],"mappings":";;;;;;;;;AAQA,MAAa,mBAAmB,QAAQ;CACtC,MAAM;CACN,aACE;CACF,QAAQ;CACR,SAAS;EACP;GACE,MAAM;GACN,aAAa;GACb,MAAM;EACR;EACA;GACE,MAAM;GACN,aAAa;GACb,MAAM;EACR;EACA;GACE,MAAM;GACN,aAAa;GACb,MAAM;EACR;EACA;GACE,MAAM;GACN,aAAa;GACb,MAAM;EACR;CACF;AACF,CAAC"}