eslint-plugin-react-hooks 2.5.1 → 3.0.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.
package/README.md CHANGED
@@ -34,6 +34,17 @@ Then add it to your ESLint configuration:
34
34
  }
35
35
  ```
36
36
 
37
+ Or use the recommended config:
38
+
39
+ ```js
40
+ {
41
+ "extends": [
42
+ // ...
43
+ "plugin:react-hooks/recommended"
44
+ ]
45
+ }
46
+ ```
47
+
37
48
  ## Valid and Invalid Examples
38
49
 
39
50
  Please refer to the [Rules of Hooks](https://reactjs.org/docs/hooks-rules.html) documentation and the [Hooks FAQ](https://reactjs.org/docs/hooks-faq.html#what-exactly-do-the-lint-rules-enforce) to learn more about this rule.
@@ -1,4 +1,4 @@
1
- /** @license React v2.5.1
1
+ /** @license React vundefined
2
2
  * eslint-plugin-react-hooks.development.js
3
3
  *
4
4
  * Copyright (c) Facebook, Inc. and its affiliates.
@@ -563,26 +563,29 @@ var RuleOfHooks = {
563
563
  message: message
564
564
  });
565
565
  }
566
- } else if (codePathNode.parent && (codePathNode.parent.type === 'MethodDefinition' || codePathNode.parent.type === 'ClassProperty') && codePathNode.parent.value === codePathNode) {// Ignore class methods for now because they produce too many
567
- // false positives due to feature flag checks. We're less
568
- // sensitive to them in classes because hooks would produce
569
- // runtime errors in classes anyway, and because a use*()
570
- // call in a class, if it works, is unambiguously *not* a hook.
566
+ } else if (codePathNode.parent && (codePathNode.parent.type === 'MethodDefinition' || codePathNode.parent.type === 'ClassProperty') && codePathNode.parent.value === codePathNode) {
567
+ // Custom message for hooks inside a class
568
+ var _message = "React Hook \"" + context.getSource(hook) + "\" cannot be called " + 'in a class component. React Hooks must be called in a ' + 'React function component or a custom React Hook function.';
569
+
570
+ context.report({
571
+ node: hook,
572
+ message: _message
573
+ });
571
574
  } else if (codePathFunctionName) {
572
575
  // Custom message if we found an invalid function name.
573
- var _message = "React Hook \"" + context.getSource(hook) + "\" is called in " + ("function \"" + context.getSource(codePathFunctionName) + "\" ") + 'that is neither a React function component nor a custom ' + 'React Hook function.';
576
+ var _message2 = "React Hook \"" + context.getSource(hook) + "\" is called in " + ("function \"" + context.getSource(codePathFunctionName) + "\" ") + 'that is neither a React function component nor a custom ' + 'React Hook function.';
574
577
 
575
578
  context.report({
576
579
  node: hook,
577
- message: _message
580
+ message: _message2
578
581
  });
579
582
  } else if (codePathNode.type === 'Program') {
580
583
  // These are dangerous if you have inline requires enabled.
581
- var _message2 = "React Hook \"" + context.getSource(hook) + "\" cannot be called " + 'at the top level. React Hooks must be called in a ' + 'React function component or a custom React Hook function.';
584
+ var _message3 = "React Hook \"" + context.getSource(hook) + "\" cannot be called " + 'at the top level. React Hooks must be called in a ' + 'React function component or a custom React Hook function.';
582
585
 
583
586
  context.report({
584
587
  node: hook,
585
- message: _message2
588
+ message: _message3
586
589
  });
587
590
  } else {
588
591
  // Assume in all other cases the user called a hook in some
@@ -591,11 +594,11 @@ var RuleOfHooks = {
591
594
  // enough in the common case that the incorrect message in
592
595
  // uncommon cases doesn't matter.
593
596
  if (isSomewhereInsideComponentOrHook) {
594
- var _message3 = "React Hook \"" + context.getSource(hook) + "\" cannot be called " + 'inside a callback. React Hooks must be called in a ' + 'React function component or a custom React Hook function.';
597
+ var _message4 = "React Hook \"" + context.getSource(hook) + "\" cannot be called " + 'inside a callback. React Hooks must be called in a ' + 'React function component or a custom React Hook function.';
595
598
 
596
599
  context.report({
597
600
  node: hook,
598
- message: _message3
601
+ message: _message4
599
602
  });
600
603
  }
601
604
  }
@@ -2138,18 +2141,21 @@ function isAncestorNodeOf(a, b) {
2138
2141
  return a.range[0] <= b.range[0] && a.range[1] >= b.range[1];
2139
2142
  }
2140
2143
 
2144
+ var configs = {
2145
+ recommended: {
2146
+ plugins: ['react-hooks'],
2147
+ rules: {
2148
+ 'react-hooks/rules-of-hooks': 'error',
2149
+ 'react-hooks/exhaustive-deps': 'warn'
2150
+ }
2151
+ }
2152
+ };
2141
2153
  var rules = {
2142
2154
  'rules-of-hooks': RuleOfHooks,
2143
2155
  'exhaustive-deps': ExhaustiveDeps
2144
2156
  };
2145
2157
 
2146
- var src = /*#__PURE__*/Object.freeze({
2147
- __proto__: null,
2148
- rules: rules
2149
- });
2150
-
2151
- var eslintPluginReactHooks = src;
2152
-
2153
- module.exports = eslintPluginReactHooks;
2158
+ exports.configs = configs;
2159
+ exports.rules = rules;
2154
2160
  })();
2155
2161
  }
@@ -1,4 +1,4 @@
1
- /** @license React v2.5.1
1
+ /** @license React vundefined
2
2
  * eslint-plugin-react-hooks.production.min.js
3
3
  *
4
4
  * Copyright (c) Facebook, Inc. and its affiliates.
@@ -7,46 +7,47 @@
7
7
  * LICENSE file in the root directory of this source tree.
8
8
  */
9
9
 
10
- 'use strict';function U(a){return"Identifier"===a.type?/^use[A-Z0-9].*$/.test(a.name):"MemberExpression"===a.type&&!a.computed&&U(a.property)?(a=a.object,"Identifier"===a.type&&"React"===a.name):!1}function ca(a){return"Identifier"===a.type?!/^[a-z]/.test(a.name):!1}function da(a,e){return a.name===e||"MemberExpression"===a.type&&"React"===a.object.name&&a.property.name===e}function ea(a){return!!(a.parent&&a.parent.callee&&da(a.parent.callee,"forwardRef"))}
11
- function fa(a){return!!(a.parent&&a.parent.callee&&da(a.parent.callee,"memo"))}function ha(a){for(;a;){var e=ia(a);if(e&&(ca(e)||U(e))||ea(a)||fa(a))return!0;a=a.parent}return!1}
12
- function ia(a){if("FunctionDeclaration"===a.type||"FunctionExpression"===a.type&&a.id)return a.id;if("FunctionExpression"===a.type||"ArrowFunctionExpression"===a.type)return"VariableDeclarator"===a.parent.type&&a.parent.init===a?a.parent.id:"AssignmentExpression"===a.parent.type&&a.parent.right===a&&"="===a.parent.operator?a.parent.left:"Property"!==a.parent.type||a.parent.value!==a||a.parent.computed?"AssignmentPattern"!==a.parent.type||a.parent.right!==a||a.parent.computed?void 0:a.parent.left:
10
+ 'use strict';function U(a){return"Identifier"===a.type?/^use[A-Z0-9].*$/.test(a.name):"MemberExpression"===a.type&&!a.computed&&U(a.property)?(a=a.object,"Identifier"===a.type&&"React"===a.name):!1}function ba(a){return"Identifier"===a.type?!/^[a-z]/.test(a.name):!1}function ca(a,f){return a.name===f||"MemberExpression"===a.type&&"React"===a.object.name&&a.property.name===f}function da(a){return!!(a.parent&&a.parent.callee&&ca(a.parent.callee,"forwardRef"))}
11
+ function ea(a){return!!(a.parent&&a.parent.callee&&ca(a.parent.callee,"memo"))}function fa(a){for(;a;){var f=ha(a);if(f&&(ba(f)||U(f))||da(a)||ea(a))return!0;a=a.parent}return!1}
12
+ function ha(a){if("FunctionDeclaration"===a.type||"FunctionExpression"===a.type&&a.id)return a.id;if("FunctionExpression"===a.type||"ArrowFunctionExpression"===a.type)return"VariableDeclarator"===a.parent.type&&a.parent.init===a?a.parent.id:"AssignmentExpression"===a.parent.type&&a.parent.right===a&&"="===a.parent.operator?a.parent.left:"Property"!==a.parent.type||a.parent.value!==a||a.parent.computed?"AssignmentPattern"!==a.parent.type||a.parent.right!==a||a.parent.computed?void 0:a.parent.left:
13
13
  a.parent.key}
14
- function W(a){function e(){return{isRequired:!1,isSatisfiedRecursively:!1,hasRequiredNodesBelow:!1,children:new Map}}function b(a,d){d=d.split(".");var k=!0,l=!1,b=void 0;try{for(var g=d[Symbol.iterator](),q;!(k=(q=g.next()).done);k=!0){var m=q.value,x=a.children.get(m);x||(x=e(),a.children.set(m,x));a=x}}catch(D){l=!0,b=D}finally{try{k||null==g.return||g.return()}finally{if(l)throw b;}}return a}function g(a,d,e){d=d.split(".");var k=!0,l=!1,b=void 0;try{for(var g=d[Symbol.iterator](),x;!(k=(x=g.next()).done);k=
15
- !0){var m=a.children.get(x.value);if(!m)break;e(m);a=m}}catch(D){l=!0,b=D}finally{try{k||null==g.return||g.return()}finally{if(l)throw b;}}}function d(a,e,l,g){a.children.forEach(function(a,k){var b=g(k);a.isSatisfiedRecursively?a.hasRequiredNodesBelow&&l.add(b):a.isRequired?e.add(b):d(a,e,l,function(a){return b+"."+a})})}var x=a.dependencies,n=a.declaredDependencies,y=a.optionalDependencies,l=a.externalDependencies,E=a.isEffect,F=e();x.forEach(function(a,d){b(F,d).isRequired=!0;g(F,d,function(a){a.hasRequiredNodesBelow=
16
- !0})});n.forEach(function(a){b(F,a.key).isSatisfiedRecursively=!0});y.forEach(function(a){b(F,a).isSatisfiedRecursively=!0});a=new Set;var m=new Set;d(F,a,m,function(a){return a});var t=[],A=new Set,B=new Set;n.forEach(function(a){a=a.key;m.has(a)?-1===t.indexOf(a)?t.push(a):B.add(a):!E||a.endsWith(".current")||l.has(a)?A.add(a):-1===t.indexOf(a)&&t.push(a)});a.forEach(function(a){t.push(a)});return{suggestedDependencies:t,unnecessaryDependencies:A,duplicateDependencies:B,missingDependencies:a}}
17
- function ja(a){var e=a.declaredDependenciesNode,b=a.componentScope,g=a.scope;return a.declaredDependencies.map(function(a){a=b.set.get(a.key);if(null==a)return null;var d=a.defs[0];return null==d?null:"Variable"===d.type&&"VariableDeclarator"===d.node.type&&null!=d.node.init&&("ArrowFunctionExpression"===d.node.init.type||"FunctionExpression"===d.node.init.type)||"FunctionName"===d.type&&"FunctionDeclaration"===d.node.type?a:null}).filter(Boolean).map(function(a){var d=a.defs[0];a:{for(var b=!1,y=
18
- 0;y<a.references.length;y++){var l=a.references[y];if(l.writeExpr)if(b){a=!0;break a}else{b=!0;continue}for(var E=l.from;E!==g&&null!=E;)E=E.upper;if(E!==g&&!ka(e,l.identifier)){a=!0;break a}}a=!1}return{fn:d,suggestUseCallback:a}})}function la(a){return"MemberExpression"!==a.parent.type||a.parent.object!==a||"current"===a.parent.property.name||a.parent.computed||null!=a.parent.parent&&"CallExpression"===a.parent.parent.type&&a.parent.parent.callee===a.parent?a:la(a.parent)}
19
- function Y(a){if("Identifier"===a.type)return a.name;if("MemberExpression"!==a.type||a.computed)throw Error("Unsupported node type: "+a.type);var e=Y(a.object);a=Y(a.property);return e+"."+a}function ma(a){return"MemberExpression"!==a.type||"Identifier"!==a.object.type||"React"!==a.object.name||"Identifier"!==a.property.type||a.computed?a:a.property}
20
- function na(a,e){var b=ma(a);if("Identifier"!==b.type)return null;switch(b.name){case "useEffect":case "useLayoutEffect":case "useCallback":case "useMemo":return 0;case "useImperativeHandle":return 1;default:if(b===a&&e&&e.additionalHooks){try{var g=Y(b)}catch(d){if(/Unsupported node type/.test(d.message))return 0;throw d;}return e.additionalHooks.test(g)?0:-1}return-1}}
21
- function Z(a,e){for(var b=[a],g=null;b.length;){g=b.shift();if("Identifier"===g.type&&g.name===e.name&&g.range[0]===e.range[0]&&g.range[1]===e.range[1])return g;if(ka(g,e)){a=0;for(var d=Object.entries(g);a<d.length;a++){var x=d[a],n=x[1];"parent"!==x[0]&&(oa(n)?(n.parent=g,b.push(n)):Array.isArray(n)&&n.forEach(function(a){oa(a)&&(a.parent=g,b.push(a))}))}}}return null}
22
- function pa(a){for(var e="",b=0;b<a.length;b++)e+=a[b],0===b&&2===a.length?e+=" and ":b===a.length-2&&2<a.length?e+=", and ":b<a.length-1&&(e+=", ");return e}function oa(a){return"object"===typeof a&&null!==a&&!Array.isArray(a)&&"string"===typeof a.type}function ka(a,e){return a.range[0]<=e.range[0]&&a.range[1]>=e.range[1]}
23
- module.exports={__proto__:null,rules:{"rules-of-hooks":{create:function(a){var e=[],b=[];return{onCodePathSegmentStart:function(a){return b.push(a)},onCodePathSegmentEnd:function(){return b.pop()},onCodePathStart:function(){return e.push(new Map)},onCodePathEnd:function(b,d){function g(a,d){var c=g.cache,h=c.get(a.id);d=new Set(d);if(d.has(a.id)){c=[].concat(d);a=c.slice(c.indexOf(a.id)+1);c=!0;h=!1;var f=void 0;try{for(var r=a[Symbol.iterator](),M;!(c=(M=r.next()).done);c=!0)E.add(M.value)}catch(J){h=
24
- !0,f=J}finally{try{c||null==r.return||r.return()}finally{if(h)throw f;}}return 0}d.add(a.id);if(void 0!==h)return h;if(b.thrownSegments.includes(a))h=0;else if(0===a.prevSegments.length)h=1;else{h=0;r=!0;M=!1;var e=void 0;try{f=a.prevSegments[Symbol.iterator]();for(var l;!(r=(l=f.next()).done);r=!0)h+=g(l.value,d)}catch(J){M=!0,e=J}finally{try{r||null==f.return||f.return()}finally{if(M)throw e;}}}a.reachable&&0===h?c.delete(a.id):c.set(a.id,h);return h}function n(a,d){var c=n.cache,h=c.get(a.id);
25
- d=new Set(d);if(d.has(a.id)){c=Array.from(d);a=c.slice(c.indexOf(a.id)+1);c=!0;h=!1;var f=void 0;try{for(var r=a[Symbol.iterator](),e;!(c=(e=r.next()).done);c=!0)E.add(e.value)}catch(J){h=!0,f=J}finally{try{c||null==r.return||r.return()}finally{if(h)throw f;}}return 0}d.add(a.id);if(void 0!==h)return h;if(b.thrownSegments.includes(a))h=0;else if(0===a.nextSegments.length)h=1;else{h=0;r=!0;e=!1;var l=void 0;try{f=a.nextSegments[Symbol.iterator]();for(var g;!(r=(g=f.next()).done);r=!0)h+=n(g.value,
26
- d)}catch(J){e=!0,l=J}finally{try{r||null==f.return||f.return()}finally{if(e)throw l;}}}c.set(a.id,h);return h}function y(a){var d=y.cache,c=d.get(a.id);if(null===c)return Infinity;if(void 0!==c)return c;d.set(a.id,null);if(0===a.prevSegments.length)c=1;else{c=Infinity;var h=!0,f=!1,r=void 0;try{for(var e=a.prevSegments[Symbol.iterator](),b;!(h=(b=e.next()).done);h=!0){var l=y(b.value);l<c&&(c=l)}}catch(J){f=!0,r=J}finally{try{h||null==e.return||e.return()}finally{if(f)throw r;}}c+=1}d.set(a.id,c);
27
- return c}var l=e.pop();if(0!==l.size){var E=new Set;g.cache=new Map;n.cache=new Map;y.cache=new Map;var F=n(b.initialSegment),m=ia(d),t=ha(d),A=m?ca(m)||U(m):ea(d)||fa(d),B=Infinity,k=!0,q=!1,I=void 0;try{for(var w=b.finalSegments[Symbol.iterator](),L;!(k=(L=w.next()).done);k=!0){var X=L.value;if(X.reachable){var T=y(X);T<B&&(B=T)}}}catch(G){q=!0,I=G}finally{try{k||null==w.return||w.return()}finally{if(q)throw I;}}k=!0;q=!1;I=void 0;try{for(var z=l[Symbol.iterator](),Q;!(k=(Q=z.next()).done);k=!0){var D=
28
- Q.value,C=D[0],N=D[1];if(C.reachable){var K=0===C.nextSegments.length?B<=y(C):B<y(C),R=g(C)*n(C),H=E.has(C.id);l=!0;w=!1;L=void 0;try{for(var v=N[Symbol.iterator](),O;!(l=(O=v.next()).done);l=!0){var p=O.value;H&&a.report({node:p,message:'React Hook "'+a.getSource(p)+'" may be executed more than once. Possibly because it is called in a loop. React Hooks must be called in the exact same order in every component render.'});if(A){if(!H&&R!==F){var V='React Hook "'+a.getSource(p)+'" is called conditionally. React Hooks must be called in the exact same order in every component render.'+
29
- (K?" Did you accidentally call a React Hook after an early return?":"");a.report({node:p,message:V})}}else if(!d.parent||"MethodDefinition"!==d.parent.type&&"ClassProperty"!==d.parent.type||d.parent.value!==d)if(m){var P='React Hook "'+a.getSource(p)+'" is called in function "'+(a.getSource(m)+'" that is neither a React function component nor a custom React Hook function.');a.report({node:p,message:P})}else if("Program"===d.type){var S='React Hook "'+a.getSource(p)+'" cannot be called at the top level. React Hooks must be called in a React function component or a custom React Hook function.';
30
- a.report({node:p,message:S})}else if(t){var u='React Hook "'+a.getSource(p)+'" cannot be called inside a callback. React Hooks must be called in a React function component or a custom React Hook function.';a.report({node:p,message:u})}}}catch(G){w=!0,L=G}finally{try{l||null==v.return||v.return()}finally{if(w)throw L;}}}}}catch(G){q=!0,I=G}finally{try{k||null==z.return||z.return()}finally{if(q)throw I;}}}},CallExpression:function(a){if(U(a.callee)){var d=e[e.length-1],g=b[b.length-1],n=d.get(g);n||
31
- (n=[],d.set(g,n));n.push(a.callee)}}}}},"exhaustive-deps":{meta:{schema:[{type:"object",additionalProperties:!1,properties:{additionalHooks:{type:"string"}}}]},create:function(a){function e(a,d){return function(e){if(d.has(e))return d.get(e);var b=a(e);d.set(e,b);return b}}function b(b){function l(a){var c=!0,f=!1,r=void 0;try{for(var d=a.references[Symbol.iterator](),e;!(c=(e=d.next()).done);c=!0){var g=e.value;if(g.resolved&&I.has(g.resolved.scope)){var m=Z(b,g.identifier),k=la(m),n=Y(k),q;if(q=
32
- B&&"Identifier"===k.type&&"MemberExpression"===k.parent.type&&!k.parent.computed&&"Identifier"===k.parent.property.type&&"current"===k.parent.property.name){for(var p=g.from,u=!1;p.block!==b;)"function"===p.type&&(u=null!=p.block.parent&&"ReturnStatement"===p.block.parent.type),p=p.upper;q=u}q&&T.set(n,{reference:g,dependencyNode:k});var t=g.resolved.defs[0];if(null!=t&&(null==t.node||t.node.init!==b.parent)&&"TypeParameter"!==t.type)if(z.has(n))z.get(n).references.push(g);else{var w=g.resolved,x=
33
- L(w)||X(w);z.set(n,{isStatic:x,references:[g]})}}}}catch(ba){f=!0,r=ba}finally{try{c||null==d.return||d.return()}finally{if(f)throw r;}}c=!0;f=!1;r=void 0;try{for(var v=a.childScopes[Symbol.iterator](),y;!(c=(y=v.next()).done);c=!0)l(y.value)}catch(ba){f=!0,r=ba}finally{try{c||null==v.return||v.return()}finally{if(f)throw r;}}}function F(a,h,f,d){return 0===a.size?null:(1<a.size?"":h+" ")+f+" "+(1<a.size?"dependencies":"dependency")+": "+pa(Array.from(a).sort().map(function(a){return"'"+a+"'"}))+
34
- (". Either "+d+" "+(1<a.size?"them":"it")+" or remove the dependency array.")}if(("FunctionExpression"===b.type||"ArrowFunctionExpression"===b.type)&&"CallExpression"===b.parent.type){var m=na(b.parent.callee,g);if(b.parent.arguments[m]===b){var t=b.parent.callee,A=ma(t).name,B=/Effect($|[^a-z])/g.test(A),k=b.parent.arguments[m+1];if(k||B){B&&b.async&&a.report({node:b,message:"Effect callbacks are synchronous to prevent race conditions. Put the async function inside:\n\nuseEffect(() => {\n async function fetchData() {\n // You can await here\n const response = await MyAPI.getData(someId);\n // ...\n }\n fetchData();\n}, [someId]); // Or [] if effect doesn't need props or state\n\nLearn more about data fetching with Hooks: https://fb.me/react-hooks-data-fetching"});
35
- var q=a.getScope(),I=new Set,w=null;for(m=q.upper;m;){I.add(m);if("function"===m.type)break;m=m.upper}if(m){w=m;var L=e(function(a){if(!Array.isArray(a.defs))return!1;var c=a.defs[0];if(null==c||"VariableDeclarator"!==c.node.type)return!1;var f=c.node.init;if(null==f)return!1;var b=c.node.parent;if(null==b&&(Z(w.block,c.node.id),b=c.node.parent,null==b))return!1;if("const"===b.kind&&"Literal"===f.type&&("string"===typeof f.value||"number"===typeof f.value||null===f.value))return!0;if("CallExpression"!==
36
- f.type)return!1;f=f.callee;"MemberExpression"!==f.type||"React"!==f.object.name||null==f.property||f.computed||(f=f.property);if("Identifier"!==f.type)return!1;c=c.node.id;f=f.name;if("useRef"===f&&"Identifier"===c.type)return!0;if(("useState"===f||"useReducer"===f)&&"ArrayPattern"===c.type&&2===c.elements.length&&Array.isArray(a.identifiers)){if(c.elements[1]===a.identifiers[0]){if("useState"===f)for(a=a.references,f=0;f<a.length;f++)d.set(a[f].identifier,c.elements[0]);return!0}if(c.elements[0]===
37
- a.identifiers[0]&&"useState"===f)for(a=a.references,c=0;c<a.length;c++)x.add(a[c].identifier)}return!1},n),X=e(function(a){if(!Array.isArray(a.defs))return!1;a=a.defs[0];if(null==a||null==a.node||null==a.node.id)return!1;var c=a.node,f=w.childScopes;a=null;var b;for(b=0;b<f.length;b++){var d=f[b],e=d.block;if("FunctionDeclaration"===c.type&&e===c||"VariableDeclarator"===c.type&&e.parent===c){a=d;break}}if(null==a)return!1;for(b=0;b<a.through.length;b++)if(c=a.through[b],null!=c.resolved&&I.has(c.resolved.scope)&&
38
- !L(c.resolved))return!1;return!0},y),T=new Map,z=new Map;l(q);T.forEach(function(c,b){var f=c.dependencyNode;c=c.reference.resolved.references;for(var d=!1,e=0;e<c.length;e++){var h=c[e].identifier.parent;if(null!=h&&"MemberExpression"===h.type&&!h.computed&&"Identifier"===h.property.type&&"current"===h.property.name&&"AssignmentExpression"===h.parent.type&&h.parent.left===h){d=!0;break}}d||a.report({node:f.parent.property,message:"The ref value '"+b+".current' will likely have changed by the time this effect cleanup function runs. If this ref points to a node rendered by React, copy '"+
39
- (b+".current' to a variable inside the effect, and use that variable in the cleanup function.")})});var Q=new Set,D=new Set;z.forEach(function(c,b){var f=c.references;c.isStatic&&D.add(b);f.forEach(function(c){c.writeExpr&&(c=c.writeExpr,Q.has(b)||(Q.add(b),a.report({node:c,message:"Assignments to the '"+b+"' variable from inside React Hook "+(a.getSource(t)+" will be lost after each render. To preserve the value over time, store it in a useRef Hook and keep the mutable value in the '.current' property. Otherwise, you can move this variable directly inside ")+
40
- (a.getSource(t)+".")})))})});if(!(0<Q.size))if(k){var C=[],N=new Set;"ArrayExpression"!==k.type?a.report({node:k,message:"React Hook "+a.getSource(t)+" was passed a dependency list that is not an array literal. This means we can't statically verify whether you've passed the correct dependencies."}):k.elements.forEach(function(c){if(null!==c)if("SpreadElement"===c.type)a.report({node:c,message:"React Hook "+a.getSource(t)+" has a spread element in its dependency array. This means we can't statically verify whether you've passed the correct dependencies."});
41
- else{try{var b=Y(c)}catch(M){if(/Unsupported node type/.test(M.message)){"Literal"===c.type?z.has(c.value)?a.report({node:c,message:"The "+c.raw+" literal is not a valid dependency because it never changes. Did you mean to include "+(c.value+" in the array instead?")}):a.report({node:c,message:"The "+c.raw+" literal is not a valid dependency because it never changes. You can safely remove it."}):a.report({node:c,message:"React Hook "+a.getSource(t)+" has a complex expression in the dependency array. Extract it to a separate variable so it can be statically checked."});
42
- return}throw M;}for(var f=c;"MemberExpression"===f.type;)f=f.object;var d=!w.through.some(function(a){return a.identifier===f});C.push({key:b,node:c});d||N.add(b)}});var K=W({dependencies:z,declaredDependencies:C,optionalDependencies:D,externalDependencies:N,isEffect:B}),R=K.suggestedDependencies;m=K.unnecessaryDependencies;var H=K.missingDependencies;K=K.duplicateDependencies;if(0===K.size+H.size+m.size)ja({declaredDependencies:C,declaredDependenciesNode:k,componentScope:w,scope:q}).forEach(function(c){var b=
43
- c.fn;c=c.suggestUseCallback;var f="The '"+b.name.name+"' function makes the dependencies of "+(A+" Hook (at line "+k.loc.start.line+") change on every render.");f=c?f+(" To fix this, wrap the '"+(b.name.name+"' definition into its own useCallback() Hook.")):f+(" Move it inside the "+A+" callback. Alternatively, wrap the '"+(b.name.name+"' definition into its own useCallback() Hook."));var d;c&&"Variable"===b.type&&(d=[{desc:"Wrap the '"+b.name.name+"' definition into its own useCallback() Hook.",
44
- fix:function(a){return[a.insertTextBefore(b.node.init,"useCallback("),a.insertTextAfter(b.node.init,")")]}}]);a.report({node:b.node,message:f,suggest:d})});else{!B&&0<H.size&&(R=W({dependencies:z,declaredDependencies:[],optionalDependencies:D,externalDependencies:N,isEffect:B}).suggestedDependencies);(function(){if(0===C.length)return!0;var a=C.map(function(a){return a.key}),b=a.slice().sort();return a.join(",")===b.join(",")})()&&R.sort();var v="";if(0<m.size){var O=null;Array.from(m.keys()).forEach(function(a){null===
45
- O&&a.endsWith(".current")&&(O=a)});if(null!==O)v=" Mutable values like '"+O+"' aren't valid dependencies because mutating them doesn't re-render the component.";else if(0<N.size){var p=Array.from(N)[0];q.set.has(p)||(v=" Outer scope values like '"+p+"' aren't valid dependencies because mutating them doesn't re-render the component.")}}if(!v&&H.has("props")){q=z.get("props");if(null==q)return;q=q.references;if(!Array.isArray(q))return;p=!0;for(var V=0;V<q.length;V++){var P=Z(w.block,q[V].identifier);
46
- if(!P){p=!1;break}P=P.parent;if(null==P){p=!1;break}if("MemberExpression"!==P.type){p=!1;break}}p&&(v=" However, 'props' will change when *any* prop changes, so the preferred fix is to destructure the 'props' object outside of the "+(A+" call and refer to those specific props inside ")+(a.getSource(t)+"."))}if(!v&&0<H.size){var S=null;H.forEach(function(a){if(!S){var c=w.set.get(a),b=z.get(a);if(b.references[0].resolved===c&&(c=c.defs[0],null!=c&&null!=c.name&&"Parameter"===c.type)){c=!1;for(var d,
47
- e=0;e<b.references.length;e++)if(d=b.references[e].identifier,null!=d&&null!=d.parent&&"CallExpression"===d.parent.type&&d.parent.callee===d){c=!0;break}c&&(S=a)}}});null!==S&&(v=" If '"+S+"' changes too often, find the parent component that defines it and wrap that definition in useCallback.")}if(!v&&0<H.size){var u=null;H.forEach(function(a){if(null===u)for(var c=z.get(a).references,b,e,g=0;g<c.length;g++){b=c[g].identifier;for(e=b.parent;null!=e&&e!==w.block;){if("CallExpression"===e.type){var k=
48
- d.get(e.callee);if(null!=k){k.name===a?u={missingDep:a,setter:e.callee.name,form:"updater"}:x.has(b)?u={missingDep:a,setter:e.callee.name,form:"reducer"}:(b=c[g].resolved,null!=b&&(b=b.defs[0],null!=b&&"Parameter"===b.type&&(u={missingDep:a,setter:e.callee.name,form:"inlineReducer"})));break}}e=e.parent}if(null!==u)break}});if(null!==u)switch(u.form){case "reducer":v=" You can also replace multiple useState variables with useReducer if '"+(u.setter+"' needs the current value of '")+(u.missingDep+
49
- "'.");break;case "inlineReducer":v=" If '"+u.setter+"' needs the current value of '"+(u.missingDep+"', you can also switch to useReducer instead of useState and read '")+(u.missingDep+"' in the reducer.");break;case "updater":v=" You can also do a functional update '"+u.setter+"("+u.missingDep.substring(0,1)+" => ...)' if you only need '"+u.missingDep+"' in the '"+(u.setter+"' call.");break;default:throw Error("Unknown case.");}}a.report({node:k,message:"React Hook "+a.getSource(t)+" has "+(F(H,"a",
50
- "missing","include")||F(m,"an","unnecessary","exclude")||F(K,"a","duplicate","omit"))+v,suggest:[{desc:"Update the dependencies array to be: ["+R.join(", ")+"]",fix:function(a){return a.replaceText(k,"["+R.join(", ")+"]")}}]})}}else{var G=null;z.forEach(function(a,e){G||a.references.forEach(function(a){if(!G&&d.has(a.identifier)){for(a=a.from;"function"!==a.type;)a=a.upper;a.block===b&&(G=e)}})});if(G){var aa=W({dependencies:z,declaredDependencies:[],optionalDependencies:D,externalDependencies:new Set,
51
- isEffect:!0}).suggestedDependencies;a.report({node:b.parent.callee,message:"React Hook "+A+" contains a call to '"+G+"'. Without a list of dependencies, this can lead to an infinite chain of updates. To fix this, pass ["+aa.join(", ")+("] as a second argument to the "+A+" Hook."),suggest:[{desc:"Add dependencies array: ["+aa.join(", ")+"]",fix:function(a){return a.insertTextAfter(b,", ["+aa.join(", ")+"]")}}]})}}}}else"useMemo"!==A&&"useCallback"!==A||a.report({node:b.parent.callee,message:"React Hook "+
52
- A+" does nothing when called with only one argument. Did you forget to pass an array of dependencies?"})}}}var g={additionalHooks:a.options&&a.options[0]&&a.options[0].additionalHooks?new RegExp(a.options[0].additionalHooks):void 0},d=new WeakMap,x=new WeakSet,n=new WeakMap,y=new WeakMap;return{FunctionExpression:b,ArrowFunctionExpression:b}}}}};
14
+ function W(a){function f(){return{isRequired:!1,isSatisfiedRecursively:!1,hasRequiredNodesBelow:!1,children:new Map}}function e(a,d){d=d.split(".");var l=!0,m=!1,e=void 0;try{for(var h=d[Symbol.iterator](),q;!(l=(q=h.next()).done);l=!0){var k=q.value,w=a.children.get(k);w||(w=f(),a.children.set(k,w));a=w}}catch(D){m=!0,e=D}finally{try{l||null==h.return||h.return()}finally{if(m)throw e;}}return a}function h(a,d,f){d=d.split(".");var l=!0,m=!1,e=void 0;try{for(var h=d[Symbol.iterator](),w;!(l=(w=h.next()).done);l=
15
+ !0){var k=a.children.get(w.value);if(!k)break;f(k);a=k}}catch(D){m=!0,e=D}finally{try{l||null==h.return||h.return()}finally{if(m)throw e;}}}function d(a,f,m,h){a.children.forEach(function(a,l){var e=h(l);a.isSatisfiedRecursively?a.hasRequiredNodesBelow&&m.add(e):a.isRequired?f.add(e):d(a,f,m,function(a){return e+"."+a})})}var w=a.dependencies,p=a.declaredDependencies,x=a.optionalDependencies,m=a.externalDependencies,E=a.isEffect,F=f();w.forEach(function(a,d){e(F,d).isRequired=!0;h(F,d,function(a){a.hasRequiredNodesBelow=
16
+ !0})});p.forEach(function(a){e(F,a.key).isSatisfiedRecursively=!0});x.forEach(function(a){e(F,a).isSatisfiedRecursively=!0});a=new Set;var k=new Set;d(F,a,k,function(a){return a});var r=[],A=new Set,B=new Set;p.forEach(function(a){a=a.key;k.has(a)?-1===r.indexOf(a)?r.push(a):B.add(a):!E||a.endsWith(".current")||m.has(a)?A.add(a):-1===r.indexOf(a)&&r.push(a)});a.forEach(function(a){r.push(a)});return{suggestedDependencies:r,unnecessaryDependencies:A,duplicateDependencies:B,missingDependencies:a}}
17
+ function ia(a){var f=a.declaredDependenciesNode,e=a.componentScope,h=a.scope;return a.declaredDependencies.map(function(a){a=e.set.get(a.key);if(null==a)return null;var d=a.defs[0];return null==d?null:"Variable"===d.type&&"VariableDeclarator"===d.node.type&&null!=d.node.init&&("ArrowFunctionExpression"===d.node.init.type||"FunctionExpression"===d.node.init.type)||"FunctionName"===d.type&&"FunctionDeclaration"===d.node.type?a:null}).filter(Boolean).map(function(a){var d=a.defs[0];a:{for(var e=!1,x=
18
+ 0;x<a.references.length;x++){var m=a.references[x];if(m.writeExpr)if(e){a=!0;break a}else{e=!0;continue}for(var E=m.from;E!==h&&null!=E;)E=E.upper;if(E!==h&&!ja(f,m.identifier)){a=!0;break a}}a=!1}return{fn:d,suggestUseCallback:a}})}function ka(a){return"MemberExpression"!==a.parent.type||a.parent.object!==a||"current"===a.parent.property.name||a.parent.computed||null!=a.parent.parent&&"CallExpression"===a.parent.parent.type&&a.parent.parent.callee===a.parent?a:ka(a.parent)}
19
+ function Y(a){if("Identifier"===a.type)return a.name;if("MemberExpression"!==a.type||a.computed)throw Error("Unsupported node type: "+a.type);var f=Y(a.object);a=Y(a.property);return f+"."+a}function ma(a){return"MemberExpression"!==a.type||"Identifier"!==a.object.type||"React"!==a.object.name||"Identifier"!==a.property.type||a.computed?a:a.property}
20
+ function na(a,f){var e=ma(a);if("Identifier"!==e.type)return null;switch(e.name){case "useEffect":case "useLayoutEffect":case "useCallback":case "useMemo":return 0;case "useImperativeHandle":return 1;default:if(e===a&&f&&f.additionalHooks){try{var h=Y(e)}catch(d){if(/Unsupported node type/.test(d.message))return 0;throw d;}return f.additionalHooks.test(h)?0:-1}return-1}}
21
+ function Z(a,f){for(var e=[a],h=null;e.length;){h=e.shift();if("Identifier"===h.type&&h.name===f.name&&h.range[0]===f.range[0]&&h.range[1]===f.range[1])return h;if(ja(h,f)){a=0;for(var d=Object.entries(h);a<d.length;a++){var w=d[a],p=w[1];"parent"!==w[0]&&(oa(p)?(p.parent=h,e.push(p)):Array.isArray(p)&&p.forEach(function(a){oa(a)&&(a.parent=h,e.push(a))}))}}}return null}
22
+ function pa(a){for(var f="",e=0;e<a.length;e++)f+=a[e],0===e&&2===a.length?f+=" and ":e===a.length-2&&2<a.length?f+=", and ":e<a.length-1&&(f+=", ");return f}function oa(a){return"object"===typeof a&&null!==a&&!Array.isArray(a)&&"string"===typeof a.type}function ja(a,f){return a.range[0]<=f.range[0]&&a.range[1]>=f.range[1]}exports.configs={recommended:{plugins:["react-hooks"],rules:{"react-hooks/rules-of-hooks":"error","react-hooks/exhaustive-deps":"warn"}}};
23
+ exports.rules={"rules-of-hooks":{create:function(a){var f=[],e=[];return{onCodePathSegmentStart:function(a){return e.push(a)},onCodePathSegmentEnd:function(){return e.pop()},onCodePathStart:function(){return f.push(new Map)},onCodePathEnd:function(e,d){function h(a,g){var b=h.cache,c=b.get(a.id);g=new Set(g);if(g.has(a.id)){b=[].concat(g);a=b.slice(b.indexOf(a.id)+1);b=!0;c=!1;var z=void 0;try{for(var d=a[Symbol.iterator](),f;!(b=(f=d.next()).done);b=!0)E.add(f.value)}catch(J){c=!0,z=J}finally{try{b||
24
+ null==d.return||d.return()}finally{if(c)throw z;}}return 0}g.add(a.id);if(void 0!==c)return c;if(e.thrownSegments.includes(a))c=0;else if(0===a.prevSegments.length)c=1;else{c=0;d=!0;f=!1;var m=void 0;try{z=a.prevSegments[Symbol.iterator]();for(var k;!(d=(k=z.next()).done);d=!0)c+=h(k.value,g)}catch(J){f=!0,m=J}finally{try{d||null==z.return||z.return()}finally{if(f)throw m;}}}a.reachable&&0===c?b.delete(a.id):b.set(a.id,c);return c}function p(a,g){var b=p.cache,c=b.get(a.id);g=new Set(g);if(g.has(a.id)){b=
25
+ Array.from(g);a=b.slice(b.indexOf(a.id)+1);b=!0;c=!1;var z=void 0;try{for(var d=a[Symbol.iterator](),f;!(b=(f=d.next()).done);b=!0)E.add(f.value)}catch(J){c=!0,z=J}finally{try{b||null==d.return||d.return()}finally{if(c)throw z;}}return 0}g.add(a.id);if(void 0!==c)return c;if(e.thrownSegments.includes(a))c=0;else if(0===a.nextSegments.length)c=1;else{c=0;d=!0;f=!1;var m=void 0;try{z=a.nextSegments[Symbol.iterator]();for(var h;!(d=(h=z.next()).done);d=!0)c+=p(h.value,g)}catch(J){f=!0,m=J}finally{try{d||
26
+ null==z.return||z.return()}finally{if(f)throw m;}}}b.set(a.id,c);return c}function x(a){var g=x.cache,b=g.get(a.id);if(null===b)return Infinity;if(void 0!==b)return b;g.set(a.id,null);if(0===a.prevSegments.length)b=1;else{b=Infinity;var c=!0,z=!1,d=void 0;try{for(var f=a.prevSegments[Symbol.iterator](),e;!(c=(e=f.next()).done);c=!0){var m=x(e.value);m<b&&(b=m)}}catch(J){z=!0,d=J}finally{try{c||null==f.return||f.return()}finally{if(z)throw d;}}b+=1}g.set(a.id,b);return b}var m=f.pop();if(0!==m.size){var E=
27
+ new Set;h.cache=new Map;p.cache=new Map;x.cache=new Map;var F=p(e.initialSegment),k=ha(d),r=fa(d),A=k?ba(k)||U(k):da(d)||ea(d),B=Infinity,l=!0,q=!1,H=void 0;try{for(var v=e.finalSegments[Symbol.iterator](),L;!(l=(L=v.next()).done);l=!0){var X=L.value;if(X.reachable){var T=x(X);T<B&&(B=T)}}}catch(I){q=!0,H=I}finally{try{l||null==v.return||v.return()}finally{if(q)throw H;}}l=!0;q=!1;H=void 0;try{for(var y=m[Symbol.iterator](),Q;!(l=(Q=y.next()).done);l=!0){var D=Q.value,C=D[0],M=D[1];if(C.reachable){var K=
28
+ 0===C.nextSegments.length?B<=x(C):B<x(C),R=h(C)*p(C),G=E.has(C.id);m=!0;v=!1;L=void 0;try{for(var u=M[Symbol.iterator](),N;!(m=(N=u.next()).done);m=!0){var n=N.value;G&&a.report({node:n,message:'React Hook "'+a.getSource(n)+'" may be executed more than once. Possibly because it is called in a loop. React Hooks must be called in the exact same order in every component render.'});if(A){if(!G&&R!==F){var V='React Hook "'+a.getSource(n)+'" is called conditionally. React Hooks must be called in the exact same order in every component render.'+
29
+ (K?" Did you accidentally call a React Hook after an early return?":"");a.report({node:n,message:V})}}else if(d.parent&&("MethodDefinition"===d.parent.type||"ClassProperty"===d.parent.type)&&d.parent.value===d){var O='React Hook "'+a.getSource(n)+'" cannot be called in a class component. React Hooks must be called in a React function component or a custom React Hook function.';a.report({node:n,message:O})}else if(k){var S='React Hook "'+a.getSource(n)+'" is called in function "'+(a.getSource(k)+'" that is neither a React function component nor a custom React Hook function.');
30
+ a.report({node:n,message:S})}else if("Program"===d.type){var t='React Hook "'+a.getSource(n)+'" cannot be called at the top level. React Hooks must be called in a React function component or a custom React Hook function.';a.report({node:n,message:t})}else if(r){var P='React Hook "'+a.getSource(n)+'" cannot be called inside a callback. React Hooks must be called in a React function component or a custom React Hook function.';a.report({node:n,message:P})}}}catch(I){v=!0,L=I}finally{try{m||null==u.return||
31
+ u.return()}finally{if(v)throw L;}}}}}catch(I){q=!0,H=I}finally{try{l||null==y.return||y.return()}finally{if(q)throw H;}}}},CallExpression:function(a){if(U(a.callee)){var d=f[f.length-1],h=e[e.length-1],p=d.get(h);p||(p=[],d.set(h,p));p.push(a.callee)}}}}},"exhaustive-deps":{meta:{schema:[{type:"object",additionalProperties:!1,properties:{additionalHooks:{type:"string"}}}]},create:function(a){function f(a,d){return function(f){if(d.has(f))return d.get(f);var e=a(f);d.set(f,e);return e}}function e(e){function m(a){var b=
32
+ !0,c=!1,g=void 0;try{for(var d=a.references[Symbol.iterator](),f;!(b=(f=d.next()).done);b=!0){var h=f.value;if(h.resolved&&H.has(h.resolved.scope)){var k=Z(e,h.identifier),l=ka(k),p=Y(l),q;if(q=B&&"Identifier"===l.type&&"MemberExpression"===l.parent.type&&!l.parent.computed&&"Identifier"===l.parent.property.type&&"current"===l.parent.property.name){for(var n=h.from,t=!1;n.block!==e;)"function"===n.type&&(t=null!=n.block.parent&&"ReturnStatement"===n.block.parent.type),n=n.upper;q=t}q&&T.set(p,{reference:h,
33
+ dependencyNode:l});var r=h.resolved.defs[0];if(null!=r&&(null==r.node||r.node.init!==e.parent)&&"TypeParameter"!==r.type)if(y.has(p))y.get(p).references.push(h);else{var v=h.resolved,w=L(v)||X(v);y.set(p,{isStatic:w,references:[h]})}}}}catch(aa){c=!0,g=aa}finally{try{b||null==d.return||d.return()}finally{if(c)throw g;}}b=!0;c=!1;g=void 0;try{for(var u=a.childScopes[Symbol.iterator](),x;!(b=(x=u.next()).done);b=!0)m(x.value)}catch(aa){c=!0,g=aa}finally{try{b||null==u.return||u.return()}finally{if(c)throw g;
34
+ }}}function F(a,b,c,d){return 0===a.size?null:(1<a.size?"":b+" ")+c+" "+(1<a.size?"dependencies":"dependency")+": "+pa(Array.from(a).sort().map(function(a){return"'"+a+"'"}))+(". Either "+d+" "+(1<a.size?"them":"it")+" or remove the dependency array.")}if(("FunctionExpression"===e.type||"ArrowFunctionExpression"===e.type)&&"CallExpression"===e.parent.type){var k=na(e.parent.callee,h);if(e.parent.arguments[k]===e){var r=e.parent.callee,A=ma(r).name,B=/Effect($|[^a-z])/g.test(A),l=e.parent.arguments[k+
35
+ 1];if(l||B){B&&e.async&&a.report({node:e,message:"Effect callbacks are synchronous to prevent race conditions. Put the async function inside:\n\nuseEffect(() => {\n async function fetchData() {\n // You can await here\n const response = await MyAPI.getData(someId);\n // ...\n }\n fetchData();\n}, [someId]); // Or [] if effect doesn't need props or state\n\nLearn more about data fetching with Hooks: https://fb.me/react-hooks-data-fetching"});var q=a.getScope(),H=new Set,v=null;for(k=q.upper;k;){H.add(k);
36
+ if("function"===k.type)break;k=k.upper}if(k){v=k;var L=f(function(a){if(!Array.isArray(a.defs))return!1;var b=a.defs[0];if(null==b||"VariableDeclarator"!==b.node.type)return!1;var c=b.node.init;if(null==c)return!1;var g=b.node.parent;if(null==g&&(Z(v.block,b.node.id),g=b.node.parent,null==g))return!1;if("const"===g.kind&&"Literal"===c.type&&("string"===typeof c.value||"number"===typeof c.value||null===c.value))return!0;if("CallExpression"!==c.type)return!1;c=c.callee;"MemberExpression"!==c.type||
37
+ "React"!==c.object.name||null==c.property||c.computed||(c=c.property);if("Identifier"!==c.type)return!1;b=b.node.id;c=c.name;if("useRef"===c&&"Identifier"===b.type)return!0;if(("useState"===c||"useReducer"===c)&&"ArrayPattern"===b.type&&2===b.elements.length&&Array.isArray(a.identifiers)){if(b.elements[1]===a.identifiers[0]){if("useState"===c)for(a=a.references,c=0;c<a.length;c++)d.set(a[c].identifier,b.elements[0]);return!0}if(b.elements[0]===a.identifiers[0]&&"useState"===c)for(a=a.references,b=
38
+ 0;b<a.length;b++)w.add(a[b].identifier)}return!1},p),X=f(function(a){if(!Array.isArray(a.defs))return!1;a=a.defs[0];if(null==a||null==a.node||null==a.node.id)return!1;var b=a.node,c=v.childScopes;a=null;var g;for(g=0;g<c.length;g++){var d=c[g],e=d.block;if("FunctionDeclaration"===b.type&&e===b||"VariableDeclarator"===b.type&&e.parent===b){a=d;break}}if(null==a)return!1;for(g=0;g<a.through.length;g++)if(b=a.through[g],null!=b.resolved&&H.has(b.resolved.scope)&&!L(b.resolved))return!1;return!0},x),
39
+ T=new Map,y=new Map;m(q);T.forEach(function(g,b){var c=g.dependencyNode;g=g.reference.resolved.references;for(var d=!1,e=0;e<g.length;e++){var f=g[e].identifier.parent;if(null!=f&&"MemberExpression"===f.type&&!f.computed&&"Identifier"===f.property.type&&"current"===f.property.name&&"AssignmentExpression"===f.parent.type&&f.parent.left===f){d=!0;break}}d||a.report({node:c.parent.property,message:"The ref value '"+b+".current' will likely have changed by the time this effect cleanup function runs. If this ref points to a node rendered by React, copy '"+
40
+ (b+".current' to a variable inside the effect, and use that variable in the cleanup function.")})});var Q=new Set,D=new Set;y.forEach(function(g,b){var c=g.references;g.isStatic&&D.add(b);c.forEach(function(c){c.writeExpr&&(c=c.writeExpr,Q.has(b)||(Q.add(b),a.report({node:c,message:"Assignments to the '"+b+"' variable from inside React Hook "+(a.getSource(r)+" will be lost after each render. To preserve the value over time, store it in a useRef Hook and keep the mutable value in the '.current' property. Otherwise, you can move this variable directly inside ")+
41
+ (a.getSource(r)+".")})))})});if(!(0<Q.size))if(l){var C=[],M=new Set;"ArrayExpression"!==l.type?a.report({node:l,message:"React Hook "+a.getSource(r)+" was passed a dependency list that is not an array literal. This means we can't statically verify whether you've passed the correct dependencies."}):l.elements.forEach(function(g){if(null!==g)if("SpreadElement"===g.type)a.report({node:g,message:"React Hook "+a.getSource(r)+" has a spread element in its dependency array. This means we can't statically verify whether you've passed the correct dependencies."});
42
+ else{try{var b=Y(g)}catch(la){if(/Unsupported node type/.test(la.message)){"Literal"===g.type?y.has(g.value)?a.report({node:g,message:"The "+g.raw+" literal is not a valid dependency because it never changes. Did you mean to include "+(g.value+" in the array instead?")}):a.report({node:g,message:"The "+g.raw+" literal is not a valid dependency because it never changes. You can safely remove it."}):a.report({node:g,message:"React Hook "+a.getSource(r)+" has a complex expression in the dependency array. Extract it to a separate variable so it can be statically checked."});
43
+ return}throw la;}for(var c=g;"MemberExpression"===c.type;)c=c.object;var d=!v.through.some(function(a){return a.identifier===c});C.push({key:b,node:g});d||M.add(b)}});var K=W({dependencies:y,declaredDependencies:C,optionalDependencies:D,externalDependencies:M,isEffect:B}),R=K.suggestedDependencies;k=K.unnecessaryDependencies;var G=K.missingDependencies;K=K.duplicateDependencies;if(0===K.size+G.size+k.size)ia({declaredDependencies:C,declaredDependenciesNode:l,componentScope:v,scope:q}).forEach(function(g){var b=
44
+ g.fn;g=g.suggestUseCallback;var c="The '"+b.name.name+"' function makes the dependencies of "+(A+" Hook (at line "+l.loc.start.line+") change on every render.");c=g?c+(" To fix this, wrap the '"+(b.name.name+"' definition into its own useCallback() Hook.")):c+(" Move it inside the "+A+" callback. Alternatively, wrap the '"+(b.name.name+"' definition into its own useCallback() Hook."));var d;g&&"Variable"===b.type&&(d=[{desc:"Wrap the '"+b.name.name+"' definition into its own useCallback() Hook.",
45
+ fix:function(a){return[a.insertTextBefore(b.node.init,"useCallback("),a.insertTextAfter(b.node.init,")")]}}]);a.report({node:b.node,message:c,suggest:d})});else{!B&&0<G.size&&(R=W({dependencies:y,declaredDependencies:[],optionalDependencies:D,externalDependencies:M,isEffect:B}).suggestedDependencies);(function(){if(0===C.length)return!0;var a=C.map(function(a){return a.key}),b=a.slice().sort();return a.join(",")===b.join(",")})()&&R.sort();var u="";if(0<k.size){var N=null;Array.from(k.keys()).forEach(function(a){null===
46
+ N&&a.endsWith(".current")&&(N=a)});if(null!==N)u=" Mutable values like '"+N+"' aren't valid dependencies because mutating them doesn't re-render the component.";else if(0<M.size){var n=Array.from(M)[0];q.set.has(n)||(u=" Outer scope values like '"+n+"' aren't valid dependencies because mutating them doesn't re-render the component.")}}if(!u&&G.has("props")){q=y.get("props");if(null==q)return;q=q.references;if(!Array.isArray(q))return;n=!0;for(var V=0;V<q.length;V++){var O=Z(v.block,q[V].identifier);
47
+ if(!O){n=!1;break}O=O.parent;if(null==O){n=!1;break}if("MemberExpression"!==O.type){n=!1;break}}n&&(u=" However, 'props' will change when *any* prop changes, so the preferred fix is to destructure the 'props' object outside of the "+(A+" call and refer to those specific props inside ")+(a.getSource(r)+"."))}if(!u&&0<G.size){var S=null;G.forEach(function(a){if(!S){var b=v.set.get(a),c=y.get(a);if(c.references[0].resolved===b&&(b=b.defs[0],null!=b&&null!=b.name&&"Parameter"===b.type)){b=!1;for(var d,
48
+ e=0;e<c.references.length;e++)if(d=c.references[e].identifier,null!=d&&null!=d.parent&&"CallExpression"===d.parent.type&&d.parent.callee===d){b=!0;break}b&&(S=a)}}});null!==S&&(u=" If '"+S+"' changes too often, find the parent component that defines it and wrap that definition in useCallback.")}if(!u&&0<G.size){var t=null;G.forEach(function(a){if(null===t)for(var b=y.get(a).references,c,e,f=0;f<b.length;f++){c=b[f].identifier;for(e=c.parent;null!=e&&e!==v.block;){if("CallExpression"===e.type){var g=
49
+ d.get(e.callee);if(null!=g){g.name===a?t={missingDep:a,setter:e.callee.name,form:"updater"}:w.has(c)?t={missingDep:a,setter:e.callee.name,form:"reducer"}:(c=b[f].resolved,null!=c&&(c=c.defs[0],null!=c&&"Parameter"===c.type&&(t={missingDep:a,setter:e.callee.name,form:"inlineReducer"})));break}}e=e.parent}if(null!==t)break}});if(null!==t)switch(t.form){case "reducer":u=" You can also replace multiple useState variables with useReducer if '"+(t.setter+"' needs the current value of '")+(t.missingDep+
50
+ "'.");break;case "inlineReducer":u=" If '"+t.setter+"' needs the current value of '"+(t.missingDep+"', you can also switch to useReducer instead of useState and read '")+(t.missingDep+"' in the reducer.");break;case "updater":u=" You can also do a functional update '"+t.setter+"("+t.missingDep.substring(0,1)+" => ...)' if you only need '"+t.missingDep+"' in the '"+(t.setter+"' call.");break;default:throw Error("Unknown case.");}}a.report({node:l,message:"React Hook "+a.getSource(r)+" has "+(F(G,"a",
51
+ "missing","include")||F(k,"an","unnecessary","exclude")||F(K,"a","duplicate","omit"))+u,suggest:[{desc:"Update the dependencies array to be: ["+R.join(", ")+"]",fix:function(a){return a.replaceText(l,"["+R.join(", ")+"]")}}]})}}else{var P=null;y.forEach(function(a,b){P||a.references.forEach(function(a){if(!P&&d.has(a.identifier)){for(a=a.from;"function"!==a.type;)a=a.upper;a.block===e&&(P=b)}})});if(P){var I=W({dependencies:y,declaredDependencies:[],optionalDependencies:D,externalDependencies:new Set,
52
+ isEffect:!0}).suggestedDependencies;a.report({node:e.parent.callee,message:"React Hook "+A+" contains a call to '"+P+"'. Without a list of dependencies, this can lead to an infinite chain of updates. To fix this, pass ["+I.join(", ")+("] as a second argument to the "+A+" Hook."),suggest:[{desc:"Add dependencies array: ["+I.join(", ")+"]",fix:function(a){return a.insertTextAfter(e,", ["+I.join(", ")+"]")}}]})}}}}else"useMemo"!==A&&"useCallback"!==A||a.report({node:e.parent.callee,message:"React Hook "+
53
+ A+" does nothing when called with only one argument. Did you forget to pass an array of dependencies?"})}}}var h={additionalHooks:a.options&&a.options[0]&&a.options[0].additionalHooks?new RegExp(a.options[0].additionalHooks):void 0},d=new WeakMap,w=new WeakSet,p=new WeakMap,x=new WeakMap;return{FunctionExpression:e,ArrowFunctionExpression:e}}}};
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "eslint-plugin-react-hooks",
3
3
  "description": "ESLint rules for React Hooks",
4
- "version": "2.5.1",
4
+ "version": "3.0.0",
5
5
  "repository": {
6
6
  "type": "git",
7
7
  "url": "https://github.com/facebook/react.git",
package/build-info.json DELETED
@@ -1,8 +0,0 @@
1
- {
2
- "branch": "pull/18344",
3
- "buildNumber": "106499",
4
- "checksum": "7fe5a2e",
5
- "commit": "da834083c",
6
- "environment": "ci",
7
- "reactVersion": "16.12.0-da834083c"
8
- }