@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,43 @@
1
+ /**
2
+ * Internal helper exported for package-local composition.
3
+ *
4
+ * @internal
5
+ */
6
+ export declare const hasUnsafeLazyEvaluation: (source: string) => boolean;
7
+ /**
8
+ * Internal helper exported for package-local composition.
9
+ *
10
+ * @internal
11
+ */
12
+ export declare const hasUnloggedIgnore: (source: string) => boolean;
13
+ /**
14
+ * Internal helper exported for package-local composition.
15
+ *
16
+ * @internal
17
+ */
18
+ export declare const hasMultipleCatchTagsInOnePipe: (source: string) => boolean;
19
+ /**
20
+ * Internal helper exported for package-local composition.
21
+ *
22
+ * @internal
23
+ */
24
+ export declare const hasBroadCatchAllWithoutRethrow: (source: string) => boolean;
25
+ /**
26
+ * Internal helper exported for package-local composition.
27
+ *
28
+ * @internal
29
+ */
30
+ export declare const hasErrorMappingWithoutCause: (source: string) => boolean;
31
+ /**
32
+ * Internal helper exported for package-local composition.
33
+ *
34
+ * @internal
35
+ */
36
+ export declare const hasForkDaemonWithoutCleanup: (source: string) => boolean;
37
+ /**
38
+ * Internal helper exported for package-local composition.
39
+ *
40
+ * @internal
41
+ */
42
+ export declare const hasForkInUninterruptibleWithoutRestore: (source: string) => boolean;
43
+ //# sourceMappingURL=effect-default-safety-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"effect-default-safety-helpers.d.ts","sourceRoot":"","sources":["../../src/rules/effect-default-safety-helpers.ts"],"names":[],"mappings":"AAYA;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,GAAI,QAAQ,MAAM,KAAG,OAWxD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,GAAI,QAAQ,MAAM,KAAG,OAgBlD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,6BAA6B,GAAI,QAAQ,MAAM,KAAG,OAc9D,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,8BAA8B,GAAI,QAAQ,MAAM,KAAG,OAgB/D,CAAC;AAiBF;;;;GAIG;AACH,eAAO,MAAM,2BAA2B,GAAI,QAAQ,MAAM,KAAG,OAgB5D,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,2BAA2B,GAAI,QAAQ,MAAM,KAAG,OAI1D,CAAC;AAEJ;;;;GAIG;AACH,eAAO,MAAM,sCAAsC,GAAI,QAAQ,MAAM,KAAG,OAWvE,CAAC"}
@@ -0,0 +1,126 @@
1
+ /* -------------------------------------------------------------------------- */
2
+ /* Error-handling and cleanup predicates for always-on Effect rules. */
3
+ /* -------------------------------------------------------------------------- */
4
+ import { effectCallBodies, enclosingPipeBody } from './effect-default-scan-helpers.js';
5
+ import { findBalancedCallEnd, isInsideCall, stripCommentsAndStrings, } from './effect-source-helpers.js';
6
+ const LOCAL_PREFIX_SCAN_WINDOW = 160;
7
+ /**
8
+ * Internal helper exported for package-local composition.
9
+ *
10
+ * @internal
11
+ */
12
+ export const hasUnsafeLazyEvaluation = (source) => {
13
+ const code = stripCommentsAndStrings(source);
14
+ for (const match of code.matchAll(/Effect\.succeed\s*\(\s*(?:Date\.now|Math\.random|new\s+Date|JSON\.parse)\s*\(/g)) {
15
+ if (!isInsideCall(code, match.index, /Effect\.suspend\s*\(/g)) {
16
+ return true;
17
+ }
18
+ }
19
+ return false;
20
+ };
21
+ /**
22
+ * Internal helper exported for package-local composition.
23
+ *
24
+ * @internal
25
+ */
26
+ export const hasUnloggedIgnore = (source) => {
27
+ for (const match of source.matchAll(/\bEffect\.ignore\b/g)) {
28
+ const pipeBody = enclosingPipeBody(source, match.index);
29
+ let localPrefix = source.slice(Math.max(0, match.index - LOCAL_PREFIX_SCAN_WINDOW), match.index);
30
+ if (pipeBody) {
31
+ localPrefix = pipeBody.slice(0, Math.max(0, match.index - source.indexOf(pipeBody)));
32
+ }
33
+ if (!/\b(?:Effect\.log|tapError|tapBoth|catchAll)\b/.test(localPrefix)) {
34
+ return true;
35
+ }
36
+ }
37
+ return false;
38
+ };
39
+ /**
40
+ * Internal helper exported for package-local composition.
41
+ *
42
+ * @internal
43
+ */
44
+ export const hasMultipleCatchTagsInOnePipe = (source) => {
45
+ const code = stripCommentsAndStrings(source);
46
+ for (const match of code.matchAll(/\.pipe\s*\(/g)) {
47
+ const openParenIndex = source.indexOf('(', match.index);
48
+ if (openParenIndex !== -1) {
49
+ const pipeBody = source.slice(match.index, findBalancedCallEnd(source, openParenIndex) + 1);
50
+ const catchTagCount = [...pipeBody.matchAll(/Effect\.catchTag\s*\(/g)].length;
51
+ if (catchTagCount > 1 && !/Effect\.catchTags\s*\(/.test(pipeBody)) {
52
+ return true;
53
+ }
54
+ }
55
+ }
56
+ return false;
57
+ };
58
+ /**
59
+ * Internal helper exported for package-local composition.
60
+ *
61
+ * @internal
62
+ */
63
+ export const hasBroadCatchAllWithoutRethrow = (source) => {
64
+ const code = stripCommentsAndStrings(source);
65
+ for (const match of code.matchAll(/Effect\.catchAll\s*\(/g)) {
66
+ const openParenIndex = source.indexOf('(', match.index);
67
+ if (openParenIndex !== -1) {
68
+ const callBody = source.slice(openParenIndex + 1, findBalancedCallEnd(source, openParenIndex));
69
+ if (!/=>\s*Effect\.fail\s*\(/.test(callBody)) {
70
+ return true;
71
+ }
72
+ }
73
+ }
74
+ return false;
75
+ };
76
+ const hasErrorWithoutCause = (callBody) => {
77
+ for (const errorMatch of callBody.matchAll(/new\s+[A-Z][\w$]*Error\s*\(/g)) {
78
+ const errorOpenParenIndex = callBody.indexOf('(', errorMatch.index);
79
+ const errorArgs = callBody.slice(errorOpenParenIndex + 1, findBalancedCallEnd(callBody, errorOpenParenIndex));
80
+ if (!/\bcause\b/.test(errorArgs)) {
81
+ return true;
82
+ }
83
+ }
84
+ return false;
85
+ };
86
+ /**
87
+ * Internal helper exported for package-local composition.
88
+ *
89
+ * @internal
90
+ */
91
+ export const hasErrorMappingWithoutCause = (source) => {
92
+ const code = stripCommentsAndStrings(source);
93
+ for (const match of code.matchAll(/(?:mapError|catchAll)\s*\(/g)) {
94
+ const openParenIndex = source.indexOf('(', match.index);
95
+ if (openParenIndex !== -1) {
96
+ const callBody = source.slice(openParenIndex + 1, findBalancedCallEnd(source, openParenIndex));
97
+ if (hasErrorWithoutCause(callBody)) {
98
+ return true;
99
+ }
100
+ }
101
+ }
102
+ return false;
103
+ };
104
+ /**
105
+ * Internal helper exported for package-local composition.
106
+ *
107
+ * @internal
108
+ */
109
+ export const hasForkDaemonWithoutCleanup = (source) => effectCallBodies(source, /\bEffect\.forkDaemon\s*\(/g).some((body) => !/\b(?:Effect\.)?(?:ensuring|onExit|onInterrupt|supervised)\b|Supervisor\./.test(body));
110
+ /**
111
+ * Internal helper exported for package-local composition.
112
+ *
113
+ * @internal
114
+ */
115
+ export const hasForkInUninterruptibleWithoutRestore = (source) => {
116
+ const code = stripCommentsAndStrings(source);
117
+ for (const match of code.matchAll(/\bEffect\.uninterruptible\s*\(/g)) {
118
+ const openParenIndex = source.indexOf('(', match.index);
119
+ const callBody = source.slice(openParenIndex + 1, findBalancedCallEnd(source, openParenIndex));
120
+ if (/\bEffect\.fork\b/.test(callBody) && !/\brestore\s*\(/.test(callBody)) {
121
+ return true;
122
+ }
123
+ }
124
+ return false;
125
+ };
126
+ //# sourceMappingURL=effect-default-safety-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"effect-default-safety-helpers.js","sourceRoot":"","sources":["../../src/rules/effect-default-safety-helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Internal helper exported for package-local composition.
3
+ *
4
+ * @internal
5
+ */
6
+ export declare const effectAliasesPattern: (source: string) => string;
7
+ /**
8
+ * Internal helper exported for package-local composition.
9
+ *
10
+ * @internal
11
+ */
12
+ export declare const effectCallPattern: (source: string, methods: string) => RegExp;
13
+ /**
14
+ * Internal helper exported for package-local composition.
15
+ *
16
+ * @internal
17
+ */
18
+ export declare const localCallSegment: (source: string, targetIndex: number) => string;
19
+ /**
20
+ * Internal helper exported for package-local composition.
21
+ *
22
+ * @internal
23
+ */
24
+ export declare const effectCallBodies: (source: string, callPattern: RegExp) => string[];
25
+ /**
26
+ * Internal helper exported for package-local composition.
27
+ *
28
+ * @internal
29
+ */
30
+ export declare const someEffectWorkflowBody: (source: string, predicate: (body: string) => boolean) => boolean;
31
+ /**
32
+ * Internal helper exported for package-local composition.
33
+ *
34
+ * @internal
35
+ */
36
+ export declare const enclosingPipeBody: (source: string, targetIndex: number) => string | undefined;
37
+ /**
38
+ * Internal helper exported for package-local composition.
39
+ *
40
+ * @internal
41
+ */
42
+ export declare const strippedCallSegment: (source: string, targetIndex: number) => string;
43
+ //# sourceMappingURL=effect-default-scan-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"effect-default-scan-helpers.d.ts","sourceRoot":"","sources":["../../src/rules/effect-default-scan-helpers.ts"],"names":[],"mappings":"AAiCA;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,GAAI,QAAQ,MAAM,KAAG,MAWrD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,GAAI,QAAQ,MAAM,EAAE,SAAS,MAAM,KAAG,MAcnE,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAAI,QAAQ,MAAM,EAAE,aAAa,MAAM,KAAG,MAMtE,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAAI,QAAQ,MAAM,EAAE,aAAa,MAAM,KAAG,MAAM,EAW5E,CAAC;AAiDF;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,GACjC,QAAQ,MAAM,EACd,WAAW,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,KACnC,OAGF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,GAAI,QAAQ,MAAM,EAAE,aAAa,MAAM,KAAG,MAAM,GAAG,SAYhF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,GAAI,QAAQ,MAAM,EAAE,aAAa,MAAM,KAAG,MACpB,CAAC"}
@@ -0,0 +1,141 @@
1
+ /* -------------------------------------------------------------------------- */
2
+ /* Shared scan helpers for always-on Effect lint predicates. */
3
+ /* -------------------------------------------------------------------------- */
4
+ import { findBalancedCallEnd, findStatementEnd, stripComments, stripCommentsAndStrings, } from './effect-source-helpers.js';
5
+ import { effectImportAliases } from './effect-rule-core.js';
6
+ const EFFECT_PATTERN_CACHE_MAX = 256;
7
+ const effectAliasesPatternCache = new Map();
8
+ const effectCallPatternCache = new Map();
9
+ const escapeRegExp = (value) => value.replace(/[.*+?^${}()|[\]\\]/g, String.raw `\$&`);
10
+ const setBoundedCacheValue = (cache, key, value) => {
11
+ if (cache.size >= EFFECT_PATTERN_CACHE_MAX) {
12
+ const firstKey = cache.keys().next().value;
13
+ if (firstKey !== undefined) {
14
+ cache.delete(firstKey);
15
+ }
16
+ }
17
+ cache.set(key, value);
18
+ return value;
19
+ };
20
+ /**
21
+ * Internal helper exported for package-local composition.
22
+ *
23
+ * @internal
24
+ */
25
+ export const effectAliasesPattern = (source) => {
26
+ const cachedPattern = effectAliasesPatternCache.get(source);
27
+ if (cachedPattern !== undefined) {
28
+ return cachedPattern;
29
+ }
30
+ return setBoundedCacheValue(effectAliasesPatternCache, source, effectImportAliases(source).map(escapeRegExp).join('|'));
31
+ };
32
+ /**
33
+ * Internal helper exported for package-local composition.
34
+ *
35
+ * @internal
36
+ */
37
+ export const effectCallPattern = (source, methods) => {
38
+ let sourceCache = effectCallPatternCache.get(source);
39
+ if (sourceCache === undefined) {
40
+ sourceCache = setBoundedCacheValue(effectCallPatternCache, source, new Map());
41
+ }
42
+ const cachedPattern = sourceCache.get(methods);
43
+ if (cachedPattern !== undefined) {
44
+ return cachedPattern;
45
+ }
46
+ const pattern = new RegExp(`\\b(?:${effectAliasesPattern(source)})\\.(?:${methods})\\s*\\(`, 'g');
47
+ sourceCache.set(methods, pattern);
48
+ return pattern;
49
+ };
50
+ /**
51
+ * Internal helper exported for package-local composition.
52
+ *
53
+ * @internal
54
+ */
55
+ export const localCallSegment = (source, targetIndex) => {
56
+ const openParenIndex = source.indexOf('(', targetIndex);
57
+ if (openParenIndex === -1) {
58
+ return source.slice(targetIndex, findStatementEnd(source, targetIndex) + 1);
59
+ }
60
+ return source.slice(targetIndex, findBalancedCallEnd(source, openParenIndex) + 1);
61
+ };
62
+ /**
63
+ * Internal helper exported for package-local composition.
64
+ *
65
+ * @internal
66
+ */
67
+ export const effectCallBodies = (source, callPattern) => {
68
+ const code = stripCommentsAndStrings(source);
69
+ const bodies = [];
70
+ for (const match of code.matchAll(callPattern)) {
71
+ const openParenIndex = source.indexOf('(', match.index);
72
+ if (openParenIndex !== -1) {
73
+ bodies.push(source.slice(openParenIndex + 1, findBalancedCallEnd(source, openParenIndex)));
74
+ }
75
+ }
76
+ return bodies;
77
+ };
78
+ const effectGenHasBody = (source, code, predicate) => {
79
+ for (const match of code.matchAll(effectCallPattern(source, 'gen'))) {
80
+ const openParenIndex = source.indexOf('(', match.index);
81
+ if (openParenIndex !== -1 &&
82
+ predicate(source.slice(openParenIndex + 1, findBalancedCallEnd(source, openParenIndex)))) {
83
+ return true;
84
+ }
85
+ }
86
+ return false;
87
+ };
88
+ const effectFnBodyBounds = (source, openParenIndex) => {
89
+ const firstCallEnd = findBalancedCallEnd(source, openParenIndex);
90
+ const nextCallMatch = /^\s*\(/.exec(source.slice(firstCallEnd + 1));
91
+ if (nextCallMatch) {
92
+ const start = firstCallEnd + 1 + nextCallMatch[0].lastIndexOf('(');
93
+ return { end: findBalancedCallEnd(source, start), start };
94
+ }
95
+ return { end: firstCallEnd, start: openParenIndex };
96
+ };
97
+ const effectFnHasBody = (source, code, predicate) => {
98
+ for (const match of code.matchAll(effectCallPattern(source, 'fn'))) {
99
+ const openParenIndex = source.indexOf('(', match.index);
100
+ if (openParenIndex !== -1) {
101
+ const bounds = effectFnBodyBounds(source, openParenIndex);
102
+ if (predicate(source.slice(bounds.start + 1, bounds.end))) {
103
+ return true;
104
+ }
105
+ }
106
+ }
107
+ return false;
108
+ };
109
+ /**
110
+ * Internal helper exported for package-local composition.
111
+ *
112
+ * @internal
113
+ */
114
+ export const someEffectWorkflowBody = (source, predicate) => {
115
+ const code = stripCommentsAndStrings(source);
116
+ return effectGenHasBody(source, code, predicate) || effectFnHasBody(source, code, predicate);
117
+ };
118
+ /**
119
+ * Internal helper exported for package-local composition.
120
+ *
121
+ * @internal
122
+ */
123
+ export const enclosingPipeBody = (source, targetIndex) => {
124
+ for (const match of source.matchAll(/\.pipe\s*\(/g)) {
125
+ const openParenIndex = source.indexOf('(', match.index);
126
+ if (openParenIndex !== -1 && openParenIndex <= targetIndex) {
127
+ const endIndex = findBalancedCallEnd(source, openParenIndex);
128
+ if (targetIndex <= endIndex) {
129
+ return source.slice(openParenIndex + 1, endIndex);
130
+ }
131
+ }
132
+ }
133
+ return undefined;
134
+ };
135
+ /**
136
+ * Internal helper exported for package-local composition.
137
+ *
138
+ * @internal
139
+ */
140
+ export const strippedCallSegment = (source, targetIndex) => stripComments(localCallSegment(source, targetIndex));
141
+ //# sourceMappingURL=effect-default-scan-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"effect-default-scan-helpers.js","sourceRoot":"","sources":["../../src/rules/effect-default-scan-helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Internal helper exported for package-local composition.
3
+ *
4
+ * @internal
5
+ */
6
+ export declare const hasSchemaSyncDecodeInEffectWorkflow: (source: string) => boolean;
7
+ /**
8
+ * Internal helper exported for package-local composition.
9
+ *
10
+ * @internal
11
+ */
12
+ export declare const hasSchemaPromiseDecode: (source: string) => boolean;
13
+ /**
14
+ * Internal helper exported for package-local composition.
15
+ *
16
+ * @internal
17
+ */
18
+ export declare const hasExternalJSONWithoutDecodeUnknown: (source: string) => boolean;
19
+ /**
20
+ * Internal helper exported for package-local composition.
21
+ *
22
+ * @internal
23
+ */
24
+ export declare const hasCastAfterSchemaDecode: (source: string) => boolean;
25
+ /**
26
+ * Internal helper exported for package-local composition.
27
+ *
28
+ * @internal
29
+ */
30
+ export declare const hasUnhandledSchemaEffectDecode: (source: string) => boolean;
31
+ /**
32
+ * Internal helper exported for package-local composition.
33
+ *
34
+ * @internal
35
+ */
36
+ export declare const hasJSONParsedBeforeSchemaStringDecode: (source: string) => boolean;
37
+ //# sourceMappingURL=effect-default-schema-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"effect-default-schema-helpers.d.ts","sourceRoot":"","sources":["../../src/rules/effect-default-schema-helpers.ts"],"names":[],"mappings":"AAQA;;;;GAIG;AACH,eAAO,MAAM,mCAAmC,GAAI,QAAQ,MAAM,KAAG,OAGlE,CAAC;AAEJ;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,GAAI,QAAQ,MAAM,KAAG,OACqB,CAAC;AAE9E;;;;GAIG;AACH,eAAO,MAAM,mCAAmC,GAAI,QAAQ,MAAM,KAAG,OAapE,CAAC;AAgDF;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,GAAI,QAAQ,MAAM,KAAG,OASzD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,8BAA8B,GAAI,QAAQ,MAAM,KAAG,OAkB/D,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,qCAAqC,GAAI,QAAQ,MAAM,KAAG,OAGpE,CAAC"}
@@ -0,0 +1,104 @@
1
+ /* -------------------------------------------------------------------------- */
2
+ /* Schema boundary predicates for always-on Effect rules. */
3
+ /* -------------------------------------------------------------------------- */
4
+ import { isInsideCall, stripCommentsAndStrings } from './effect-source-helpers.js';
5
+ import { localCallSegment, someEffectWorkflowBody } from './effect-default-scan-helpers.js';
6
+ const SCHEMA_ASSERTION_SCAN_WINDOW = 240;
7
+ /**
8
+ * Internal helper exported for package-local composition.
9
+ *
10
+ * @internal
11
+ */
12
+ export const hasSchemaSyncDecodeInEffectWorkflow = (source) => someEffectWorkflowBody(source, (body) => /Schema\.decode(?:Unknown)?Sync\s*\(/.test(stripCommentsAndStrings(body)));
13
+ /**
14
+ * Internal helper exported for package-local composition.
15
+ *
16
+ * @internal
17
+ */
18
+ export const hasSchemaPromiseDecode = (source) => /Schema\.decode[A-Za-z]*Promise\s*\(/.test(stripCommentsAndStrings(source));
19
+ /**
20
+ * Internal helper exported for package-local composition.
21
+ *
22
+ * @internal
23
+ */
24
+ export const hasExternalJSONWithoutDecodeUnknown = (source) => {
25
+ const code = stripCommentsAndStrings(source);
26
+ for (const match of code.matchAll(/\b(?:response|res)\.json\s*\(\s*\)/g)) {
27
+ const callSegment = localCallSegment(code, match.index);
28
+ if (!isInsideCall(code, match.index, /Schema\.decodeUnknown\s*\(/g) &&
29
+ !/Schema\.decodeUnknown/.test(callSegment)) {
30
+ return true;
31
+ }
32
+ }
33
+ return false;
34
+ };
35
+ const schemaDecodeLine = (code, index) => {
36
+ const lineStart = Math.max(code.lastIndexOf(';', index) + 1, code.lastIndexOf('\n', index) + 1);
37
+ const lineBreakIndex = code.indexOf('\n', index);
38
+ let lineEnd = lineBreakIndex;
39
+ if (lineEnd === -1) {
40
+ lineEnd = code.length;
41
+ }
42
+ return code.slice(lineStart, lineEnd);
43
+ };
44
+ const schemaAssertionTail = (code, match) => code.slice((match.index ?? 0) + match[0].length, (match.index ?? 0) + match[0].length + SCHEMA_ASSERTION_SCAN_WINDOW);
45
+ const hasBindingAssertion = (bindingName, tail) => Boolean(bindingName && new RegExp(`\\b${bindingName}\\s+as\\s+[A-Za-z_$][\\w$]*`).test(tail));
46
+ const hasInlineSchemaDecodeCast = (line) => /Schema\.decode[A-Za-z]*\s*\([^)]*\)\s*\([^)]*\)\s+as\s+[A-Za-z_$][\w$]*/.test(line);
47
+ const hasCastAfterSchemaDecodeMatch = (code, match) => {
48
+ if (match.index === undefined) {
49
+ return false;
50
+ }
51
+ const line = schemaDecodeLine(code, match.index);
52
+ if (hasInlineSchemaDecodeCast(line)) {
53
+ return true;
54
+ }
55
+ const bindingName = /\b(?:const|let|var)\s+([A-Za-z_$][\w$]*)\s*=/.exec(line)?.[1];
56
+ return hasBindingAssertion(bindingName, schemaAssertionTail(code, match));
57
+ };
58
+ const hasCastAfterSchemaDecodeBinding = (code) => {
59
+ for (const match of code.matchAll(/\b(?:const|let|var)\s+([A-Za-z_$][\w$]*)\s*=\s*Schema\.decode[A-Za-z]*\s*\([^)]*\)\s*\([^)]*\)/g)) {
60
+ const [, bindingName] = match;
61
+ if (hasBindingAssertion(bindingName, schemaAssertionTail(code, match))) {
62
+ return true;
63
+ }
64
+ }
65
+ return false;
66
+ };
67
+ /**
68
+ * Internal helper exported for package-local composition.
69
+ *
70
+ * @internal
71
+ */
72
+ export const hasCastAfterSchemaDecode = (source) => {
73
+ const code = stripCommentsAndStrings(source);
74
+ for (const match of code.matchAll(/Schema\.decode[A-Za-z]*\s*\(/g)) {
75
+ if (hasCastAfterSchemaDecodeMatch(code, match)) {
76
+ return true;
77
+ }
78
+ }
79
+ return hasCastAfterSchemaDecodeBinding(code);
80
+ };
81
+ /**
82
+ * Internal helper exported for package-local composition.
83
+ *
84
+ * @internal
85
+ */
86
+ export const hasUnhandledSchemaEffectDecode = (source) => {
87
+ const code = stripCommentsAndStrings(source);
88
+ for (const match of code.matchAll(/\b(?:const|let|var)\s+([A-Za-z_$][\w$]*)\s*=\s*Schema\.decodeUnknown\s*\([^)]*\)\s*\([^)]*\)/g)) {
89
+ const [, bindingName] = match;
90
+ const tail = code.slice(match.index + match[0].length);
91
+ const handledPattern = new RegExp(`(?:yield\\*\\s+${bindingName}\\b|return\\s+${bindingName}\\b)`);
92
+ if (!handledPattern.test(tail)) {
93
+ return true;
94
+ }
95
+ }
96
+ return /Schema\.decodeUnknown\s*\([^)]*\)\s*\([^)]*\)\.pipe\s*\(\s*Effect\.(?:orDie|ignore)\b/.test(code);
97
+ };
98
+ /**
99
+ * Internal helper exported for package-local composition.
100
+ *
101
+ * @internal
102
+ */
103
+ export const hasJSONParsedBeforeSchemaStringDecode = (source) => /Schema\.decode[A-Za-z]*\s*\((?![^)]*Schema\.parseJson)[\s\S]*?\)\s*\(\s*JSON\.parse\s*\(/.test(stripCommentsAndStrings(source));
104
+ //# sourceMappingURL=effect-default-schema-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"effect-default-schema-helpers.js","sourceRoot":"","sources":["../../src/rules/effect-default-schema-helpers.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,19 @@
1
- declare function hasForkBeforeTestClockAdjust(source: string): boolean;
2
- declare function hasRealSleepWithoutTestClock(source: string): boolean;
3
- declare function hasTestClockWithoutEffectContext(source: string): boolean;
4
- export { hasForkBeforeTestClockAdjust, hasRealSleepWithoutTestClock, hasTestClockWithoutEffectContext, };
1
+ /**
2
+ * Internal helper exported for package-local composition.
3
+ *
4
+ * @internal
5
+ */
6
+ export declare const hasForkBeforeTestClockAdjust: (source: string) => boolean;
7
+ /**
8
+ * Internal helper exported for package-local composition.
9
+ *
10
+ * @internal
11
+ */
12
+ export declare const hasRealSleepWithoutTestClock: (source: string) => boolean;
13
+ /**
14
+ * Internal helper exported for package-local composition.
15
+ *
16
+ * @internal
17
+ */
18
+ export declare const hasTestClockWithoutEffectContext: (source: string) => boolean;
5
19
  //# sourceMappingURL=effect-default-test-helpers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"effect-default-test-helpers.d.ts","sourceRoot":"","sources":["../../src/rules/effect-default-test-helpers.ts"],"names":[],"mappings":"AAEA,iBAAS,4BAA4B,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAgB7D;AAED,iBAAS,4BAA4B,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAgB7D;AAED,iBAAS,gCAAgC,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAgBjE;AAED,OAAO,EACL,4BAA4B,EAC5B,4BAA4B,EAC5B,gCAAgC,GACjC,CAAC"}
1
+ {"version":3,"file":"effect-default-test-helpers.d.ts","sourceRoot":"","sources":["../../src/rules/effect-default-test-helpers.ts"],"names":[],"mappings":"AAiBA;;;;GAIG;AACH,eAAO,MAAM,4BAA4B,GAAI,QAAQ,MAAM,KAAG,OAoB7D,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,4BAA4B,GAAI,QAAQ,MAAM,KAAG,OAY7D,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,gCAAgC,GAAI,QAAQ,MAAM,KAAG,OAYjE,CAAC"}
@@ -1,5 +1,21 @@
1
+ /* -------------------------------------------------------------------------- */
2
+ /* Helpers for Effect test-determinism lint rules. */
3
+ /* -------------------------------------------------------------------------- */
1
4
  import { stripCommentsAndStrings } from './effect-source-helpers.js';
2
- function hasForkBeforeTestClockAdjust(source) {
5
+ const testStartPattern = /\bit(?:\.effect)?\s*\(/g;
6
+ const testStartsIn = (code) => [...code.matchAll(testStartPattern)].map((match) => match.index);
7
+ const enclosingTestBody = (code, testStarts, index) => {
8
+ const previousStarts = testStarts.filter((start) => start < index);
9
+ const testStart = previousStarts.at(-1) ?? 0;
10
+ const nextTestStart = testStarts.find((start) => start > index) ?? code.length;
11
+ return code.slice(testStart, nextTestStart);
12
+ };
13
+ /**
14
+ * Internal helper exported for package-local composition.
15
+ *
16
+ * @internal
17
+ */
18
+ export const hasForkBeforeTestClockAdjust = (source) => {
3
19
  const code = stripCommentsAndStrings(source);
4
20
  const adjustMatches = [...code.matchAll(/TestClock\.adjust\s*\(/g)];
5
21
  if (adjustMatches.length === 0) {
@@ -8,39 +24,44 @@ function hasForkBeforeTestClockAdjust(source) {
8
24
  return adjustMatches.every((match) => {
9
25
  const adjustIndex = match.index;
10
26
  const testStart = Math.max(code.lastIndexOf('it.effect', adjustIndex), code.lastIndexOf('it(', adjustIndex));
11
- const segment = code.slice(testStart === -1 ? 0 : testStart, adjustIndex);
27
+ let segmentStart = testStart;
28
+ if (segmentStart === -1) {
29
+ segmentStart = 0;
30
+ }
31
+ const segment = code.slice(segmentStart, adjustIndex);
12
32
  return /Effect\.fork(?:Scoped)?\b/.test(segment);
13
33
  });
14
- }
15
- function hasRealSleepWithoutTestClock(source) {
34
+ };
35
+ /**
36
+ * Internal helper exported for package-local composition.
37
+ *
38
+ * @internal
39
+ */
40
+ export const hasRealSleepWithoutTestClock = (source) => {
16
41
  const code = stripCommentsAndStrings(source);
17
- const testStartPattern = /\bit(?:\.effect)?\s*\(/g;
18
- const testStarts = [...code.matchAll(testStartPattern)].map((match) => match.index);
42
+ const testStarts = testStartsIn(code);
19
43
  for (const sleepMatch of code.matchAll(/Effect\.sleep\s*\(/g)) {
20
- const previousStarts = testStarts.filter((start) => start < sleepMatch.index);
21
- const testStart = previousStarts.at(-1) ?? 0;
22
- const nextTestStart = testStarts.find((start) => start > sleepMatch.index) ?? code.length;
23
- const testBody = code.slice(testStart, nextTestStart);
44
+ const testBody = enclosingTestBody(code, testStarts, sleepMatch.index);
24
45
  if (!/TestClock\./.test(testBody)) {
25
46
  return true;
26
47
  }
27
48
  }
28
49
  return false;
29
- }
30
- function hasTestClockWithoutEffectContext(source) {
50
+ };
51
+ /**
52
+ * Internal helper exported for package-local composition.
53
+ *
54
+ * @internal
55
+ */
56
+ export const hasTestClockWithoutEffectContext = (source) => {
31
57
  const code = stripCommentsAndStrings(source);
32
- const testStartPattern = /\bit(?:\.effect)?\s*\(/g;
33
- const testStarts = [...code.matchAll(testStartPattern)].map((match) => match.index);
58
+ const testStarts = testStartsIn(code);
34
59
  for (const clockMatch of code.matchAll(/TestClock\./g)) {
35
- const previousStarts = testStarts.filter((start) => start < clockMatch.index);
36
- const testStart = previousStarts.at(-1) ?? 0;
37
- const nextTestStart = testStarts.find((start) => start > clockMatch.index) ?? code.length;
38
- const testBody = code.slice(testStart, nextTestStart);
60
+ const testBody = enclosingTestBody(code, testStarts, clockMatch.index);
39
61
  if (!/(?:it\.effect|TestContext)/.test(testBody)) {
40
62
  return true;
41
63
  }
42
64
  }
43
65
  return false;
44
- }
45
- export { hasForkBeforeTestClockAdjust, hasRealSleepWithoutTestClock, hasTestClockWithoutEffectContext, };
66
+ };
46
67
  //# sourceMappingURL=effect-default-test-helpers.js.map