UNPKG

npm-package-json-lint

Version:
2 lines 16.1 kB
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t),e=null),t.exports),s=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},c=(n,r,a)=>(a=n==null?{}:e(i(n)),s(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));let l=require(`cosmiconfig`),u=require(`ajv`);u=c(u);let d=require(`ajv-errors`);d=c(d);let f=require(`node:path`);f=c(f);let p=require(`node:fs`);p=c(p);let m=require(`strip-json-comments`);m=c(m);let ee=require(`minimatch`),h=require(`chalk`);h=c(h);let g=require(`globby`);g=c(g);let _=require(`ignore`);_=c(_);const v=e=>e.startsWith(`\\\\?\\`)?e:e.replaceAll(`\\`,`/`),y=e=>{if(typeof e!=`object`||!e)return!1;let t=Object.getPrototypeOf(e);return(t===null||t===Object.prototype||Object.getPrototypeOf(t)===null)&&!(Symbol.toStringTag in e)&&!(Symbol.iterator in e)},b=new u.default({allErrors:!0,jsonPointers:!0});(0,d.default)(b);const x=e=>e.map(e=>`\t- ${e.message}\n`).join(``),S={type:`string`,enum:[`off`,`warning`,`error`],errorMessage:{type:`severity must be a string.`,enum:`severity must be either "off", "warning", or "error".`}},C=e=>({type:`array`,items:[S,{type:`array`,minItems:e,uniqueItems:!0,errorMessage:{type:`the second item in an array rule config must be an array.`,minItems:`the second item in an array rule config must have at least 1 item.`,uniqueItems:`the second item in an array rule config must have unique items.`}}],minItems:2,maxItems:2,additionalItems:!1,errorMessage:{type:`rule config must be an array, e.g. ["error", ["value1", "value2"]].`,minItems:`array rules must have two items, severity and options array. e.g. ["error", ["value1", "value2"]].`,maxItems:`array rules must have two items, severity and options array. e.g. ["error", ["value1", "value2"]].`,additionalItems:`array rules are only allowed two items, severity and the list is values. e.g. ["error", ["value1", "value2"]].`}}),w={type:`array`,items:[S,{type:`object`,errorMessage:{type:`the second item in an object rule config must be an object.`}}],minItems:2,maxItems:2,additionalItems:!1,errorMessage:{type:`rule config must be an array, e.g. ["error", {}].`,minItems:`object rules must have two items, severity and options object. e.g. ["error", {}].`,maxItems:`object rules must have two items, severity and options object. e.g. ["error", {}].`,additionalItems:`object rules are only allowed two items, severity and options object. e.g. ["error", {}].`}},te={type:`array`,items:[{type:`string`,errorMessage:{type:`each exception must be a string.`}}],uniqueItems:!0,minItems:1,errorMessage:{type:`expections must be an array.`,minItems:`expections must have at least 1 item.`,uniqueItems:`expections must have unique items.`}},T=e=>{let t=b.compile(S);if(!t(e))throw Error(`${x(t.errors)}`);return!0},ne=(e,t)=>{let n=b.compile(C(t));if(!n(e))throw Error(`${x(n.errors)}`);return!0},E=e=>{let t=b.compile(w);if(!t(e))throw Error(`${x(t.errors)}`);return!0},re=e=>{let t=b.compile(te);if(!t(e))throw Error(`${x(t.errors)}`);return!0},ie=e=>{if(typeof e==`string`&&e===`off`)return!0;if(typeof e==`string`&&e!==`off`)throw Error(` - is an object type rule. It must be set to "off" if an object is not supplied.`);return E(e)},ae=e=>typeof e==`string`?T(e):E(e)&&e[1].hasOwnProperty(`exceptions`)?re(e[1].exceptions):!0,oe=(e,t)=>{if(typeof e==`string`&&e===`off`)return!0;if(typeof e==`string`&&e!==`off`)throw Error(` - is an array type rule. It must be set to "off" if an array is not supplied.`);return ne(e,t)},D=e=>T(e),se=(e,t,n,r)=>{if(e)try{switch(e.ruleType){case`array`:oe(n,e.minItems);break;case`object`:ie(n);break;case`optionalObject`:ae(n);break;default:D(n)}}catch(e){let n=`Configuration for rule "${t}" is invalid:\n${e.message}`;throw Error(typeof r==`string`?`${r}:\n\t${n}`:n)}},ce=(e,t,n)=>{e&&Object.keys(e).forEach(r=>{se(n.get(r),r,e[r],t)})},O=e=>require(e),k=e=>p.default.readFileSync(e,`utf8`).replace(/^\uFEFF/,``),A=(e,t)=>{throw Error(`Failed to read config file: ${e}. \nError: ${t.message}`)},j=Symbol(`JSON source`),M=e=>{let t={},n=``;try{n=k(e),t=JSON.parse((0,m.default)(n))}catch(t){A(e,t)}return Object.defineProperty(t,j,{value:n,enumerable:!1,writable:!1,configurable:!1}),t},le=e=>{let t={};try{t=O(e)}catch(t){A(e,t)}return t},N=require(`debug`)(`npm-package-json-lint:applyExtendsIfSpecified`),P=(e,t,n)=>{let r=e.extends;return Array.isArray(e.extends)||(r=[e.extends]),r.reduceRight((e,r)=>{try{let t=ue(r,n),i={...t,...e},a={...t.rules,...e.rules},o=Array.isArray(t.plugins)?t.plugins:[],s=Array.isArray(e.plugins)?e.plugins:[],c=[...o,...s],l=[...new Set(c)],u=Array.isArray(t.overrides)?t.overrides:[],d=Array.isArray(e.overrides)?e.overrides:[],f=[...u,...d];return i.rules=a,c.length>0&&(i.plugins=l),f.length>0&&(i.overrides=f),i}catch(e){throw e.message+=`\nReferenced from: ${t}`,e}},e)},ue=(e,t)=>{let n,r=e;if(e.startsWith(`./`))r=f.default.join(process.cwd(),e),n=F(r);else{let e=require.resolve(r,{paths:[f.default.dirname(t)]});n=require(e)}return Object.keys(n).length>0&&n.extends&&(n=P(n,r,t)),n},F=e=>{let t;switch(f.default.extname(e)){case`.js`:t=le(e);break;case`.json`:t=M(e);break;default:throw Error(`Unsupport config file extension. File path: ${e}`)}return t},I=(e,t)=>{let n={...e};return N(`Loading extends, if applicable`),n?.hasOwnProperty(`extends`)&&n.extends&&(N(`extends property present, applying.`),n=P(n,t,t)),N(`Loading extends complete`),n},L=require(`debug`)(`npm-package-json-lint:applyOverrides`),R=(e,t,n,r)=>{let i={...n};if(L(`overrides`),L(r),r){let n=f.default.relative(e,t).replace(/\\/g,`/`);r.forEach(e=>{let t=e.patterns.filter(e=>e.length).map(e=>e.endsWith(`/package.json`)?e:`${e}/package.json`),r=t.some(e=>(0,ee.minimatch)(n,e.replace(/^\.\//,``),{dot:!0}));L(`relativeFilePath: %s, patterns: %o, matches: %s`,n,t,r),r&&(i={...i,...e.rules})})}return L(`finalRules`),L(i),i},z=require(`debug`)(`npm-package-json-lint:cosmicConfigTransformer`),B=(e,t,n)=>(z(`cwd: ${e}`),z(`configBaseDirectory`),z(t),r=>{if(z(`cosmiconfigResult`),z(r),!r)return null;let{config:i,filepath:a}=r;z(`cosmiconfigResult.config`),z(i),z(`cosmiconfigResult.filepath`),z(a),t||f.default.dirname(a||``);let o=I({...i},n);return R(e,n,o.rules,o.overrides)}),V=require(`debug`)(`npm-package-json-lint:Config`);var H=class{constructor(e,t,n,r,i){t&&(this.config=I(t,`PassedConfig`)),this.cwd=e,this.configFile=n,this.configBaseDirectory=r,this.rules=i}getConfigForFile(e){V(`Getting config for ${e}`);let t=e;V(`filePathToSearch: ${t}`);let n;if(this.config===void 0)V(`User passed config is undefined.`),this.configFile?(V(`Config file specified, loading it.`),n=(0,l.cosmiconfigSync)(`npmpackagejsonlint`,{transform:B(this.cwd,this.configBaseDirectory,e)}).load(this.configFile)):(V(`Config file wasn't specified, searching for config.`),n=(0,l.cosmiconfigSync)(`npmpackagejsonlint`,{transform:B(this.cwd,this.configBaseDirectory,t)}).search(t));else{V(`User passed config is set, using it.`);let t=this.config;V(`Applying overrides to config for ${e}`),n=R(this.cwd,e,t.rules,t.overrides),V(`Overrides applied for ${e}`)}if(!n)throw Error(`No npm-package-json-lint configuration found.\n${t}`);if(Object.keys(n).length===0)throw Error(`No rules specified in configuration.\n${t}`);return V(`Overrides applied for ${e}`),V(`Final Config`),V(n),ce(n,`cli`,this.rules),n}},U=class{constructor(){this.rules={}}load(){let e=f.default.join(__dirname,`rules`);try{return(0,p.readdirSync)(e).forEach(t=>{let n=t.slice(0,-3),r=f.default.join(e,t);this.registerRule(n,r)}),this.rules}catch(e){throw Error(`Error while loading rules from rules directory - ${e.message}`,e)}}get(e){if(this.rules[e]===void 0){let t=`Rule, ${e}, is invalid. Please ensure it matches a valid option.`;throw Error(h.default.bold.red(t))}return require(this.rules[e])}getRules(){return this.rules}registerRule(e,t){this.rules[e]=t}};let de=function(e){return e.Error=`error`,e.Warning=`warning`,e.Off=`off`,e}({});const W=e=>e.reduce((e,t)=>{let n=t.severity===`error`;return{errorCount:n?e.errorCount+1:e.errorCount,warningCount:n?e.warningCount:e.warningCount+1}},{errorCount:0,warningCount:0}),G=e=>e.reduce((e,t)=>({ignoreCount:t.ignored?e.ignoreCount+1:e.ignoreCount,errorCount:e.errorCount+t.errorCount,warningCount:e.warningCount+t.warningCount}),{ignoreCount:0,errorCount:0,warningCount:0}),K=require(`debug`)(`npm-package-json-lint:linter`),q=e=>{let{cwd:t,fileName:n,ignored:r,issues:i,errorCount:a,warningCount:o}=e;return{filePath:`./${f.default.relative(t,n)}`,issues:i,ignored:r,errorCount:a,warningCount:o}},fe=(e,t,n)=>{let r=[];for(let i in t){let a=n.get(i),o=`off`,s;if(a.ruleType===`array`||a.ruleType===`object`?(o=typeof t[i]==`string`&&t[i]===`off`?t[i]:t[i][0],s=typeof t[i]==`string`?{}:t[i][1]):a.ruleType===`optionalObject`?typeof t[i]==`string`?(o=t[i],s={}):(o=t[i][0],s=t[i][1]):o=t[i],o!==`off`){let t=a.lint(e,o,s);t!==null&&r.push(t)}}return r},J=(e,t,n,r,i)=>{let a=fe(t,n,i),o=W(a);return q({cwd:e,fileName:r,ignored:!1,issues:a,errorCount:o.errorCount,warningCount:o.warningCount})},pe=(e,t,n,r)=>J(e,M(f.default.resolve(t)),n,t,r),me=e=>{let{cwd:t,packageJsonObject:n,filename:r,ignorer:i,configHelper:a,rules:o}=e;K(`executing on package.json object`);let s=[],c=r||``,l=f.default.isAbsolute(c)?c:f.default.resolve(t,c),u=f.default.relative(t,l);if(i.ignores(u)){K(`Ignored: ${u}`);let e=q({cwd:t,fileName:l,ignored:!0,issues:[],errorCount:0,warningCount:0});s.push(e)}else{K(`Getting config for ${l}`);let e=a.getConfigForFile(l);K(`Config fetched for ${l}`);let r=J(t,n,e,l,o);s.push(r)}K(`Aggregating overall counts`);let d=G(s);return K(`stats`),K(d),{results:s,ignoreCount:d.ignoreCount,errorCount:d.errorCount,warningCount:d.warningCount}},he=e=>{let{cwd:t,fileList:n,ignorer:r,configHelper:i,rules:a}=e;K(`executing on package.json files`);let o=n.map(e=>{let n=f.default.relative(t,e);if(r.ignores(n))return K(`Ignored: ${n}`),q({cwd:t,fileName:e,ignored:!0,issues:[],errorCount:0,warningCount:0});K(`Getting config for ${e}`);let o=i.getConfigForFile(e);return K(`Config fetched for ${e}`),pe(t,e,o,a)});K(`Aggregating overall counts`);let s=G(o);return K(`stats`),K(s),{results:o,ignoreCount:s.ignoreCount,errorCount:s.errorCount,warningCount:s.warningCount}},Y=require(`debug`)(`npm-package-json-lint:getFileList`),ge=(e,t)=>{Y(`patterns`),Y(e);let n=e.filter(e=>e.length);Y(`filteredPatterns`),Y(n);let r=n.map(e=>e.endsWith(`/package.json`)?e:`${e}/**/package.json`);r.push(`!**/node_modules/**`),Y(`globPatterns`),Y(r);let i=[],a=new Set,o=g.default.sync(r,{cwd:t,gitignore:!0});return Y(`globFiles`),Y(o),o.forEach(e=>{let n=f.default.resolve(t,e);a.has(n)||(a.add(n),i.push(n))}),Y("Final file list from `getFileList`"),Y(i),i},X=require(`debug`)(`npm-package-json-lint:getIgnorer`),_e=(e,t)=>{let n=t||`.npmpackagejsonlintignore`;X(`ignoreFilePath: ${n}`);let r=f.default.isAbsolute(n)?n:f.default.resolve(e,n);X(`absoluteIgnoreFilePath: ${r}`);let i=``;try{i=p.default.readFileSync(r,`utf8`)}catch(e){if(e.code!==`ENOENT`)throw e}return X(`Ignore text added`),(0,_.default)().add(i)};var ve=o(((e,t)=>{t.exports={name:`npm-package-json-lint`,version:`0.0.0`,description:`Configurable linter for package.json files.`,keywords:[`lint`,`linter`,`package.json`,`audit`,`auditor`,`npm-package-json-lint`],homepage:`https://github.com/tclindner/npm-package-json-lint`,bugs:{url:`https://github.com/tclindner/npm-package-json-lint/issues`},author:`Thomas Lindner`,repository:{type:`git`,url:`https://github.com/tclindner/npm-package-json-lint.git`},bin:{npmPkgJsonLint:`dist/cli.js`},files:[`CONTRIBUTING.md`,`dist`],main:`dist/api.js`,types:`dist/src/api.d.ts`,scripts:{build:`tsdown`,eslint:`eslint .`,npmpackagejsonlint:`node dist/cli.js ./package.json`,lint:`npm run eslint && npm run npmpackagejsonlint`,test:`npm run build && jest`,"test:ci":`jest --runInBand`},dependencies:{ajv:`6.14.0`,minimatch:`10.2.4`,"ajv-errors":`1.0.1`,chalk:`4.1.2`,cosmiconfig:`8.3.6`,debug:`4.4.3`,globby:`11.1.0`,ignore:`5.3.2`,"jsonc-parser":`3.3.1`,meow:`9.0.0`,semver:`7.7.4`,"strip-json-comments":`3.1.1`,"type-fest":`5.6.0`,"validate-npm-package-name":`6.0.0`},devDependencies:{"@eslint/js":`10.0.1`,"@types/jest":`30.0.0`,"@types/node":`25.6.0`,eslint:`10.2.1`,"eslint-config-prettier":`10.1.8`,"eslint-config-tc":`28.0.3`,"eslint-config-typescript-tc":`12.1.0`,"eslint-plugin-import-x":`4.16.2`,"eslint-plugin-jest":`29.15.2`,"eslint-plugin-prettier":`5.5.5`,"eslint-plugin-unicorn":`64.0.0`,globals:`17.5.0`,jest:`30.3.0`,"npm-package-json-lint-config-default":`9.0.1`,"npm-package-json-lint-config-tc":`10.0.2`,prettier:`3.8.3`,"ts-jest":`29.4.9`,tsdown:`0.21.10`,typescript:`5.4.5`,"typescript-eslint":`8.59.0`},engines:{node:`>=22.0.0`,npm:`>=10.0.0`},license:`MIT`}}));const Z=require(`debug`)(`npm-package-json-lint:NpmPackageJsonLint`),ye=ve(),be=e=>e.severity===`error`,Q=e=>y(e),xe=(e,t)=>!t&&!Q(e)||t&&(e||Q(e)),Se=e=>{let t=[];return e.forEach(e=>{let n=e.issues.filter(be);if(n.length>0){let r={issues:n,errorCount:n.length,warningCount:0};t.push(Object.assign(e,r))}}),t};var Ce=class{constructor(e){let{cwd:t,packageJsonObject:n,packageJsonFilePath:r,config:i,configFile:a,configBaseDirectory:o,patterns:s,quiet:c,ignorePath:l,fix:u}=e;this.cwd=v(t||process.cwd()),this.packageJsonObject=n,this.packageJsonFilePath=r&&v(r),this.patterns=s,this.quiet=c||!1,this.ignorePath=l||``,this.fix=u||!1,this.version=ye.version,this.rules=new U,this.rules.load(),this.configHelper=new H(this.cwd,i,a,o,this.rules)}lint(){if(Z(`Starting lint`),xe(this.packageJsonObject,this.patterns))throw Error("You must pass npm-package-json-lint a `patterns` glob or a `packageJsonObject` string, though not both.");let e=_e(this.cwd,this.ignorePath),t;if(this.patterns){if(Z(`Linting using patterns`),!Array.isArray(this.patterns))throw TypeError(`Patterns must be an array.`);let n=ge(this.patterns,this.cwd);t=he({cwd:this.cwd,fileList:n,ignorer:e,configHelper:this.configHelper,rules:this.rules})}else Z(`Linting using passed object.`),t=me({cwd:this.cwd,packageJsonObject:this.packageJsonObject,ignorer:e,filename:this.packageJsonFilePath,configHelper:this.configHelper,rules:this.rules});return this.quiet?{results:Se(t.results),ignoreCount:t.ignoreCount,errorCount:t.errorCount,warningCount:t.warningCount}:(Z(`lint complete`),t)}},we=class{constructor(e,t,n,r){this.lintId=e,this.severity=t,this.node=n,this.lintMessage=r}toString(){return`${this.severity===`error`?h.default.bgRedBright(this.severity.toUpperCase()):h.default.bgYellowBright(this.severity.toUpperCase())} ${h.default.cyan.bold(this.lintId)} - node: ${h.default.magenta.bold(this.node)} - ${this.severity===`error`?h.default.red.bold(this.lintMessage):h.default.yellow(this.lintMessage)}`}};const $=(e,t)=>t>1||t===0?`${e}s`:e,Te=e=>{e.forEach(e=>{console.log(e.toString())})},Ee=(e,t)=>{let{filePath:n,issues:r,ignored:i,errorCount:a,warningCount:o}=e;if(i)console.log(``),console.log(`${h.default.yellow.underline(n)} - ignored`);else if(a>0||!t&&o>0){console.log(``),console.log(h.default.underline(n)),Te(r);let e=`${a} ${$(`error`,a)}`,i=`${o} ${$(`warning`,o)}`;console.log(h.default.red.bold(e)),t||console.log(h.default.yellow.bold(i))}},De=(e,t)=>{let{errorCount:n,warningCount:r,ignoreCount:i}=e;if(n>0||r>0){let e=`${n} ${$(`error`,n)}`,a=`${r} ${$(`warning`,r)}`,o=`${i} ${$(`file`,i)} ignored`;console.log(``),console.log(h.default.underline(`Totals`)),console.log(h.default.red.bold(e)),t||(console.log(h.default.yellow.bold(a)),console.log(h.default.yellow.bold(o)))}},Oe=(e,t)=>{e.results.forEach(e=>{Ee(e,t)}),e.results.length>1&&De(e,t)};exports.LintIssue=we,exports.NpmPackageJsonLint=Ce,exports.Rules=U,exports.Severity=de,exports.write=Oe; //# sourceMappingURL=api.js.map