eslint-plugin-qwik
Advanced tools
Comparing version 0.17.5 to 0.18.0
@@ -1,1 +0,5 @@ | ||
"use strict";var D=Object.create;var x=Object.defineProperty;var P=Object.getOwnPropertyDescriptor;var X=Object.getOwnPropertyNames;var _=Object.getPrototypeOf,j=Object.prototype.hasOwnProperty;var z=(t,e)=>{for(var o in e)x(t,o,{get:e[o],enumerable:!0})},R=(t,e,o,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of X(e))!j.call(t,i)&&i!==o&&x(t,i,{get:()=>e[i],enumerable:!(n=P(e,i))||n.enumerable});return t};var M=(t,e,o)=>(o=t!=null?D(_(t)):{},R(e||!t||!t.__esModule?x(o,"default",{value:t,enumerable:!0}):o,t)),U=t=>R(x({},"__esModule",{value:!0}),t);var oe={};z(oe,{configs:()=>te,rules:()=>ee});module.exports=U(oe);var C=require("@typescript-eslint/utils"),y=M(require("typescript")),B=C.ESLintUtils.RuleCreator(t=>`https://typescript-eslint.io/rules/${t}`),k=B({name:"valid-lexical-scope",defaultOptions:[{allowAny:!0}],meta:{type:"problem",docs:{description:"Used the tsc typechecker to detect the capture of unserializable data in dollar ($) scopes.",recommended:"error"},schema:[{type:"object",properties:{allowAny:{type:"boolean"}},default:{allowAny:!0}}],messages:{referencesOutside:'Identifier ("{{varName}}") can not be captured inside the scope ({{dollarName}}) because {{reason}}. Check out https://qwik.builder.io/docs/advanced/dollar/ for more details.',unvalidJsxDollar:"JSX attributes that end with $ can only take an inlined arrow function of a QRL identifier. Make sure the value is created using $()",mutableIdentifier:'The value of the identifier ("{{varName}}") can not be changed once it is captured the scope ({{dollarName}}). Check out https://qwik.builder.io/docs/advanced/dollar/ for more details.'}},create(t){var N;let o={allowAny:((N=t.options[0])==null?void 0:N.allowAny)??!0},n=t.getSourceCode().scopeManager,i=C.ESLintUtils.getParserServices(t),s=i.esTreeNodeToTSNodeMap,l=i.program.getTypeChecker(),m=new Map,A=[];function E(u){u.references.forEach(r=>{var g,b;let a=r.resolved,c=(g=r.resolved)==null?void 0:g.scope;if(a&&c){let d=(b=a.defs.at(0))==null?void 0:b.type;if(d==="Type"||d==="ImportBinding")return;let p=r.from,f;for(;p&&(f=m.get(p),!f);)p=p.upper;if(p&&f){let I=c.type;if(I==="global")return;if(I==="module"){let w=a.identifiers.length===1?a.identifiers[0]:r.identifier,q=s.get(w),L=l.getSymbolAtLocation(q);if(L&&A.includes(L))return;t.report({messageId:"referencesOutside",node:r.identifier,data:{varName:r.identifier.name,dollarName:f,reason:"it's declared at the root of the module and it is not exported. Add export"}});return}let S=r.identifier,$=s.get(S),h=c;for(;h&&!m.has(h);)h=h.upper;if(h!==p){S.parent&&S.parent.type==="AssignmentExpression"&&S.parent.left===S&&t.report({messageId:"mutableIdentifier",node:r.identifier,data:{varName:r.identifier.name,dollarName:f}});let w=W(l,$,r.identifier,o);w&&t.report({messageId:"referencesOutside",node:r.identifier,data:{varName:r.identifier.name,dollarName:f,reason:Q(w)}})}}}}),u.childScopes.forEach(E)}return{CallExpression(u){if(u.callee.type==="Identifier"&&u.callee.name.endsWith("$")){let r=u.arguments.at(0);if(r&&r.type==="ArrowFunctionExpression"){let a=n.acquire(r);a&&m.set(a,u.callee.name)}}},JSXAttribute(u){let r=u.name,a=r.type==="JSXIdentifier"?r.name:r.name.name;if(a.endsWith("$")){let c=u.value;if(c&&c.type==="JSXExpressionContainer"){let g=n.acquire(c.expression);if(g)m.set(g,a);else if(c.expression.type==="Identifier"){let b=s.get(c.expression),d=l.getTypeAtLocation(b);v(d)||t.report({messageId:"unvalidJsxDollar",node:c.expression})}}}},Program(u){let r=s.get(u),a=l.getSymbolAtLocation(r);a&&(A=l.getExportsOfModule(a))},"Program:exit"(){E(n.globalScope)}}}});function W(t,e,o,n){let i=t.getTypeAtLocation(e);return V(t,i,e,o,n,new Set)}function Q(t){let e="";return t.location?e+=`"${t.location}" `:e+="it ",e+=`${t.reason}`,e}function V(t,e,o,n,i,s){let l=T(t,e,o,i,0,s);if(l){let m=l.location;return m&&(l.location=`${n.name}.${m}`),l}return l}function T(t,e,o,n,i,s){if(s.has(e)||(s.add(e),e.getProperty("__no_serialize__")))return;if(e.flags&y.default.TypeFlags.Unknown)return{type:e,typeStr:t.typeToString(e),reason:"is unknown, which could be serializable or not, please make the type for specific"};let m=e.flags&y.default.TypeFlags.Any;if(!n.allowAny&&m)return{type:e,typeStr:t.typeToString(e),reason:"is any, which is not serializable"};if(e.flags&y.default.TypeFlags.BigIntLike)return{type:e,typeStr:t.typeToString(e),reason:"is BigInt and it is not supported yet, use a number instead"};if(e.flags&y.default.TypeFlags.ESSymbolLike)return{type:e,typeStr:t.typeToString(e),reason:"is Symbol, which is not serializable"};if(e.flags&y.default.TypeFlags.EnumLike)return{type:e,typeStr:t.typeToString(e),reason:"is an enum, use an string or a number instead"};if(v(e))return;if(e.getCallSignatures().length>0)return e.symbol.name==="PropFnInterface"?void 0:{type:e,typeStr:t.typeToString(e),reason:"is a function, which is not serializable"};if(e.isUnion()){for(let a of e.types){let c=T(t,a,o,n,i+1,s);if(c)return c}return}if((e.flags&y.default.TypeFlags.Object)!==0){let a=Z(e,t);if(a)return T(t,a,o,n,i+1,s);let c=G(e,t);if(c){for(let d of c){let p=T(t,d,o,n,i+1,s);if(p)return p}return}let g=e.symbol.name;if(e.getProperty("nextElementSibling")||e.getProperty("activeElement")||H[g])return;if(e.isClass())return{type:e,typeStr:t.typeToString(e),reason:`is an instance of the "${e.symbol.name}" class, which is not serializable. Use a simple object literal instead`};let b=e.getProperty("prototype");if(b){let d=t.getTypeOfSymbolAtLocation(b,o);if(d.isClass())return{type:d,typeStr:t.typeToString(d),reason:"is a class constructor, which is not serializable"}}if(!g.startsWith("__")&&e.symbol.valueDeclaration)return{type:e,typeStr:t.typeToString(e),reason:`is an instance of the "${e.symbol.name}" class, which is not serializable`};for(let d of e.getProperties()){let p=Y(t,d,o,n,i+1,s);if(p){let f=p.location;return p.location=`${d.name}${f?`.${f}`:""}`,p}}}}function Y(t,e,o,n,i,s){let l=t.getTypeOfSymbolAtLocation(e,o);return T(t,l,o,n,i,s)}function Z(t,e){return e.getElementTypeOfArrayType(t)}function G(t,e){return e.isTupleType(t)?e.getTypeArguments(t):void 0}function v(t){return!!(t.flags&y.default.TypeFlags.Any)||!!t.getProperty("__brand__QRL__")}var H={Promise:!0,URL:!0,RegExp:!0,Date:!0,FormData:!0,URLSearchParams:!0,Error:!0};var O={meta:{type:"problem",docs:{description:"Object destructuring is not recommended for component$",category:"Variables",recommended:!0,url:"https://github.com/BuilderIO/qwik"}},create(t){let e=[];return{ArrowFunctionExpression(){e.push({await:!1})},"ArrowFunctionExpression:exit"(){e.pop()},AwaitExpression(){let o=e[e.length-1];o&&(o.await=!0)},"CallExpression[callee.name=/^use[A-Z]/]"(o){let n=e[e.length-1];n&&n.await&&t.report({node:o,message:"Calling use* methods after await is not safe."})}}}};var F={meta:{type:"problem",docs:{description:"Detect multiple JSX roots inside a component",recommended:!0,url:"https://github.com/BuilderIO/qwik"},messages:{multipleJsxRoots:"Components in Qwik must have a single JSX root element. Your component has multiple roots on lines: {{lines}}. Rewrite your component with a single root such as (`return <>{...}</>`.) and keep all JSX within"}},create(t){let e=[];return{ArrowFunctionExpression(){e.push({rootNodes:[],depth:0})},"ArrowFunctionExpression:exit"(){let o=e[e.length-1];if(o&&o.rootNodes.length>1){let n=o.rootNodes.map(i=>{var s;return((s=i.loc)==null?void 0:s.start.line)??0}).join(", ");t.report({node:o.rootNodes[0],messageId:"multipleJsxRoots",data:{lines:n}})}e.pop()},FunctionDeclaration(){e.push({rootNodes:[],depth:0})},"FunctionDeclaration:exit"(){e.pop()},"JSXElement,JSXFragment"(o){let n=e[e.length-1];n&&(n.depth===0&&n.rootNodes.push(o),n.depth++)},"JSXElement:exit"(){let o=e[e.length-1];o&&o.depth--},"JSXFragment:exit"(){let o=e[e.length-1];o&&o.depth--}}}};var J={meta:{type:"problem",docs:{description:"Detect declaration location of loader$",recommended:!0,url:"https://github.com/BuilderIO/qwik"},messages:{invalidLoaderLocation:'loader$() can only be declared in `layout.tsx`, `index.tsx` and `plugin.tsx` inside the `src/routes` directory, instead it was declared in "{{path}}". Please check the docs: https://qwik.builder.io/qwikcity/loader'}},create(t){let e=K(t.getFilename()),o=/\/layout(|!|-.+)\.tsx?$/.test(e),n=/\/index(|!|@.+)\.tsx?$/.test(e),s=/\/src\/routes\//.test(e)&&(n||o);return{CallExpression(l){!s&&l.callee.type==="Identifier"&&l.callee.name==="loader$"&&t.report({node:l.callee,messageId:"invalidLoaderLocation",data:{path:e}})}}}};function K(t){let e=/^\\\\\?\\/.test(t),o=/[^\u0000-\u0080]+/.test(t);return e||o||(t=t.replace(/\\/g,"/"),t.endsWith("/")&&(t=t.slice(0,t.length-1))),t}var ee={"no-use-after-await":O,"valid-lexical-scope":k,"single-jsx-root":F,"loader-location":J},te={recommended:{plugins:["qwik"],rules:{"qwik/no-use-after-await":"error","qwik/valid-lexical-scope":"error","qwik/loader-location":"error","qwik/single-jsx-root":"warn"}},strict:{plugins:["qwik"],rules:{"qwik/valid-lexical-scope":"error","qwik/no-use-after-await":"error","qwik/single-jsx-root":"error","qwik/loader-location":"error"}}};0&&(module.exports={configs,rules}); | ||
"use strict";var q=Object.create;var I=Object.defineProperty;var P=Object.getOwnPropertyDescriptor;var X=Object.getOwnPropertyNames;var _=Object.getPrototypeOf,j=Object.prototype.hasOwnProperty;var z=(t,e)=>{for(var n in e)I(t,n,{get:e[n],enumerable:!0})},v=(t,e,n,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of X(e))!j.call(t,s)&&s!==n&&I(t,s,{get:()=>e[s],enumerable:!(o=P(e,s))||o.enumerable});return t};var M=(t,e,n)=>(n=t!=null?q(_(t)):{},v(e||!t||!t.__esModule?I(n,"default",{value:t,enumerable:!0}):n,t)),U=t=>v(I({},"__esModule",{value:!0}),t);var ne={};z(ne,{configs:()=>te,rules:()=>ee});module.exports=U(ne);var E=require("@typescript-eslint/utils"),h=M(require("typescript")),B=E.ESLintUtils.RuleCreator(t=>`https://typescript-eslint.io/rules/${t}`),L=B({name:"valid-lexical-scope",defaultOptions:[{allowAny:!0}],meta:{type:"problem",docs:{description:"Used the tsc typechecker to detect the capture of unserializable data in dollar ($) scopes.",recommended:"error"},schema:[{type:"object",properties:{allowAny:{type:"boolean"}},default:{allowAny:!0}}],messages:{referencesOutside:'Identifier ("{{varName}}") can not be captured inside the scope ({{dollarName}}) because {{reason}}. Check out https://qwik.builder.io/docs/advanced/dollar/ for more details.',unvalidJsxDollar:"JSX attributes that end with $ can only take an inlined arrow function of a QRL identifier. Make sure the value is created using $()",mutableIdentifier:'The value of the identifier ("{{varName}}") can not be changed once it is captured the scope ({{dollarName}}). Check out https://qwik.builder.io/docs/advanced/dollar/ for more details.'}},create(t){var A;let n={allowAny:((A=t.options[0])==null?void 0:A.allowAny)??!0},o=t.getSourceCode().scopeManager,s=E.ESLintUtils.getParserServices(t),a=s.esTreeNodeToTSNodeMap,r=s.program.getTypeChecker(),l=new Map,p=[];function S(f){f.references.forEach(i=>{var y,b;let c=i.resolved,d=(y=i.resolved)==null?void 0:y.scope;if(c&&d){let m=(b=c.defs.at(0))==null?void 0:b.type;if(m==="Type"||m==="ImportBinding")return;let u=i.from,g;for(;u&&(g=l.get(u),!g);)u=u.upper;if(u&&g){let k=d.type;if(k==="global")return;if(k==="module"){let N=c.identifiers.length===1?c.identifiers[0]:i.identifier,J=a.get(N),C=r.getSymbolAtLocation(J);if(C&&p.includes(C))return;t.report({messageId:"referencesOutside",node:i.identifier,data:{varName:i.identifier.name,dollarName:g,reason:`it's declared at the root of the module and it is not exported. Make sure "${i.identifier.name}" is an exported identifier: | ||
export const ${i.identifier.name} = ... | ||
`}});return}let w=i.identifier,D=a.get(w),T=d;for(;T&&!l.has(T);)T=T.upper;if(T!==u){w.parent&&w.parent.type==="AssignmentExpression"&&w.parent.left===w&&t.report({messageId:"mutableIdentifier",node:i.identifier,data:{varName:i.identifier.name,dollarName:g}});let N=V(r,D,i.identifier,n);N&&t.report({messageId:"referencesOutside",node:i.identifier,data:{varName:i.identifier.name,dollarName:g,reason:W(N)}})}}}}),f.childScopes.forEach(S)}return{CallExpression(f){if(f.callee.type==="Identifier"&&f.callee.name.endsWith("$")){let i=f.arguments.at(0);if(i&&i.type==="ArrowFunctionExpression"){let c=o.acquire(i);c&&l.set(c,f.callee.name)}}},JSXAttribute(f){let i=f.name,c=i.type==="JSXIdentifier"?i.name:i.name.name;if(c.endsWith("$")){let d=f.value;if(d&&d.type==="JSXExpressionContainer"){let y=o.acquire(d.expression);if(y)l.set(y,c);else if(d.expression.type==="Identifier"){let b=a.get(d.expression),m=r.getTypeAtLocation(b);if(!R(m)){if(m.symbol.name==="PropFnInterface")return;t.report({messageId:"unvalidJsxDollar",node:d.expression})}}}}},Program(f){let i=a.get(f),c=r.getSymbolAtLocation(i);c&&(p=r.getExportsOfModule(c))},"Program:exit"(){S(o.globalScope)}}}});function V(t,e,n,o){let s=t.getTypeAtLocation(e);return Q(t,s,e,n,o,new Set)}function W(t){let e="";return t.location?e+=`"${t.location}" `:e+="it ",e+=`${t.reason}`,e}function Q(t,e,n,o,s,a){let r=x(t,e,n,s,0,a);if(r){let l=r.location;return l&&(r.location=`${o.name}.${l}`),r}return r}function x(t,e,n,o,s,a){if(a.has(e)||(a.add(e),e.getProperty("__no_serialize__")))return;if(e.flags&h.default.TypeFlags.Unknown)return{type:e,typeStr:t.typeToString(e),reason:"is unknown, which could be serializable or not, please make the type for specific"};let l=e.flags&h.default.TypeFlags.Any;if(!o.allowAny&&l)return{type:e,typeStr:t.typeToString(e),reason:"is any, which is not serializable"};if(e.flags&h.default.TypeFlags.BigIntLike)return{type:e,typeStr:t.typeToString(e),reason:"is BigInt and it is not supported yet, use a number instead"};if(e.flags&h.default.TypeFlags.ESSymbolLike)return{type:e,typeStr:t.typeToString(e),reason:"is Symbol, which is not serializable"};if(e.flags&h.default.TypeFlags.EnumLike)return{type:e,typeStr:t.typeToString(e),reason:"is an enum, use an string or a number instead"};if(R(e))return;if(e.getCallSignatures().length>0)return e.symbol.name==="PropFnInterface"?void 0:{type:e,typeStr:t.typeToString(e),reason:"is a function, which is not serializable"};if(e.isUnion()){for(let c of e.types){let d=x(t,c,n,o,s+1,a);if(d)return d}return}if((e.flags&h.default.TypeFlags.Object)!==0){let c=Z(e,t);if(c)return x(t,c,n,o,s+1,a);let d=G(e,t);if(d){for(let m of d){let u=x(t,m,n,o,s+1,a);if(u)return u}return}let y=e.symbol.name;if(e.getProperty("nextElementSibling")||e.getProperty("activeElement")||H[y])return;if(e.isClass())return{type:e,typeStr:t.typeToString(e),reason:`is an instance of the "${e.symbol.name}" class, which is not serializable. Use a simple object literal instead`};let b=e.getProperty("prototype");if(b){let m=t.getTypeOfSymbolAtLocation(b,n);if(m.isClass())return{type:m,typeStr:t.typeToString(m),reason:"is a class constructor, which is not serializable"}}if(!y.startsWith("__")&&e.symbol.valueDeclaration)return{type:e,typeStr:t.typeToString(e),reason:`is an instance of the "${e.symbol.name}" class, which is not serializable`};for(let m of e.getProperties()){let u=Y(t,m,n,o,s+1,a);if(u){let g=u.location;return u.location=`${m.name}${g?`.${g}`:""}`,u}}}}function Y(t,e,n,o,s,a){let r=t.getTypeOfSymbolAtLocation(e,n);return x(t,r,n,o,s,a)}function Z(t,e){return e.getElementTypeOfArrayType(t)}function G(t,e){return e.isTupleType(t)?e.getTypeArguments(t):void 0}function R(t){return!!(t.flags&h.default.TypeFlags.Any)||!!t.getProperty("__brand__QRL__")}var H={Promise:!0,URL:!0,RegExp:!0,Date:!0,FormData:!0,URLSearchParams:!0,Error:!0};var O={meta:{type:"problem",docs:{description:"Object destructuring is not recommended for component$",category:"Variables",recommended:!0,url:"https://github.com/BuilderIO/qwik"}},create(t){let e=[];return{ArrowFunctionExpression(){e.push({await:!1})},"ArrowFunctionExpression:exit"(){e.pop()},AwaitExpression(){let n=e[e.length-1];n&&(n.await=!0)},"CallExpression[callee.name=/^use[A-Z]/]"(n){let o=e[e.length-1];o&&o.await&&t.report({node:n,message:"Calling use* methods after await is not safe."})}}}};var $={meta:{type:"problem",docs:{description:"Detect multiple JSX roots inside a component",recommended:!0,url:"https://github.com/BuilderIO/qwik"},messages:{multipleJsxRoots:"Components in Qwik must have a single JSX root element. Your component has multiple roots on lines: {{lines}}. Rewrite your component with a single root such as (`return <>{...}</>`.) and keep all JSX within"}},create(t){let e=[];return{ArrowFunctionExpression(){e.push({rootNodes:[],depth:0})},"ArrowFunctionExpression:exit"(){let n=e[e.length-1];if(n&&n.rootNodes.length>1){let o=n.rootNodes.map(s=>{var a;return((a=s.loc)==null?void 0:a.start.line)??0}).join(", ");t.report({node:n.rootNodes[0],messageId:"multipleJsxRoots",data:{lines:o}})}e.pop()},FunctionDeclaration(){e.push({rootNodes:[],depth:0})},"FunctionDeclaration:exit"(){e.pop()},"JSXElement,JSXFragment"(n){let o=e[e.length-1];o&&(o.depth===0&&o.rootNodes.push(n),o.depth++)},"JSXElement:exit"(){let n=e[e.length-1];n&&n.depth--},"JSXFragment:exit"(){let n=e[e.length-1];n&&n.depth--}}}};var F={meta:{type:"problem",docs:{description:"Detect declaration location of loader$",recommended:!0,url:"https://github.com/BuilderIO/qwik"},messages:{invalidLoaderLocation:'`{{fnName}}()` can only be declared in `layout.tsx`, `index.tsx` and `plugin.tsx` inside the `src/routes` directory, instead it was declared in "{{path}}".\nPlease check the docs: https://qwik.builder.io/qwikcity/loader',missingExport:"The return of `{{fnName}}()` needs to be exported in the same module, like this\n```\nexport const {{id}} = {{fnName}}(() => { ... });\n```",wrongName:"The named export of `{{fnName}}()` needs to follow the `use*` naming convention. It must start with `use`, like this:\n```\nexport const {{fixed}} = {{fnName}}(() => { ... });\n```\nInstead it was named:\n```\nexport const {{id}} = ...\n```",recommendedValue:"For `{{fnName}}()` it is recommended to inline the arrow function. Instead of:\n```\nexport const {{id}} = {{fnName}}({{arg}});\n```\nDo this:\n```\nexport const {{id}} = {{fnName}}(() => { ...logic here... });\n```\nThis will help the optimizer make sure that no server code is leaked to the client build."}},create(t){let e=K(t.getFilename()),n=/\/layout(|!|-.+)\.tsx?$/.test(e),o=/\/index(|!|@.+)\.tsx?$/.test(e),a=/\/src\/routes\//.test(e)&&(o||n);return{CallExpression(r){if(r.callee.type!=="Identifier")return;let l=r.callee.name;if(l!=="loader$"&&l!=="action$")return;if(!a&&l==="loader$"){t.report({node:r.callee,messageId:"invalidLoaderLocation",data:{fnName:l,path:e}});return}let p=r.parent;if(p.type!=="VariableDeclarator"){t.report({node:r.callee,messageId:"missingExport",data:{fnName:l,id:"useStuff"}});return}if(p.id.type!=="Identifier"){t.report({node:r.callee,messageId:"missingExport",data:{fnName:l,id:"useStuff"}});return}if(!/^use/.test(p.id.name)){let S="use"+p.id.name[0].toUpperCase()+p.id.name.slice(1);t.report({node:p.id,messageId:"wrongName",data:{fnName:l,id:p.id.name,fixed:S}});return}if(p.parent.parent.type!=="ExportNamedDeclaration"){t.report({node:p.id,messageId:"missingExport",data:{fnName:l,id:p.id.name}});return}if(r.arguments.length>0&&r.arguments[0].type==="Identifier"){t.report({node:r.arguments[0],messageId:"recommendedValue",data:{fnName:l,id:p.id.name,arg:r.arguments[0].name}});return}}}}};function K(t){let e=/^\\\\\?\\/.test(t),n=/[^\u0000-\u0080]+/.test(t);return e||n||(t=t.replace(/\\/g,"/"),t.endsWith("/")&&(t=t.slice(0,t.length-1))),t}var ee={"no-use-after-await":O,"valid-lexical-scope":L,"single-jsx-root":$,"loader-location":F},te={recommended:{plugins:["qwik"],rules:{"qwik/no-use-after-await":"error","qwik/valid-lexical-scope":"error","qwik/loader-location":"warn","qwik/single-jsx-root":"warn"}},strict:{plugins:["qwik"],rules:{"qwik/valid-lexical-scope":"error","qwik/no-use-after-await":"error","qwik/single-jsx-root":"error","qwik/loader-location":"error"}}};0&&(module.exports={configs,rules}); |
{ | ||
"name": "eslint-plugin-qwik", | ||
"version": "0.17.5", | ||
"version": "0.18.0", | ||
"description": "An Open-Source sub-framework designed with a focus on server-side-rendering, lazy-loading, and styling/animation.", | ||
@@ -5,0 +5,0 @@ "main": "index.js", |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
11734
43