@thethracian/oxlint-config 0.2.1 → 0.3.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 (279) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/README.md +124 -18
  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 +156 -94
  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 -118
  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 -535
  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 +105 -680
  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 +38 -24
  176. package/dist/rules/effect-rule-core.d.ts.map +1 -1
  177. package/dist/rules/effect-rule-core.js +157 -344
  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 -358
  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 +372 -300
  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 +93 -384
  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 -725
  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 +52 -15
  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 +5 -0
  252. package/dist/rules/plugin.d.ts.map +1 -1
  253. package/dist/rules/plugin.js +168 -154
  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 +396 -221
  274. package/dist/rules/require-function-doc.js.map +1 -1
  275. package/dist/rules/source-cache.d.ts +13 -5
  276. package/dist/rules/source-cache.d.ts.map +1 -1
  277. package/dist/rules/source-cache.js +35 -22
  278. package/dist/rules/source-cache.js.map +1 -1
  279. package/package.json +10 -2
@@ -1,5 +1,13 @@
1
+ /* -------------------------------------------------------------------------- */
2
+ /* Helpers for Effect resource-lifetime lint rules. */
3
+ /* -------------------------------------------------------------------------- */
1
4
  import { findBalancedCallEnd, isInsideCall, stripCommentsAndStrings, } from './effect-source-helpers.js';
2
- function hasUnreleasedAcquire(source) {
5
+ /**
6
+ * Internal helper exported for package-local composition.
7
+ *
8
+ * @internal
9
+ */
10
+ export const hasUnreleasedAcquire = (source) => {
3
11
  const code = stripCommentsAndStrings(source);
4
12
  for (const match of code.matchAll(/Effect\.(?:sync|try|tryPromise)\s*\(/g)) {
5
13
  const openParenIndex = code.indexOf('(', match.index);
@@ -10,13 +18,13 @@ function hasUnreleasedAcquire(source) {
10
18
  }
11
19
  }
12
20
  return false;
13
- }
14
- function assignedBindingNameBefore(source, targetIndex) {
21
+ };
22
+ const assignedBindingNameBefore = (source, targetIndex) => {
15
23
  const statementStart = source.lastIndexOf(';', targetIndex) + 1;
16
24
  const prefix = source.slice(statementStart, targetIndex);
17
25
  return /\b(?:const|let)\s+([A-Za-z_$][\w$]*)\s*=\s*$/.exec(prefix)?.[1];
18
- }
19
- function isBindingUsedInScopedBoundary(source, bindingName) {
26
+ };
27
+ const isBindingUsedInScopedBoundary = (source, bindingName) => {
20
28
  const bindingPattern = new RegExp(`\\b${bindingName}\\b`);
21
29
  for (const match of source.matchAll(/\b(?:Effect|Layer)\.scoped\s*\(/g)) {
22
30
  const openParenIndex = source.indexOf('(', match.index);
@@ -26,8 +34,8 @@ function isBindingUsedInScopedBoundary(source, bindingName) {
26
34
  }
27
35
  }
28
36
  return false;
29
- }
30
- function hasScopedPipeAfterCall(source, callEndIndex) {
37
+ };
38
+ const hasScopedPipeAfterCall = (source, callEndIndex) => {
31
39
  const tail = source.slice(callEndIndex + 1);
32
40
  const pipeMatch = /^\s*\.pipe\s*\(/.exec(tail);
33
41
  if (!pipeMatch) {
@@ -37,8 +45,13 @@ function hasScopedPipeAfterCall(source, callEndIndex) {
37
45
  const openParenIndex = source.indexOf('(', pipeStart);
38
46
  const pipeBody = source.slice(openParenIndex + 1, findBalancedCallEnd(source, openParenIndex));
39
47
  return /\b(?:Effect|Layer)\.scoped\b/.test(pipeBody);
40
- }
41
- function hasUnscopedAcquireRelease(source) {
48
+ };
49
+ /**
50
+ * Internal helper exported for package-local composition.
51
+ *
52
+ * @internal
53
+ */
54
+ export const hasUnscopedAcquireRelease = (source) => {
42
55
  const code = stripCommentsAndStrings(source);
43
56
  for (const match of code.matchAll(/Effect\.acquireRelease\s*\(/g)) {
44
57
  const bindingName = assignedBindingNameBefore(code, match.index);
@@ -51,8 +64,13 @@ function hasUnscopedAcquireRelease(source) {
51
64
  }
52
65
  }
53
66
  return false;
54
- }
55
- function hasUnscopedResourceWorkflow(source) {
67
+ };
68
+ /**
69
+ * Internal helper exported for package-local composition.
70
+ *
71
+ * @internal
72
+ */
73
+ export const hasUnscopedResourceWorkflow = (source) => {
56
74
  const code = stripCommentsAndStrings(source);
57
75
  for (const match of code.matchAll(/\b(?:Socket|Connection)\.(?:open|connect|listen|subscribe)\w*\s*\(/g)) {
58
76
  if (!isInsideCall(code, match.index, /\b(?:Effect|Layer)\.scoped\s*\(/g)) {
@@ -60,6 +78,5 @@ function hasUnscopedResourceWorkflow(source) {
60
78
  }
61
79
  }
62
80
  return false;
63
- }
64
- export { hasUnreleasedAcquire, hasUnscopedAcquireRelease, hasUnscopedResourceWorkflow };
81
+ };
65
82
  //# sourceMappingURL=effect-default-resource-helpers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"effect-default-resource-helpers.js","sourceRoot":"","sources":["../../src/rules/effect-default-resource-helpers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"effect-default-resource-helpers.js","sourceRoot":"","sources":["../../src/rules/effect-default-resource-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 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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"}