oxlint-plugin-effect 0.2.0 → 0.2.2

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 (258) hide show
  1. package/dist/_virtual/_rolldown/runtime.js +13 -0
  2. package/dist/index.d.ts +4 -0
  3. package/dist/index.js +4 -0
  4. package/dist/plugin.d.ts +5 -0
  5. package/dist/plugin.js +18 -0
  6. package/dist/presets/core.d.ts +43 -0
  7. package/dist/presets/core.js +43 -0
  8. package/dist/presets/effect-native.d.ts +28 -0
  9. package/dist/presets/effect-native.js +28 -0
  10. package/dist/presets/full.d.ts +60 -0
  11. package/dist/presets/full.js +60 -0
  12. package/dist/presets/functional.d.ts +21 -0
  13. package/dist/presets/functional.js +21 -0
  14. package/dist/presets/index.d.ts +14 -0
  15. package/dist/presets/index.js +20 -0
  16. package/dist/presets/strict.d.ts +64 -0
  17. package/dist/presets/strict.js +64 -0
  18. package/dist/presets/v3-strict.d.ts +16 -0
  19. package/dist/presets/v3-strict.js +16 -0
  20. package/dist/presets/v3.d.ts +18 -0
  21. package/dist/presets/v3.js +18 -0
  22. package/dist/rules/_effect-context.d.ts +19 -0
  23. package/dist/rules/_effect-context.js +22 -0
  24. package/dist/rules/index.d.ts +66 -0
  25. package/dist/rules/index.js +124 -0
  26. package/dist/rules/no-arrow-ladder.d.ts +6 -0
  27. package/dist/rules/no-arrow-ladder.js +61 -0
  28. package/dist/rules/no-async-function.d.ts +6 -0
  29. package/dist/rules/no-async-function.js +46 -0
  30. package/dist/rules/no-catch-all-to-map-error.d.ts +6 -0
  31. package/dist/rules/no-catch-all-to-map-error.js +67 -0
  32. package/dist/rules/no-effect-as.d.ts +6 -0
  33. package/dist/rules/no-effect-as.js +16 -0
  34. package/dist/rules/no-effect-async.d.ts +6 -0
  35. package/dist/rules/no-effect-async.js +16 -0
  36. package/dist/rules/no-effect-bind.d.ts +6 -0
  37. package/dist/rules/no-effect-bind.js +16 -0
  38. package/dist/rules/no-effect-do.d.ts +6 -0
  39. package/dist/rules/no-effect-do.js +16 -0
  40. package/dist/rules/no-effect-fn-generator.d.ts +6 -0
  41. package/dist/rules/no-effect-fn-generator.js +30 -0
  42. package/dist/rules/no-effect-gen-adapter.d.ts +6 -0
  43. package/dist/rules/no-effect-gen-adapter.js +30 -0
  44. package/dist/rules/no-effect-map-flatten.d.ts +6 -0
  45. package/dist/rules/no-effect-map-flatten.js +53 -0
  46. package/dist/rules/no-effect-map-void.d.ts +6 -0
  47. package/dist/rules/no-effect-map-void.js +40 -0
  48. package/dist/rules/no-effect-never.d.ts +6 -0
  49. package/dist/rules/no-effect-never.js +16 -0
  50. package/dist/rules/no-effect-orElse-ladder.d.ts +6 -0
  51. package/dist/rules/no-effect-orElse-ladder.js +53 -0
  52. package/dist/rules/no-effect-succeed-string.d.ts +6 -0
  53. package/dist/rules/no-effect-succeed-string.js +30 -0
  54. package/dist/rules/no-effect-succeed-variable.d.ts +6 -0
  55. package/dist/rules/no-effect-succeed-variable.js +30 -0
  56. package/dist/rules/no-effect-succeed-void.d.ts +6 -0
  57. package/dist/rules/no-effect-succeed-void.js +33 -0
  58. package/dist/rules/no-effect-sync-console.d.ts +6 -0
  59. package/dist/rules/no-effect-sync-console.js +63 -0
  60. package/dist/rules/no-effect-sync-wrapper.d.ts +6 -0
  61. package/dist/rules/no-effect-sync-wrapper.js +37 -0
  62. package/dist/rules/no-effect-type-alias.d.ts +6 -0
  63. package/dist/rules/no-effect-type-alias.js +52 -0
  64. package/dist/rules/no-effect-wrapper-alias.d.ts +6 -0
  65. package/dist/rules/no-effect-wrapper-alias.js +69 -0
  66. package/dist/rules/no-extends-native-error.d.ts +6 -0
  67. package/dist/rules/no-extends-native-error.js +41 -0
  68. package/dist/rules/no-flatmap-ladder.d.ts +6 -0
  69. package/dist/rules/no-flatmap-ladder.js +48 -0
  70. package/dist/rules/no-fromnullable-coalesce.d.ts +6 -0
  71. package/dist/rules/no-fromnullable-coalesce.js +36 -0
  72. package/dist/rules/no-global-error-in-catch.d.ts +6 -0
  73. package/dist/rules/no-global-error-in-catch.js +75 -0
  74. package/dist/rules/no-global-error-in-failure.d.ts +6 -0
  75. package/dist/rules/no-global-error-in-failure.js +54 -0
  76. package/dist/rules/no-globals.d.ts +6 -0
  77. package/dist/rules/no-globals.js +164 -0
  78. package/dist/rules/no-if-statement.d.ts +6 -0
  79. package/dist/rules/no-if-statement.js +18 -0
  80. package/dist/rules/no-iife-wrapper.d.ts +6 -0
  81. package/dist/rules/no-iife-wrapper.js +37 -0
  82. package/dist/rules/no-inline-provide.d.ts +6 -0
  83. package/dist/rules/no-inline-provide.js +31 -0
  84. package/dist/rules/no-instanceof-schema.d.ts +6 -0
  85. package/dist/rules/no-instanceof-schema.js +35 -0
  86. package/dist/rules/no-manual-effect-channels.d.ts +6 -0
  87. package/dist/rules/no-manual-effect-channels.js +40 -0
  88. package/dist/rules/no-match-effect-branch.d.ts +6 -0
  89. package/dist/rules/no-match-effect-branch.js +64 -0
  90. package/dist/rules/no-match-void-branch.d.ts +6 -0
  91. package/dist/rules/no-match-void-branch.js +50 -0
  92. package/dist/rules/no-multiple-effect-provide.d.ts +6 -0
  93. package/dist/rules/no-multiple-effect-provide.js +45 -0
  94. package/dist/rules/no-nested-effect-call.d.ts +6 -0
  95. package/dist/rules/no-nested-effect-call.js +97 -0
  96. package/dist/rules/no-nested-effect-gen.d.ts +6 -0
  97. package/dist/rules/no-nested-effect-gen.js +46 -0
  98. package/dist/rules/no-nested-pipe.d.ts +6 -0
  99. package/dist/rules/no-nested-pipe.js +38 -0
  100. package/dist/rules/no-new-error.d.ts +6 -0
  101. package/dist/rules/no-new-error.js +39 -0
  102. package/dist/rules/no-new-promise.d.ts +6 -0
  103. package/dist/rules/no-new-promise.js +38 -0
  104. package/dist/rules/no-node-builtin-import.d.ts +6 -0
  105. package/dist/rules/no-node-builtin-import.js +61 -0
  106. package/dist/rules/no-option-as.d.ts +6 -0
  107. package/dist/rules/no-option-as.js +16 -0
  108. package/dist/rules/no-option-boolean-normalization.d.ts +6 -0
  109. package/dist/rules/no-option-boolean-normalization.js +50 -0
  110. package/dist/rules/no-positional-log-error.d.ts +6 -0
  111. package/dist/rules/no-positional-log-error.js +52 -0
  112. package/dist/rules/no-redundant-schema-tag-identifier.d.ts +6 -0
  113. package/dist/rules/no-redundant-schema-tag-identifier.js +46 -0
  114. package/dist/rules/no-return-in-arrow.d.ts +6 -0
  115. package/dist/rules/no-return-in-arrow.js +41 -0
  116. package/dist/rules/no-return-nullish.d.ts +6 -0
  117. package/dist/rules/no-return-nullish.js +47 -0
  118. package/dist/rules/no-run-in-effect-gen.d.ts +6 -0
  119. package/dist/rules/no-run-in-effect-gen.js +48 -0
  120. package/dist/rules/no-runtime-run-fork.d.ts +6 -0
  121. package/dist/rules/no-runtime-run-fork.js +19 -0
  122. package/dist/rules/no-schema-struct-with-tag.d.ts +6 -0
  123. package/dist/rules/no-schema-struct-with-tag.js +48 -0
  124. package/dist/rules/no-schema-union-of-literals.d.ts +6 -0
  125. package/dist/rules/no-schema-union-of-literals.js +35 -0
  126. package/dist/rules/no-string-sentinel-const.d.ts +6 -0
  127. package/dist/rules/no-string-sentinel-const.js +38 -0
  128. package/dist/rules/no-switch-statement.d.ts +6 -0
  129. package/dist/rules/no-switch-statement.js +16 -0
  130. package/dist/rules/no-ternary.d.ts +6 -0
  131. package/dist/rules/no-ternary.js +30 -0
  132. package/dist/rules/no-throw-statement.d.ts +6 -0
  133. package/dist/rules/no-throw-statement.js +34 -0
  134. package/dist/rules/no-try-catch.d.ts +6 -0
  135. package/dist/rules/no-try-catch.js +34 -0
  136. package/dist/rules/no-unnecessary-arrow-block.d.ts +6 -0
  137. package/dist/rules/no-unnecessary-arrow-block.js +34 -0
  138. package/dist/rules/no-unnecessary-effect-gen.d.ts +6 -0
  139. package/dist/rules/no-unnecessary-effect-gen.js +35 -0
  140. package/dist/rules/no-unnecessary-pipe-chain.d.ts +6 -0
  141. package/dist/rules/no-unnecessary-pipe-chain.js +36 -0
  142. package/dist/rules/no-unnecessary-pipe.d.ts +6 -0
  143. package/dist/rules/no-unnecessary-pipe.js +29 -0
  144. package/dist/vendor/effect-oxlint/AST.d.ts +199 -0
  145. package/dist/vendor/effect-oxlint/AST.js +214 -0
  146. package/dist/vendor/effect-oxlint/Comment.d.ts +55 -0
  147. package/dist/vendor/effect-oxlint/Comment.js +67 -0
  148. package/dist/vendor/effect-oxlint/Diagnostic.d.ts +86 -0
  149. package/dist/vendor/effect-oxlint/Diagnostic.js +115 -0
  150. package/dist/vendor/effect-oxlint/Plugin.d.ts +38 -0
  151. package/dist/vendor/effect-oxlint/Plugin.js +45 -0
  152. package/dist/vendor/effect-oxlint/Rule.d.ts +218 -0
  153. package/dist/vendor/effect-oxlint/Rule.js +309 -0
  154. package/dist/vendor/effect-oxlint/RuleContext.d.ts +77 -0
  155. package/dist/vendor/effect-oxlint/RuleContext.js +74 -0
  156. package/dist/vendor/effect-oxlint/Scope.d.ts +100 -0
  157. package/dist/vendor/effect-oxlint/Scope.js +110 -0
  158. package/dist/vendor/effect-oxlint/SourceCode.d.ts +180 -0
  159. package/dist/vendor/effect-oxlint/SourceCode.js +203 -0
  160. package/dist/vendor/effect-oxlint/Testing.d.ts +510 -0
  161. package/dist/vendor/effect-oxlint/Testing.js +963 -0
  162. package/dist/vendor/effect-oxlint/Token.d.ts +98 -0
  163. package/dist/vendor/effect-oxlint/Token.js +103 -0
  164. package/dist/vendor/effect-oxlint/Visitor.d.ts +166 -0
  165. package/dist/vendor/effect-oxlint/Visitor.js +138 -0
  166. package/dist/vendor/effect-oxlint/index.d.ts +13 -0
  167. package/dist/vendor/effect-oxlint/index.js +12 -0
  168. package/package.json +24 -5
  169. package/.effect-lsp.json +0 -60
  170. package/.oxlintrc.json +0 -33
  171. package/CHANGELOG.md +0 -55
  172. package/scripts/add-rule.ts +0 -87
  173. package/scripts/codegen.ts +0 -108
  174. package/src/index.ts +0 -9
  175. package/src/plugin.ts +0 -16
  176. package/src/presets/core.ts +0 -47
  177. package/src/presets/effect-native.ts +0 -34
  178. package/src/presets/full.ts +0 -70
  179. package/src/presets/functional.ts +0 -18
  180. package/src/presets/index.ts +0 -5
  181. package/src/presets/strict.ts +0 -77
  182. package/src/rules/_effect-context.ts +0 -28
  183. package/src/rules/index.ts +0 -72
  184. package/src/rules/no-arrow-ladder.ts +0 -70
  185. package/src/rules/no-async-function.ts +0 -47
  186. package/src/rules/no-catch-all-to-map-error.ts +0 -90
  187. package/src/rules/no-effect-as.ts +0 -14
  188. package/src/rules/no-effect-async.ts +0 -14
  189. package/src/rules/no-effect-bind.ts +0 -13
  190. package/src/rules/no-effect-do.ts +0 -14
  191. package/src/rules/no-effect-fn-generator.ts +0 -58
  192. package/src/rules/no-effect-gen-adapter.ts +0 -51
  193. package/src/rules/no-effect-map-flatten.ts +0 -82
  194. package/src/rules/no-effect-map-void.ts +0 -80
  195. package/src/rules/no-effect-never.ts +0 -14
  196. package/src/rules/no-effect-orElse-ladder.ts +0 -79
  197. package/src/rules/no-effect-succeed-string.ts +0 -52
  198. package/src/rules/no-effect-succeed-variable.ts +0 -50
  199. package/src/rules/no-effect-succeed-void.ts +0 -63
  200. package/src/rules/no-effect-sync-console.ts +0 -91
  201. package/src/rules/no-effect-sync-wrapper.ts +0 -67
  202. package/src/rules/no-effect-type-alias.ts +0 -71
  203. package/src/rules/no-effect-wrapper-alias.ts +0 -95
  204. package/src/rules/no-extends-native-error.ts +0 -54
  205. package/src/rules/no-flatmap-ladder.ts +0 -77
  206. package/src/rules/no-fromnullable-coalesce.ts +0 -62
  207. package/src/rules/no-global-error-in-catch.ts +0 -104
  208. package/src/rules/no-global-error-in-failure.ts +0 -83
  209. package/src/rules/no-globals.ts +0 -178
  210. package/src/rules/no-if-statement.ts +0 -16
  211. package/src/rules/no-iife-wrapper.ts +0 -51
  212. package/src/rules/no-inline-provide.ts +0 -41
  213. package/src/rules/no-instanceof-schema.ts +0 -42
  214. package/src/rules/no-manual-effect-channels.ts +0 -58
  215. package/src/rules/no-match-effect-branch.ts +0 -82
  216. package/src/rules/no-match-void-branch.ts +0 -72
  217. package/src/rules/no-multiple-effect-provide.ts +0 -75
  218. package/src/rules/no-nested-effect-call.ts +0 -57
  219. package/src/rules/no-nested-effect-gen.ts +0 -43
  220. package/src/rules/no-nested-pipe.ts +0 -73
  221. package/src/rules/no-new-error.ts +0 -53
  222. package/src/rules/no-new-promise.ts +0 -50
  223. package/src/rules/no-node-builtin-import.ts +0 -68
  224. package/src/rules/no-option-as.ts +0 -13
  225. package/src/rules/no-option-boolean-normalization.ts +0 -88
  226. package/src/rules/no-positional-log-error.ts +0 -76
  227. package/src/rules/no-redundant-schema-tag-identifier.ts +0 -62
  228. package/src/rules/no-return-in-arrow.ts +0 -76
  229. package/src/rules/no-return-nullish.ts +0 -80
  230. package/src/rules/no-run-in-effect-gen.ts +0 -66
  231. package/src/rules/no-runtime-run-fork.ts +0 -14
  232. package/src/rules/no-schema-struct-with-tag.ts +0 -64
  233. package/src/rules/no-schema-union-of-literals.ts +0 -48
  234. package/src/rules/no-string-sentinel-const.ts +0 -49
  235. package/src/rules/no-switch-statement.ts +0 -13
  236. package/src/rules/no-ternary.ts +0 -30
  237. package/src/rules/no-throw-statement.ts +0 -39
  238. package/src/rules/no-try-catch.ts +0 -39
  239. package/src/rules/no-unnecessary-arrow-block.ts +0 -51
  240. package/src/rules/no-unnecessary-effect-gen.ts +0 -83
  241. package/src/rules/no-unnecessary-pipe-chain.ts +0 -47
  242. package/src/rules/no-unnecessary-pipe.ts +0 -45
  243. package/src/vendor/effect-oxlint/AST.ts +0 -516
  244. package/src/vendor/effect-oxlint/Comment.ts +0 -86
  245. package/src/vendor/effect-oxlint/Diagnostic.ts +0 -199
  246. package/src/vendor/effect-oxlint/Plugin.ts +0 -71
  247. package/src/vendor/effect-oxlint/Rule.ts +0 -548
  248. package/src/vendor/effect-oxlint/RuleContext.ts +0 -144
  249. package/src/vendor/effect-oxlint/Scope.ts +0 -177
  250. package/src/vendor/effect-oxlint/SourceCode.ts +0 -377
  251. package/src/vendor/effect-oxlint/Testing.ts +0 -1227
  252. package/src/vendor/effect-oxlint/Token.ts +0 -131
  253. package/src/vendor/effect-oxlint/Visitor.ts +0 -287
  254. package/src/vendor/effect-oxlint/index.ts +0 -88
  255. package/tests/ban-rules.test.ts +0 -68
  256. package/tests/context-rules.test.ts +0 -263
  257. package/tests/pattern-rules.test.ts +0 -247
  258. package/tsconfig.json +0 -15
@@ -0,0 +1,46 @@
1
+ import { matchCallOf } from "../vendor/effect-oxlint/AST.js";
2
+ import { make } from "../vendor/effect-oxlint/Diagnostic.js";
3
+ import { RuleContext } from "../vendor/effect-oxlint/RuleContext.js";
4
+ import { define, meta } from "../vendor/effect-oxlint/Rule.js";
5
+ import "../vendor/effect-oxlint/index.js";
6
+ import * as Option from "effect/Option";
7
+ import * as Effect from "effect/Effect";
8
+ //#region src/rules/no-redundant-schema-tag-identifier.ts
9
+ const isTagKey = (key) => {
10
+ if (key.type === "Identifier" && "name" in key && key.name === "_tag") return true;
11
+ if (key.type === "Literal" && "value" in key && key.value === "_tag") return true;
12
+ return false;
13
+ };
14
+ const noRedundantSchemaTagIdentifier = define({
15
+ name: "no-redundant-schema-tag-identifier",
16
+ meta: meta({
17
+ type: "suggestion",
18
+ description: "Redundant _tag in TaggedStruct. TaggedStruct already provides _tag automatically."
19
+ }),
20
+ create: function* () {
21
+ const ctx = yield* RuleContext;
22
+ return { CallExpression: (node) => {
23
+ const call = node;
24
+ if (Option.isNone(matchCallOf(call, "Schema", "TaggedStruct"))) return Effect.void;
25
+ const args = call.arguments;
26
+ if (args.length < 2) return Effect.void;
27
+ const fieldsArg = args[1];
28
+ if (fieldsArg === void 0) return Effect.void;
29
+ if (fieldsArg.type !== "ObjectExpression") return Effect.void;
30
+ const props = fieldsArg["properties"];
31
+ if (!Array.isArray(props)) return Effect.void;
32
+ for (const prop of props) {
33
+ const p = prop;
34
+ if (p.type !== "Property") continue;
35
+ const key = p["key"];
36
+ if (isTagKey(key)) return ctx.report(make({
37
+ node: p,
38
+ message: "Redundant _tag property. Schema.TaggedStruct already provides _tag automatically."
39
+ }));
40
+ }
41
+ return Effect.void;
42
+ } };
43
+ }
44
+ });
45
+ //#endregion
46
+ export { noRedundantSchemaTagIdentifier };
@@ -0,0 +1,6 @@
1
+ import * as _$_oxlint_plugins0 from "@oxlint/plugins";
2
+
3
+ //#region src/rules/no-return-in-arrow.d.ts
4
+ declare const noReturnInArrow: _$_oxlint_plugins0.CreateRule;
5
+ //#endregion
6
+ export { noReturnInArrow };
@@ -0,0 +1,41 @@
1
+ import { make } from "../vendor/effect-oxlint/Diagnostic.js";
2
+ import { RuleContext } from "../vendor/effect-oxlint/RuleContext.js";
3
+ import { define, meta } from "../vendor/effect-oxlint/Rule.js";
4
+ import "../vendor/effect-oxlint/index.js";
5
+ import * as Effect from "effect/Effect";
6
+ //#region src/rules/no-return-in-arrow.ts
7
+ /**
8
+ * Ban explicit `return` in arrow function callbacks (info severity).
9
+ *
10
+ * Use expression-only callbacks + pipeline logic.
11
+ * Excludes Schema.filter callbacks where return is required.
12
+ *
13
+ * Source: biome-effect-linting-rules/no-return-in-arrow
14
+ */
15
+ const noReturnInArrow = define({
16
+ name: "no-return-in-arrow",
17
+ meta: meta({
18
+ type: "suggestion",
19
+ description: "Prefer expression-only arrow callbacks. Avoid explicit return in arrow functions."
20
+ }),
21
+ create: function* () {
22
+ const ctx = yield* RuleContext;
23
+ return { ArrowFunctionExpression: (node) => {
24
+ if ("body" in node && node.body != null && typeof node.body === "object" && "type" in node.body && node.body.type === "BlockStatement" && "body" in node.body && Array.isArray(node.body.body)) {
25
+ for (const stmt of node.body.body) if (stmt != null && typeof stmt === "object" && "type" in stmt && stmt.type === "ReturnStatement") {
26
+ if ("parent" in node && node.parent != null && typeof node.parent === "object" && "type" in node.parent && node.parent.type === "CallExpression" && "callee" in node.parent) {
27
+ const callee = node.parent.callee;
28
+ if (callee != null && typeof callee === "object" && "type" in callee && callee.type === "MemberExpression" && "property" in callee && callee.property != null && typeof callee.property === "object" && "name" in callee.property && (callee.property.name === "filter" || callee.property.name === "check")) return Effect.void;
29
+ }
30
+ return ctx.report(make({
31
+ node: stmt,
32
+ message: "Prefer expression-only arrow callbacks over explicit return."
33
+ }));
34
+ }
35
+ }
36
+ return Effect.void;
37
+ } };
38
+ }
39
+ });
40
+ //#endregion
41
+ export { noReturnInArrow };
@@ -0,0 +1,6 @@
1
+ import * as _$_oxlint_plugins0 from "@oxlint/plugins";
2
+
3
+ //#region src/rules/no-return-nullish.d.ts
4
+ declare const noReturnNullish: _$_oxlint_plugins0.CreateRule;
5
+ //#endregion
6
+ export { noReturnNullish };
@@ -0,0 +1,47 @@
1
+ import { make } from "../vendor/effect-oxlint/Diagnostic.js";
2
+ import { RuleContext } from "../vendor/effect-oxlint/RuleContext.js";
3
+ import { merge } from "../vendor/effect-oxlint/Visitor.js";
4
+ import { define, meta } from "../vendor/effect-oxlint/Rule.js";
5
+ import "../vendor/effect-oxlint/index.js";
6
+ import { makeEffectContextTracker } from "./_effect-context.js";
7
+ import * as Effect from "effect/Effect";
8
+ import * as Ref from "effect/Ref";
9
+ //#region src/rules/no-return-nullish.ts
10
+ /**
11
+ * Ban `return null`, `return undefined`, `return void 0`. Context-aware messaging.
12
+ *
13
+ * Inside Effect.gen/fn: "Use Option.none() or Effect.void"
14
+ * Outside: "Use Option.none() — convert nullish at system boundaries with Option.fromNullable"
15
+ *
16
+ * Source: biome-effect-linting-rules/no-return-null (extended)
17
+ */
18
+ const noReturnNullish = define({
19
+ name: "no-return-nullish",
20
+ meta: meta({
21
+ type: "suggestion",
22
+ description: "Avoid returning null/undefined. Use Option.none() for absence or Effect.void for void effects."
23
+ }),
24
+ create: function* () {
25
+ const ctx = yield* RuleContext;
26
+ const [depth, tracker] = yield* makeEffectContextTracker;
27
+ return merge(tracker, { ReturnStatement: (node) => Effect.flatMap(Ref.get(depth), (d) => {
28
+ if (node.type !== "ReturnStatement" || !("argument" in node) || node.argument === null || node.argument === void 0) return Effect.void;
29
+ const arg = node.argument;
30
+ if (arg["type"] === "Literal" && arg["value"] === null) return ctx.report(make({
31
+ node,
32
+ message: d > 0 ? "Avoid returning null inside Effect.gen/fn. Use Option.none() for absence, or yield* Effect.fail(new MyError()) for errors." : "Avoid returning null. Use Option.none() for absence — convert nullish values at system boundaries with Option.fromNullable()."
33
+ }));
34
+ if (arg["type"] === "Identifier" && arg["name"] === "undefined") return ctx.report(make({
35
+ node,
36
+ message: d > 0 ? "Avoid returning undefined inside Effect.gen/fn. Use Effect.void for void effects, or Option.none() for absence." : "Avoid returning undefined. Use Option.none() for absence, or restructure as an Effect returning void."
37
+ }));
38
+ if (arg["type"] === "UnaryExpression" && arg["operator"] === "void") return ctx.report(make({
39
+ node,
40
+ message: d > 0 ? "Avoid returning void inside Effect.gen/fn. Use Effect.void for void effects." : "Avoid returning void expression. Use Option.none() for absence."
41
+ }));
42
+ return Effect.void;
43
+ }) });
44
+ }
45
+ });
46
+ //#endregion
47
+ export { noReturnNullish };
@@ -0,0 +1,6 @@
1
+ import * as _$_oxlint_plugins0 from "@oxlint/plugins";
2
+
3
+ //#region src/rules/no-run-in-effect-gen.d.ts
4
+ declare const noRunInEffectGen: _$_oxlint_plugins0.CreateRule;
5
+ //#endregion
6
+ export { noRunInEffectGen };
@@ -0,0 +1,48 @@
1
+ import { isCallOf } from "../vendor/effect-oxlint/AST.js";
2
+ import { make } from "../vendor/effect-oxlint/Diagnostic.js";
3
+ import { RuleContext } from "../vendor/effect-oxlint/RuleContext.js";
4
+ import { merge } from "../vendor/effect-oxlint/Visitor.js";
5
+ import { define, meta } from "../vendor/effect-oxlint/Rule.js";
6
+ import "../vendor/effect-oxlint/index.js";
7
+ import { makeEffectContextTracker } from "./_effect-context.js";
8
+ import * as Effect from "effect/Effect";
9
+ import * as Ref from "effect/Ref";
10
+ //#region src/rules/no-run-in-effect-gen.ts
11
+ const effectRunMethods = [
12
+ "runSync",
13
+ "runPromise",
14
+ "runFork",
15
+ "runCallback"
16
+ ];
17
+ const runtimeRunMethods = [
18
+ "runSync",
19
+ "runPromise",
20
+ "runFork",
21
+ "runCallback"
22
+ ];
23
+ const noRunInEffectGen = define({
24
+ name: "no-run-in-effect-gen",
25
+ meta: meta({
26
+ type: "problem",
27
+ description: "Running effects inside Effect.gen/fn drops the ambient context. Use yield* instead."
28
+ }),
29
+ create: function* () {
30
+ const ctx = yield* RuleContext;
31
+ const [depth, tracker] = yield* makeEffectContextTracker;
32
+ return merge(tracker, { CallExpression: (node) => Effect.flatMap(Ref.get(depth), (d) => {
33
+ if (d <= 0) return Effect.void;
34
+ const call = node;
35
+ if (isCallOf(call, "Effect", effectRunMethods)) return ctx.report(make({
36
+ node,
37
+ message: "Avoid Effect.run* inside Effect.gen/fn. `yield*` the child effect, or use Effect.fork for concurrency."
38
+ }));
39
+ if (isCallOf(call, "Runtime", runtimeRunMethods)) return ctx.report(make({
40
+ node,
41
+ message: "Avoid Runtime.run* inside Effect.gen/fn. The ambient context already has your services — `yield*` the child effect."
42
+ }));
43
+ return Effect.void;
44
+ }) });
45
+ }
46
+ });
47
+ //#endregion
48
+ export { noRunInEffectGen };
@@ -0,0 +1,6 @@
1
+ import * as _$_oxlint_plugins0 from "@oxlint/plugins";
2
+
3
+ //#region src/rules/no-runtime-run-fork.d.ts
4
+ declare const noRuntimeRunFork: _$_oxlint_plugins0.CreateRule;
5
+ //#endregion
6
+ export { noRuntimeRunFork };
@@ -0,0 +1,19 @@
1
+ import { banMember } from "../vendor/effect-oxlint/Rule.js";
2
+ import "../vendor/effect-oxlint/index.js";
3
+ //#region src/rules/no-runtime-run-fork.ts
4
+ /**
5
+ * Ban `Runtime.runFork`.
6
+ *
7
+ * Use `forkScoped`, `Stream`, or runtime-provided layers.
8
+ *
9
+ * Source: biome-effect-linting-rules/no-runtime-runfork
10
+ */
11
+ const noRuntimeRunFork = banMember("Runtime", "runFork", {
12
+ message: "Avoid Runtime.runFork. Use forkScoped, Stream, or runtime-provided layers.",
13
+ meta: {
14
+ type: "problem",
15
+ effectVersion: "v3"
16
+ }
17
+ });
18
+ //#endregion
19
+ export { noRuntimeRunFork };
@@ -0,0 +1,6 @@
1
+ import * as _$_oxlint_plugins0 from "@oxlint/plugins";
2
+
3
+ //#region src/rules/no-schema-struct-with-tag.d.ts
4
+ declare const noSchemaStructWithTag: _$_oxlint_plugins0.CreateRule;
5
+ //#endregion
6
+ export { noSchemaStructWithTag };
@@ -0,0 +1,48 @@
1
+ import { matchCallOf } from "../vendor/effect-oxlint/AST.js";
2
+ import { make } from "../vendor/effect-oxlint/Diagnostic.js";
3
+ import { RuleContext } from "../vendor/effect-oxlint/RuleContext.js";
4
+ import { define, meta } from "../vendor/effect-oxlint/Rule.js";
5
+ import "../vendor/effect-oxlint/index.js";
6
+ import * as Option from "effect/Option";
7
+ import * as Effect from "effect/Effect";
8
+ //#region src/rules/no-schema-struct-with-tag.ts
9
+ const isTagKey = (key) => {
10
+ if (key.type === "Identifier" && "name" in key && key.name === "_tag") return true;
11
+ if (key.type === "Literal" && "value" in key && key.value === "_tag") return true;
12
+ return false;
13
+ };
14
+ const noSchemaStructWithTag = define({
15
+ name: "no-schema-struct-with-tag",
16
+ meta: meta({
17
+ type: "suggestion",
18
+ description: "Use Schema.TaggedStruct(\"Tag\", { ... }) instead of Schema.Struct({ _tag: Schema.Literal(\"Tag\"), ... })."
19
+ }),
20
+ create: function* () {
21
+ const ctx = yield* RuleContext;
22
+ return { CallExpression: (node) => {
23
+ const call = node;
24
+ if (Option.isNone(matchCallOf(call, "Schema", "Struct"))) return Effect.void;
25
+ const args = call.arguments;
26
+ if (args.length !== 1) return Effect.void;
27
+ const arg = args[0];
28
+ if (arg === void 0) return Effect.void;
29
+ if (arg.type !== "ObjectExpression") return Effect.void;
30
+ const props = arg["properties"];
31
+ if (!Array.isArray(props)) return Effect.void;
32
+ for (const prop of props) {
33
+ const p = prop;
34
+ if (p.type !== "Property") continue;
35
+ const key = p["key"];
36
+ if (!isTagKey(key)) continue;
37
+ const value = p["value"];
38
+ if (value.type === "CallExpression" && Option.isSome(matchCallOf(value, "Schema", "Literal"))) return ctx.report(make({
39
+ node,
40
+ message: "Use Schema.TaggedStruct(\"Tag\", { ... }) instead of Schema.Struct({ _tag: Schema.Literal(...), ... })."
41
+ }));
42
+ }
43
+ return Effect.void;
44
+ } };
45
+ }
46
+ });
47
+ //#endregion
48
+ export { noSchemaStructWithTag };
@@ -0,0 +1,6 @@
1
+ import * as _$_oxlint_plugins0 from "@oxlint/plugins";
2
+
3
+ //#region src/rules/no-schema-union-of-literals.d.ts
4
+ declare const noSchemaUnionOfLiterals: _$_oxlint_plugins0.CreateRule;
5
+ //#endregion
6
+ export { noSchemaUnionOfLiterals };
@@ -0,0 +1,35 @@
1
+ import { matchCallOf } from "../vendor/effect-oxlint/AST.js";
2
+ import { make } from "../vendor/effect-oxlint/Diagnostic.js";
3
+ import { RuleContext } from "../vendor/effect-oxlint/RuleContext.js";
4
+ import { define, meta } from "../vendor/effect-oxlint/Rule.js";
5
+ import "../vendor/effect-oxlint/index.js";
6
+ import * as Option from "effect/Option";
7
+ import * as Effect from "effect/Effect";
8
+ //#region src/rules/no-schema-union-of-literals.ts
9
+ const isSchemaLiteral = (node) => {
10
+ if (node.type !== "CallExpression") return false;
11
+ return Option.isSome(matchCallOf(node, "Schema", "Literal"));
12
+ };
13
+ const noSchemaUnionOfLiterals = define({
14
+ name: "no-schema-union-of-literals",
15
+ meta: meta({
16
+ type: "suggestion",
17
+ description: "Use Schema.Literal('a', 'b') instead of Schema.Union(Schema.Literal('a'), Schema.Literal('b'))."
18
+ }),
19
+ create: function* () {
20
+ const ctx = yield* RuleContext;
21
+ return { CallExpression: (node) => {
22
+ const call = node;
23
+ if (Option.isNone(matchCallOf(call, "Schema", "Union"))) return Effect.void;
24
+ const args = call.arguments;
25
+ if (args.length < 2) return Effect.void;
26
+ if (!args.every((arg) => isSchemaLiteral(arg))) return Effect.void;
27
+ return ctx.report(make({
28
+ node,
29
+ message: "Use Schema.Literal('a', 'b') instead of Schema.Union(Schema.Literal('a'), Schema.Literal('b'))."
30
+ }));
31
+ } };
32
+ }
33
+ });
34
+ //#endregion
35
+ export { noSchemaUnionOfLiterals };
@@ -0,0 +1,6 @@
1
+ import * as _$_oxlint_plugins0 from "@oxlint/plugins";
2
+
3
+ //#region src/rules/no-string-sentinel-const.d.ts
4
+ declare const noStringSentinelConst: _$_oxlint_plugins0.CreateRule;
5
+ //#endregion
6
+ export { noStringSentinelConst };
@@ -0,0 +1,38 @@
1
+ import { make } from "../vendor/effect-oxlint/Diagnostic.js";
2
+ import { RuleContext } from "../vendor/effect-oxlint/RuleContext.js";
3
+ import { define, meta } from "../vendor/effect-oxlint/Rule.js";
4
+ import "../vendor/effect-oxlint/index.js";
5
+ import * as Effect from "effect/Effect";
6
+ //#region src/rules/no-string-sentinel-const.ts
7
+ /**
8
+ * Ban `const x = "some-string"` string literal const declarations.
9
+ *
10
+ * Use tagged unions, Option, or meaningful domain values.
11
+ *
12
+ * Source: biome-effect-linting-rules/no-string-sentinel-const
13
+ *
14
+ * Note: Very aggressive — should probably be off by default or in a strict preset only.
15
+ */
16
+ const noStringSentinelConst = define({
17
+ name: "no-string-sentinel-const",
18
+ meta: meta({
19
+ type: "suggestion",
20
+ description: "Avoid string literal const declarations. Use tagged unions or domain values."
21
+ }),
22
+ create: function* () {
23
+ const ctx = yield* RuleContext;
24
+ return { VariableDeclarator: (node) => {
25
+ if (!("init" in node) || node.init == null) return Effect.void;
26
+ const init = node.init;
27
+ if (init["type"] === "Literal" && typeof init["value"] === "string") {
28
+ if ("parent" in node && node.parent != null && typeof node.parent === "object" && "type" in node.parent && node.parent.type === "VariableDeclaration" && "kind" in node.parent && node.parent.kind === "const") return ctx.report(make({
29
+ node,
30
+ message: "Avoid string literal const. Use tagged unions, Option, or domain values."
31
+ }));
32
+ }
33
+ return Effect.void;
34
+ } };
35
+ }
36
+ });
37
+ //#endregion
38
+ export { noStringSentinelConst };
@@ -0,0 +1,6 @@
1
+ import * as _$_oxlint_plugins0 from "@oxlint/plugins";
2
+
3
+ //#region src/rules/no-switch-statement.d.ts
4
+ declare const noSwitchStatement: _$_oxlint_plugins0.CreateRule;
5
+ //#endregion
6
+ export { noSwitchStatement };
@@ -0,0 +1,16 @@
1
+ import { banStatement } from "../vendor/effect-oxlint/Rule.js";
2
+ import "../vendor/effect-oxlint/index.js";
3
+ //#region src/rules/no-switch-statement.ts
4
+ /**
5
+ * Ban `switch` statements.
6
+ *
7
+ * Use `Match.value`, `Option.match`, `Either.match` instead.
8
+ *
9
+ * Source: biome-effect-linting-rules/no-switch-statement
10
+ */
11
+ const noSwitchStatement = banStatement("SwitchStatement", {
12
+ message: "Avoid switch statements. Use Match.value, Option.match, or Either.match.",
13
+ meta: { type: "suggestion" }
14
+ });
15
+ //#endregion
16
+ export { noSwitchStatement };
@@ -0,0 +1,6 @@
1
+ import * as _$_oxlint_plugins0 from "@oxlint/plugins";
2
+
3
+ //#region src/rules/no-ternary.d.ts
4
+ declare const noTernary: _$_oxlint_plugins0.CreateRule;
5
+ //#endregion
6
+ export { noTernary };
@@ -0,0 +1,30 @@
1
+ import { make } from "../vendor/effect-oxlint/Diagnostic.js";
2
+ import { RuleContext } from "../vendor/effect-oxlint/RuleContext.js";
3
+ import { define, meta } from "../vendor/effect-oxlint/Rule.js";
4
+ import "../vendor/effect-oxlint/index.js";
5
+ //#region src/rules/no-ternary.ts
6
+ /**
7
+ * Ban ternary expressions in Effect codebases.
8
+ *
9
+ * Use `Option.match`, `Either.match`, `Match.value` instead.
10
+ *
11
+ * Source: biome-effect-linting-rules/no-ternary
12
+ *
13
+ * Note: Very opinionated — recommended for strict functional presets only.
14
+ */
15
+ const noTernary = define({
16
+ name: "no-ternary",
17
+ meta: meta({
18
+ type: "suggestion",
19
+ description: "Avoid ternary expressions. Use Option.match, Either.match, or Match.value."
20
+ }),
21
+ create: function* () {
22
+ const ctx = yield* RuleContext;
23
+ return { ConditionalExpression: (node) => ctx.report(make({
24
+ node,
25
+ message: "Avoid ternary expressions. Use Option.match, Either.match, or Match.value."
26
+ })) };
27
+ }
28
+ });
29
+ //#endregion
30
+ export { noTernary };
@@ -0,0 +1,6 @@
1
+ import * as _$_oxlint_plugins0 from "@oxlint/plugins";
2
+
3
+ //#region src/rules/no-throw-statement.d.ts
4
+ declare const noThrowStatement: _$_oxlint_plugins0.CreateRule;
5
+ //#endregion
6
+ export { noThrowStatement };
@@ -0,0 +1,34 @@
1
+ import { make } from "../vendor/effect-oxlint/Diagnostic.js";
2
+ import { RuleContext } from "../vendor/effect-oxlint/RuleContext.js";
3
+ import { merge } from "../vendor/effect-oxlint/Visitor.js";
4
+ import { define, meta } from "../vendor/effect-oxlint/Rule.js";
5
+ import "../vendor/effect-oxlint/index.js";
6
+ import { makeEffectContextTracker } from "./_effect-context.js";
7
+ import * as Effect from "effect/Effect";
8
+ import * as Ref from "effect/Ref";
9
+ //#region src/rules/no-throw-statement.ts
10
+ /**
11
+ * Ban `throw` statements. Context-aware messaging.
12
+ *
13
+ * Inside Effect.gen/fn: "Use yield* Effect.fail() or yield* new MyError()"
14
+ * Outside: "Model errors with Effect.fail() — wrap this function with Effect.fn"
15
+ *
16
+ * Source: effect convention — errors should be in the type system
17
+ */
18
+ const noThrowStatement = define({
19
+ name: "no-throw-statement",
20
+ meta: meta({
21
+ type: "problem",
22
+ description: "Avoid throw. Use Effect.fail with tagged errors."
23
+ }),
24
+ create: function* () {
25
+ const ctx = yield* RuleContext;
26
+ const [depth, tracker] = yield* makeEffectContextTracker;
27
+ return merge(tracker, { ThrowStatement: (node) => Effect.flatMap(Ref.get(depth), (d) => ctx.report(make({
28
+ node,
29
+ message: d > 0 ? "Avoid throw inside Effect.gen/fn. Use yield* Effect.fail(new MyError()) or yield* new MyError() for yieldable errors." : "Avoid throw. Model errors with Effect — wrap this function with Effect.fn and use Effect.fail with tagged errors."
30
+ }))) });
31
+ }
32
+ });
33
+ //#endregion
34
+ export { noThrowStatement };
@@ -0,0 +1,6 @@
1
+ import * as _$_oxlint_plugins0 from "@oxlint/plugins";
2
+
3
+ //#region src/rules/no-try-catch.d.ts
4
+ declare const noTryCatch: _$_oxlint_plugins0.CreateRule;
5
+ //#endregion
6
+ export { noTryCatch };
@@ -0,0 +1,34 @@
1
+ import { make } from "../vendor/effect-oxlint/Diagnostic.js";
2
+ import { RuleContext } from "../vendor/effect-oxlint/RuleContext.js";
3
+ import { merge } from "../vendor/effect-oxlint/Visitor.js";
4
+ import { define, meta } from "../vendor/effect-oxlint/Rule.js";
5
+ import "../vendor/effect-oxlint/index.js";
6
+ import { makeEffectContextTracker } from "./_effect-context.js";
7
+ import * as Effect from "effect/Effect";
8
+ import * as Ref from "effect/Ref";
9
+ //#region src/rules/no-try-catch.ts
10
+ /**
11
+ * Ban `try/catch` statements. Context-aware messaging.
12
+ *
13
+ * Inside Effect.gen/fn: "Use Effect.try or Effect.tryPromise"
14
+ * Outside: "Wrap with Effect.fn and use Effect.try for error handling"
15
+ *
16
+ * Source: biome-effect-linting-rules/no-try-catch, language-service/tryCatchInEffectGen
17
+ */
18
+ const noTryCatch = define({
19
+ name: "no-try-catch",
20
+ meta: meta({
21
+ type: "suggestion",
22
+ description: "Avoid try/catch. Use Effect.try or Effect.tryPromise."
23
+ }),
24
+ create: function* () {
25
+ const ctx = yield* RuleContext;
26
+ const [depth, tracker] = yield* makeEffectContextTracker;
27
+ return merge(tracker, { TryStatement: (node) => Effect.flatMap(Ref.get(depth), (d) => ctx.report(make({
28
+ node,
29
+ message: d > 0 ? "Avoid try/catch inside Effect.gen/fn. Use Effect.try({ try: () => ..., catch: (e) => new MyError({ cause: e }) })." : "Avoid try/catch. Wrap this function with Effect.fn and use Effect.try or Effect.tryPromise for error handling."
30
+ }))) });
31
+ }
32
+ });
33
+ //#endregion
34
+ export { noTryCatch };
@@ -0,0 +1,6 @@
1
+ import * as _$_oxlint_plugins0 from "@oxlint/plugins";
2
+
3
+ //#region src/rules/no-unnecessary-arrow-block.d.ts
4
+ declare const noUnnecessaryArrowBlock: _$_oxlint_plugins0.CreateRule;
5
+ //#endregion
6
+ export { noUnnecessaryArrowBlock };
@@ -0,0 +1,34 @@
1
+ import { make } from "../vendor/effect-oxlint/Diagnostic.js";
2
+ import { RuleContext } from "../vendor/effect-oxlint/RuleContext.js";
3
+ import { define, meta } from "../vendor/effect-oxlint/Rule.js";
4
+ import "../vendor/effect-oxlint/index.js";
5
+ import * as Effect from "effect/Effect";
6
+ //#region src/rules/no-unnecessary-arrow-block.ts
7
+ /**
8
+ * Ban `() => { return x }` — use `() => x` instead.
9
+ *
10
+ * Source: language-service/unnecessaryArrowBlock
11
+ */
12
+ const noUnnecessaryArrowBlock = define({
13
+ name: "no-unnecessary-arrow-block",
14
+ meta: meta({
15
+ type: "suggestion",
16
+ description: "Unnecessary arrow block body. Use concise arrow `() => expr`.",
17
+ fixable: "code"
18
+ }),
19
+ create: function* () {
20
+ const ctx = yield* RuleContext;
21
+ return { ArrowFunctionExpression: (node) => {
22
+ if ("body" in node && node.body != null && typeof node.body === "object" && "type" in node.body && node.body.type === "BlockStatement" && "body" in node.body && Array.isArray(node.body.body) && node.body.body.length === 1) {
23
+ const stmt = node.body.body[0];
24
+ if (stmt != null && typeof stmt === "object" && "type" in stmt && stmt.type === "ReturnStatement" && "argument" in stmt && stmt.argument != null) return ctx.report(make({
25
+ node,
26
+ message: "Unnecessary arrow block body. Use `() => expr` instead of `() => { return expr }`."
27
+ }));
28
+ }
29
+ return Effect.void;
30
+ } };
31
+ }
32
+ });
33
+ //#endregion
34
+ export { noUnnecessaryArrowBlock };
@@ -0,0 +1,6 @@
1
+ import * as _$_oxlint_plugins0 from "@oxlint/plugins";
2
+
3
+ //#region src/rules/no-unnecessary-effect-gen.d.ts
4
+ declare const noUnnecessaryEffectGen: _$_oxlint_plugins0.CreateRule;
5
+ //#endregion
6
+ export { noUnnecessaryEffectGen };
@@ -0,0 +1,35 @@
1
+ import { isCallOf } from "../vendor/effect-oxlint/AST.js";
2
+ import { make } from "../vendor/effect-oxlint/Diagnostic.js";
3
+ import { RuleContext } from "../vendor/effect-oxlint/RuleContext.js";
4
+ import { define, meta } from "../vendor/effect-oxlint/Rule.js";
5
+ import "../vendor/effect-oxlint/index.js";
6
+ import * as Effect from "effect/Effect";
7
+ //#region src/rules/no-unnecessary-effect-gen.ts
8
+ const noUnnecessaryEffectGen = define({
9
+ name: "no-unnecessary-effect-gen",
10
+ meta: meta({
11
+ type: "suggestion",
12
+ description: "Unnecessary Effect.gen — single yield can be replaced with the yielded effect directly.",
13
+ fixable: "code"
14
+ }),
15
+ create: function* () {
16
+ const ctx = yield* RuleContext;
17
+ return { CallExpression: (node) => {
18
+ if (!isCallOf(node, "Effect", "gen")) return Effect.void;
19
+ if (!("arguments" in node) || !Array.isArray(node.arguments) || node.arguments.length !== 1) return Effect.void;
20
+ const arg = node.arguments[0];
21
+ if (arg == null || typeof arg !== "object" || !("type" in arg)) return Effect.void;
22
+ if (arg.type !== "FunctionExpression" || !("generator" in arg) || !arg.generator) return Effect.void;
23
+ if (!("body" in arg) || arg.body == null || typeof arg.body !== "object" || !("type" in arg.body) || arg.body.type !== "BlockStatement" || !("body" in arg.body) || !Array.isArray(arg.body.body) || arg.body.body.length !== 1) return Effect.void;
24
+ const stmt = arg.body.body[0];
25
+ if (stmt == null || typeof stmt !== "object" || !("type" in stmt)) return Effect.void;
26
+ if (stmt.type === "ReturnStatement" && "argument" in stmt && stmt.argument != null && typeof stmt.argument === "object" && "type" in stmt.argument && stmt.argument.type === "YieldExpression" && "delegate" in stmt.argument && stmt.argument.delegate === true) return ctx.report(make({
27
+ node,
28
+ message: "Unnecessary Effect.gen — single yield*. Replace with the yielded effect directly."
29
+ }));
30
+ return Effect.void;
31
+ } };
32
+ }
33
+ });
34
+ //#endregion
35
+ export { noUnnecessaryEffectGen };
@@ -0,0 +1,6 @@
1
+ import * as _$_oxlint_plugins0 from "@oxlint/plugins";
2
+
3
+ //#region src/rules/no-unnecessary-pipe-chain.d.ts
4
+ declare const noUnnecessaryPipeChain: _$_oxlint_plugins0.CreateRule;
5
+ //#endregion
6
+ export { noUnnecessaryPipeChain };