eslint-plugin-react-hooks 2.4.0 → 2.5.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.
@@ -0,0 +1,8 @@
1
+ {
2
+ "branch": "master",
3
+ "buildNumber": "91354",
4
+ "checksum": "b0ed8f5",
5
+ "commit": "d28bd2994",
6
+ "environment": "ci",
7
+ "reactVersion": "16.12.0-d28bd2994"
8
+ }
@@ -1,4 +1,4 @@
1
- /** @license React vundefined
1
+ /** @license React v2.5.0
2
2
  * eslint-plugin-react-hooks.development.js
3
3
  *
4
4
  * Copyright (c) Facebook, Inc. and its affiliates.
@@ -16,7 +16,6 @@ if (process.env.NODE_ENV !== "production") {
16
16
  'use strict';
17
17
 
18
18
  /* eslint-disable no-for-of-loops/no-for-of-loops */
19
-
20
19
  /**
21
20
  * Catch all identifiers that begin with "use" followed by an uppercase Latin
22
21
  * character to exclude identifiers like "user".
@@ -151,51 +150,48 @@ var RuleOfHooks = {
151
150
  * Populates `cyclic` with cyclic segments.
152
151
  */
153
152
 
154
- function countPathsFromStart(segment) {
153
+ function countPathsFromStart(segment, pathHistory) {
155
154
  var cache = countPathsFromStart.cache;
156
- var paths = cache.get(segment.id); // If `paths` is null then we've found a cycle! Add it to `cyclic` and
157
- // any other segments which are a part of this cycle.
155
+ var paths = cache.get(segment.id);
156
+ var pathList = new Set(pathHistory); // If `pathList` includes the current segment then we've found a cycle!
157
+ // We need to fill `cyclic` with all segments inside cycle
158
158
 
159
- if (paths === null) {
160
- if (cyclic.has(segment.id)) {
161
- return 0;
162
- } else {
163
- cyclic.add(segment.id);
164
- var _iteratorNormalCompletion = true;
165
- var _didIteratorError = false;
166
- var _iteratorError = undefined;
159
+ if (pathList.has(segment.id)) {
160
+ var pathArray = [].concat(pathList);
161
+ var cyclicSegments = pathArray.slice(pathArray.indexOf(segment.id) + 1);
162
+ var _iteratorNormalCompletion = true;
163
+ var _didIteratorError = false;
164
+ var _iteratorError = undefined;
167
165
 
166
+ try {
167
+ for (var _iterator = cyclicSegments[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
168
+ var cyclicSegment = _step.value;
169
+ cyclic.add(cyclicSegment);
170
+ }
171
+ } catch (err) {
172
+ _didIteratorError = true;
173
+ _iteratorError = err;
174
+ } finally {
168
175
  try {
169
- for (var _iterator = segment.prevSegments[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
170
- var prevSegment = _step.value;
171
- countPathsFromStart(prevSegment);
176
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
177
+ _iterator.return();
172
178
  }
173
- } catch (err) {
174
- _didIteratorError = true;
175
- _iteratorError = err;
176
179
  } finally {
177
- try {
178
- if (!_iteratorNormalCompletion && _iterator.return != null) {
179
- _iterator.return();
180
- }
181
- } finally {
182
- if (_didIteratorError) {
183
- throw _iteratorError;
184
- }
180
+ if (_didIteratorError) {
181
+ throw _iteratorError;
185
182
  }
186
183
  }
187
-
188
- return 0;
189
184
  }
190
- } // We have a cached `paths`. Return it.
191
185
 
186
+ return 0;
187
+ } // add the current segment to pathList
192
188
 
193
- if (paths !== undefined) {
194
- return paths;
195
- } // Compute `paths` and cache it. Guarding against cycles.
196
189
 
190
+ pathList.add(segment.id); // We have a cached `paths`. Return it.
197
191
 
198
- cache.set(segment.id, null);
192
+ if (paths !== undefined) {
193
+ return paths;
194
+ }
199
195
 
200
196
  if (codePath.thrownSegments.includes(segment)) {
201
197
  paths = 0;
@@ -209,8 +205,8 @@ var RuleOfHooks = {
209
205
 
210
206
  try {
211
207
  for (var _iterator2 = segment.prevSegments[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
212
- var _prevSegment = _step2.value;
213
- paths += countPathsFromStart(_prevSegment);
208
+ var prevSegment = _step2.value;
209
+ paths += countPathsFromStart(prevSegment, pathList);
214
210
  }
215
211
  } catch (err) {
216
212
  _didIteratorError2 = true;
@@ -261,51 +257,48 @@ var RuleOfHooks = {
261
257
  */
262
258
 
263
259
 
264
- function countPathsToEnd(segment) {
260
+ function countPathsToEnd(segment, pathHistory) {
265
261
  var cache = countPathsToEnd.cache;
266
- var paths = cache.get(segment.id); // If `paths` is null then we've found a cycle! Add it to `cyclic` and
267
- // any other segments which are a part of this cycle.
262
+ var paths = cache.get(segment.id);
263
+ var pathList = new Set(pathHistory); // If `pathList` includes the current segment then we've found a cycle!
264
+ // We need to fill `cyclic` with all segments inside cycle
268
265
 
269
- if (paths === null) {
270
- if (cyclic.has(segment.id)) {
271
- return 0;
272
- } else {
273
- cyclic.add(segment.id);
274
- var _iteratorNormalCompletion3 = true;
275
- var _didIteratorError3 = false;
276
- var _iteratorError3 = undefined;
266
+ if (pathList.has(segment.id)) {
267
+ var pathArray = Array.from(pathList);
268
+ var cyclicSegments = pathArray.slice(pathArray.indexOf(segment.id) + 1);
269
+ var _iteratorNormalCompletion3 = true;
270
+ var _didIteratorError3 = false;
271
+ var _iteratorError3 = undefined;
277
272
 
273
+ try {
274
+ for (var _iterator3 = cyclicSegments[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
275
+ var cyclicSegment = _step3.value;
276
+ cyclic.add(cyclicSegment);
277
+ }
278
+ } catch (err) {
279
+ _didIteratorError3 = true;
280
+ _iteratorError3 = err;
281
+ } finally {
278
282
  try {
279
- for (var _iterator3 = segment.nextSegments[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
280
- var nextSegment = _step3.value;
281
- countPathsToEnd(nextSegment);
283
+ if (!_iteratorNormalCompletion3 && _iterator3.return != null) {
284
+ _iterator3.return();
282
285
  }
283
- } catch (err) {
284
- _didIteratorError3 = true;
285
- _iteratorError3 = err;
286
286
  } finally {
287
- try {
288
- if (!_iteratorNormalCompletion3 && _iterator3.return != null) {
289
- _iterator3.return();
290
- }
291
- } finally {
292
- if (_didIteratorError3) {
293
- throw _iteratorError3;
294
- }
287
+ if (_didIteratorError3) {
288
+ throw _iteratorError3;
295
289
  }
296
290
  }
297
-
298
- return 0;
299
291
  }
300
- } // We have a cached `paths`. Return it.
301
292
 
293
+ return 0;
294
+ } // add the current segment to pathList
302
295
 
303
- if (paths !== undefined) {
304
- return paths;
305
- } // Compute `paths` and cache it. Guarding against cycles.
306
296
 
297
+ pathList.add(segment.id); // We have a cached `paths`. Return it.
307
298
 
308
- cache.set(segment.id, null);
299
+ if (paths !== undefined) {
300
+ return paths;
301
+ }
309
302
 
310
303
  if (codePath.thrownSegments.includes(segment)) {
311
304
  paths = 0;
@@ -319,8 +312,8 @@ var RuleOfHooks = {
319
312
 
320
313
  try {
321
314
  for (var _iterator4 = segment.nextSegments[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) {
322
- var _nextSegment = _step4.value;
323
- paths += countPathsToEnd(_nextSegment);
315
+ var nextSegment = _step4.value;
316
+ paths += countPathsToEnd(nextSegment, pathList);
324
317
  }
325
318
  } catch (err) {
326
319
  _didIteratorError4 = true;
@@ -717,7 +710,6 @@ function last(array) {
717
710
 
718
711
  /* eslint-disable no-for-of-loops/no-for-of-loops */
719
712
 
720
-
721
713
  var ExhaustiveDeps = {
722
714
  meta: {
723
715
  schema: [{
@@ -2151,8 +2143,9 @@ var rules = {
2151
2143
  'exhaustive-deps': ExhaustiveDeps
2152
2144
  };
2153
2145
 
2154
- var src = Object.freeze({
2155
- rules: rules
2146
+ var src = /*#__PURE__*/Object.freeze({
2147
+ __proto__: null,
2148
+ rules: rules
2156
2149
  });
2157
2150
 
2158
2151
  var eslintPluginReactHooks = src;
@@ -1,4 +1,4 @@
1
- /** @license React vundefined
1
+ /** @license React v2.5.0
2
2
  * eslint-plugin-react-hooks.production.min.js
3
3
  *
4
4
  * Copyright (c) Facebook, Inc. and its affiliates.
@@ -7,46 +7,46 @@
7
7
  * LICENSE file in the root directory of this source tree.
8
8
  */
9
9
 
10
- 'use strict';function T(a){return"Identifier"===a.type?/^use[A-Z0-9].*$/.test(a.name):"MemberExpression"===a.type&&!a.computed&&T(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,e){return a.name===e||"MemberExpression"===a.type&&"React"===a.object.name&&a.property.name===e}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 e=ha(a);if(e&&(ba(e)||T(e))||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:
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:
13
13
  a.parent.key}
14
- 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=
15
- !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=
16
- !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}}
17
- function ia(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=
18
- 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&&!ja(e,k.identifier)){a=!0;break a}}a=!1}return{fn:c,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 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}
20
- 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}}
21
- 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(ja(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}
22
- 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 ja(a,e){return a.range[0]<=e.range[0]&&a.range[1]>=e.range[1]}
23
- 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||
24
- 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);
25
- 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;
26
- }}}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;
27
- v.cache=new Map;var F=l(d.initialSegment),g=ha(c),u=fa(c),x=g?ba(g)||T(g):da(c)||ea(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 S=v(W);S<A&&(A=S)}}}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):
28
- A<v(D),Q=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&&Q!==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.'+
29
- (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 R='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.';
30
- a.report({node:r,message:R})}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(T(a.callee)){var c=e[e.length-1],h=d[d.length-1],l=c.get(h);l||
31
- (l=[],c.set(h,l));l.push(a.callee)}}}}},"exhaustive-deps":{meta:{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=ka(m),p=X(l),r;if(r=
32
- 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&&S.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=
33
- K(w)||W(w);y.set(p,{isStatic:z,references:[g]})}}}}catch(aa){f=!0,c=aa}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(aa){f=!0,c=aa}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+"'"}))+
34
- (". 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=/Effect($|[^a-z])/g.test(x),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"});
35
- 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"!==
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;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]===
37
- 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)&&
38
- !K(b.resolved))return!1;return!0},v),S=new Map,y=new Map;k(p);S.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 '"+
39
- (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 ")+
40
- (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."});
41
- 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."});
42
- 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}),Q=J.suggestedDependencies;g=J.unnecessaryDependencies;var H=J.missingDependencies;J=J.duplicateDependencies;if(0===J.size+H.size+g.size)ia({declaredDependencies:D,declaredDependenciesNode:m,componentScope:t,scope:p}).forEach(function(b){var c=
43
- b.fn;b=b.suggestUseCallback;var f="The '"+c.name.name+"' function makes the dependencies of "+(x+" Hook (at line "+m.loc.start.line+") change on every render.");f=b?f+(" To fix this, wrap the '"+(c.name.name+"' definition into its own useCallback() Hook.")):f+(" Move it inside the "+x+" callback. Alternatively, wrap the '"+(c.name.name+"' definition into its own useCallback() Hook."));var d;b&&"Variable"===c.type&&(d=[{desc:"Wrap the '"+c.name.name+"' definition into its own useCallback() Hook.",
44
- fix:function(a){return[a.insertTextBefore(c.node.init,"useCallback("),a.insertTextAfter(c.node.init,")")]}}]);a.report({node:c.node,message:f,suggest:d})});else{!A&&0<H.size&&(Q=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(",")})()&&Q.sort();var w="";if(0<g.size){var N=null;Array.from(g.keys()).forEach(function(a){null===
45
- 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);
46
- 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 R=null;H.forEach(function(a){if(!R){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,
47
- 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&&(R=a)}}});null!==R&&(w=" If '"+R+"' 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=
48
- 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+
49
- "'.");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",
50
- "missing","include")||F(g,"an","unnecessary","exclude")||F(J,"a","duplicate","omit"))+w,suggest:[{desc:"Update the dependencies array to be: ["+Q.join(", ")+"]",fix:function(a){return a.replaceText(m,"["+Q.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 Z=V({dependencies:y,declaredDependencies:[],optionalDependencies:E,externalDependencies:new Set,
51
- 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 ["+Z.join(", ")+("] as a second argument to the "+x+" Hook."),suggest:[{desc:"Add dependencies array: ["+Z.join(", ")+"]",fix:function(a){return a.insertTextAfter(d,", ["+Z.join(", ")+"]")}}]})}}}}else"useMemo"!==x&&"useCallback"!==x||a.report({node:d.parent.callee,message:"React Hook "+
52
- 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}}}}};
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}}}}};
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.4.0",
4
+ "version": "2.5.0",
5
5
  "repository": {
6
6
  "type": "git",
7
7
  "url": "https://github.com/facebook/react.git",