@venizia/dev-configs 0.4.7 → 0.4.8-1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (199) hide show
  1. package/README.md +3 -3
  2. package/dist/checks/catalog.d.ts +15 -2
  3. package/dist/checks/catalog.js +1 -0
  4. package/dist/checks/catalog.js.map +1 -1
  5. package/dist/checks/module-cycles.d.ts +2 -0
  6. package/dist/checks/module-cycles.js +2 -0
  7. package/dist/checks/module-cycles.js.map +1 -1
  8. package/dist/checks/purity/manifest.d.ts +6 -1
  9. package/dist/checks/purity/manifest.js.map +1 -1
  10. package/dist/checks/purity/probe.d.ts +4 -1
  11. package/dist/checks/purity/probe.js +1 -0
  12. package/dist/checks/purity/probe.js.map +1 -1
  13. package/dist/checks/purity/run.d.ts +3 -0
  14. package/dist/checks/purity/run.js +1 -0
  15. package/dist/checks/purity/run.js.map +1 -1
  16. package/dist/checks/split-report.d.ts +1 -0
  17. package/dist/checks/split-report.js +1 -0
  18. package/dist/checks/split-report.js.map +1 -1
  19. package/dist/checks/test-controls.d.ts +11 -2
  20. package/dist/checks/test-controls.js +1 -0
  21. package/dist/checks/test-controls.js.map +1 -1
  22. package/dist/checks/test-dead-code.d.ts +1 -0
  23. package/dist/checks/test-dead-code.js +1 -0
  24. package/dist/checks/test-dead-code.js.map +1 -1
  25. package/dist/checks/test-mutate.d.ts +14 -2
  26. package/dist/checks/test-mutate.js +1 -0
  27. package/dist/checks/test-mutate.js.map +1 -1
  28. package/dist/checks/test-weight.d.ts +3 -0
  29. package/dist/checks/test-weight.js +1 -0
  30. package/dist/checks/test-weight.js.map +1 -1
  31. package/dist/cli/check.js.map +1 -1
  32. package/dist/cli/clean.js.map +1 -1
  33. package/dist/cli/codemod/async-style.d.ts +1 -1
  34. package/dist/cli/codemod/async-style.js +3 -3
  35. package/dist/cli/codemod/async-style.js.map +1 -1
  36. package/dist/cli/codemod/connector-imports.js.map +1 -1
  37. package/dist/cli/codemod/const-classes.js.map +1 -1
  38. package/dist/cli/codemod/drop-redundant-casts.js.map +1 -1
  39. package/dist/cli/codemod/files.js.map +1 -1
  40. package/dist/cli/codemod/index.js.map +1 -1
  41. package/dist/cli/codemod/namespace-functions/index.js.map +1 -1
  42. package/dist/cli/codemod/namespace-functions/logger-scope.js.map +1 -1
  43. package/dist/cli/codemod/namespace-functions/mapping.js.map +1 -1
  44. package/dist/cli/codemod/namespace-functions/rewriter.js.map +1 -1
  45. package/dist/cli/index.js.map +1 -1
  46. package/dist/cli/lint.js.map +1 -1
  47. package/dist/linters/eslint.js +7 -5
  48. package/dist/linters/eslint.js.map +1 -1
  49. package/dist/linters/house/async-rules.d.ts +10 -0
  50. package/dist/linters/house/async-rules.js +29 -0
  51. package/dist/linters/house/async-rules.js.map +1 -0
  52. package/dist/linters/house/await-support.d.ts +2 -0
  53. package/dist/linters/house/await-support.js +15 -10
  54. package/dist/linters/house/await-support.js.map +1 -1
  55. package/dist/linters/house/common.d.ts +2 -0
  56. package/dist/linters/house/common.js +2 -0
  57. package/dist/linters/house/common.js.map +1 -1
  58. package/dist/linters/house/configs.d.ts +3 -29
  59. package/dist/linters/house/configs.js +24 -51
  60. package/dist/linters/house/configs.js.map +1 -1
  61. package/dist/linters/house/const-class-values.rule.js.map +1 -1
  62. package/dist/linters/house/effect-cleanup-consistency.rule.js +2 -1
  63. package/dist/linters/house/effect-cleanup-consistency.rule.js.map +1 -1
  64. package/dist/linters/house/hook-support.js.map +1 -1
  65. package/dist/linters/house/index.d.ts +2 -1
  66. package/dist/linters/house/index.js +4 -1
  67. package/dist/linters/house/index.js.map +1 -1
  68. package/dist/linters/house/max-params-own.rule.d.ts +3 -1
  69. package/dist/linters/house/max-params-own.rule.js +1 -1
  70. package/dist/linters/house/max-params-own.rule.js.map +1 -1
  71. package/dist/linters/house/no-async-hook-callback.rule.js.map +1 -1
  72. package/dist/linters/house/no-await-promise-chain.rule.js +2 -3
  73. package/dist/linters/house/no-await-promise-chain.rule.js.map +1 -1
  74. package/dist/linters/house/no-leaked-render.rule.js.map +1 -1
  75. package/dist/linters/house/no-return-await.rule.js +2 -8
  76. package/dist/linters/house/no-return-await.rule.js.map +1 -1
  77. package/dist/linters/house/no-silent-catch.rule.js +1 -1
  78. package/dist/linters/house/no-silent-catch.rule.js.map +1 -1
  79. package/dist/linters/house/no-unbraced-case.rule.d.ts +15 -0
  80. package/dist/linters/house/no-unbraced-case.rule.js +45 -0
  81. package/dist/linters/house/no-unbraced-case.rule.js.map +1 -0
  82. package/dist/linters/house/plugin.js +2 -0
  83. package/dist/linters/house/plugin.js.map +1 -1
  84. package/dist/linters/house/promise-chain-support.js.map +1 -1
  85. package/dist/linters/ignore.js.map +1 -1
  86. package/dist/linters/index.d.ts +1 -0
  87. package/dist/linters/index.js +1 -0
  88. package/dist/linters/index.js.map +1 -1
  89. package/dist/linters/oxlint.d.ts +6 -1
  90. package/dist/linters/oxlint.js.map +1 -1
  91. package/dist/linters/padding.d.ts +8 -0
  92. package/dist/linters/padding.js +25 -0
  93. package/dist/linters/padding.js.map +1 -0
  94. package/dist/linters/rules/eqeqeq.rule.js.map +1 -1
  95. package/dist/linters/rules/index.d.ts +2 -0
  96. package/dist/linters/rules/index.js +2 -0
  97. package/dist/linters/rules/index.js.map +1 -1
  98. package/dist/linters/rules/lines-between-class-members.rule.d.ts +14 -0
  99. package/dist/linters/rules/lines-between-class-members.rule.js +17 -0
  100. package/dist/linters/rules/lines-between-class-members.rule.js.map +1 -0
  101. package/dist/linters/rules/naming-convention.rule.js.map +1 -1
  102. package/dist/linters/rules/no-restricted-imports.rule.js.map +1 -1
  103. package/dist/linters/rules/no-restricted-properties.rule.js.map +1 -1
  104. package/dist/linters/rules/no-unused-vars.rule.d.ts +6 -1
  105. package/dist/linters/rules/no-unused-vars.rule.js +1 -1
  106. package/dist/linters/rules/no-unused-vars.rule.js.map +1 -1
  107. package/dist/linters/rules/padding-line-between-statements.rule.d.ts +16 -0
  108. package/dist/linters/rules/padding-line-between-statements.rule.js +25 -0
  109. package/dist/linters/rules/padding-line-between-statements.rule.js.map +1 -0
  110. package/dist/linters/rules/prefer-nullish-coalescing.rule.js.map +1 -1
  111. package/dist/linters/rules/switch-case-braces.rule.js.map +1 -1
  112. package/dist/testing/rejection.helper.d.ts +1 -0
  113. package/dist/testing/rejection.helper.js +1 -0
  114. package/dist/testing/rejection.helper.js.map +1 -1
  115. package/dist/testing/repo-tmp.d.ts +1 -0
  116. package/dist/testing/repo-tmp.js +1 -0
  117. package/dist/testing/repo-tmp.js.map +1 -1
  118. package/dist/testing/spawn.helper.d.ts +1 -0
  119. package/dist/testing/spawn.helper.js +1 -0
  120. package/dist/testing/spawn.helper.js.map +1 -1
  121. package/package.json +3 -5
  122. package/dist/checks/catalog.d.ts.map +0 -1
  123. package/dist/checks/index.d.ts.map +0 -1
  124. package/dist/checks/module-cycles.d.ts.map +0 -1
  125. package/dist/checks/purity/manifest.d.ts.map +0 -1
  126. package/dist/checks/purity/probe.d.ts.map +0 -1
  127. package/dist/checks/purity/run.d.ts.map +0 -1
  128. package/dist/checks/split-report.d.ts.map +0 -1
  129. package/dist/checks/test-controls.d.ts.map +0 -1
  130. package/dist/checks/test-dead-code.d.ts.map +0 -1
  131. package/dist/checks/test-mutate.d.ts.map +0 -1
  132. package/dist/checks/test-weight.d.ts.map +0 -1
  133. package/dist/cli/check.d.ts.map +0 -1
  134. package/dist/cli/clean.d.ts.map +0 -1
  135. package/dist/cli/codemod/async-style.d.ts.map +0 -1
  136. package/dist/cli/codemod/connector-imports.d.ts.map +0 -1
  137. package/dist/cli/codemod/const-classes.d.ts.map +0 -1
  138. package/dist/cli/codemod/drop-redundant-casts.d.ts.map +0 -1
  139. package/dist/cli/codemod/files.d.ts.map +0 -1
  140. package/dist/cli/codemod/index.d.ts.map +0 -1
  141. package/dist/cli/codemod/namespace-functions/index.d.ts.map +0 -1
  142. package/dist/cli/codemod/namespace-functions/logger-scope.d.ts.map +0 -1
  143. package/dist/cli/codemod/namespace-functions/mapping.d.ts.map +0 -1
  144. package/dist/cli/codemod/namespace-functions/mappings/boot.d.ts.map +0 -1
  145. package/dist/cli/codemod/namespace-functions/mappings/connectors.d.ts.map +0 -1
  146. package/dist/cli/codemod/namespace-functions/mappings/core-server.d.ts.map +0 -1
  147. package/dist/cli/codemod/namespace-functions/mappings/core-worker.d.ts.map +0 -1
  148. package/dist/cli/codemod/namespace-functions/mappings/dev-configs.d.ts.map +0 -1
  149. package/dist/cli/codemod/namespace-functions/mappings/filter.d.ts.map +0 -1
  150. package/dist/cli/codemod/namespace-functions/mappings/helpers.d.ts.map +0 -1
  151. package/dist/cli/codemod/namespace-functions/mappings/index.d.ts.map +0 -1
  152. package/dist/cli/codemod/namespace-functions/mappings/inversion.d.ts.map +0 -1
  153. package/dist/cli/codemod/namespace-functions/mappings/kernel.d.ts.map +0 -1
  154. package/dist/cli/codemod/namespace-functions/rewriter.d.ts.map +0 -1
  155. package/dist/cli/index.d.ts.map +0 -1
  156. package/dist/cli/lint.d.ts.map +0 -1
  157. package/dist/compilers/bun.d.ts.map +0 -1
  158. package/dist/compilers/index.d.ts.map +0 -1
  159. package/dist/index.d.ts.map +0 -1
  160. package/dist/linters/browser.d.ts.map +0 -1
  161. package/dist/linters/eslint.d.ts.map +0 -1
  162. package/dist/linters/house/await-support.d.ts.map +0 -1
  163. package/dist/linters/house/common.d.ts.map +0 -1
  164. package/dist/linters/house/configs.d.ts.map +0 -1
  165. package/dist/linters/house/const-class-values.rule.d.ts.map +0 -1
  166. package/dist/linters/house/effect-cleanup-consistency.rule.d.ts.map +0 -1
  167. package/dist/linters/house/hook-support.d.ts.map +0 -1
  168. package/dist/linters/house/index.d.ts.map +0 -1
  169. package/dist/linters/house/max-params-own.rule.d.ts.map +0 -1
  170. package/dist/linters/house/no-async-hook-callback.rule.d.ts.map +0 -1
  171. package/dist/linters/house/no-await-promise-chain.rule.d.ts.map +0 -1
  172. package/dist/linters/house/no-inline-await.rule.d.ts.map +0 -1
  173. package/dist/linters/house/no-leaked-render.rule.d.ts.map +0 -1
  174. package/dist/linters/house/no-new-error.rule.d.ts.map +0 -1
  175. package/dist/linters/house/no-return-await.rule.d.ts.map +0 -1
  176. package/dist/linters/house/no-silent-catch.rule.d.ts.map +0 -1
  177. package/dist/linters/house/plugin.d.ts.map +0 -1
  178. package/dist/linters/house/promise-chain-support.d.ts.map +0 -1
  179. package/dist/linters/ignore.d.ts.map +0 -1
  180. package/dist/linters/index.d.ts.map +0 -1
  181. package/dist/linters/jsx-files.d.ts.map +0 -1
  182. package/dist/linters/oxlint-presets.d.ts.map +0 -1
  183. package/dist/linters/oxlint.d.ts.map +0 -1
  184. package/dist/linters/react-eslint.d.ts.map +0 -1
  185. package/dist/linters/react-oxlint.d.ts.map +0 -1
  186. package/dist/linters/rules/common.d.ts.map +0 -1
  187. package/dist/linters/rules/eqeqeq.rule.d.ts.map +0 -1
  188. package/dist/linters/rules/index.d.ts.map +0 -1
  189. package/dist/linters/rules/naming-convention.rule.d.ts.map +0 -1
  190. package/dist/linters/rules/no-restricted-imports.rule.d.ts.map +0 -1
  191. package/dist/linters/rules/no-restricted-properties.rule.d.ts.map +0 -1
  192. package/dist/linters/rules/no-unused-vars.rule.d.ts.map +0 -1
  193. package/dist/linters/rules/prefer-nullish-coalescing.rule.d.ts.map +0 -1
  194. package/dist/linters/rules/switch-case-braces.rule.d.ts.map +0 -1
  195. package/dist/testing/index.d.ts.map +0 -1
  196. package/dist/testing/rejection.helper.d.ts.map +0 -1
  197. package/dist/testing/repo-tmp.d.ts.map +0 -1
  198. package/dist/testing/spawn.helper.d.ts.map +0 -1
  199. package/dist/testing/tmpdir-preload.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"clean.js","sourceRoot":"","sources":["../../src/cli/clean.ts"],"names":[],"mappings":";;;AAAA,qCAA8C;AAC9C,yCAAiC;AAEjC,0EAA0E;AAC1E,MAAM,eAAe,GAAG,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;AAExD;;;GAGG;AACH,MAAM,iBAAiB,GAAG,cAAc,CAAC;AAEzC,MAAM,KAAK,GAAG;;;;;sCAKwB,CAAC;AAEvC,0CAA0C;AAC1C,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAE3B,wKAAwK;AACxK,MAAa,YAAY;IACvB,MAAM,CAAC,GAAG,CAAC,IAAuC;QAChD,MAAM,EAAE,IAAI,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC;QAE3B,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACnD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACnB,OAAO,CAAC,CAAC;QACX,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CACX,mCAAmC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,EAAE,CACxF,CAAC;YACF,OAAO,gBAAgB,CAAC;QAC1B,CAAC;QAED,KAAK,MAAM,IAAI,IAAI,eAAe,EAAE,CAAC;YACnC,IAAA,gBAAM,EAAC,IAAA,gBAAI,EAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAClE,CAAC;QAED,KAAK,MAAM,KAAK,IAAI,IAAA,qBAAW,EAAC,IAAI,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YACpE,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;gBAC7D,IAAA,gBAAM,EAAC,IAAA,gBAAI,EAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACvD,CAAC;QACH,CAAC;QAED,OAAO,CAAC,CAAC;IACX,CAAC;CACF;AA5BD,oCA4BC","sourcesContent":["import { readdirSync, rmSync } from 'node:fs';\nimport { join } from 'node:path';\n\n/** What a build and the checks generate, relative to the project root. */\nconst GENERATED_PATHS = ['dist', 'node_modules/.cache'];\n\n/**\n * `incremental` is on in the base tsconfig, so a type-check that emits nothing leaves\n * `<tsconfig name>.tsbuildinfo` next to the tsconfig. One inside `dist` is already removed with it.\n */\nconst BUILD_INFO_SUFFIX = '.tsbuildinfo';\n\nconst USAGE = `Usage: devz clean\n\nRemoves what the build and the checks generate, in the current folder: dist, node_modules/.cache and\nthe *.tsbuildinfo files next to the tsconfig. It takes no argument.\n\n --help print this text and exit`;\n\n/** A usage error: nothing was deleted. */\nconst USAGE_ERROR_CODE = 2;\n\n/** `devz clean`: removes what the build and the checks generate, and nothing else. `--help` prints the usage; any other argument is refused, and nothing is deleted. */\nexport class CleanCommand {\n static run(opts: { root: string; args?: string[] }): number {\n const { args = [] } = opts;\n\n if (args.includes('--help') || args.includes('-h')) {\n console.log(USAGE);\n return 0;\n }\n\n if (args.length > 0) {\n console.error(\n `devz clean: unexpected argument ${args.map((arg) => `\"${arg}\"`).join(', ')}\\n${USAGE}`,\n );\n return USAGE_ERROR_CODE;\n }\n\n for (const path of GENERATED_PATHS) {\n rmSync(join(opts.root, path), { recursive: true, force: true });\n }\n\n for (const entry of readdirSync(opts.root, { withFileTypes: true })) {\n if (entry.isFile() && entry.name.endsWith(BUILD_INFO_SUFFIX)) {\n rmSync(join(opts.root, entry.name), { force: true });\n }\n }\n\n return 0;\n }\n}\n"]}
1
+ {"version":3,"file":"clean.js","sourceRoot":"","sources":["../../src/cli/clean.ts"],"names":[],"mappings":";;;AAAA,qCAA8C;AAC9C,yCAAiC;AAEjC,0EAA0E;AAC1E,MAAM,eAAe,GAAG,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;AAExD;;;GAGG;AACH,MAAM,iBAAiB,GAAG,cAAc,CAAC;AAEzC,MAAM,KAAK,GAAG;;;;;sCAKwB,CAAC;AAEvC,0CAA0C;AAC1C,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAE3B,wKAAwK;AACxK,MAAa,YAAY;IACvB,MAAM,CAAC,GAAG,CAAC,IAAuC;QAChD,MAAM,EAAE,IAAI,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC;QAE3B,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACnD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAEnB,OAAO,CAAC,CAAC;QACX,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CACX,mCAAmC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,EAAE,CACxF,CAAC;YAEF,OAAO,gBAAgB,CAAC;QAC1B,CAAC;QAED,KAAK,MAAM,IAAI,IAAI,eAAe,EAAE,CAAC;YACnC,IAAA,gBAAM,EAAC,IAAA,gBAAI,EAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAClE,CAAC;QAED,KAAK,MAAM,KAAK,IAAI,IAAA,qBAAW,EAAC,IAAI,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YACpE,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;gBAC7D,IAAA,gBAAM,EAAC,IAAA,gBAAI,EAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACvD,CAAC;QACH,CAAC;QAED,OAAO,CAAC,CAAC;IACX,CAAC;CACF;AA9BD,oCA8BC","sourcesContent":["import { readdirSync, rmSync } from 'node:fs';\nimport { join } from 'node:path';\n\n/** What a build and the checks generate, relative to the project root. */\nconst GENERATED_PATHS = ['dist', 'node_modules/.cache'];\n\n/**\n * `incremental` is on in the base tsconfig, so a type-check that emits nothing leaves\n * `<tsconfig name>.tsbuildinfo` next to the tsconfig. One inside `dist` is already removed with it.\n */\nconst BUILD_INFO_SUFFIX = '.tsbuildinfo';\n\nconst USAGE = `Usage: devz clean\n\nRemoves what the build and the checks generate, in the current folder: dist, node_modules/.cache and\nthe *.tsbuildinfo files next to the tsconfig. It takes no argument.\n\n --help print this text and exit`;\n\n/** A usage error: nothing was deleted. */\nconst USAGE_ERROR_CODE = 2;\n\n/** `devz clean`: removes what the build and the checks generate, and nothing else. `--help` prints the usage; any other argument is refused, and nothing is deleted. */\nexport class CleanCommand {\n static run(opts: { root: string; args?: string[] }): number {\n const { args = [] } = opts;\n\n if (args.includes('--help') || args.includes('-h')) {\n console.log(USAGE);\n\n return 0;\n }\n\n if (args.length > 0) {\n console.error(\n `devz clean: unexpected argument ${args.map((arg) => `\"${arg}\"`).join(', ')}\\n${USAGE}`,\n );\n\n return USAGE_ERROR_CODE;\n }\n\n for (const path of GENERATED_PATHS) {\n rmSync(join(opts.root, path), { recursive: true, force: true });\n }\n\n for (const entry of readdirSync(opts.root, { withFileTypes: true })) {\n if (entry.isFile() && entry.name.endsWith(BUILD_INFO_SUFFIX)) {\n rmSync(join(opts.root, entry.name), { force: true });\n }\n }\n\n return 0;\n }\n}\n"]}
@@ -16,7 +16,7 @@ export interface IAsyncStyleResult {
16
16
  }
17
17
  /** Runs the async-style rules, and only those, over source text with ESLint's own fixer loop. */
18
18
  export declare class AsyncStyle {
19
- /** The `Linter` config: the TypeScript parser and the rules of `asyncStyleConfigs`, at error. */
19
+ /** The `Linter` config: the TypeScript parser and the rules of `asyncRuleConfigs`, at error. */
20
20
  static createConfig(): Promise<Linter.Config[]>;
21
21
  /**
22
22
  * The self-check's config: four scope rules, run on the text before and after the fixers. A hoisted name must be
@@ -51,10 +51,10 @@ class AsyncStyleFlags {
51
51
  }
52
52
  /** Runs the async-style rules, and only those, over source text with ESLint's own fixer loop. */
53
53
  class AsyncStyle {
54
- /** The `Linter` config: the TypeScript parser and the rules of `asyncStyleConfigs`, at error. */
54
+ /** The `Linter` config: the TypeScript parser and the rules of `asyncRuleConfigs`, at error. */
55
55
  static async createConfig() {
56
56
  const { default: tseslint } = await import('typescript-eslint');
57
- const { asyncStyleConfigs } = await import('../../linters/house/index.js');
57
+ const { asyncRuleConfigs } = await import('../../linters/house/async-rules.js');
58
58
  return [
59
59
  {
60
60
  files: ['**/*.{ts,tsx,mts,cts}'],
@@ -63,7 +63,7 @@ class AsyncStyle {
63
63
  // ESLint's fixer would delete it. A codemod never touches a directive.
64
64
  linterOptions: { reportUnusedDisableDirectives: 'off' },
65
65
  },
66
- ...asyncStyleConfigs,
66
+ ...asyncRuleConfigs,
67
67
  ];
68
68
  }
69
69
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"async-style.js","sourceRoot":"","sources":["../../../src/cli/codemod/async-style.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFileSync, writeFileSync } from 'node:fs';\nimport { relative, resolve } from 'node:path';\nimport type { Linter } from 'eslint';\nimport { CodemodFiles } from './files';\n\nconst USAGE = `Usage: devz codemod async-style [paths...] [--write | --check]\n\nApplies the fixers of three house lint rules, so a repository can sweep them without a lint pass:\n\n venizia/no-inline-await \\`expect(await f())\\` becomes \\`const result = await f(); expect(result)\\`\n venizia/no-return-await \\`return await f()\\` becomes \\`return f()\\` (\\`const result = await f(); return result;\\` in a try)\n venizia/no-await-promise-chain \\`const x = await f().catch(() => null)\\` becomes\n \\`let x; try { x = await f(); } catch (error) { x = null; }\\`\n\nIt changes only what the fixers can change safely, and lists the rest with its file, line and rule:\nan \\`await\\` inside a ternary or logical operand, a loop test, an unbraced \\`if\\` branch, or after a call\nthat may have effects; an awaited \\`.then\\` or \\`.finally\\`, a \\`.catch\\` whose handler has a block body or\ncalls something, and an awaited chain that is not the whole initializer of a \\`const\\` or \\`let\\`; and\nevery venizia/no-silent-catch finding (a handler or catch block that swallows the error), which it never\nfixes: what to log is your decision.\n\n --write write the changed files (without it, nothing is written)\n --check dry run that exits 1 when anything would change or is left unfixed (for CI)\n --all with --write and no path: rewrite every source file under the working directory (--write needs a path or --all)\n --help print this text and exit\n\nWith no flag it lists what would change and writes nothing. Inside a git repository it reads the\nfiles git knows (tracked, or untracked and not ignored), and --write refuses a file with local changes\n(changed, staged or untracked): commit or stash it first, so git can undo the codemod.`;\n\n/** A usage error: nothing was read or written. */\nconst USAGE_ERROR_CODE = 2;\n\n/** A file that can hold an `await` or a `catch`. */\nconst ASYNC_TEXT = /\\b(await|catch)\\b/;\n\nclass AsyncStyleFlags {\n static readonly WRITE = '--write';\n static readonly CHECK = '--check';\n static readonly ALL = '--all';\n static readonly HELP = '--help';\n static readonly HELP_SHORT = '-h';\n\n static readonly SCHEME_SET = new Set<string>([\n this.WRITE,\n this.CHECK,\n this.ALL,\n this.HELP,\n this.HELP_SHORT,\n ]);\n\n static isValid(value: string): boolean {\n return this.SCHEME_SET.has(value);\n }\n}\n\nexport interface IAsyncStyleReport {\n line: number;\n column: number;\n /** The rule id, or `undefined` for a file ESLint could not parse. */\n ruleId: string | null;\n message: string;\n}\n\nexport interface IAsyncStyleResult {\n output: string;\n changed: boolean;\n /** How many findings of the original source carried a fix, once the fixers changed it. */\n fixes: number;\n /** What is still reported after every pass. */\n reports: IAsyncStyleReport[];\n}\n\n/** Runs the async-style rules, and only those, over source text with ESLint's own fixer loop. */\nexport class AsyncStyle {\n /** The `Linter` config: the TypeScript parser and the rules of `asyncStyleConfigs`, at error. */\n static async createConfig(): Promise<Linter.Config[]> {\n const { default: tseslint } = await import('typescript-eslint');\n const { asyncStyleConfigs } = await import('../../linters/house/index.js');\n\n return [\n {\n files: ['**/*.{ts,tsx,mts,cts}'],\n languageOptions: { parser: tseslint.parser },\n // Only the async-style rules run here, so a `// eslint-disable-next-line` for any other rule looks unused and\n // ESLint's fixer would delete it. A codemod never touches a directive.\n linterOptions: { reportUnusedDisableDirectives: 'off' },\n },\n ...asyncStyleConfigs,\n ];\n }\n\n /**\n * The self-check's config: four scope rules, run on the text before and after the fixers. A hoisted name must be\n * declared once, shadow nothing, be used after it is declared and be used at all; when the fixers break one of these\n * the count of that rule goes up, and the file is left as it was.\n */\n static async createChecks(): Promise<Linter.Config[]> {\n const { default: tseslint } = await import('typescript-eslint');\n\n return [\n {\n files: ['**/*.{ts,tsx,mts,cts}'],\n languageOptions: { parser: tseslint.parser },\n linterOptions: { reportUnusedDisableDirectives: 'off' },\n plugins: { '@typescript-eslint': tseslint.plugin as never },\n rules: {\n '@typescript-eslint/no-redeclare': 'error',\n '@typescript-eslint/no-shadow': 'error',\n '@typescript-eslint/no-use-before-define': [\n 'error',\n { functions: false, classes: false },\n ],\n '@typescript-eslint/no-unused-vars': ['error', { args: 'none', caughtErrors: 'none' }],\n },\n },\n ];\n }\n\n /** What got worse between `source` and `output` by the self-check's rules: empty when nothing did. */\n static selfCheck(opts: {\n linter: Linter;\n checks: Linter.Config[];\n source: string;\n output: string;\n filename: string;\n }): string[] {\n const { linter, checks, source, output, filename } = opts;\n const count = (text: string): Map<string, number> => {\n const found = new Map<string, number>();\n for (const message of linter.verify(text, checks, { filename })) {\n const key = message.ruleId ?? 'parse error';\n found.set(key, (found.get(key) ?? 0) + 1);\n }\n\n return found;\n };\n const was = count(source);\n const now = count(output);\n\n return [...now]\n .filter(([rule, total]) => total > (was.get(rule) ?? 0))\n .map(([rule, total]) => `${rule}: ${was.get(rule) ?? 0} before, ${total} after`);\n }\n\n /**\n * Fixes `source` (ESLint applies up to ten passes) and returns the text and what is left. `filename` is relative to\n * the linter's `cwd`. The fixed text is checked against the original (`checks`): if it has more redeclarations,\n * shadowed names, uses before declaration or unused variables than the original, no fix is returned and the file is\n * reported as `self-check`, so a hoisted name that does not match the expression it replaced never reaches a file.\n */\n static fix(opts: {\n linter: Linter;\n config: Linter.Config[];\n checks: Linter.Config[];\n source: string;\n filename: string;\n }): IAsyncStyleResult {\n const { linter, config, checks, source, filename } = opts;\n // A fix can leave a new finding behind (the try/catch of no-await-promise-chain is a silent catch when the\n // fallback is a constant), so the count is of the fixable findings, not of the findings that went away.\n const fixable = linter\n .verify(source, config, { filename })\n .filter((message) => message.fix !== undefined).length;\n const result = linter.verifyAndFix(source, config, { filename });\n\n if (result.output !== source) {\n const broken = AsyncStyle.selfCheck({\n linter,\n checks,\n source,\n output: result.output,\n filename,\n });\n\n if (broken.length > 0) {\n return {\n output: source,\n changed: false,\n fixes: 0,\n reports: [\n {\n line: 1,\n column: 1,\n ruleId: 'self-check',\n message: `the fixers would have made this file worse (${broken.join('; ')}); it is left as it was - fix it by hand`,\n },\n ],\n };\n }\n }\n\n return {\n output: result.output,\n changed: result.output !== source,\n fixes: result.fixed ? fixable : 0,\n reports: result.messages.map((message) => ({\n line: message.line,\n column: message.column,\n ruleId: message.ruleId,\n message: message.message,\n })),\n };\n }\n}\n\n/**\n * `devz codemod async-style [paths...] [--write | --check]`: applies the fixers of `no-inline-await`,\n * `no-return-await` and `no-await-promise-chain`, and lists what is left of those and of `no-silent-catch`.\n * It is a dry run unless `--write` is given. `--check` is the same dry run, and exits 1 when anything would\n * change or is left unfixed.\n */\nexport class AsyncStyleCommand {\n static readonly USAGE = USAGE;\n\n static async run(opts: { root: string; args: string[] }): Promise<number> {\n const { root, args } = opts;\n\n if (args.includes(AsyncStyleFlags.HELP) || args.includes(AsyncStyleFlags.HELP_SHORT)) {\n console.log(USAGE);\n return 0;\n }\n\n const flags = args.filter((argument) => argument.startsWith('-'));\n const paths = args.filter((argument) => !argument.startsWith('-'));\n\n const unknown = flags.filter((flag) => !AsyncStyleFlags.isValid(flag));\n if (unknown.length > 0) {\n console.error(\n `devz codemod: unknown option ${unknown.map((flag) => `\"${flag}\"`).join(', ')}\\n${USAGE}`,\n );\n return USAGE_ERROR_CODE;\n }\n\n const isWrite = flags.includes(AsyncStyleFlags.WRITE);\n const isCheck = flags.includes(AsyncStyleFlags.CHECK);\n\n if (isWrite && isCheck) {\n console.error(\n `devz codemod: ${AsyncStyleFlags.WRITE} and ${AsyncStyleFlags.CHECK} contradict each other\\n${USAGE}`,\n );\n return USAGE_ERROR_CODE;\n }\n\n const refusal = CodemodFiles.refusal({\n command: 'async-style',\n isWrite,\n isAll: flags.includes(AsyncStyleFlags.ALL),\n paths,\n });\n if (refusal) {\n console.error(`${refusal}\\n${USAGE}`);\n return USAGE_ERROR_CODE;\n }\n\n let linter: Linter;\n try {\n const { Linter: EslintLinter } = await import('eslint');\n linter = new EslintLinter({ cwd: root });\n } catch {\n console.error('devz codemod: the \"eslint\" package is required to run the lint fixers');\n return 1;\n }\n\n const config = await AsyncStyle.createConfig();\n const checks = await AsyncStyle.createChecks();\n const targets = (paths.length > 0 ? paths : ['.']).map((path) => resolve(root, path));\n let changedCount = 0;\n let fixCount = 0;\n let reportCount = 0;\n let refusedCount = 0;\n\n for (const target of targets) {\n const files = CodemodFiles.collect({ target });\n const dirty = isWrite ? CodemodFiles.dirty({ target }) : undefined;\n\n if (files.length === 0 && paths.length > 0) {\n console.warn(\n `devz codemod: no source files under \"${relative(root, target) || target}\" (git ignores the path, or it holds none): nothing was read`,\n );\n }\n\n for (const file of files) {\n const source = readFileSync(file, 'utf8');\n\n if (!ASYNC_TEXT.test(source)) {\n continue;\n }\n\n const shown = relative(root, file).split('\\\\').join('/');\n const result = AsyncStyle.fix({ linter, config, checks, source, filename: shown });\n\n for (const report of result.reports) {\n reportCount += 1;\n console.warn(\n `${shown}:${report.line}:${report.column} ${report.ruleId ?? 'parse error'} ${report.message}`,\n );\n }\n\n if (!result.changed) {\n continue;\n }\n\n if (dirty?.has(file)) {\n refusedCount += 1;\n console.warn(\n `refused ${shown} has local changes (commit or stash them, then run again)`,\n );\n continue;\n }\n\n changedCount += 1;\n fixCount += result.fixes;\n console.log(`${isWrite ? 'changed' : 'would change'} ${shown} (${result.fixes} fix(es))`);\n\n if (isWrite) {\n writeFileSync(file, result.output);\n }\n }\n }\n\n console.log(\n `devz codemod async-style: ${changedCount} file(s) ${isWrite ? 'changed' : 'would change'}, ${fixCount} fix(es) ${isWrite ? 'applied' : 'would be applied'}, ${reportCount} left unfixed` +\n (refusedCount > 0 ? `, ${refusedCount} refused` : ''),\n );\n\n if (!isWrite && changedCount > 0) {\n console.log(`Nothing was written. Run again with ${AsyncStyleFlags.WRITE} to apply.`);\n }\n\n if (isWrite && refusedCount > 0) {\n return 1;\n }\n\n return isCheck && (changedCount > 0 || reportCount > 0) ? 1 : 0;\n }\n}\n"]}
1
+ {"version":3,"file":"async-style.js","sourceRoot":"","sources":["../../../src/cli/codemod/async-style.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFileSync, writeFileSync } from 'node:fs';\nimport { relative, resolve } from 'node:path';\nimport type { Linter } from 'eslint';\nimport { CodemodFiles } from './files';\n\nconst USAGE = `Usage: devz codemod async-style [paths...] [--write | --check]\n\nApplies the fixers of three house lint rules, so a repository can sweep them without a lint pass:\n\n venizia/no-inline-await \\`expect(await f())\\` becomes \\`const result = await f(); expect(result)\\`\n venizia/no-return-await \\`return await f()\\` becomes \\`return f()\\` (\\`const result = await f(); return result;\\` in a try)\n venizia/no-await-promise-chain \\`const x = await f().catch(() => null)\\` becomes\n \\`let x; try { x = await f(); } catch (error) { x = null; }\\`\n\nIt changes only what the fixers can change safely, and lists the rest with its file, line and rule:\nan \\`await\\` inside a ternary or logical operand, a loop test, an unbraced \\`if\\` branch, or after a call\nthat may have effects; an awaited \\`.then\\` or \\`.finally\\`, a \\`.catch\\` whose handler has a block body or\ncalls something, and an awaited chain that is not the whole initializer of a \\`const\\` or \\`let\\`; and\nevery venizia/no-silent-catch finding (a handler or catch block that swallows the error), which it never\nfixes: what to log is your decision.\n\n --write write the changed files (without it, nothing is written)\n --check dry run that exits 1 when anything would change or is left unfixed (for CI)\n --all with --write and no path: rewrite every source file under the working directory (--write needs a path or --all)\n --help print this text and exit\n\nWith no flag it lists what would change and writes nothing. Inside a git repository it reads the\nfiles git knows (tracked, or untracked and not ignored), and --write refuses a file with local changes\n(changed, staged or untracked): commit or stash it first, so git can undo the codemod.`;\n\n/** A usage error: nothing was read or written. */\nconst USAGE_ERROR_CODE = 2;\n\n/** A file that can hold an `await` or a `catch`. */\nconst ASYNC_TEXT = /\\b(await|catch)\\b/;\n\nclass AsyncStyleFlags {\n static readonly WRITE = '--write';\n static readonly CHECK = '--check';\n static readonly ALL = '--all';\n static readonly HELP = '--help';\n static readonly HELP_SHORT = '-h';\n\n static readonly SCHEME_SET = new Set<string>([\n this.WRITE,\n this.CHECK,\n this.ALL,\n this.HELP,\n this.HELP_SHORT,\n ]);\n\n static isValid(value: string): boolean {\n return this.SCHEME_SET.has(value);\n }\n}\n\nexport interface IAsyncStyleReport {\n line: number;\n column: number;\n /** The rule id, or `undefined` for a file ESLint could not parse. */\n ruleId: string | null;\n message: string;\n}\n\nexport interface IAsyncStyleResult {\n output: string;\n changed: boolean;\n /** How many findings of the original source carried a fix, once the fixers changed it. */\n fixes: number;\n /** What is still reported after every pass. */\n reports: IAsyncStyleReport[];\n}\n\n/** Runs the async-style rules, and only those, over source text with ESLint's own fixer loop. */\nexport class AsyncStyle {\n /** The `Linter` config: the TypeScript parser and the rules of `asyncRuleConfigs`, at error. */\n static async createConfig(): Promise<Linter.Config[]> {\n const { default: tseslint } = await import('typescript-eslint');\n const { asyncRuleConfigs } = await import('../../linters/house/async-rules.js');\n\n return [\n {\n files: ['**/*.{ts,tsx,mts,cts}'],\n languageOptions: { parser: tseslint.parser },\n // Only the async-style rules run here, so a `// eslint-disable-next-line` for any other rule looks unused and\n // ESLint's fixer would delete it. A codemod never touches a directive.\n linterOptions: { reportUnusedDisableDirectives: 'off' },\n },\n ...asyncRuleConfigs,\n ];\n }\n\n /**\n * The self-check's config: four scope rules, run on the text before and after the fixers. A hoisted name must be\n * declared once, shadow nothing, be used after it is declared and be used at all; when the fixers break one of these\n * the count of that rule goes up, and the file is left as it was.\n */\n static async createChecks(): Promise<Linter.Config[]> {\n const { default: tseslint } = await import('typescript-eslint');\n\n return [\n {\n files: ['**/*.{ts,tsx,mts,cts}'],\n languageOptions: { parser: tseslint.parser },\n linterOptions: { reportUnusedDisableDirectives: 'off' },\n plugins: { '@typescript-eslint': tseslint.plugin as never },\n rules: {\n '@typescript-eslint/no-redeclare': 'error',\n '@typescript-eslint/no-shadow': 'error',\n '@typescript-eslint/no-use-before-define': [\n 'error',\n { functions: false, classes: false },\n ],\n '@typescript-eslint/no-unused-vars': ['error', { args: 'none', caughtErrors: 'none' }],\n },\n },\n ];\n }\n\n /** What got worse between `source` and `output` by the self-check's rules: empty when nothing did. */\n static selfCheck(opts: {\n linter: Linter;\n checks: Linter.Config[];\n source: string;\n output: string;\n filename: string;\n }): string[] {\n const { linter, checks, source, output, filename } = opts;\n\n const count = (text: string): Map<string, number> => {\n const found = new Map<string, number>();\n\n for (const message of linter.verify(text, checks, { filename })) {\n const key = message.ruleId ?? 'parse error';\n found.set(key, (found.get(key) ?? 0) + 1);\n }\n\n return found;\n };\n\n const was = count(source);\n const now = count(output);\n\n return [...now]\n .filter(([rule, total]) => total > (was.get(rule) ?? 0))\n .map(([rule, total]) => `${rule}: ${was.get(rule) ?? 0} before, ${total} after`);\n }\n\n /**\n * Fixes `source` (ESLint applies up to ten passes) and returns the text and what is left. `filename` is relative to\n * the linter's `cwd`. The fixed text is checked against the original (`checks`): if it has more redeclarations,\n * shadowed names, uses before declaration or unused variables than the original, no fix is returned and the file is\n * reported as `self-check`, so a hoisted name that does not match the expression it replaced never reaches a file.\n */\n static fix(opts: {\n linter: Linter;\n config: Linter.Config[];\n checks: Linter.Config[];\n source: string;\n filename: string;\n }): IAsyncStyleResult {\n const { linter, config, checks, source, filename } = opts;\n // A fix can leave a new finding behind (the try/catch of no-await-promise-chain is a silent catch when the\n // fallback is a constant), so the count is of the fixable findings, not of the findings that went away.\n const fixable = linter\n .verify(source, config, { filename })\n .filter((message) => message.fix !== undefined).length;\n const result = linter.verifyAndFix(source, config, { filename });\n\n if (result.output !== source) {\n const broken = AsyncStyle.selfCheck({\n linter,\n checks,\n source,\n output: result.output,\n filename,\n });\n\n if (broken.length > 0) {\n return {\n output: source,\n changed: false,\n fixes: 0,\n reports: [\n {\n line: 1,\n column: 1,\n ruleId: 'self-check',\n message: `the fixers would have made this file worse (${broken.join('; ')}); it is left as it was - fix it by hand`,\n },\n ],\n };\n }\n }\n\n return {\n output: result.output,\n changed: result.output !== source,\n fixes: result.fixed ? fixable : 0,\n reports: result.messages.map((message) => ({\n line: message.line,\n column: message.column,\n ruleId: message.ruleId,\n message: message.message,\n })),\n };\n }\n}\n\n/**\n * `devz codemod async-style [paths...] [--write | --check]`: applies the fixers of `no-inline-await`,\n * `no-return-await` and `no-await-promise-chain`, and lists what is left of those and of `no-silent-catch`.\n * It is a dry run unless `--write` is given. `--check` is the same dry run, and exits 1 when anything would\n * change or is left unfixed.\n */\nexport class AsyncStyleCommand {\n static readonly USAGE = USAGE;\n\n static async run(opts: { root: string; args: string[] }): Promise<number> {\n const { root, args } = opts;\n\n if (args.includes(AsyncStyleFlags.HELP) || args.includes(AsyncStyleFlags.HELP_SHORT)) {\n console.log(USAGE);\n\n return 0;\n }\n\n const flags = args.filter((argument) => argument.startsWith('-'));\n const paths = args.filter((argument) => !argument.startsWith('-'));\n\n const unknown = flags.filter((flag) => !AsyncStyleFlags.isValid(flag));\n\n if (unknown.length > 0) {\n console.error(\n `devz codemod: unknown option ${unknown.map((flag) => `\"${flag}\"`).join(', ')}\\n${USAGE}`,\n );\n\n return USAGE_ERROR_CODE;\n }\n\n const isWrite = flags.includes(AsyncStyleFlags.WRITE);\n const isCheck = flags.includes(AsyncStyleFlags.CHECK);\n\n if (isWrite && isCheck) {\n console.error(\n `devz codemod: ${AsyncStyleFlags.WRITE} and ${AsyncStyleFlags.CHECK} contradict each other\\n${USAGE}`,\n );\n\n return USAGE_ERROR_CODE;\n }\n\n const refusal = CodemodFiles.refusal({\n command: 'async-style',\n isWrite,\n isAll: flags.includes(AsyncStyleFlags.ALL),\n paths,\n });\n\n if (refusal) {\n console.error(`${refusal}\\n${USAGE}`);\n\n return USAGE_ERROR_CODE;\n }\n\n let linter: Linter;\n\n try {\n const { Linter: EslintLinter } = await import('eslint');\n linter = new EslintLinter({ cwd: root });\n } catch {\n console.error('devz codemod: the \"eslint\" package is required to run the lint fixers');\n\n return 1;\n }\n\n const config = await AsyncStyle.createConfig();\n const checks = await AsyncStyle.createChecks();\n const targets = (paths.length > 0 ? paths : ['.']).map((path) => resolve(root, path));\n let changedCount = 0;\n let fixCount = 0;\n let reportCount = 0;\n let refusedCount = 0;\n\n for (const target of targets) {\n const files = CodemodFiles.collect({ target });\n const dirty = isWrite ? CodemodFiles.dirty({ target }) : undefined;\n\n if (files.length === 0 && paths.length > 0) {\n console.warn(\n `devz codemod: no source files under \"${relative(root, target) || target}\" (git ignores the path, or it holds none): nothing was read`,\n );\n }\n\n for (const file of files) {\n const source = readFileSync(file, 'utf8');\n\n if (!ASYNC_TEXT.test(source)) {\n continue;\n }\n\n const shown = relative(root, file).split('\\\\').join('/');\n const result = AsyncStyle.fix({ linter, config, checks, source, filename: shown });\n\n for (const report of result.reports) {\n reportCount += 1;\n console.warn(\n `${shown}:${report.line}:${report.column} ${report.ruleId ?? 'parse error'} ${report.message}`,\n );\n }\n\n if (!result.changed) {\n continue;\n }\n\n if (dirty?.has(file)) {\n refusedCount += 1;\n console.warn(\n `refused ${shown} has local changes (commit or stash them, then run again)`,\n );\n continue;\n }\n\n changedCount += 1;\n fixCount += result.fixes;\n console.log(`${isWrite ? 'changed' : 'would change'} ${shown} (${result.fixes} fix(es))`);\n\n if (isWrite) {\n writeFileSync(file, result.output);\n }\n }\n }\n\n console.log(\n `devz codemod async-style: ${changedCount} file(s) ${isWrite ? 'changed' : 'would change'}, ${fixCount} fix(es) ${isWrite ? 'applied' : 'would be applied'}, ${reportCount} left unfixed` +\n (refusedCount > 0 ? `, ${refusedCount} refused` : ''),\n );\n\n if (!isWrite && changedCount > 0) {\n console.log(`Nothing was written. Run again with ${AsyncStyleFlags.WRITE} to apply.`);\n }\n\n if (isWrite && refusedCount > 0) {\n return 1;\n }\n\n return isCheck && (changedCount > 0 || reportCount > 0) ? 1 : 0;\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"connector-imports.js","sourceRoot":"","sources":["../../../src/cli/codemod/connector-imports.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname, join, relative, resolve } from 'node:path';\nimport { CodemodFiles } from './files';\n\nconst USAGE = `Usage: devz codemod connector-imports [paths...] [--write | --check]\n\nMoves the connector sub-path imports of @venizia/ignis to @venizia/ignis-connectors. The sub-paths\n@venizia/ignis/postgres, /postgres/node-postgres, /postgres/postgres-js, /postgres/pglite,\n/postgres/supabase, /relational, /sqlite, /sqlite/libsql, /search, /search/controllers, /meilisearch,\n/typesense and /typesense/controllers are removed; each one is the same name under\n@venizia/ignis-connectors, so the rewrite changes only the specifier.\n\nIt reads TypeScript files (.ts, .tsx, .mts, .cts): import and export declarations, import(\"...\"),\nrequire(\"...\"), require.resolve(\"...\") and import.meta.resolve(\"...\"), import(\"...\") types, declare module\n\"...\" and the module name of mock.module(\"...\") style calls. A .js, .cjs or .mjs file is not read: edit it by hand. Other sub-paths of @venizia/ignis (mail, static-asset,\ntesting, websocket, ...) and the root are not touched. The app must list @venizia/ignis-connectors as a\ndirect dependency: it reports each package.json that does not.\n\n --write write the changed files (without it, nothing is written)\n --check dry run that exits 1 while a file would change (for CI)\n --help print this text and exit\n\nWith no flag it lists what would change and writes nothing. Inside a git repository it reads the\nfiles git knows (tracked, or untracked and not ignored), and --write refuses a file with local changes\n(changed, staged or untracked): commit or stash it first, so git can undo the codemod.`;\n\n/** A usage error: nothing was read or written. */\nconst USAGE_ERROR_CODE = 2;\n\nconst CONNECTORS_PACKAGE = '@venizia/ignis-connectors';\nconst OLD_PREFIX = '@venizia/ignis/';\n\n/** The call names that take a module name as their first argument besides `require` and `import()`. */\nconst MODULE_NAME_CALLS = new Set([\n 'module',\n 'mock',\n 'doMock',\n 'unmock',\n 'importActual',\n 'requireActual',\n 'importMock',\n 'requireMock',\n]);\n\nclass ConnectorImportsFlags {\n static readonly WRITE = '--write';\n static readonly CHECK = '--check';\n static readonly HELP = '--help';\n static readonly HELP_SHORT = '-h';\n\n static readonly SCHEME_SET = new Set<string>([\n this.WRITE,\n this.CHECK,\n this.HELP,\n this.HELP_SHORT,\n ]);\n\n static isValid(value: string): boolean {\n return this.SCHEME_SET.has(value);\n }\n}\n\n/** The removed `@venizia/ignis/<sub-path>` specifiers and the `@venizia/ignis-connectors/<sub-path>` they became. */\nexport class ConnectorSpecifiers {\n static readonly SUBPATHS: ReadonlyArray<string> = [\n 'postgres',\n 'postgres/node-postgres',\n 'postgres/postgres-js',\n 'postgres/pglite',\n 'postgres/supabase',\n 'relational',\n 'sqlite',\n 'sqlite/libsql',\n 'search',\n 'search/controllers',\n 'meilisearch',\n 'typesense',\n 'typesense/controllers',\n ];\n\n static readonly MOVES: ReadonlyMap<string, string> = new Map(\n ConnectorSpecifiers.SUBPATHS.map((subpath) => [\n `${OLD_PREFIX}${subpath}`,\n `${CONNECTORS_PACKAGE}/${subpath}`,\n ]),\n );\n}\n\nexport interface IConnectorImportsResult {\n output: string;\n changed: boolean;\n /** How many specifiers were moved. */\n rewritten: number;\n}\n\n/** Rewrites the module specifiers of the removed connector sub-paths. */\nexport class ConnectorImports {\n static rewrite(opts: {\n typescript: typeof import('typescript');\n fileName: string;\n source: string;\n }): IConnectorImportsResult {\n const { typescript: ts, fileName, source } = opts;\n const scriptKind = fileName.endsWith('.tsx') ? ts.ScriptKind.TSX : ts.ScriptKind.TS;\n const file = ts.createSourceFile(fileName, source, ts.ScriptTarget.Latest, true, scriptKind);\n const edits: Array<{ start: number; end: number; text: string }> = [];\n\n const consider = (literal: import('typescript').Node | undefined) => {\n if (!literal || !ts.isStringLiteralLike(literal)) {\n return;\n }\n\n const moved = ConnectorSpecifiers.MOVES.get(literal.text);\n if (moved === undefined) {\n return;\n }\n\n const start = literal.getStart(file);\n const quote = source[start];\n edits.push({ start, end: literal.getEnd(), text: `${quote}${moved}${quote}` });\n };\n\n const isModuleNameCall = (call: import('typescript').CallExpression): boolean => {\n const callee = call.expression;\n\n if (callee.kind === ts.SyntaxKind.ImportKeyword) {\n return true;\n }\n\n if (ts.isIdentifier(callee)) {\n return callee.text === 'require';\n }\n\n if (!ts.isPropertyAccessExpression(callee)) {\n return false;\n }\n\n if (callee.name.text === 'resolve') {\n return (\n (ts.isIdentifier(callee.expression) && callee.expression.text === 'require') ||\n ts.isMetaProperty(callee.expression)\n );\n }\n\n return MODULE_NAME_CALLS.has(callee.name.text);\n };\n\n const visit = (node: import('typescript').Node): void => {\n if (ts.isImportDeclaration(node) || ts.isExportDeclaration(node)) {\n consider(node.moduleSpecifier);\n } else if (ts.isImportEqualsDeclaration(node)) {\n if (ts.isExternalModuleReference(node.moduleReference)) {\n consider(node.moduleReference.expression);\n }\n } else if (ts.isCallExpression(node)) {\n if (isModuleNameCall(node)) {\n consider(node.arguments[0]);\n }\n } else if (ts.isModuleDeclaration(node)) {\n consider(node.name);\n } else if (ts.isImportTypeNode(node)) {\n if (ts.isLiteralTypeNode(node.argument)) {\n consider(node.argument.literal);\n }\n }\n\n ts.forEachChild(node, visit);\n };\n\n visit(file);\n\n if (edits.length === 0) {\n return { output: source, changed: false, rewritten: 0 };\n }\n\n let output = source;\n for (const edit of edits.sort((a, b) => b.start - a.start)) {\n output = output.slice(0, edit.start) + edit.text + output.slice(edit.end);\n }\n\n return { output, changed: true, rewritten: edits.length };\n }\n\n /**\n * The `package.json` nearest to `file` (not above `root`), and whether it lists the connectors package; `undefined` when\n * there is none to read.\n */\n static findManifest(opts: {\n file: string;\n root: string;\n }): { path: string; hasConnectors: boolean } | undefined {\n const { file, root } = opts;\n let directory = dirname(file);\n\n for (;;) {\n const candidate = join(directory, 'package.json');\n\n if (existsSync(candidate)) {\n let manifest: unknown;\n try {\n manifest = JSON.parse(readFileSync(candidate, 'utf8'));\n } catch (error) {\n console.warn(\n `${candidate} is not valid JSON, so its dependencies were not checked | ${error instanceof Error ? error.message : String(error)}`,\n );\n return undefined;\n }\n\n const listed =\n typeof manifest === 'object' &&\n manifest !== null &&\n ['dependencies', 'devDependencies', 'peerDependencies'].some((field) => {\n const group: unknown = Reflect.get(manifest, field);\n return typeof group === 'object' && group !== null && CONNECTORS_PACKAGE in group;\n });\n\n return { path: candidate, hasConnectors: listed };\n }\n\n if (directory === root || dirname(directory) === directory) {\n return undefined;\n }\n\n directory = dirname(directory);\n }\n }\n}\n\n/**\n * `devz codemod connector-imports [paths...] [--write | --check]`: moves the removed\n * `@venizia/ignis/<connector sub-path>` specifiers to `@venizia/ignis-connectors`. It is a dry run unless `--write`\n * is given. `--check` is the same dry run, and exits 1 while a file would change.\n */\nexport class ConnectorImportsCommand {\n static readonly USAGE = USAGE;\n\n static async run(opts: { root: string; args: string[] }): Promise<number> {\n const { root, args } = opts;\n\n if (\n args.includes(ConnectorImportsFlags.HELP) ||\n args.includes(ConnectorImportsFlags.HELP_SHORT)\n ) {\n console.log(USAGE);\n return 0;\n }\n\n const flags = args.filter((argument) => argument.startsWith('-'));\n const paths = args.filter((argument) => !argument.startsWith('-'));\n\n const unknown = flags.filter((flag) => !ConnectorImportsFlags.isValid(flag));\n if (unknown.length > 0) {\n console.error(\n `devz codemod: unknown option ${unknown.map((flag) => `\"${flag}\"`).join(', ')}\\n${USAGE}`,\n );\n return USAGE_ERROR_CODE;\n }\n\n const isWrite = flags.includes(ConnectorImportsFlags.WRITE);\n const isCheck = flags.includes(ConnectorImportsFlags.CHECK);\n\n if (isWrite && isCheck) {\n console.error(\n `devz codemod: ${ConnectorImportsFlags.WRITE} and ${ConnectorImportsFlags.CHECK} contradict each other\\n${USAGE}`,\n );\n return USAGE_ERROR_CODE;\n }\n\n let typescript: typeof import('typescript');\n try {\n const loaded = await import('typescript');\n typescript = loaded.default;\n } catch {\n console.error('devz codemod: the \"typescript\" package is required to read your sources');\n return 1;\n }\n\n const targets = (paths.length > 0 ? paths : ['.']).map((path) => resolve(root, path));\n const missing = new Set<string>();\n let changedCount = 0;\n let specifierCount = 0;\n let refusedCount = 0;\n\n for (const target of targets) {\n const files = CodemodFiles.collect({ target });\n const dirty = isWrite ? CodemodFiles.dirty({ target }) : undefined;\n\n if (files.length === 0 && paths.length > 0) {\n console.warn(\n `devz codemod: no source files under \"${relative(root, target) || target}\" (git ignores the path, or it holds none): nothing was read`,\n );\n }\n\n for (const file of files) {\n const source = readFileSync(file, 'utf8');\n\n if (!source.includes(OLD_PREFIX)) {\n continue;\n }\n\n const result = ConnectorImports.rewrite({ typescript, fileName: file, source });\n\n if (!result.changed) {\n continue;\n }\n\n const shown = relative(root, file).split('\\\\').join('/') || file;\n\n if (dirty?.has(file)) {\n refusedCount += 1;\n console.warn(\n `refused ${shown} has local changes (commit or stash them, then run again)`,\n );\n continue;\n }\n\n changedCount += 1;\n specifierCount += result.rewritten;\n console.log(\n `${isWrite ? 'changed' : 'would change'} ${shown} (${result.rewritten} specifier(s))`,\n );\n\n const manifest = ConnectorImports.findManifest({ file, root });\n if (manifest && !manifest.hasConnectors) {\n missing.add(relative(root, manifest.path).split('\\\\').join('/') || manifest.path);\n }\n\n if (isWrite) {\n writeFileSync(file, result.output);\n }\n }\n }\n\n console.log(\n `devz codemod connector-imports: ${changedCount} file(s) ${isWrite ? 'changed' : 'would change'}, ${specifierCount} specifier(s) ${isWrite ? 'moved' : 'would be moved'}` +\n (refusedCount > 0 ? `, ${refusedCount} refused` : ''),\n );\n\n for (const manifestPath of [...missing].sort()) {\n console.warn(\n `${manifestPath} does not list ${CONNECTORS_PACKAGE}: add it as a dependency, because the imports now come from it`,\n );\n }\n\n if (!isWrite && changedCount > 0) {\n console.log(\n `Nothing was written. Run again with ${ConnectorImportsFlags.WRITE} to apply, then add the dependency and run your typecheck.`,\n );\n }\n\n if (isWrite && refusedCount > 0) {\n return 1;\n }\n\n return isCheck && changedCount > 0 ? 1 : 0;\n }\n}\n"]}
1
+ {"version":3,"file":"connector-imports.js","sourceRoot":"","sources":["../../../src/cli/codemod/connector-imports.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname, join, relative, resolve } from 'node:path';\nimport { CodemodFiles } from './files';\n\nconst USAGE = `Usage: devz codemod connector-imports [paths...] [--write | --check]\n\nMoves the connector sub-path imports of @venizia/ignis to @venizia/ignis-connectors. The sub-paths\n@venizia/ignis/postgres, /postgres/node-postgres, /postgres/postgres-js, /postgres/pglite,\n/postgres/supabase, /relational, /sqlite, /sqlite/libsql, /search, /search/controllers, /meilisearch,\n/typesense and /typesense/controllers are removed; each one is the same name under\n@venizia/ignis-connectors, so the rewrite changes only the specifier.\n\nIt reads TypeScript files (.ts, .tsx, .mts, .cts): import and export declarations, import(\"...\"),\nrequire(\"...\"), require.resolve(\"...\") and import.meta.resolve(\"...\"), import(\"...\") types, declare module\n\"...\" and the module name of mock.module(\"...\") style calls. A .js, .cjs or .mjs file is not read: edit it by hand. Other sub-paths of @venizia/ignis (mail, static-asset,\ntesting, websocket, ...) and the root are not touched. The app must list @venizia/ignis-connectors as a\ndirect dependency: it reports each package.json that does not.\n\n --write write the changed files (without it, nothing is written)\n --check dry run that exits 1 while a file would change (for CI)\n --help print this text and exit\n\nWith no flag it lists what would change and writes nothing. Inside a git repository it reads the\nfiles git knows (tracked, or untracked and not ignored), and --write refuses a file with local changes\n(changed, staged or untracked): commit or stash it first, so git can undo the codemod.`;\n\n/** A usage error: nothing was read or written. */\nconst USAGE_ERROR_CODE = 2;\n\nconst CONNECTORS_PACKAGE = '@venizia/ignis-connectors';\nconst OLD_PREFIX = '@venizia/ignis/';\n\n/** The call names that take a module name as their first argument besides `require` and `import()`. */\nconst MODULE_NAME_CALLS = new Set([\n 'module',\n 'mock',\n 'doMock',\n 'unmock',\n 'importActual',\n 'requireActual',\n 'importMock',\n 'requireMock',\n]);\n\nclass ConnectorImportsFlags {\n static readonly WRITE = '--write';\n static readonly CHECK = '--check';\n static readonly HELP = '--help';\n static readonly HELP_SHORT = '-h';\n\n static readonly SCHEME_SET = new Set<string>([\n this.WRITE,\n this.CHECK,\n this.HELP,\n this.HELP_SHORT,\n ]);\n\n static isValid(value: string): boolean {\n return this.SCHEME_SET.has(value);\n }\n}\n\n/** The removed `@venizia/ignis/<sub-path>` specifiers and the `@venizia/ignis-connectors/<sub-path>` they became. */\nexport class ConnectorSpecifiers {\n static readonly SUBPATHS: ReadonlyArray<string> = [\n 'postgres',\n 'postgres/node-postgres',\n 'postgres/postgres-js',\n 'postgres/pglite',\n 'postgres/supabase',\n 'relational',\n 'sqlite',\n 'sqlite/libsql',\n 'search',\n 'search/controllers',\n 'meilisearch',\n 'typesense',\n 'typesense/controllers',\n ];\n\n static readonly MOVES: ReadonlyMap<string, string> = new Map(\n ConnectorSpecifiers.SUBPATHS.map((subpath) => [\n `${OLD_PREFIX}${subpath}`,\n `${CONNECTORS_PACKAGE}/${subpath}`,\n ]),\n );\n}\n\nexport interface IConnectorImportsResult {\n output: string;\n changed: boolean;\n /** How many specifiers were moved. */\n rewritten: number;\n}\n\n/** Rewrites the module specifiers of the removed connector sub-paths. */\nexport class ConnectorImports {\n static rewrite(opts: {\n typescript: typeof import('typescript');\n fileName: string;\n source: string;\n }): IConnectorImportsResult {\n const { typescript: ts, fileName, source } = opts;\n const scriptKind = fileName.endsWith('.tsx') ? ts.ScriptKind.TSX : ts.ScriptKind.TS;\n const file = ts.createSourceFile(fileName, source, ts.ScriptTarget.Latest, true, scriptKind);\n const edits: Array<{ start: number; end: number; text: string }> = [];\n\n const consider = (literal: import('typescript').Node | undefined) => {\n if (!literal || !ts.isStringLiteralLike(literal)) {\n return;\n }\n\n const moved = ConnectorSpecifiers.MOVES.get(literal.text);\n\n if (moved === undefined) {\n return;\n }\n\n const start = literal.getStart(file);\n const quote = source[start];\n edits.push({ start, end: literal.getEnd(), text: `${quote}${moved}${quote}` });\n };\n\n const isModuleNameCall = (call: import('typescript').CallExpression): boolean => {\n const callee = call.expression;\n\n if (callee.kind === ts.SyntaxKind.ImportKeyword) {\n return true;\n }\n\n if (ts.isIdentifier(callee)) {\n return callee.text === 'require';\n }\n\n if (!ts.isPropertyAccessExpression(callee)) {\n return false;\n }\n\n if (callee.name.text === 'resolve') {\n return (\n (ts.isIdentifier(callee.expression) && callee.expression.text === 'require') ||\n ts.isMetaProperty(callee.expression)\n );\n }\n\n return MODULE_NAME_CALLS.has(callee.name.text);\n };\n\n const visit = (node: import('typescript').Node): void => {\n if (ts.isImportDeclaration(node) || ts.isExportDeclaration(node)) {\n consider(node.moduleSpecifier);\n } else if (ts.isImportEqualsDeclaration(node)) {\n if (ts.isExternalModuleReference(node.moduleReference)) {\n consider(node.moduleReference.expression);\n }\n } else if (ts.isCallExpression(node)) {\n if (isModuleNameCall(node)) {\n consider(node.arguments[0]);\n }\n } else if (ts.isModuleDeclaration(node)) {\n consider(node.name);\n } else if (ts.isImportTypeNode(node)) {\n if (ts.isLiteralTypeNode(node.argument)) {\n consider(node.argument.literal);\n }\n }\n\n ts.forEachChild(node, visit);\n };\n\n visit(file);\n\n if (edits.length === 0) {\n return { output: source, changed: false, rewritten: 0 };\n }\n\n let output = source;\n\n for (const edit of edits.sort((a, b) => b.start - a.start)) {\n output = output.slice(0, edit.start) + edit.text + output.slice(edit.end);\n }\n\n return { output, changed: true, rewritten: edits.length };\n }\n\n /**\n * The `package.json` nearest to `file` (not above `root`), and whether it lists the connectors package; `undefined` when\n * there is none to read.\n */\n static findManifest(opts: {\n file: string;\n root: string;\n }): { path: string; hasConnectors: boolean } | undefined {\n const { file, root } = opts;\n let directory = dirname(file);\n\n for (;;) {\n const candidate = join(directory, 'package.json');\n\n if (existsSync(candidate)) {\n let manifest: unknown;\n\n try {\n manifest = JSON.parse(readFileSync(candidate, 'utf8'));\n } catch (error) {\n console.warn(\n `${candidate} is not valid JSON, so its dependencies were not checked | ${error instanceof Error ? error.message : String(error)}`,\n );\n\n return undefined;\n }\n\n const listed =\n typeof manifest === 'object' &&\n manifest !== null &&\n ['dependencies', 'devDependencies', 'peerDependencies'].some((field) => {\n const group: unknown = Reflect.get(manifest, field);\n\n return typeof group === 'object' && group !== null && CONNECTORS_PACKAGE in group;\n });\n\n return { path: candidate, hasConnectors: listed };\n }\n\n if (directory === root || dirname(directory) === directory) {\n return undefined;\n }\n\n directory = dirname(directory);\n }\n }\n}\n\n/**\n * `devz codemod connector-imports [paths...] [--write | --check]`: moves the removed\n * `@venizia/ignis/<connector sub-path>` specifiers to `@venizia/ignis-connectors`. It is a dry run unless `--write`\n * is given. `--check` is the same dry run, and exits 1 while a file would change.\n */\nexport class ConnectorImportsCommand {\n static readonly USAGE = USAGE;\n\n static async run(opts: { root: string; args: string[] }): Promise<number> {\n const { root, args } = opts;\n\n if (\n args.includes(ConnectorImportsFlags.HELP) ||\n args.includes(ConnectorImportsFlags.HELP_SHORT)\n ) {\n console.log(USAGE);\n\n return 0;\n }\n\n const flags = args.filter((argument) => argument.startsWith('-'));\n const paths = args.filter((argument) => !argument.startsWith('-'));\n\n const unknown = flags.filter((flag) => !ConnectorImportsFlags.isValid(flag));\n\n if (unknown.length > 0) {\n console.error(\n `devz codemod: unknown option ${unknown.map((flag) => `\"${flag}\"`).join(', ')}\\n${USAGE}`,\n );\n\n return USAGE_ERROR_CODE;\n }\n\n const isWrite = flags.includes(ConnectorImportsFlags.WRITE);\n const isCheck = flags.includes(ConnectorImportsFlags.CHECK);\n\n if (isWrite && isCheck) {\n console.error(\n `devz codemod: ${ConnectorImportsFlags.WRITE} and ${ConnectorImportsFlags.CHECK} contradict each other\\n${USAGE}`,\n );\n\n return USAGE_ERROR_CODE;\n }\n\n let typescript: typeof import('typescript');\n\n try {\n const loaded = await import('typescript');\n typescript = loaded.default;\n } catch {\n console.error('devz codemod: the \"typescript\" package is required to read your sources');\n\n return 1;\n }\n\n const targets = (paths.length > 0 ? paths : ['.']).map((path) => resolve(root, path));\n const missing = new Set<string>();\n let changedCount = 0;\n let specifierCount = 0;\n let refusedCount = 0;\n\n for (const target of targets) {\n const files = CodemodFiles.collect({ target });\n const dirty = isWrite ? CodemodFiles.dirty({ target }) : undefined;\n\n if (files.length === 0 && paths.length > 0) {\n console.warn(\n `devz codemod: no source files under \"${relative(root, target) || target}\" (git ignores the path, or it holds none): nothing was read`,\n );\n }\n\n for (const file of files) {\n const source = readFileSync(file, 'utf8');\n\n if (!source.includes(OLD_PREFIX)) {\n continue;\n }\n\n const result = ConnectorImports.rewrite({ typescript, fileName: file, source });\n\n if (!result.changed) {\n continue;\n }\n\n const shown = relative(root, file).split('\\\\').join('/') || file;\n\n if (dirty?.has(file)) {\n refusedCount += 1;\n console.warn(\n `refused ${shown} has local changes (commit or stash them, then run again)`,\n );\n continue;\n }\n\n changedCount += 1;\n specifierCount += result.rewritten;\n console.log(\n `${isWrite ? 'changed' : 'would change'} ${shown} (${result.rewritten} specifier(s))`,\n );\n\n const manifest = ConnectorImports.findManifest({ file, root });\n\n if (manifest && !manifest.hasConnectors) {\n missing.add(relative(root, manifest.path).split('\\\\').join('/') || manifest.path);\n }\n\n if (isWrite) {\n writeFileSync(file, result.output);\n }\n }\n }\n\n console.log(\n `devz codemod connector-imports: ${changedCount} file(s) ${isWrite ? 'changed' : 'would change'}, ${specifierCount} specifier(s) ${isWrite ? 'moved' : 'would be moved'}` +\n (refusedCount > 0 ? `, ${refusedCount} refused` : ''),\n );\n\n for (const manifestPath of [...missing].sort()) {\n console.warn(\n `${manifestPath} does not list ${CONNECTORS_PACKAGE}: add it as a dependency, because the imports now come from it`,\n );\n }\n\n if (!isWrite && changedCount > 0) {\n console.log(\n `Nothing was written. Run again with ${ConnectorImportsFlags.WRITE} to apply, then add the dependency and run your typecheck.`,\n );\n }\n\n if (isWrite && refusedCount > 0) {\n return 1;\n }\n\n return isCheck && changedCount > 0 ? 1 : 0;\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"const-classes.js","sourceRoot":"","sources":["../../../src/cli/codemod/const-classes.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFileSync, writeFileSync } from 'node:fs';\nimport { relative, resolve } from 'node:path';\nimport type ts from 'typescript';\nimport { CodemodFiles } from './files';\n\ntype TTypeScript = typeof ts;\n\nconst DEFAULT_IMPORT_FROM = '@venizia/ignis-helpers/common';\nconst TEST_FILE_PATTERN = /(?:^|\\/)__tests__\\/|\\.(?:test|spec)\\.[cm]?tsx?$/;\n/** Utility types whose type argument is a set of keys, not an enumerable value. */\nconst KEY_SET_TYPES = new Set(['Pick', 'Omit', 'Extract', 'Exclude', 'Record']);\n/** A file that can hold a string-literal union: a quote beside a `|`. */\nconst UNION_TEXT = /\\|\\s*['\"]|['\"]\\s*\\|/;\nconst RESERVED_KEYS = new Set(['SCHEME_SET']);\n\n/** What the user may change for one declaration, from the mapping file. */\nexport interface IConstClassOverride {\n /** The class name. */\n class?: string;\n /** The type name; only a property of an interface or object type gets a new one. */\n type?: string;\n /** A member key per literal value: `{ \"read-only\": \"READ_ONLY\" }`. */\n members?: Record<string, string>;\n /** Leave this declaration alone. */\n skip?: boolean;\n}\n\nexport type TConstClassMap = Record<string, IConstClassOverride>;\n\nexport interface IConstClassProposal {\n /** The key of the mapping file: `path/to/file.ts#TName` or `path/to/file.ts#IContainer.property`. */\n id: string;\n line: number;\n className: string;\n typeName: string;\n /** The literal values and the member key each one gets, in order. */\n members: Array<{ value: string; key: string }>;\n /** What the union also held: `null` or `undefined`. */\n nullish: string[];\n}\n\nexport interface IConstClassUntouched {\n line: number;\n column: number;\n reason: string;\n}\n\nexport interface IConstClassResult {\n output: string;\n changed: boolean;\n proposals: IConstClassProposal[];\n untouched: IConstClassUntouched[];\n}\n\ninterface IEdit {\n start: number;\n end: number;\n text: string;\n}\n\n/** The plural of a PascalCase word, for the class that holds its values. */\nconst pluralize = (word: string): string => {\n const alreadyPlural = /[^uis]s$/.test(word) || /ings$/.test(word);\n if (alreadyPlural) {\n return word;\n }\n\n if (/(s|x|z|ch|sh)$/.test(word)) {\n return `${word}es`;\n }\n\n if (/[^aeiou]y$/.test(word)) {\n return `${word.slice(0, -1)}ies`;\n }\n\n return `${word}s`;\n};\n\n/** `read-only`, `readOnly` and `string[]` become `READ_ONLY`, `READ_ONLY` and `STRING_ARRAY`; `undefined` when nothing is left. */\nconst toKey = (value: string): string | undefined => {\n const key = value\n .replace(/\\[\\]/g, '_ARRAY_')\n .replace(/([a-z0-9])([A-Z])/g, '$1_$2')\n .replace(/[^A-Za-z0-9]+/g, '_')\n .replace(/^_+|_+$/g, '')\n .toUpperCase();\n\n if (key === '') {\n return undefined;\n }\n\n return /^[0-9]/.test(key) ? `_${key}` : key;\n};\n\nconst pascal = (word: string): string => `${word.charAt(0).toUpperCase()}${word.slice(1)}`;\n\n/**\n * Turns the string-literal unions of exported declarations into const classes: an exported type\n * alias, and a property of an exported interface or object type. The values stay the same, so every\n * existing literal still type-checks and no call site changes. A union it cannot name is reported.\n */\nexport class ConstClasses {\n static convert(opts: {\n typescript: TTypeScript;\n fileName: string;\n source: string;\n /** The id prefix of the mapping file: the path of the file relative to the project root. */\n relativePath?: string;\n overrides?: TConstClassMap;\n importFrom?: string;\n }): IConstClassResult {\n const { typescript, fileName, source, overrides = {}, importFrom = DEFAULT_IMPORT_FROM } = opts;\n const relativePath = opts.relativePath ?? fileName;\n const sourceFile = typescript.createSourceFile(\n fileName,\n source,\n typescript.ScriptTarget.Latest,\n true,\n );\n const taken = ConstClasses.declaredNames({ typescript, sourceFile });\n const proposals: IConstClassProposal[] = [];\n const untouched: IConstClassUntouched[] = [];\n const edits: IEdit[] = [];\n const insertions = new Map<number, string[]>();\n const handled = new Set<ts.Node>();\n\n const report = (node: ts.Node, reason: string) => {\n const { line, character } = sourceFile.getLineAndCharacterOfPosition(\n node.getStart(sourceFile),\n );\n untouched.push({ line: line + 1, column: character + 1, reason });\n };\n\n const lineOf = (node: ts.Node) =>\n sourceFile.getLineAndCharacterOfPosition(node.getStart(sourceFile)).line + 1;\n\n /** Plans one conversion; `undefined` and a report when the names or the members do not work. */\n const plan = (planOpts: {\n node: ts.UnionTypeNode;\n id: string;\n className: string;\n typeName: string;\n anchor: ts.Node;\n mayRenameType: boolean;\n }): void => {\n const { node, id, anchor } = planOpts;\n const override = overrides[id] ?? {};\n const union = ConstClasses.readUnion({ typescript, node });\n\n if (override.skip) {\n handled.add(node);\n return;\n }\n\n const className = override.class ?? planOpts.className;\n const typeName = planOpts.mayRenameType\n ? (override.type ?? planOpts.typeName)\n : planOpts.typeName;\n const members = union.values.map((value) => ({\n value,\n key: override.members?.[value] ?? toKey(value) ?? '',\n }));\n\n const problem = ConstClasses.checkPlan({\n className,\n typeName,\n members,\n taken,\n mayRenameType: planOpts.mayRenameType,\n });\n if (problem) {\n report(node, `${problem}; left untouched (name it in the mapping file: ${id})`);\n handled.add(node);\n return;\n }\n\n taken.add(className);\n if (planOpts.mayRenameType) {\n taken.add(typeName);\n }\n\n handled.add(node);\n proposals.push({\n id,\n line: lineOf(node),\n className,\n typeName,\n members,\n nullish: union.nullish,\n });\n\n const classText = ConstClasses.renderClass({ className, typeName, members });\n const reference = `TConstValue<typeof ${className}>`;\n const nullishText = union.nullish.map((member) => ` | ${member}`).join('');\n\n if (planOpts.mayRenameType) {\n const aliasText = `export type ${typeName} = ${reference};\\n\\n`;\n const at = anchor.getStart(sourceFile, true);\n insertions.set(at, [...(insertions.get(at) ?? []), `${classText}\\n\\n${aliasText}`]);\n edits.push({\n start: node.getStart(sourceFile),\n end: node.end,\n text: `${typeName}${nullishText}`,\n });\n return;\n }\n\n const at = anchor.getStart(sourceFile, true);\n insertions.set(at, [...(insertions.get(at) ?? []), `${classText}\\n\\n`]);\n edits.push({\n start: node.getStart(sourceFile),\n end: node.end,\n text: `${reference}${nullishText}`,\n });\n };\n\n for (const statement of sourceFile.statements) {\n if (!ConstClasses.isExported({ typescript, node: statement })) {\n continue;\n }\n\n if (typescript.isTypeAliasDeclaration(statement)) {\n const union = typescript.isUnionTypeNode(statement.type) ? statement.type : undefined;\n if (union && ConstClasses.isEnumerable({ typescript, node: union })) {\n const base = statement.name.text.replace(/^T(?=[A-Z])/, '');\n plan({\n node: union,\n id: `${relativePath}#${statement.name.text}`,\n className: pluralize(base),\n typeName: statement.name.text,\n anchor: statement,\n mayRenameType: false,\n });\n continue;\n }\n\n if (typescript.isTypeLiteralNode(statement.type)) {\n ConstClasses.planMembers({\n typescript,\n container: statement,\n members: statement.type.members,\n relativePath,\n plan,\n });\n }\n }\n\n if (typescript.isInterfaceDeclaration(statement)) {\n ConstClasses.planMembers({\n typescript,\n container: statement,\n members: statement.members,\n relativePath,\n plan,\n });\n }\n\n ConstClasses.findStrays({ typescript, statement, handled, report });\n }\n\n if (proposals.length === 0) {\n return { output: source, changed: false, proposals, untouched };\n }\n\n for (const [at, texts] of insertions) {\n edits.push({ start: at, end: at, text: texts.join('') });\n }\n\n // Last, so that at the top of a file the import lands above the class inserted at the same place.\n const importEdit = ConstClasses.planImport({ typescript, sourceFile, importFrom });\n if (importEdit) {\n edits.push(importEdit);\n }\n\n let output = source;\n for (const edit of edits.sort((a, b) => b.start - a.start || b.end - a.end)) {\n output = output.slice(0, edit.start) + edit.text + output.slice(edit.end);\n }\n\n return { output, changed: output !== source, proposals, untouched };\n }\n\n private static planMembers(opts: {\n typescript: TTypeScript;\n container: ts.InterfaceDeclaration | ts.TypeAliasDeclaration;\n members: ts.NodeArray<ts.TypeElement>;\n relativePath: string;\n plan: (planOpts: {\n node: ts.UnionTypeNode;\n id: string;\n className: string;\n typeName: string;\n anchor: ts.Node;\n mayRenameType: boolean;\n }) => void;\n }): void {\n const { typescript, container, members, relativePath, plan } = opts;\n const containerName = container.name.text;\n const base = containerName.replace(/^[IT](?=[A-Z])/, '');\n\n for (const member of members) {\n if (!typescript.isPropertySignature(member) || !member.type) {\n continue;\n }\n\n if (\n !typescript.isUnionTypeNode(member.type) ||\n !ConstClasses.isEnumerable({ typescript, node: member.type })\n ) {\n continue;\n }\n\n const property = typescript.isIdentifier(member.name) ? member.name.text : undefined;\n if (!property) {\n continue;\n }\n\n plan({\n node: member.type,\n id: `${relativePath}#${containerName}.${property}`,\n className: pluralize(`${base}${pascal(property)}`),\n typeName: `T${base}${pascal(property)}`,\n anchor: container,\n mayRenameType: true,\n });\n }\n }\n\n /** Every top-level name the file declares or imports. */\n private static declaredNames(opts: {\n typescript: TTypeScript;\n sourceFile: ts.SourceFile;\n }): Set<string> {\n const { typescript, sourceFile } = opts;\n const names = new Set<string>();\n\n for (const statement of sourceFile.statements) {\n if (typescript.isImportDeclaration(statement) && statement.importClause) {\n const { name, namedBindings } = statement.importClause;\n if (name) {\n names.add(name.text);\n }\n\n if (namedBindings && typescript.isNamespaceImport(namedBindings)) {\n names.add(namedBindings.name.text);\n }\n\n if (namedBindings && typescript.isNamedImports(namedBindings)) {\n for (const element of namedBindings.elements) {\n names.add(element.name.text);\n }\n }\n continue;\n }\n\n if (typescript.isVariableStatement(statement)) {\n for (const declaration of statement.declarationList.declarations) {\n if (typescript.isIdentifier(declaration.name)) {\n names.add(declaration.name.text);\n }\n }\n continue;\n }\n\n if (\n (typescript.isClassDeclaration(statement) ||\n typescript.isFunctionDeclaration(statement) ||\n typescript.isInterfaceDeclaration(statement) ||\n typescript.isTypeAliasDeclaration(statement) ||\n typescript.isEnumDeclaration(statement) ||\n typescript.isModuleDeclaration(statement)) &&\n statement.name &&\n typescript.isIdentifier(statement.name)\n ) {\n names.add(statement.name.text);\n }\n }\n\n return names;\n }\n\n private static isExported(opts: { typescript: TTypeScript; node: ts.Node }): boolean {\n const { typescript, node } = opts;\n const modifiers = typescript.canHaveModifiers(node) ? typescript.getModifiers(node) : undefined;\n return (\n modifiers?.some((modifier) => modifier.kind === typescript.SyntaxKind.ExportKeyword) === true\n );\n }\n\n /** The string values of a union, and its `null` or `undefined` members; the union must be string literals (and nullish) only. */\n private static readUnion(opts: { typescript: TTypeScript; node: ts.UnionTypeNode }): {\n values: string[];\n nullish: string[];\n } {\n const { typescript, node } = opts;\n const values: string[] = [];\n const nullish: string[] = [];\n\n for (const member of node.types) {\n if (typescript.isLiteralTypeNode(member) && typescript.isStringLiteral(member.literal)) {\n if (!values.includes(member.literal.text)) {\n values.push(member.literal.text);\n }\n continue;\n }\n\n if (member.kind === typescript.SyntaxKind.NullKeyword) {\n nullish.push('null');\n } else if (member.kind === typescript.SyntaxKind.UndefinedKeyword) {\n nullish.push('undefined');\n } else if (\n typescript.isLiteralTypeNode(member) &&\n member.literal.kind === typescript.SyntaxKind.NullKeyword\n ) {\n nullish.push('null');\n }\n }\n\n return { values, nullish };\n }\n\n /** At least two string literals, and nothing else but `null` or `undefined`. */\n private static isEnumerable(opts: { typescript: TTypeScript; node: ts.UnionTypeNode }): boolean {\n const { typescript, node } = opts;\n let literals = 0;\n\n for (const member of node.types) {\n if (typescript.isLiteralTypeNode(member) && typescript.isStringLiteral(member.literal)) {\n literals += 1;\n continue;\n }\n\n const isNullish =\n member.kind === typescript.SyntaxKind.UndefinedKeyword ||\n member.kind === typescript.SyntaxKind.NullKeyword ||\n (typescript.isLiteralTypeNode(member) &&\n member.literal.kind === typescript.SyntaxKind.NullKeyword);\n if (!isNullish) {\n return false;\n }\n }\n\n return literals >= 2;\n }\n\n private static checkPlan(opts: {\n className: string;\n typeName: string;\n members: Array<{ value: string; key: string }>;\n taken: Set<string>;\n mayRenameType: boolean;\n }): string | undefined {\n const { className, typeName, members, taken, mayRenameType } = opts;\n\n if (taken.has(className)) {\n return `the name ${className} is already used in this file`;\n }\n\n if (mayRenameType && taken.has(typeName)) {\n return `the name ${typeName} is already used in this file`;\n }\n\n const keys = new Set<string>();\n for (const { value, key } of members) {\n if (key === '') {\n return `no member name can be made from ${JSON.stringify(value)}`;\n }\n\n if (RESERVED_KEYS.has(key)) {\n return `${JSON.stringify(value)} would become the reserved member ${key}`;\n }\n\n if (keys.has(key)) {\n return `two values give the member ${key}`;\n }\n\n keys.add(key);\n }\n\n return undefined;\n }\n\n private static renderClass(opts: {\n className: string;\n typeName: string;\n members: Array<{ value: string; key: string }>;\n }): string {\n const { className, typeName, members } = opts;\n const quote = (value: string) => `'${value.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\")}'`;\n const lines = [\n `export class ${className} {`,\n ...members.map(({ value, key }) => ` static readonly ${key} = ${quote(value)};`),\n '',\n ` static readonly SCHEME_SET = new Set<string>([${members.map(({ key }) => `this.${key}`).join(', ')}]);`,\n '',\n ` static isValid(value: string): value is ${typeName} {`,\n ' return this.SCHEME_SET.has(value);',\n ' }',\n '}',\n ];\n\n return lines.join('\\n');\n }\n\n /** Reports every string-literal union of an exported declaration the codemod did not handle: it cannot name those. */\n private static findStrays(opts: {\n typescript: TTypeScript;\n statement: ts.Statement;\n handled: Set<ts.Node>;\n report: (node: ts.Node, reason: string) => void;\n }): void {\n const { typescript, statement, handled, report } = opts;\n\n const walk = (node: ts.Node): void => {\n if (typescript.isVariableDeclaration(node) && node.type) {\n // The annotation of an exported constant is not what the lint rule asks to name.\n if (node.initializer) {\n walk(node.initializer);\n }\n return;\n }\n\n if (typescript.isUnionTypeNode(node) && ConstClasses.isEnumerable({ typescript, node })) {\n if (!handled.has(node) && !ConstClasses.isKeySet({ typescript, node })) {\n report(\n node,\n 'a string-literal union in this position (a parameter, a return type, a generic or a nested type) has no name to give it; write the const class by hand',\n );\n }\n\n return;\n }\n\n typescript.forEachChild(node, walk);\n };\n\n walk(statement);\n }\n\n private static isKeySet(opts: { typescript: TTypeScript; node: ts.Node }): boolean {\n const { typescript, node } = opts;\n const parent = node.parent;\n\n if (typescript.isMappedTypeNode(parent) || typescript.isTypeOperatorNode(parent)) {\n return true;\n }\n\n if (\n typescript.isTypeParameterDeclaration(parent) &&\n typescript.isMappedTypeNode(parent.parent)\n ) {\n return true;\n }\n\n if (\n parent &&\n typescript.isTypeReferenceNode(parent) &&\n typescript.isIdentifier(parent.typeName) &&\n KEY_SET_TYPES.has(parent.typeName.text)\n ) {\n return true;\n }\n\n return false;\n }\n\n /** The edit that makes `TConstValue` available: nothing when the file has it, a specifier on an import from the same module, else a new import line. */\n private static planImport(opts: {\n typescript: TTypeScript;\n sourceFile: ts.SourceFile;\n importFrom: string;\n }): IEdit | undefined {\n const { typescript, sourceFile, importFrom } = opts;\n let lastImportEnd = 0;\n let sameModule: ts.ImportDeclaration | undefined;\n\n for (const statement of sourceFile.statements) {\n if (!typescript.isImportDeclaration(statement)) {\n continue;\n }\n\n lastImportEnd = statement.end;\n const bindings = statement.importClause?.namedBindings;\n if (bindings && typescript.isNamedImports(bindings)) {\n if (bindings.elements.some((element) => element.name.text === 'TConstValue')) {\n return undefined;\n }\n\n if (\n typescript.isStringLiteral(statement.moduleSpecifier) &&\n statement.moduleSpecifier.text === importFrom\n ) {\n sameModule = statement;\n }\n }\n }\n\n const bindings = sameModule?.importClause?.namedBindings;\n if (\n sameModule &&\n bindings &&\n typescript.isNamedImports(bindings) &&\n bindings.elements.length > 0\n ) {\n const last = bindings.elements[bindings.elements.length - 1];\n const typeOnly = sameModule.importClause?.isTypeOnly === true;\n return {\n start: last?.end ?? bindings.end,\n end: last?.end ?? bindings.end,\n text: typeOnly ? ', TConstValue' : ', type TConstValue',\n };\n }\n\n const line = `import type { TConstValue } from '${importFrom}';`;\n if (lastImportEnd > 0) {\n return { start: lastImportEnd, end: lastImportEnd, text: `\\n${line}` };\n }\n\n return { start: 0, end: 0, text: `${line}\\n\\n` };\n }\n}\n\nconst USAGE = `Usage: devz codemod const-classes [paths...] [--write | --check] [--map <file>] [--emit-map <file>] [--import-from <module>] [--include-tests]\n\nTurns a string-literal union in an exported declaration into a const class (SCHEME_SET, isValid) plus\n\\`TConstValue<typeof X>\\`, the shape the venizia/const-class-values lint rule asks for. It handles an\nexported type alias and a property of an exported interface or object type. The values stay the same,\nso every existing literal still type-checks and no call site changes.\n\nIt has to choose names: the class is the type name without its leading T, in the plural; a member is\nthe value in upper snake case. The dry run prints every proposal.\n\n --write write the changed files (without it, nothing is written)\n --check dry run that exits 1 while a union can be converted or is left untouched (for CI)\n --all with --write and no path: rewrite every source file under the working directory (--write needs a path or --all)\n --map <file> a JSON file of overrides, keyed by the id the dry run prints\n --emit-map <file> write the proposals as a mapping file to edit, then pass it with --map\n --import-from <m> where TConstValue is imported from (default ${DEFAULT_IMPORT_FROM})\n --include-tests also convert test files (skipped by default)\n --help print this text and exit\n\nA mapping entry: { \"src/a.ts#TMode\": { \"class\": \"Modes\", \"members\": { \"read-only\": \"READ_ONLY\" } } },\nor { \"skip\": true }. A union in a parameter, a return type, a generic or a nested type is reported as\nleft untouched: it has no name, so write that class by hand. Key sets (Pick, Omit, Extract, Exclude,\nRecord, mapped types) are not enumerable values and are never touched.`;\n\n/** A usage error: nothing was read or written. */\nconst USAGE_ERROR_CODE = 2;\n\nclass ConstClassFlags {\n static readonly WRITE = '--write';\n static readonly CHECK = '--check';\n static readonly ALL = '--all';\n static readonly MAP = '--map';\n static readonly EMIT_MAP = '--emit-map';\n static readonly IMPORT_FROM = '--import-from';\n static readonly INCLUDE_TESTS = '--include-tests';\n static readonly HELP = '--help';\n static readonly HELP_SHORT = '-h';\n\n static readonly SCHEME_SET = new Set<string>([\n this.WRITE,\n this.CHECK,\n this.ALL,\n this.MAP,\n this.EMIT_MAP,\n this.IMPORT_FROM,\n this.INCLUDE_TESTS,\n this.HELP,\n this.HELP_SHORT,\n ]);\n\n /** The flags that take a value. */\n static readonly WITH_VALUE = new Set<string>([this.MAP, this.EMIT_MAP, this.IMPORT_FROM]);\n\n static isValid(value: string): boolean {\n return this.SCHEME_SET.has(value);\n }\n}\n\n/** `devz codemod const-classes [paths...] [--write | --check]`. */\nexport class ConstClassesCommand {\n static readonly USAGE = USAGE;\n\n static async run(opts: { root: string; args: string[] }): Promise<number> {\n const { root, args } = opts;\n\n if (args.includes(ConstClassFlags.HELP) || args.includes(ConstClassFlags.HELP_SHORT)) {\n console.log(USAGE);\n return 0;\n }\n\n const flags: string[] = [];\n const paths: string[] = [];\n const values = new Map<string, string>();\n\n for (let index = 0; index < args.length; index += 1) {\n const argument = args[index] ?? '';\n const [name, inline] = argument.startsWith('--') ? argument.split(/=(.*)/s) : [argument];\n\n if (name !== undefined && ConstClassFlags.WITH_VALUE.has(name)) {\n const value = inline ?? args[index + 1];\n if (inline === undefined) {\n index += 1;\n }\n\n if (!value || value.startsWith('-')) {\n console.error(`devz codemod: ${name} needs a value\\n${USAGE}`);\n return USAGE_ERROR_CODE;\n }\n\n values.set(name, value);\n continue;\n }\n\n if (argument.startsWith('-')) {\n flags.push(argument);\n } else {\n paths.push(argument);\n }\n }\n\n const unknown = flags.filter((flag) => !ConstClassFlags.isValid(flag));\n if (unknown.length > 0) {\n console.error(\n `devz codemod: unknown option ${unknown.map((flag) => `\"${flag}\"`).join(', ')}\\n${USAGE}`,\n );\n return USAGE_ERROR_CODE;\n }\n\n const isWrite = flags.includes(ConstClassFlags.WRITE);\n const isCheck = flags.includes(ConstClassFlags.CHECK);\n\n const refusal = CodemodFiles.refusal({\n command: 'const-classes',\n isWrite,\n isAll: flags.includes(ConstClassFlags.ALL),\n paths,\n });\n if (refusal) {\n console.error(`${refusal}\\n${USAGE}`);\n return USAGE_ERROR_CODE;\n }\n const includeTests = flags.includes(ConstClassFlags.INCLUDE_TESTS);\n\n if (isWrite && isCheck) {\n console.error(\n `devz codemod: ${ConstClassFlags.WRITE} and ${ConstClassFlags.CHECK} contradict each other\\n${USAGE}`,\n );\n return USAGE_ERROR_CODE;\n }\n\n let overrides: TConstClassMap = {};\n const mapPath = values.get(ConstClassFlags.MAP);\n if (mapPath) {\n let parsed: unknown;\n try {\n parsed = JSON.parse(readFileSync(resolve(root, mapPath), 'utf8'));\n } catch (error) {\n console.error(\n `devz codemod: cannot read the mapping file ${mapPath}: ${error instanceof Error ? error.message : String(error)}`,\n );\n return USAGE_ERROR_CODE;\n }\n\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {\n console.error(\n `devz codemod: cannot read the mapping file ${mapPath}: the file must hold one JSON object`,\n );\n return USAGE_ERROR_CODE;\n }\n\n overrides = Object.fromEntries(Object.entries(parsed));\n }\n\n let typescript: TTypeScript;\n try {\n const result2 = await import('typescript');\n typescript = result2.default;\n } catch {\n console.error('devz codemod: the \"typescript\" package is required to read your sources');\n return 1;\n }\n\n const targets = (paths.length > 0 ? paths : ['.']).map((path) => resolve(root, path));\n const importFrom = values.get(ConstClassFlags.IMPORT_FROM);\n const emitted: TConstClassMap = {};\n let changedFiles = 0;\n let converted = 0;\n let untouchedCount = 0;\n\n for (const target of targets) {\n const files = CodemodFiles.collect({ target });\n\n if (files.length === 0 && paths.length > 0) {\n console.warn(\n `devz codemod: no source files under \"${relative(root, target) || target}\" (git ignores the path, or it holds none): nothing was read`,\n );\n }\n\n for (const file of files) {\n const relativePath = relative(root, file).split('\\\\').join('/');\n if (!includeTests && TEST_FILE_PATTERN.test(relativePath)) {\n continue;\n }\n\n const source = readFileSync(file, 'utf8');\n if (!UNION_TEXT.test(source)) {\n continue;\n }\n\n const result = ConstClasses.convert({\n typescript,\n fileName: file,\n source,\n relativePath,\n overrides,\n importFrom,\n });\n\n for (const item of result.untouched) {\n untouchedCount += 1;\n console.warn(`${relativePath}:${item.line}:${item.column} ${item.reason}`);\n }\n\n for (const proposal of result.proposals) {\n converted += 1;\n emitted[proposal.id] = {\n class: proposal.className,\n ...(proposal.id.split('#')[1]?.includes('.') ? { type: proposal.typeName } : {}),\n members: Object.fromEntries(proposal.members.map(({ value, key }) => [value, key])),\n };\n console.log(\n `${isWrite ? 'converted' : 'would convert'} ${relativePath}:${proposal.line} ${proposal.typeName} -> class ${proposal.className} { ${proposal.members.map(({ key, value }) => `${key} = '${value}'`).join(', ')} }` +\n ` [${proposal.id}]`,\n );\n }\n\n if (result.changed) {\n changedFiles += 1;\n if (isWrite) {\n writeFileSync(file, result.output);\n }\n }\n }\n }\n\n const emitPath = values.get(ConstClassFlags.EMIT_MAP);\n if (emitPath) {\n writeFileSync(resolve(root, emitPath), `${JSON.stringify(emitted, null, 2)}\\n`);\n console.log(\n `Wrote ${Object.keys(emitted).length} proposal(s) to ${emitPath}; edit it, then pass --map ${emitPath}.`,\n );\n }\n\n console.log(\n `devz codemod const-classes: ${converted} union(s) ${isWrite ? 'converted' : 'would be converted'} in ${changedFiles} file(s), ${untouchedCount} left untouched`,\n );\n\n if (!isWrite && changedFiles > 0) {\n console.log(\n `Nothing was written. Run again with ${ConstClassFlags.WRITE} to apply (add --map to rename), then run your typecheck and lint.`,\n );\n }\n\n return isCheck && (converted > 0 || untouchedCount > 0) ? 1 : 0;\n }\n}\n"]}
1
+ {"version":3,"file":"const-classes.js","sourceRoot":"","sources":["../../../src/cli/codemod/const-classes.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFileSync, writeFileSync } from 'node:fs';\nimport { relative, resolve } from 'node:path';\nimport type ts from 'typescript';\nimport { CodemodFiles } from './files';\n\ntype TTypeScript = typeof ts;\n\nconst DEFAULT_IMPORT_FROM = '@venizia/ignis-helpers/common';\nconst TEST_FILE_PATTERN = /(?:^|\\/)__tests__\\/|\\.(?:test|spec)\\.[cm]?tsx?$/;\n/** Utility types whose type argument is a set of keys, not an enumerable value. */\nconst KEY_SET_TYPES = new Set(['Pick', 'Omit', 'Extract', 'Exclude', 'Record']);\n/** A file that can hold a string-literal union: a quote beside a `|`. */\nconst UNION_TEXT = /\\|\\s*['\"]|['\"]\\s*\\|/;\nconst RESERVED_KEYS = new Set(['SCHEME_SET']);\n\n/** What the user may change for one declaration, from the mapping file. */\nexport interface IConstClassOverride {\n /** The class name. */\n class?: string;\n /** The type name; only a property of an interface or object type gets a new one. */\n type?: string;\n /** A member key per literal value: `{ \"read-only\": \"READ_ONLY\" }`. */\n members?: Record<string, string>;\n /** Leave this declaration alone. */\n skip?: boolean;\n}\n\nexport type TConstClassMap = Record<string, IConstClassOverride>;\n\nexport interface IConstClassProposal {\n /** The key of the mapping file: `path/to/file.ts#TName` or `path/to/file.ts#IContainer.property`. */\n id: string;\n line: number;\n className: string;\n typeName: string;\n /** The literal values and the member key each one gets, in order. */\n members: Array<{ value: string; key: string }>;\n /** What the union also held: `null` or `undefined`. */\n nullish: string[];\n}\n\nexport interface IConstClassUntouched {\n line: number;\n column: number;\n reason: string;\n}\n\nexport interface IConstClassResult {\n output: string;\n changed: boolean;\n proposals: IConstClassProposal[];\n untouched: IConstClassUntouched[];\n}\n\ninterface IEdit {\n start: number;\n end: number;\n text: string;\n}\n\n/** The plural of a PascalCase word, for the class that holds its values. */\nconst pluralize = (word: string): string => {\n const alreadyPlural = /[^uis]s$/.test(word) || /ings$/.test(word);\n\n if (alreadyPlural) {\n return word;\n }\n\n if (/(s|x|z|ch|sh)$/.test(word)) {\n return `${word}es`;\n }\n\n if (/[^aeiou]y$/.test(word)) {\n return `${word.slice(0, -1)}ies`;\n }\n\n return `${word}s`;\n};\n\n/** `read-only`, `readOnly` and `string[]` become `READ_ONLY`, `READ_ONLY` and `STRING_ARRAY`; `undefined` when nothing is left. */\nconst toKey = (value: string): string | undefined => {\n const key = value\n .replace(/\\[\\]/g, '_ARRAY_')\n .replace(/([a-z0-9])([A-Z])/g, '$1_$2')\n .replace(/[^A-Za-z0-9]+/g, '_')\n .replace(/^_+|_+$/g, '')\n .toUpperCase();\n\n if (key === '') {\n return undefined;\n }\n\n return /^[0-9]/.test(key) ? `_${key}` : key;\n};\n\nconst pascal = (word: string): string => `${word.charAt(0).toUpperCase()}${word.slice(1)}`;\n\n/**\n * Turns the string-literal unions of exported declarations into const classes: an exported type\n * alias, and a property of an exported interface or object type. The values stay the same, so every\n * existing literal still type-checks and no call site changes. A union it cannot name is reported.\n */\nexport class ConstClasses {\n static convert(opts: {\n typescript: TTypeScript;\n fileName: string;\n source: string;\n /** The id prefix of the mapping file: the path of the file relative to the project root. */\n relativePath?: string;\n overrides?: TConstClassMap;\n importFrom?: string;\n }): IConstClassResult {\n const { typescript, fileName, source, overrides = {}, importFrom = DEFAULT_IMPORT_FROM } = opts;\n const relativePath = opts.relativePath ?? fileName;\n const sourceFile = typescript.createSourceFile(\n fileName,\n source,\n typescript.ScriptTarget.Latest,\n true,\n );\n const taken = ConstClasses.declaredNames({ typescript, sourceFile });\n const proposals: IConstClassProposal[] = [];\n const untouched: IConstClassUntouched[] = [];\n const edits: IEdit[] = [];\n const insertions = new Map<number, string[]>();\n const handled = new Set<ts.Node>();\n\n const report = (node: ts.Node, reason: string) => {\n const { line, character } = sourceFile.getLineAndCharacterOfPosition(\n node.getStart(sourceFile),\n );\n untouched.push({ line: line + 1, column: character + 1, reason });\n };\n\n const lineOf = (node: ts.Node) =>\n sourceFile.getLineAndCharacterOfPosition(node.getStart(sourceFile)).line + 1;\n\n /** Plans one conversion; `undefined` and a report when the names or the members do not work. */\n const plan = (planOpts: {\n node: ts.UnionTypeNode;\n id: string;\n className: string;\n typeName: string;\n anchor: ts.Node;\n mayRenameType: boolean;\n }): void => {\n const { node, id, anchor } = planOpts;\n const override = overrides[id] ?? {};\n const union = ConstClasses.readUnion({ typescript, node });\n\n if (override.skip) {\n handled.add(node);\n\n return;\n }\n\n const className = override.class ?? planOpts.className;\n const typeName = planOpts.mayRenameType\n ? (override.type ?? planOpts.typeName)\n : planOpts.typeName;\n const members = union.values.map((value) => ({\n value,\n key: override.members?.[value] ?? toKey(value) ?? '',\n }));\n\n const problem = ConstClasses.checkPlan({\n className,\n typeName,\n members,\n taken,\n mayRenameType: planOpts.mayRenameType,\n });\n\n if (problem) {\n report(node, `${problem}; left untouched (name it in the mapping file: ${id})`);\n handled.add(node);\n\n return;\n }\n\n taken.add(className);\n\n if (planOpts.mayRenameType) {\n taken.add(typeName);\n }\n\n handled.add(node);\n proposals.push({\n id,\n line: lineOf(node),\n className,\n typeName,\n members,\n nullish: union.nullish,\n });\n\n const classText = ConstClasses.renderClass({ className, typeName, members });\n const reference = `TConstValue<typeof ${className}>`;\n const nullishText = union.nullish.map((member) => ` | ${member}`).join('');\n\n if (planOpts.mayRenameType) {\n const aliasText = `export type ${typeName} = ${reference};\\n\\n`;\n const at = anchor.getStart(sourceFile, true);\n insertions.set(at, [...(insertions.get(at) ?? []), `${classText}\\n\\n${aliasText}`]);\n edits.push({\n start: node.getStart(sourceFile),\n end: node.end,\n text: `${typeName}${nullishText}`,\n });\n\n return;\n }\n\n const at = anchor.getStart(sourceFile, true);\n insertions.set(at, [...(insertions.get(at) ?? []), `${classText}\\n\\n`]);\n edits.push({\n start: node.getStart(sourceFile),\n end: node.end,\n text: `${reference}${nullishText}`,\n });\n };\n\n for (const statement of sourceFile.statements) {\n if (!ConstClasses.isExported({ typescript, node: statement })) {\n continue;\n }\n\n if (typescript.isTypeAliasDeclaration(statement)) {\n const union = typescript.isUnionTypeNode(statement.type) ? statement.type : undefined;\n\n if (union && ConstClasses.isEnumerable({ typescript, node: union })) {\n const base = statement.name.text.replace(/^T(?=[A-Z])/, '');\n plan({\n node: union,\n id: `${relativePath}#${statement.name.text}`,\n className: pluralize(base),\n typeName: statement.name.text,\n anchor: statement,\n mayRenameType: false,\n });\n continue;\n }\n\n if (typescript.isTypeLiteralNode(statement.type)) {\n ConstClasses.planMembers({\n typescript,\n container: statement,\n members: statement.type.members,\n relativePath,\n plan,\n });\n }\n }\n\n if (typescript.isInterfaceDeclaration(statement)) {\n ConstClasses.planMembers({\n typescript,\n container: statement,\n members: statement.members,\n relativePath,\n plan,\n });\n }\n\n ConstClasses.findStrays({ typescript, statement, handled, report });\n }\n\n if (proposals.length === 0) {\n return { output: source, changed: false, proposals, untouched };\n }\n\n for (const [at, texts] of insertions) {\n edits.push({ start: at, end: at, text: texts.join('') });\n }\n\n // Last, so that at the top of a file the import lands above the class inserted at the same place.\n const importEdit = ConstClasses.planImport({ typescript, sourceFile, importFrom });\n\n if (importEdit) {\n edits.push(importEdit);\n }\n\n let output = source;\n\n for (const edit of edits.sort((a, b) => b.start - a.start || b.end - a.end)) {\n output = output.slice(0, edit.start) + edit.text + output.slice(edit.end);\n }\n\n return { output, changed: output !== source, proposals, untouched };\n }\n\n private static planMembers(opts: {\n typescript: TTypeScript;\n container: ts.InterfaceDeclaration | ts.TypeAliasDeclaration;\n members: ts.NodeArray<ts.TypeElement>;\n relativePath: string;\n plan: (planOpts: {\n node: ts.UnionTypeNode;\n id: string;\n className: string;\n typeName: string;\n anchor: ts.Node;\n mayRenameType: boolean;\n }) => void;\n }): void {\n const { typescript, container, members, relativePath, plan } = opts;\n const containerName = container.name.text;\n const base = containerName.replace(/^[IT](?=[A-Z])/, '');\n\n for (const member of members) {\n if (!typescript.isPropertySignature(member) || !member.type) {\n continue;\n }\n\n if (\n !typescript.isUnionTypeNode(member.type) ||\n !ConstClasses.isEnumerable({ typescript, node: member.type })\n ) {\n continue;\n }\n\n const property = typescript.isIdentifier(member.name) ? member.name.text : undefined;\n\n if (!property) {\n continue;\n }\n\n plan({\n node: member.type,\n id: `${relativePath}#${containerName}.${property}`,\n className: pluralize(`${base}${pascal(property)}`),\n typeName: `T${base}${pascal(property)}`,\n anchor: container,\n mayRenameType: true,\n });\n }\n }\n\n /** Every top-level name the file declares or imports. */\n private static declaredNames(opts: {\n typescript: TTypeScript;\n sourceFile: ts.SourceFile;\n }): Set<string> {\n const { typescript, sourceFile } = opts;\n const names = new Set<string>();\n\n for (const statement of sourceFile.statements) {\n if (typescript.isImportDeclaration(statement) && statement.importClause) {\n const { name, namedBindings } = statement.importClause;\n\n if (name) {\n names.add(name.text);\n }\n\n if (namedBindings && typescript.isNamespaceImport(namedBindings)) {\n names.add(namedBindings.name.text);\n }\n\n if (namedBindings && typescript.isNamedImports(namedBindings)) {\n for (const element of namedBindings.elements) {\n names.add(element.name.text);\n }\n }\n\n continue;\n }\n\n if (typescript.isVariableStatement(statement)) {\n for (const declaration of statement.declarationList.declarations) {\n if (typescript.isIdentifier(declaration.name)) {\n names.add(declaration.name.text);\n }\n }\n\n continue;\n }\n\n if (\n (typescript.isClassDeclaration(statement) ||\n typescript.isFunctionDeclaration(statement) ||\n typescript.isInterfaceDeclaration(statement) ||\n typescript.isTypeAliasDeclaration(statement) ||\n typescript.isEnumDeclaration(statement) ||\n typescript.isModuleDeclaration(statement)) &&\n statement.name &&\n typescript.isIdentifier(statement.name)\n ) {\n names.add(statement.name.text);\n }\n }\n\n return names;\n }\n\n private static isExported(opts: { typescript: TTypeScript; node: ts.Node }): boolean {\n const { typescript, node } = opts;\n const modifiers = typescript.canHaveModifiers(node) ? typescript.getModifiers(node) : undefined;\n\n return (\n modifiers?.some((modifier) => modifier.kind === typescript.SyntaxKind.ExportKeyword) === true\n );\n }\n\n /** The string values of a union, and its `null` or `undefined` members; the union must be string literals (and nullish) only. */\n private static readUnion(opts: { typescript: TTypeScript; node: ts.UnionTypeNode }): {\n values: string[];\n nullish: string[];\n } {\n const { typescript, node } = opts;\n const values: string[] = [];\n const nullish: string[] = [];\n\n for (const member of node.types) {\n if (typescript.isLiteralTypeNode(member) && typescript.isStringLiteral(member.literal)) {\n if (!values.includes(member.literal.text)) {\n values.push(member.literal.text);\n }\n\n continue;\n }\n\n if (member.kind === typescript.SyntaxKind.NullKeyword) {\n nullish.push('null');\n } else if (member.kind === typescript.SyntaxKind.UndefinedKeyword) {\n nullish.push('undefined');\n } else if (\n typescript.isLiteralTypeNode(member) &&\n member.literal.kind === typescript.SyntaxKind.NullKeyword\n ) {\n nullish.push('null');\n }\n }\n\n return { values, nullish };\n }\n\n /** At least two string literals, and nothing else but `null` or `undefined`. */\n private static isEnumerable(opts: { typescript: TTypeScript; node: ts.UnionTypeNode }): boolean {\n const { typescript, node } = opts;\n let literals = 0;\n\n for (const member of node.types) {\n if (typescript.isLiteralTypeNode(member) && typescript.isStringLiteral(member.literal)) {\n literals += 1;\n continue;\n }\n\n const isNullish =\n member.kind === typescript.SyntaxKind.UndefinedKeyword ||\n member.kind === typescript.SyntaxKind.NullKeyword ||\n (typescript.isLiteralTypeNode(member) &&\n member.literal.kind === typescript.SyntaxKind.NullKeyword);\n\n if (!isNullish) {\n return false;\n }\n }\n\n return literals >= 2;\n }\n\n private static checkPlan(opts: {\n className: string;\n typeName: string;\n members: Array<{ value: string; key: string }>;\n taken: Set<string>;\n mayRenameType: boolean;\n }): string | undefined {\n const { className, typeName, members, taken, mayRenameType } = opts;\n\n if (taken.has(className)) {\n return `the name ${className} is already used in this file`;\n }\n\n if (mayRenameType && taken.has(typeName)) {\n return `the name ${typeName} is already used in this file`;\n }\n\n const keys = new Set<string>();\n\n for (const { value, key } of members) {\n if (key === '') {\n return `no member name can be made from ${JSON.stringify(value)}`;\n }\n\n if (RESERVED_KEYS.has(key)) {\n return `${JSON.stringify(value)} would become the reserved member ${key}`;\n }\n\n if (keys.has(key)) {\n return `two values give the member ${key}`;\n }\n\n keys.add(key);\n }\n\n return undefined;\n }\n\n private static renderClass(opts: {\n className: string;\n typeName: string;\n members: Array<{ value: string; key: string }>;\n }): string {\n const { className, typeName, members } = opts;\n const quote = (value: string) => `'${value.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\")}'`;\n const lines = [\n `export class ${className} {`,\n ...members.map(({ value, key }) => ` static readonly ${key} = ${quote(value)};`),\n '',\n ` static readonly SCHEME_SET = new Set<string>([${members.map(({ key }) => `this.${key}`).join(', ')}]);`,\n '',\n ` static isValid(value: string): value is ${typeName} {`,\n ' return this.SCHEME_SET.has(value);',\n ' }',\n '}',\n ];\n\n return lines.join('\\n');\n }\n\n /** Reports every string-literal union of an exported declaration the codemod did not handle: it cannot name those. */\n private static findStrays(opts: {\n typescript: TTypeScript;\n statement: ts.Statement;\n handled: Set<ts.Node>;\n report: (node: ts.Node, reason: string) => void;\n }): void {\n const { typescript, statement, handled, report } = opts;\n\n const walk = (node: ts.Node): void => {\n if (typescript.isVariableDeclaration(node) && node.type) {\n // The annotation of an exported constant is not what the lint rule asks to name.\n if (node.initializer) {\n walk(node.initializer);\n }\n\n return;\n }\n\n if (typescript.isUnionTypeNode(node) && ConstClasses.isEnumerable({ typescript, node })) {\n if (!handled.has(node) && !ConstClasses.isKeySet({ typescript, node })) {\n report(\n node,\n 'a string-literal union in this position (a parameter, a return type, a generic or a nested type) has no name to give it; write the const class by hand',\n );\n }\n\n return;\n }\n\n typescript.forEachChild(node, walk);\n };\n\n walk(statement);\n }\n\n private static isKeySet(opts: { typescript: TTypeScript; node: ts.Node }): boolean {\n const { typescript, node } = opts;\n const parent = node.parent;\n\n if (typescript.isMappedTypeNode(parent) || typescript.isTypeOperatorNode(parent)) {\n return true;\n }\n\n if (\n typescript.isTypeParameterDeclaration(parent) &&\n typescript.isMappedTypeNode(parent.parent)\n ) {\n return true;\n }\n\n if (\n parent &&\n typescript.isTypeReferenceNode(parent) &&\n typescript.isIdentifier(parent.typeName) &&\n KEY_SET_TYPES.has(parent.typeName.text)\n ) {\n return true;\n }\n\n return false;\n }\n\n /** The edit that makes `TConstValue` available: nothing when the file has it, a specifier on an import from the same module, else a new import line. */\n private static planImport(opts: {\n typescript: TTypeScript;\n sourceFile: ts.SourceFile;\n importFrom: string;\n }): IEdit | undefined {\n const { typescript, sourceFile, importFrom } = opts;\n let lastImportEnd = 0;\n let sameModule: ts.ImportDeclaration | undefined;\n\n for (const statement of sourceFile.statements) {\n if (!typescript.isImportDeclaration(statement)) {\n continue;\n }\n\n lastImportEnd = statement.end;\n const bindings = statement.importClause?.namedBindings;\n\n if (bindings && typescript.isNamedImports(bindings)) {\n if (bindings.elements.some((element) => element.name.text === 'TConstValue')) {\n return undefined;\n }\n\n if (\n typescript.isStringLiteral(statement.moduleSpecifier) &&\n statement.moduleSpecifier.text === importFrom\n ) {\n sameModule = statement;\n }\n }\n }\n\n const bindings = sameModule?.importClause?.namedBindings;\n\n if (\n sameModule &&\n bindings &&\n typescript.isNamedImports(bindings) &&\n bindings.elements.length > 0\n ) {\n const last = bindings.elements[bindings.elements.length - 1];\n const typeOnly = sameModule.importClause?.isTypeOnly === true;\n\n return {\n start: last?.end ?? bindings.end,\n end: last?.end ?? bindings.end,\n text: typeOnly ? ', TConstValue' : ', type TConstValue',\n };\n }\n\n const line = `import type { TConstValue } from '${importFrom}';`;\n\n if (lastImportEnd > 0) {\n return { start: lastImportEnd, end: lastImportEnd, text: `\\n${line}` };\n }\n\n return { start: 0, end: 0, text: `${line}\\n\\n` };\n }\n}\n\nconst USAGE = `Usage: devz codemod const-classes [paths...] [--write | --check] [--map <file>] [--emit-map <file>] [--import-from <module>] [--include-tests]\n\nTurns a string-literal union in an exported declaration into a const class (SCHEME_SET, isValid) plus\n\\`TConstValue<typeof X>\\`, the shape the venizia/const-class-values lint rule asks for. It handles an\nexported type alias and a property of an exported interface or object type. The values stay the same,\nso every existing literal still type-checks and no call site changes.\n\nIt has to choose names: the class is the type name without its leading T, in the plural; a member is\nthe value in upper snake case. The dry run prints every proposal.\n\n --write write the changed files (without it, nothing is written)\n --check dry run that exits 1 while a union can be converted or is left untouched (for CI)\n --all with --write and no path: rewrite every source file under the working directory (--write needs a path or --all)\n --map <file> a JSON file of overrides, keyed by the id the dry run prints\n --emit-map <file> write the proposals as a mapping file to edit, then pass it with --map\n --import-from <m> where TConstValue is imported from (default ${DEFAULT_IMPORT_FROM})\n --include-tests also convert test files (skipped by default)\n --help print this text and exit\n\nA mapping entry: { \"src/a.ts#TMode\": { \"class\": \"Modes\", \"members\": { \"read-only\": \"READ_ONLY\" } } },\nor { \"skip\": true }. A union in a parameter, a return type, a generic or a nested type is reported as\nleft untouched: it has no name, so write that class by hand. Key sets (Pick, Omit, Extract, Exclude,\nRecord, mapped types) are not enumerable values and are never touched.`;\n\n/** A usage error: nothing was read or written. */\nconst USAGE_ERROR_CODE = 2;\n\nclass ConstClassFlags {\n static readonly WRITE = '--write';\n static readonly CHECK = '--check';\n static readonly ALL = '--all';\n static readonly MAP = '--map';\n static readonly EMIT_MAP = '--emit-map';\n static readonly IMPORT_FROM = '--import-from';\n static readonly INCLUDE_TESTS = '--include-tests';\n static readonly HELP = '--help';\n static readonly HELP_SHORT = '-h';\n\n static readonly SCHEME_SET = new Set<string>([\n this.WRITE,\n this.CHECK,\n this.ALL,\n this.MAP,\n this.EMIT_MAP,\n this.IMPORT_FROM,\n this.INCLUDE_TESTS,\n this.HELP,\n this.HELP_SHORT,\n ]);\n\n /** The flags that take a value. */\n static readonly WITH_VALUE = new Set<string>([this.MAP, this.EMIT_MAP, this.IMPORT_FROM]);\n\n static isValid(value: string): boolean {\n return this.SCHEME_SET.has(value);\n }\n}\n\n/** `devz codemod const-classes [paths...] [--write | --check]`. */\nexport class ConstClassesCommand {\n static readonly USAGE = USAGE;\n\n static async run(opts: { root: string; args: string[] }): Promise<number> {\n const { root, args } = opts;\n\n if (args.includes(ConstClassFlags.HELP) || args.includes(ConstClassFlags.HELP_SHORT)) {\n console.log(USAGE);\n\n return 0;\n }\n\n const flags: string[] = [];\n const paths: string[] = [];\n const values = new Map<string, string>();\n\n for (let index = 0; index < args.length; index += 1) {\n const argument = args[index] ?? '';\n const [name, inline] = argument.startsWith('--') ? argument.split(/=(.*)/s) : [argument];\n\n if (name !== undefined && ConstClassFlags.WITH_VALUE.has(name)) {\n const value = inline ?? args[index + 1];\n\n if (inline === undefined) {\n index += 1;\n }\n\n if (!value || value.startsWith('-')) {\n console.error(`devz codemod: ${name} needs a value\\n${USAGE}`);\n\n return USAGE_ERROR_CODE;\n }\n\n values.set(name, value);\n continue;\n }\n\n if (argument.startsWith('-')) {\n flags.push(argument);\n } else {\n paths.push(argument);\n }\n }\n\n const unknown = flags.filter((flag) => !ConstClassFlags.isValid(flag));\n\n if (unknown.length > 0) {\n console.error(\n `devz codemod: unknown option ${unknown.map((flag) => `\"${flag}\"`).join(', ')}\\n${USAGE}`,\n );\n\n return USAGE_ERROR_CODE;\n }\n\n const isWrite = flags.includes(ConstClassFlags.WRITE);\n const isCheck = flags.includes(ConstClassFlags.CHECK);\n\n const refusal = CodemodFiles.refusal({\n command: 'const-classes',\n isWrite,\n isAll: flags.includes(ConstClassFlags.ALL),\n paths,\n });\n\n if (refusal) {\n console.error(`${refusal}\\n${USAGE}`);\n\n return USAGE_ERROR_CODE;\n }\n\n const includeTests = flags.includes(ConstClassFlags.INCLUDE_TESTS);\n\n if (isWrite && isCheck) {\n console.error(\n `devz codemod: ${ConstClassFlags.WRITE} and ${ConstClassFlags.CHECK} contradict each other\\n${USAGE}`,\n );\n\n return USAGE_ERROR_CODE;\n }\n\n let overrides: TConstClassMap = {};\n const mapPath = values.get(ConstClassFlags.MAP);\n\n if (mapPath) {\n let parsed: unknown;\n\n try {\n parsed = JSON.parse(readFileSync(resolve(root, mapPath), 'utf8'));\n } catch (error) {\n console.error(\n `devz codemod: cannot read the mapping file ${mapPath}: ${error instanceof Error ? error.message : String(error)}`,\n );\n\n return USAGE_ERROR_CODE;\n }\n\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {\n console.error(\n `devz codemod: cannot read the mapping file ${mapPath}: the file must hold one JSON object`,\n );\n\n return USAGE_ERROR_CODE;\n }\n\n overrides = Object.fromEntries(Object.entries(parsed));\n }\n\n let typescript: TTypeScript;\n\n try {\n const result2 = await import('typescript');\n typescript = result2.default;\n } catch {\n console.error('devz codemod: the \"typescript\" package is required to read your sources');\n\n return 1;\n }\n\n const targets = (paths.length > 0 ? paths : ['.']).map((path) => resolve(root, path));\n const importFrom = values.get(ConstClassFlags.IMPORT_FROM);\n const emitted: TConstClassMap = {};\n let changedFiles = 0;\n let converted = 0;\n let untouchedCount = 0;\n\n for (const target of targets) {\n const files = CodemodFiles.collect({ target });\n\n if (files.length === 0 && paths.length > 0) {\n console.warn(\n `devz codemod: no source files under \"${relative(root, target) || target}\" (git ignores the path, or it holds none): nothing was read`,\n );\n }\n\n for (const file of files) {\n const relativePath = relative(root, file).split('\\\\').join('/');\n\n if (!includeTests && TEST_FILE_PATTERN.test(relativePath)) {\n continue;\n }\n\n const source = readFileSync(file, 'utf8');\n\n if (!UNION_TEXT.test(source)) {\n continue;\n }\n\n const result = ConstClasses.convert({\n typescript,\n fileName: file,\n source,\n relativePath,\n overrides,\n importFrom,\n });\n\n for (const item of result.untouched) {\n untouchedCount += 1;\n console.warn(`${relativePath}:${item.line}:${item.column} ${item.reason}`);\n }\n\n for (const proposal of result.proposals) {\n converted += 1;\n emitted[proposal.id] = {\n class: proposal.className,\n ...(proposal.id.split('#')[1]?.includes('.') ? { type: proposal.typeName } : {}),\n members: Object.fromEntries(proposal.members.map(({ value, key }) => [value, key])),\n };\n console.log(\n `${isWrite ? 'converted' : 'would convert'} ${relativePath}:${proposal.line} ${proposal.typeName} -> class ${proposal.className} { ${proposal.members.map(({ key, value }) => `${key} = '${value}'`).join(', ')} }` +\n ` [${proposal.id}]`,\n );\n }\n\n if (result.changed) {\n changedFiles += 1;\n\n if (isWrite) {\n writeFileSync(file, result.output);\n }\n }\n }\n }\n\n const emitPath = values.get(ConstClassFlags.EMIT_MAP);\n\n if (emitPath) {\n writeFileSync(resolve(root, emitPath), `${JSON.stringify(emitted, null, 2)}\\n`);\n console.log(\n `Wrote ${Object.keys(emitted).length} proposal(s) to ${emitPath}; edit it, then pass --map ${emitPath}.`,\n );\n }\n\n console.log(\n `devz codemod const-classes: ${converted} union(s) ${isWrite ? 'converted' : 'would be converted'} in ${changedFiles} file(s), ${untouchedCount} left untouched`,\n );\n\n if (!isWrite && changedFiles > 0) {\n console.log(\n `Nothing was written. Run again with ${ConstClassFlags.WRITE} to apply (add --map to rename), then run your typecheck and lint.`,\n );\n }\n\n return isCheck && (converted > 0 || untouchedCount > 0) ? 1 : 0;\n }\n}\n"]}