eslint-plugin-effector 0.10.5 → 0.12.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 (150) hide show
  1. package/.nvmrc +1 -1
  2. package/package.json +3 -2
  3. package/rules/enforce-effect-naming-convention/enforce-effect-naming-convention.js +9 -2
  4. package/rules/enforce-gate-naming-convention/enforce-gate-naming-convention.js +10 -2
  5. package/rules/enforce-store-naming-convention/enforce-store-naming-convention.js +9 -2
  6. package/rules/mandatory-scope-binding/mandatory-scope-binding.js +9 -2
  7. package/rules/no-watch/no-watch.js +10 -2
  8. package/utils/get-corrected-store-name.js +31 -7
  9. package/utils/is.js +10 -1
  10. package/utils/naming.js +1 -1
  11. package/utils/node-type-is.js +5 -2
  12. package/docs/.vitepress/config.js +0 -58
  13. package/docs/.vitepress/dist/404.html +0 -19
  14. package/docs/.vitepress/dist/assets/app.c5be1f68.js +0 -7
  15. package/docs/.vitepress/dist/assets/index.md.79361962.js +0 -1
  16. package/docs/.vitepress/dist/assets/index.md.79361962.lean.js +0 -1
  17. package/docs/.vitepress/dist/assets/inter-cyrillic-ext.0877b0d9.woff2 +0 -0
  18. package/docs/.vitepress/dist/assets/inter-cyrillic.f8750142.woff2 +0 -0
  19. package/docs/.vitepress/dist/assets/inter-greek-ext.3e6f6728.woff2 +0 -0
  20. package/docs/.vitepress/dist/assets/inter-greek.117e1956.woff2 +0 -0
  21. package/docs/.vitepress/dist/assets/inter-italic-cyrillic-ext.33bd5a8e.woff2 +0 -0
  22. package/docs/.vitepress/dist/assets/inter-italic-cyrillic.ea42a392.woff2 +0 -0
  23. package/docs/.vitepress/dist/assets/inter-italic-greek-ext.4fbe9427.woff2 +0 -0
  24. package/docs/.vitepress/dist/assets/inter-italic-greek.8f4463c4.woff2 +0 -0
  25. package/docs/.vitepress/dist/assets/inter-italic-latin-ext.bd8920cc.woff2 +0 -0
  26. package/docs/.vitepress/dist/assets/inter-italic-latin.bd3b6f56.woff2 +0 -0
  27. package/docs/.vitepress/dist/assets/inter-italic-vietnamese.6ce511fb.woff2 +0 -0
  28. package/docs/.vitepress/dist/assets/inter-latin-ext.7cc429bc.woff2 +0 -0
  29. package/docs/.vitepress/dist/assets/inter-latin.4fe6132f.woff2 +0 -0
  30. package/docs/.vitepress/dist/assets/inter-roman-cyrillic-ext.e75737ce.woff2 +0 -0
  31. package/docs/.vitepress/dist/assets/inter-roman-cyrillic.5f2c6c8c.woff2 +0 -0
  32. package/docs/.vitepress/dist/assets/inter-roman-greek-ext.ab0619bc.woff2 +0 -0
  33. package/docs/.vitepress/dist/assets/inter-roman-greek.d5a6d92a.woff2 +0 -0
  34. package/docs/.vitepress/dist/assets/inter-roman-latin-ext.0030eebd.woff2 +0 -0
  35. package/docs/.vitepress/dist/assets/inter-roman-latin.2ed14f66.woff2 +0 -0
  36. package/docs/.vitepress/dist/assets/inter-roman-vietnamese.14ce25a6.woff2 +0 -0
  37. package/docs/.vitepress/dist/assets/inter-vietnamese.2c644a25.woff2 +0 -0
  38. package/docs/.vitepress/dist/assets/presets___future.md.6542932d.js +0 -1
  39. package/docs/.vitepress/dist/assets/presets___future.md.6542932d.lean.js +0 -1
  40. package/docs/.vitepress/dist/assets/presets___index.md.af77aa24.js +0 -1
  41. package/docs/.vitepress/dist/assets/presets___index.md.af77aa24.lean.js +0 -1
  42. package/docs/.vitepress/dist/assets/presets___list.md.86dea8af.js +0 -1
  43. package/docs/.vitepress/dist/assets/presets___list.md.86dea8af.lean.js +0 -1
  44. package/docs/.vitepress/dist/assets/presets___patronum.md.9f3ad5fe.js +0 -1
  45. package/docs/.vitepress/dist/assets/presets___patronum.md.9f3ad5fe.lean.js +0 -1
  46. package/docs/.vitepress/dist/assets/presets___react.md.dc2cc31a.js +0 -1
  47. package/docs/.vitepress/dist/assets/presets___react.md.dc2cc31a.lean.js +0 -1
  48. package/docs/.vitepress/dist/assets/presets___recommended.md.af826424.js +0 -1
  49. package/docs/.vitepress/dist/assets/presets___recommended.md.af826424.lean.js +0 -1
  50. package/docs/.vitepress/dist/assets/presets___scope.md.e5dd9837.js +0 -1
  51. package/docs/.vitepress/dist/assets/presets___scope.md.e5dd9837.lean.js +0 -1
  52. package/docs/.vitepress/dist/assets/presets_future.md.2962dd38.js +0 -1
  53. package/docs/.vitepress/dist/assets/presets_future.md.2962dd38.lean.js +0 -1
  54. package/docs/.vitepress/dist/assets/presets_index.md.c3c40451.js +0 -1
  55. package/docs/.vitepress/dist/assets/presets_index.md.c3c40451.lean.js +0 -1
  56. package/docs/.vitepress/dist/assets/presets_patronum.md.58445698.js +0 -1
  57. package/docs/.vitepress/dist/assets/presets_patronum.md.58445698.lean.js +0 -1
  58. package/docs/.vitepress/dist/assets/presets_react.md.fda31c90.js +0 -1
  59. package/docs/.vitepress/dist/assets/presets_react.md.fda31c90.lean.js +0 -1
  60. package/docs/.vitepress/dist/assets/presets_recommended.md.396d0c01.js +0 -1
  61. package/docs/.vitepress/dist/assets/presets_recommended.md.396d0c01.lean.js +0 -1
  62. package/docs/.vitepress/dist/assets/presets_scope.md.55da3541.js +0 -1
  63. package/docs/.vitepress/dist/assets/presets_scope.md.55da3541.lean.js +0 -1
  64. package/docs/.vitepress/dist/assets/rules___index.md.c943fc87.js +0 -1
  65. package/docs/.vitepress/dist/assets/rules___index.md.c943fc87.lean.js +0 -1
  66. package/docs/.vitepress/dist/assets/rules___list.md.ba316f20.js +0 -1
  67. package/docs/.vitepress/dist/assets/rules___list.md.ba316f20.lean.js +0 -1
  68. package/docs/.vitepress/dist/assets/rules_enforce-effect-naming-convention.md.09e5af2c.js +0 -6
  69. package/docs/.vitepress/dist/assets/rules_enforce-effect-naming-convention.md.09e5af2c.lean.js +0 -1
  70. package/docs/.vitepress/dist/assets/rules_enforce-gate-naming-convention.md.5f3af41a.js +0 -6
  71. package/docs/.vitepress/dist/assets/rules_enforce-gate-naming-convention.md.5f3af41a.lean.js +0 -1
  72. package/docs/.vitepress/dist/assets/rules_enforce-store-naming-convention.md.db33b9cb.js +0 -26
  73. package/docs/.vitepress/dist/assets/rules_enforce-store-naming-convention.md.db33b9cb.lean.js +0 -1
  74. package/docs/.vitepress/dist/assets/rules_index.md.3e915bb2.js +0 -1
  75. package/docs/.vitepress/dist/assets/rules_index.md.3e915bb2.lean.js +0 -1
  76. package/docs/.vitepress/dist/assets/rules_keep-options-order.md.5345093b.js +0 -16
  77. package/docs/.vitepress/dist/assets/rules_keep-options-order.md.5345093b.lean.js +0 -1
  78. package/docs/.vitepress/dist/assets/rules_mandatory-scope-binding.md.aff04a66.js +0 -14
  79. package/docs/.vitepress/dist/assets/rules_mandatory-scope-binding.md.aff04a66.lean.js +0 -1
  80. package/docs/.vitepress/dist/assets/rules_no-ambiguity-target.md.7fde769b.js +0 -7
  81. package/docs/.vitepress/dist/assets/rules_no-ambiguity-target.md.7fde769b.lean.js +0 -1
  82. package/docs/.vitepress/dist/assets/rules_no-duplicate-on.md.09525e1d.js +0 -11
  83. package/docs/.vitepress/dist/assets/rules_no-duplicate-on.md.09525e1d.lean.js +0 -1
  84. package/docs/.vitepress/dist/assets/rules_no-forward.md.2becbf92.js +0 -11
  85. package/docs/.vitepress/dist/assets/rules_no-forward.md.2becbf92.lean.js +0 -1
  86. package/docs/.vitepress/dist/assets/rules_no-getState.md.665d0467.js +0 -15
  87. package/docs/.vitepress/dist/assets/rules_no-getState.md.665d0467.lean.js +0 -1
  88. package/docs/.vitepress/dist/assets/rules_no-guard.md.5056c7b6.js +0 -22
  89. package/docs/.vitepress/dist/assets/rules_no-guard.md.5056c7b6.lean.js +0 -1
  90. package/docs/.vitepress/dist/assets/rules_no-patronum-debug.md.19f444fb.js +0 -14
  91. package/docs/.vitepress/dist/assets/rules_no-patronum-debug.md.19f444fb.lean.js +0 -1
  92. package/docs/.vitepress/dist/assets/rules_no-unnecessary-combination.md.e7221074.js +0 -20
  93. package/docs/.vitepress/dist/assets/rules_no-unnecessary-combination.md.e7221074.lean.js +0 -1
  94. package/docs/.vitepress/dist/assets/rules_no-unnecessary-duplication.md.3a99556b.js +0 -27
  95. package/docs/.vitepress/dist/assets/rules_no-unnecessary-duplication.md.3a99556b.lean.js +0 -1
  96. package/docs/.vitepress/dist/assets/rules_no-useless-methods.md.e13dc29f.js +0 -9
  97. package/docs/.vitepress/dist/assets/rules_no-useless-methods.md.e13dc29f.lean.js +0 -1
  98. package/docs/.vitepress/dist/assets/rules_no-watch.md.72ac4d86.js +0 -35
  99. package/docs/.vitepress/dist/assets/rules_no-watch.md.72ac4d86.lean.js +0 -1
  100. package/docs/.vitepress/dist/assets/rules_prefer-sample-over-forward-with-mapping.md.e5a7f363.js +0 -22
  101. package/docs/.vitepress/dist/assets/rules_prefer-sample-over-forward-with-mapping.md.e5a7f363.lean.js +0 -1
  102. package/docs/.vitepress/dist/assets/rules_prefer-useUnit.md.2d27cecd.js +0 -28
  103. package/docs/.vitepress/dist/assets/rules_prefer-useUnit.md.2d27cecd.lean.js +0 -1
  104. package/docs/.vitepress/dist/assets/rules_strict-effect-handlers.md.2f8965e2.js +0 -23
  105. package/docs/.vitepress/dist/assets/rules_strict-effect-handlers.md.2f8965e2.lean.js +0 -1
  106. package/docs/.vitepress/dist/assets/style.9e7714f0.css +0 -1
  107. package/docs/.vitepress/dist/hashmap.json +0 -1
  108. package/docs/.vitepress/dist/index.html +0 -20
  109. package/docs/.vitepress/dist/presets/__future.html +0 -20
  110. package/docs/.vitepress/dist/presets/__index.html +0 -20
  111. package/docs/.vitepress/dist/presets/__list.html +0 -20
  112. package/docs/.vitepress/dist/presets/__patronum.html +0 -20
  113. package/docs/.vitepress/dist/presets/__react.html +0 -20
  114. package/docs/.vitepress/dist/presets/__recommended.html +0 -20
  115. package/docs/.vitepress/dist/presets/__scope.html +0 -20
  116. package/docs/.vitepress/dist/presets/future.html +0 -20
  117. package/docs/.vitepress/dist/presets/index.html +0 -20
  118. package/docs/.vitepress/dist/presets/patronum.html +0 -20
  119. package/docs/.vitepress/dist/presets/react.html +0 -20
  120. package/docs/.vitepress/dist/presets/recommended.html +0 -20
  121. package/docs/.vitepress/dist/presets/scope.html +0 -20
  122. package/docs/.vitepress/dist/rules/__index.html +0 -20
  123. package/docs/.vitepress/dist/rules/__list.html +0 -20
  124. package/docs/.vitepress/dist/rules/enforce-effect-naming-convention.html +0 -25
  125. package/docs/.vitepress/dist/rules/enforce-gate-naming-convention.html +0 -25
  126. package/docs/.vitepress/dist/rules/enforce-store-naming-convention.html +0 -45
  127. package/docs/.vitepress/dist/rules/index.html +0 -20
  128. package/docs/.vitepress/dist/rules/keep-options-order.html +0 -35
  129. package/docs/.vitepress/dist/rules/mandatory-scope-binding.html +0 -33
  130. package/docs/.vitepress/dist/rules/no-ambiguity-target.html +0 -26
  131. package/docs/.vitepress/dist/rules/no-duplicate-on.html +0 -30
  132. package/docs/.vitepress/dist/rules/no-forward.html +0 -30
  133. package/docs/.vitepress/dist/rules/no-getState.html +0 -34
  134. package/docs/.vitepress/dist/rules/no-guard.html +0 -41
  135. package/docs/.vitepress/dist/rules/no-patronum-debug.html +0 -33
  136. package/docs/.vitepress/dist/rules/no-unnecessary-combination.html +0 -39
  137. package/docs/.vitepress/dist/rules/no-unnecessary-duplication.html +0 -46
  138. package/docs/.vitepress/dist/rules/no-useless-methods.html +0 -28
  139. package/docs/.vitepress/dist/rules/no-watch.html +0 -54
  140. package/docs/.vitepress/dist/rules/prefer-sample-over-forward-with-mapping.html +0 -41
  141. package/docs/.vitepress/dist/rules/prefer-useUnit.html +0 -47
  142. package/docs/.vitepress/dist/rules/strict-effect-handlers.html +0 -42
  143. package/docs/.vitepress/theme/custom.css +0 -8
  144. package/docs/.vitepress/theme/index.js +0 -4
  145. package/docs/public/apple-touch-icon.png +0 -0
  146. package/docs/public/comet-192.png +0 -0
  147. package/docs/public/comet-512.png +0 -0
  148. package/docs/public/comet.svg +0 -228
  149. package/docs/public/favicon.ico +0 -0
  150. package/docs/public/manifest.webmanifest +0 -6
package/.nvmrc CHANGED
@@ -1 +1 @@
1
- 16.10.0
1
+ 18.12
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "eslint-plugin-effector",
3
- "version": "0.10.5",
3
+ "version": "0.12.0",
4
4
  "description": "Enforcing best practices for Effector",
5
5
  "keywords": [
6
6
  "eslint",
@@ -12,11 +12,12 @@
12
12
  "main": "index.js",
13
13
  "author": "Igor Kamyshev <igor@kamyshev.me>",
14
14
  "license": "MIT",
15
+ "packageManager": "pnpm@8.10.5",
15
16
  "publishConfig": {
16
17
  "access": "public"
17
18
  },
18
19
  "engines": {
19
- "node": "^14 || ^15 || ^16 || ^17 || ^18"
20
+ "node": "^16 || ^17 || ^18 || ^19 || ^20"
20
21
  },
21
22
  "peerDependencies": {
22
23
  "effector": "*",
@@ -1,3 +1,5 @@
1
+ const { ESLintUtils } = require("@typescript-eslint/utils");
2
+
1
3
  const { extractImportedFrom } = require("../../utils/extract-imported-from");
2
4
  const { createLinkToRule } = require("../../utils/create-link-to-rule");
3
5
  const { nodeTypeIs } = require("../../utils/node-type-is");
@@ -22,9 +24,14 @@ module.exports = {
22
24
  hasSuggestions: true,
23
25
  },
24
26
  create(context) {
25
- const parserServices = context.parserServices;
27
+ let parserServices;
28
+ try {
29
+ parserServices = ESLintUtils.getParserServices(context);
30
+ } catch (err) {
31
+ // no types information
32
+ }
26
33
  // TypeScript-way
27
- if (parserServices.hasFullTypeInformation) {
34
+ if (parserServices?.program) {
28
35
  return {
29
36
  VariableDeclarator(node) {
30
37
  const isEffectorEffect = nodeTypeIs.effect({
@@ -1,3 +1,5 @@
1
+ const { ESLintUtils } = require("@typescript-eslint/utils");
2
+
1
3
  const { extractImportedFrom } = require("../../utils/extract-imported-from");
2
4
  const { nodeTypeIs } = require("../../utils/node-type-is");
3
5
  const { createLinkToRule } = require("../../utils/create-link-to-rule");
@@ -21,9 +23,15 @@ module.exports = {
21
23
  hasSuggestions: true,
22
24
  },
23
25
  create(context) {
24
- const parserServices = context.parserServices;
26
+ let parserServices;
27
+ try {
28
+ parserServices = ESLintUtils.getParserServices(context);
29
+ } catch (err) {
30
+ // no types information
31
+ }
32
+
25
33
  // TypeScript-way
26
- if (parserServices.hasFullTypeInformation) {
34
+ if (parserServices?.program) {
27
35
  return {
28
36
  VariableDeclarator(node) {
29
37
  const isEffectorGate = nodeTypeIs.gate({
@@ -1,3 +1,5 @@
1
+ const { ESLintUtils } = require("@typescript-eslint/utils");
2
+
1
3
  const { extractImportedFrom } = require("../../utils/extract-imported-from");
2
4
  const { namingOf } = require("../../utils/naming");
3
5
  const {
@@ -32,12 +34,17 @@ module.exports = {
32
34
  hasSuggestions: true,
33
35
  },
34
36
  create(context) {
35
- const { parserServices } = context;
37
+ let parserServices;
38
+ try {
39
+ parserServices = ESLintUtils.getParserServices(context);
40
+ } catch (err) {
41
+ // no types information
42
+ }
36
43
 
37
44
  validateStoreNameConvention(context);
38
45
 
39
46
  // TypeScript-way
40
- if (parserServices.hasFullTypeInformation) {
47
+ if (parserServices?.program) {
41
48
  return {
42
49
  VariableDeclarator(node) {
43
50
  const isEffectorStore = nodeTypeIs.store({
@@ -1,3 +1,5 @@
1
+ const { ESLintUtils } = require("@typescript-eslint/utils");
2
+
1
3
  const { createLinkToRule } = require("../../utils/create-link-to-rule");
2
4
  const { isInsideReactComponent } = require("../../utils/react");
3
5
  const { nodeTypeIs } = require("../../utils/node-type-is");
@@ -21,10 +23,15 @@ module.exports = {
21
23
  schema: [],
22
24
  },
23
25
  create(context) {
24
- const parserServices = context.parserServices;
26
+ let parserServices;
27
+ try {
28
+ parserServices = ESLintUtils.getParserServices(context);
29
+ } catch (err) {
30
+ // no types information
31
+ }
25
32
 
26
33
  // TypeScript-only rule, since units can be imported from anywhere
27
- if (!parserServices.hasFullTypeInformation) {
34
+ if (!parserServices?.program) {
28
35
  return {};
29
36
  }
30
37
 
@@ -1,3 +1,5 @@
1
+ const { ESLintUtils } = require("@typescript-eslint/utils");
2
+
1
3
  const {
2
4
  traverseNestedObjectNode,
3
5
  } = require("../../utils/traverse-nested-object-node");
@@ -20,8 +22,14 @@ module.exports = {
20
22
  schema: [],
21
23
  },
22
24
  create(context) {
23
- const { parserServices } = context;
24
- if (!parserServices.hasFullTypeInformation) {
25
+ let parserServices;
26
+ try {
27
+ parserServices = ESLintUtils.getParserServices(context);
28
+ } catch (err) {
29
+ // no types information
30
+ }
31
+
32
+ if (!parserServices?.program) {
25
33
  // JavaScript-way https://github.com/effector/eslint-plugin/issues/48#issuecomment-931107829
26
34
  return {};
27
35
  }
@@ -5,17 +5,41 @@ function getCorrectedStoreName(storeName, context) {
5
5
 
6
6
  // handle edge case
7
7
  if (storeName.startsWith("$") && storeName.endsWith("$")) {
8
- if (storeNameConvention === "prefix") {
9
- return `$${storeName.slice(0, -1)}`;
10
- } else {
11
- return `${storeName.slice(1)}$`;
12
- }
8
+ const storeNameWithoutConvention = trimByPattern(storeName, "$");
9
+ return formatStoreName(storeNameWithoutConvention, storeNameConvention);
13
10
  }
14
11
 
15
- const correctedStoreName =
16
- storeNameConvention === "prefix" ? `$${storeName}` : `${storeName}$`;
12
+ const correctedStoreName = formatStoreName(storeName, storeNameConvention);
17
13
 
18
14
  return correctedStoreName;
19
15
  }
20
16
 
17
+ function formatStoreName(storeName, convention) {
18
+ return convention === "prefix" ? `$${storeName}` : `${storeName}$`;
19
+ }
20
+
21
+ function trimByPattern(s, template) {
22
+ let l = 0,
23
+ r = s.length - 1;
24
+
25
+ while (l <= r) {
26
+ const head = s[l];
27
+ const tail = s[r];
28
+
29
+ if (head === template) {
30
+ l++;
31
+ }
32
+
33
+ if (tail === template) {
34
+ r--;
35
+ }
36
+
37
+ if (head !== template && tail !== template) {
38
+ return s.slice(l, r + 1);
39
+ }
40
+ }
41
+
42
+ return s;
43
+ }
44
+
21
45
  module.exports = { getCorrectedStoreName };
package/utils/is.js CHANGED
@@ -1,9 +1,18 @@
1
+ const { ESLintUtils } = require("@typescript-eslint/utils");
2
+
1
3
  const { nodeTypeIs } = require("./node-type-is");
2
4
  const { namingOf } = require("./naming");
3
5
 
4
6
  function isSomething({ isValidNaming, isTypeCorrect }) {
5
7
  return ({ node, context }) => {
6
- if (context.parserServices.hasFullTypeInformation) {
8
+ let parserServices;
9
+ try {
10
+ parserServices = ESLintUtils.getParserServices(context);
11
+ } catch (e) {
12
+ // no types info
13
+ }
14
+
15
+ if (parserServices?.program) {
7
16
  return isTypeCorrect({ node, context });
8
17
  }
9
18
 
package/utils/naming.js CHANGED
@@ -14,7 +14,7 @@ function isStoreNameValid({ name, context }) {
14
14
  const storeNameConvention = getStoreNameConvention(context);
15
15
 
16
16
  // validate edge case
17
- if (name?.startsWith("$") && name?.endsWith("$")) {
17
+ if (name?.length > 1 && name?.startsWith("$") && name?.endsWith("$")) {
18
18
  return false;
19
19
  }
20
20
 
@@ -1,7 +1,10 @@
1
+ const { ESLintUtils } = require('@typescript-eslint/utils');
2
+
1
3
  function hasType({ node, possibleTypes, context, from }) {
2
4
  try {
3
- const checker = context.parserServices.program.getTypeChecker();
4
- const originalNode = context.parserServices.esTreeNodeToTSNodeMap.get(node);
5
+ const parserServices = ESLintUtils.getParserServices(context);
6
+ const checker = parserServices.program.getTypeChecker();
7
+ const originalNode = parserServices.esTreeNodeToTSNodeMap.get(node);
5
8
  const type = checker.getTypeAtLocation(
6
9
  originalNode?.initializer ?? originalNode
7
10
  );
@@ -1,58 +0,0 @@
1
- export default {
2
- lang: "en-US",
3
- title: "ESLint plugin for Effector",
4
- description: "Enforcing best practices for Effector",
5
- lastUpdated: true,
6
- head: [
7
- ["link", { rel: "icon", href: "/favicon.ico", sizes: "any" }],
8
- ["link", { rel: "icon", href: "/comet.svg", type: "image/svg+xml" }],
9
- ["link", { rel: "apple-touch-icon", href: "/apple-touch-icon.png" }],
10
- ["link", { rel: "manifest", href: "/manifest.webmanifest" }],
11
- ],
12
- themeConfig: {
13
- siteTitle: "ESLint plugin for Effector",
14
- logo: "/comet.svg",
15
- footer: {
16
- message: "Released under the MIT License.",
17
- },
18
- socialLinks: [
19
- { icon: "github", link: "https://github.com/effector/eslint-plugin" },
20
- { icon: "twitter", link: "https://twitter.com/effectorjs" },
21
- ],
22
- algolia: {
23
- appId: "NW4641ANOK",
24
- apiKey: "82a2fcdc603a1de18478e1c461450168",
25
- indexName: "eslint-effector",
26
- },
27
- editLink: {
28
- pattern:
29
- "https://github.com/effector/eslint-plugin/edit/master/docs/:path",
30
- },
31
- nav: [
32
- {
33
- text: "Presets",
34
- link: "/presets/",
35
- activeMatch: "^/presets/",
36
- },
37
- {
38
- text: "Rules",
39
- link: "/rules/",
40
- activeMatch: "^/rules/",
41
- },
42
- {
43
- text: "More",
44
- items: [
45
- {
46
- text: "Changelog",
47
- link: "/changelog",
48
- },
49
- {
50
- text: "Effector",
51
- link: "https://effector.dev",
52
- },
53
- ],
54
- },
55
- ],
56
- sidebar: {},
57
- },
58
- };
@@ -1,19 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="en-US">
3
- <head>
4
- <meta charset="utf-8">
5
- <meta name="viewport" content="width=device-width,initial-scale=1">
6
- <title>404 | ESLint plugin for Effector</title>
7
- <meta name="description" content="Not Found">
8
- <link rel="stylesheet" href="/assets/style.9e7714f0.css">
9
- <link rel="modulepreload" href="/assets/app.c5be1f68.js">
10
-
11
- <script id="check-dark-light">(()=>{const e=localStorage.getItem("vitepress-theme-appearance")||"",a=window.matchMedia("(prefers-color-scheme: dark)").matches;(!e||e==="auto"?a:e==="dark")&&document.documentElement.classList.add("dark")})();</script>
12
- </head>
13
- <body>
14
- <div id="app"><div class="Layout" data-v-5236d721><!--[--><!--]--><!--[--><span tabindex="-1" data-v-ba282093></span><a href="#VPContent" class="VPSkipLink visually-hidden" data-v-ba282093> Skip to content </a><!--]--><!----><header class="VPNav no-sidebar" data-v-5236d721 data-v-ad1d1a51><div class="VPNavBar" data-v-ad1d1a51 data-v-5c544ded><div class="container" data-v-5c544ded><div class="VPNavBarTitle" data-v-5c544ded data-v-de342594><a class="title" href="/" data-v-de342594><!--[--><!--]--><!----><!--[-->ESLint plugin for Effector<!--]--><!--[--><!--]--></a></div><div class="content" data-v-5c544ded><!--[--><!--]--><!----><nav aria-labelledby="main-nav-aria-label" class="VPNavBarMenu menu" data-v-5c544ded data-v-bbd7bba4><span id="main-nav-aria-label" class="visually-hidden" data-v-bbd7bba4>Main Navigation</span><!--[--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/presets/" data-v-bbd7bba4 data-v-f2e87c9b data-v-43d5b194><!--[-->Presets<!--]--><!----></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/rules/" data-v-bbd7bba4 data-v-f2e87c9b data-v-43d5b194><!--[-->Rules<!--]--><!----></a><!--]--><!--]--></nav><!----><div class="VPNavBarAppearance appearance" data-v-5c544ded data-v-b18b5f44><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" aria-label="toggle dark mode" aria-checked="false" data-v-b18b5f44 data-v-910d4043 data-v-6fb6d0ff><span class="check" data-v-6fb6d0ff><span class="icon" data-v-6fb6d0ff><!--[--><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="sun" data-v-910d4043><path d="M12,18c-3.3,0-6-2.7-6-6s2.7-6,6-6s6,2.7,6,6S15.3,18,12,18zM12,8c-2.2,0-4,1.8-4,4c0,2.2,1.8,4,4,4c2.2,0,4-1.8,4-4C16,9.8,14.2,8,12,8z"></path><path d="M12,4c-0.6,0-1-0.4-1-1V1c0-0.6,0.4-1,1-1s1,0.4,1,1v2C13,3.6,12.6,4,12,4z"></path><path d="M12,24c-0.6,0-1-0.4-1-1v-2c0-0.6,0.4-1,1-1s1,0.4,1,1v2C13,23.6,12.6,24,12,24z"></path><path d="M5.6,6.6c-0.3,0-0.5-0.1-0.7-0.3L3.5,4.9c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l1.4,1.4c0.4,0.4,0.4,1,0,1.4C6.2,6.5,5.9,6.6,5.6,6.6z"></path><path d="M19.8,20.8c-0.3,0-0.5-0.1-0.7-0.3l-1.4-1.4c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l1.4,1.4c0.4,0.4,0.4,1,0,1.4C20.3,20.7,20,20.8,19.8,20.8z"></path><path d="M3,13H1c-0.6,0-1-0.4-1-1s0.4-1,1-1h2c0.6,0,1,0.4,1,1S3.6,13,3,13z"></path><path d="M23,13h-2c-0.6,0-1-0.4-1-1s0.4-1,1-1h2c0.6,0,1,0.4,1,1S23.6,13,23,13z"></path><path d="M4.2,20.8c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l1.4-1.4c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-1.4,1.4C4.7,20.7,4.5,20.8,4.2,20.8z"></path><path d="M18.4,6.6c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l1.4-1.4c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-1.4,1.4C18.9,6.5,18.6,6.6,18.4,6.6z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="moon" data-v-910d4043><path d="M12.1,22c-0.3,0-0.6,0-0.9,0c-5.5-0.5-9.5-5.4-9-10.9c0.4-4.8,4.2-8.6,9-9c0.4,0,0.8,0.2,1,0.5c0.2,0.3,0.2,0.8-0.1,1.1c-2,2.7-1.4,6.4,1.3,8.4c2.1,1.6,5,1.6,7.1,0c0.3-0.2,0.7-0.3,1.1-0.1c0.3,0.2,0.5,0.6,0.5,1c-0.2,2.7-1.5,5.1-3.6,6.8C16.6,21.2,14.4,22,12.1,22zM9.3,4.4c-2.9,1-5,3.6-5.2,6.8c-0.4,4.4,2.8,8.3,7.2,8.7c2.1,0.2,4.2-0.4,5.8-1.8c1.1-0.9,1.9-2.1,2.4-3.4c-2.5,0.9-5.3,0.5-7.5-1.1C9.2,11.4,8.1,7.7,9.3,4.4z"></path></svg><!--]--></span></span></button></div><div class="VPSocialLinks VPNavBarSocialLinks social-links" data-v-5c544ded data-v-ec2bb10b data-v-bb87c15e><!--[--><a class="VPSocialLink" href="https://github.com/effector/eslint-plugin" target="_blank" rel="noopener" data-v-bb87c15e data-v-9dcd5acc><svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>GitHub</title><path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"/></svg></a><a class="VPSocialLink" href="https://twitter.com/effectorjs" target="_blank" rel="noopener" data-v-bb87c15e data-v-9dcd5acc><svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Twitter</title><path d="M23.953 4.57a10 10 0 01-2.825.775 4.958 4.958 0 002.163-2.723c-.951.555-2.005.959-3.127 1.184a4.92 4.92 0 00-8.384 4.482C7.69 8.095 4.067 6.13 1.64 3.162a4.822 4.822 0 00-.666 2.475c0 1.71.87 3.213 2.188 4.096a4.904 4.904 0 01-2.228-.616v.06a4.923 4.923 0 003.946 4.827 4.996 4.996 0 01-2.212.085 4.936 4.936 0 004.604 3.417 9.867 9.867 0 01-6.102 2.105c-.39 0-.779-.023-1.17-.067a13.995 13.995 0 007.557 2.209c9.053 0 13.998-7.496 13.998-13.985 0-.21 0-.42-.015-.63A9.935 9.935 0 0024 4.59z"/></svg></a><!--]--></div><div class="VPFlyout VPNavBarExtra extra" data-v-5c544ded data-v-231001ce data-v-1da9cf42><button type="button" class="button" aria-haspopup="true" aria-expanded="false" aria-label="extra navigation" data-v-1da9cf42><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="icon" data-v-1da9cf42><circle cx="12" cy="12" r="2"></circle><circle cx="19" cy="12" r="2"></circle><circle cx="5" cy="12" r="2"></circle></svg></button><div class="menu" data-v-1da9cf42><div class="VPMenu" data-v-1da9cf42 data-v-54f41434><!----><!--[--><!--[--><!----><div class="group" data-v-231001ce><div class="item appearance" data-v-231001ce><p class="label" data-v-231001ce>Appearance</p><div class="appearance-action" data-v-231001ce><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" aria-label="toggle dark mode" aria-checked="false" data-v-231001ce data-v-910d4043 data-v-6fb6d0ff><span class="check" data-v-6fb6d0ff><span class="icon" data-v-6fb6d0ff><!--[--><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="sun" data-v-910d4043><path d="M12,18c-3.3,0-6-2.7-6-6s2.7-6,6-6s6,2.7,6,6S15.3,18,12,18zM12,8c-2.2,0-4,1.8-4,4c0,2.2,1.8,4,4,4c2.2,0,4-1.8,4-4C16,9.8,14.2,8,12,8z"></path><path d="M12,4c-0.6,0-1-0.4-1-1V1c0-0.6,0.4-1,1-1s1,0.4,1,1v2C13,3.6,12.6,4,12,4z"></path><path d="M12,24c-0.6,0-1-0.4-1-1v-2c0-0.6,0.4-1,1-1s1,0.4,1,1v2C13,23.6,12.6,24,12,24z"></path><path d="M5.6,6.6c-0.3,0-0.5-0.1-0.7-0.3L3.5,4.9c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l1.4,1.4c0.4,0.4,0.4,1,0,1.4C6.2,6.5,5.9,6.6,5.6,6.6z"></path><path d="M19.8,20.8c-0.3,0-0.5-0.1-0.7-0.3l-1.4-1.4c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l1.4,1.4c0.4,0.4,0.4,1,0,1.4C20.3,20.7,20,20.8,19.8,20.8z"></path><path d="M3,13H1c-0.6,0-1-0.4-1-1s0.4-1,1-1h2c0.6,0,1,0.4,1,1S3.6,13,3,13z"></path><path d="M23,13h-2c-0.6,0-1-0.4-1-1s0.4-1,1-1h2c0.6,0,1,0.4,1,1S23.6,13,23,13z"></path><path d="M4.2,20.8c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l1.4-1.4c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-1.4,1.4C4.7,20.7,4.5,20.8,4.2,20.8z"></path><path d="M18.4,6.6c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l1.4-1.4c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-1.4,1.4C18.9,6.5,18.6,6.6,18.4,6.6z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="moon" data-v-910d4043><path d="M12.1,22c-0.3,0-0.6,0-0.9,0c-5.5-0.5-9.5-5.4-9-10.9c0.4-4.8,4.2-8.6,9-9c0.4,0,0.8,0.2,1,0.5c0.2,0.3,0.2,0.8-0.1,1.1c-2,2.7-1.4,6.4,1.3,8.4c2.1,1.6,5,1.6,7.1,0c0.3-0.2,0.7-0.3,1.1-0.1c0.3,0.2,0.5,0.6,0.5,1c-0.2,2.7-1.5,5.1-3.6,6.8C16.6,21.2,14.4,22,12.1,22zM9.3,4.4c-2.9,1-5,3.6-5.2,6.8c-0.4,4.4,2.8,8.3,7.2,8.7c2.1,0.2,4.2-0.4,5.8-1.8c1.1-0.9,1.9-2.1,2.4-3.4c-2.5,0.9-5.3,0.5-7.5-1.1C9.2,11.4,8.1,7.7,9.3,4.4z"></path></svg><!--]--></span></span></button></div></div></div><div class="group" data-v-231001ce><div class="item social-links" data-v-231001ce><div class="VPSocialLinks social-links-list" data-v-231001ce data-v-bb87c15e><!--[--><a class="VPSocialLink" href="https://github.com/effector/eslint-plugin" target="_blank" rel="noopener" data-v-bb87c15e data-v-9dcd5acc><svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>GitHub</title><path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"/></svg></a><a class="VPSocialLink" href="https://twitter.com/effectorjs" target="_blank" rel="noopener" data-v-bb87c15e data-v-9dcd5acc><svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Twitter</title><path d="M23.953 4.57a10 10 0 01-2.825.775 4.958 4.958 0 002.163-2.723c-.951.555-2.005.959-3.127 1.184a4.92 4.92 0 00-8.384 4.482C7.69 8.095 4.067 6.13 1.64 3.162a4.822 4.822 0 00-.666 2.475c0 1.71.87 3.213 2.188 4.096a4.904 4.904 0 01-2.228-.616v.06a4.923 4.923 0 003.946 4.827 4.996 4.996 0 01-2.212.085 4.936 4.936 0 004.604 3.417 9.867 9.867 0 01-6.102 2.105c-.39 0-.779-.023-1.17-.067a13.995 13.995 0 007.557 2.209c9.053 0 13.998-7.496 13.998-13.985 0-.21 0-.42-.015-.63A9.935 9.935 0 0024 4.59z"/></svg></a><!--]--></div></div></div><!--]--><!--]--></div></div></div><!--[--><!--]--><button type="button" class="VPNavBarHamburger hamburger" aria-label="mobile navigation" aria-expanded="false" aria-controls="VPNavScreen" data-v-5c544ded data-v-8494978f><span class="container" data-v-8494978f><span class="top" data-v-8494978f></span><span class="middle" data-v-8494978f></span><span class="bottom" data-v-8494978f></span></span></button></div></div></div><!----></header><!----><!----><div class="VPContent" id="VPContent" data-v-5236d721 data-v-1853a4d3><div class="NotFound" data-v-1853a4d3 data-v-b74f7232><p class="code" data-v-b74f7232>404</p><h1 class="title" data-v-b74f7232>PAGE NOT FOUND</h1><div class="divider" data-v-b74f7232></div><blockquote class="quote" data-v-b74f7232> But if you don&#39;t change your direction, and if you keep looking, you may end up where you are heading. </blockquote><div class="action" data-v-b74f7232><a class="link" href="/" aria-label="go to home" data-v-b74f7232> Take me home </a></div></div></div><footer class="VPFooter" data-v-5236d721 data-v-ae90d55f><div class="container" data-v-ae90d55f><p class="message" data-v-ae90d55f>Released under the MIT License.</p><!----></div></footer><!--[--><!--]--></div></div>
15
- <script>__VP_HASH_MAP__ = JSON.parse("{\"index.md\":\"79361962\",\"presets___future.md\":\"6542932d\",\"presets___index.md\":\"af77aa24\",\"presets___list.md\":\"86dea8af\",\"presets___patronum.md\":\"9f3ad5fe\",\"presets___react.md\":\"dc2cc31a\",\"presets___recommended.md\":\"af826424\",\"presets___scope.md\":\"e5dd9837\",\"presets_future.md\":\"2962dd38\",\"presets_index.md\":\"c3c40451\",\"presets_patronum.md\":\"58445698\",\"presets_react.md\":\"fda31c90\",\"presets_recommended.md\":\"396d0c01\",\"presets_scope.md\":\"55da3541\",\"rules___index.md\":\"c943fc87\",\"rules___list.md\":\"ba316f20\",\"rules_enforce-effect-naming-convention.md\":\"09e5af2c\",\"rules_enforce-gate-naming-convention.md\":\"5f3af41a\",\"rules_enforce-store-naming-convention.md\":\"db33b9cb\",\"rules_index.md\":\"3e915bb2\",\"rules_keep-options-order.md\":\"5345093b\",\"rules_mandatory-scope-binding.md\":\"aff04a66\",\"rules_no-ambiguity-target.md\":\"7fde769b\",\"rules_no-duplicate-on.md\":\"09525e1d\",\"rules_no-forward.md\":\"2becbf92\",\"rules_no-getstate.md\":\"665d0467\",\"rules_no-guard.md\":\"5056c7b6\",\"rules_no-patronum-debug.md\":\"19f444fb\",\"rules_no-unnecessary-combination.md\":\"e7221074\",\"rules_no-unnecessary-duplication.md\":\"3a99556b\",\"rules_no-useless-methods.md\":\"e13dc29f\",\"rules_no-watch.md\":\"72ac4d86\",\"rules_prefer-sample-over-forward-with-mapping.md\":\"e5a7f363\",\"rules_prefer-useunit.md\":\"2d27cecd\",\"rules_strict-effect-handlers.md\":\"2f8965e2\"}")</script>
16
- <script type="module" async src="/assets/app.c5be1f68.js"></script>
17
-
18
- </body>
19
- </html>