Socket
Socket
Sign inDemoInstall

eslint-plugin-react-hooks

Package Overview
Dependencies
Maintainers
5
Versions
1831
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-679402a66 to 0.0.0-6da04b5d8

8

build-info.json
{
"branch": "master",
"buildNumber": "13829",
"checksum": "c4777c8",
"commit": "679402a66",
"buildNumber": "14730",
"checksum": "45d1701",
"commit": "6da04b5d8",
"environment": "ci",
"reactVersion": "16.8.4-canary-679402a66"
"reactVersion": "16.8.6-canary-6da04b5d8"
}

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

/** @license React v0.0.0-679402a66
/** @license React v0.0.0-6da04b5d8
* eslint-plugin-react-hooks.production.min.js

@@ -10,39 +10,43 @@ *

'use strict';function Q(a){return"Identifier"===a.type?/^use[A-Z0-9].*$/.test(a.name):"MemberExpression"===a.type&&!a.computed&&Q(a.property)?(a=a.object,"Identifier"===a.type&&"React"===a.name):!1}function U(a){return"Identifier"===a.type?!/^[a-z]/.test(a.name):!1}function aa(a){for(;a;){var b=W(a);if(b&&(U(b)||Q(b)))return!0;a=a.parent}return!1}
function W(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 ba(a){function b(){return{isRequired:!1,isSatisfiedRecursively:!1,hasRequiredNodesBelow:!1,children:new Map}}function e(a,l){l=l.split(".");var k=!0,h=!1,e=void 0;try{for(var f=l[Symbol.iterator](),p;!(k=(p=f.next()).done);k=!0){var u=p.value,g=a.children.get(u);g||(g=b(),a.children.set(u,g));a=g}}catch(D){h=!0,e=D}finally{try{!k&&f.return&&f.return()}finally{if(h)throw e;}}return a}function f(a,l,b){l=l.split(".");var k=!0,f=!1,h=void 0;try{for(var e=l[Symbol.iterator](),g;!(k=(g=e.next()).done);k=
!0){var u=a.children.get(g.value);if(!u)break;b(u);a=u}}catch(D){f=!0,h=D}finally{try{!k&&e.return&&e.return()}finally{if(f)throw h;}}}function l(a,b,e,f){a.children.forEach(function(a,k){var h=f(k);a.isSatisfiedRecursively?a.hasRequiredNodesBelow&&e.add(h):a.isRequired?b.add(h):l(a,b,e,function(a){return h+"."+a})})}var u=a.dependencies,n=a.declaredDependencies,v=a.optionalDependencies,h=a.externalDependencies,r=a.isEffect,B=b();u.forEach(function(a,l){e(B,l).isRequired=!0;f(B,l,function(a){a.hasRequiredNodesBelow=
!0})});n.forEach(function(a){e(B,a.key).isSatisfiedRecursively=!0});v.forEach(function(a){e(B,a).isSatisfiedRecursively=!0});a=new Set;var g=new Set;l(B,a,g,function(a){return a});var t=[],E=new Set,C=new Set;n.forEach(function(a){a=a.key;g.has(a)?-1===t.indexOf(a)?t.push(a):C.add(a):!r||a.endsWith(".current")||h.has(a)?E.add(a):-1===t.indexOf(a)&&t.push(a)});a.forEach(function(a){t.push(a)});return{suggestedDependencies:t,unnecessaryDependencies:E,duplicateDependencies:C,missingDependencies:a}}
function ca(a){var b=a.declaredDependenciesNode,e=a.componentScope,f=a.scope;return a.declaredDependencies.map(function(a){a=e.set.get(a.key);if(null==a)return null;var b=a.defs[0];return null==b?null:"Variable"===b.type&&"VariableDeclarator"===b.node.type&&null!=b.node.init&&("ArrowFunctionExpression"===b.node.init.type||"FunctionExpression"===b.node.init.type)||"FunctionName"===b.type&&"FunctionDeclaration"===b.node.type?a:null}).filter(Boolean).map(function(a){var e=a.defs[0];a:{for(var l=!1,v=
0;v<a.references.length;v++){var h=a.references[v];if(h.writeExpr)if(l){a=!0;break a}else{l=!0;continue}for(var r=h.from;r!==f&&null!=r;)r=r.upper;if(r!==f&&!da(b,h.identifier)){a=!0;break a}}a=!1}return{fn:e,suggestUseCallback:a}})}function ea(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:ea(a.parent)}
function Y(a){if("Identifier"===a.type)return a.name;if("MemberExpression"!==a.type||a.computed)throw Error("Unsupported node type: "+a.type);var b=Y(a.object);a=Y(a.property);return b+"."+a}function ha(a){return"MemberExpression"!==a.type||"Identifier"!==a.object.type||"React"!==a.object.name||"Identifier"!==a.property.type||a.computed?a:a.property}
function ia(a,b){var e=ha(a);if("Identifier"!==e.type)return null;switch(e.name){case "useEffect":case "useLayoutEffect":case "useCallback":case "useMemo":return 0;case "useImperativeHandle":return 1;default:if(e===a&&b&&b.additionalHooks){a=void 0;try{a=Y(e)}catch(f){if(/Unsupported node type/.test(f.message))return 0;throw f;}return b.additionalHooks.test(a)?0:-1}return-1}}
function Z(a,b){for(var e=[a],f=null;e.length;){f=e.shift();if("Identifier"===f.type&&f.name===b.name&&f.range[0]===b.range[0]&&f.range[1]===b.range[1])return f;if(da(f,b)){a=!0;var l=!1,u=void 0;try{for(var n=Object.entries(f)[Symbol.iterator](),v;!(a=(v=n.next()).done);a=!0){var h=v.value,r=h[1];"parent"!==h[0]&&(ja(r)?(r.parent=f,e.push(r)):Array.isArray(r)&&r.forEach(function(a){ja(a)&&(a.parent=f,e.push(a))}))}}catch(B){l=!0,u=B}finally{try{!a&&n.return&&n.return()}finally{if(l)throw u;}}}}return null}
function ka(a){for(var b="",e=0;e<a.length;e++)b+=a[e],0===e&&2===a.length?b+=" and ":e===a.length-2&&2<a.length?b+=", and ":e<a.length-1&&(b+=", ");return b}function ja(a){return"object"===typeof a&&null!==a&&!Array.isArray(a)&&"string"===typeof a.type}function da(a,b){return a.range[0]<=b.range[0]&&a.range[1]>=b.range[1]}
module.exports={rules:{"rules-of-hooks":{create:function(a){var b=[],e=[];return{onCodePathSegmentStart:function(a){return e.push(a)},onCodePathSegmentEnd:function(){return e.pop()},onCodePathStart:function(){return b.push(new Map)},onCodePathEnd:function(e,l){function f(a){var c=f.cache,d=c.get(a.id);if(null===d){if(!r.has(a.id)){r.add(a.id);c=!0;d=!1;var w=void 0;try{for(var q=a.prevSegments[Symbol.iterator](),b;!(c=(b=q.next()).done);c=!0)f(b.value)}catch(L){d=!0,w=L}finally{try{!c&&q.return&&
q.return()}finally{if(d)throw w;}}}return 0}if(void 0!==d)return d;c.set(a.id,null);if(e.thrownSegments.includes(a))d=0;else if(0===a.prevSegments.length)d=1;else{d=0;q=!0;b=!1;var h=void 0;try{w=a.prevSegments[Symbol.iterator]();for(var m;!(q=(m=w.next()).done);q=!0)d+=f(m.value)}catch(L){b=!0,h=L}finally{try{!q&&w.return&&w.return()}finally{if(b)throw h;}}}a.reachable&&0===d?c.delete(a.id):c.set(a.id,d);return d}function n(a){var c=n.cache,d=c.get(a.id);if(null===d){if(!r.has(a.id)){r.add(a.id);
c=!0;d=!1;var w=void 0;try{for(var q=a.nextSegments[Symbol.iterator](),b;!(c=(b=q.next()).done);c=!0)n(b.value)}catch(L){d=!0,w=L}finally{try{!c&&q.return&&q.return()}finally{if(d)throw w;}}}return 0}if(void 0!==d)return d;c.set(a.id,null);if(e.thrownSegments.includes(a))d=0;else if(0===a.nextSegments.length)d=1;else{d=0;q=!0;b=!1;var h=void 0;try{w=a.nextSegments[Symbol.iterator]();for(var f;!(q=(f=w.next()).done);q=!0)d+=n(f.value)}catch(L){b=!0,h=L}finally{try{!q&&w.return&&w.return()}finally{if(b)throw h;
}}}c.set(a.id,d);return d}function v(a){var c=v.cache,d=c.get(a.id);if(null===d)return Infinity;if(void 0!==d)return d;c.set(a.id,null);if(0===a.prevSegments.length)d=1;else{d=Infinity;var w=!0,q=!1,b=void 0;try{for(var e=a.prevSegments[Symbol.iterator](),h;!(w=(h=e.next()).done);w=!0){var f=v(h.value);f<d&&(d=f)}}catch(la){q=!0,b=la}finally{try{!w&&e.return&&e.return()}finally{if(q)throw b;}}d+=1}c.set(a.id,d);return d}var h=b.pop();if(0!==h.size){var r=new Set;f.cache=new Map;n.cache=new Map;v.cache=
new Map;var B=n(e.initialSegment),g=W(l),t=aa(l),E=g?U(g)||Q(g):!1,C=Infinity,k=!0,p=!1,H=void 0;try{for(var y=e.finalSegments[Symbol.iterator](),J;!(k=(J=y.next()).done);k=!0){var V=J.value;if(V.reachable){var P=v(V);P<C&&(C=P)}}}catch(m){p=!0,H=m}finally{try{!k&&y.return&&y.return()}finally{if(p)throw H;}}k=!0;p=!1;H=void 0;try{for(var A=h[Symbol.iterator](),K;!(k=(K=A.next()).done);k=!0){var D=K.value,F=D[0],R=D[1];if(F.reachable){var I=0===F.nextSegments.length?C<=v(F):C<v(F),S=f(F)*n(F),G=r.has(F.id);
h=!0;y=!1;J=void 0;try{for(var z=R[Symbol.iterator](),M;!(h=(M=z.next()).done);h=!0){var x=M.value;G&&a.report({node:x,message:'React Hook "'+a.getSource(x)+'" 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(E){if(!G&&S!==B){var T='React Hook "'+a.getSource(x)+'" is called conditionally. React Hooks must be called in the exact same order in every component render.'+(I?" Did you accidentally call a React Hook after an early return?":
"");a.report({node:x,message:T})}}else if(!l.parent||"MethodDefinition"!==l.parent.type&&"ClassProperty"!==l.parent.type||l.parent.value!==l)if(g){var N='React Hook "'+a.getSource(x)+'" is called in '+('function "'+a.getSource(g)+'" ')+"which is neither a React function component or a custom React Hook function.";a.report({node:x,message:N})}else if("Program"!==l.type&&t){var O='React Hook "'+a.getSource(x)+'" 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:x,message:O})}}}catch(m){y=!0,J=m}finally{try{!h&&z.return&&z.return()}finally{if(y)throw J;}}}}}catch(m){p=!0,H=m}finally{try{!k&&A.return&&A.return()}finally{if(p)throw H;}}}},CallExpression:function(a){if(Q(a.callee)){var f=b[b.length-1],u=e[e.length-1],n=f.get(u);n||(n=[],f.set(u,n));n.push(a.callee)}}}}},"exhaustive-deps":{meta:{fixable:"code",schema:[{type:"object",additionalProperties:!1,properties:{additionalHooks:{type:"string"}}}]},create:function(a){function b(a,b){return function(e){if(b.has(e))return b.get(e);
var h=a(e);b.set(e,h);return h}}function e(e){function h(a){var d=!0,c=!1,q=void 0;try{for(var b=a.references[Symbol.iterator](),f;!(d=(f=b.next()).done);d=!0){var g=f.value;if(g.resolved&&H.has(g.resolved.scope)){var l=Z(e,g.identifier),k=ea(l),m=Y(k),p;if(p=C&&"Identifier"===k.type&&"MemberExpression"===k.parent.type&&!k.parent.computed&&"Identifier"===k.parent.property.type&&"current"===k.parent.property.name){for(var n=g.from,r=!1;n.block!==e;)"function"===n.type&&(r=null!=n.block.parent&&"ReturnStatement"===
n.block.parent.type),n=n.upper;p=r}p&&P.set(m,{reference:g,dependencyNode:k});if(A.has(m))A.get(m).references.push(g);else{var u=g.resolved,v=J(u)||V(u);A.set(m,{isStatic:v,references:[g]})}}}}catch(X){c=!0,q=X}finally{try{!d&&b.return&&b.return()}finally{if(c)throw q;}}d=!0;c=!1;q=void 0;try{for(var t=a.childScopes[Symbol.iterator](),x;!(d=(x=t.next()).done);d=!0)h(x.value)}catch(X){c=!0,q=X}finally{try{!d&&t.return&&t.return()}finally{if(c)throw q;}}}function B(a,d,w,b){return 0===a.size?null:(1<
a.size?"":d+" ")+w+" "+(1<a.size?"dependencies":"dependency")+": "+ka(Array.from(a).sort().map(function(a){return"'"+a+"'"}))+(". Either "+b+" "+(1<a.size?"them":"it")+" or remove the dependency array.")}if(("FunctionExpression"===e.type||"ArrowFunctionExpression"===e.type)&&"CallExpression"===e.parent.type){var g=ia(e.parent.callee,f);if(e.parent.arguments[g]===e){var t=e.parent.callee,E=ha(t).name,C=E.endsWith("Effect"),k=e.parent.arguments[g+1];if(k){C&&e.async&&a.report({node:e,message:"Effect callbacks are synchronous to prevent race conditions. Put the async function inside:\n\nuseEffect(() => {\n let ignore = false;\n fetchSomething();\n\n async function fetchSomething() {\n const result = await ...\n if (!ignore) setState(result);\n }\n\n return () => { ignore = true; };\n}, ...);\n\nThis lets you handle multiple requests without bugs."});
var p=a.getScope(),H=new Set,y=null;for(g=p.upper;g;){H.add(g);if("function"===g.type)break;g=g.upper}if(g){y=g;var J=b(function(a){if(!Array.isArray(a.defs))return!1;var d=a.defs[0];if(null==d||"VariableDeclarator"!==d.node.type)return!1;var c=d.node.init;if(null==c)return!1;var b=d.node.parent;if(null==b&&(Z(y.block,d.node.id),b=d.node.parent,null==b))return!1;if("const"===b.kind&&"Literal"===c.type&&("string"===typeof c.value||"number"===typeof c.value||null===c.value))return!0;if("CallExpression"!==
c.type)return!1;c=c.callee;"MemberExpression"!==c.type||"React"!==c.object.name||null==c.property||c.computed||(c=c.property);if("Identifier"!==c.type)return!1;d=d.node.id;c=c.name;if("useRef"===c&&"Identifier"===d.type)return!0;if(("useState"===c||"useReducer"===c)&&"ArrayPattern"===d.type&&2===d.elements.length&&Array.isArray(a.identifiers)){if(d.elements[1]===a.identifiers[0]){if("useState"===c)for(a=a.references,c=0;c<a.length;c++)l.set(a[c].identifier,d.elements[0]);return!0}if(d.elements[0]===
a.identifiers[0]&&"useState"===c)for(a=a.references,d=0;d<a.length;d++)u.add(a[d].identifier)}return!1},n),V=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 d=a.node,c=y.childScopes;a=null;var b;for(b=0;b<c.length;b++){var e=c[b],f=e.block;if("FunctionDeclaration"===d.type&&f===d||"VariableDeclarator"===d.type&&f.parent===d){a=e;break}}if(null==a)return!1;for(b=0;b<a.through.length;b++)if(d=a.through[b],null!=d.resolved&&H.has(d.resolved.scope)&&
!J(d.resolved))return!1;return!0},v),P=new Map,A=new Map;h(p);P.forEach(function(c,d){var b=c.dependencyNode;c=c.reference.resolved.references;for(var e=!1,f=0;f<c.length;f++){var g=c[f].identifier.parent;if(null!=g&&"MemberExpression"===g.type&&!g.computed&&"Identifier"===g.property.type&&"current"===g.property.name&&"AssignmentExpression"===g.parent.type&&g.parent.left===g){e=!0;break}}e||a.report({node:b.parent.property,message:"The ref value '"+d+".current' will likely have changed by the time this effect cleanup function runs. If this ref points to a node rendered by React, copy "+
("'"+d+".current' to a variable inside the effect, and ")+"use that variable in the cleanup function."})});var K=[],D=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."});
else{var d=void 0;try{d=Y(c)}catch(fa){if(/Unsupported node type/.test(fa.message)){"Literal"===c.type?A.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."});
return}throw fa;}for(var b=c;"MemberExpression"===b.type;)b=b.object;var e=!y.through.some(function(a){return a.identifier===b});K.push({key:d,node:c});e||D.add(d)}});var F=new Set,R=new Set;A.forEach(function(c,d){var b=c.references;c.isStatic&&R.add(d);b.forEach(function(c){c.writeExpr&&(c=c.writeExpr,F.has(d)||(F.add(d),a.report({node:c,message:"Assignments to the '"+d+"' 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 "+
(a.getSource(t)+".")})))})});if(!(0<F.size)){var I=ba({dependencies:A,declaredDependencies:K,optionalDependencies:R,externalDependencies:D,isEffect:C}),S=I.suggestedDependencies;g=I.unnecessaryDependencies;var G=I.missingDependencies;I=I.duplicateDependencies;if(0===I.size+G.size+g.size)ca({declaredDependencies:K,declaredDependenciesNode:k,componentScope:y,scope:p}).forEach(function(c){var d=c.fn,b=c.suggestUseCallback;c="The '"+d.name.name+"' function makes the dependencies of "+(E+" Hook (at line "+
k.loc.start.line+") ")+"change on every render.";c=b?c+(" To fix this, "+("wrap the '"+d.name.name+"' definition into its own useCallback() Hook.")):c+(" Move it inside the "+E+" callback. "+("Alternatively, wrap the '"+d.name.name+"' definition into its own useCallback() Hook."));a.report({node:d.node,message:c,fix:function(a){if(b&&"Variable"===d.type)return[a.insertTextBefore(d.node.init,"useCallback("),a.insertTextAfter(d.node.init,")")]}})});else{!C&&0<G.size&&(S=ba({dependencies:A,declaredDependencies:[],
optionalDependencies:R,externalDependencies:D,isEffect:C}).suggestedDependencies);(function(){if(0===K.length)return!0;var a=K.map(function(a){return a.key}),d=a.slice().sort();return a.join(",")===d.join(",")})()&&S.sort();var z="";if(0<g.size){var M=null;Array.from(g.keys()).forEach(function(a){null===M&&a.endsWith(".current")&&(M=a)});if(null!==M)z=" Mutable values like '"+M+"' aren't valid dependencies because mutating them doesn't re-render the component.";else if(0<D.size){var x=Array.from(D)[0];
p.set.has(x)||(z=" Outer scope values like '"+x+"' aren't valid dependencies because mutating them doesn't re-render the component.")}}if(!z&&G.has("props")){p=A.get("props");if(null==p)return;p=p.references;if(!Array.isArray(p))return;x=!0;for(var T=0;T<p.length;T++){var N=Z(y.block,p[T].identifier);if(!N){x=!1;break}N=N.parent;if(null==N){x=!1;break}if("MemberExpression"!==N.type){x=!1;break}}x&&(z=" However, 'props' will change when *any* prop changes, so the preferred fix is to destructure the 'props' object outside of "+
("the "+E+" call and refer to those specific props ")+("inside "+a.getSource(t)+"."))}if(!z&&0<G.size){var O=null;G.forEach(function(a){if(!O){var d=y.set.get(a),b=A.get(a);if(b.references[0].resolved===d&&(d=d.defs[0],null!=d&&null!=d.name&&"Parameter"===d.type)){d=!1;for(var c,e=0;e<b.references.length;e++)if(c=b.references[e].identifier,null!=c&&null!=c.parent&&"CallExpression"===c.parent.type&&c.parent.callee===c){d=!0;break}d&&(O=a)}}});null!==O&&(z=" If '"+O+"' changes too often, find the parent component that defines it and wrap that definition in useCallback.")}if(!z&&
0<G.size){var m=null;G.forEach(function(a){if(null===m)for(var d=A.get(a).references,b,c,e=0;e<d.length;e++){b=d[e].identifier;for(c=b.parent;null!=c&&c!==y.block;){if("CallExpression"===c.type){var f=l.get(c.callee);if(null!=f){f.name===a?m={missingDep:a,setter:c.callee.name,form:"updater"}:u.has(b)?m={missingDep:a,setter:c.callee.name,form:"reducer"}:(b=d[e].resolved,null!=b&&(b=b.defs[0],null!=b&&"Parameter"===b.type&&(m={missingDep:a,setter:c.callee.name,form:"inlineReducer"})));break}}c=c.parent}if(null!==
m)break}});if(null!==m)switch(m.form){case "reducer":z=" You can also replace multiple useState variables with useReducer "+("if '"+m.setter+"' needs the ")+("current value of '"+m.missingDep+"'.");break;case "inlineReducer":z=" If '"+m.setter+"' needs the "+("current value of '"+m.missingDep+"', ")+"you can also switch to useReducer instead of useState and "+("read '"+m.missingDep+"' in the reducer.");break;case "updater":z=" You can also do a functional update '"+m.setter+"("+m.missingDep.substring(0,
1)+" => ...)' if you only need '"+m.missingDep+"'"+(" in the '"+m.setter+"' call.");break;default:throw Error("Unknown case.");}}a.report({node:k,message:"React Hook "+a.getSource(t)+" has "+(B(G,"a","missing","include")||B(g,"an","unnecessary","exclude")||B(I,"a","duplicate","omit"))+z,fix:function(a){return a.replaceText(k,"["+S.join(", ")+"]")}})}}}}else"useMemo"!==E&&"useCallback"!==E||a.report({node:e.parent.callee,message:"React Hook "+E+" does nothing when called with only one argument. Did you forget to pass an array of dependencies?"})}}}
var f={additionalHooks:a.options&&a.options[0]&&a.options[0].additionalHooks?new RegExp(a.options[0].additionalHooks):void 0},l=new WeakMap,u=new WeakSet,n=new WeakMap,v=new WeakMap;return{FunctionExpression:e,ArrowFunctionExpression:e}}}}};
'use strict';function R(a){return"Identifier"===a.type?/^use[A-Z0-9].*$/.test(a.name):"MemberExpression"===a.type&&!a.computed&&R(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){for(;a;){var b=ca(a);if(b&&(aa(b)||R(b)))return!0;a=a.parent}return!1}
function ca(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 b(){return{isRequired:!1,isSatisfiedRecursively:!1,hasRequiredNodesBelow:!1,children:new Map}}function e(a,h){h=h.split(".");var l=!0,c=!1,e=void 0;try{for(var f=h[Symbol.iterator](),p;!(l=(p=f.next()).done);l=!0){var u=p.value,g=a.children.get(u);g||(g=b(),a.children.set(u,g));a=g}}catch(E){c=!0,e=E}finally{try{!l&&f.return&&f.return()}finally{if(c)throw e;}}return a}function f(a,h,c){h=h.split(".");var l=!0,b=!1,f=void 0;try{for(var e=h[Symbol.iterator](),g;!(l=(g=e.next()).done);l=
!0){var u=a.children.get(g.value);if(!u)break;c(u);a=u}}catch(E){b=!0,f=E}finally{try{!l&&e.return&&e.return()}finally{if(b)throw f;}}}function h(a,c,b,e){a.children.forEach(function(a,l){var f=e(l);a.isSatisfiedRecursively?a.hasRequiredNodesBelow&&b.add(f):a.isRequired?c.add(f):h(a,c,b,function(a){return f+"."+a})})}var u=a.dependencies,q=a.declaredDependencies,t=a.optionalDependencies,c=a.externalDependencies,n=a.isEffect,C=b();u.forEach(function(a,h){e(C,h).isRequired=!0;f(C,h,function(a){a.hasRequiredNodesBelow=
!0})});q.forEach(function(a){e(C,a.key).isSatisfiedRecursively=!0});t.forEach(function(a){e(C,a).isSatisfiedRecursively=!0});a=new Set;var g=new Set;h(C,a,g,function(a){return a});var v=[],A=new Set,B=new Set;q.forEach(function(a){a=a.key;g.has(a)?-1===v.indexOf(a)?v.push(a):B.add(a):!n||a.endsWith(".current")||c.has(a)?A.add(a):-1===v.indexOf(a)&&v.push(a)});a.forEach(function(a){v.push(a)});return{suggestedDependencies:v,unnecessaryDependencies:A,duplicateDependencies:B,missingDependencies:a}}
function da(a){var b=a.declaredDependenciesNode,e=a.componentScope,f=a.scope;return a.declaredDependencies.map(function(a){a=e.set.get(a.key);if(null==a)return null;var b=a.defs[0];return null==b?null:"Variable"===b.type&&"VariableDeclarator"===b.node.type&&null!=b.node.init&&("ArrowFunctionExpression"===b.node.init.type||"FunctionExpression"===b.node.init.type)||"FunctionName"===b.type&&"FunctionDeclaration"===b.node.type?a:null}).filter(Boolean).map(function(a){var e=a.defs[0];a:{for(var h=!1,t=
0;t<a.references.length;t++){var c=a.references[t];if(c.writeExpr)if(h){a=!0;break a}else{h=!0;continue}for(var n=c.from;n!==f&&null!=n;)n=n.upper;if(n!==f&&!ea(b,c.identifier)){a=!0;break a}}a=!1}return{fn:e,suggestUseCallback:a}})}function fa(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:fa(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 b=X(a.object);a=X(a.property);return b+"."+a}function ja(a){return"MemberExpression"!==a.type||"Identifier"!==a.object.type||"React"!==a.object.name||"Identifier"!==a.property.type||a.computed?a:a.property}
function ka(a,b){var e=ja(a);if("Identifier"!==e.type)return null;switch(e.name){case "useEffect":case "useLayoutEffect":case "useCallback":case "useMemo":return 0;case "useImperativeHandle":return 1;default:if(e===a&&b&&b.additionalHooks){a=void 0;try{a=X(e)}catch(f){if(/Unsupported node type/.test(f.message))return 0;throw f;}return b.additionalHooks.test(a)?0:-1}return-1}}
function Y(a,b){for(var e=[a],f=null;e.length;){f=e.shift();if("Identifier"===f.type&&f.name===b.name&&f.range[0]===b.range[0]&&f.range[1]===b.range[1])return f;if(ea(f,b)){a=!0;var h=!1,u=void 0;try{for(var q=Object.entries(f)[Symbol.iterator](),t;!(a=(t=q.next()).done);a=!0){var c=t.value,n=c[1];"parent"!==c[0]&&(la(n)?(n.parent=f,e.push(n)):Array.isArray(n)&&n.forEach(function(a){la(a)&&(a.parent=f,e.push(a))}))}}catch(C){h=!0,u=C}finally{try{!a&&q.return&&q.return()}finally{if(h)throw u;}}}}return null}
function ma(a){for(var b="",e=0;e<a.length;e++)b+=a[e],0===e&&2===a.length?b+=" and ":e===a.length-2&&2<a.length?b+=", and ":e<a.length-1&&(b+=", ");return b}function la(a){return"object"===typeof a&&null!==a&&!Array.isArray(a)&&"string"===typeof a.type}function ea(a,b){return a.range[0]<=b.range[0]&&a.range[1]>=b.range[1]}
module.exports={rules:{"rules-of-hooks":{create:function(a){var b=[],e=[];return{onCodePathSegmentStart:function(a){return e.push(a)},onCodePathSegmentEnd:function(){return e.pop()},onCodePathStart:function(){return b.push(new Map)},onCodePathEnd:function(e,h){function f(a){var b=f.cache,c=b.get(a.id);if(null===c){if(!n.has(a.id)){n.add(a.id);b=!0;c=!1;var d=void 0;try{for(var m=a.prevSegments[Symbol.iterator](),r;!(b=(r=m.next()).done);b=!0)f(r.value)}catch(K){c=!0,d=K}finally{try{!b&&m.return&&
m.return()}finally{if(c)throw d;}}}return 0}if(void 0!==c)return c;b.set(a.id,null);if(e.thrownSegments.includes(a))c=0;else if(0===a.prevSegments.length)c=1;else{c=0;m=!0;r=!1;var H=void 0;try{d=a.prevSegments[Symbol.iterator]();for(var k;!(m=(k=d.next()).done);m=!0)c+=f(k.value)}catch(K){r=!0,H=K}finally{try{!m&&d.return&&d.return()}finally{if(r)throw H;}}}a.reachable&&0===c?b.delete(a.id):b.set(a.id,c);return c}function q(a){var b=q.cache,c=b.get(a.id);if(null===c){if(!n.has(a.id)){n.add(a.id);
b=!0;c=!1;var d=void 0;try{for(var m=a.nextSegments[Symbol.iterator](),r;!(b=(r=m.next()).done);b=!0)q(r.value)}catch(K){c=!0,d=K}finally{try{!b&&m.return&&m.return()}finally{if(c)throw d;}}}return 0}if(void 0!==c)return c;b.set(a.id,null);if(e.thrownSegments.includes(a))c=0;else if(0===a.nextSegments.length)c=1;else{c=0;m=!0;r=!1;var H=void 0;try{d=a.nextSegments[Symbol.iterator]();for(var f;!(m=(f=d.next()).done);m=!0)c+=q(f.value)}catch(K){r=!0,H=K}finally{try{!m&&d.return&&d.return()}finally{if(r)throw H;
}}}b.set(a.id,c);return c}function t(a){var c=t.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=!0,m=!1,r=void 0;try{for(var H=a.prevSegments[Symbol.iterator](),e;!(d=(e=H.next()).done);d=!0){var f=t(e.value);f<b&&(b=f)}}catch(na){m=!0,r=na}finally{try{!d&&H.return&&H.return()}finally{if(m)throw r;}}b+=1}c.set(a.id,b);return b}var c=b.pop();if(0!==c.size){var n=new Set;f.cache=new Map;q.cache=new Map;t.cache=
new Map;var C=q(e.initialSegment),g=ca(h),v=ba(h),A=g?aa(g)||R(g):!1,B=Infinity,l=!0,p=!1,G=void 0;try{for(var w=e.finalSegments[Symbol.iterator](),J;!(l=(J=w.next()).done);l=!0){var W=J.value;if(W.reachable){var Q=t(W);Q<B&&(B=Q)}}}catch(k){p=!0,G=k}finally{try{!l&&w.return&&w.return()}finally{if(p)throw G;}}l=!0;p=!1;G=void 0;try{for(var z=c[Symbol.iterator](),O;!(l=(O=z.next()).done);l=!0){var E=O.value,D=E[0],L=E[1];if(D.reachable){var I=0===D.nextSegments.length?B<=t(D):B<t(D),T=f(D)*q(D),F=
n.has(D.id);c=!0;w=!1;J=void 0;try{for(var x=L[Symbol.iterator](),M;!(c=(M=x.next()).done);c=!0){var y=M.value;F&&a.report({node:y,message:'React Hook "'+a.getSource(y)+'" 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(!F&&T!==C){var U='React Hook "'+a.getSource(y)+'" is called conditionally. React Hooks must be called in the exact same order in every component render.'+(I?" Did you accidentally call a React Hook after an early return?":
"");a.report({node:y,message:U})}}else if(!h.parent||"MethodDefinition"!==h.parent.type&&"ClassProperty"!==h.parent.type||h.parent.value!==h)if(g){var N='React Hook "'+a.getSource(y)+'" is called in '+('function "'+a.getSource(g)+'" ')+"which is neither a React function component or a custom React Hook function.";a.report({node:y,message:N})}else if("Program"!==h.type&&v){var P='React Hook "'+a.getSource(y)+'" 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:y,message:P})}}}catch(k){w=!0,J=k}finally{try{!c&&x.return&&x.return()}finally{if(w)throw J;}}}}}catch(k){p=!0,G=k}finally{try{!l&&z.return&&z.return()}finally{if(p)throw G;}}}},CallExpression:function(a){if(R(a.callee)){var f=b[b.length-1],u=e[e.length-1],q=f.get(u);q||(q=[],f.set(u,q));q.push(a.callee)}}}}},"exhaustive-deps":{meta:{fixable:"code",schema:[{type:"object",additionalProperties:!1,properties:{additionalHooks:{type:"string"}}}]},create:function(a){function b(a,b){return function(c){if(b.has(c))return b.get(c);
var e=a(c);b.set(c,e);return e}}function e(c){function e(a){var d=!0,r=!1,b=void 0;try{for(var f=a.references[Symbol.iterator](),h;!(d=(h=f.next()).done);d=!0){var g=h.value;if(g.resolved&&G.has(g.resolved.scope)){var l=Y(c,g.identifier),k=fa(l),p=X(k),q;if(q=B&&"Identifier"===k.type&&"MemberExpression"===k.parent.type&&!k.parent.computed&&"Identifier"===k.parent.property.type&&"current"===k.parent.property.name){for(var n=g.from,u=!1;n.block!==c;)"function"===n.type&&(u=null!=n.block.parent&&"ReturnStatement"===
n.block.parent.type),n=n.upper;q=u}q&&Q.set(p,{reference:g,dependencyNode:k});var t=g.resolved.defs[0];if(null==t||null==t.node||t.node.init!==c.parent)if(z.has(p))z.get(p).references.push(g);else{var v=g.resolved,y=J(v)||W(v);z.set(p,{isStatic:y,references:[g]})}}}}catch(Z){r=!0,b=Z}finally{try{!d&&f.return&&f.return()}finally{if(r)throw b;}}d=!0;r=!1;b=void 0;try{for(var w=a.childScopes[Symbol.iterator](),x;!(d=(x=w.next()).done);d=!0)e(x.value)}catch(Z){r=!0,b=Z}finally{try{!d&&w.return&&w.return()}finally{if(r)throw b;
}}}function C(a,b,r,c){return 0===a.size?null:(1<a.size?"":b+" ")+r+" "+(1<a.size?"dependencies":"dependency")+": "+ma(Array.from(a).sort().map(function(a){return"'"+a+"'"}))+(". Either "+c+" "+(1<a.size?"them":"it")+" or remove the dependency array.")}if(("FunctionExpression"===c.type||"ArrowFunctionExpression"===c.type)&&"CallExpression"===c.parent.type){var g=ka(c.parent.callee,f);if(c.parent.arguments[g]===c){var v=c.parent.callee,A=ja(v).name,B=A.endsWith("Effect"),l=c.parent.arguments[g+1];
if(l||B){B&&c.async&&a.report({node:c,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(),G=new Set,w=null;for(g=p.upper;g;){G.add(g);
if("function"===g.type)break;g=g.upper}if(g){w=g;var J=b(function(a){if(!Array.isArray(a.defs))return!1;var d=a.defs[0];if(null==d||"VariableDeclarator"!==d.node.type)return!1;var b=d.node.init;if(null==b)return!1;var c=d.node.parent;if(null==c&&(Y(w.block,d.node.id),c=d.node.parent,null==c))return!1;if("const"===c.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;d=d.node.id;b=b.name;if("useRef"===b&&"Identifier"===d.type)return!0;if(("useState"===b||"useReducer"===b)&&"ArrayPattern"===d.type&&2===d.elements.length&&Array.isArray(a.identifiers)){if(d.elements[1]===a.identifiers[0]){if("useState"===b)for(a=a.references,b=0;b<a.length;b++)h.set(a[b].identifier,d.elements[0]);return!0}if(d.elements[0]===a.identifiers[0]&&"useState"===b)for(a=a.references,d=
0;d<a.length;d++)u.add(a[d].identifier)}return!1},q),W=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 b=a.node,d=w.childScopes;a=null;var c;for(c=0;c<d.length;c++){var e=d[c],f=e.block;if("FunctionDeclaration"===b.type&&f===b||"VariableDeclarator"===b.type&&f.parent===b){a=e;break}}if(null==a)return!1;for(c=0;c<a.through.length;c++)if(b=a.through[c],null!=b.resolved&&G.has(b.resolved.scope)&&!J(b.resolved))return!1;return!0},t),
Q=new Map,z=new Map;e(p);Q.forEach(function(b,c){var d=b.dependencyNode;b=b.reference.resolved.references;for(var e=!1,f=0;f<b.length;f++){var m=b[f].identifier.parent;if(null!=m&&"MemberExpression"===m.type&&!m.computed&&"Identifier"===m.property.type&&"current"===m.property.name&&"AssignmentExpression"===m.parent.type&&m.parent.left===m){e=!0;break}}e||a.report({node:d.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 O=new Set,E=new Set;z.forEach(function(b,c){var d=b.references;b.isStatic&&E.add(c);d.forEach(function(b){b.writeExpr&&(b=b.writeExpr,O.has(c)||(O.add(c),a.report({node:b,message:"Assignments to the '"+c+"' variable from inside React Hook "+(a.getSource(v)+" 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(v)+".")})))})});if(!(0<O.size))if(l){var D=[],L=new Set;"ArrayExpression"!==l.type?a.report({node:l,message:"React Hook "+a.getSource(v)+" was passed a dependency list that is not an array literal. This means we can't statically verify whether you've passed the correct dependencies."}):l.elements.forEach(function(b){if(null!==b)if("SpreadElement"===b.type)a.report({node:b,message:"React Hook "+a.getSource(v)+" has a spread element in its dependency array. This means we can't statically verify whether you've passed the correct dependencies."});
else{var c=void 0;try{c=X(b)}catch(ia){if(/Unsupported node type/.test(ia.message)){"Literal"===b.type?z.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(v)+" has a complex expression in the dependency array. Extract it to a separate variable so it can be statically checked."});
return}throw ia;}for(var d=b;"MemberExpression"===d.type;)d=d.object;var e=!w.through.some(function(a){return a.identifier===d});D.push({key:c,node:b});e||L.add(c)}});var I=V({dependencies:z,declaredDependencies:D,optionalDependencies:E,externalDependencies:L,isEffect:B}),T=I.suggestedDependencies;g=I.unnecessaryDependencies;var F=I.missingDependencies;I=I.duplicateDependencies;if(0===I.size+F.size+g.size)da({declaredDependencies:D,declaredDependenciesNode:l,componentScope:w,scope:p}).forEach(function(b){var c=
b.fn,d=b.suggestUseCallback;b="The '"+c.name.name+"' function makes the dependencies of "+(A+" Hook (at line "+l.loc.start.line+") ")+"change on every render.";b=d?b+(" To fix this, "+("wrap the '"+c.name.name+"' definition into its own useCallback() Hook.")):b+(" Move it inside the "+A+" callback. "+("Alternatively, wrap the '"+c.name.name+"' definition into its own useCallback() Hook."));a.report({node:c.node,message:b,fix:function(a){if(d&&"Variable"===c.type)return[a.insertTextBefore(c.node.init,
"useCallback("),a.insertTextAfter(c.node.init,")")]}})});else{!B&&0<F.size&&(T=V({dependencies:z,declaredDependencies:[],optionalDependencies:E,externalDependencies:L,isEffect:B}).suggestedDependencies);(function(){if(0===D.length)return!0;var a=D.map(function(a){return a.key}),b=a.slice().sort();return a.join(",")===b.join(",")})()&&T.sort();var x="";if(0<g.size){var M=null;Array.from(g.keys()).forEach(function(a){null===M&&a.endsWith(".current")&&(M=a)});if(null!==M)x=" Mutable values like '"+M+
"' aren't valid dependencies because mutating them doesn't re-render the component.";else if(0<L.size){var y=Array.from(L)[0];p.set.has(y)||(x=" Outer scope values like '"+y+"' aren't valid dependencies because mutating them doesn't re-render the component.")}}if(!x&&F.has("props")){p=z.get("props");if(null==p)return;p=p.references;if(!Array.isArray(p))return;y=!0;for(var U=0;U<p.length;U++){var N=Y(w.block,p[U].identifier);if(!N){y=!1;break}N=N.parent;if(null==N){y=!1;break}if("MemberExpression"!==
N.type){y=!1;break}}y&&(x=" 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(v)+"."))}if(!x&&0<F.size){var P=null;F.forEach(function(a){if(!P){var b=w.set.get(a),c=z.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&&(P=a)}}});null!==P&&(x=" If '"+P+"' changes too often, find the parent component that defines it and wrap that definition in useCallback.")}if(!x&&0<F.size){var k=null;F.forEach(function(a){if(null===k)for(var b=z.get(a).references,c,d,e=0;e<b.length;e++){c=b[e].identifier;for(d=c.parent;null!=d&&d!==w.block;){if("CallExpression"===d.type){var f=h.get(d.callee);if(null!=f){f.name===a?k={missingDep:a,setter:d.callee.name,
form:"updater"}:u.has(c)?k={missingDep:a,setter:d.callee.name,form:"reducer"}:(c=b[e].resolved,null!=c&&(c=c.defs[0],null!=c&&"Parameter"===c.type&&(k={missingDep:a,setter:d.callee.name,form:"inlineReducer"})));break}}d=d.parent}if(null!==k)break}});if(null!==k)switch(k.form){case "reducer":x=" You can also replace multiple useState variables with useReducer "+("if '"+k.setter+"' needs the ")+("current value of '"+k.missingDep+"'.");break;case "inlineReducer":x=" If '"+k.setter+"' needs the "+("current value of '"+
k.missingDep+"', ")+"you can also switch to useReducer instead of useState and "+("read '"+k.missingDep+"' in the reducer.");break;case "updater":x=" You can also do a functional update '"+k.setter+"("+k.missingDep.substring(0,1)+" => ...)' if you only need '"+k.missingDep+"'"+(" in the '"+k.setter+"' call.");break;default:throw Error("Unknown case.");}}a.report({node:l,message:"React Hook "+a.getSource(v)+" has "+(C(F,"a","missing","include")||C(g,"an","unnecessary","exclude")||C(I,"a","duplicate",
"omit"))+x,fix:function(a){return a.replaceText(l,"["+T.join(", ")+"]")}})}}else{var S=null;z.forEach(function(a,b){S||a.references.forEach(function(a){if(!S&&h.has(a.identifier)){for(a=a.from;"function"!==a.type;)a=a.upper;a.block===c&&(S=b)}})});if(S){var ha=V({dependencies:z,declaredDependencies:[],optionalDependencies:E,externalDependencies:new Set,isEffect:!0}).suggestedDependencies;a.report({node:c.parent.callee,message:"React Hook "+A+" contains a call to '"+S+"'. Without a list of dependencies, this can lead to an infinite chain of updates. To fix this, pass ["+
ha.join(", ")+("] as a second argument to the "+A+" Hook."),fix:function(a){return a.insertTextAfter(c,", ["+ha.join(", ")+"]")}})}}}}else"useMemo"!==A&&"useCallback"!==A||a.report({node:c.parent.callee,message:"React Hook "+A+" does nothing when called with only one argument. Did you forget to pass an array of dependencies?"})}}}var f={additionalHooks:a.options&&a.options[0]&&a.options[0].additionalHooks?new RegExp(a.options[0].additionalHooks):void 0},h=new WeakMap,u=new WeakSet,q=new WeakMap,t=
new WeakMap;return{FunctionExpression:e,ArrowFunctionExpression:e}}}}};
{
"name": "eslint-plugin-react-hooks",
"description": "ESLint rules for React Hooks",
"version": "0.0.0-679402a66",
"version": "0.0.0-6da04b5d8",
"repository": {

@@ -6,0 +6,0 @@ "type": "git",

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