eslint-plugin-qwik 1.1.0 → 1.1.1

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.
Files changed (2) hide show
  1. package/index.js +1 -1
  2. package/package.json +1 -1
package/index.js CHANGED
@@ -13,7 +13,7 @@ ${Ir(t.symbol,e.getSourceCode().text)}
13
13
  Did you mean to wrap it in \`$()\`?
14
14
 
15
15
  ${c}
16
- `}return{type:t,typeStr:r.typeToString(t),reason:u}}if(t.isUnion()){for(let h of t.types){let u=D(e,r,h,n,o,a+1,i);if(u)return u}return}if((t.flags&w.default.TypeFlags.Object)!==0){let h=zn(t,r);if(h)return D(e,r,h,n,o,a+1,i);let u=Gn(t,r);if(u){for(let m of u){let b=D(e,r,m,n,o,a+1,i);if(b)return b}return}let c=t.symbol.name;if(t.getProperty("nextElementSibling")||t.getProperty("activeElement")||Kn[c])return;if(t.isClass())return{type:t,typeStr:r.typeToString(t),reason:`is an instance of the "${t.symbol.name}" class, which is not serializable. Use a simple object literal instead`};let S=t.getProperty("prototype");if(S){let m=r.getTypeOfSymbolAtLocation(S,n);if(m.isClass())return{type:m,typeStr:r.typeToString(m),reason:"is a class constructor, which is not serializable"}}if(!c.startsWith("__")&&t.symbol.valueDeclaration)return{type:t,typeStr:r.typeToString(t),reason:`is an instance of the "${t.symbol.name}" class, which is not serializable`};for(let m of t.getProperties()){let b=Wn(e,r,m,n,o,a+1,i);if(b){let O=b.location;return b.location=`${m.name}${O?`.${O}`:""}`,b}}}}function Wn(e,r,t,n,o,a,i){let s=r.getTypeOfSymbolAtLocation(t,n);return D(e,r,s,n,o,a,i)}function zn(e,r){return r.getElementTypeOfArrayType(e)}function Gn(e,r){return r.isTupleType(e)?r.getTypeArguments(e):void 0}function jr(e){return!!(e.flags&w.default.TypeFlags.Any)||!!e.getProperty("__brand__QRL__")}function Ir(e,r){if(e.declarations&&e.declarations.length>0){let t=e.declarations[0],n=r.slice(t.pos,t.end).replace(/^\s*$/gm,"");return ye(n,2)}return""}var Kn={Promise:!0,URL:!0,RegExp:!0,Date:!0,FormData:!0,URLSearchParams:!0,Error:!0};var Fr={meta:{type:"problem",docs:{description:"Object destructuring is not recommended for component$",category:"Variables",recommended:!0,url:"https://github.com/BuilderIO/qwik"},messages:{"use-after-await":"Calling use* methods after await is not safe.","use-wrong-function":"Calling use* methods in wrong function.","use-not-root":"Calling use* methods in non-root component."}},create(e){if(e.getSourceCode().getAllComments().some(n=>n.value.includes("@jsxImportSource")))return{};let t=[];return{ArrowFunctionExpression(){t.push({await:!1})},"ArrowFunctionExpression:exit"(n){t.pop()},AwaitExpression(){let n=t[t.length-1];n&&(n.await=!0)},"CallExpression[callee.name=/^use[A-Z]/]"(n){var i,s;let o=t[t.length-1];o&&o.await&&e.report({node:n,messageId:"use-after-await"});let a=n;for(;a=a.parent;)switch(a.type){case"VariableDeclarator":case"VariableDeclaration":case"ExpressionStatement":case"MemberExpression":case"BinaryExpression":case"UnaryExpression":case"ReturnStatement":case"BlockStatement":case"ChainExpression":case"Property":case"ObjectExpression":case"CallExpression":break;case"ArrowFunctionExpression":case"FunctionExpression":if(a.parent.type==="VariableDeclarator"&&((i=a.parent.id)==null?void 0:i.type)==="Identifier"&&a.parent.id.name.startsWith("use")||a.parent.type==="CallExpression"&&a.parent.callee.type==="Identifier"&&a.parent.callee.name==="component$")return;e.report({node:n,messageId:"use-wrong-function"});return;case"FunctionDeclaration":(s=a.id)!=null&&s.name.startsWith("use")||e.report({node:n,messageId:"use-wrong-function"});return;default:e.report({node:n,messageId:"use-not-root"});return}}}}};var qr={loader$:!0,routeLoader$:!0,routeAction$:!0,routeHandler$:!0},Hn={...qr,action$:!0,globalAction$:!0},Cr={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(e){let r=Yn(e.getFilename()),t=/\/layout(|!|-.+)\.tsx?$/.test(r),n=/\/index(|!|@.+)\.tsx?$/.test(r),o=/\/plugin(|@.+)\.tsx?$/.test(r),i=/\/src\/routes\//.test(r)&&(n||t||o);return{CallExpression(s){if(s.callee.type!=="Identifier")return;let f=s.callee.name;if(!Hn[f])return;if(!i&&qr[f]){e.report({node:s.callee,messageId:"invalidLoaderLocation",data:{fnName:f,path:r}});return}let d=s.parent;if(d.type!=="VariableDeclarator"){e.report({node:s.callee,messageId:"missingExport",data:{fnName:f,id:"useStuff"}});return}if(d.id.type!=="Identifier"){e.report({node:s.callee,messageId:"missingExport",data:{fnName:f,id:"useStuff"}});return}if(!/^use/.test(d.id.name)){let g="use"+d.id.name[0].toUpperCase()+d.id.name.slice(1);e.report({node:d.id,messageId:"wrongName",data:{fnName:f,id:d.id.name,fixed:g}});return}if(d.parent.parent.type!=="ExportNamedDeclaration"){e.report({node:d.id,messageId:"missingExport",data:{fnName:f,id:d.id.name}});return}if(s.arguments.length>0&&s.arguments[0].type==="Identifier"){e.report({node:s.arguments[0],messageId:"recommendedValue",data:{fnName:f,id:d.id.name,arg:s.arguments[0].name}});return}}}}};function Yn(e){let r=/^\\\\\?\\/.test(e),t=/[^\u0000-\u0080]+/.test(e);return r||t||(e=e.replace(/\\/g,"/"),e.endsWith("/")&&(e=e.slice(0,e.length-1))),e}var hr=V(pe()),ps=[{from:"className",to:"class"},{from:"htmlFor",to:"for"}];var On={meta:{type:"problem",docs:{recommended:"warn",description:"Disallow usage of React-specific `className`/`htmlFor` props."},fixable:"code",schema:[],messages:{prefer:"Prefer the `{{ to }}` prop over the deprecated `{{ from }}` prop."}},create(e){return e.getSourceCode().getAllComments().some(t=>t.value.includes("@jsxImportSource"))?{}:{JSXOpeningElement(t){for(let{from:n,to:o}of ps){let a=hr.default.getProp(t.attributes,n);if(a){let i=hr.default.hasProp(t.attributes,o,{ignoreCase:!1})?void 0:s=>s.replaceText(a.name,o);e.report({node:a,messageId:"prefer",data:{from:n,to:o},fix:i})}}}}}};var br=V(pe()),_n={meta:{type:"problem",docs:{recommended:!1,description:"Enforce using the classlist prop over importing a classnames helper. The classlist prop accepts an object `{ [class: string]: boolean }` just like classnames."},fixable:"code",schema:[{type:"object",properties:{classnames:{type:"array",description:"An array of names to treat as `classnames` functions",default:["cn","clsx","classnames"],items:{type:"string",minItems:1,uniqueItems:!0}}},additionalProperties:!1}],messages:{preferClasslist:"The classlist prop should be used instead of {{ classnames }} to efficiently set classes based on an object."}},create(e){var n;if(e.getSourceCode().getAllComments().some(o=>o.value.includes("@jsxImportSource")))return{};let t=((n=e.options[0])==null?void 0:n.classnames)??["cn","clsx","classnames"];return{JSXAttribute(o){var a,i;if(!(["class","className"].indexOf(br.default.propName(o))===-1||br.default.hasProp((a=o.parent)==null?void 0:a.attributes,"classlist",{ignoreCase:!1}))&&((i=o.value)==null?void 0:i.type)==="JSXExpressionContainer"){let s=o.value.expression;s.type==="CallExpression"&&s.callee.type==="Identifier"&&t.indexOf(s.callee.name)!==-1&&s.arguments.length===1&&s.arguments[0].type==="ObjectExpression"&&e.report({node:o,messageId:"preferClasslist",data:{classnames:s.callee.name},fix:f=>{let d=o.range,g=s.arguments[0].range;return[f.replaceTextRange([d[0],g[0]],"classlist={"),f.replaceTextRange([g[1],d[1]],"}")]}})}}}}};var Tn=require("@typescript-eslint/utils"),{getStaticValue:cs}=Tn.ASTUtils,fs=/^[\u0000-\u001F ]*j[\r\n\t]*a[\r\n\t]*v[\r\n\t]*a[\r\n\t]*s[\r\n\t]*c[\r\n\t]*r[\r\n\t]*i[\r\n\t]*p[\r\n\t]*t[\r\n\t]*:/i,jn={meta:{type:"problem",docs:{recommended:"error",description:"Disallow javascript: URLs.",url:"https://github.com/solidjs-community/eslint-plugin-solid/blob/main/docs/jsx-no-script-url.md"},schema:[],messages:{noJSURL:"For security, don't use javascript: URLs. Use event handlers instead if you can."}},create(e){return{JSXAttribute(r){if(r.name.type==="JSXIdentifier"&&r.value){let t=cs(r.value.type==="JSXExpressionContainer"?r.value.expression:r.value,e.getScope());t&&typeof t.value=="string"&&fs.test(t.value)&&e.report({node:r.value,messageId:"noJSURL"})}}}}};var Er=V(pe());function Sr(e){return e.type==="FunctionExpression"||e.type==="ArrowFunctionExpression"}var ce={checkFragmentShorthand:!1,checkKeyMustBeforeSpread:!1,warnOnDuplicates:!1},ds={missingIterKey:'Missing "key" prop for element in iterator',missingIterKeyUsePrag:'Missing "key" prop for element in iterator. The key prop allows for improved rendering performance. Shorthand fragment syntax does not support providing keys. Use <Fragment> instead',missingArrayKey:'Missing "key" prop for element in array. The key prop allows for improved rendering performance.',missingArrayKeyUsePrag:'Missing "key" prop for element in array. The key prop allows for improved rendering performance. Shorthand fragment syntax does not support providing keys. Use <Fragment> instead',nonUniqueKeys:"`key` prop must be unique"},In={meta:{docs:{description:"Disallow missing `key` props in iterators/collection literals",category:"Possible Errors",recommended:!0},messages:ds,schema:[{type:"object",properties:{checkFragmentShorthand:{type:"boolean",default:ce.checkFragmentShorthand},checkKeyMustBeforeSpread:{type:"boolean",default:ce.checkKeyMustBeforeSpread},warnOnDuplicates:{type:"boolean",default:ce.warnOnDuplicates}},additionalProperties:!1}]},create(e){if(e.getSourceCode().getAllComments().some(u=>u.value.includes("@jsxImportSource")))return{};let t=Object.assign({},ce,e.options[0]),n=t.checkFragmentShorthand,o=t.checkKeyMustBeforeSpread,a=t.warnOnDuplicates;function i(u){u.type==="JSXElement"&&!Er.default.hasProp(u.openingElement.attributes,"key")?e.report({node:u,messageId:"missingIterKey"}):n&&u.type==="JSXFragment"&&e.report({node:u,messageId:"missingIterKeyUsePrag"})}function s(u,c=[]){return u.type==="IfStatement"?(u.consequent&&s(u.consequent,c),u.alternate&&s(u.alternate,c)):Array.isArray(u.body)&&u.body.forEach(S=>{S.type==="IfStatement"&&s(S,c),S.type==="ReturnStatement"&&c.push(S)}),c}function f(u){let c=!1;return u.some(S=>S.type==="JSXSpreadAttribute"?(c=!0,!1):S.type!=="JSXAttribute"?!1:c&&Er.default.propName(S)==="key")}function d(u){Sr(u)&&u.body.type==="BlockStatement"&&s(u.body).filter(c=>c&&c.argument).forEach(c=>{i(c.argument)})}function g(u){let c=u&&u.type==="ArrowFunctionExpression",S=m=>m&&(m.type==="JSXElement"||m.type==="JSXFragment");c&&S(u.body)&&i(u.body),u.body.type==="ConditionalExpression"?(S(u.body.consequent)&&i(u.body.consequent),S(u.body.alternate)&&i(u.body.alternate)):u.body.type==="LogicalExpression"&&S(u.body.right)&&i(u.body.right)}let v=`:matches(
16
+ `}return{type:t,typeStr:r.typeToString(t),reason:u}}if(t.isUnion()){for(let h of t.types){let u=D(e,r,h,n,o,a+1,i);if(u)return u}return}if((t.flags&w.default.TypeFlags.Object)!==0){let h=zn(t,r);if(h)return D(e,r,h,n,o,a+1,i);let u=Gn(t,r);if(u){for(let m of u){let b=D(e,r,m,n,o,a+1,i);if(b)return b}return}let c=t.symbol.name;if(t.getProperty("nextElementSibling")||t.getProperty("activeElement")||Kn[c])return;if(t.isClass())return{type:t,typeStr:r.typeToString(t),reason:`is an instance of the "${t.symbol.name}" class, which is not serializable. Use a simple object literal instead`};let S=t.getProperty("prototype");if(S){let m=r.getTypeOfSymbolAtLocation(S,n);if(m.isClass())return{type:m,typeStr:r.typeToString(m),reason:"is a class constructor, which is not serializable"}}if(!c.startsWith("__")&&t.symbol.valueDeclaration)return{type:t,typeStr:r.typeToString(t),reason:`is an instance of the "${t.symbol.name}" class, which is not serializable`};for(let m of t.getProperties()){let b=Wn(e,r,m,n,o,a+1,i);if(b){let O=b.location;return b.location=`${m.name}${O?`.${O}`:""}`,b}}}}function Wn(e,r,t,n,o,a,i){let s=r.getTypeOfSymbolAtLocation(t,n);return D(e,r,s,n,o,a,i)}function zn(e,r){return r.getElementTypeOfArrayType(e)}function Gn(e,r){return r.isTupleType(e)?r.getTypeArguments(e):void 0}function jr(e){return!!(e.flags&w.default.TypeFlags.Any)||!!e.getProperty("__brand__QRL__")}function Ir(e,r){if(e.declarations&&e.declarations.length>0){let t=e.declarations[0],n=r.slice(t.pos,t.end).replace(/^\s*$/gm,"");return ye(n,2)}return""}var Kn={Promise:!0,URL:!0,RegExp:!0,Date:!0,FormData:!0,URLSearchParams:!0,Error:!0};var Fr={meta:{type:"problem",docs:{description:"Object destructuring is not recommended for component$",category:"Variables",recommended:!0,url:"https://github.com/BuilderIO/qwik"},messages:{"use-after-await":"Calling use* methods after await is not safe.","use-wrong-function":"Calling use* methods in wrong function.","use-not-root":"Calling use* methods in non-root component."}},create(e){if(e.getSourceCode().getAllComments().some(n=>n.value.includes("@jsxImportSource")))return{};let t=[];return{ArrowFunctionExpression(){t.push({await:!1})},"ArrowFunctionExpression:exit"(n){t.pop()},AwaitExpression(){let n=t[t.length-1];n&&(n.await=!0)},"CallExpression[callee.name=/^use[A-Z]/]"(n){var i,s;let o=t[t.length-1];o&&o.await&&e.report({node:n,messageId:"use-after-await"});let a=n;for(;a=a.parent;)switch(a.type){case"VariableDeclarator":case"VariableDeclaration":case"ExpressionStatement":case"MemberExpression":case"BinaryExpression":case"UnaryExpression":case"ReturnStatement":case"BlockStatement":case"ChainExpression":case"Property":case"ObjectExpression":case"CallExpression":break;case"ArrowFunctionExpression":case"FunctionExpression":if(a.parent.type==="VariableDeclarator"&&((i=a.parent.id)==null?void 0:i.type)==="Identifier"&&a.parent.id.name.startsWith("use")||a.parent.type==="CallExpression"&&a.parent.callee.type==="Identifier"&&a.parent.callee.name==="component$")return;e.report({node:n,messageId:"use-wrong-function"});return;case"FunctionDeclaration":(s=a.id)!=null&&s.name.startsWith("use")||e.report({node:n,messageId:"use-wrong-function"});return;default:e.report({node:n,messageId:"use-not-root"});return}}}}};var qr={loader$:!0,routeLoader$:!0,routeAction$:!0,routeHandler$:!0},Hn={...qr,action$:!0,globalAction$:!0},Cr={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/docs/route-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(e){let r=Yn(e.getFilename()),t=/\/layout(|!|-.+)\.tsx?$/.test(r),n=/\/index(|!|@.+)\.tsx?$/.test(r),o=/\/plugin(|@.+)\.tsx?$/.test(r),i=/\/src\/routes\//.test(r)&&(n||t||o);return{CallExpression(s){if(s.callee.type!=="Identifier")return;let f=s.callee.name;if(!Hn[f])return;if(!i&&qr[f]){e.report({node:s.callee,messageId:"invalidLoaderLocation",data:{fnName:f,path:r}});return}let d=s.parent;if(d.type!=="VariableDeclarator"){e.report({node:s.callee,messageId:"missingExport",data:{fnName:f,id:"useStuff"}});return}if(d.id.type!=="Identifier"){e.report({node:s.callee,messageId:"missingExport",data:{fnName:f,id:"useStuff"}});return}if(!/^use/.test(d.id.name)){let g="use"+d.id.name[0].toUpperCase()+d.id.name.slice(1);e.report({node:d.id,messageId:"wrongName",data:{fnName:f,id:d.id.name,fixed:g}});return}if(d.parent.parent.type!=="ExportNamedDeclaration"){e.report({node:d.id,messageId:"missingExport",data:{fnName:f,id:d.id.name}});return}if(s.arguments.length>0&&s.arguments[0].type==="Identifier"){e.report({node:s.arguments[0],messageId:"recommendedValue",data:{fnName:f,id:d.id.name,arg:s.arguments[0].name}});return}}}}};function Yn(e){let r=/^\\\\\?\\/.test(e),t=/[^\u0000-\u0080]+/.test(e);return r||t||(e=e.replace(/\\/g,"/"),e.endsWith("/")&&(e=e.slice(0,e.length-1))),e}var hr=V(pe()),ps=[{from:"className",to:"class"},{from:"htmlFor",to:"for"}];var On={meta:{type:"problem",docs:{recommended:"warn",description:"Disallow usage of React-specific `className`/`htmlFor` props."},fixable:"code",schema:[],messages:{prefer:"Prefer the `{{ to }}` prop over the deprecated `{{ from }}` prop."}},create(e){return e.getSourceCode().getAllComments().some(t=>t.value.includes("@jsxImportSource"))?{}:{JSXOpeningElement(t){for(let{from:n,to:o}of ps){let a=hr.default.getProp(t.attributes,n);if(a){let i=hr.default.hasProp(t.attributes,o,{ignoreCase:!1})?void 0:s=>s.replaceText(a.name,o);e.report({node:a,messageId:"prefer",data:{from:n,to:o},fix:i})}}}}}};var br=V(pe()),_n={meta:{type:"problem",docs:{recommended:!1,description:"Enforce using the classlist prop over importing a classnames helper. The classlist prop accepts an object `{ [class: string]: boolean }` just like classnames."},fixable:"code",schema:[{type:"object",properties:{classnames:{type:"array",description:"An array of names to treat as `classnames` functions",default:["cn","clsx","classnames"],items:{type:"string",minItems:1,uniqueItems:!0}}},additionalProperties:!1}],messages:{preferClasslist:"The classlist prop should be used instead of {{ classnames }} to efficiently set classes based on an object."}},create(e){var n;if(e.getSourceCode().getAllComments().some(o=>o.value.includes("@jsxImportSource")))return{};let t=((n=e.options[0])==null?void 0:n.classnames)??["cn","clsx","classnames"];return{JSXAttribute(o){var a,i;if(!(["class","className"].indexOf(br.default.propName(o))===-1||br.default.hasProp((a=o.parent)==null?void 0:a.attributes,"classlist",{ignoreCase:!1}))&&((i=o.value)==null?void 0:i.type)==="JSXExpressionContainer"){let s=o.value.expression;s.type==="CallExpression"&&s.callee.type==="Identifier"&&t.indexOf(s.callee.name)!==-1&&s.arguments.length===1&&s.arguments[0].type==="ObjectExpression"&&e.report({node:o,messageId:"preferClasslist",data:{classnames:s.callee.name},fix:f=>{let d=o.range,g=s.arguments[0].range;return[f.replaceTextRange([d[0],g[0]],"classlist={"),f.replaceTextRange([g[1],d[1]],"}")]}})}}}}};var Tn=require("@typescript-eslint/utils"),{getStaticValue:cs}=Tn.ASTUtils,fs=/^[\u0000-\u001F ]*j[\r\n\t]*a[\r\n\t]*v[\r\n\t]*a[\r\n\t]*s[\r\n\t]*c[\r\n\t]*r[\r\n\t]*i[\r\n\t]*p[\r\n\t]*t[\r\n\t]*:/i,jn={meta:{type:"problem",docs:{recommended:"error",description:"Disallow javascript: URLs.",url:"https://github.com/solidjs-community/eslint-plugin-solid/blob/main/docs/jsx-no-script-url.md"},schema:[],messages:{noJSURL:"For security, don't use javascript: URLs. Use event handlers instead if you can."}},create(e){return{JSXAttribute(r){if(r.name.type==="JSXIdentifier"&&r.value){let t=cs(r.value.type==="JSXExpressionContainer"?r.value.expression:r.value,e.getScope());t&&typeof t.value=="string"&&fs.test(t.value)&&e.report({node:r.value,messageId:"noJSURL"})}}}}};var Er=V(pe());function Sr(e){return e.type==="FunctionExpression"||e.type==="ArrowFunctionExpression"}var ce={checkFragmentShorthand:!1,checkKeyMustBeforeSpread:!1,warnOnDuplicates:!1},ds={missingIterKey:'Missing "key" prop for element in iterator',missingIterKeyUsePrag:'Missing "key" prop for element in iterator. The key prop allows for improved rendering performance. Shorthand fragment syntax does not support providing keys. Use <Fragment> instead',missingArrayKey:'Missing "key" prop for element in array. The key prop allows for improved rendering performance.',missingArrayKeyUsePrag:'Missing "key" prop for element in array. The key prop allows for improved rendering performance. Shorthand fragment syntax does not support providing keys. Use <Fragment> instead',nonUniqueKeys:"`key` prop must be unique"},In={meta:{docs:{description:"Disallow missing `key` props in iterators/collection literals",category:"Possible Errors",recommended:!0},messages:ds,schema:[{type:"object",properties:{checkFragmentShorthand:{type:"boolean",default:ce.checkFragmentShorthand},checkKeyMustBeforeSpread:{type:"boolean",default:ce.checkKeyMustBeforeSpread},warnOnDuplicates:{type:"boolean",default:ce.warnOnDuplicates}},additionalProperties:!1}]},create(e){if(e.getSourceCode().getAllComments().some(u=>u.value.includes("@jsxImportSource")))return{};let t=Object.assign({},ce,e.options[0]),n=t.checkFragmentShorthand,o=t.checkKeyMustBeforeSpread,a=t.warnOnDuplicates;function i(u){u.type==="JSXElement"&&!Er.default.hasProp(u.openingElement.attributes,"key")?e.report({node:u,messageId:"missingIterKey"}):n&&u.type==="JSXFragment"&&e.report({node:u,messageId:"missingIterKeyUsePrag"})}function s(u,c=[]){return u.type==="IfStatement"?(u.consequent&&s(u.consequent,c),u.alternate&&s(u.alternate,c)):Array.isArray(u.body)&&u.body.forEach(S=>{S.type==="IfStatement"&&s(S,c),S.type==="ReturnStatement"&&c.push(S)}),c}function f(u){let c=!1;return u.some(S=>S.type==="JSXSpreadAttribute"?(c=!0,!1):S.type!=="JSXAttribute"?!1:c&&Er.default.propName(S)==="key")}function d(u){Sr(u)&&u.body.type==="BlockStatement"&&s(u.body).filter(c=>c&&c.argument).forEach(c=>{i(c.argument)})}function g(u){let c=u&&u.type==="ArrowFunctionExpression",S=m=>m&&(m.type==="JSXElement"||m.type==="JSXFragment");c&&S(u.body)&&i(u.body),u.body.type==="ConditionalExpression"?(S(u.body.consequent)&&i(u.body.consequent),S(u.body.alternate)&&i(u.body.alternate)):u.body.type==="LogicalExpression"&&S(u.body.right)&&i(u.body.right)}let v=`:matches(
17
17
  CallExpression
18
18
  [callee.object.object.name=Fragment]
19
19
  [callee.object.property.name=Children]
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "eslint-plugin-qwik",
3
- "version": "1.1.0",
3
+ "version": "1.1.1",
4
4
  "description": "An Open-Source sub-framework designed with a focus on server-side-rendering, lazy-loading, and styling/animation.",
5
5
  "main": "index.js",
6
6
  "author": "Builder Team",