@warlock.js/core 5.34.2 → 5.35.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 (259) hide show
  1. package/CHANGELOG.md +62 -0
  2. package/esm/cli/cli-commands.manager.mjs +1 -1
  3. package/esm/cli/cli-commands.manager.mjs.map +1 -1
  4. package/esm/cli/commands/add.command.mjs +1 -0
  5. package/esm/cli/commands/add.command.mjs.map +1 -1
  6. package/esm/cli/commands/build.command.mjs +30 -3
  7. package/esm/cli/commands/build.command.mjs.map +1 -1
  8. package/esm/cli/commands/check/check-command.action.mjs +1 -0
  9. package/esm/cli/commands/check/check-command.action.mjs.map +1 -1
  10. package/esm/cli/commands/check.command.mjs +5 -0
  11. package/esm/cli/commands/check.command.mjs.map +1 -1
  12. package/esm/cli/commands/explain/explain-command.action.mjs +21 -0
  13. package/esm/cli/commands/explain/explain-command.action.mjs.map +1 -1
  14. package/esm/cli/commands/explain.command.mjs +14 -4
  15. package/esm/cli/commands/explain.command.mjs.map +1 -1
  16. package/esm/cli/commands/generate/generate.command.mjs +19 -1
  17. package/esm/cli/commands/generate/generate.command.mjs.map +1 -1
  18. package/esm/cli/commands/generate/generators/endpoint.generator.mjs +1 -1
  19. package/esm/cli/commands/generate/generators/endpoint.generator.mjs.map +1 -1
  20. package/esm/cli/commands/generate/generators/web.generator.mjs +169 -0
  21. package/esm/cli/commands/generate/generators/web.generator.mjs.map +1 -0
  22. package/esm/cli/commands/generate/templates/web-stubs.mjs +231 -0
  23. package/esm/cli/commands/generate/templates/web-stubs.mjs.map +1 -0
  24. package/esm/cli/commands/inspect/inspect-command.action.mjs +4 -3
  25. package/esm/cli/commands/inspect/inspect-command.action.mjs.map +1 -1
  26. package/esm/cli/commands/inspect.command.mjs +13 -8
  27. package/esm/cli/commands/inspect.command.mjs.map +1 -1
  28. package/esm/cli/commands/mcp/mcp-command.action.mjs +1 -1
  29. package/esm/cli/commands/mcp/mcp-command.action.mjs.map +1 -1
  30. package/esm/config/config-loader.d.mts.map +1 -1
  31. package/esm/config/config-loader.mjs +2 -0
  32. package/esm/config/config-loader.mjs.map +1 -1
  33. package/esm/config/load-config-files.mjs +4 -0
  34. package/esm/config/load-config-files.mjs.map +1 -1
  35. package/esm/dev-server/file-event-handler.mjs +11 -1
  36. package/esm/dev-server/file-event-handler.mjs.map +1 -1
  37. package/esm/dev-server/file-manager.d.mts +1 -1
  38. package/esm/dev-server/file-manager.d.mts.map +1 -1
  39. package/esm/dev-server/file-manager.mjs.map +1 -1
  40. package/esm/dev-server/files-orchestrator.mjs +16 -1
  41. package/esm/dev-server/files-orchestrator.mjs.map +1 -1
  42. package/esm/dev-server/files-watcher.mjs +13 -4
  43. package/esm/dev-server/files-watcher.mjs.map +1 -1
  44. package/esm/dev-server/loader/loader-port-acks.mjs +21 -9
  45. package/esm/dev-server/loader/loader-port-acks.mjs.map +1 -1
  46. package/esm/dev-server/loader/register-loader.mjs +31 -12
  47. package/esm/dev-server/loader/register-loader.mjs.map +1 -1
  48. package/esm/dev-server/module-loader.mjs +14 -0
  49. package/esm/dev-server/module-loader.mjs.map +1 -1
  50. package/esm/dev-server/special-file-patterns.mjs +4 -1
  51. package/esm/dev-server/special-file-patterns.mjs.map +1 -1
  52. package/esm/e2e/browser.d.mts.map +1 -1
  53. package/esm/e2e/browser.mjs +3 -1
  54. package/esm/e2e/browser.mjs.map +1 -1
  55. package/esm/e2e/index.d.mts +2 -2
  56. package/esm/e2e/page.d.mts +6 -1
  57. package/esm/e2e/page.d.mts.map +1 -1
  58. package/esm/e2e/page.mjs +36 -1
  59. package/esm/e2e/page.mjs.map +1 -1
  60. package/esm/e2e/types.d.mts +37 -0
  61. package/esm/e2e/types.d.mts.map +1 -1
  62. package/esm/e2e/types.mjs.map +1 -1
  63. package/esm/errors/error-codes.d.mts +48 -0
  64. package/esm/errors/error-codes.d.mts.map +1 -1
  65. package/esm/errors/error-codes.mjs +48 -0
  66. package/esm/errors/error-codes.mjs.map +1 -1
  67. package/esm/errors/index.d.mts +2 -2
  68. package/esm/errors/index.mjs +2 -2
  69. package/esm/generations/add-command.action.mjs +2 -0
  70. package/esm/generations/add-command.action.mjs.map +1 -1
  71. package/esm/generations/design-system-payload.mjs +53 -0
  72. package/esm/generations/design-system-payload.mjs.map +1 -0
  73. package/esm/generations/features/design-system.feature.mjs +38 -0
  74. package/esm/generations/features/design-system.feature.mjs.map +1 -0
  75. package/esm/generations/features/index.mjs +3 -1
  76. package/esm/generations/features/index.mjs.map +1 -1
  77. package/esm/generations/features/notifications.feature.mjs +13 -2
  78. package/esm/generations/features/notifications.feature.mjs.map +1 -1
  79. package/esm/generations/features/test.feature.mjs +48 -13
  80. package/esm/generations/features/test.feature.mjs.map +1 -1
  81. package/esm/generations/stubs.mjs +9 -5
  82. package/esm/generations/stubs.mjs.map +1 -1
  83. package/esm/http/error-mapper.d.mts +1 -1
  84. package/esm/http/error-mapper.mjs +3 -3
  85. package/esm/http/error-mapper.mjs.map +1 -1
  86. package/esm/http/error-response.d.mts +15 -0
  87. package/esm/http/error-response.d.mts.map +1 -0
  88. package/esm/http/error-response.mjs +47 -0
  89. package/esm/http/error-response.mjs.map +1 -0
  90. package/esm/http/errors/errors.d.mts +8 -0
  91. package/esm/http/errors/errors.d.mts.map +1 -1
  92. package/esm/http/errors/errors.mjs +13 -1
  93. package/esm/http/errors/errors.mjs.map +1 -1
  94. package/esm/http/index.d.mts +5 -3
  95. package/esm/http/index.mjs +3 -2
  96. package/esm/http/list-endpoint.d.mts +35 -0
  97. package/esm/http/list-endpoint.d.mts.map +1 -0
  98. package/esm/http/list-endpoint.mjs +28 -0
  99. package/esm/http/list-endpoint.mjs.map +1 -0
  100. package/esm/http/middleware/inject-request-context.d.mts.map +1 -1
  101. package/esm/http/middleware/inject-request-context.mjs +12 -2
  102. package/esm/http/middleware/inject-request-context.mjs.map +1 -1
  103. package/esm/http/response.d.mts +2 -0
  104. package/esm/http/response.d.mts.map +1 -1
  105. package/esm/http/response.mjs +2 -0
  106. package/esm/http/response.mjs.map +1 -1
  107. package/esm/http/server.d.mts.map +1 -1
  108. package/esm/http/server.mjs +2 -0
  109. package/esm/http/server.mjs.map +1 -1
  110. package/esm/http/types.d.mts +7 -0
  111. package/esm/http/types.d.mts.map +1 -1
  112. package/esm/index.d.mts +10 -7
  113. package/esm/index.mjs +3 -2
  114. package/esm/openapi/security.mjs +12 -4
  115. package/esm/openapi/security.mjs.map +1 -1
  116. package/esm/openapi/types.d.mts +2 -0
  117. package/esm/openapi/types.d.mts.map +1 -1
  118. package/esm/production/build-budgets.d.mts +46 -0
  119. package/esm/production/build-budgets.d.mts.map +1 -0
  120. package/esm/production/build-budgets.mjs +109 -0
  121. package/esm/production/build-budgets.mjs.map +1 -0
  122. package/esm/production/production-builder.mjs +13 -1
  123. package/esm/production/production-builder.mjs.map +1 -1
  124. package/esm/production/resolve-build-config.d.mts +1 -1
  125. package/esm/production/resolve-build-config.d.mts.map +1 -1
  126. package/esm/production/resolve-build-config.mjs.map +1 -1
  127. package/esm/restful/restful.d.mts +1 -1
  128. package/esm/tests/fakes/storage-fake.d.mts +3 -1
  129. package/esm/tests/fakes/storage-fake.d.mts.map +1 -1
  130. package/esm/tests/fakes/storage-fake.mjs +3 -3
  131. package/esm/tests/fakes/storage-fake.mjs.map +1 -1
  132. package/esm/tests/fakes/test-fakes.d.mts +3 -1
  133. package/esm/tests/fakes/test-fakes.d.mts.map +1 -1
  134. package/esm/tests/fakes/test-fakes.mjs +3 -2
  135. package/esm/tests/fakes/test-fakes.mjs.map +1 -1
  136. package/esm/tests/index.d.mts +4 -2
  137. package/esm/tests/index.mjs +3 -1
  138. package/esm/tests/load-unit-config.mjs +24 -0
  139. package/esm/tests/load-unit-config.mjs.map +1 -0
  140. package/esm/tests/response-contract.d.mts +32 -0
  141. package/esm/tests/response-contract.d.mts.map +1 -0
  142. package/esm/tests/response-contract.mjs +116 -0
  143. package/esm/tests/response-contract.mjs.map +1 -0
  144. package/esm/tests/start-http-development-server.d.mts.map +1 -1
  145. package/esm/tests/start-http-development-server.mjs +10 -2
  146. package/esm/tests/start-http-development-server.mjs.map +1 -1
  147. package/esm/tests/test-lifecycle-state.mjs.map +1 -1
  148. package/esm/tests/test-locales.mjs +33 -0
  149. package/esm/tests/test-locales.mjs.map +1 -0
  150. package/esm/tests/test-runtime-scope.d.mts +15 -0
  151. package/esm/tests/test-runtime-scope.d.mts.map +1 -0
  152. package/esm/tests/test-runtime-scope.mjs +80 -0
  153. package/esm/tests/test-runtime-scope.mjs.map +1 -0
  154. package/esm/tests/vitest-setup.d.mts +13 -3
  155. package/esm/tests/vitest-setup.d.mts.map +1 -1
  156. package/esm/tests/vitest-setup.mjs +146 -18
  157. package/esm/tests/vitest-setup.mjs.map +1 -1
  158. package/esm/tooling/check/affected-files.d.mts +5 -0
  159. package/esm/tooling/check/affected-files.d.mts.map +1 -0
  160. package/esm/tooling/check/affected-files.mjs +56 -0
  161. package/esm/tooling/check/affected-files.mjs.map +1 -0
  162. package/esm/tooling/check/changed-files.d.mts +2 -0
  163. package/esm/tooling/check/changed-files.d.mts.map +1 -1
  164. package/esm/tooling/check/changed-files.mjs +2 -2
  165. package/esm/tooling/check/changed-files.mjs.map +1 -1
  166. package/esm/tooling/check/conventions-step.d.mts +2 -1
  167. package/esm/tooling/check/conventions-step.d.mts.map +1 -1
  168. package/esm/tooling/check/conventions-step.mjs +48 -6
  169. package/esm/tooling/check/conventions-step.mjs.map +1 -1
  170. package/esm/tooling/check/fixes.d.mts +8 -0
  171. package/esm/tooling/check/fixes.d.mts.map +1 -0
  172. package/esm/tooling/check/fixes.mjs +31 -0
  173. package/esm/tooling/check/fixes.mjs.map +1 -0
  174. package/esm/tooling/check/index.d.mts +12 -0
  175. package/esm/tooling/check/index.mjs +3 -2
  176. package/esm/tooling/check/run-check.d.mts +2 -0
  177. package/esm/tooling/check/run-check.d.mts.map +1 -1
  178. package/esm/tooling/check/run-check.mjs +20 -4
  179. package/esm/tooling/check/run-check.mjs.map +1 -1
  180. package/esm/tooling/check/run-tests.mjs +1 -1
  181. package/esm/tooling/check/source-ast.d.mts +1 -0
  182. package/esm/tooling/check/web-conventions.d.mts +10 -0
  183. package/esm/tooling/check/web-conventions.d.mts.map +1 -0
  184. package/esm/tooling/check/web-conventions.mjs +126 -0
  185. package/esm/tooling/check/web-conventions.mjs.map +1 -0
  186. package/esm/tooling/index.d.mts +7 -2
  187. package/esm/tooling/index.mjs +4 -2
  188. package/esm/tooling/inspect/collect-files.mjs +172 -0
  189. package/esm/tooling/inspect/collect-files.mjs.map +1 -0
  190. package/esm/tooling/inspect/collect-pages.mjs +3 -2
  191. package/esm/tooling/inspect/collect-pages.mjs.map +1 -1
  192. package/esm/tooling/inspect/collect-routes.mjs +1 -1
  193. package/esm/tooling/inspect/collect-routes.mjs.map +1 -1
  194. package/esm/tooling/inspect/explain-file.d.mts +12 -0
  195. package/esm/tooling/inspect/explain-file.d.mts.map +1 -0
  196. package/esm/tooling/inspect/explain-file.mjs +45 -0
  197. package/esm/tooling/inspect/explain-file.mjs.map +1 -0
  198. package/esm/tooling/inspect/index.d.mts +3 -2
  199. package/esm/tooling/inspect/index.mjs +2 -1
  200. package/esm/tooling/inspect/inspect-app.d.mts.map +1 -1
  201. package/esm/tooling/inspect/inspect-app.mjs +9 -3
  202. package/esm/tooling/inspect/inspect-app.mjs.map +1 -1
  203. package/esm/tooling/inspect/inspect-report.schema.mjs +34 -1
  204. package/esm/tooling/inspect/inspect-report.schema.mjs.map +1 -1
  205. package/esm/tooling/inspect/inspect-report.types.d.mts +17 -1
  206. package/esm/tooling/inspect/inspect-report.types.d.mts.map +1 -1
  207. package/esm/tooling/inspect/inspect-report.types.mjs +2 -1
  208. package/esm/tooling/inspect/inspect-report.types.mjs.map +1 -1
  209. package/esm/tooling/mcp/mcp-tools.d.mts.map +1 -1
  210. package/esm/tooling/mcp/mcp-tools.mjs +8 -2
  211. package/esm/tooling/mcp/mcp-tools.mjs.map +1 -1
  212. package/esm/tooling/problem.d.mts +4 -0
  213. package/esm/tooling/problem.d.mts.map +1 -1
  214. package/esm/tooling/problem.mjs +1 -0
  215. package/esm/tooling/problem.mjs.map +1 -1
  216. package/esm/tooling/syntax/ast.d.mts +2 -0
  217. package/esm/tooling/typecheck/run-typecheck.mjs +5 -1
  218. package/esm/tooling/typecheck/run-typecheck.mjs.map +1 -1
  219. package/esm/upgrade/codemods/toolchain-templates.mjs +3 -1
  220. package/esm/upgrade/codemods/toolchain-templates.mjs.map +1 -1
  221. package/esm/vite/index.d.mts +3 -1
  222. package/esm/vite/index.mjs +3 -1
  223. package/esm/vite/test-setup-reporter.d.mts +16 -0
  224. package/esm/vite/test-setup-reporter.d.mts.map +1 -0
  225. package/esm/vite/test-setup-reporter.mjs +55 -0
  226. package/esm/vite/test-setup-reporter.mjs.map +1 -0
  227. package/esm/vite/test-workers.d.mts +5 -0
  228. package/esm/vite/test-workers.d.mts.map +1 -0
  229. package/esm/vite/test-workers.mjs +38 -0
  230. package/esm/vite/test-workers.mjs.map +1 -0
  231. package/esm/warlock-config/index.d.mts +2 -1
  232. package/esm/warlock-config/types.d.mts +3 -0
  233. package/esm/warlock-config/types.d.mts.map +1 -1
  234. package/llms-full.txt +883 -70
  235. package/llms.txt +58 -56
  236. package/package.json +15 -14
  237. package/schemas/inspect-report.schema.json +47 -1
  238. package/skills/build-budgets/SKILL.md +51 -0
  239. package/skills/build-restful/SKILL.md +56 -0
  240. package/skills/configure-app/SKILL.md +34 -0
  241. package/skills/create-module/SKILL.md +9 -0
  242. package/skills/generate-openapi/SKILL.md +1 -1
  243. package/skills/generate-web-ui/SKILL.md +71 -0
  244. package/skills/index.md +3 -3
  245. package/skills/run-app/SKILL.md +1 -1
  246. package/skills/send-mail/SKILL.md +25 -0
  247. package/skills/send-response/SKILL.md +77 -0
  248. package/skills/test-browser/SKILL.md +54 -0
  249. package/skills/test-http/SKILL.md +91 -0
  250. package/skills/test-service/SKILL.md +161 -3
  251. package/skills/upgrade-from-5-29/SKILL.md +22 -0
  252. package/skills/use-localization/SKILL.md +21 -0
  253. package/skills/warlock-check/SKILL.md +72 -1
  254. package/skills/warlock-inspect/SKILL.md +45 -2
  255. package/skills/warlock-mcp/SKILL.md +4 -0
  256. package/skills/warlock-trace/SKILL.md +2 -2
  257. package/skills/write-cli-command/SKILL.md +20 -2
  258. package/esm/production/build-app-production.mjs +0 -14
  259. package/esm/production/build-app-production.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"run-typecheck.mjs","names":[],"sources":["../../../../../../../../../packages/core/src/tooling/typecheck/run-typecheck.ts"],"sourcesContent":["import { existsSync, mkdirSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { createProblem, type ToolingProblem } from \"../problem\";\nimport { CompilerSession, runCompiler, type CompilerDiagnostic } from \"../typescript/compiler\";\n\nexport type TypecheckOptions = {\n cwd?: string;\n project?: string;\n files?: readonly string[];\n buildInfoFile?: string;\n};\nexport type TypecheckResult = {\n ok: boolean;\n mode: \"program\" | \"files\";\n files: string[] | null;\n checkedFiles: number;\n problems: ToolingProblem[];\n durationMs: number;\n buildInfoFile: string | null;\n};\nexport const DEFAULT_TYPECHECK_BUILD_INFO = path.join(\".warlock\", \"cache\", \"typecheck.tsbuildinfo\");\nconst toPosix = (file: string) => file.split(path.sep).join(\"/\");\nfunction isProjectFile(file: string, root: string, declarations = true): boolean {\n return (\n file.startsWith(root + path.sep) &&\n !file.split(path.sep).includes(\"node_modules\") &&\n (declarations || !file.endsWith(\".d.ts\"))\n );\n}\nexport function diagnosticToProblem(\n diagnostic: CompilerDiagnostic,\n cwd: string,\n code: \"WL7101\" | \"WL7102\" = \"WL7101\",\n): ToolingProblem {\n return createProblem({\n code,\n source: \"typescript\",\n severity: diagnostic.severity,\n message: diagnostic.message,\n file: diagnostic.fileName ? toPosix(path.relative(cwd, diagnostic.fileName)) : null,\n line: diagnostic.fileName ? diagnostic.line : null,\n column: diagnostic.fileName ? diagnostic.column : null,\n rule: `TS${diagnostic.code}`,\n });\n}\n\n/** Resolve direct importers with the native checker, including package exports and aliases. */\nexport function directImporters(\n session: CompilerSession,\n targets: ReadonlySet<string>,\n root: string,\n): Set<string> {\n const importers = new Set<string>();\n for (const file of session.fileNames) {\n if (!isProjectFile(file, root, false) || targets.has(file)) continue;\n if (session.importFiles(file).some((imported) => targets.has(path.resolve(imported))))\n importers.add(file);\n }\n return importers;\n}\n\n/** TypeScript 7's native incremental compiler owns build state; changed mode filters its diagnostics. */\nexport function runTypecheck(options: TypecheckOptions = {}): TypecheckResult {\n const startedAt = Date.now();\n const cwd = path.resolve(options.cwd ?? process.cwd());\n const configPath = path.resolve(cwd, options.project ?? \"tsconfig.json\");\n const result = (\n problems: ToolingProblem[],\n rest: Partial<TypecheckResult> = {},\n ): TypecheckResult => ({\n ok: !problems.some((problem) => problem.severity === \"error\"),\n mode: options.files ? \"files\" : \"program\",\n files: null,\n checkedFiles: 0,\n problems,\n durationMs: Date.now() - startedAt,\n buildInfoFile: null,\n ...rest,\n });\n if (!existsSync(configPath))\n return result([\n createProblem({\n code: \"WL7102\",\n source: \"typescript\",\n message: `No TypeScript config at ${toPosix(path.relative(cwd, configPath)) || configPath}.`,\n file: toPosix(path.relative(cwd, configPath)),\n }),\n ]);\n const buildInfoFile = path.resolve(cwd, options.buildInfoFile ?? DEFAULT_TYPECHECK_BUILD_INFO);\n mkdirSync(path.dirname(buildInfoFile), { recursive: true });\n const compiled = runCompiler(cwd, [\n \"-p\",\n configPath,\n \"--noEmit\",\n \"--incremental\",\n \"--tsBuildInfoFile\",\n buildInfoFile,\n \"--composite\",\n \"false\",\n \"--emitDeclarationOnly\",\n \"false\",\n \"--listFiles\",\n ]);\n const sources = compiled.output\n .split(/\\r?\\n/)\n .map((line) => (path.isAbsolute(line) ? line : \"\"))\n .filter((file) => isProjectFile(file, cwd));\n const wanted = options.files\n ? new Set(options.files.map((file) => path.resolve(cwd, file)))\n : null;\n if (wanted) {\n const session = new CompilerSession(cwd, configPath);\n try {\n for (const file of directImporters(session, wanted, cwd)) wanted.add(file);\n } finally {\n session.close();\n }\n }\n const checked = sources.filter((file) => !wanted || wanted.has(file));\n const configCodes = new Set([18002, 18003]);\n const problems = [...compiled.diagnostics]\n .sort((a, b) => Number(b.fileName === configPath) - Number(a.fileName === configPath))\n .filter(\n (diagnostic) =>\n !diagnostic.fileName ||\n diagnostic.fileName === configPath ||\n (isProjectFile(diagnostic.fileName, cwd) && (!wanted || wanted.has(diagnostic.fileName))),\n )\n .map((diagnostic) =>\n diagnosticToProblem(\n diagnostic,\n cwd,\n !diagnostic.fileName ||\n diagnostic.fileName === configPath ||\n configCodes.has(diagnostic.code)\n ? \"WL7102\"\n : \"WL7101\",\n ),\n );\n return result(problems, {\n files: wanted ? checked.map((file) => toPosix(path.relative(cwd, file))).sort() : null,\n checkedFiles: checked.length,\n buildInfoFile: existsSync(buildInfoFile) ? buildInfoFile : null,\n });\n}\n"],"mappings":";;;;;;AAoBA,MAAa,+BAA+B,KAAK,KAAK,YAAY,SAAS,uBAAuB;AAClG,MAAM,WAAW,SAAiB,KAAK,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,GAAG;AAC/D,SAAS,cAAc,MAAc,MAAc,eAAe,MAAe;CAC/E,OACE,KAAK,WAAW,OAAO,KAAK,GAAG,KAC/B,CAAC,KAAK,MAAM,KAAK,GAAG,CAAC,CAAC,SAAS,cAAc,MAC5C,gBAAgB,CAAC,KAAK,SAAS,OAAO;AAE3C;AACA,SAAgB,oBACd,YACA,KACA,OAA4B,UACZ;CAChB,OAAO,cAAc;EACnB;EACA,QAAQ;EACR,UAAU,WAAW;EACrB,SAAS,WAAW;EACpB,MAAM,WAAW,WAAW,QAAQ,KAAK,SAAS,KAAK,WAAW,QAAQ,CAAC,IAAI;EAC/E,MAAM,WAAW,WAAW,WAAW,OAAO;EAC9C,QAAQ,WAAW,WAAW,WAAW,SAAS;EAClD,MAAM,KAAK,WAAW;CACxB,CAAC;AACH;;AAGA,SAAgB,gBACd,SACA,SACA,MACa;CACb,MAAM,4BAAY,IAAI,IAAY;CAClC,KAAK,MAAM,QAAQ,QAAQ,WAAW;EACpC,IAAI,CAAC,cAAc,MAAM,MAAM,KAAK,KAAK,QAAQ,IAAI,IAAI,GAAG;EAC5D,IAAI,QAAQ,YAAY,IAAI,CAAC,CAAC,MAAM,aAAa,QAAQ,IAAI,KAAK,QAAQ,QAAQ,CAAC,CAAC,GAClF,UAAU,IAAI,IAAI;CACtB;CACA,OAAO;AACT;;AAGA,SAAgB,aAAa,UAA4B,CAAC,GAAoB;CAC5E,MAAM,YAAY,KAAK,IAAI;CAC3B,MAAM,MAAM,KAAK,QAAQ,QAAQ,OAAO,QAAQ,IAAI,CAAC;CACrD,MAAM,aAAa,KAAK,QAAQ,KAAK,QAAQ,WAAW,eAAe;CACvE,MAAM,UACJ,UACA,OAAiC,CAAC,OACb;EACrB,IAAI,CAAC,SAAS,MAAM,YAAY,QAAQ,aAAa,OAAO;EAC5D,MAAM,QAAQ,QAAQ,UAAU;EAChC,OAAO;EACP,cAAc;EACd;EACA,YAAY,KAAK,IAAI,IAAI;EACzB,eAAe;EACf,GAAG;CACL;CACA,IAAI,CAAC,WAAW,UAAU,GACxB,OAAO,OAAO,CACZ,cAAc;EACZ,MAAM;EACN,QAAQ;EACR,SAAS,2BAA2B,QAAQ,KAAK,SAAS,KAAK,UAAU,CAAC,KAAK,WAAW;EAC1F,MAAM,QAAQ,KAAK,SAAS,KAAK,UAAU,CAAC;CAC9C,CAAC,CACH,CAAC;CACH,MAAM,gBAAgB,KAAK,QAAQ,KAAK,QAAQ,iBAAiB,4BAA4B;CAC7F,UAAU,KAAK,QAAQ,aAAa,GAAG,EAAE,WAAW,KAAK,CAAC;CAC1D,MAAM,WAAW,YAAY,KAAK;EAChC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAAC;CACD,MAAM,UAAU,SAAS,OACtB,MAAM,OAAO,CAAC,CACd,KAAK,SAAU,KAAK,WAAW,IAAI,IAAI,OAAO,EAAG,CAAC,CAClD,QAAQ,SAAS,cAAc,MAAM,GAAG,CAAC;CAC5C,MAAM,SAAS,QAAQ,QACnB,IAAI,IAAI,QAAQ,MAAM,KAAK,SAAS,KAAK,QAAQ,KAAK,IAAI,CAAC,CAAC,IAC5D;CACJ,IAAI,QAAQ;EACV,MAAM,UAAU,IAAI,gBAAgB,KAAK,UAAU;EACnD,IAAI;GACF,KAAK,MAAM,QAAQ,gBAAgB,SAAS,QAAQ,GAAG,GAAG,OAAO,IAAI,IAAI;EAC3E,UAAU;GACR,QAAQ,MAAM;EAChB;CACF;CACA,MAAM,UAAU,QAAQ,QAAQ,SAAS,CAAC,UAAU,OAAO,IAAI,IAAI,CAAC;CACpE,MAAM,8BAAc,IAAI,IAAI,CAAC,OAAO,KAAK,CAAC;CAoB1C,OAAO,OAnBU,CAAC,GAAG,SAAS,WAAW,CAAC,CACvC,MAAM,GAAG,MAAM,OAAO,EAAE,aAAa,UAAU,IAAI,OAAO,EAAE,aAAa,UAAU,CAAC,CAAC,CACrF,QACE,eACC,CAAC,WAAW,YACZ,WAAW,aAAa,cACvB,cAAc,WAAW,UAAU,GAAG,MAAM,CAAC,UAAU,OAAO,IAAI,WAAW,QAAQ,EAC1F,CAAC,CACA,KAAK,eACJ,oBACE,YACA,KACA,CAAC,WAAW,YACV,WAAW,aAAa,cACxB,YAAY,IAAI,WAAW,IAAI,IAC7B,WACA,QACN,CAEiB,GAAG;EACtB,OAAO,SAAS,QAAQ,KAAK,SAAS,QAAQ,KAAK,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI;EAClF,cAAc,QAAQ;EACtB,eAAe,WAAW,aAAa,IAAI,gBAAgB;CAC7D,CAAC;AACH"}
1
+ {"version":3,"file":"run-typecheck.mjs","names":[],"sources":["../../../../../../../../../packages/core/src/tooling/typecheck/run-typecheck.ts"],"sourcesContent":["import { existsSync, mkdirSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { createProblem, type ToolingProblem } from \"../problem\";\nimport { CompilerSession, runCompiler, type CompilerDiagnostic } from \"../typescript/compiler\";\n\nexport type TypecheckOptions = {\n cwd?: string;\n project?: string;\n files?: readonly string[];\n buildInfoFile?: string;\n};\nexport type TypecheckResult = {\n ok: boolean;\n mode: \"program\" | \"files\";\n files: string[] | null;\n checkedFiles: number;\n problems: ToolingProblem[];\n durationMs: number;\n buildInfoFile: string | null;\n};\nexport const DEFAULT_TYPECHECK_BUILD_INFO = path.join(\".warlock\", \"cache\", \"typecheck.tsbuildinfo\");\nconst toPosix = (file: string) => file.split(path.sep).join(\"/\");\nfunction isProjectFile(file: string, root: string, declarations = true): boolean {\n return (\n file.startsWith(root + path.sep) &&\n !file.split(path.sep).includes(\"node_modules\") &&\n (declarations || !file.endsWith(\".d.ts\"))\n );\n}\nexport function diagnosticToProblem(\n diagnostic: CompilerDiagnostic,\n cwd: string,\n code: \"WL7101\" | \"WL7102\" = \"WL7101\",\n): ToolingProblem {\n return createProblem({\n code,\n source: \"typescript\",\n severity: diagnostic.severity,\n message: diagnostic.message,\n file: diagnostic.fileName ? toPosix(path.relative(cwd, diagnostic.fileName)) : null,\n line: diagnostic.fileName ? diagnostic.line : null,\n column: diagnostic.fileName ? diagnostic.column : null,\n rule: `TS${diagnostic.code}`,\n });\n}\n\n/** Resolve direct importers with the native checker, including package exports and aliases. */\nexport function directImporters(\n session: CompilerSession,\n targets: ReadonlySet<string>,\n root: string,\n): Set<string> {\n const importers = new Set<string>();\n for (const file of session.fileNames) {\n if (!isProjectFile(file, root, false) || targets.has(file)) continue;\n if (session.importFiles(file).some((imported) => targets.has(path.resolve(imported))))\n importers.add(file);\n }\n return importers;\n}\n\n/** TypeScript 7's native incremental compiler owns build state; changed mode filters its diagnostics. */\nexport function runTypecheck(options: TypecheckOptions = {}): TypecheckResult {\n const startedAt = Date.now();\n const cwd = path.resolve(options.cwd ?? process.cwd());\n const configPath = path.resolve(cwd, options.project ?? \"tsconfig.json\");\n const result = (\n problems: ToolingProblem[],\n rest: Partial<TypecheckResult> = {},\n ): TypecheckResult => ({\n ok: !problems.some((problem) => problem.severity === \"error\"),\n mode: options.files ? \"files\" : \"program\",\n files: null,\n checkedFiles: 0,\n problems,\n durationMs: Date.now() - startedAt,\n buildInfoFile: null,\n ...rest,\n });\n if (!existsSync(configPath))\n return result([\n createProblem({\n code: \"WL7102\",\n source: \"typescript\",\n message: `No TypeScript config at ${toPosix(path.relative(cwd, configPath)) || configPath}.`,\n file: toPosix(path.relative(cwd, configPath)),\n }),\n ]);\n const buildInfoFile = path.resolve(cwd, options.buildInfoFile ?? DEFAULT_TYPECHECK_BUILD_INFO);\n mkdirSync(path.dirname(buildInfoFile), { recursive: true });\n const compiled = runCompiler(cwd, [\n \"-p\",\n configPath,\n \"--noEmit\",\n \"--incremental\",\n \"--tsBuildInfoFile\",\n buildInfoFile,\n \"--composite\",\n \"false\",\n \"--emitDeclarationOnly\",\n \"false\",\n \"--listFiles\",\n ]);\n const sources = compiled.output\n .split(/\\r?\\n/)\n .map((line) => (path.isAbsolute(line) ? line : \"\"))\n .filter((file) => isProjectFile(file, cwd));\n const wanted = options.files\n ? new Set(options.files.map((file) => path.resolve(cwd, file)))\n : null;\n if (wanted) {\n const session = new CompilerSession(cwd, configPath);\n try {\n for (;;) {\n const importers = directImporters(session, wanted, cwd);\n if (!importers.size) break;\n for (const file of importers) wanted.add(file);\n }\n } finally {\n session.close();\n }\n }\n const checked = sources.filter((file) => !wanted || wanted.has(file));\n const configCodes = new Set([18002, 18003]);\n const problems = [...compiled.diagnostics]\n .sort((a, b) => Number(b.fileName === configPath) - Number(a.fileName === configPath))\n .filter(\n (diagnostic) =>\n !diagnostic.fileName ||\n diagnostic.fileName === configPath ||\n (isProjectFile(diagnostic.fileName, cwd) && (!wanted || wanted.has(diagnostic.fileName))),\n )\n .map((diagnostic) =>\n diagnosticToProblem(\n diagnostic,\n cwd,\n !diagnostic.fileName ||\n diagnostic.fileName === configPath ||\n configCodes.has(diagnostic.code)\n ? \"WL7102\"\n : \"WL7101\",\n ),\n );\n return result(problems, {\n files: wanted ? checked.map((file) => toPosix(path.relative(cwd, file))).sort() : null,\n checkedFiles: checked.length,\n buildInfoFile: existsSync(buildInfoFile) ? buildInfoFile : null,\n });\n}\n"],"mappings":"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"}
@@ -218,7 +218,9 @@ dist
218
218
  "env": { "node": true, "es2021": true },
219
219
  "categories": { "correctness": "error" },
220
220
  "rules": {
221
- "typescript/no-explicit-any": "off",
221
+ "typescript/no-explicit-any": "error",
222
+ "curly": "error",
223
+ "no-console": "error",
222
224
  "no-unused-vars": [
223
225
  "warn",
224
226
  {
@@ -1 +1 @@
1
- {"version":3,"file":"toolchain-templates.mjs","names":[],"sources":["../../../../../../../../../packages/core/src/upgrade/codemods/toolchain-templates.ts"],"sourcesContent":["/** Bundled create-warlock snapshots. oxc-toolchain.spec.ts checks template parity. */\nexport const TOOLCHAIN_TEMPLATES: Readonly<Record<string, string>> = {\n \"legacy-eslint.config.js\": `import tsPlugin from \"@typescript-eslint/eslint-plugin\";\nimport tsParser from \"@typescript-eslint/parser\";\nimport prettierConfig from \"eslint-config-prettier\";\nimport prettierPlugin from \"eslint-plugin-prettier\";\nimport unusedImports from \"eslint-plugin-unused-imports\";\n\nexport default [\n // Global configuration\n {\n languageOptions: {\n ecmaVersion: \"latest\",\n sourceType: \"module\",\n globals: {\n // Node.js globals\n console: \"readonly\",\n process: \"readonly\",\n Buffer: \"readonly\",\n __dirname: \"readonly\",\n __filename: \"readonly\",\n global: \"readonly\",\n module: \"readonly\",\n require: \"readonly\",\n exports: \"readonly\",\n // ES2021 globals\n Promise: \"readonly\",\n // Jest globals\n describe: \"readonly\",\n it: \"readonly\",\n test: \"readonly\",\n expect: \"readonly\",\n beforeEach: \"readonly\",\n afterEach: \"readonly\",\n beforeAll: \"readonly\",\n afterAll: \"readonly\",\n jest: \"readonly\",\n },\n },\n },\n\n // TypeScript files configuration\n {\n files: [\"**/*.ts\", \"**/*.tsx\"],\n languageOptions: {\n parser: tsParser,\n parserOptions: {\n ecmaVersion: \"latest\",\n sourceType: \"module\",\n },\n },\n plugins: {\n \"@typescript-eslint\": tsPlugin,\n prettier: prettierPlugin,\n \"unused-imports\": unusedImports,\n },\n rules: {\n // Prettier integration\n ...prettierConfig.rules,\n \"prettier/prettier\": \"error\",\n\n // TypeScript rules\n \"@typescript-eslint/no-explicit-any\": \"off\",\n \"@typescript-eslint/no-unused-vars\": \"off\",\n \"no-unused-vars\": \"off\",\n \"unused-imports/no-unused-vars\": [\n \"warn\",\n {\n vars: \"all\",\n varsIgnorePattern: \"^_\",\n args: \"after-used\",\n argsIgnorePattern: \"^_\",\n },\n ],\n \"unused-imports/no-unused-imports\": \"error\",\n \"@typescript-eslint/explicit-member-accessibility\": [\n \"error\",\n { accessibility: \"explicit\" },\n ],\n \"@typescript-eslint/consistent-type-imports\": [\n \"error\",\n {\n prefer: \"type-imports\",\n disallowTypeAnnotations: false,\n },\n ],\n },\n },\n\n // Ignore patterns\n {\n ignores: [\n \"dist/\",\n \"node_modules/\",\n \"**/*.js\",\n \"!**/*.config.js\",\n \"!eslint.config.js\",\n ],\n },\n];\n`,\n \"legacy-prettierignore\": `node_modules\ndist\n\n\n`,\n \"legacy-prettierrc.json\": `{\n \"semi\": true,\n \"tabWidth\": 2,\n \"printWidth\": 100,\n \"singleQuote\": false,\n \"arrowParens\": \"always\",\n \"trailingComma\": \"all\",\n \"endOfLine\": \"lf\",\n \"plugins\": [\"@ianvs/prettier-plugin-sort-imports\"],\n \"importOrder\": [\"<BUILTIN_MODULES>\", \"<THIRD_PARTY_MODULES>\", \"^(app|web|@shared)/\", \"^[.]\"],\n \"importOrderParserPlugins\": [\"typescript\", \"jsx\", \"decorators\"]\n}\n`,\n \"legacy-vscode-settings.json\": `{\n \"editor.defaultFormatter\": \"esbenp.prettier-vscode\",\n \"editor.formatOnSave\": true,\n \"editor.codeActionsOnSave\": {\n \"source.fixAll.eslint\": \"explicit\",\n \"source.organizeImports\": \"never\"\n },\n \"[typescript]\": {\n \"editor.defaultFormatter\": \"esbenp.prettier-vscode\",\n \"editor.formatOnSave\": true\n },\n \"[typescriptreact]\": {\n \"editor.defaultFormatter\": \"esbenp.prettier-vscode\",\n \"editor.formatOnSave\": true\n },\n \"[javascript]\": {\n \"editor.defaultFormatter\": \"esbenp.prettier-vscode\",\n \"editor.formatOnSave\": true\n },\n \"[javascriptreact]\": {\n \"editor.defaultFormatter\": \"esbenp.prettier-vscode\",\n \"editor.formatOnSave\": true\n },\n \"[json]\": {\n \"editor.defaultFormatter\": \"esbenp.prettier-vscode\",\n \"editor.formatOnSave\": true\n },\n \"[css]\": {\n \"editor.defaultFormatter\": \"esbenp.prettier-vscode\",\n \"editor.formatOnSave\": true\n },\n \"prettier.configPath\": \".prettierrc.json\",\n \"prettier.requireConfig\": true,\n \"prettier.ignorePath\": \".prettierignore\",\n \"prettier.documentSelectors\": [\"**/*.{ts,tsx,js,jsx,json,css,md}\"],\n \"prettier.enable\": true,\n \"prettier.useEditorConfig\": false,\n \"prettier.resolveGlobalModules\": false,\n \"eslint.format.enable\": false,\n \"eslint.codeActionsOnSave.mode\": \"all\"\n}\n`,\n \"oxc-vscode-settings.json\": `{\n \"editor.defaultFormatter\": \"oxc.oxc-vscode\",\n \"editor.formatOnSave\": true,\n \"editor.codeActionsOnSave\": {\n \"source.fixAll.oxc\": \"explicit\",\n \"source.organizeImports\": \"never\"\n },\n \"[typescript]\": {\n \"editor.defaultFormatter\": \"oxc.oxc-vscode\",\n \"editor.formatOnSave\": true\n },\n \"[typescriptreact]\": {\n \"editor.defaultFormatter\": \"oxc.oxc-vscode\",\n \"editor.formatOnSave\": true\n },\n \"[javascript]\": {\n \"editor.defaultFormatter\": \"oxc.oxc-vscode\",\n \"editor.formatOnSave\": true\n },\n \"[javascriptreact]\": {\n \"editor.defaultFormatter\": \"oxc.oxc-vscode\",\n \"editor.formatOnSave\": true\n },\n \"[json]\": {\n \"editor.defaultFormatter\": \"oxc.oxc-vscode\",\n \"editor.formatOnSave\": true\n },\n \"[css]\": {\n \"editor.defaultFormatter\": \"oxc.oxc-vscode\",\n \"editor.formatOnSave\": true\n },\n \"oxc.enable.oxlint\": true,\n \"oxc.enable.oxfmt\": true,\n \"oxc.requireConfig\": true\n}\n`,\n \"oxfmtrc.json\": `{\n \"$schema\": \"./node_modules/oxfmt/configuration_schema.json\",\n \"semi\": true,\n \"tabWidth\": 2,\n \"printWidth\": 100,\n \"singleQuote\": false,\n \"arrowParens\": \"always\",\n \"trailingComma\": \"all\",\n \"endOfLine\": \"lf\",\n \"sortImports\": {\n \"newlinesBetween\": false,\n \"internalPattern\": [\"app/\", \"web/\", \"@shared/\"]\n },\n \"ignorePatterns\": [\"node_modules/\", \"dist/\"]\n}\n`,\n \"oxlintrc.json\": `{\n \"$schema\": \"./node_modules/oxlint/configuration_schema.json\",\n \"plugins\": [\"typescript\", \"import\", \"react\"],\n \"env\": { \"node\": true, \"es2021\": true },\n \"categories\": { \"correctness\": \"error\" },\n \"rules\": {\n \"typescript/no-explicit-any\": \"off\",\n \"no-unused-vars\": [\n \"warn\",\n {\n \"vars\": \"all\",\n \"varsIgnorePattern\": \"^_\",\n \"args\": \"after-used\",\n \"argsIgnorePattern\": \"^_\"\n }\n ],\n \"typescript/explicit-member-accessibility\": [\"error\", { \"accessibility\": \"explicit\" }],\n \"typescript/consistent-type-imports\": [\n \"error\",\n { \"prefer\": \"type-imports\", \"disallowTypeAnnotations\": false }\n ]\n },\n \"ignorePatterns\": [\"node_modules/\", \"dist/\"]\n}\n`,\n};\n"],"mappings":";;AACA,MAAa,sBAAwD;CACnE,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmG3B,yBAAyB;;;;;CAKzB,0BAA0B;;;;;;;;;;;;;CAa1B,+BAA+B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0C/B,4BAA4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoC5B,gBAAgB;;;;;;;;;;;;;;;;CAgBhB,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;AAyBnB"}
1
+ {"version":3,"file":"toolchain-templates.mjs","names":[],"sources":["../../../../../../../../../packages/core/src/upgrade/codemods/toolchain-templates.ts"],"sourcesContent":["/** Bundled create-warlock snapshots. oxc-toolchain.spec.ts checks template parity. */\nexport const TOOLCHAIN_TEMPLATES: Readonly<Record<string, string>> = {\n \"legacy-eslint.config.js\": `import tsPlugin from \"@typescript-eslint/eslint-plugin\";\nimport tsParser from \"@typescript-eslint/parser\";\nimport prettierConfig from \"eslint-config-prettier\";\nimport prettierPlugin from \"eslint-plugin-prettier\";\nimport unusedImports from \"eslint-plugin-unused-imports\";\n\nexport default [\n // Global configuration\n {\n languageOptions: {\n ecmaVersion: \"latest\",\n sourceType: \"module\",\n globals: {\n // Node.js globals\n console: \"readonly\",\n process: \"readonly\",\n Buffer: \"readonly\",\n __dirname: \"readonly\",\n __filename: \"readonly\",\n global: \"readonly\",\n module: \"readonly\",\n require: \"readonly\",\n exports: \"readonly\",\n // ES2021 globals\n Promise: \"readonly\",\n // Jest globals\n describe: \"readonly\",\n it: \"readonly\",\n test: \"readonly\",\n expect: \"readonly\",\n beforeEach: \"readonly\",\n afterEach: \"readonly\",\n beforeAll: \"readonly\",\n afterAll: \"readonly\",\n jest: \"readonly\",\n },\n },\n },\n\n // TypeScript files configuration\n {\n files: [\"**/*.ts\", \"**/*.tsx\"],\n languageOptions: {\n parser: tsParser,\n parserOptions: {\n ecmaVersion: \"latest\",\n sourceType: \"module\",\n },\n },\n plugins: {\n \"@typescript-eslint\": tsPlugin,\n prettier: prettierPlugin,\n \"unused-imports\": unusedImports,\n },\n rules: {\n // Prettier integration\n ...prettierConfig.rules,\n \"prettier/prettier\": \"error\",\n\n // TypeScript rules\n \"@typescript-eslint/no-explicit-any\": \"off\",\n \"@typescript-eslint/no-unused-vars\": \"off\",\n \"no-unused-vars\": \"off\",\n \"unused-imports/no-unused-vars\": [\n \"warn\",\n {\n vars: \"all\",\n varsIgnorePattern: \"^_\",\n args: \"after-used\",\n argsIgnorePattern: \"^_\",\n },\n ],\n \"unused-imports/no-unused-imports\": \"error\",\n \"@typescript-eslint/explicit-member-accessibility\": [\n \"error\",\n { accessibility: \"explicit\" },\n ],\n \"@typescript-eslint/consistent-type-imports\": [\n \"error\",\n {\n prefer: \"type-imports\",\n disallowTypeAnnotations: false,\n },\n ],\n },\n },\n\n // Ignore patterns\n {\n ignores: [\n \"dist/\",\n \"node_modules/\",\n \"**/*.js\",\n \"!**/*.config.js\",\n \"!eslint.config.js\",\n ],\n },\n];\n`,\n \"legacy-prettierignore\": `node_modules\ndist\n\n\n`,\n \"legacy-prettierrc.json\": `{\n \"semi\": true,\n \"tabWidth\": 2,\n \"printWidth\": 100,\n \"singleQuote\": false,\n \"arrowParens\": \"always\",\n \"trailingComma\": \"all\",\n \"endOfLine\": \"lf\",\n \"plugins\": [\"@ianvs/prettier-plugin-sort-imports\"],\n \"importOrder\": [\"<BUILTIN_MODULES>\", \"<THIRD_PARTY_MODULES>\", \"^(app|web|@shared)/\", \"^[.]\"],\n \"importOrderParserPlugins\": [\"typescript\", \"jsx\", \"decorators\"]\n}\n`,\n \"legacy-vscode-settings.json\": `{\n \"editor.defaultFormatter\": \"esbenp.prettier-vscode\",\n \"editor.formatOnSave\": true,\n \"editor.codeActionsOnSave\": {\n \"source.fixAll.eslint\": \"explicit\",\n \"source.organizeImports\": \"never\"\n },\n \"[typescript]\": {\n \"editor.defaultFormatter\": \"esbenp.prettier-vscode\",\n \"editor.formatOnSave\": true\n },\n \"[typescriptreact]\": {\n \"editor.defaultFormatter\": \"esbenp.prettier-vscode\",\n \"editor.formatOnSave\": true\n },\n \"[javascript]\": {\n \"editor.defaultFormatter\": \"esbenp.prettier-vscode\",\n \"editor.formatOnSave\": true\n },\n \"[javascriptreact]\": {\n \"editor.defaultFormatter\": \"esbenp.prettier-vscode\",\n \"editor.formatOnSave\": true\n },\n \"[json]\": {\n \"editor.defaultFormatter\": \"esbenp.prettier-vscode\",\n \"editor.formatOnSave\": true\n },\n \"[css]\": {\n \"editor.defaultFormatter\": \"esbenp.prettier-vscode\",\n \"editor.formatOnSave\": true\n },\n \"prettier.configPath\": \".prettierrc.json\",\n \"prettier.requireConfig\": true,\n \"prettier.ignorePath\": \".prettierignore\",\n \"prettier.documentSelectors\": [\"**/*.{ts,tsx,js,jsx,json,css,md}\"],\n \"prettier.enable\": true,\n \"prettier.useEditorConfig\": false,\n \"prettier.resolveGlobalModules\": false,\n \"eslint.format.enable\": false,\n \"eslint.codeActionsOnSave.mode\": \"all\"\n}\n`,\n \"oxc-vscode-settings.json\": `{\n \"editor.defaultFormatter\": \"oxc.oxc-vscode\",\n \"editor.formatOnSave\": true,\n \"editor.codeActionsOnSave\": {\n \"source.fixAll.oxc\": \"explicit\",\n \"source.organizeImports\": \"never\"\n },\n \"[typescript]\": {\n \"editor.defaultFormatter\": \"oxc.oxc-vscode\",\n \"editor.formatOnSave\": true\n },\n \"[typescriptreact]\": {\n \"editor.defaultFormatter\": \"oxc.oxc-vscode\",\n \"editor.formatOnSave\": true\n },\n \"[javascript]\": {\n \"editor.defaultFormatter\": \"oxc.oxc-vscode\",\n \"editor.formatOnSave\": true\n },\n \"[javascriptreact]\": {\n \"editor.defaultFormatter\": \"oxc.oxc-vscode\",\n \"editor.formatOnSave\": true\n },\n \"[json]\": {\n \"editor.defaultFormatter\": \"oxc.oxc-vscode\",\n \"editor.formatOnSave\": true\n },\n \"[css]\": {\n \"editor.defaultFormatter\": \"oxc.oxc-vscode\",\n \"editor.formatOnSave\": true\n },\n \"oxc.enable.oxlint\": true,\n \"oxc.enable.oxfmt\": true,\n \"oxc.requireConfig\": true\n}\n`,\n \"oxfmtrc.json\": `{\n \"$schema\": \"./node_modules/oxfmt/configuration_schema.json\",\n \"semi\": true,\n \"tabWidth\": 2,\n \"printWidth\": 100,\n \"singleQuote\": false,\n \"arrowParens\": \"always\",\n \"trailingComma\": \"all\",\n \"endOfLine\": \"lf\",\n \"sortImports\": {\n \"newlinesBetween\": false,\n \"internalPattern\": [\"app/\", \"web/\", \"@shared/\"]\n },\n \"ignorePatterns\": [\"node_modules/\", \"dist/\"]\n}\n`,\n \"oxlintrc.json\": `{\n \"$schema\": \"./node_modules/oxlint/configuration_schema.json\",\n \"plugins\": [\"typescript\", \"import\", \"react\"],\n \"env\": { \"node\": true, \"es2021\": true },\n \"categories\": { \"correctness\": \"error\" },\n \"rules\": {\n \"typescript/no-explicit-any\": \"error\",\n \"curly\": \"error\",\n \"no-console\": \"error\",\n \"no-unused-vars\": [\n \"warn\",\n {\n \"vars\": \"all\",\n \"varsIgnorePattern\": \"^_\",\n \"args\": \"after-used\",\n \"argsIgnorePattern\": \"^_\"\n }\n ],\n \"typescript/explicit-member-accessibility\": [\"error\", { \"accessibility\": \"explicit\" }],\n \"typescript/consistent-type-imports\": [\n \"error\",\n { \"prefer\": \"type-imports\", \"disallowTypeAnnotations\": false }\n ]\n },\n \"ignorePatterns\": [\"node_modules/\", \"dist/\"]\n}\n`,\n};\n"],"mappings":";;AACA,MAAa,sBAAwD;CACnE,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmG3B,yBAAyB;;;;;CAKzB,0BAA0B;;;;;;;;;;;;;CAa1B,+BAA+B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0C/B,4BAA4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoC5B,gBAAgB;;;;;;;;;;;;;;;;CAgBhB,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BnB"}
@@ -1,2 +1,4 @@
1
1
  import { DecoratorLoweringPlugin, lowerStage3Decorators } from "./lower-stage3-decorators.mjs";
2
- export { DecoratorLoweringPlugin, lowerStage3Decorators };
2
+ import { recommendedTestWorkers } from "./test-workers.mjs";
3
+ import { TestSetupReporter } from "./test-setup-reporter.mjs";
4
+ export { DecoratorLoweringPlugin, TestSetupReporter, lowerStage3Decorators, recommendedTestWorkers };
@@ -1,3 +1,5 @@
1
1
  import { lowerStage3Decorators } from "./lower-stage3-decorators.mjs";
2
+ import { recommendedTestWorkers } from "./test-workers.mjs";
3
+ import { TestSetupReporter } from "./test-setup-reporter.mjs";
2
4
 
3
- export { lowerStage3Decorators };
5
+ export { TestSetupReporter, lowerStage3Decorators, recommendedTestWorkers };
@@ -0,0 +1,16 @@
1
+ //#region ../../packages/core/src/vite/test-setup-reporter.d.ts
2
+ /** Vitest reporter shape, with no runtime dependency on Vitest in the config helper. */
3
+ export declare class TestSetupReporter {
4
+ private files;
5
+ private bootstraps;
6
+ private workers;
7
+ private totals;
8
+ private shutdowns;
9
+ onTestRunStart(): void;
10
+ onUserConsoleLog(log: {
11
+ content: string;
12
+ }): void;
13
+ onTestRunEnd(): void;
14
+ }
15
+ //#endregion
16
+ //# sourceMappingURL=test-setup-reporter.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-setup-reporter.d.mts","names":[],"sources":["../../../../../../../../packages/core/src/vite/test-setup-reporter.ts"],"mappings":";;qBACa;UACH;UACA;UACA;UACA;UACA;EAED;EAQA,iBAAiB;IAAO;;EA6BxB"}
@@ -0,0 +1,55 @@
1
+ //#region ../../packages/core/src/vite/test-setup-reporter.ts
2
+ /** Vitest reporter shape, with no runtime dependency on Vitest in the config helper. */
3
+ var TestSetupReporter = class {
4
+ constructor() {
5
+ this.files = 0;
6
+ this.bootstraps = 0;
7
+ this.workers = /* @__PURE__ */ new Set();
8
+ this.totals = {};
9
+ this.shutdowns = /* @__PURE__ */ new Map();
10
+ }
11
+ onTestRunStart() {
12
+ this.files = 0;
13
+ this.bootstraps = 0;
14
+ this.workers.clear();
15
+ this.totals = {};
16
+ this.shutdowns.clear();
17
+ }
18
+ onUserConsoleLog(log) {
19
+ for (const line of log.content.split("\n")) {
20
+ const file = line.startsWith("[warlock:test] file=");
21
+ const summary = line.startsWith("[warlock:test] summary ");
22
+ if (!file && !summary) continue;
23
+ const marker = line.lastIndexOf("pid=");
24
+ if (marker === -1) continue;
25
+ const [pid, ...parts] = line.slice(marker + 4).trim().split(/\s+/);
26
+ if (!pid || !/^\d+$/.test(pid)) continue;
27
+ const steps = {};
28
+ for (const part of parts) {
29
+ const match = /^([a-zA-Z]+)=(\d+(?:\.\d+)?)ms$/.exec(part);
30
+ if (match?.[1] && match[2]) steps[match[1]] = Number(match[2]);
31
+ }
32
+ if (summary) {
33
+ if (steps.shutdown !== void 0) this.shutdowns.set(pid, steps.shutdown);
34
+ continue;
35
+ }
36
+ this.workers.add(pid);
37
+ this.files += 1;
38
+ if (steps.bootstrap !== void 0) this.bootstraps += 1;
39
+ for (const [step, ms] of Object.entries(steps)) this.totals[step] = (this.totals[step] ?? 0) + ms;
40
+ }
41
+ }
42
+ onTestRunEnd() {
43
+ if (!this.files) return;
44
+ const shutdown = [...this.shutdowns.values()].reduce((sum, ms) => sum + ms, 0);
45
+ const steps = Object.entries({
46
+ ...this.totals,
47
+ shutdown
48
+ }).map(([step, ms]) => `${step}=${ms.toFixed(2)}ms`).join(" ");
49
+ console.info(`[warlock:test] run summary files=${this.files} workers=${this.workers.size} bootstraps=${this.bootstraps} ${steps}`);
50
+ }
51
+ };
52
+
53
+ //#endregion
54
+ export { TestSetupReporter };
55
+ //# sourceMappingURL=test-setup-reporter.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-setup-reporter.mjs","names":[],"sources":["../../../../../../../../packages/core/src/vite/test-setup-reporter.ts"],"sourcesContent":["/** Vitest reporter shape, with no runtime dependency on Vitest in the config helper. */\nexport class TestSetupReporter {\n private files = 0;\n private bootstraps = 0;\n private workers = new Set<string>();\n private totals: Record<string, number> = {};\n private shutdowns = new Map<string, number>();\n\n public onTestRunStart(): void {\n this.files = 0;\n this.bootstraps = 0;\n this.workers.clear();\n this.totals = {};\n this.shutdowns.clear();\n }\n\n public onUserConsoleLog(log: { content: string }): void {\n for (const line of log.content.split(\"\\n\")) {\n const file = line.startsWith(\"[warlock:test] file=\");\n const summary = line.startsWith(\"[warlock:test] summary \");\n if (!file && !summary) continue;\n const marker = line.lastIndexOf(\"pid=\");\n if (marker === -1) continue;\n const [pid, ...parts] = line\n .slice(marker + 4)\n .trim()\n .split(/\\s+/);\n if (!pid || !/^\\d+$/.test(pid)) continue;\n const steps: Record<string, number> = {};\n for (const part of parts) {\n const match = /^([a-zA-Z]+)=(\\d+(?:\\.\\d+)?)ms$/.exec(part);\n if (match?.[1] && match[2]) steps[match[1]] = Number(match[2]);\n }\n if (summary) {\n if (steps.shutdown !== undefined) this.shutdowns.set(pid, steps.shutdown);\n continue;\n }\n this.workers.add(pid);\n this.files += 1;\n if (steps.bootstrap !== undefined) this.bootstraps += 1;\n for (const [step, ms] of Object.entries(steps))\n this.totals[step] = (this.totals[step] ?? 0) + ms;\n }\n }\n\n public onTestRunEnd(): void {\n if (!this.files) return;\n const shutdown = [...this.shutdowns.values()].reduce((sum, ms) => sum + ms, 0);\n const steps = Object.entries({ ...this.totals, shutdown })\n .map(([step, ms]) => `${step}=${ms.toFixed(2)}ms`)\n .join(\" \");\n console.info(\n `[warlock:test] run summary files=${this.files} workers=${this.workers.size} bootstraps=${this.bootstraps} ${steps}`,\n );\n }\n}\n"],"mappings":";;AACA,IAAa,oBAAb,MAA+B;;eACb;oBACK;iCACH,IAAI,IAAY;gBACO,CAAC;mCACtB,IAAI,IAAoB;;CAE5C,AAAO,iBAAuB;EAC5B,KAAK,QAAQ;EACb,KAAK,aAAa;EAClB,KAAK,QAAQ,MAAM;EACnB,KAAK,SAAS,CAAC;EACf,KAAK,UAAU,MAAM;CACvB;CAEA,AAAO,iBAAiB,KAAgC;EACtD,KAAK,MAAM,QAAQ,IAAI,QAAQ,MAAM,IAAI,GAAG;GAC1C,MAAM,OAAO,KAAK,WAAW,sBAAsB;GACnD,MAAM,UAAU,KAAK,WAAW,yBAAyB;GACzD,IAAI,CAAC,QAAQ,CAAC,SAAS;GACvB,MAAM,SAAS,KAAK,YAAY,MAAM;GACtC,IAAI,WAAW,IAAI;GACnB,MAAM,CAAC,KAAK,GAAG,SAAS,KACrB,MAAM,SAAS,CAAC,CAAC,CACjB,KAAK,CAAC,CACN,MAAM,KAAK;GACd,IAAI,CAAC,OAAO,CAAC,QAAQ,KAAK,GAAG,GAAG;GAChC,MAAM,QAAgC,CAAC;GACvC,KAAK,MAAM,QAAQ,OAAO;IACxB,MAAM,QAAQ,kCAAkC,KAAK,IAAI;IACzD,IAAI,QAAQ,MAAM,MAAM,IAAI,MAAM,MAAM,MAAM,OAAO,MAAM,EAAE;GAC/D;GACA,IAAI,SAAS;IACX,IAAI,MAAM,aAAa,QAAW,KAAK,UAAU,IAAI,KAAK,MAAM,QAAQ;IACxE;GACF;GACA,KAAK,QAAQ,IAAI,GAAG;GACpB,KAAK,SAAS;GACd,IAAI,MAAM,cAAc,QAAW,KAAK,cAAc;GACtD,KAAK,MAAM,CAAC,MAAM,OAAO,OAAO,QAAQ,KAAK,GAC3C,KAAK,OAAO,SAAS,KAAK,OAAO,SAAS,KAAK;EACnD;CACF;CAEA,AAAO,eAAqB;EAC1B,IAAI,CAAC,KAAK,OAAO;EACjB,MAAM,WAAW,CAAC,GAAG,KAAK,UAAU,OAAO,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,MAAM,IAAI,CAAC;EAC7E,MAAM,QAAQ,OAAO,QAAQ;GAAE,GAAG,KAAK;GAAQ;EAAS,CAAC,CAAC,CACvD,KAAK,CAAC,MAAM,QAAQ,GAAG,KAAK,GAAG,GAAG,QAAQ,CAAC,EAAE,GAAG,CAAC,CACjD,KAAK,GAAG;EACX,QAAQ,KACN,oCAAoC,KAAK,MAAM,WAAW,KAAK,QAAQ,KAAK,cAAc,KAAK,WAAW,GAAG,OAC/G;CACF;AACF"}
@@ -0,0 +1,5 @@
1
+ //#region ../../packages/core/src/vite/test-workers.d.ts
2
+ /** Limit Vitest forks to both CPU affinity and the tightest visible cgroup v2 quota. */
3
+ export declare function recommendedTestWorkers(parallelism?: number, read?: (file: string) => string): number;
4
+ //#endregion
5
+ //# sourceMappingURL=test-workers.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-workers.d.mts","names":[],"sources":["../../../../../../../../packages/core/src/vite/test-workers.ts"],"mappings":";;wBAqBgB,uBACd,sBACA,QAAO"}
@@ -0,0 +1,38 @@
1
+ import path from "node:path";
2
+ import { readFileSync } from "node:fs";
3
+ import { availableParallelism } from "node:os";
4
+
5
+ //#region ../../packages/core/src/vite/test-workers.ts
6
+ /** cgroup v2 cpu.max: quota microseconds / period microseconds; round down to avoid oversubscription. */
7
+ function cpuQuotaWorkers(value) {
8
+ const [quota, period] = value.trim().split(/\s+/);
9
+ if (quota === "max") return void 0;
10
+ const quotaNumber = Number(quota);
11
+ const periodNumber = Number(period);
12
+ if (!Number.isFinite(quotaNumber) || !Number.isFinite(periodNumber) || quotaNumber <= 0 || periodNumber <= 0) return void 0;
13
+ return Math.max(1, Math.floor(quotaNumber / periodNumber));
14
+ }
15
+ /** Limit Vitest forks to both CPU affinity and the tightest visible cgroup v2 quota. */
16
+ function recommendedTestWorkers(parallelism = availableParallelism(), read = (file) => readFileSync(file, "utf8")) {
17
+ let workers = Math.max(1, Math.floor(parallelism));
18
+ const root = "/sys/fs/cgroup";
19
+ let directory = root;
20
+ try {
21
+ const entry = read("/proc/self/cgroup").split("\n").find((line) => line.startsWith("0::"));
22
+ if (entry) directory = path.resolve(root, `.${entry.slice(3)}`);
23
+ if (directory !== root && !directory.startsWith(`${root}/`)) directory = root;
24
+ } catch {}
25
+ for (;;) {
26
+ try {
27
+ const quota = cpuQuotaWorkers(read(path.join(directory, "cpu.max")));
28
+ if (quota !== void 0) workers = Math.min(workers, quota);
29
+ } catch {}
30
+ if (directory === root) break;
31
+ directory = path.dirname(directory);
32
+ }
33
+ return workers;
34
+ }
35
+
36
+ //#endregion
37
+ export { cpuQuotaWorkers, recommendedTestWorkers };
38
+ //# sourceMappingURL=test-workers.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-workers.mjs","names":[],"sources":["../../../../../../../../packages/core/src/vite/test-workers.ts"],"sourcesContent":["import { readFileSync } from \"node:fs\";\nimport { availableParallelism } from \"node:os\";\nimport path from \"node:path\";\n\n/** cgroup v2 cpu.max: quota microseconds / period microseconds; round down to avoid oversubscription. */\nexport function cpuQuotaWorkers(value: string): number | undefined {\n const [quota, period] = value.trim().split(/\\s+/);\n if (quota === \"max\") return undefined;\n const quotaNumber = Number(quota);\n const periodNumber = Number(period);\n if (\n !Number.isFinite(quotaNumber) ||\n !Number.isFinite(periodNumber) ||\n quotaNumber <= 0 ||\n periodNumber <= 0\n )\n return undefined;\n return Math.max(1, Math.floor(quotaNumber / periodNumber));\n}\n\n/** Limit Vitest forks to both CPU affinity and the tightest visible cgroup v2 quota. */\nexport function recommendedTestWorkers(\n parallelism = availableParallelism(),\n read: (file: string) => string = (file) => readFileSync(file, \"utf8\"),\n): number {\n let workers = Math.max(1, Math.floor(parallelism));\n const root = \"/sys/fs/cgroup\";\n let directory = root;\n try {\n const entry = read(\"/proc/self/cgroup\")\n .split(\"\\n\")\n .find((line) => line.startsWith(\"0::\"));\n if (entry) directory = path.resolve(root, `.${entry.slice(3)}`);\n if (directory !== root && !directory.startsWith(`${root}/`)) directory = root;\n } catch {\n /* Non-Linux hosts use CPU affinity. */\n }\n for (;;) {\n try {\n const quota = cpuQuotaWorkers(read(path.join(directory, \"cpu.max\")));\n if (quota !== undefined) workers = Math.min(workers, quota);\n } catch {\n /* Missing/unreadable quotas do not replace the affinity limit. */\n }\n if (directory === root) break;\n directory = path.dirname(directory);\n }\n return workers;\n}\n"],"mappings":";;;;;;AAKA,SAAgB,gBAAgB,OAAmC;CACjE,MAAM,CAAC,OAAO,UAAU,MAAM,KAAK,CAAC,CAAC,MAAM,KAAK;CAChD,IAAI,UAAU,OAAO,OAAO;CAC5B,MAAM,cAAc,OAAO,KAAK;CAChC,MAAM,eAAe,OAAO,MAAM;CAClC,IACE,CAAC,OAAO,SAAS,WAAW,KAC5B,CAAC,OAAO,SAAS,YAAY,KAC7B,eAAe,KACf,gBAAgB,GAEhB,OAAO;CACT,OAAO,KAAK,IAAI,GAAG,KAAK,MAAM,cAAc,YAAY,CAAC;AAC3D;;AAGA,SAAgB,uBACd,cAAc,qBAAqB,GACnC,QAAkC,SAAS,aAAa,MAAM,MAAM,GAC5D;CACR,IAAI,UAAU,KAAK,IAAI,GAAG,KAAK,MAAM,WAAW,CAAC;CACjD,MAAM,OAAO;CACb,IAAI,YAAY;CAChB,IAAI;EACF,MAAM,QAAQ,KAAK,mBAAmB,CAAC,CACpC,MAAM,IAAI,CAAC,CACX,MAAM,SAAS,KAAK,WAAW,KAAK,CAAC;EACxC,IAAI,OAAO,YAAY,KAAK,QAAQ,MAAM,IAAI,MAAM,MAAM,CAAC,GAAG;EAC9D,IAAI,cAAc,QAAQ,CAAC,UAAU,WAAW,GAAG,KAAK,EAAE,GAAG,YAAY;CAC3E,QAAQ,CAER;CACA,SAAS;EACP,IAAI;GACF,MAAM,QAAQ,gBAAgB,KAAK,KAAK,KAAK,WAAW,SAAS,CAAC,CAAC;GACnE,IAAI,UAAU,QAAW,UAAU,KAAK,IAAI,SAAS,KAAK;EAC5D,QAAQ,CAER;EACA,IAAI,cAAc,MAAM;EACxB,YAAY,KAAK,QAAQ,SAAS;CACpC;CACA,OAAO;AACT"}
@@ -1,4 +1,5 @@
1
+ import { BudgetPage, BudgetViolation, BuildBudgetReport, BuildBudgets, PageBudget } from "../production/build-budgets.mjs";
1
2
  import { WarlockConfig } from "./types.mjs";
2
3
  import { defineConfig } from "./define-config.mjs";
3
4
  import { WarlockConfigManager, isUnknownTsExtensionError, isUnresolvedConfigImportError, isUnsupportedTypeStrippingError, warlockConfigManager } from "./warlock-config.manager.mjs";
4
- export { WarlockConfig, WarlockConfigManager, defineConfig, isUnknownTsExtensionError, isUnresolvedConfigImportError, isUnsupportedTypeStrippingError, warlockConfigManager };
5
+ export { type BudgetPage, type BudgetViolation, type BuildBudgetReport, type BuildBudgets, type PageBudget, WarlockConfig, WarlockConfigManager, defineConfig, isUnknownTsExtensionError, isUnresolvedConfigImportError, isUnsupportedTypeStrippingError, warlockConfigManager };
@@ -1,3 +1,4 @@
1
+ import { BuildBudgets } from "../production/build-budgets.mjs";
1
2
  import { BuiltInHealthCheckerOptions, FileHealthCheckerContract } from "../dev-server/health-checker/file-health-checker.contract.mjs";
2
3
  import { Connector } from "../connectors/types.mjs";
3
4
  import { CLICommand } from "../commands/cli-command.mjs";
@@ -45,6 +46,8 @@ export type WarlockConfig = {
45
46
  * @default dist
46
47
  */
47
48
  outdir?: string;
49
+ /** Per-page compressed client asset limits. Omit for reporting only. */
50
+ budgets?: BuildBudgets;
48
51
  /**
49
52
  * Alias for {@link outdir}.
50
53
  *
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.mts","names":[],"sources":["../../../../../../../../packages/core/src/warlock-config/types.ts"],"mappings":";;;;;;;;;;;YAcY;;;;EAIV;;;;IAIE;;;;IAIA;;;;IAIA;;;;;;;;;;;;;EAcF,QAAQ,KAAK;;;;;;IAMX;;;;;;;;;;;IAWA;;;;;;IAMA;;;;;;;IAOA;;;;;;;;;;;;;;;;;IAiBA;;;;;;;;;;;;;;;;IAgBA;;;;;;IAMA;;;;;;IAMA;;;;;;;;;;;;;;;;;;;;;;;;;;EA2BF,aAAa;;;;EAKb;IACE,WAAW;;;;;EAMb;;;;IAIE;;;;;;MAME;;;;;;MAMA;;;;;;IAMF,iBAAiB,8BAA8B;;;;;IAK/C;;;;;;;;;IASA;;;;;;;;;IASA;;;;;;;;;;IAUA;;;;;;;;;;;;IAYA;;;;;;;;;;IAUA;;;;;;;;;IASA;;MAIM;;MAEA;;MAEA;;;;;;EAOR;;;;;;;;;;;;;;;;;;IAkBE,aAAa,MAAM;;;;;;;;EASrB;;;;;;;;;IASE;;;;;;;;IASA"}
1
+ {"version":3,"file":"types.d.mts","names":[],"sources":["../../../../../../../../packages/core/src/warlock-config/types.ts"],"mappings":";;;;;;;;;;;;YAeY;;;;EAIV;;;;IAIE;;;;IAIA;;;;IAIA;;;;;;;;;;;;;EAcF,QAAQ,KAAK;;;;;;IAMX;;IAEA,UAAU;;;;;;;;;;;IAWV;;;;;;IAMA;;;;;;;IAOA;;;;;;;;;;;;;;;;;IAiBA;;;;;;;;;;;;;;;;IAgBA;;;;;;IAMA;;;;;;IAMA;;;;;;;;;;;;;;;;;;;;;;;;;;EA2BF,aAAa;;;;EAKb;IACE,WAAW;;;;;EAMb;;;;IAIE;;;;;;MAME;;;;;;MAMA;;;;;;IAMF,iBAAiB,8BAA8B;;;;;IAK/C;;;;;;;;;IASA;;;;;;;;;IASA;;;;;;;;;;IAUA;;;;;;;;;;;;IAYA;;;;;;;;;;IAUA;;;;;;;;;IASA;;MAIM;;MAEA;;MAEA;;;;;;EAOR;;;;;;;;;;;;;;;;;;IAkBE,aAAa,MAAM;;;;;;;;EASrB;;;;;;;;;IASE;;;;;;;;IASA"}