New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

eslint-plugin-react-hooks

Package Overview
Dependencies
Maintainers
6
Versions
2062
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

eslint-plugin-react-hooks - npm Package Compare versions

Comparing version 0.0.0-experimental-2c169a568 to 0.0.0-experimental-3310209d0

10

build-info.json
{
"branch": "pull/17418",
"buildNumber": "61636",
"checksum": "aa9f6e5",
"commit": "2c169a568",
"branch": "pull/20486",
"buildNumber": "247511",
"checksum": "372369a",
"commit": "3310209d0",
"environment": "ci",
"reactVersion": "16.12.0-experimental-2c169a568"
"reactVersion": "17.0.2-experimental-3310209d0"
}

@@ -1,2 +0,2 @@

/** @license React v0.0.0-experimental-2c169a568
/** @license React v0.0.0-experimental-3310209d0
* eslint-plugin-react-hooks.production.min.js

@@ -9,45 +9,54 @@ *

*/
'use strict';function S(a){return"Identifier"===a.type?/^use[A-Z0-9].*$/.test(a.name):"MemberExpression"===a.type&&!a.computed&&S(a.property)?(a=a.object,"Identifier"===a.type&&"React"===a.name):!1}function aa(a){return"Identifier"===a.type?!/^[a-z]/.test(a.name):!1}function ba(a,e){return a.name===e||"MemberExpression"===a.type&&"React"===a.object.name&&a.property.name===e}function ca(a){return!!(a.parent&&a.parent.callee&&ba(a.parent.callee,"forwardRef"))}
function da(a){return!!(a.parent&&a.parent.callee&&ba(a.parent.callee,"memo"))}function ea(a){for(;a;){var e=fa(a);if(e&&(aa(e)||S(e))||ca(a)||da(a))return!0;a=a.parent}return!1}
function fa(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:
'use strict';function ca(a,c){if(a){if("string"===typeof a)return da(a,c);var b=Object.prototype.toString.call(a).slice(8,-1);"Object"===b&&a.constructor&&(b=a.constructor.name);if("Map"===b||"Set"===b)return Array.from(a);if("Arguments"===b||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(b))return da(a,c)}}function da(a,c){if(null==c||c>a.length)c=a.length;for(var b=0,d=Array(c);b<c;b++)d[b]=a[b];return d}
function C(a,c){var b;if("undefined"===typeof Symbol||null==a[Symbol.iterator]){if(Array.isArray(a)||(b=ca(a))||c&&a&&"number"===typeof a.length){b&&(a=b);var d=0;c=function(){};return{s:c,n:function(){return d>=a.length?{done:!0}:{done:!1,value:a[d++]}},e:function(a){throw a;},f:c}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");}var e=!0,n=!1,h;return{s:function(){b=a[Symbol.iterator]()},
n:function(){var a=b.next();e=a.done;return a},e:function(a){n=!0;h=a},f:function(){try{e||null==b.return||b.return()}finally{if(n)throw h;}}}}function H(a){if("Identifier"===a.type)return/^use[A-Z0-9].*$/.test(a.name);if("MemberExpression"===a.type&&!a.computed&&H(a.property)){a=a.object;var c=/^[A-Z].*/;return"Identifier"===a.type&&c.test(a.name)}return!1}function ea(a){return"Identifier"===a.type?!/^[a-z]/.test(a.name):!1}
function fa(a,c){return a.name===c||"MemberExpression"===a.type&&"React"===a.object.name&&a.property.name===c}function ha(a){return!!(a.parent&&a.parent.callee&&fa(a.parent.callee,"forwardRef"))}function ia(a){return!!(a.parent&&a.parent.callee&&fa(a.parent.callee,"memo"))}function ma(a){for(;a;){var c=na(a);if(c&&(ea(c)||H(c))||ha(a)||ia(a))return!0;a=a.parent}return!1}
function na(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:
a.parent.key}
function V(a){function e(){return{isRequired:!1,isSatisfiedRecursively:!1,hasRequiredNodesBelow:!1,children:new Map}}function d(a,c){c=c.split(".");var m=!0,k=!1,d=void 0;try{for(var h=c[Symbol.iterator](),p;!(m=(p=h.next()).done);m=!0){var z=p.value,g=a.children.get(z);g||(g=e(),a.children.set(z,g));a=g}}catch(E){k=!0,d=E}finally{try{m||null==h.return||h.return()}finally{if(k)throw d;}}return a}function h(a,c,e){c=c.split(".");var m=!0,k=!1,d=void 0;try{for(var h=c[Symbol.iterator](),g;!(m=(g=h.next()).done);m=
!0){var z=a.children.get(g.value);if(!z)break;e(z);a=z}}catch(E){k=!0,d=E}finally{try{m||null==h.return||h.return()}finally{if(k)throw d;}}}function c(a,e,k,h){a.children.forEach(function(a,m){var d=h(m);a.isSatisfiedRecursively?a.hasRequiredNodesBelow&&k.add(d):a.isRequired?e.add(d):c(a,e,k,function(a){return d+"."+a})})}var z=a.dependencies,l=a.declaredDependencies,v=a.optionalDependencies,k=a.externalDependencies,C=a.isEffect,F=e();z.forEach(function(a,c){d(F,c).isRequired=!0;h(F,c,function(a){a.hasRequiredNodesBelow=
!0})});l.forEach(function(a){d(F,a.key).isSatisfiedRecursively=!0});v.forEach(function(a){d(F,a).isSatisfiedRecursively=!0});a=new Set;var g=new Set;c(F,a,g,function(a){return a});var u=[],x=new Set,A=new Set;l.forEach(function(a){a=a.key;g.has(a)?-1===u.indexOf(a)?u.push(a):A.add(a):!C||a.endsWith(".current")||k.has(a)?x.add(a):-1===u.indexOf(a)&&u.push(a)});a.forEach(function(a){u.push(a)});return{suggestedDependencies:u,unnecessaryDependencies:x,duplicateDependencies:A,missingDependencies:a}}
function ha(a){var e=a.declaredDependenciesNode,d=a.componentScope,h=a.scope;return a.declaredDependencies.map(function(a){a=d.set.get(a.key);if(null==a)return null;var c=a.defs[0];return null==c?null:"Variable"===c.type&&"VariableDeclarator"===c.node.type&&null!=c.node.init&&("ArrowFunctionExpression"===c.node.init.type||"FunctionExpression"===c.node.init.type)||"FunctionName"===c.type&&"FunctionDeclaration"===c.node.type?a:null}).filter(Boolean).map(function(a){var c=a.defs[0];a:{for(var d=!1,v=
0;v<a.references.length;v++){var k=a.references[v];if(k.writeExpr)if(d){a=!0;break a}else{d=!0;continue}for(var C=k.from;C!==h&&null!=C;)C=C.upper;if(C!==h&&!ia(e,k.identifier)){a=!0;break a}}a=!1}return{fn:c,suggestUseCallback:a}})}function ja(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:ja(a.parent)}
function X(a){if("Identifier"===a.type)return a.name;if("MemberExpression"!==a.type||a.computed)throw Error("Unsupported node type: "+a.type);var e=X(a.object);a=X(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}
function na(a,e){var d=ma(a);if("Identifier"!==d.type)return null;switch(d.name){case "useEffect":case "useLayoutEffect":case "useCallback":case "useMemo":return 0;case "useImperativeHandle":return 1;default:if(d===a&&e&&e.additionalHooks){try{var h=X(d)}catch(c){if(/Unsupported node type/.test(c.message))return 0;throw c;}return e.additionalHooks.test(h)?0:-1}return-1}}
function Y(a,e){for(var d=[a],h=null;d.length;){h=d.shift();if("Identifier"===h.type&&h.name===e.name&&h.range[0]===e.range[0]&&h.range[1]===e.range[1])return h;if(ia(h,e)){a=0;for(var c=Object.entries(h);a<c.length;a++){var z=c[a],l=z[1];"parent"!==z[0]&&(oa(l)?(l.parent=h,d.push(l)):Array.isArray(l)&&l.forEach(function(a){oa(a)&&(a.parent=h,d.push(a))}))}}}return null}
function pa(a){for(var e="",d=0;d<a.length;d++)e+=a[d],0===d&&2===a.length?e+=" and ":d===a.length-2&&2<a.length?e+=", and ":d<a.length-1&&(e+=", ");return e}function oa(a){return"object"===typeof a&&null!==a&&!Array.isArray(a)&&"string"===typeof a.type}function ia(a,e){return a.range[0]<=e.range[0]&&a.range[1]>=e.range[1]}
module.exports={rules:{"rules-of-hooks":{create:function(a){var e=[],d=[];return{onCodePathSegmentStart:function(a){return d.push(a)},onCodePathSegmentEnd:function(){return d.pop()},onCodePathStart:function(){return e.push(new Map)},onCodePathEnd:function(d,c){function h(a){var c=h.cache,b=c.get(a.id);if(null===b){if(!C.has(a.id)){C.add(a.id);c=!0;b=!1;var n=void 0;try{for(var f=a.prevSegments[Symbol.iterator](),B;!(c=(B=f.next()).done);c=!0)h(B.value)}catch(L){b=!0,n=L}finally{try{c||null==f.return||
f.return()}finally{if(b)throw n;}}}return 0}if(void 0!==b)return b;c.set(a.id,null);if(d.thrownSegments.includes(a))b=0;else if(0===a.prevSegments.length)b=1;else{b=0;f=!0;B=!1;var e=void 0;try{n=a.prevSegments[Symbol.iterator]();for(var k;!(f=(k=n.next()).done);f=!0)b+=h(k.value)}catch(L){B=!0,e=L}finally{try{f||null==n.return||n.return()}finally{if(B)throw e;}}}a.reachable&&0===b?c.delete(a.id):c.set(a.id,b);return b}function l(a){var c=l.cache,b=c.get(a.id);if(null===b){if(!C.has(a.id)){C.add(a.id);
c=!0;b=!1;var n=void 0;try{for(var f=a.nextSegments[Symbol.iterator](),B;!(c=(B=f.next()).done);c=!0)l(B.value)}catch(L){b=!0,n=L}finally{try{c||null==f.return||f.return()}finally{if(b)throw n;}}}return 0}if(void 0!==b)return b;c.set(a.id,null);if(d.thrownSegments.includes(a))b=0;else if(0===a.nextSegments.length)b=1;else{b=0;f=!0;B=!1;var e=void 0;try{n=a.nextSegments[Symbol.iterator]();for(var k;!(f=(k=n.next()).done);f=!0)b+=l(k.value)}catch(L){B=!0,e=L}finally{try{f||null==n.return||n.return()}finally{if(B)throw e;
}}}c.set(a.id,b);return b}function v(a){var c=v.cache,b=c.get(a.id);if(null===b)return Infinity;if(void 0!==b)return b;c.set(a.id,null);if(0===a.prevSegments.length)b=1;else{b=Infinity;var n=!0,f=!1,B=void 0;try{for(var e=a.prevSegments[Symbol.iterator](),d;!(n=(d=e.next()).done);n=!0){var k=v(d.value);k<b&&(b=k)}}catch(qa){f=!0,B=qa}finally{try{n||null==e.return||e.return()}finally{if(f)throw B;}}b+=1}c.set(a.id,b);return b}var k=e.pop();if(0!==k.size){var C=new Set;h.cache=new Map;l.cache=new Map;
v.cache=new Map;var F=l(d.initialSegment),g=fa(c),u=ea(c),x=g?aa(g)||S(g):ca(c)||da(c),A=Infinity,m=!0,p=!1,I=void 0;try{for(var t=d.finalSegments[Symbol.iterator](),K;!(m=(K=t.next()).done);m=!0){var W=K.value;if(W.reachable){var R=v(W);R<A&&(A=R)}}}catch(G){p=!0,I=G}finally{try{m||null==t.return||t.return()}finally{if(p)throw I;}}m=!0;p=!1;I=void 0;try{for(var y=k[Symbol.iterator](),P;!(m=(P=y.next()).done);m=!0){var E=P.value,D=E[0],M=E[1];if(D.reachable){var J=0===D.nextSegments.length?A<=v(D):
A<v(D),T=h(D)*l(D),H=C.has(D.id);k=!0;t=!1;K=void 0;try{for(var w=M[Symbol.iterator](),N;!(k=(N=w.next()).done);k=!0){var r=N.value;H&&a.report({node:r,message:'React Hook "'+a.getSource(r)+'" 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(x){if(!H&&T!==F){var U='React Hook "'+a.getSource(r)+'" is called conditionally. React Hooks must be called in the exact same order in every component render.'+
(J?" Did you accidentally call a React Hook after an early return?":"");a.report({node:r,message:U})}}else if(!c.parent||"MethodDefinition"!==c.parent.type&&"ClassProperty"!==c.parent.type||c.parent.value!==c)if(g){var O='React Hook "'+a.getSource(r)+'" is called in '+('function "'+a.getSource(g)+'" ')+"that is neither a React function component nor a custom React Hook function.";a.report({node:r,message:O})}else if("Program"===c.type){var Q='React Hook "'+a.getSource(r)+'" 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:r,message:Q})}else if(u){var q='React Hook "'+a.getSource(r)+'" 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:r,message:q})}}}catch(G){t=!0,K=G}finally{try{k||null==w.return||w.return()}finally{if(t)throw K;}}}}}catch(G){p=!0,I=G}finally{try{m||null==y.return||y.return()}finally{if(p)throw I;}}}},CallExpression:function(a){if(S(a.callee)){var c=e[e.length-1],h=d[d.length-1],l=c.get(h);l||
(l=[],c.set(h,l));l.push(a.callee)}}}}},"exhaustive-deps":{meta:{fixable:"code",schema:[{type:"object",additionalProperties:!1,properties:{additionalHooks:{type:"string"}}}]},create:function(a){function e(a,c){return function(e){if(c.has(e))return c.get(e);var d=a(e);c.set(e,d);return d}}function d(d){function k(a){var b=!0,f=!1,c=void 0;try{for(var e=a.references[Symbol.iterator](),h;!(b=(h=e.next()).done);b=!0){var g=h.value;if(g.resolved&&I.has(g.resolved.scope)){var m=Y(d,g.identifier),l=ja(m),
p=X(l),r;if(r=A&&"Identifier"===l.type&&"MemberExpression"===l.parent.type&&!l.parent.computed&&"Identifier"===l.parent.property.type&&"current"===l.parent.property.name){for(var q=g.from,u=!1;q.block!==d;)"function"===q.type&&(u=null!=q.block.parent&&"ReturnStatement"===q.block.parent.type),q=q.upper;r=u}r&&R.set(p,{reference:g,dependencyNode:l});var t=g.resolved.defs[0];if(null!=t&&(null==t.node||t.node.init!==d.parent)&&"TypeParameter"!==t.type)if(y.has(p))y.get(p).references.push(g);else{var w=
g.resolved,z=K(w)||W(w);y.set(p,{isStatic:z,references:[g]})}}}}catch(Z){f=!0,c=Z}finally{try{b||null==e.return||e.return()}finally{if(f)throw c;}}b=!0;f=!1;c=void 0;try{for(var v=a.childScopes[Symbol.iterator](),x;!(b=(x=v.next()).done);b=!0)k(x.value)}catch(Z){f=!0,c=Z}finally{try{b||null==v.return||v.return()}finally{if(f)throw c;}}}function F(a,n,f,c){return 0===a.size?null:(1<a.size?"":n+" ")+f+" "+(1<a.size?"dependencies":"dependency")+": "+pa(Array.from(a).sort().map(function(a){return"'"+
a+"'"}))+(". Either "+c+" "+(1<a.size?"them":"it")+" or remove the dependency array.")}if(("FunctionExpression"===d.type||"ArrowFunctionExpression"===d.type)&&"CallExpression"===d.parent.type){var g=na(d.parent.callee,h);if(d.parent.arguments[g]===d){var u=d.parent.callee,x=ma(u).name,A=x.endsWith("Effect"),m=d.parent.arguments[g+1];if(m||A){A&&d.async&&a.report({node:d,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 p=a.getScope(),I=new Set,t=null;for(g=p.upper;g;){I.add(g);if("function"===g.type)break;g=g.upper}if(g){t=g;var K=e(function(a){if(!Array.isArray(a.defs))return!1;var b=a.defs[0];if(null==b||"VariableDeclarator"!==b.node.type)return!1;var f=b.node.init;if(null==f)return!1;var d=b.node.parent;if(null==d&&(Y(t.block,b.node.id),d=b.node.parent,null==d))return!1;if("const"===d.kind&&"Literal"===f.type&&("string"===typeof f.value||"number"===typeof f.value||null===f.value))return!0;if("CallExpression"!==
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;b=b.node.id;f=f.name;if("useRef"===f&&"Identifier"===b.type)return!0;if(("useState"===f||"useReducer"===f)&&"ArrayPattern"===b.type&&2===b.elements.length&&Array.isArray(a.identifiers)){if(b.elements[1]===a.identifiers[0]){if("useState"===f)for(a=a.references,f=0;f<a.length;f++)c.set(a[f].identifier,b.elements[0]);return!0}if(b.elements[0]===
a.identifiers[0]&&"useState"===f)for(a=a.references,b=0;b<a.length;b++)z.add(a[b].identifier)}return!1},l),W=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 b=a.node,f=t.childScopes;a=null;var c;for(c=0;c<f.length;c++){var d=f[c],e=d.block;if("FunctionDeclaration"===b.type&&e===b||"VariableDeclarator"===b.type&&e.parent===b){a=d;break}}if(null==a)return!1;for(c=0;c<a.through.length;c++)if(b=a.through[c],null!=b.resolved&&I.has(b.resolved.scope)&&
!K(b.resolved))return!1;return!0},v),R=new Map,y=new Map;k(p);R.forEach(function(b,c){var f=b.dependencyNode;b=b.reference.resolved.references;for(var d=!1,e=0;e<b.length;e++){var n=b[e].identifier.parent;if(null!=n&&"MemberExpression"===n.type&&!n.computed&&"Identifier"===n.property.type&&"current"===n.property.name&&"AssignmentExpression"===n.parent.type&&n.parent.left===n){d=!0;break}}d||a.report({node:f.parent.property,message:"The ref value '"+c+".current' will likely have changed by the time this effect cleanup function runs. If this ref points to a node rendered by React, copy "+
("'"+c+".current' to a variable inside the effect, and ")+"use that variable in the cleanup function."})});var P=new Set,E=new Set;y.forEach(function(b,c){var f=b.references;b.isStatic&&E.add(c);f.forEach(function(b){b.writeExpr&&(b=b.writeExpr,P.has(c)||(P.add(c),a.report({node:b,message:"Assignments to the '"+c+"' variable from inside React Hook "+(a.getSource(u)+" 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 "+
(a.getSource(u)+".")})))})});if(!(0<P.size))if(m){var D=[],M=new Set;"ArrayExpression"!==m.type?a.report({node:m,message:"React Hook "+a.getSource(u)+" 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."}):m.elements.forEach(function(b){if(null!==b)if("SpreadElement"===b.type)a.report({node:b,message:"React Hook "+a.getSource(u)+" has a spread element in its dependency array. This means we can't statically verify whether you've passed the correct dependencies."});
else{try{var c=X(b)}catch(la){if(/Unsupported node type/.test(la.message)){"Literal"===b.type?y.has(b.value)?a.report({node:b,message:"The "+b.raw+" literal is not a valid dependency because it never changes. "+("Did you mean to include "+b.value+" in the array instead?")}):a.report({node:b,message:"The "+b.raw+" literal is not a valid dependency because it never changes. You can safely remove it."}):a.report({node:b,message:"React Hook "+a.getSource(u)+" has a complex expression in the dependency array. Extract it to a separate variable so it can be statically checked."});
return}throw la;}for(var f=b;"MemberExpression"===f.type;)f=f.object;var d=!t.through.some(function(a){return a.identifier===f});D.push({key:c,node:b});d||M.add(c)}});var J=V({dependencies:y,declaredDependencies:D,optionalDependencies:E,externalDependencies:M,isEffect:A}),T=J.suggestedDependencies;g=J.unnecessaryDependencies;var H=J.missingDependencies;J=J.duplicateDependencies;if(0===J.size+H.size+g.size)ha({declaredDependencies:D,declaredDependenciesNode:m,componentScope:t,scope:p}).forEach(function(b){var c=
b.fn,f=b.suggestUseCallback;b="The '"+c.name.name+"' function makes the dependencies of "+(x+" Hook (at line "+m.loc.start.line+") ")+"change on every render.";b=f?b+(" To fix this, "+("wrap the '"+c.name.name+"' definition into its own useCallback() Hook.")):b+(" Move it inside the "+x+" callback. "+("Alternatively, wrap the '"+c.name.name+"' definition into its own useCallback() Hook."));a.report({node:c.node,message:b,fix:function(a){if(f&&"Variable"===c.type)return[a.insertTextBefore(c.node.init,
"useCallback("),a.insertTextAfter(c.node.init,")")]}})});else{!A&&0<H.size&&(T=V({dependencies:y,declaredDependencies:[],optionalDependencies:E,externalDependencies:M,isEffect:A}).suggestedDependencies);(function(){if(0===D.length)return!0;var a=D.map(function(a){return a.key}),c=a.slice().sort();return a.join(",")===c.join(",")})()&&T.sort();var w="";if(0<g.size){var N=null;Array.from(g.keys()).forEach(function(a){null===N&&a.endsWith(".current")&&(N=a)});if(null!==N)w=" Mutable values like '"+N+
"' aren't valid dependencies because mutating them doesn't re-render the component.";else if(0<M.size){var r=Array.from(M)[0];p.set.has(r)||(w=" Outer scope values like '"+r+"' aren't valid dependencies because mutating them doesn't re-render the component.")}}if(!w&&H.has("props")){p=y.get("props");if(null==p)return;p=p.references;if(!Array.isArray(p))return;r=!0;for(var U=0;U<p.length;U++){var O=Y(t.block,p[U].identifier);if(!O){r=!1;break}O=O.parent;if(null==O){r=!1;break}if("MemberExpression"!==
O.type){r=!1;break}}r&&(w=" However, 'props' will change when *any* prop changes, so the preferred fix is to destructure the 'props' object outside of "+("the "+x+" call and refer to those specific props ")+("inside "+a.getSource(u)+"."))}if(!w&&0<H.size){var Q=null;H.forEach(function(a){if(!Q){var b=t.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,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&&(Q=a)}}});null!==Q&&(w=" If '"+Q+"' changes too often, find the parent component that defines it and wrap that definition in useCallback.")}if(!w&&0<H.size){var q=null;H.forEach(function(a){if(null===q)for(var b=y.get(a).references,d,e,g=0;g<b.length;g++){d=b[g].identifier;for(e=d.parent;null!=e&&e!==t.block;){if("CallExpression"===e.type){var h=c.get(e.callee);if(null!=h){h.name===a?q={missingDep:a,setter:e.callee.name,
form:"updater"}:z.has(d)?q={missingDep:a,setter:e.callee.name,form:"reducer"}:(d=b[g].resolved,null!=d&&(d=d.defs[0],null!=d&&"Parameter"===d.type&&(q={missingDep:a,setter:e.callee.name,form:"inlineReducer"})));break}}e=e.parent}if(null!==q)break}});if(null!==q)switch(q.form){case "reducer":w=" You can also replace multiple useState variables with useReducer "+("if '"+q.setter+"' needs the ")+("current value of '"+q.missingDep+"'.");break;case "inlineReducer":w=" If '"+q.setter+"' needs the "+("current value of '"+
q.missingDep+"', ")+"you can also switch to useReducer instead of useState and "+("read '"+q.missingDep+"' in the reducer.");break;case "updater":w=" You can also do a functional update '"+q.setter+"("+q.missingDep.substring(0,1)+" => ...)' if you only need '"+q.missingDep+"'"+(" in the '"+q.setter+"' call.");break;default:throw Error("Unknown case.");}}a.report({node:m,message:"React Hook "+a.getSource(u)+" has "+(F(H,"a","missing","include")||F(g,"an","unnecessary","exclude")||F(J,"a","duplicate",
"omit"))+w,fix:function(a){return a.replaceText(m,"["+T.join(", ")+"]")}})}}else{var G=null;y.forEach(function(a,e){G||a.references.forEach(function(a){if(!G&&c.has(a.identifier)){for(a=a.from;"function"!==a.type;)a=a.upper;a.block===d&&(G=e)}})});if(G){var ka=V({dependencies:y,declaredDependencies:[],optionalDependencies:E,externalDependencies:new Set,isEffect:!0}).suggestedDependencies;a.report({node:d.parent.callee,message:"React Hook "+x+" contains a call to '"+G+"'. Without a list of dependencies, this can lead to an infinite chain of updates. To fix this, pass ["+
ka.join(", ")+("] as a second argument to the "+x+" Hook."),fix:function(a){return a.insertTextAfter(d,", ["+ka.join(", ")+"]")}})}}}}else"useMemo"!==x&&"useCallback"!==x||a.report({node:d.parent.callee,message:"React Hook "+x+" 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},c=new WeakMap,z=new WeakSet,l=new WeakMap,v=
new WeakMap;return{FunctionExpression:d,ArrowFunctionExpression:d}}}}};
function I(a){function c(){return{isUsed:!1,isSatisfiedRecursively:!1,isSubtreeUsed:!1,children:new Map}}function b(a,b){b=b.split(".");b=C(b);var l;try{for(b.s();!(l=b.n()).done;){var d=l.value,e=a.children.get(d);e||(e=c(),a.children.set(d,e));a=e}}catch(F){b.e(F)}finally{b.f()}return a}function d(a,c,b){c=c.split(".");c=C(c);var d;try{for(c.s();!(d=c.n()).done;){var e=a.children.get(d.value);if(!e)break;b(e);a=e}}catch(F){c.e(F)}finally{c.f()}}function e(a,c,b,d){a.children.forEach(function(a,l){var f=
d(l);a.isSatisfiedRecursively?a.isSubtreeUsed&&b.add(f):a.isUsed?c.add(f):e(a,c,b,function(a){return f+"."+a})})}var n=a.dependencies,h=a.declaredDependencies,x=a.stableDependencies,k=a.externalDependencies,D=a.isEffect,y=c();n.forEach(function(a,c){b(y,c).isUsed=!0;d(y,c,function(a){a.isSubtreeUsed=!0})});h.forEach(function(a){b(y,a.key).isSatisfiedRecursively=!0});x.forEach(function(a){b(y,a).isSatisfiedRecursively=!0});a=new Set;var g=new Set;e(y,a,g,function(a){return a});var f=[],u=new Set,q=
new Set;h.forEach(function(a){a=a.key;g.has(a)?-1===f.indexOf(a)?f.push(a):q.add(a):!D||a.endsWith(".current")||k.has(a)?u.add(a):-1===f.indexOf(a)&&f.push(a)});a.forEach(function(a){f.push(a)});return{suggestedDependencies:f,unnecessaryDependencies:u,duplicateDependencies:q,missingDependencies:a}}
function R(a){switch(a.type){case "ObjectExpression":return"object";case "ArrayExpression":return"array";case "ArrowFunctionExpression":case "FunctionExpression":return"function";case "ClassExpression":return"class";case "ConditionalExpression":if(null!=R(a.consequent)||null!=R(a.alternate))return"conditional";break;case "LogicalExpression":if(null!=R(a.left)||null!=R(a.right))return"logical expression";break;case "JSXFragment":return"JSX fragment";case "JSXElement":return"JSX element";case "AssignmentExpression":if(null!=
R(a.right))return"assignment expression";break;case "NewExpression":return"object construction";case "Literal":if(a.value instanceof RegExp)return"regular expression";break;case "TypeCastExpression":return R(a.expression);case "TSAsExpression":return R(a.expression)}return null}
function oa(a){var c=a.declaredDependenciesNode,b=a.componentScope,d=a.scope;return a.declaredDependencies.map(function(a){var c=a.key;a=b.variables.find(function(a){return a.name===c});if(null==a)return null;var d=a.defs[0];if(null==d)return null;if("Variable"===d.type&&"VariableDeclarator"===d.node.type&&"Identifier"===d.node.id.type&&null!=d.node.init){var e=R(d.node.init);if(null!=e)return[a,e]}return"FunctionName"===d.type&&"FunctionDeclaration"===d.node.type?[a,"function"]:"ClassName"===d.type&&
"ClassDeclaration"===d.node.type?[a,"class"]:null}).filter(Boolean).map(function(a){var b=a[0];a=a[1];var e=b.defs[0];a:{for(var x=!1,k=0;k<b.references.length;k++){var D=b.references[k];if(D.writeExpr)if(x){b=!0;break a}else{x=!0;continue}for(var y=D.from;y!==d&&null!=y;)y=y.upper;if(y!==d&&!pa(c,D.identifier)){b=!0;break a}}b=!1}return{construction:e,depType:a,isUsedOutsideOfHook:b}})}
function ra(a){return"MemberExpression"!==a.parent.type&&"OptionalMemberExpression"!==a.parent.type||a.parent.object!==a||"current"===a.parent.property.name||a.parent.computed||null!=a.parent.parent&&("CallExpression"===a.parent.parent.type||"OptionalCallExpression"===a.parent.parent.type)&&a.parent.parent.callee===a.parent?"MemberExpression"===a.type&&a.parent&&"AssignmentExpression"===a.parent.type&&a.parent.left===a?a.object:a:ra(a.parent)}
function V(a,c,b){c&&(a.optional?c.has(b)||c.set(b,!0):c.set(b,!1))}
function W(a,c){if("Identifier"===a.type||"JSXIdentifier"===a.type)return a=a.name,c&&c.set(a,!1),a;if("MemberExpression"!==a.type||a.computed){if("OptionalMemberExpression"!==a.type||a.computed){if("ChainExpression"!==a.type||a.computed)throw Error("Unsupported node type: "+a.type);a=a.expression;var b=W(a.object,c),d=W(a.property,null);b=b+"."+d;V(a,c,b);return b}b=W(a.object,c);d=W(a.property,null);b=b+"."+d;V(a,c,b);return b}b=W(a.object,c);d=W(a.property,null);b=b+"."+d;V(a,c,b);return b}
function sa(a){return"MemberExpression"!==a.type||"Identifier"!==a.object.type||"React"!==a.object.name||"Identifier"!==a.property.type||a.computed?a:a.property}
function ta(a,c){var b=sa(a);if("Identifier"!==b.type)return-1;switch(b.name){case "useEffect":case "useLayoutEffect":case "useCallback":case "useMemo":return 0;case "useImperativeHandle":return 1;default:if(b===a&&c&&c.additionalHooks){try{var d=W(b,null)}catch(e){if(/Unsupported node type/.test(e.message))return 0;throw e;}return c.additionalHooks.test(d)?0:-1}return-1}}
function X(a,c){for(var b=[a],d=null;b.length;){d=b.shift();if(("Identifier"===d.type||"JSXIdentifier"===d.type)&&d.type===c.type&&d.name===c.name&&d.range[0]===c.range[0]&&d.range[1]===c.range[1])return d;if(pa(d,c)){a=0;for(var e=Object.entries(d);a<e.length;a++){var n=e[a],h=n[1];"parent"!==n[0]&&(ua(h)?(h.parent=d,b.push(h)):Array.isArray(h)&&h.forEach(function(a){ua(a)&&(a.parent=d,b.push(a))}))}}}return null}
function va(a){for(var c="",b=0;b<a.length;b++)c+=a[b],0===b&&2===a.length?c+=" and ":b===a.length-2&&2<a.length?c+=", and ":b<a.length-1&&(c+=", ");return c}function ua(a){return"object"===typeof a&&null!==a&&!Array.isArray(a)&&"string"===typeof a.type}function pa(a,c){return a.range[0]<=c.range[0]&&a.range[1]>=c.range[1]}exports.configs={recommended:{plugins:["react-hooks"],rules:{"react-hooks/rules-of-hooks":"error","react-hooks/exhaustive-deps":"warn"}}};
exports.rules={"rules-of-hooks":{meta:{type:"problem",docs:{description:"enforces the Rules of Hooks",category:"Possible Errors",recommended:!0,url:"https://reactjs.org/docs/hooks-rules.html"}},create:function(a){var c=[],b=[];return{onCodePathSegmentStart:function(a){return b.push(a)},onCodePathSegmentEnd:function(){return b.pop()},onCodePathStart:function(){return c.push(new Map)},onCodePathEnd:function(b,e){function d(a,c){var f=d.cache,e=f.get(a.id);c=new Set(c);if(c.has(a.id)){f=[].concat(c);
a=f.slice(f.indexOf(a.id)+1);a=C(a);var g;try{for(a.s();!(g=a.n()).done;)D.add(g.value)}catch(B){a.e(B)}finally{a.f()}return 0}c.add(a.id);if(void 0!==e)return e;if(b.thrownSegments.includes(a))e=0;else if(0===a.prevSegments.length)e=1;else{e=0;g=C(a.prevSegments);var E;try{for(g.s();!(E=g.n()).done;)e+=d(E.value,c)}catch(B){g.e(B)}finally{g.f()}}a.reachable&&0===e?f.delete(a.id):f.set(a.id,e);return e}function h(a,c){var d=h.cache,e=d.get(a.id);c=new Set(c);if(c.has(a.id)){d=Array.from(c);a=d.slice(d.indexOf(a.id)+
1);a=C(a);var f;try{for(a.s();!(f=a.n()).done;)D.add(f.value)}catch(B){a.e(B)}finally{a.f()}return 0}c.add(a.id);if(void 0!==e)return e;if(b.thrownSegments.includes(a))e=0;else if(0===a.nextSegments.length)e=1;else{e=0;f=C(a.nextSegments);var g;try{for(f.s();!(g=f.n()).done;)e+=h(g.value,c)}catch(B){f.e(B)}finally{f.f()}}d.set(a.id,e);return e}function x(a){var c=x.cache,b=c.get(a.id);if(null===b)return Infinity;if(void 0!==b)return b;c.set(a.id,null);if(0===a.prevSegments.length)b=1;else{b=Infinity;
var d=C(a.prevSegments),e;try{for(d.s();!(e=d.n()).done;){var f=x(e.value);f<b&&(b=f)}}catch(B){d.e(B)}finally{d.f()}b+=1}c.set(a.id,b);return b}var k=c.pop();if(0!==k.size){var D=new Set;d.cache=new Map;h.cache=new Map;x.cache=new Map;var y=h(b.initialSegment),g=na(e),f=ma(e),u=g?ea(g)||H(g):ha(e)||ia(e),q=Infinity,l=C(b.finalSegments),ja;try{for(l.s();!(ja=l.n()).done;){var ka=ja.value;if(ka.reachable){var la=x(ka);la<q&&(q=la)}}}catch(E){l.e(E)}finally{l.f()}k=C(k);var z;try{for(k.s();!(z=k.n()).done;){var F=
z.value,r=F[0],A=F[1];if(r.reachable){var U=0===r.nextSegments.length?q<=x(r):q<x(r),Z=d(r)*h(r),O=D.has(r.id),v=C(A),P;try{for(v.s();!(P=v.n()).done;){var t=P.value;O&&a.report({node:t,message:'React Hook "'+a.getSource(t)+'" 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(u){if(!O&&Z!==y){var N='React Hook "'+a.getSource(t)+'" is called conditionally. React Hooks must be called in the exact same order in every component render.'+
(U?" Did you accidentally call a React Hook after an early return?":"");a.report({node:t,message:N})}}else if(e.parent&&("MethodDefinition"===e.parent.type||"ClassProperty"===e.parent.type)&&e.parent.value===e){var K='React Hook "'+a.getSource(t)+'" 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:t,message:K})}else if(g){var L='React Hook "'+a.getSource(t)+'" is called in function "'+(a.getSource(g)+'" that is neither a React function component nor a custom React Hook function. React component names must start with an uppercase letter.');
a.report({node:t,message:L})}else if("Program"===e.type){var p='React Hook "'+a.getSource(t)+'" 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:t,message:p})}else if(f){var G='React Hook "'+a.getSource(t)+'" 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:t,message:G})}}}catch(E){v.e(E)}finally{v.f()}}}}catch(E){k.e(E)}finally{k.f()}}},
CallExpression:function(a){if(H(a.callee)){var d=c[c.length-1],n=b[b.length-1],h=d.get(n);h||(h=[],d.set(n,h));h.push(a.callee)}}}}},"exhaustive-deps":{meta:{type:"suggestion",docs:{description:"verifies the list of dependencies for Hooks like useEffect and similar",category:"Best Practices",recommended:!0,url:"https://github.com/facebook/react/issues/14920"},fixable:"code",schema:[{type:"object",additionalProperties:!1,enableDangerousAutofixThisMayCauseInfiniteLoops:!1,properties:{additionalHooks:{type:"string"},
enableDangerousAutofixThisMayCauseInfiniteLoops:{type:"boolean"}}}]},create:function(a){function c(c){e&&Array.isArray(c.suggest)&&0<c.suggest.length&&(c.fix=c.suggest[0].fix);a.report(c)}function b(a,c){return function(b){if(c.has(b))return c.get(b);var d=a(b);c.set(b,d);return d}}function d(d,e,u,q,l){function f(a){var c=C(a.references),b;try{for(c.s();!(b=c.n()).done;){var m=b.value;if(m.resolved&&F.has(m.resolved.scope)){var e=X(d,m.identifier),g=ra(e),h=W(g,P),u;if(u=l&&"Identifier"===g.type&&
("MemberExpression"===g.parent.type||"OptionalMemberExpression"===g.parent.type)&&!g.parent.computed&&"Identifier"===g.parent.property.type&&"current"===g.parent.property.name){for(var q=m.from,p=!1;q.block!==d;)"function"===q.type&&(p=null!=q.block.parent&&"ReturnStatement"===q.block.parent.type),q=q.upper;u=p}u&&O.set(h,{reference:m,dependencyNode:g});if("TSTypeQuery"!==g.parent.type&&"TSTypeReference"!==g.parent.type){var n=m.resolved.defs[0];if(null!=n&&(null==n.node||n.node.init!==d.parent)&&
"TypeParameter"!==n.type)if(v.has(h))v.get(h).references.push(m);else{var r=m.resolved,k=U(r)||Z(r);v.set(h,{isStable:k,references:[m]})}}}}}catch(aa){c.e(aa)}finally{c.f()}a=C(a.childScopes);var t;try{for(a.s();!(t=a.n()).done;)f(t.value)}catch(aa){a.e(aa)}finally{a.f()}}function g(a){a=a.split(".");for(var c="",b=0;b<a.length;b++){if(0!==b){var m=a.slice(0,b+1).join(".");m=!0===P.get(m);c+=m?"?.":"."}c+=a[b]}return c}function n(a,c,b,d){return 0===a.size?null:(1<a.size?"":c+" ")+b+" "+(1<a.size?
"dependencies":"dependency")+": "+va(Array.from(a).sort().map(function(a){return"'"+g(a)+"'"}))+(". Either "+d+" "+(1<a.size?"them":"it")+" or remove the dependency array.")}l&&d.async&&c({node:d,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://reactjs.org/link/hooks-data-fetching"});
for(var z=h.acquire(d),F=new Set,r=null,A=z.upper;A;){F.add(A);if("function"===A.type)break;A=A.upper}if(A){r=A;var U=b(function(a){if(!Array.isArray(a.defs))return!1;var c=a.defs[0];if(null==c||"VariableDeclarator"!==c.node.type)return!1;var b=c.node.init;if(null==b)return!1;for(;"TSAsExpression"===b.type;)b=b.expression;var d=c.node.parent;if(null==d&&(X(r.block,c.node.id),d=c.node.parent,null==d))return!1;if("const"===d.kind&&"Literal"===b.type&&("string"===typeof b.value||"number"===typeof b.value||
null===b.value))return!0;if("CallExpression"!==b.type)return!1;b=b.callee;"MemberExpression"!==b.type||"React"!==b.object.name||null==b.property||b.computed||(b=b.property);if("Identifier"!==b.type)return!1;c=c.node.id;b=b.name;if("useRef"===b&&"Identifier"===c.type)return!0;if("useState"===b||"useReducer"===b){if("ArrayPattern"===c.type&&2===c.elements.length&&Array.isArray(a.identifiers)){if(c.elements[1]===a.identifiers[0]){if("useState"===b)for(a=a.references,b=0;b<a.length;b++)x.set(a[b].identifier,
c.elements[0]);return!0}if(c.elements[0]===a.identifiers[0]&&"useState"===b)for(a=a.references,c=0;c<a.length;c++)k.add(a[c].identifier)}}else if("useTransition"===b&&"ArrayPattern"===c.type&&Array.isArray(a.identifiers)&&c.elements[0]===a.identifiers[0])return!0;return!1},D),Z=b(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,b=r.childScopes;a=null;var d;for(d=0;d<b.length;d++){var e=b[d],m=e.block;if("FunctionDeclaration"===
c.type&&m===c||"VariableDeclarator"===c.type&&m.parent===c){a=e;break}}if(null==a)return!1;for(d=0;d<a.through.length;d++)if(c=a.through[d],null!=c.resolved&&F.has(c.resolved.scope)&&!U(c.resolved))return!1;return!0},y),O=new Map,v=new Map,P=new Map;f(z);O.forEach(function(a,b){var d=a.dependencyNode;a=a.reference.resolved.references;for(var e=!1,m=0;m<a.length;m++){var f=a[m].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){e=!0;break}}e||c({node:d.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 '"+(b+".current' to a variable inside the effect, and use that variable in the cleanup function.")})});var t=new Set,N=new Set;v.forEach(function(b,d){var e=b.references;b.isStable&&N.add(d);e.forEach(function(b){b.writeExpr&&(b=b.writeExpr,
t.has(d)||(t.add(d),c({node:b,message:"Assignments to the '"+d+"' variable from inside React Hook "+(a.getSource(u)+" 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 ")+(a.getSource(u)+".")})))})});if(!(0<t.size))if(e){var K=[],L=new Set;"ArrayExpression"!==e.type?c({node:e,message:"React Hook "+a.getSource(u)+" 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."}):
e.elements.forEach(function(b){if(null!==b)if("SpreadElement"===b.type)c({node:b,message:"React Hook "+a.getSource(u)+" has a spread element in its dependency array. This means we can't statically verify whether you've passed the correct dependencies."});else{try{var d=W(b,null)}catch(qa){if(/Unsupported node type/.test(qa.message)){"Literal"===b.type?v.has(b.value)?c({node:b,message:"The "+b.raw+" literal is not a valid dependency because it never changes. Did you mean to include "+(b.value+" in the array instead?")}):
c({node:b,message:"The "+b.raw+" literal is not a valid dependency because it never changes. You can safely remove it."}):c({node:b,message:"React Hook "+a.getSource(u)+" has a complex expression in the dependency array. Extract it to a separate variable so it can be statically checked."});return}throw qa;}for(var e=b;"MemberExpression"===e.type||"OptionalMemberExpression"===e.type||"ChainExpression"===e.type;)e=e.object||e.expression.object;var f=!r.through.some(function(a){return a.identifier===
e});K.push({key:d,node:b});f||L.add(d)}});var p=I({dependencies:v,declaredDependencies:K,stableDependencies:N,externalDependencies:L,isEffect:l});A=p.unnecessaryDependencies;var G=p.missingDependencies,E=p.duplicateDependencies,S=p.suggestedDependencies;if(0===E.size+G.size+A.size)oa({declaredDependencies:K,declaredDependenciesNode:e,componentScope:r,scope:z}).forEach(function(a){var b=a.construction,d=a.isUsedOutsideOfHook;a=a.depType;var f="function"===a?"useCallback":"useMemo",g="function"===a?
"definition":"initialization",m="wrap the "+g+" of '"+b.name.name+"' in its own "+f+"() Hook.";m="The '"+b.name.name+"' "+a+" "+("conditional"===a||"logical expression"===a?"could make":"makes")+" the dependencies of "+(q+" Hook (at line "+e.loc.start.line+") change on every render. ")+(d?"To fix this, "+m:"Move it inside the "+q+" callback. Alternatively, "+m);var h;d&&"Variable"===b.type&&"function"===a&&(h=[{desc:"Wrap the "+g+" of '"+b.name.name+"' in its own "+f+"() Hook.",fix:function(a){var c=
"useMemo"===f?["useMemo(() => { return ","; })"]:["useCallback(",")"],d=c[1];return[a.insertTextBefore(b.node.init,c[0]),a.insertTextAfter(b.node.init,d)]}}]);c({node:b.node,message:m,suggest:h})});else{!l&&0<G.size&&(S=I({dependencies:v,declaredDependencies:[],stableDependencies:N,externalDependencies:L,isEffect:l}).suggestedDependencies);(function(){if(0===K.length)return!0;var a=K.map(function(a){return a.key}),b=a.slice().sort();return a.join(",")===b.join(",")})()&&S.sort();p="";if(0<A.size){var T=
null;Array.from(A.keys()).forEach(function(a){null===T&&a.endsWith(".current")&&(T=a)});if(null!==T)p=" Mutable values like '"+T+"' aren't valid dependencies because mutating them doesn't re-render the component.";else if(0<L.size){var J=Array.from(L)[0];z.set.has(J)||(p=" Outer scope values like '"+J+"' aren't valid dependencies because mutating them doesn't re-render the component.")}}if(!p&&G.has("props")){z=v.get("props");if(null==z)return;z=z.references;if(!Array.isArray(z))return;J=!0;for(var Y=
0;Y<z.length;Y++){var M=X(r.block,z[Y].identifier);if(!M){J=!1;break}M=M.parent;if(null==M){J=!1;break}if("MemberExpression"!==M.type&&"OptionalMemberExpression"!==M.type){J=!1;break}}J&&(p=" However, 'props' will change when *any* prop changes, so the preferred fix is to destructure the 'props' object outside of the "+(q+" call and refer to those specific props inside ")+(a.getSource(u)+"."))}if(!p&&0<G.size){var B=null;G.forEach(function(a){if(!B){var b=r.set.get(a),c=v.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,e=0;e<c.references.length;e++)if(d=c.references[e].identifier,null!=d&&null!=d.parent&&("CallExpression"===d.parent.type||"OptionalCallExpression"===d.parent.type)&&d.parent.callee===d){b=!0;break}b&&(B=a)}}});null!==B&&(p=" If '"+B+"' changes too often, find the parent component that defines it and wrap that definition in useCallback.")}if(!p&&0<G.size){var w=null;G.forEach(function(a){if(null===w)for(var b=v.get(a).references,
c,d,e=0;e<b.length;e++){c=b[e].identifier;for(d=c.parent;null!=d&&d!==r.block;){if("CallExpression"===d.type){var f=x.get(d.callee);if(null!=f){f.name===a?w={missingDep:a,setter:d.callee.name,form:"updater"}:k.has(c)?w={missingDep:a,setter:d.callee.name,form:"reducer"}:(c=b[e].resolved,null!=c&&(c=c.defs[0],null!=c&&"Parameter"===c.type&&(w={missingDep:a,setter:d.callee.name,form:"inlineReducer"})));break}}d=d.parent}if(null!==w)break}});if(null!==w)switch(w.form){case "reducer":p=" You can also replace multiple useState variables with useReducer if '"+
(w.setter+"' needs the current value of '")+(w.missingDep+"'.");break;case "inlineReducer":p=" If '"+w.setter+"' needs the current value of '"+(w.missingDep+"', you can also switch to useReducer instead of useState and read '")+(w.missingDep+"' in the reducer.");break;case "updater":p=" You can also do a functional update '"+w.setter+"("+w.missingDep.substring(0,1)+" => ...)' if you only need '"+w.missingDep+"' in the '"+(w.setter+"' call.");break;default:throw Error("Unknown case.");}}c({node:e,
message:"React Hook "+a.getSource(u)+" has "+(n(G,"a","missing","include")||n(A,"an","unnecessary","exclude")||n(E,"a","duplicate","omit"))+p,suggest:[{desc:"Update the dependencies array to be: ["+S.map(g).join(", ")+"]",fix:function(a){return a.replaceText(e,"["+S.map(g).join(", ")+"]")}}]})}}else{var Q=null;v.forEach(function(a,b){Q||a.references.forEach(function(a){if(!Q&&x.has(a.identifier)){for(a=a.from;"function"!==a.type;)a=a.upper;a.block===d&&(Q=b)}})});if(Q){var ba=I({dependencies:v,declaredDependencies:[],
stableDependencies:N,externalDependencies:new Set,isEffect:!0}).suggestedDependencies;c({node:u,message:"React Hook "+q+" contains a call to '"+Q+"'. Without a list of dependencies, this can lead to an infinite chain of updates. To fix this, pass ["+ba.join(", ")+("] as a second argument to the "+q+" Hook."),suggest:[{desc:"Add dependencies array: ["+ba.join(", ")+"]",fix:function(a){return a.insertTextAfter(d,", ["+ba.join(", ")+"]")}}]})}}}}var e=a.options&&a.options[0]&&a.options[0].enableDangerousAutofixThisMayCauseInfiniteLoops||
!1,n={additionalHooks:a.options&&a.options[0]&&a.options[0].additionalHooks?new RegExp(a.options[0].additionalHooks):void 0,enableDangerousAutofixThisMayCauseInfiniteLoops:e},h=a.getSourceCode().scopeManager,x=new WeakMap,k=new WeakSet,D=new WeakMap,y=new WeakMap;return{CallExpression:function(b){var e=ta(b.callee,n);if(-1!==e){var g=b.arguments[e],h=b.callee,l=sa(h).name,k=b.arguments[e+1];b=/Effect($|[^a-z])/g.test(l);if(k||b){switch(g.type){case "FunctionExpression":case "ArrowFunctionExpression":d(g,
k,h,l,b);return;case "Identifier":if(!k||k.elements&&k.elements.some(function(a){return a&&"Identifier"===a.type&&a.name===g.name}))return;e=a.getScope().set.get(g.name);if(null==e||null==e.defs)return;e=e.defs[0];if(!e||!e.node)break;if("Variable"!==e.type&&"FunctionName"!==e.type)break;switch(e.node.type){case "FunctionDeclaration":d(e.node,k,h,l,b);return;case "VariableDeclarator":if(e=e.node.init)switch(e.type){case "ArrowFunctionExpression":case "FunctionExpression":d(e,k,h,l,b);return}}break;
default:c({node:h,message:"React Hook "+l+" received a function whose dependencies are unknown. Pass an inline function instead."});return}c({node:h,message:"React Hook "+l+" has a missing dependency: '"+g.name+"'. Either include it or remove the dependency array.",suggest:[{desc:"Update the dependencies array to be: ["+g.name+"]",fix:function(a){return a.replaceText(k,"["+g.name+"]")}}]})}else"useMemo"!==l&&"useCallback"!==l||c({node:h,message:"React Hook "+l+" does nothing when called with only one argument. Did you forget to pass an array of dependencies?"})}}}}}};
{
"name": "eslint-plugin-react-hooks",
"description": "ESLint rules for React Hooks",
"version": "0.0.0-experimental-2c169a568",
"version": "0.0.0-experimental-3310209d0",
"repository": {

@@ -28,8 +28,13 @@ "type": "git",

"engines": {
"node": ">=7"
"node": ">=10"
},
"homepage": "https://reactjs.org/",
"peerDependencies": {
"eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0"
"eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0"
},
"devDependencies": {
"@typescript-eslint/parser-v2": "npm:@typescript-eslint/parser@^2.26.0",
"@typescript-eslint/parser-v3": "npm:@typescript-eslint/parser@^3.10.0",
"@typescript-eslint/parser-v4": "npm:@typescript-eslint/parser@^4.1.0"
}
}

@@ -9,3 +9,3 @@ # `eslint-plugin-react-hooks`

**Note: If you're using Create React App, please wait for a corresponding release of `react-scripts` that includes this rule instead of adding it directly.**
**Note: If you're using Create React App, please use `react-scripts` >= 3 instead of adding it directly.**

@@ -22,6 +22,19 @@ Assuming you already have ESLint installed, run:

Then add it to your ESLint configuration:
Then extend the recommended eslint config:
```js
{
"extends": [
// ...
"plugin:react-hooks/recommended"
]
}
```
### Custom Configuration
If you want more fine-grained configuration, you can instead add a snippet like this to your ESLint configuration file:
```js
{
"plugins": [

@@ -39,2 +52,21 @@ // ...

## Advanced Configuration
`exhaustive-deps` can be configured to validate dependencies of custom Hooks with the `additionalHooks` option.
This option accepts a regex to match the names of custom Hooks that have dependencies.
```js
{
"rules": {
// ...
"react-hooks/exhaustive-deps": ["warn", {
"additionalHooks": "(useMyCustomHook|useMyOtherCustomHook)"
}]
}
}
```
We suggest to use this option **very sparingly, if at all**. Generally saying, we recommend most custom Hooks to not use the dependencies argument, and instead provide a higher-level API that is more focused around a specific use case.
## Valid and Invalid Examples

@@ -44,6 +76,4 @@

For feedback about the `exhaustive-deps` rule, please post in [this thread](https://github.com/facebook/react/issues/14920).
## License
MIT

Sorry, the diff of this file is too big to display

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc