UNPKG

eslint-plugin-file-naming

Version:

eslint文件命名规范惯例插件

2 lines (1 loc) 4.54 kB
import w from"micromatch";var i={CAMEL_CASE:"+([a-z])*([a-z0-9])*([A-Z]*([a-z0-9]))",PASCAL_CASE:"+([A-Z]*([a-z0-9]))",SNAKE_CASE:"+([a-z])*([a-z0-9])*(_+([a-z0-9]))",KEBAB_CASE:"+([a-z])*([a-z0-9])*(-+([a-z0-9]))",SCREAMING_SNAKE_CASE:"+([A-Z])*([A-Z0-9])*(_+([A-Z0-9]))",FLAT_CASE:"+([a-z0-9])"},y=[".vue",".tsx",".jsx"],A="**/*.{jsx,vue,tsx}",x="**/src/**",S="**/src/**/*.{js,ts}";import{posix as m,sep as M}from"node:path";import{join as H}from"path";import U from"micromatch";var X=/^[A-Za-z]:\//,N=e=>m.normalize(e.split(M).join(m.sep)),u=e=>m.basename(N(e)),T=e=>{let o=u(e);return o.substring(o.lastIndexOf("."))},g=e=>{let o=u(e);return o.substring(0,o.lastIndexOf("."))},v=(e,o)=>e.replace(H(o,M),""),$=e=>N(e).replace(X,""),c=e=>$(v(e.physicalFilename,e.cwd));var O=e=>U.isMatch(e,"**/*.*")?m.join(m.dirname(e),m.sep):e,b=e=>e.split(m.sep).filter(o=>!d(o)),h=e=>e==null||Number.isNaN(e),V=e=>Array.isArray(e),q=e=>Object.prototype.toString.call(e)==="[object Object]",d=e=>V(e)?e.length===0:q(e)?Reflect.ownKeys(e).length===0:e===""||h(e),C=e=>{let o=m.sep,s=e.split(o).filter(t=>!d(t)),r=[],a=t=>{if(t<=s.length){let n=s.slice(0,t).join(o);n&&r.push(n),t<s.length&&a(t+1)}};return a(1),r.sort(),[...new Set(r.map(t=>t.endsWith(o)?t.slice(0,-1):t))]};var F="In the path of the file '{{ subPath }}', the name of the folder '{{ folder }}' does not match '{{ target }}'",I="File '{{ filename }}' with {{ filepath }} is not allowed to be named 'index' or 'Index'",L="File '{{ filename }}' with {{ filepath }} should to be named '{{ target }}'",j="Component filename '{{ basename }}' should be in {{ target }}";var G={meta:{type:"layout",docs:{description:"Enforce PascalCase for component filenames with .vue or .tsx extension",category:"Stylistic Issues",recommended:!1},fixable:null,schema:[{additionalProperties:{type:"string"}},{type:"object"}],messages:{componentError:j}},create(e){return{Program(o){let s=e.options[0],r=c(e),a=g(r),t=T(r),n=s;(!n||Object.keys(n).length===0)&&(n={[A]:"PASCAL_CASE"});for(let[p,l]of Object.entries(n))if(w.isMatch(r,p)&&y.includes(t.toLowerCase())){let E=i[l]??i.PASCAL_CASE;w.isMatch(a,E)||e.report({node:o,messageId:"componentError",data:{basename:`${a}${t}`,target:l??"PASCAL_CASE"}})}}}}};import P from"micromatch";var k={meta:{type:"layout",docs:{description:"The naming convention for folders only applies to folders",category:"Stylistic Issues",recommended:!1},fixable:null,schema:[{additionalProperties:{oneOf:[{type:"string"},{type:"array",items:{type:"string"}}]}}],messages:{matchError:F}},create(e){return{Program(o){let s=e.options[0],r=c(e),a=O(r),t=s;(!s||Object.keys(s).length===0)&&(t={[x]:"KEBAB_CASE"});let n=[];t.ignore&&(n=t.ignore??[]);for(let[p,l]of Object.entries(t)){if(p==="ignore"||!P.isMatch(a,p,{contains:!0}))continue;let E=C(a);for(let R of E){let _=P.capture(p,R,{dot:!0});if(h(_))continue;let W=_.filter(f=>!d(f)).reduce((f,Z)=>f.concat(b(Z)),[]),K=i[l]??i.KEBAB_CASE;for(let f of W)P.isMatch(f,K)||n.includes(f)||e.report({node:o,messageId:"matchError",data:{subPath:R,folder:f,target:l}})}}}}}};import J from"micromatch";var D={meta:{type:"layout",docs:{description:"Matching file names named 'index' or 'Index' is not allowed",category:"Stylistic Issues",recommended:!1},fixable:null,schema:[{additionalProperties:{type:"string"}},{type:"array"}],messages:{noIndex:I}},create(e){return{Program(o){let s=e.options[0],r=c(e),a=g(r),t=u(r),n=s;(!s||Array.isArray(s)&&s.length===0)&&(n=A),J.isMatch(r,n)&&a.toLowerCase()==="index"&&e.report({node:o,messageId:"noIndex",data:{filename:t,filepath:r}})}}}};import z from"micromatch";var B={meta:{type:"layout",docs:{description:"The file name should be named according to the specified rule",category:"Stylistic Issues",recommended:!1},fixable:null,schema:[{additionalProperties:{type:"string"}},{type:"object",properties:{errorMessage:{type:"string"}}}],messages:{filenameError:L}},create(e){return{Program(o){let s=e.options[0],r=c(e),a=g(r),t=u(r),n=s;(!n||Object.keys(n).length===0)&&(n={[S]:"CAMEL_CASE"});for(let[p,l]of Object.entries(n))if(z.isMatch(r,p)){let E=i[l]??i.CAMEL_CASE;z.isMatch(a,E)||e.report({node:o,messageId:"filenameError",data:{filename:t,filepath:r,target:l??"CAMEL_CASE"}})}}}}};var Q={"folder-naming":k,"component-naming":G,"filename-naming":B,"no-index-naming":D},Y={meta:{name:"eslint-plugin-file-naming",version:"1.0.5"},rules:Q},Ce=Y;export{y as COMPONENT_EXTNAME,x as DEFAULT_FOLDER_PATTERN,A as DEFAULT_PATH_PATTERN,i as NAMING_MAP,S as NORMAL_FILE_PATTERN,Ce as default,Q as rules};