UNPKG

5.25 kBJavaScriptView Raw
1import{version as e}from"eslint/package.json";import{JSX_TYPES as t,isJsxNode as s,openTag as r,DEFAULT_EXTENSIONS as n,MARKDOWN_EXTENSIONS as o}from"eslint-mdx";import i from"eslint-plugin-react/lib/rules/no-unescaped-entities";import a from"eslint/lib/rules/no-unused-expressions";import c from"path";import l from"vfile";import{cosmiconfigSync as m}from"cosmiconfig";import p from"remark-mdx";import u from"remark-parse";import d from"remark-stringify";import f from"unified";const g={parser:"eslint-mdx",plugins:["mdx"]},x=(e,t={})=>(Array.isArray(e)?e:Object.keys(e)).reduce(((e,t)=>Object.assign(e,{[t]:!1})),t);let h;try{h=require("rebass")}catch(e){h=["Box","Flex","Text","Heading","Link","Button","Image","Card"]}const b=Object.assign(Object.assign({},g),{globals:x(h,{React:!1}),rules:{"lines-between-class-members":0,"react/jsx-no-undef":[2,{allowGlobals:!0}],"react/react-in-jsx-scope":0}}),j=+e.split(".").slice(0,2).join("."),y=Object.assign(Object.assign({},g),{rules:{"mdx/no-jsx-html-comments":2,"mdx/no-unescaped-entities":1,"mdx/no-unused-expressions":2,"mdx/remark":1,"no-unused-expressions":0,"react/no-unescaped-entities":0}});if(j>=6.4){const e=[{files:"*.mdx",extends:"plugin:mdx/overrides"}];try{require.resolve("prettier"),require.resolve("eslint-plugin-prettier"),e.push({files:"*.md",rules:{"prettier/prettier":[2,{parser:"markdown"}]}})}catch(e){}Object.assign(y,{overrides:e})}var k=Object.freeze({__proto__:null,base:g,overrides:b,recommended:y});const v={meta:{type:"problem",docs:{description:"Forbid invalid html style comments in jsx block",category:"SyntaxError",recommended:!0},messages:{jsxHtmlComments:"html style comments are invalid in jsx: {{ origin }}"},fixable:"code"},create:e=>({ExpressionStatement(s){const r=e.parserServices.JSXElementsWithHTMLComments;if(!t.includes(s.expression.type)||"Program"!==s.parent.type||!r||0===r.length)return;const n=r.shift();if(n.data.inline)return;const o=n.data.comments;for(const{fixed:t,loc:r,origin:n}of o)e.report({messageId:"jsxHtmlComments",data:{origin:n},loc:r,node:s,fix:e=>e.replaceTextRange([r.start.offset,r.end.offset],t)})}})},O=[{char:">",alternatives:["&gt;"]},{char:'"',alternatives:["&quot;","&ldquo;","&#34;","&rdquo;"]},{char:"'",alternatives:["&apos;","&lsquo;","&#39;","&rsquo;"]},{char:"}",alternatives:["&#125;"]}],S=Object.assign(Object.assign({},i),{create(e){const t=(e.options[0]||{}).forbid||O;return{"Literal, JSXText"(n){let{parent:o,loc:i}=n;if(!s(o))return;for(;o&&"Program"!==o.parent.type;)o=o.parent;const{start:{line:a,column:c},end:{line:l,column:m}}=i,{lines:p}=e.getSourceCode();let u=o.loc.start.line<a?0:p.slice(a-1,l).join("\n").search(r);u<0&&(u=0);for(let s=a;s<=l;s++){let r=p[s-1],o=0,i=r.length;s===a&&(o=c+u),s===l&&(i=m,s===a&&(i+=u)),r=r.slice(o,i);for(const i of t)for(let t=0;t<r.length;t++){const a=r[t];"string"==typeof i?a===i&&e.report({loc:{line:s,column:o+t},message:`HTML entity, \`${i}\` , must be escaped.`,node:n}):a===i.char&&e.report({loc:{line:s,column:o+t},message:`\`${i.char}\` can be escaped with ${i.alternatives.map((e=>"``".split("").join(e))).join(", ")}.`,node:n})}}}}}}),q=Object.assign(Object.assign({},a),{create(e){const t=a.create(e);return{ExpressionStatement(e){s(e.expression)&&"Program"===e.parent.type||t.ExpressionStatement(e)}}}}),w=(e,t,s)=>{s&&/^\.\.?([/\\]|$)/.test(e)&&(e=c.resolve(c.dirname(s),e)),t=t.endsWith("-")?t:t+"-";const r=[e,e.startsWith("@")?e.replace("/","/"+t):t+e];let n;for(const e of r)try{return require(e)}catch(e){n||(n=e)}throw n};let C,I;const T=(e,t)=>{C||(C=m("remark",{packageProp:"remarkConfig"}).search),I||(I=f().use(u).freeze());const s=C(e)||{},{plugins:r=[],settings:n}=s.config||{};try{r.push([require.resolve("remark-lint-file-extension"),!1])}catch(e){}const o=I().use({settings:n}).use(d);return t&&o.use(p),r.reduce(((e,t)=>{const[r,...n]=Array.isArray(t)?t:[t];return e.use("string"==typeof r?w(r,"remark",s.filepath):r,...n)}),o).freeze()},E={meta:{type:"layout",docs:{description:"Linter integration with remark plugins",category:"Stylistic Issues",recommended:!0},messages:{remarkReport:"{{ source }}:{{ ruleId }} - {{ reason }}"},fixable:"code"},create(e){const t=e.getFilename(),s=c.extname(t),r=e.getSourceCode(),i=e.parserOptions,a=n.concat(i.extensions||[]).includes(s),m=o.concat(i.markdownExtensions||[]).includes(s);return{Program(s){if(!a&&!m)return;const n=r.getText(s),o=T(t,a),i=l({path:t,contents:n});try{o.processSync(i)}catch(e){i.messages.includes(e)||(i.message(e).fatal=!0)}for(const{source:t,reason:r,ruleId:a,location:{start:c,end:l}}of i.messages)e.report({messageId:"remarkReport",data:{reason:r,source:t,ruleId:a},loc:{start:Object.assign(Object.assign({},c),{column:c.column-1}),end:Object.assign(Object.assign({},l),{column:l.column-1})},node:s,fix(e){if(null==c.offset)return null;const t=[c.offset,null==l.offset?c.offset+1:l.offset],s=n.slice(...t),r=o.processSync(s).toString();return e.replaceTextRange(t,s.endsWith("\n")?r:r.slice(0,-1))}})}}}},H={"no-jsx-html-comments":v,"no-unescaped-entities":S,"no-unused-expressions":q,remark:E};export{k as configs,x as getGlobals,T as getRemarkProcessor,v as noJsxHtmlComments,S as noUnescapedEntities,q as noUnusedExpressions,E as remark,w as requirePkg,H as rules};