@thethracian/oxlint-config 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (279) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/README.md +125 -19
  3. package/dist/codemod-fix/cli.d.ts +3 -0
  4. package/dist/codemod-fix/cli.d.ts.map +1 -0
  5. package/dist/codemod-fix/cli.js +22 -0
  6. package/dist/codemod-fix/cli.js.map +1 -0
  7. package/dist/codemod-fix/index.d.ts +44 -0
  8. package/dist/codemod-fix/index.d.ts.map +1 -0
  9. package/dist/codemod-fix/index.js +110 -0
  10. package/dist/codemod-fix/index.js.map +1 -0
  11. package/dist/codemods/arrow-body-style.d.ts +7 -0
  12. package/dist/codemods/arrow-body-style.d.ts.map +1 -0
  13. package/dist/codemods/arrow-body-style.js +106 -0
  14. package/dist/codemods/arrow-body-style.js.map +1 -0
  15. package/dist/codemods/comment-format.d.ts +24 -0
  16. package/dist/codemods/comment-format.d.ts.map +1 -0
  17. package/dist/codemods/comment-format.js +100 -0
  18. package/dist/codemods/comment-format.js.map +1 -0
  19. package/dist/codemods/explicit-return-types.d.ts +7 -0
  20. package/dist/codemods/explicit-return-types.d.ts.map +1 -0
  21. package/dist/codemods/explicit-return-types.js +350 -0
  22. package/dist/codemods/explicit-return-types.js.map +1 -0
  23. package/dist/codemods/format-file-header.d.ts +7 -0
  24. package/dist/codemods/format-file-header.d.ts.map +1 -0
  25. package/dist/codemods/format-file-header.js +163 -0
  26. package/dist/codemods/format-file-header.js.map +1 -0
  27. package/dist/codemods/format-jsdoc-comments.d.ts +7 -0
  28. package/dist/codemods/format-jsdoc-comments.d.ts.map +1 -0
  29. package/dist/codemods/format-jsdoc-comments.js +129 -0
  30. package/dist/codemods/format-jsdoc-comments.js.map +1 -0
  31. package/dist/codemods/function-declarations.d.ts +7 -0
  32. package/dist/codemods/function-declarations.d.ts.map +1 -0
  33. package/dist/codemods/function-declarations.js +202 -0
  34. package/dist/codemods/function-declarations.js.map +1 -0
  35. package/dist/codemods/inline-export-lists.d.ts +7 -0
  36. package/dist/codemods/inline-export-lists.d.ts.map +1 -0
  37. package/dist/codemods/inline-export-lists.js +168 -0
  38. package/dist/codemods/inline-export-lists.js.map +1 -0
  39. package/dist/codemods/internal-export-docs.d.ts +7 -0
  40. package/dist/codemods/internal-export-docs.d.ts.map +1 -0
  41. package/dist/codemods/internal-export-docs.js +93 -0
  42. package/dist/codemods/internal-export-docs.js.map +1 -0
  43. package/dist/codemods/no-ternary-branch-initializers.d.ts +14 -0
  44. package/dist/codemods/no-ternary-branch-initializers.d.ts.map +1 -0
  45. package/dist/codemods/no-ternary-branch-initializers.js +240 -0
  46. package/dist/codemods/no-ternary-branch-initializers.js.map +1 -0
  47. package/dist/codemods/no-ternary-variable-initializers.d.ts +14 -0
  48. package/dist/codemods/no-ternary-variable-initializers.d.ts.map +1 -0
  49. package/dist/codemods/no-ternary-variable-initializers.js +235 -0
  50. package/dist/codemods/no-ternary-variable-initializers.js.map +1 -0
  51. package/dist/codemods/no-ternary.d.ts +7 -0
  52. package/dist/codemods/no-ternary.d.ts.map +1 -0
  53. package/dist/codemods/no-ternary.js +215 -0
  54. package/dist/codemods/no-ternary.js.map +1 -0
  55. package/dist/codemods/rename-acronyms.d.ts +8 -0
  56. package/dist/codemods/rename-acronyms.d.ts.map +1 -0
  57. package/dist/codemods/rename-acronyms.js +193 -0
  58. package/dist/codemods/rename-acronyms.js.map +1 -0
  59. package/dist/codemods/run.d.ts +2 -0
  60. package/dist/codemods/run.d.ts.map +1 -0
  61. package/dist/codemods/run.js +14 -0
  62. package/dist/codemods/run.js.map +1 -0
  63. package/dist/codemods/sort-imports.d.ts +7 -0
  64. package/dist/codemods/sort-imports.d.ts.map +1 -0
  65. package/dist/codemods/sort-imports.js +235 -0
  66. package/dist/codemods/sort-imports.js.map +1 -0
  67. package/dist/index.d.ts +30 -96
  68. package/dist/index.d.ts.map +1 -1
  69. package/dist/index.js +157 -95
  70. package/dist/index.js.map +1 -1
  71. package/dist/rules/acronym-case.d.ts +7 -3
  72. package/dist/rules/acronym-case.d.ts.map +1 -1
  73. package/dist/rules/acronym-case.js +129 -120
  74. package/dist/rules/acronym-case.js.map +1 -1
  75. package/dist/rules/acronyms-1.d.ts +3 -0
  76. package/dist/rules/acronyms-1.d.ts.map +1 -0
  77. package/dist/rules/acronyms-1.js +407 -0
  78. package/dist/rules/acronyms-1.js.map +1 -0
  79. package/dist/rules/acronyms-2.d.ts +3 -0
  80. package/dist/rules/acronyms-2.d.ts.map +1 -0
  81. package/dist/rules/acronyms-2.js +407 -0
  82. package/dist/rules/acronyms-2.js.map +1 -0
  83. package/dist/rules/acronyms-3.d.ts +3 -0
  84. package/dist/rules/acronyms-3.d.ts.map +1 -0
  85. package/dist/rules/acronyms-3.js +407 -0
  86. package/dist/rules/acronyms-3.js.map +1 -0
  87. package/dist/rules/acronyms-4.d.ts +3 -0
  88. package/dist/rules/acronyms-4.d.ts.map +1 -0
  89. package/dist/rules/acronyms-4.js +377 -0
  90. package/dist/rules/acronyms-4.js.map +1 -0
  91. package/dist/rules/acronyms.d.ts +1 -8
  92. package/dist/rules/acronyms.d.ts.map +1 -1
  93. package/dist/rules/acronyms.js +14 -1578
  94. package/dist/rules/acronyms.js.map +1 -1
  95. package/dist/rules/boolean-prefix.d.ts +11 -2
  96. package/dist/rules/boolean-prefix.d.ts.map +1 -1
  97. package/dist/rules/boolean-prefix.js +95 -59
  98. package/dist/rules/boolean-prefix.js.map +1 -1
  99. package/dist/rules/camel-case-identifiers.d.ts +3 -4
  100. package/dist/rules/camel-case-identifiers.d.ts.map +1 -1
  101. package/dist/rules/camel-case-identifiers.js +59 -40
  102. package/dist/rules/camel-case-identifiers.js.map +1 -1
  103. package/dist/rules/char-class.d.ts +26 -13
  104. package/dist/rules/char-class.d.ts.map +1 -1
  105. package/dist/rules/char-class.js +56 -24
  106. package/dist/rules/char-class.js.map +1 -1
  107. package/dist/rules/diagnostic-guidance.d.ts +91 -0
  108. package/dist/rules/diagnostic-guidance.d.ts.map +1 -0
  109. package/dist/rules/diagnostic-guidance.js +243 -0
  110. package/dist/rules/diagnostic-guidance.js.map +1 -0
  111. package/dist/rules/effect-default-ast.d.ts +89 -0
  112. package/dist/rules/effect-default-ast.d.ts.map +1 -0
  113. package/dist/rules/effect-default-ast.js +208 -0
  114. package/dist/rules/effect-default-ast.js.map +1 -0
  115. package/dist/rules/effect-default-compat-rules.d.ts +76 -0
  116. package/dist/rules/effect-default-compat-rules.d.ts.map +1 -0
  117. package/dist/rules/effect-default-compat-rules.js +270 -0
  118. package/dist/rules/effect-default-compat-rules.js.map +1 -0
  119. package/dist/rules/effect-default-env-rules.d.ts +60 -0
  120. package/dist/rules/effect-default-env-rules.d.ts.map +1 -0
  121. package/dist/rules/effect-default-env-rules.js +259 -0
  122. package/dist/rules/effect-default-env-rules.js.map +1 -0
  123. package/dist/rules/effect-default-fiber-helpers.d.ts +13 -0
  124. package/dist/rules/effect-default-fiber-helpers.d.ts.map +1 -0
  125. package/dist/rules/effect-default-fiber-helpers.js +76 -0
  126. package/dist/rules/effect-default-fiber-helpers.js.map +1 -0
  127. package/dist/rules/effect-default-floating-helpers.d.ts +7 -0
  128. package/dist/rules/effect-default-floating-helpers.d.ts.map +1 -0
  129. package/dist/rules/effect-default-floating-helpers.js +113 -0
  130. package/dist/rules/effect-default-floating-helpers.js.map +1 -0
  131. package/dist/rules/effect-default-helpers.d.ts +8 -32
  132. package/dist/rules/effect-default-helpers.d.ts.map +1 -1
  133. package/dist/rules/effect-default-helpers.js +11 -458
  134. package/dist/rules/effect-default-helpers.js.map +1 -1
  135. package/dist/rules/effect-default-resource-helpers.d.ts +18 -4
  136. package/dist/rules/effect-default-resource-helpers.d.ts.map +1 -1
  137. package/dist/rules/effect-default-resource-helpers.js +30 -13
  138. package/dist/rules/effect-default-resource-helpers.js.map +1 -1
  139. package/dist/rules/effect-default-safety-helpers.d.ts +43 -0
  140. package/dist/rules/effect-default-safety-helpers.d.ts.map +1 -0
  141. package/dist/rules/effect-default-safety-helpers.js +126 -0
  142. package/dist/rules/effect-default-safety-helpers.js.map +1 -0
  143. package/dist/rules/effect-default-scan-helpers.d.ts +43 -0
  144. package/dist/rules/effect-default-scan-helpers.d.ts.map +1 -0
  145. package/dist/rules/effect-default-scan-helpers.js +141 -0
  146. package/dist/rules/effect-default-scan-helpers.js.map +1 -0
  147. package/dist/rules/effect-default-schema-helpers.d.ts +37 -0
  148. package/dist/rules/effect-default-schema-helpers.d.ts.map +1 -0
  149. package/dist/rules/effect-default-schema-helpers.js +104 -0
  150. package/dist/rules/effect-default-schema-helpers.js.map +1 -0
  151. package/dist/rules/effect-default-test-helpers.d.ts +18 -4
  152. package/dist/rules/effect-default-test-helpers.d.ts.map +1 -1
  153. package/dist/rules/effect-default-test-helpers.js +41 -20
  154. package/dist/rules/effect-default-test-helpers.js.map +1 -1
  155. package/dist/rules/effect-default-workflow-helpers.d.ts +91 -0
  156. package/dist/rules/effect-default-workflow-helpers.d.ts.map +1 -0
  157. package/dist/rules/effect-default-workflow-helpers.js +247 -0
  158. package/dist/rules/effect-default-workflow-helpers.js.map +1 -0
  159. package/dist/rules/effect-default.d.ts +1 -1
  160. package/dist/rules/effect-default.d.ts.map +1 -1
  161. package/dist/rules/effect-default.js +198 -637
  162. package/dist/rules/effect-default.js.map +1 -1
  163. package/dist/rules/effect-exported-declarations.d.ts +19 -0
  164. package/dist/rules/effect-exported-declarations.d.ts.map +1 -0
  165. package/dist/rules/effect-exported-declarations.js +237 -0
  166. package/dist/rules/effect-exported-declarations.js.map +1 -0
  167. package/dist/rules/effect-path-options.d.ts +49 -11
  168. package/dist/rules/effect-path-options.d.ts.map +1 -1
  169. package/dist/rules/effect-path-options.js +85 -52
  170. package/dist/rules/effect-path-options.js.map +1 -1
  171. package/dist/rules/effect-rule-aliases.d.ts +55 -0
  172. package/dist/rules/effect-rule-aliases.d.ts.map +1 -0
  173. package/dist/rules/effect-rule-aliases.js +278 -0
  174. package/dist/rules/effect-rule-aliases.js.map +1 -0
  175. package/dist/rules/effect-rule-core.d.ts +46 -24
  176. package/dist/rules/effect-rule-core.d.ts.map +1 -1
  177. package/dist/rules/effect-rule-core.js +263 -303
  178. package/dist/rules/effect-rule-core.js.map +1 -1
  179. package/dist/rules/effect-rule-names.d.ts +12 -3
  180. package/dist/rules/effect-rule-names.d.ts.map +1 -1
  181. package/dist/rules/effect-rule-names.js +15 -3
  182. package/dist/rules/effect-rule-names.js.map +1 -1
  183. package/dist/rules/effect-source-comments.d.ts +7 -0
  184. package/dist/rules/effect-source-comments.d.ts.map +1 -0
  185. package/dist/rules/effect-source-comments.js +227 -0
  186. package/dist/rules/effect-source-comments.js.map +1 -0
  187. package/dist/rules/effect-source-helpers.d.ts +4 -9
  188. package/dist/rules/effect-source-helpers.d.ts.map +1 -1
  189. package/dist/rules/effect-source-helpers.js +7 -333
  190. package/dist/rules/effect-source-helpers.js.map +1 -1
  191. package/dist/rules/effect-source-navigation.d.ts +25 -0
  192. package/dist/rules/effect-source-navigation.d.ts.map +1 -0
  193. package/dist/rules/effect-source-navigation.js +244 -0
  194. package/dist/rules/effect-source-navigation.js.map +1 -0
  195. package/dist/rules/effect-source-scan.d.ts +30 -7
  196. package/dist/rules/effect-source-scan.d.ts.map +1 -1
  197. package/dist/rules/effect-source-scan.js +377 -297
  198. package/dist/rules/effect-source-scan.js.map +1 -1
  199. package/dist/rules/effect-strict-ast-specs.d.ts +8 -0
  200. package/dist/rules/effect-strict-ast-specs.d.ts.map +1 -0
  201. package/dist/rules/effect-strict-ast-specs.js +166 -0
  202. package/dist/rules/effect-strict-ast-specs.js.map +1 -0
  203. package/dist/rules/effect-strict-boundary-helpers.d.ts +25 -0
  204. package/dist/rules/effect-strict-boundary-helpers.d.ts.map +1 -0
  205. package/dist/rules/effect-strict-boundary-helpers.js +127 -0
  206. package/dist/rules/effect-strict-boundary-helpers.js.map +1 -0
  207. package/dist/rules/effect-strict-core-specs.d.ts +8 -0
  208. package/dist/rules/effect-strict-core-specs.d.ts.map +1 -0
  209. package/dist/rules/effect-strict-core-specs.js +334 -0
  210. package/dist/rules/effect-strict-core-specs.js.map +1 -0
  211. package/dist/rules/effect-strict-external-helpers.d.ts +25 -0
  212. package/dist/rules/effect-strict-external-helpers.d.ts.map +1 -0
  213. package/dist/rules/effect-strict-external-helpers.js +87 -0
  214. package/dist/rules/effect-strict-external-helpers.js.map +1 -0
  215. package/dist/rules/effect-strict-helpers.d.ts +75 -33
  216. package/dist/rules/effect-strict-helpers.d.ts.map +1 -1
  217. package/dist/rules/effect-strict-helpers.js +124 -246
  218. package/dist/rules/effect-strict-helpers.js.map +1 -1
  219. package/dist/rules/effect-strict-internals.d.ts +198 -0
  220. package/dist/rules/effect-strict-internals.d.ts.map +1 -0
  221. package/dist/rules/effect-strict-internals.js +477 -0
  222. package/dist/rules/effect-strict-internals.js.map +1 -0
  223. package/dist/rules/effect-strict-segment-helpers.d.ts +79 -0
  224. package/dist/rules/effect-strict-segment-helpers.d.ts.map +1 -0
  225. package/dist/rules/effect-strict-segment-helpers.js +308 -0
  226. package/dist/rules/effect-strict-segment-helpers.js.map +1 -0
  227. package/dist/rules/effect-strict.d.ts +1 -1
  228. package/dist/rules/effect-strict.d.ts.map +1 -1
  229. package/dist/rules/effect-strict.js +10 -661
  230. package/dist/rules/effect-strict.js.map +1 -1
  231. package/dist/rules/max-import-depth.d.ts +2 -2
  232. package/dist/rules/max-import-depth.d.ts.map +1 -1
  233. package/dist/rules/max-import-depth.js +52 -17
  234. package/dist/rules/max-import-depth.js.map +1 -1
  235. package/dist/rules/max-line-length.d.ts +9 -2
  236. package/dist/rules/max-line-length.d.ts.map +1 -1
  237. package/dist/rules/max-line-length.js +62 -7
  238. package/dist/rules/max-line-length.js.map +1 -1
  239. package/dist/rules/no-commented-out-code.d.ts +3 -7
  240. package/dist/rules/no-commented-out-code.d.ts.map +1 -1
  241. package/dist/rules/no-commented-out-code.js +157 -102
  242. package/dist/rules/no-commented-out-code.js.map +1 -1
  243. package/dist/rules/pascal-case-types.d.ts +1 -1
  244. package/dist/rules/pascal-case-types.d.ts.map +1 -1
  245. package/dist/rules/pascal-case-types.js +65 -46
  246. package/dist/rules/pascal-case-types.js.map +1 -1
  247. package/dist/rules/plugin-commented-out-code-rule.d.ts +32 -0
  248. package/dist/rules/plugin-commented-out-code-rule.d.ts.map +1 -0
  249. package/dist/rules/plugin-commented-out-code-rule.js +135 -0
  250. package/dist/rules/plugin-commented-out-code-rule.js.map +1 -0
  251. package/dist/rules/plugin.d.ts +3 -121
  252. package/dist/rules/plugin.d.ts.map +1 -1
  253. package/dist/rules/plugin.js +195 -201
  254. package/dist/rules/plugin.js.map +1 -1
  255. package/dist/rules/private-underscore.d.ts +1 -1
  256. package/dist/rules/private-underscore.d.ts.map +1 -1
  257. package/dist/rules/private-underscore.js +11 -4
  258. package/dist/rules/private-underscore.js.map +1 -1
  259. package/dist/rules/require-file-doc.d.ts +5 -6
  260. package/dist/rules/require-file-doc.d.ts.map +1 -1
  261. package/dist/rules/require-file-doc.js +127 -78
  262. package/dist/rules/require-file-doc.js.map +1 -1
  263. package/dist/rules/require-function-doc-ignored-text.d.ts +7 -0
  264. package/dist/rules/require-function-doc-ignored-text.d.ts.map +1 -0
  265. package/dist/rules/require-function-doc-ignored-text.js +67 -0
  266. package/dist/rules/require-function-doc-ignored-text.js.map +1 -0
  267. package/dist/rules/require-function-doc-local-exports.d.ts +7 -0
  268. package/dist/rules/require-function-doc-local-exports.d.ts.map +1 -0
  269. package/dist/rules/require-function-doc-local-exports.js +114 -0
  270. package/dist/rules/require-function-doc-local-exports.js.map +1 -0
  271. package/dist/rules/require-function-doc.d.ts +3 -18
  272. package/dist/rules/require-function-doc.d.ts.map +1 -1
  273. package/dist/rules/require-function-doc.js +404 -218
  274. package/dist/rules/require-function-doc.js.map +1 -1
  275. package/dist/rules/source-cache.d.ts +19 -0
  276. package/dist/rules/source-cache.d.ts.map +1 -0
  277. package/dist/rules/source-cache.js +63 -0
  278. package/dist/rules/source-cache.js.map +1 -0
  279. package/package.json +15 -10
@@ -0,0 +1,100 @@
1
+ /* -------------------------------------------------------------------------- */
2
+ /* Reusable comment formatting helpers for codemod output. */
3
+ /* -------------------------------------------------------------------------- */
4
+ const dividerLength = 80;
5
+ const dividerFiller = '-';
6
+ const jsdocTextWidth = 100;
7
+ const blockLeft = '/* ';
8
+ const blockRight = ' */';
9
+ const jsdocOpen = '/**';
10
+ const jsdocClose = ' */';
11
+ const repeat = (value, count) => value.repeat(Math.max(0, count));
12
+ const dividerInnerWidth = () => dividerLength - blockLeft.length - blockRight.length;
13
+ const solidDividerLine = () => `${blockLeft}${repeat(dividerFiller, dividerInnerWidth())}${blockRight}`;
14
+ const centeredText = (text, width) => {
15
+ const remaining = Math.max(0, width - text.length);
16
+ const left = Math.floor(remaining / 2);
17
+ const right = remaining - left;
18
+ return `${repeat(' ', left)}${text}${repeat(' ', right)}`;
19
+ };
20
+ const capitalizedDividerText = (text) => {
21
+ const trimmed = text.trimStart();
22
+ const indent = text.slice(0, text.length - trimmed.length);
23
+ return `${indent}${trimmed.charAt(0).toUpperCase()}${trimmed.slice(1)}`;
24
+ };
25
+ const centeredDividerText = (text) => centeredText(capitalizedDividerText(text), dividerInnerWidth());
26
+ const dividerTextLines = (text) => wrapTextToWidth(text, dividerInnerWidth());
27
+ const nextWrappedLine = (line, word) => {
28
+ if (line) {
29
+ return `${line} ${word}`;
30
+ }
31
+ return word;
32
+ };
33
+ const wrapText = (text) => wrapTextToWidth(text, jsdocTextWidth);
34
+ const wrapTextToWidth = (text, width) => {
35
+ if (text.length <= width) {
36
+ return [text];
37
+ }
38
+ const lines = [];
39
+ let line = '';
40
+ for (const word of text.split(' ')) {
41
+ line = appendWrappedWordToWidth(lines, line, word, width);
42
+ }
43
+ if (line) {
44
+ lines.push(line);
45
+ }
46
+ return lines;
47
+ };
48
+ const appendWrappedWordToWidth = (lines, line, word, width) => {
49
+ const nextLine = nextWrappedLine(line, word);
50
+ if (nextLine.length > width && line) {
51
+ lines.push(line);
52
+ return word;
53
+ }
54
+ return nextLine;
55
+ };
56
+ const pushJSDocTextLines = (lines, text) => {
57
+ for (const wrappedLine of wrapText(text)) {
58
+ lines.push(` * ${wrappedLine}`);
59
+ }
60
+ };
61
+ /**
62
+ * Formats a classic multi-line JSDoc block.
63
+ *
64
+ * @internal
65
+ */
66
+ export const formatJSDoc = (input) => {
67
+ const lines = [jsdocOpen];
68
+ pushJSDocTextLines(lines, input.summary);
69
+ if (input.tags && input.tags.length > 0) {
70
+ lines.push(' *');
71
+ for (const tag of input.tags) {
72
+ pushJSDocTextLines(lines, tag);
73
+ }
74
+ }
75
+ lines.push(jsdocClose);
76
+ return `${lines.join('\n')}\n`;
77
+ };
78
+ /**
79
+ * Formats a three-line fixed-width section header.
80
+ *
81
+ * @internal
82
+ */
83
+ export const formatMainHeader = (text) => [
84
+ solidDividerLine(),
85
+ ...dividerTextLines(text).map((line) => `${blockLeft}${centeredDividerText(line)}${blockRight}`),
86
+ solidDividerLine(),
87
+ ].join('\n');
88
+ /**
89
+ * Formats a one-line fixed-width section header.
90
+ *
91
+ * @internal
92
+ */
93
+ export const formatSubheader = (text) => {
94
+ const words = ` ${text} `;
95
+ const remaining = Math.max(0, dividerInnerWidth() - words.length);
96
+ const left = Math.floor(remaining / 2);
97
+ const right = remaining - left;
98
+ return `${blockLeft}${repeat(dividerFiller, left)}${words}${repeat(dividerFiller, right)}${blockRight}`;
99
+ };
100
+ //# sourceMappingURL=comment-format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comment-format.js","sourceRoot":"","sources":["../../src/codemods/comment-format.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Internal helper exported for package-local composition.
3
+ *
4
+ * @internal
5
+ */
6
+ export declare const addVoidReturnTypes: (source: string) => string;
7
+ //# sourceMappingURL=explicit-return-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"explicit-return-types.d.ts","sourceRoot":"","sources":["../../src/codemods/explicit-return-types.ts"],"names":[],"mappings":"AA+cA;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,GAAI,QAAQ,MAAM,KAAG,MACY,CAAC"}
@@ -0,0 +1,350 @@
1
+ import jscodeshift from 'jscodeshift';
2
+ const codemodAPI = jscodeshift.withParser('ts');
3
+ const CHAR_CODE_UPPER_A = 65;
4
+ const CHAR_CODE_UPPER_Z = 90;
5
+ const CAN_PREFIX_LENGTH = 3;
6
+ const HAS_PREFIX_LENGTH = 3;
7
+ const IS_PREFIX_LENGTH = 2;
8
+ const SHOULD_PREFIX_LENGTH = 6;
9
+ const isObjectRecord = (value) => typeof value === 'object' && value !== null;
10
+ const applyReplacements = (source, replacements) => [...replacements]
11
+ .sort((left, right) => right.start - left.start)
12
+ .reduce((current, replacement) => current.slice(0, replacement.start) + replacement.text + current.slice(replacement.end), source);
13
+ const nodeStart = (node) => {
14
+ if (isObjectRecord(node)) {
15
+ const { start } = node;
16
+ if (typeof start === 'number') {
17
+ return start;
18
+ }
19
+ }
20
+ throw new Error('jscodeshift node is missing a start offset');
21
+ };
22
+ const nodeEnd = (node) => {
23
+ if (isObjectRecord(node)) {
24
+ const { end } = node;
25
+ if (typeof end === 'number') {
26
+ return end;
27
+ }
28
+ }
29
+ throw new Error('jscodeshift node is missing an end offset');
30
+ };
31
+ const sourceForNode = (source, node) => source.slice(nodeStart(node), nodeEnd(node));
32
+ const isExpressionLike = (value) => isObjectRecord(value) && typeof value.type === 'string';
33
+ const isFunctionLikeNode = (node) => isObjectRecord(node) &&
34
+ (node.type === 'ArrowFunctionExpression' ||
35
+ node.type === 'FunctionDeclaration' ||
36
+ node.type === 'FunctionExpression' ||
37
+ node.type === 'ObjectMethod');
38
+ const nestedSearch = (search) => ({
39
+ isRoot: false,
40
+ seen: search.seen,
41
+ });
42
+ const canScanReturnRecord = (value, search) => {
43
+ if (search.seen.has(value)) {
44
+ return false;
45
+ }
46
+ search.seen.add(value);
47
+ return search.isRoot || !isFunctionLikeNode(value);
48
+ };
49
+ const hasDirectReturnValueInRecord = (value, search) => {
50
+ if (!canScanReturnRecord(value, search)) {
51
+ return false;
52
+ }
53
+ if (value.type === 'ReturnStatement' && value.argument) {
54
+ return true;
55
+ }
56
+ return Object.values(value).some((entry) => hasDirectReturnValue(entry, nestedSearch(search)));
57
+ };
58
+ const hasDirectReturnValue = (value, search) => {
59
+ if (Array.isArray(value)) {
60
+ return value.some((entry) => hasDirectReturnValue(entry, nestedSearch(search)));
61
+ }
62
+ if (!isObjectRecord(value)) {
63
+ return false;
64
+ }
65
+ return hasDirectReturnValueInRecord(value, search);
66
+ };
67
+ const hasReturnValue = (node) => hasDirectReturnValue(node, { isRoot: true, seen: new WeakSet() });
68
+ const isAsync = (node) => node.async === true;
69
+ const isIdentifier = (node) => isObjectRecord(node) && node.type === 'Identifier' && typeof node.name === 'string';
70
+ const objectPropertyName = (node) => {
71
+ if (!isObjectRecord(node) || node.type !== 'ObjectProperty') {
72
+ return undefined;
73
+ }
74
+ const { key } = node;
75
+ if (isIdentifier(key)) {
76
+ return key.name;
77
+ }
78
+ if (isObjectRecord(key) && key.type === 'StringLiteral' && typeof key.value === 'string') {
79
+ return key.value;
80
+ }
81
+ return undefined;
82
+ };
83
+ const objectPropertyValue = (node) => {
84
+ if (!isObjectRecord(node)) {
85
+ return undefined;
86
+ }
87
+ const { value } = node;
88
+ if (isFunctionLikeNode(value)) {
89
+ return value;
90
+ }
91
+ return undefined;
92
+ };
93
+ const functionKey = (node) => `${nodeStart(node)}:${nodeEnd(node)}`;
94
+ const collectObjectPropertyNames = (source) => {
95
+ const names = new Map();
96
+ codemodAPI(source)
97
+ .find(codemodAPI.ObjectProperty)
98
+ .forEach((path) => {
99
+ const value = objectPropertyValue(path.value);
100
+ const name = objectPropertyName(path.value);
101
+ if (value && name) {
102
+ names.set(functionKey(value), name);
103
+ }
104
+ });
105
+ return names;
106
+ };
107
+ const hasUppercaseAt = (text, index) => {
108
+ const code = text.charCodeAt(index);
109
+ return code >= CHAR_CODE_UPPER_A && code <= CHAR_CODE_UPPER_Z;
110
+ };
111
+ const startsWithPredicatePrefix = (text) => (text.startsWith('has') && hasUppercaseAt(text, HAS_PREFIX_LENGTH)) ||
112
+ (text.startsWith('is') && hasUppercaseAt(text, IS_PREFIX_LENGTH)) ||
113
+ (text.startsWith('should') && hasUppercaseAt(text, SHOULD_PREFIX_LENGTH)) ||
114
+ (text.startsWith('can') && hasUppercaseAt(text, CAN_PREFIX_LENGTH));
115
+ const isPredicateCall = (expression) => {
116
+ if (!isObjectRecord(expression)) {
117
+ return false;
118
+ }
119
+ const { callee } = expression;
120
+ if (!isObjectRecord(callee)) {
121
+ return false;
122
+ }
123
+ if (callee.type === 'MemberExpression' && isIdentifier(callee.property)) {
124
+ return callee.property.name === 'test';
125
+ }
126
+ if (callee.type === 'Identifier' && typeof callee.name === 'string') {
127
+ return startsWithPredicatePrefix(callee.name);
128
+ }
129
+ return false;
130
+ };
131
+ const isComparisonOperator = (operator) => operator === '===' ||
132
+ operator === '!==' ||
133
+ operator === '>' ||
134
+ operator === '>=' ||
135
+ operator === '<' ||
136
+ operator === '<=';
137
+ const isBooleanLogicalOperator = (operator) => operator === '&&' || operator === '||';
138
+ const expressionOperator = (expression) => {
139
+ if (!isObjectRecord(expression)) {
140
+ return undefined;
141
+ }
142
+ const { operator } = expression;
143
+ if (typeof operator === 'string') {
144
+ return operator;
145
+ }
146
+ return undefined;
147
+ };
148
+ const expressionSide = (expression, key) => {
149
+ if (!isObjectRecord(expression)) {
150
+ return undefined;
151
+ }
152
+ const value = expression[key];
153
+ if (isExpressionLike(value)) {
154
+ return value;
155
+ }
156
+ return undefined;
157
+ };
158
+ const isBooleanLogicalExpression = (expression) => {
159
+ const left = expressionSide(expression, 'left');
160
+ const right = expressionSide(expression, 'right');
161
+ const operator = expressionOperator(expression);
162
+ return Boolean(operator &&
163
+ isBooleanLogicalOperator(operator) &&
164
+ left &&
165
+ right &&
166
+ isBooleanExpression(left) &&
167
+ isBooleanExpression(right));
168
+ };
169
+ const isBooleanExpression = (expression) => {
170
+ if (expression.type === 'BooleanLiteral') {
171
+ return true;
172
+ }
173
+ if (expression.type === 'UnaryExpression' && expressionOperator(expression) === '!') {
174
+ return true;
175
+ }
176
+ if (expression.type === 'BinaryExpression') {
177
+ return isComparisonOperator(expressionOperator(expression) ?? '');
178
+ }
179
+ if (expression.type === 'LogicalExpression') {
180
+ return isBooleanLogicalExpression(expression);
181
+ }
182
+ return expression.type === 'CallExpression' && isPredicateCall(expression);
183
+ };
184
+ const primitiveLiteralReturnType = (expression) => {
185
+ if (expression.type === 'StringLiteral') {
186
+ return ': string';
187
+ }
188
+ if (expression.type === 'NumericLiteral') {
189
+ return ': number';
190
+ }
191
+ if (expression.type === 'BooleanLiteral') {
192
+ return ': boolean';
193
+ }
194
+ return undefined;
195
+ };
196
+ const parameterTypeText = (source, parameter) => {
197
+ if (parameter.type !== 'Identifier' || !isObjectRecord(parameter)) {
198
+ return undefined;
199
+ }
200
+ const { typeAnnotation } = parameter;
201
+ if (!typeAnnotation) {
202
+ return undefined;
203
+ }
204
+ return sourceForNode(source, typeAnnotation).trim();
205
+ };
206
+ const stringParameterNames = (source, node) => new Set(node.params.flatMap((parameter) => {
207
+ if (isIdentifier(parameter) && parameterTypeText(source, parameter) === ': string') {
208
+ return [parameter.name];
209
+ }
210
+ return [];
211
+ }));
212
+ const stringMethodName = (expression) => {
213
+ if (expression.type !== 'CallExpression' || !isObjectRecord(expression)) {
214
+ return undefined;
215
+ }
216
+ const { callee } = expression;
217
+ if (!isObjectRecord(callee) || callee.type !== 'MemberExpression') {
218
+ return undefined;
219
+ }
220
+ const { property } = callee;
221
+ if (!isIdentifier(property)) {
222
+ return undefined;
223
+ }
224
+ return property.name;
225
+ };
226
+ const stringMethodReceiver = (expression) => {
227
+ if (expression.type !== 'CallExpression' || !isObjectRecord(expression)) {
228
+ return undefined;
229
+ }
230
+ const { callee } = expression;
231
+ if (!isObjectRecord(callee) || callee.type !== 'MemberExpression') {
232
+ return undefined;
233
+ }
234
+ return callee.object;
235
+ };
236
+ const isStringReturningMethod = (name) => name === 'slice' || name === 'toLowerCase' || name === 'toUpperCase' || name === 'trim';
237
+ const stringMethodReturnType = (source, node, expression) => {
238
+ if (!isStringReturningMethod(stringMethodName(expression))) {
239
+ return undefined;
240
+ }
241
+ const object = stringMethodReceiver(expression);
242
+ if (isIdentifier(object) && stringParameterNames(source, node).has(object.name)) {
243
+ return ': string';
244
+ }
245
+ return undefined;
246
+ };
247
+ const singleReturnExpression = (node) => {
248
+ if (node.type === 'ArrowFunctionExpression' && node.body.type !== 'BlockStatement') {
249
+ return node.body;
250
+ }
251
+ if (node.body.type !== 'BlockStatement' || node.body.body.length !== 1) {
252
+ return undefined;
253
+ }
254
+ const [statement] = node.body.body;
255
+ if (statement?.type !== 'ReturnStatement') {
256
+ return undefined;
257
+ }
258
+ return statement.argument ?? undefined;
259
+ };
260
+ const inferredExpressionReturnTypeText = (source, path, propertyNames) => {
261
+ const expression = singleReturnExpression(path.value);
262
+ if (!expression) {
263
+ return undefined;
264
+ }
265
+ if (propertyNames.get(functionKey(path.value)) === 'check' || isBooleanExpression(expression)) {
266
+ return ': boolean';
267
+ }
268
+ const primitiveType = primitiveLiteralReturnType(expression);
269
+ if (primitiveType) {
270
+ return primitiveType;
271
+ }
272
+ return stringMethodReturnType(source, path.value, expression);
273
+ };
274
+ const inferredBodyReturnTypeText = (node) => {
275
+ if (hasReturnValue(node)) {
276
+ return undefined;
277
+ }
278
+ if (isAsync(node)) {
279
+ return ': Promise<void>';
280
+ }
281
+ return ': void';
282
+ };
283
+ const inferredReturnTypeText = (source, path, propertyNames) => {
284
+ if (propertyNames.get(functionKey(path.value)) === 'ast') {
285
+ return ': Record<string, (node: object) => void>';
286
+ }
287
+ const expressionReturnType = inferredExpressionReturnTypeText(source, path, propertyNames);
288
+ if (expressionReturnType) {
289
+ return expressionReturnType;
290
+ }
291
+ if (singleReturnExpression(path.value)) {
292
+ return undefined;
293
+ }
294
+ return inferredBodyReturnTypeText(path.value);
295
+ };
296
+ const previousNonWhitespaceIndex = (source, index) => {
297
+ let cursor = index;
298
+ while (cursor > 0 && /\s/u.test(source[cursor - 1] ?? '')) {
299
+ cursor -= 1;
300
+ }
301
+ return cursor;
302
+ };
303
+ const arrowInsertionPoint = (source, node) => {
304
+ const bodyStart = nodeStart(node.body);
305
+ const arrowStart = source.lastIndexOf('=>', bodyStart);
306
+ if (arrowStart === -1) {
307
+ return previousNonWhitespaceIndex(source, bodyStart);
308
+ }
309
+ return previousNonWhitespaceIndex(source, arrowStart);
310
+ };
311
+ const insertionPoint = (source, node) => {
312
+ if (node.returnType || !node.body) {
313
+ return undefined;
314
+ }
315
+ if (node.type === 'ArrowFunctionExpression') {
316
+ return arrowInsertionPoint(source, node);
317
+ }
318
+ return previousNonWhitespaceIndex(source, nodeStart(node.body));
319
+ };
320
+ const replacementForFunction = (source, path, propertyNames) => {
321
+ const start = insertionPoint(source, path.value);
322
+ const returnType = inferredReturnTypeText(source, path, propertyNames);
323
+ if (start === undefined || !returnType) {
324
+ return undefined;
325
+ }
326
+ return { end: start, start, text: returnType };
327
+ };
328
+ const collectFunctionReplacements = (source) => {
329
+ const replacements = [];
330
+ const propertyNames = collectObjectPropertyNames(source);
331
+ const collect = (path) => {
332
+ const replacement = replacementForFunction(source, path, propertyNames);
333
+ if (replacement) {
334
+ replacements.push(replacement);
335
+ }
336
+ };
337
+ const root = codemodAPI(source);
338
+ root.find(codemodAPI.ArrowFunctionExpression).forEach(collect);
339
+ root.find(codemodAPI.ObjectMethod).forEach(collect);
340
+ root.find(codemodAPI.FunctionDeclaration).forEach(collect);
341
+ root.find(codemodAPI.FunctionExpression).forEach(collect);
342
+ return replacements;
343
+ };
344
+ /**
345
+ * Internal helper exported for package-local composition.
346
+ *
347
+ * @internal
348
+ */
349
+ export const addVoidReturnTypes = (source) => applyReplacements(source, collectFunctionReplacements(source));
350
+ //# sourceMappingURL=explicit-return-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"explicit-return-types.js","sourceRoot":"","sources":["../../src/codemods/explicit-return-types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Rewrites or inserts the file-level purpose header in the project divider style.
3
+ *
4
+ * @internal
5
+ */
6
+ export declare const formatFileHeaderComment: (source: string, generatedDescription?: string) => string;
7
+ //# sourceMappingURL=format-file-header.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format-file-header.d.ts","sourceRoot":"","sources":["../../src/codemods/format-file-header.ts"],"names":[],"mappings":"AA8MA;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,GAAI,QAAQ,MAAM,EAAE,uBAAuB,MAAM,KAAG,MAOvF,CAAC"}
@@ -0,0 +1,163 @@
1
+ /* -------------------------------------------------------------------------- */
2
+ /* Codemod for rendering module-level file comments as divider headers. */
3
+ /* -------------------------------------------------------------------------- */
4
+ import { formatMainHeader } from './comment-format.js';
5
+ const jsdocOpenLength = '/**'.length;
6
+ const jsdocCloseLength = '*/'.length;
7
+ const tagPattern = /^@\S+/;
8
+ const dividerTextPrefix = '/*';
9
+ const dividerTextSuffix = '*/';
10
+ const declarationStartPattern = /^(?:export\s+)?(?:default\s+)?(?:async\s+)?(?:abstract\s+)?(?:function|class|interface|type|enum|const|let|var)\b/u;
11
+ const skipWhitespace = (source, start) => {
12
+ let cursor = start;
13
+ while (cursor < source.length && /\s/u.test(source[cursor] ?? '')) {
14
+ cursor++;
15
+ }
16
+ return cursor;
17
+ };
18
+ const skipShebang = (source) => {
19
+ if (!source.startsWith('#!')) {
20
+ return 0;
21
+ }
22
+ const newline = source.indexOf('\n');
23
+ if (newline === -1) {
24
+ return source.length;
25
+ }
26
+ return newline + 1;
27
+ };
28
+ const leadingContentPosition = (source) => skipWhitespace(source, skipShebang(source));
29
+ const cleanJSDocLine = (line) => line
30
+ .trim()
31
+ .replace(/^\*\s?/u, '')
32
+ .trim();
33
+ const headerText = (body) => {
34
+ const lines = body
35
+ .split('\n')
36
+ .map(cleanJSDocLine)
37
+ .filter((line) => line.length > 0 && !tagPattern.test(line));
38
+ const summary = lines.join(' ');
39
+ if (!summary) {
40
+ return undefined;
41
+ }
42
+ return summary;
43
+ };
44
+ const isDeclarationAfterHeader = (source, headerEnd) => declarationStartPattern.test(source.slice(headerEnd).trimStart());
45
+ const lineEnd = (source, start) => {
46
+ const newline = source.indexOf('\n', start);
47
+ if (newline === -1) {
48
+ return source.length;
49
+ }
50
+ return newline;
51
+ };
52
+ const nextLineStart = (source, start) => {
53
+ const newline = source.indexOf('\n', start);
54
+ if (newline === -1) {
55
+ return source.length;
56
+ }
57
+ return newline + 1;
58
+ };
59
+ const dividerTextLine = (line) => line.slice(dividerTextPrefix.length, -dividerTextSuffix.length).trim();
60
+ const isSOLIDDividerLine = (line) => {
61
+ if (!line.startsWith('/* ') || !line.endsWith(' */')) {
62
+ return false;
63
+ }
64
+ const inner = dividerTextLine(line);
65
+ return inner.length > 0 && isDividerFiller(inner);
66
+ };
67
+ const isDividerFiller = (text) => {
68
+ for (let index = 0; index < text.length; index++) {
69
+ if (text.charAt(index) !== '-') {
70
+ return false;
71
+ }
72
+ }
73
+ return true;
74
+ };
75
+ const dividerLineAt = (source, start) => {
76
+ const end = lineEnd(source, start);
77
+ return {
78
+ end,
79
+ line: source.slice(start, end),
80
+ next: nextLineStart(source, start),
81
+ };
82
+ };
83
+ const collectDividerBody = (source, cursor, textLines) => {
84
+ if (cursor >= source.length) {
85
+ return undefined;
86
+ }
87
+ const current = dividerLineAt(source, cursor);
88
+ if (isSOLIDDividerLine(current.line)) {
89
+ return {
90
+ end: current.end,
91
+ text: textLines.join(' '),
92
+ };
93
+ }
94
+ textLines.push(dividerTextLine(current.line));
95
+ return collectDividerBody(source, current.next, textLines);
96
+ };
97
+ const collectDividerHeader = (source, start) => {
98
+ const first = dividerLineAt(source, start);
99
+ if (!isSOLIDDividerLine(first.line)) {
100
+ return undefined;
101
+ }
102
+ return collectDividerBody(source, first.next, []);
103
+ };
104
+ const dividerHeaderReplacement = (source, start) => {
105
+ const header = collectDividerHeader(source, start);
106
+ if (!header?.text) {
107
+ return undefined;
108
+ }
109
+ return {
110
+ end: header.end,
111
+ text: formatMainHeader(header.text),
112
+ };
113
+ };
114
+ const jsdocHeaderReplacement = (source, start) => {
115
+ if (!source.startsWith('/**', start)) {
116
+ return undefined;
117
+ }
118
+ const close = source.indexOf('*/', start + jsdocOpenLength);
119
+ if (close === -1 || isDeclarationAfterHeader(source, close + jsdocCloseLength)) {
120
+ return undefined;
121
+ }
122
+ const text = headerText(source.slice(start + jsdocOpenLength, close));
123
+ if (!text) {
124
+ return undefined;
125
+ }
126
+ return {
127
+ end: close + jsdocCloseLength,
128
+ text: formatMainHeader(text),
129
+ };
130
+ };
131
+ const generatedHeaderReplacement = (text, start) => {
132
+ if (!text) {
133
+ return undefined;
134
+ }
135
+ return {
136
+ end: start,
137
+ text: `${formatMainHeader(text)}\n`,
138
+ };
139
+ };
140
+ const applyHeaderReplacement = (source, start, replacement) => `${source.slice(0, start)}${replacement.text}${source.slice(replacement.end)}`;
141
+ const headerReplacement = (source, start, generatedDescription) => {
142
+ const replacement = dividerHeaderReplacement(source, start) ??
143
+ jsdocHeaderReplacement(source, start) ??
144
+ generatedHeaderReplacement(generatedDescription, start);
145
+ if (!replacement) {
146
+ return undefined;
147
+ }
148
+ return replacement;
149
+ };
150
+ /**
151
+ * Rewrites or inserts the file-level purpose header in the project divider style.
152
+ *
153
+ * @internal
154
+ */
155
+ export const formatFileHeaderComment = (source, generatedDescription) => {
156
+ const start = leadingContentPosition(source);
157
+ const replacement = headerReplacement(source, start, generatedDescription);
158
+ if (!replacement) {
159
+ return source;
160
+ }
161
+ return applyHeaderReplacement(source, start, replacement);
162
+ };
163
+ //# sourceMappingURL=format-file-header.js.map