UNPKG

eslint-plugin-allowed-dependencies

Version:
2 lines (1 loc) 2.21 kB
import{ESLintUtils as J}from"@typescript-eslint/utils";import*as e from"ramda";import{readFileSync as w}from"node:fs";import{join as j}from"node:path";import*as o from"ramda";var M=o.startsWith("@"),g=t=>o.flow(t,[o.split("/"),o.take(M(t)?2:1),o.join("/")]),R=t=>JSON.parse(w(j(t,"package.json"),"utf8")),O=t=>{let r=a=>t.peerDependenciesMeta?.[a]?.optional===!0,[s,i]=o.partition(r,Object.keys(t.peerDependencies||{}));return{requiredPeers:i,optionalPeers:s}};import*as l from"ramda";var N={oneOf:[{type:"boolean"},{type:"string",enum:["typeOnly"]}]},I=l.fromPairs(l.xprod(["production","optionalPeers","requiredPeers","development"],[N])),S={type:"object",properties:{packageDir:{type:"string"},typeOnly:{type:"array",items:{type:"string"}},ignore:{type:"array",items:{type:"string",format:"regex"}},...I},additionalProperties:!1};var q={prohibited:"Importing {{name}} is not allowed.",typeOnly:"Only 'import type' syntax is allowed for {{name}}."},c={production:!0,requiredPeers:!0,development:"typeOnly",optionalPeers:"typeOnly"},C=[!0,!1,"typeOnly"],E=t=>({packageDir:r=t.cwd,typeOnly:s=[],ignore:i=["^\\.","^node:"],production:a=c.production,development:m=c.development,requiredPeers:d=c.requiredPeers,optionalPeers:y=c.optionalPeers})=>{let n=R(r),u={production:Object.keys(n.dependencies||{}),development:Object.keys(n.devDependencies||{}),...O(n)},p={production:a,development:m,requiredPeers:d,optionalPeers:y},P=v=>e.flatten(e.values(e.mapObjIndexed((D,x)=>D===v?u[x]:[],p))),[b,k,f]=e.map(P,C);return f.push(...s),{allowed:b,prohibited:k,limited:f,ignore:i}},F=t=>{let r=e.map(e.constructN(1,RegExp),t),s=e.invoker(1,"test");return i=>e.any(s(i),r)},h=J.RuleCreator.withoutDocs({meta:{messages:q,type:"problem",schema:{type:"array",items:S}},defaultOptions:[c],create:t=>{let r=E(t),s=e.map(r,t.options.length?t.options:[{}]),[i,a,m,d]=e.map(n=>e.flatten(e.pluck(n,s)),["allowed","prohibited","limited","ignore"]),y=F(d);return{ImportDeclaration:({source:n,importKind:u})=>{if(y(n.value))return;let p=g(n.value);i.includes(p)||u==="type"&&!a.includes(p)||t.report({node:n,data:{name:p},messageId:m.includes(p)?"typeOnly":"prohibited"})}}}});var G={rules:{dependencies:h}};export{G as default};