@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,334 @@
1
+ /* -------------------------------------------------------------------------- */
2
+ /* Core opt-in strict custom Effect lint rule specs. */
3
+ /* -------------------------------------------------------------------------- */
4
+ import { exportedDeclarationTexts, stripCommentsAndStrings } from './effect-source-helpers.js';
5
+ import { hasAsyncPushWithoutBuffer, hasBoundaryDataWithoutSchema, hasCommandHandlerWithoutSchema, hasDuplicateLayerInstance, hasEnsuringCleanupWithoutOnExit, hasExternalEffectWithoutSpan, hasExternalEffectWithoutTimeout, hasHTTPClientResponseWithoutSchema, hasHTTPServerRequestWithoutSchema, hasIdempotentExternalEffectWithoutRetry, hasLayerFactory, hasLiveTestService, hasNPlusOneWithoutBatchedResolver, hasOutputBoundaryWithoutSchema, hasPersistenceReadWithoutSchema, hasRealTestService, hasSharedMutableStateWithoutRef, hasSharedResourceForEachWithoutSemaphore, hasTimeCodeWithoutTestClock, hasUnbatchedResolver, hasUnprovidedServiceInEffectTest, hasUnsafeResourceStream, hasUnscopedResourceLayer, hasUnscopedResourceLoop, hasUnterminatedLongRunningStream, } from './effect-strict-helpers.js';
6
+ import { hasDirectPlatformAccess, hasEffectSignal, hasExportedRunPromiseAPI, hasPromiseReturningPublicAPI, hasRetryScheduleWithoutJitter, hasRunSyncInServerRequestHandler, hasRuntimeCall, publicAPIDeclarationSignature, } from './effect-strict-internals.js';
7
+ import { isConfiguredPath, isEffectTestPath, isUnitTestPath } from './effect-path-options.js';
8
+ import { hasRunForkWithoutObserver } from './effect-default-helpers.js';
9
+ /**
10
+ * Internal helper exported for package-local composition.
11
+ *
12
+ * @internal
13
+ */
14
+ export const effectStrictCoreSpecs = [
15
+ {
16
+ check: (source, context) => hasRuntimeCall(source) &&
17
+ !hasExportedRunPromiseAPI(source) &&
18
+ !hasRunForkWithoutObserver(source) &&
19
+ !isEffectTestPath(context) &&
20
+ !isConfiguredPath(context, 'entrypoints'),
21
+ message: 'Run Effect programs only from configured entrypoints.',
22
+ name: 'effect-no-run-outside-entrypoints',
23
+ tokens: ['Effect', 'effect', 'runMain'],
24
+ },
25
+ {
26
+ check: (source, context) => isConfiguredPath(context, 'entrypoints') &&
27
+ /Effect\.run(?:Promise|Sync|Fork)/.test(stripCommentsAndStrings(source)),
28
+ message: 'Entrypoints should use the platform runMain boundary instead of raw Effect runners.',
29
+ name: 'effect-require-platform-runmain-at-entrypoints',
30
+ tokens: ['Effect.run', 'effect/Effect', 'runPromise', 'runSync', 'runFork'],
31
+ },
32
+ {
33
+ check: hasRunSyncInServerRequestHandler,
34
+ message: 'Server handlers must not synchronously run Effects.',
35
+ name: 'effect-no-runSync-in-server-request-handlers',
36
+ tokens: ['Effect.runSync'],
37
+ },
38
+ {
39
+ check: hasPromiseReturningPublicAPI,
40
+ message: 'Public APIs should expose Effect return types instead of Promise.',
41
+ name: 'effect-no-promise-returning-public-api',
42
+ tokens: ['Promise', 'async'],
43
+ },
44
+ {
45
+ check: (source, context) => /\bprocess\s*\.\s*env\b/.test(stripCommentsAndStrings(source)) &&
46
+ !hasEffectSignal(source) &&
47
+ !isConfiguredPath(context, 'configLayers'),
48
+ message: 'Read process.env only inside the configured Effect Config layer.',
49
+ name: 'effect-no-direct-process-env-outside-config-layer',
50
+ tokens: ['process'],
51
+ },
52
+ {
53
+ check: (source, context) => /\b(?:Date\s*\.\s*now|Math\s*\.\s*random)\s*\(/.test(stripCommentsAndStrings(source)) &&
54
+ !hasEffectSignal(source) &&
55
+ !isConfiguredPath(context, 'adapterLayers'),
56
+ message: 'Use Clock and Random services outside configured adapter modules.',
57
+ name: 'effect-no-direct-clock-random-outside-adapters',
58
+ tokens: ['Date', 'Math'],
59
+ },
60
+ {
61
+ check: hasDirectPlatformAccess,
62
+ message: 'Use Effect platform services for HTTP and filesystem access outside adapters.',
63
+ name: 'effect-no-direct-http-fs-outside-platform-services',
64
+ tokens: ['fetch', 'readFileSync', 'writeFileSync', 'createReadStream'],
65
+ },
66
+ {
67
+ message: 'Services must use the configured class-based Effect service pattern.',
68
+ name: 'effect-require-service-class-pattern',
69
+ patterns: [/Context\.GenericTag(?:<[^>]+>)?\s*\(\s*['"`]/],
70
+ tokens: ['Context.GenericTag'],
71
+ },
72
+ {
73
+ message: 'Service tags require stable identifiers.',
74
+ name: 'effect-require-tag-identifier',
75
+ patterns: [
76
+ /Context\.Tag(?:<[^>]+>)?\s*\(\s*\)/,
77
+ /Context\.GenericTag(?:<[^>]+>)?\s*\(\s*\)/,
78
+ /class\s+[A-Z][\w$]*\s+extends\s+Context\.Tag\s*\(\s*\)/,
79
+ ],
80
+ tokens: ['Context.Tag', 'Context.GenericTag'],
81
+ },
82
+ {
83
+ check: (source, context) => isConfiguredPath(context, 'domain') && /Layer\.|Live\b/.test(stripCommentsAndStrings(source)),
84
+ message: 'Domain exports must not leak raw service implementation dependencies.',
85
+ name: 'effect-no-leaked-service-dependencies',
86
+ tokens: ['Layer', 'Live'],
87
+ },
88
+ {
89
+ check: hasDuplicateLayerInstance,
90
+ message: 'Do not construct the same Layer multiple times in one module.',
91
+ name: 'effect-no-duplicate-layer-instances',
92
+ tokens: ['Layer'],
93
+ },
94
+ {
95
+ check: (source, context) => /Effect\.provide|Layer\.provide/.test(stripCommentsAndStrings(source)) &&
96
+ !isConfiguredPath(context, 'compositionRoots'),
97
+ message: 'Provide layers only from configured composition roots.',
98
+ name: 'effect-require-centralized-provision',
99
+ tokens: ['Effect.provide', 'Layer.provide'],
100
+ },
101
+ {
102
+ check: (source, context) => isConfiguredPath(context, 'domain') &&
103
+ /Effect\.provide|Layer\.provide/.test(stripCommentsAndStrings(source)),
104
+ message: 'Domain modules should declare requirements, not provide concrete layers.',
105
+ name: 'effect-no-provide-in-domain-modules',
106
+ tokens: ['Effect.provide', 'Layer.provide'],
107
+ },
108
+ {
109
+ check: hasLayerFactory,
110
+ message: 'Shared layers should be memoized constants instead of functions that recreate resources.',
111
+ name: 'effect-require-layer-memoization-constant',
112
+ tokens: ['Layer'],
113
+ },
114
+ {
115
+ message: 'Circular layer dependencies must be suspended.',
116
+ name: 'effect-require-suspend-for-circular-deps',
117
+ patterns: [
118
+ /Layer\.(?:effect|scoped)\s*\([\s\S]*?Layer\.(?:effect|scoped)\s*\((?![\s\S]*Effect\.suspend)/,
119
+ ],
120
+ tokens: ['Layer'],
121
+ },
122
+ {
123
+ message: 'Avoid tiny one-off Layer declarations that fragment dependency wiring.',
124
+ name: 'effect-avoid-layer-explosion',
125
+ patterns: [
126
+ /const\s+[A-Za-z_$][\w$]*Layer\s*=\s*Layer\.[\s\S]*const\s+[A-Za-z_$][\w$]*Layer\s*=\s*Layer\./,
127
+ ],
128
+ tokens: ['Layer'],
129
+ },
130
+ {
131
+ message: 'Use Layer.succeed for static pure services.',
132
+ name: 'effect-prefer-succeed-for-static-layers',
133
+ patterns: [/Layer\.effect\s*\([^,]+,\s*Effect\.succeed\s*\(/],
134
+ tokens: ['Layer.effect', 'Effect.succeed'],
135
+ },
136
+ {
137
+ check: hasUnscopedResourceLayer,
138
+ message: 'Layers that allocate resources must be scoped.',
139
+ name: 'effect-require-scoped-for-resource-layers',
140
+ tokens: ['Layer'],
141
+ },
142
+ {
143
+ check: (source, context) => !isConfiguredPath(context, 'adapterLayers') &&
144
+ !isConfiguredPath(context, 'configLayers') &&
145
+ !/Layer\./.test(stripCommentsAndStrings(source)) &&
146
+ /new\s+[A-Z][\w$]*(?:Service|Repo|Client)\s*\(/.test(stripCommentsAndStrings(source)),
147
+ message: 'Construct services inside Layers, not directly in domain or application logic.',
148
+ name: 'effect-no-service-construction-outside-layer',
149
+ tokens: ['Service', 'Repo', 'Client'],
150
+ },
151
+ {
152
+ check: hasBoundaryDataWithoutSchema,
153
+ message: 'Input boundaries must decode request, command, or message data with Schema.',
154
+ name: 'effect-schema-require-validation-at-input-boundaries',
155
+ tokens: ['.body', '.params', '.query', '.payload'],
156
+ },
157
+ {
158
+ check: hasOutputBoundaryWithoutSchema,
159
+ message: 'Output boundaries should encode or validate public response data.',
160
+ name: 'effect-schema-require-validation-at-output-boundaries',
161
+ tokens: ['Response.json', 'return json'],
162
+ },
163
+ {
164
+ check: hasHTTPClientResponseWithoutSchema,
165
+ message: 'HTTP client responses must be decoded with Schema.',
166
+ name: 'effect-schema-require-http-client-response-schema',
167
+ tokens: ['HttpClient.', 'response.json'],
168
+ },
169
+ {
170
+ check: hasHTTPServerRequestWithoutSchema,
171
+ message: 'HTTP server requests must be decoded with Schema.',
172
+ name: 'effect-schema-require-http-server-request-schema',
173
+ tokens: ['HttpRouter.', 'HttpServerRequest'],
174
+ },
175
+ {
176
+ check: (source, context) => isConfiguredPath(context, 'configLayers') &&
177
+ /Config\./.test(stripCommentsAndStrings(source)) &&
178
+ !/Schema\./.test(stripCommentsAndStrings(source)),
179
+ message: 'Configuration modules must decode configuration with Schema.',
180
+ name: 'effect-schema-require-config-schema',
181
+ tokens: ['Config'],
182
+ },
183
+ {
184
+ check: hasPersistenceReadWithoutSchema,
185
+ message: 'Persistence boundaries must validate loaded records with Schema.',
186
+ name: 'effect-schema-require-persistence-schema',
187
+ tokens: ['db.', 'database.', 'collection.', 'repository.'],
188
+ },
189
+ {
190
+ check: hasCommandHandlerWithoutSchema,
191
+ message: 'Public command handlers must declare and use input schemas.',
192
+ name: 'effect-schema-require-public-command-schema',
193
+ tokens: ['handler'],
194
+ },
195
+ {
196
+ check: (source) => exportedDeclarationTexts(source).some((declaration) => /\bunknown\b/.test(stripCommentsAndStrings(publicAPIDeclarationSignature(declaration)))),
197
+ message: 'unknown values must be decoded before crossing configured boundaries.',
198
+ name: 'effect-schema-no-unknown-crossing-boundary',
199
+ tokens: ['unknown'],
200
+ },
201
+ {
202
+ check: (source) => hasExternalEffectWithoutTimeout(source),
203
+ message: 'External effects must declare a timeout.',
204
+ name: 'effect-require-timeout-on-external-effects',
205
+ tokens: ['HttpClient.', 'fetch', 'FileSystem.', 'SqlClient.'],
206
+ },
207
+ {
208
+ check: (source) => hasIdempotentExternalEffectWithoutRetry(source),
209
+ message: 'Idempotent external effects must declare retry policy deliberately.',
210
+ name: 'effect-require-retry-policy-for-idempotent-external-effects',
211
+ tokens: ['HttpClient.', 'fetch', 'find', 'lookup', 'read'],
212
+ },
213
+ {
214
+ check: hasRetryScheduleWithoutJitter,
215
+ message: 'Retry schedules must include jitter.',
216
+ name: 'effect-require-schedule-jitter-for-retries',
217
+ tokenGroups: [['Effect.retry'], ['Schedule.']],
218
+ },
219
+ {
220
+ check: (source) => hasExternalEffectWithoutSpan(source),
221
+ message: 'External effects must declare an observability span.',
222
+ name: 'effect-require-span-external',
223
+ tokens: ['HttpClient.', 'fetch', 'FileSystem.', 'SqlClient.'],
224
+ },
225
+ {
226
+ check: hasSharedResourceForEachWithoutSemaphore,
227
+ message: 'Shared scarce resources must be guarded by Semaphore.',
228
+ name: 'effect-require-semaphore-for-shared-resources',
229
+ tokens: ['Effect.forEach'],
230
+ },
231
+ {
232
+ check: hasSharedMutableStateWithoutRef,
233
+ message: 'Shared mutable state must use Ref, SynchronizedRef, or scoped services.',
234
+ name: 'effect-require-ref-for-shared-mutable-state',
235
+ tokens: ['let '],
236
+ },
237
+ {
238
+ check: hasUnscopedResourceLoop,
239
+ message: 'Loops that acquire resources must scope each acquisition.',
240
+ name: 'effect-require-scoped-in-loops',
241
+ tokens: ['open', 'connect', 'subscribe', 'listen'],
242
+ },
243
+ {
244
+ check: hasEnsuringCleanupWithoutOnExit,
245
+ message: 'Cleanup logic should use onExit so success, failure, and interruption are handled.',
246
+ name: 'effect-require-onExit-for-cleanup',
247
+ tokens: ['Effect.ensuring', 'cleanup'],
248
+ },
249
+ {
250
+ check: hasUnsafeResourceStream,
251
+ message: 'Streams over resources must be scoped or bracketed.',
252
+ name: 'effect-require-stream-resource-safety',
253
+ tokens: ['Stream'],
254
+ },
255
+ {
256
+ check: hasUnterminatedLongRunningStream,
257
+ message: 'Long-running streams must declare termination or shutdown behavior.',
258
+ name: 'effect-require-stream-termination',
259
+ tokens: ['Stream'],
260
+ },
261
+ {
262
+ check: hasAsyncPushWithoutBuffer,
263
+ message: 'Stream.asyncPush must declare an explicit buffer/backpressure policy.',
264
+ name: 'effect-require-explicit-asyncPush-buffer',
265
+ tokens: ['Stream.asyncPush'],
266
+ },
267
+ {
268
+ check: hasUnbatchedResolver,
269
+ message: 'RequestResolver implementations should batch requests.',
270
+ name: 'effect-require-batching-for-resolver',
271
+ tokens: ['RequestResolver'],
272
+ },
273
+ {
274
+ check: hasNPlusOneWithoutBatchedResolver,
275
+ message: 'Potential N+1 data access should use a batched RequestResolver.',
276
+ name: 'effect-use-batched-resolver-for-n-plus-one',
277
+ tokens: ['Effect.forEach'],
278
+ },
279
+ {
280
+ message: 'Use PubSub for broadcast semantics instead of manually fanning out queues.',
281
+ name: 'effect-prefer-pubsub-for-broadcast',
282
+ patterns: [/Queue\.[\s\S]*?\bsubscribers\b|broadcast\s*\([\s\S]*?Queue\./],
283
+ tokens: ['Queue', 'broadcast', 'subscribers'],
284
+ },
285
+ {
286
+ check: (source, context) => isEffectTestPath(context) && hasUnprovidedServiceInEffectTest(source),
287
+ message: 'Effect tests must provide required services explicitly.',
288
+ name: 'effect-require-provided-services-in-tests',
289
+ tokens: ['Service', 'Repo', 'Client'],
290
+ },
291
+ {
292
+ check: (source, context) => isUnitTestPath(context) && hasRealTestService(source),
293
+ message: 'Unit tests should use in-memory service implementations.',
294
+ name: 'effect-prefer-in-memory-implementations',
295
+ tokens: ['real'],
296
+ },
297
+ {
298
+ check: (source, context) => isUnitTestPath(context) && hasLiveTestService(source),
299
+ message: 'Live services belong in integration tests, not unit tests.',
300
+ name: 'effect-no-live-services-in-unit-tests',
301
+ tokens: ['Live', 'Layer.live'],
302
+ },
303
+ {
304
+ check: (source, context) => isEffectTestPath(context) && hasTimeCodeWithoutTestClock(source),
305
+ message: 'Tests for time-dependent Effect code should use TestClock.',
306
+ name: 'effect-require-testclock-for-time-code',
307
+ tokens: ['Effect.timeout', 'Effect.delay', 'Clock.'],
308
+ },
309
+ {
310
+ check: (source, context) => isEffectTestPath(context) &&
311
+ /const\s+[A-Za-z_$][\w$]*(?:Runtime|Layer|Service)\s*=/.test(source),
312
+ message: 'Do not share mutable runtime, layer, or service state across Effect tests.',
313
+ name: 'effect-no-test-runtime-leakage',
314
+ tokens: ['Runtime', 'Layer', 'Service'],
315
+ },
316
+ {
317
+ message: 'Do not hide Effect semantics behind local wrapper DSLs.',
318
+ name: 'effect-no-ad-hoc-effect-wrapper-abstractions',
319
+ patterns: [/function\s+(?:runEffect|makeEffect|effectify|toEffect)\s*\(/],
320
+ tokens: ['runEffect', 'makeEffect', 'effectify', 'toEffect'],
321
+ },
322
+ {
323
+ check: (source) => source.split('\n').some((line) => {
324
+ if (!/(?:eslint|oxlint)-disable[^\n]*effect-/.test(line)) {
325
+ return false;
326
+ }
327
+ return !/(?:reason|because)[^\n]*(?:[A-Z]+-\d+|#\d+)/.test(line);
328
+ }),
329
+ message: 'Effect rule suppressions must name a rule, a reason, and a tracking ticket.',
330
+ name: 'effect-require-effect-suppression-reason-and-ticket',
331
+ tokens: ['disable', 'effect-'],
332
+ },
333
+ ];
334
+ //# sourceMappingURL=effect-strict-core-specs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"effect-strict-core-specs.js","sourceRoot":"","sources":["../../src/rules/effect-strict-core-specs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Internal helper exported for package-local composition.
3
+ *
4
+ * @internal
5
+ */
6
+ export declare const hasExternalEffectWithoutTimeout: (source: string, options?: {
7
+ allowFetch: boolean;
8
+ }) => boolean;
9
+ /**
10
+ * Internal helper exported for package-local composition.
11
+ *
12
+ * @internal
13
+ */
14
+ export declare const hasExternalEffectWithoutSpan: (source: string, options?: {
15
+ allowFetch: boolean;
16
+ }) => boolean;
17
+ /**
18
+ * Internal helper exported for package-local composition.
19
+ *
20
+ * @internal
21
+ */
22
+ export declare const hasIdempotentExternalEffectWithoutRetry: (source: string, options?: {
23
+ allowFetch: boolean;
24
+ }) => boolean;
25
+ //# sourceMappingURL=effect-strict-external-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"effect-strict-external-helpers.d.ts","sourceRoot":"","sources":["../../src/rules/effect-strict-external-helpers.ts"],"names":[],"mappings":"AAuDA;;;;GAIG;AACH,eAAO,MAAM,+BAA+B,GAC1C,QAAQ,MAAM,EACd,UAAS;IAAE,UAAU,EAAE,OAAO,CAAA;CAAyB,KACtD,OAAwF,CAAC;AAM5F;;;;GAIG;AACH,eAAO,MAAM,4BAA4B,GACvC,QAAQ,MAAM,EACd,UAAS;IAAE,UAAU,EAAE,OAAO,CAAA;CAAyB,KACtD,OAAqF,CAAC;AAiCzF;;;;GAIG;AACH,eAAO,MAAM,uCAAuC,GAClD,QAAQ,MAAM,EACd,UAAS;IAAE,UAAU,EAAE,OAAO,CAAA;CAAyB,KACtD,OAwBF,CAAC"}
@@ -0,0 +1,87 @@
1
+ /* -------------------------------------------------------------------------- */
2
+ /* External-call predicates for opt-in strict Effect lint rules. */
3
+ /* -------------------------------------------------------------------------- */
4
+ import { enclosingEffectWrapperSegment, hasTopLevelPipeOperator, localEffectCallSegment, } from './effect-strict-segment-helpers.js';
5
+ import { isInsideCall, stripComments, stripCommentsAndStrings } from './effect-source-helpers.js';
6
+ import { hasEffectSignal } from './effect-rule-core.js';
7
+ const EXTERNAL_CALL_PATTERN = /\b(?:HttpClient\.(?:get|post|put|patch|delete|request)|fetch|FileSystem\.[A-Za-z_$][\w$]*|SqlClient\.[A-Za-z_$][\w$]*)\s*\(/g;
8
+ const IDEMPOTENT_EXTERNAL_CALL_PATTERN = /\b(?:HttpClient\.(?:get|head|put|delete)|fetch|(?:find|lookup|read)[A-Z]\w*)\s*\(/g;
9
+ const hasExternalCallSignal = (source) => source.includes('HttpClient.') ||
10
+ source.includes('fetch') ||
11
+ source.includes('FileSystem.') ||
12
+ source.includes('SqlClient.');
13
+ const isFetchSkipped = (matchText, enclosingWrapper, options) => matchText.startsWith('fetch') && (!enclosingWrapper || !options.allowFetch);
14
+ const shouldReportMissingTimeout = (code, index, segment) => !isInsideCall(code, index, /Effect\.timeout\s*\(/g) &&
15
+ !hasTopLevelPipeOperator(segment, 'timeout');
16
+ const hasExternalEffectMissingOperator = (source, options, shouldReport) => {
17
+ if (!hasExternalCallSignal(source)) {
18
+ return false;
19
+ }
20
+ const code = stripCommentsAndStrings(source);
21
+ for (const match of code.matchAll(EXTERNAL_CALL_PATTERN)) {
22
+ const enclosingWrapper = enclosingEffectWrapperSegment(code, match.index);
23
+ if (!isFetchSkipped(match[0], enclosingWrapper, options)) {
24
+ const segment = enclosingWrapper ?? localEffectCallSegment(code, match.index);
25
+ if (shouldReport(code, match.index, segment)) {
26
+ return true;
27
+ }
28
+ }
29
+ }
30
+ return false;
31
+ };
32
+ /**
33
+ * Internal helper exported for package-local composition.
34
+ *
35
+ * @internal
36
+ */
37
+ export const hasExternalEffectWithoutTimeout = (source, options = { allowFetch: true }) => hasExternalEffectMissingOperator(source, options, shouldReportMissingTimeout);
38
+ const shouldReportMissingSpan = (source, index, segment) => !isInsideCall(source, index, /Effect\.withSpan\s*\(/g) &&
39
+ !hasTopLevelPipeOperator(segment, 'withSpan');
40
+ /**
41
+ * Internal helper exported for package-local composition.
42
+ *
43
+ * @internal
44
+ */
45
+ export const hasExternalEffectWithoutSpan = (source, options = { allowFetch: true }) => hasExternalEffectMissingOperator(source, options, shouldReportMissingSpan);
46
+ const hasIdempotentExternalCallSignal = (source) => source.includes('HttpClient.') ||
47
+ source.includes('fetch') ||
48
+ source.includes('find') ||
49
+ source.includes('lookup') ||
50
+ source.includes('read');
51
+ const isUnrelatedNamedRead = (source, matchText) => /^(?:find|lookup|read)[A-Z]/.test(matchText) && !hasEffectSignal(source);
52
+ const isMutatingFetchCall = (matchText, rawSegment) => matchText.startsWith('fetch') &&
53
+ /\bmethod\s*:\s*['"](?!(?:GET|HEAD|PUT|DELETE)['"])/.test(stripComments(rawSegment));
54
+ const retryScanInput = (source, code, match, options) => {
55
+ const index = match.index ?? 0;
56
+ const enclosingWrapper = enclosingEffectWrapperSegment(code, index);
57
+ const rawEnclosingWrapper = enclosingEffectWrapperSegment(source, index);
58
+ const rawSegment = rawEnclosingWrapper ?? localEffectCallSegment(source, index);
59
+ return {
60
+ isMutatingFetch: isMutatingFetchCall(match[0], rawSegment),
61
+ segment: enclosingWrapper ?? localEffectCallSegment(code, index),
62
+ shouldSkipFetch: isFetchSkipped(match[0], enclosingWrapper, options),
63
+ };
64
+ };
65
+ /**
66
+ * Internal helper exported for package-local composition.
67
+ *
68
+ * @internal
69
+ */
70
+ export const hasIdempotentExternalEffectWithoutRetry = (source, options = { allowFetch: true }) => {
71
+ if (!hasIdempotentExternalCallSignal(source)) {
72
+ return false;
73
+ }
74
+ const code = stripCommentsAndStrings(source);
75
+ for (const match of code.matchAll(IDEMPOTENT_EXTERNAL_CALL_PATTERN)) {
76
+ if (!isUnrelatedNamedRead(source, match[0])) {
77
+ const input = retryScanInput(source, code, match, options);
78
+ if (shouldReportMissingRetry(code, match.index, input.segment, input.shouldSkipFetch, input.isMutatingFetch)) {
79
+ return true;
80
+ }
81
+ }
82
+ }
83
+ return false;
84
+ };
85
+ const shouldReportMissingRetry = (code, index, segment, shouldSkipFetch, isMutatingFetch) => !shouldSkipFetch && !isMutatingFetch && isMissingRetryPolicy(code, index, segment);
86
+ const isMissingRetryPolicy = (code, index, segment) => !isInsideCall(code, index, /Effect\.retry\s*\(/g) && !hasTopLevelPipeOperator(segment, 'retry');
87
+ //# sourceMappingURL=effect-strict-external-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"effect-strict-external-helpers.js","sourceRoot":"","sources":["../../src/rules/effect-strict-external-helpers.ts"],"names":[],"mappings":"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"}
@@ -1,34 +1,76 @@
1
- declare function hasLayerFactory(source: string): boolean;
2
- declare function hasUnscopedResourceLayer(source: string): boolean;
3
- declare function hasBoundaryDataWithoutSchema(source: string): boolean;
4
- declare function hasHttpServerRequestWithoutSchema(source: string): boolean;
5
- declare function hasPersistenceReadWithoutSchema(source: string): boolean;
6
- declare function hasCommandHandlerWithoutSchema(source: string): boolean;
7
- declare function hasUnscopedResourceLoop(source: string): boolean;
8
- declare function hasUnsafeResourceStream(source: string): boolean;
9
- declare function hasLiveTestService(source: string): boolean;
10
- declare function hasRealTestService(source: string): boolean;
11
- declare function hasDuplicateLayerInstance(source: string): boolean;
12
- declare function hasOutputBoundaryWithoutSchema(source: string): boolean;
13
- declare function hasHttpClientResponseWithoutSchema(source: string): boolean;
14
- declare function hasSharedResourceForEachWithoutSemaphore(source: string): boolean;
15
- declare function hasEnsuringCleanupWithoutOnExit(source: string): boolean;
16
- declare function hasUnterminatedLongRunningStream(source: string): boolean;
17
- declare function hasAsyncPushWithoutBuffer(source: string): boolean;
18
- declare function hasUnbatchedResolver(source: string): boolean;
19
- declare function hasNPlusOneWithoutBatchedResolver(source: string): boolean;
20
- declare function hasExternalEffectWithoutTimeout(source: string, options?: {
21
- allowFetch: boolean;
22
- }): boolean;
23
- declare function hasExternalEffectWithoutSpan(source: string, options?: {
24
- allowFetch: boolean;
25
- }): boolean;
26
- declare function hasIdempotentExternalEffectWithoutRetry(source: string, options?: {
27
- allowFetch: boolean;
28
- }): boolean;
29
- declare function hasUnprovidedServiceInEffectTest(source: string): boolean;
30
- declare function hasTimeCodeWithoutTestClock(source: string): boolean;
31
- declare function hasMutableStateWithoutRef(source: string): boolean;
32
- declare const hasSharedMutableStateWithoutRef: typeof hasMutableStateWithoutRef;
33
- export { hasAsyncPushWithoutBuffer, hasBoundaryDataWithoutSchema, hasCommandHandlerWithoutSchema, hasDuplicateLayerInstance, hasEnsuringCleanupWithoutOnExit, hasExternalEffectWithoutTimeout, hasExternalEffectWithoutSpan, hasHttpClientResponseWithoutSchema, hasHttpServerRequestWithoutSchema, hasIdempotentExternalEffectWithoutRetry, hasLayerFactory, hasLiveTestService, hasMutableStateWithoutRef, hasNPlusOneWithoutBatchedResolver, hasOutputBoundaryWithoutSchema, hasPersistenceReadWithoutSchema, hasRealTestService, hasSharedResourceForEachWithoutSemaphore, hasSharedMutableStateWithoutRef, hasTimeCodeWithoutTestClock, hasUnbatchedResolver, hasUnprovidedServiceInEffectTest, hasUnscopedResourceLayer, hasUnscopedResourceLoop, hasUnsafeResourceStream, hasUnterminatedLongRunningStream, };
1
+ export { hasBoundaryDataWithoutSchema, hasCommandHandlerWithoutSchema, hasHTTPServerRequestWithoutSchema, hasPersistenceReadWithoutSchema, } from './effect-strict-boundary-helpers';
2
+ export { hasExternalEffectWithoutSpan, hasExternalEffectWithoutTimeout, hasIdempotentExternalEffectWithoutRetry, } from './effect-strict-external-helpers';
3
+ export { hasDuplicateLayerInstance, hasLayerFactory, hasLiveTestService, hasRealTestService, hasUnscopedResourceLayer, hasUnscopedResourceLoop, hasUnsafeResourceStream, } from './effect-strict-segment-helpers';
4
+ /**
5
+ * Internal helper exported for package-local composition.
6
+ *
7
+ * @internal
8
+ */
9
+ export declare const hasOutputBoundaryWithoutSchema: (source: string) => boolean;
10
+ /**
11
+ * Internal helper exported for package-local composition.
12
+ *
13
+ * @internal
14
+ */
15
+ export declare const hasHTTPClientResponseWithoutSchema: (source: string) => boolean;
16
+ /**
17
+ * Internal helper exported for package-local composition.
18
+ *
19
+ * @internal
20
+ */
21
+ export declare const hasSharedResourceForEachWithoutSemaphore: (source: string) => boolean;
22
+ /**
23
+ * Internal helper exported for package-local composition.
24
+ *
25
+ * @internal
26
+ */
27
+ export declare const hasEnsuringCleanupWithoutOnExit: (source: string) => boolean;
28
+ /**
29
+ * Internal helper exported for package-local composition.
30
+ *
31
+ * @internal
32
+ */
33
+ export declare const hasUnterminatedLongRunningStream: (source: string) => boolean;
34
+ /**
35
+ * Internal helper exported for package-local composition.
36
+ *
37
+ * @internal
38
+ */
39
+ export declare const hasAsyncPushWithoutBuffer: (source: string) => boolean;
40
+ /**
41
+ * Internal helper exported for package-local composition.
42
+ *
43
+ * @internal
44
+ */
45
+ export declare const hasUnbatchedResolver: (source: string) => boolean;
46
+ /**
47
+ * Internal helper exported for package-local composition.
48
+ *
49
+ * @internal
50
+ */
51
+ export declare const hasNPlusOneWithoutBatchedResolver: (source: string) => boolean;
52
+ /**
53
+ * Internal helper exported for package-local composition.
54
+ *
55
+ * @internal
56
+ */
57
+ export declare const hasUnprovidedServiceInEffectTest: (source: string) => boolean;
58
+ /**
59
+ * Internal helper exported for package-local composition.
60
+ *
61
+ * @internal
62
+ */
63
+ export declare const hasTimeCodeWithoutTestClock: (source: string) => boolean;
64
+ /**
65
+ * Internal helper exported for package-local composition.
66
+ *
67
+ * @internal
68
+ */
69
+ export declare const hasMutableStateWithoutRef: (source: string) => boolean;
70
+ /**
71
+ * Internal helper exported for package-local composition.
72
+ *
73
+ * @internal
74
+ */
75
+ export declare const hasSharedMutableStateWithoutRef: (source: string) => boolean;
34
76
  //# sourceMappingURL=effect-strict-helpers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"effect-strict-helpers.d.ts","sourceRoot":"","sources":["../../src/rules/effect-strict-helpers.ts"],"names":[],"mappings":"AAyBA,iBAAS,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAQhD;AAED,iBAAS,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAczD;AAED,iBAAS,4BAA4B,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAoB7D;AAED,iBAAS,iCAAiC,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAsBlE;AAED,iBAAS,+BAA+B,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAoBhE;AAED,iBAAS,8BAA8B,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAU/D;AAED,iBAAS,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAaxD;AAED,iBAAS,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAaxD;AAED,iBAAS,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED,iBAAS,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED,iBAAS,yBAAyB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAc1D;AAuBD,iBAAS,8BAA8B,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAW/D;AAED,iBAAS,kCAAkC,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAUnE;AAED,iBAAS,wCAAwC,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAczE;AAED,iBAAS,+BAA+B,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAUhE;AAED,iBAAS,gCAAgC,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAUjE;AAED,iBAAS,yBAAyB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAU1D;AAED,iBAAS,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAUrD;AAED,iBAAS,iCAAiC,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAalE;AAoCD,iBAAS,+BAA+B,CACtC,MAAM,EAAE,MAAM,EACd,OAAO,GAAE;IAAE,UAAU,EAAE,OAAO,CAAA;CAAyB,GACtD,OAAO,CAoBT;AAED,iBAAS,4BAA4B,CACnC,MAAM,EAAE,MAAM,EACd,OAAO,GAAE;IAAE,UAAU,EAAE,OAAO,CAAA;CAAyB,GACtD,OAAO,CAoBT;AAED,iBAAS,uCAAuC,CAC9C,MAAM,EAAE,MAAM,EACd,OAAO,GAAE;IAAE,UAAU,EAAE,OAAO,CAAA;CAAyB,GACtD,OAAO,CA4BT;AAED,iBAAS,gCAAgC,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAMjE;AAED,iBAAS,2BAA2B,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAI5D;AAED,iBAAS,yBAAyB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAY1D;AAED,QAAA,MAAM,+BAA+B,kCAA4B,CAAC;AAElE,OAAO,EACL,yBAAyB,EACzB,4BAA4B,EAC5B,8BAA8B,EAC9B,yBAAyB,EACzB,+BAA+B,EAC/B,+BAA+B,EAC/B,4BAA4B,EAC5B,kCAAkC,EAClC,iCAAiC,EACjC,uCAAuC,EACvC,eAAe,EACf,kBAAkB,EAClB,yBAAyB,EACzB,iCAAiC,EACjC,8BAA8B,EAC9B,+BAA+B,EAC/B,kBAAkB,EAClB,wCAAwC,EACxC,+BAA+B,EAC/B,2BAA2B,EAC3B,oBAAoB,EACpB,gCAAgC,EAChC,wBAAwB,EACxB,uBAAuB,EACvB,uBAAuB,EACvB,gCAAgC,GACjC,CAAC"}
1
+ {"version":3,"file":"effect-strict-helpers.d.ts","sourceRoot":"","sources":["../../src/rules/effect-strict-helpers.ts"],"names":[],"mappings":"AAYA,OAAO,EACL,4BAA4B,EAC5B,8BAA8B,EAC9B,iCAAiC,EACjC,+BAA+B,GAChC,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EACL,4BAA4B,EAC5B,+BAA+B,EAC/B,uCAAuC,GACxC,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EACL,yBAAyB,EACzB,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EAClB,wBAAwB,EACxB,uBAAuB,EACvB,uBAAuB,GACxB,MAAM,iCAAiC,CAAC;AAIzC;;;;GAIG;AACH,eAAO,MAAM,8BAA8B,GAAI,QAAQ,MAAM,KAAG,OAe/D,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,kCAAkC,GAAI,QAAQ,MAAM,KAAG,OAcnE,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,wCAAwC,GAAI,QAAQ,MAAM,KAAG,OAkBzE,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,+BAA+B,GAAI,QAAQ,MAAM,KAAG,OAchE,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,gCAAgC,GAAI,QAAQ,MAAM,KAAG,OAcjE,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,GAAI,QAAQ,MAAM,KAAG,OAc1D,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,GAAI,QAAQ,MAAM,KAAG,OAcrD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,iCAAiC,GAAI,QAAQ,MAAM,KAAG,OAiBlE,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,gCAAgC,GAAI,QAAQ,MAAM,KAAG,OAUjE,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,2BAA2B,GAAI,QAAQ,MAAM,KAAG,OAa5D,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,GAAI,QAAQ,MAAM,KAAG,OAgB1D,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,+BAA+B,WAvBM,MAAM,KAAG,OAuBa,CAAC"}