@smarlhens/npm-check-engines 0.14.0 → 0.14.2

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.
package/README.md CHANGED
@@ -26,7 +26,7 @@
26
26
 
27
27
  ## Prerequisites
28
28
 
29
- - [Node.JS](https://nodejs.org/en/download/) **version ^20.5.0 || ^22.0.0 || >=24.0.0**
29
+ - [Node.JS](https://nodejs.org/en/download/) **version ^20.19.0 || ^22.12.0 || >=24.0.0**
30
30
 
31
31
  ---
32
32
 
package/dist/bin/nce.cjs CHANGED
@@ -1,10 +1,2 @@
1
1
  #!/usr/bin/env node
2
- "use strict";var Z=Object.create;var O=Object.defineProperty;var ee=Object.getOwnPropertyDescriptor;var ne=Object.getOwnPropertyNames;var te=Object.getPrototypeOf,re=Object.prototype.hasOwnProperty;var s=(n,e)=>O(n,"name",{value:e,configurable:!0});var ae=(n,e,t,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of ne(e))!re.call(n,i)&&i!==t&&O(n,i,{get:()=>e[i],enumerable:!(a=ee(e,i))||a.enumerable});return n};var k=(n,e,t)=>(t=n!=null?Z(te(n)):{},ae(e||!n||!n.__esModule?O(t,"default",{value:n,enumerable:!0}):t,n));var ie=s(()=>typeof document>"u"?new URL(`file:${__filename}`).href:document.currentScript&&document.currentScript.tagName.toUpperCase()==="SCRIPT"?document.currentScript.src:new URL("main.js",document.baseURI).href,"getImportMetaUrl"),E=ie();var W=require("find-up"),B=k(require("fs/promises"),1),G=require("path"),K=require("url"),Q=k(require("update-notifier"),1);var T=k(require("ajv"),1),r=k(require("chalk"),1),U=k(require("cli-table"),1),J=k(require("debug"),1),I=require("listr2"),j=require("lodash-es"),f=k(require("fs/promises"),1),R=require("path"),c=k(require("semver"),1),A=k(require("sort-package-json"),1);var F=["node","npm","yarn"],se="package-lock.json",oe="package.json",ce="nce",S=(0,J.default)(ce),le=s(()=>J.default.disable(),"namespaces"),pe=s(n=>J.default.enable(n),"enableNamespaces"),ge=s(({debug:n,quiet:e,verbose:t},a=process.env)=>{if(e)return{renderer:"silent"};if(t)return{renderer:"verbose"};let i=a.TERM==="dumb";return n||i?{renderer:"simple"}:a.NODE_ENV==="test"?{renderer:"test"}:{renderer:"default",rendererOptions:{dateFormat:!1}}},"renderer"),M=s(async n=>{var p;let e=n,t=s(l=>F.includes(l),"isValidConstraintEngine"),a={workingDir:(0,R.normalize)(process.cwd()),update:e.update||!1,verbose:e.verbose||!1,quiet:e.quiet||!1,debug:e.debug||!1,engines:((p=e.engines)==null?void 0:p.filter(t))||[],enableEngineStrict:e.enableEngineStrict||!1,packageLockPath:(0,R.join)(process.cwd(),se),packageJsonPath:(0,R.join)(process.cwd(),oe)},i={...ge({quiet:a.quiet,debug:a.debug,verbose:a.verbose})},o=le();return a.debug&&pe(o),$e({options:a,context:i}).run()},"checkEnginesFromCLI"),C=new T.default,q={type:"object",properties:{engines:{anyOf:[{type:"object",additionalProperties:{type:"string"},oneOf:[{required:["node"]},{required:["npm"]},{required:["yarn"]}]},{type:"array",items:{type:"string"}},{type:"object",not:{required:["engines"]}}]}}},me={type:"object",properties:{lockfileVersion:{type:"number",enum:[1,2,3]},dependencies:{type:"object",patternProperties:{"^.*$":q}},packages:{type:"object",patternProperties:{"^.*$":q}}},required:["lockfileVersion"],oneOf:[{properties:{lockfileVersion:{const:1}},required:["dependencies"],not:{required:["packages"]}},{properties:{lockfileVersion:{const:2}},required:["dependencies"]},{properties:{lockfileVersion:{const:3}},required:["packages"],not:{required:["dependencies"]}}]},m={loose:!1},V=s(n=>[...n.map(e=>[...e])].sort((e,t)=>c.compare(e[0].semver,t[0].semver)),"sortRangeSet"),v=s(n=>new c.Range(n.map(e=>e.map(t=>t.value).join(" ")).join("||"),m),"setToRange"),x=s((n,e)=>[...n.map(t=>[...t])].filter(t=>t[0].semver.major>=e.major).map(t=>(t[0].semver.major===e.major&&c.gte(e,t[0].semver,m)&&(t[0]=new c.Comparator(`${t[0].operator}${e.raw}`)),t)),"applyMinVersionToRangeSet"),N=s((n,e,t,a)=>{if(a(`${r.default.white("Compare:")} ${r.default.blue(n.raw)} ${r.default.white("and")} ${r.default.blue(e.raw)}`),c.subset(n,e))return a(`${r.default.white("Range")} ${r.default.green(n.raw)} ${r.default.white("is a subset of")} ${r.default.blue(e.raw)}`),t.push(e.raw),n;if(c.subset(e,n))return a(`${r.default.white("Range")} ${r.default.green(e.raw)} ${r.default.white("is a subset of")} ${r.default.blue(n.raw)}`),t.push(n.raw),e;if(n.intersects(e,m)){if(!e.intersects(n,m))return a(`${r.default.red("No intersection")} ${r.default.white("between")} ${r.default.blue(e.raw)} ${r.default.white("and")} ${r.default.blue(n.raw)}, ${r.default.white("returning")} ${r.default.green(e.raw)}`),e}else return a(`${r.default.red("No intersection")} ${r.default.white("between")} ${r.default.blue(n.raw)} ${r.default.white("and")} ${r.default.blue(e.raw)}, ${r.default.white("returning")} ${r.default.green(n.raw)}`),n;let i=c.minVersion(n,m)||new c.SemVer("*"),o=c.minVersion(e,m)||new c.SemVer("*"),p=V(n.set),l=V(e.set);for(;i.major!==o.major;)i.major>o.major?l=l.slice(1):p=p.slice(1),i=c.minVersion(v(p),m)||new c.SemVer("*"),o=c.minVersion(v(l),m)||new c.SemVer("*");if(!c.eq(i,o,m)){let y=c.compare(i,o)===-1?o:i;a(`${r.default.white("Applying minimal version")} ${r.default.yellow(y.version)} ${r.default.white("to both ranges.")}`);let d=v(x(p,y)),b=v(x(l,y));return d.test(y.raw)?b.test(y.raw)?d.intersects(b,m)?N(d,b,t,a):b.intersects(d,m)?N(b,d,t,a):(a(`${r.default.white("Unable to find intersection range")}: ${r.default.blue(d.raw)} and ${r.default.blue(b.raw)}, returning ${r.default.green(d.raw)}`),d):(a(`${r.default.white("Following range is not valid")}: ${r.default.red(b.raw)}, returning ${r.default.green(d.raw)}`),d):(a(`${r.default.white("Following range is not valid")}: ${r.default.red(d.raw)}, returning ${r.default.green(b.raw)}`),b)}let g=p.shift(),u=l.shift(),h=g||u;if(!h)throw new Error("Not yet implemented :/");let w=[h],$=v(p),X=v(l),Y=N($,X,t,a);return w.push(...V(Y.set)),v(w)},"restrictiveRange"),L=s(n=>{if(!n||n.raw==="*")return"*";let e=[];return V(n.set).forEach(a=>{let[i,o]=a;a.length===2&&i.operator===">="&&o.operator==="<"&&i.semver.major+1===o.semver.major?e.push(`^${i.semver.version}`):a.length===1&&i.operator===">="?e.push(i.value):e.push(`${i.value} ${(o==null?void 0:o.value)||""}`.trim())}),e.join(" || ")},"humanizeRange"),ue=s((n,e)=>{var t;if(typeof n=="object"&&e in n)return n[e];if((0,j.isArray)(n)&&n.some(a=>a.includes(e)))return(t=n.find(a=>a.includes(e)))==null?void 0:t.replace(e,"")},"getConstraintFromEngines"),P=s(({packages:n,constraintKey:e,debug:t})=>{let a=new c.Range("*"),i=[],o=t.extend(e);for(let[p,l]of Object.entries(n)){let{engines:g}=l;if(!g){o(`${r.default.white("Package")} ${r.default.gray(p)} ${r.default.white("has no engines")}`);continue}let u=ue(g,e);if(!u){o(`${r.default.white("Package")} ${r.default.gray(p)} ${r.default.white("has no constraints for current engine")}`);continue}let h=c.validRange(u);if(!h){o(`${r.default.red(u)} ${r.default.white("is not a valid semver range")}`);continue}if(i.indexOf(h)!==-1){o(`${r.default.white("Ignored range:")} ${r.default.gray(h)}`);continue}let w=new c.Range(h,m);if(!a){a=w,o(`${r.default.white("New most restrictive range:")} ${r.default.green(a.raw)}`);continue}let $=N(a,w,i,o);a.raw!==$.raw&&(a=$,o(`${r.default.white("New most restrictive range:")} ${r.default.green(a.raw)}`))}return o(a?`${r.default.white("Final computed engine range constraint:")} ${r.default.blue(a.raw)}`:`${r.default.white("No computed engine range constraint")}`),a},"computeEnginesConstraint"),de=s(n=>new U.default({style:{head:[],border:[],compact:!1,"padding-left":1,"padding-right":1},colWidths:n,colAligns:["left","left","left","left"],chars:{top:"","top-mid":"","top-left":"","top-right":"",bottom:"","bottom-mid":"","bottom-left":"","bottom-right":"",left:"","left-mid":"",mid:"","mid-mid":"",right:"","right-mid":"",middle:""}}),"createOutputTable"),fe=s(n=>{let e=["nce"];return n.engines&&e.push(...n.engines.map(t=>["-e",t]).flat()),n.quiet&&e.push("-q"),n.debug&&e.push("-d"),n.verbose&&e.push("-v"),e.push("-u"),e.join(" ")},"generateUpdateCommandFromContext"),we=s(n=>{let e=JSON.parse(n.packageLockString),t=JSON.parse(n.packageJsonString),a=n.engines,i=[],o=s(g=>F.indexOf(g)!==-1,"filterEngineConstraintKey"),p=[...F];a&&a.length>0&&(p=a.filter(o));let l;e.lockfileVersion===1?l=e.dependencies:e.lockfileVersion===2?l=e.packages?e.packages:e.dependencies:e.lockfileVersion===3&&(l=e.packages);for(let g of p){let u=P({packages:{"":{engines:t.engines||{}}},constraintKey:g,debug:S}),h=P({packages:(0,j.merge)({},{"":{engines:t.engines||{}}},l),constraintKey:g,debug:S}),w=L(h),$=L(u);w!==$&&(i.push({engine:g,range:$,rangeToSet:w}),t.engines=(0,j.merge)({},t.engines,{[g]:w}),(e.lockfileVersion===2||e.lockfileVersion===3)&&e.packages&&(e.packages[""].engines=(0,j.merge)({},e.packages[""].engines,{[g]:w})))}return{packageJson:t,packageLock:e,enginesRangeToSet:i}},"checkEnginesFromString"),ke=s(n=>{let e=C.compile(me),t=e(JSON.parse(n.packageLockString));if(!t)throw new Error(`Invalid package-lock.json: ${C.errorsText(e.errors)}`);return t},"validatePackageLock"),he=s(n=>{let e=C.compile(q),t=e(JSON.parse(n.packageJsonString));if(!t)throw new Error(`Invalid package.json: ${C.errorsText(e.errors)}`);return t},"validatePackageJson"),be=s(({options:n,parent:e})=>[{title:"Reading package-lock.json...",task:s(async t=>{t.packageLockString=await f.default.readFile(n.packageLockPath,"utf8")},"task")},{title:"Reading package.json...",task:s(async t=>{t.packageJsonString=await f.default.readFile(n.packageJsonPath,"utf8")},"task")},{title:"Validating package-lock.json...",task:s(t=>{ke(t)},"task")},{title:"Validating package.json...",task:s(t=>{he(t)},"task")},{title:"Compute engines range constraints...",task:s(t=>{Object.assign(t,we((0,j.merge)({},t,{engines:n.engines})))},"task")},{title:"Output computed engines range constraints...",task:s(t=>{let a=t.enginesRangeToSet,i="\u2192",o=[2,2,2,2],p=[];for(let{engine:l,range:g,rangeToSet:u}of a)S.extend(l)(`${r.default.white("Simplified computed engine range constraint:")} ${r.default.blue(u)}`),o=[Math.max(o[0],l.length+2),Math.max(o[1],g.length+2),i.length+2,Math.max(o[3],u.length+2)],p.push([l,g,i,u]);if(a.length===0)e.title=`All computed engines range constraints are up-to-date ${r.default.green(":)")}`;else{let l=de(o);l.push(...p);let g=`Computed engines range constraints:
3
-
4
- ${l.toString()}`;n.update||(g+=`
5
-
6
- Run ${r.default.cyan(fe(n))} to upgrade package.json.`),e.title=g}},"task")},{title:"Updating package.json...",skip:s(()=>n.update?!n.update:"Update is disabled by default.","skip"),task:s(t=>(S(`${r.default.white("Write JSON to")} ${r.default.blue("package.json")}`),Promise.all([f.default.writeFile(n.packageJsonPath,JSON.stringify((0,A.default)(t.packageJson),null,2)+`
7
- `),f.default.writeFile(n.packageLockPath,JSON.stringify(t.packageLock,null,2)+`
8
- `)])),"task")},{title:"Enabling engine-strict using .npmrc...",skip:s(()=>n.enableEngineStrict?!n.enableEngineStrict:"Enabling engine-strict is disabled by default.","skip"),task:s(async()=>{let t=".npmrc";try{await f.default.access(t,f.default.constants.F_OK|f.default.constants.R_OK),(await f.default.readFile(t,"utf8")).includes("engine-strict=true")?S(".npmrc file already contains engine-strict=true"):(await f.default.appendFile(t,`engine-strict=true
9
- `),S(".npmrc file has been updated to set engine-strict=true"))}catch{await f.default.writeFile(t,`engine-strict=true
10
- `),S(".npmrc file has been created and set engine-strict=true")}},"task")}],"checkEnginesTasks"),$e=s(({options:n,context:e})=>new I.Listr([{title:"Checking npm package engines range constraints in package-lock.json...",task:s((t,a)=>a.newListr(i=>be({parent:i,options:n})),"task")}],e),"checkEnginesCommand");var _=k(require("yargs"),1),z=require("yargs/helpers"),D=(0,_.default)((0,z.hideBin)(process.argv)),H=D.scriptName("nce").usage("Usage: $0 [options]").example("$0","Check package-lock.json file in current working directory.").strict().options({quiet:{boolean:!0,alias:"q",default:!1,description:"Enable quiet mode."},debug:{boolean:!0,alias:"d",default:!1,description:"Enable debug mode. Can be used with environment variable DEBUG=nce."},verbose:{boolean:!0,alias:"v",default:!1,description:"A little more detailed than the default output."},engines:{array:!0,alias:"e",description:"Select engines to check. Default will check all engines defined."},update:{boolean:!0,alias:"u",default:!1,description:"Update engines in package.json and package-lock.json."},enableEngineStrict:{boolean:!0,default:!1,description:"Enable engine strict."}}).help("help").version().wrap(D.terminalWidth()).epilog("\xA9 2023 Samuel MARLHENS").argv;(async()=>{let n=await(0,W.findUp)("package.json",{type:"file",cwd:(0,G.dirname)((0,K.fileURLToPath)(E))}),e=JSON.parse(await B.default.readFile(n,"utf8")),t=(0,Q.default)({pkg:e,updateCheckInterval:1e3*60,shouldNotifyInNpmScript:!0});t.update&&t.update.latest!==e.version&&t.notify({defer:!1,isGlobal:!0});let a=await H;await M(a)})();
2
+ const e=require(`../chunk-Bmb41Sf3.cjs`),t=require(`../lib/nce.cjs`),n=require(`../lib/yargs.cjs`);let r=require(`empathic/find`);r=e.t(r);let i=require(`node:fs/promises`);i=e.t(i);let a=require(`node:path`),o=require(`node:url`),s=require(`update-notifier`);s=e.t(s),(async()=>{let e=r.file(`package.json`,{cwd:(0,a.dirname)((0,o.fileURLToPath)(require(`url`).pathToFileURL(__filename).href))}),c=JSON.parse(await i.default.readFile(e,`utf8`)),l=(0,s.default)({pkg:c,updateCheckInterval:1e3*60,shouldNotifyInNpmScript:!0});l.update&&l.update.latest!==c.version&&l.notify({defer:!1,isGlobal:!0}),await t.checkEnginesFromCLI(await n.cli)})();
@@ -0,0 +1 @@
1
+ export { };
@@ -0,0 +1 @@
1
+ export { };
package/dist/bin/nce.js CHANGED
@@ -1,10 +1,2 @@
1
1
  #!/usr/bin/env node
2
- var D=Object.defineProperty;var s=(n,e)=>D(n,"name",{value:e,configurable:!0});import{findUp as pe}from"find-up";import me from"fs/promises";import{dirname as ue}from"path";import{fileURLToPath as de}from"url";import fe from"update-notifier";import M from"ajv";import r from"chalk";import z from"cli-table";import C from"debug";import{Listr as _}from"listr2";import{isArray as H,merge as y}from"lodash-es";import w from"fs/promises";import{join as J,normalize as W}from"path";import*as c from"semver";import B from"sort-package-json";var V=["node","npm","yarn"],G="package-lock.json",K="package.json",Q="nce",v=C(Q),X=s(()=>C.disable(),"namespaces"),Y=s(n=>C.enable(n),"enableNamespaces"),Z=s(({debug:n,quiet:e,verbose:t},a=process.env)=>{if(e)return{renderer:"silent"};if(t)return{renderer:"verbose"};let o=a.TERM==="dumb";return n||o?{renderer:"simple"}:a.NODE_ENV==="test"?{renderer:"test"}:{renderer:"default",rendererOptions:{dateFormat:!1}}},"renderer"),P=s(async n=>{var g;let e=n,t=s(l=>V.includes(l),"isValidConstraintEngine"),a={workingDir:W(process.cwd()),update:e.update||!1,verbose:e.verbose||!1,quiet:e.quiet||!1,debug:e.debug||!1,engines:((g=e.engines)==null?void 0:g.filter(t))||[],enableEngineStrict:e.enableEngineStrict||!1,packageLockPath:J(process.cwd(),G),packageJsonPath:J(process.cwd(),K)},o={...Z({quiet:a.quiet,debug:a.debug,verbose:a.verbose})},i=X();return a.debug&&Y(i),ce({options:a,context:o}).run()},"checkEnginesFromCLI"),R=new M,N={type:"object",properties:{engines:{anyOf:[{type:"object",additionalProperties:{type:"string"},oneOf:[{required:["node"]},{required:["npm"]},{required:["yarn"]}]},{type:"array",items:{type:"string"}},{type:"object",not:{required:["engines"]}}]}}},ee={type:"object",properties:{lockfileVersion:{type:"number",enum:[1,2,3]},dependencies:{type:"object",patternProperties:{"^.*$":N}},packages:{type:"object",patternProperties:{"^.*$":N}}},required:["lockfileVersion"],oneOf:[{properties:{lockfileVersion:{const:1}},required:["dependencies"],not:{required:["packages"]}},{properties:{lockfileVersion:{const:2}},required:["dependencies"]},{properties:{lockfileVersion:{const:3}},required:["packages"],not:{required:["dependencies"]}}]},m={loose:!1},S=s(n=>[...n.map(e=>[...e])].sort((e,t)=>c.compare(e[0].semver,t[0].semver)),"sortRangeSet"),$=s(n=>new c.Range(n.map(e=>e.map(t=>t.value).join(" ")).join("||"),m),"setToRange"),O=s((n,e)=>[...n.map(t=>[...t])].filter(t=>t[0].semver.major>=e.major).map(t=>(t[0].semver.major===e.major&&c.gte(e,t[0].semver,m)&&(t[0]=new c.Comparator(`${t[0].operator}${e.raw}`)),t)),"applyMinVersionToRangeSet"),E=s((n,e,t,a)=>{if(a(`${r.white("Compare:")} ${r.blue(n.raw)} ${r.white("and")} ${r.blue(e.raw)}`),c.subset(n,e))return a(`${r.white("Range")} ${r.green(n.raw)} ${r.white("is a subset of")} ${r.blue(e.raw)}`),t.push(e.raw),n;if(c.subset(e,n))return a(`${r.white("Range")} ${r.green(e.raw)} ${r.white("is a subset of")} ${r.blue(n.raw)}`),t.push(n.raw),e;if(n.intersects(e,m)){if(!e.intersects(n,m))return a(`${r.red("No intersection")} ${r.white("between")} ${r.blue(e.raw)} ${r.white("and")} ${r.blue(n.raw)}, ${r.white("returning")} ${r.green(e.raw)}`),e}else return a(`${r.red("No intersection")} ${r.white("between")} ${r.blue(n.raw)} ${r.white("and")} ${r.blue(e.raw)}, ${r.white("returning")} ${r.green(n.raw)}`),n;let o=c.minVersion(n,m)||new c.SemVer("*"),i=c.minVersion(e,m)||new c.SemVer("*"),g=S(n.set),l=S(e.set);for(;o.major!==i.major;)o.major>i.major?l=l.slice(1):g=g.slice(1),o=c.minVersion($(g),m)||new c.SemVer("*"),i=c.minVersion($(l),m)||new c.SemVer("*");if(!c.eq(o,i,m)){let j=c.compare(o,i)===-1?i:o;a(`${r.white("Applying minimal version")} ${r.yellow(j.version)} ${r.white("to both ranges.")}`);let d=$(O(g,j)),h=$(O(l,j));return d.test(j.raw)?h.test(j.raw)?d.intersects(h,m)?E(d,h,t,a):h.intersects(d,m)?E(h,d,t,a):(a(`${r.white("Unable to find intersection range")}: ${r.blue(d.raw)} and ${r.blue(h.raw)}, returning ${r.green(d.raw)}`),d):(a(`${r.white("Following range is not valid")}: ${r.red(h.raw)}, returning ${r.green(d.raw)}`),d):(a(`${r.white("Following range is not valid")}: ${r.red(d.raw)}, returning ${r.green(h.raw)}`),h)}let p=g.shift(),u=l.shift(),k=p||u;if(!k)throw new Error("Not yet implemented :/");let f=[k],b=$(g),U=$(l),I=E(b,U,t,a);return f.push(...S(I.set)),$(f)},"restrictiveRange"),F=s(n=>{if(!n||n.raw==="*")return"*";let e=[];return S(n.set).forEach(a=>{let[o,i]=a;a.length===2&&o.operator===">="&&i.operator==="<"&&o.semver.major+1===i.semver.major?e.push(`^${o.semver.version}`):a.length===1&&o.operator===">="?e.push(o.value):e.push(`${o.value} ${(i==null?void 0:i.value)||""}`.trim())}),e.join(" || ")},"humanizeRange"),ne=s((n,e)=>{var t;if(typeof n=="object"&&e in n)return n[e];if(H(n)&&n.some(a=>a.includes(e)))return(t=n.find(a=>a.includes(e)))==null?void 0:t.replace(e,"")},"getConstraintFromEngines"),q=s(({packages:n,constraintKey:e,debug:t})=>{let a=new c.Range("*"),o=[],i=t.extend(e);for(let[g,l]of Object.entries(n)){let{engines:p}=l;if(!p){i(`${r.white("Package")} ${r.gray(g)} ${r.white("has no engines")}`);continue}let u=ne(p,e);if(!u){i(`${r.white("Package")} ${r.gray(g)} ${r.white("has no constraints for current engine")}`);continue}let k=c.validRange(u);if(!k){i(`${r.red(u)} ${r.white("is not a valid semver range")}`);continue}if(o.indexOf(k)!==-1){i(`${r.white("Ignored range:")} ${r.gray(k)}`);continue}let f=new c.Range(k,m);if(!a){a=f,i(`${r.white("New most restrictive range:")} ${r.green(a.raw)}`);continue}let b=E(a,f,o,i);a.raw!==b.raw&&(a=b,i(`${r.white("New most restrictive range:")} ${r.green(a.raw)}`))}return i(a?`${r.white("Final computed engine range constraint:")} ${r.blue(a.raw)}`:`${r.white("No computed engine range constraint")}`),a},"computeEnginesConstraint"),te=s(n=>new z({style:{head:[],border:[],compact:!1,"padding-left":1,"padding-right":1},colWidths:n,colAligns:["left","left","left","left"],chars:{top:"","top-mid":"","top-left":"","top-right":"",bottom:"","bottom-mid":"","bottom-left":"","bottom-right":"",left:"","left-mid":"",mid:"","mid-mid":"",right:"","right-mid":"",middle:""}}),"createOutputTable"),re=s(n=>{let e=["nce"];return n.engines&&e.push(...n.engines.map(t=>["-e",t]).flat()),n.quiet&&e.push("-q"),n.debug&&e.push("-d"),n.verbose&&e.push("-v"),e.push("-u"),e.join(" ")},"generateUpdateCommandFromContext"),ae=s(n=>{let e=JSON.parse(n.packageLockString),t=JSON.parse(n.packageJsonString),a=n.engines,o=[],i=s(p=>V.indexOf(p)!==-1,"filterEngineConstraintKey"),g=[...V];a&&a.length>0&&(g=a.filter(i));let l;e.lockfileVersion===1?l=e.dependencies:e.lockfileVersion===2?l=e.packages?e.packages:e.dependencies:e.lockfileVersion===3&&(l=e.packages);for(let p of g){let u=q({packages:{"":{engines:t.engines||{}}},constraintKey:p,debug:v}),k=q({packages:y({},{"":{engines:t.engines||{}}},l),constraintKey:p,debug:v}),f=F(k),b=F(u);f!==b&&(o.push({engine:p,range:b,rangeToSet:f}),t.engines=y({},t.engines,{[p]:f}),(e.lockfileVersion===2||e.lockfileVersion===3)&&e.packages&&(e.packages[""].engines=y({},e.packages[""].engines,{[p]:f})))}return{packageJson:t,packageLock:e,enginesRangeToSet:o}},"checkEnginesFromString"),ie=s(n=>{let e=R.compile(ee),t=e(JSON.parse(n.packageLockString));if(!t)throw new Error(`Invalid package-lock.json: ${R.errorsText(e.errors)}`);return t},"validatePackageLock"),se=s(n=>{let e=R.compile(N),t=e(JSON.parse(n.packageJsonString));if(!t)throw new Error(`Invalid package.json: ${R.errorsText(e.errors)}`);return t},"validatePackageJson"),oe=s(({options:n,parent:e})=>[{title:"Reading package-lock.json...",task:s(async t=>{t.packageLockString=await w.readFile(n.packageLockPath,"utf8")},"task")},{title:"Reading package.json...",task:s(async t=>{t.packageJsonString=await w.readFile(n.packageJsonPath,"utf8")},"task")},{title:"Validating package-lock.json...",task:s(t=>{ie(t)},"task")},{title:"Validating package.json...",task:s(t=>{se(t)},"task")},{title:"Compute engines range constraints...",task:s(t=>{Object.assign(t,ae(y({},t,{engines:n.engines})))},"task")},{title:"Output computed engines range constraints...",task:s(t=>{let a=t.enginesRangeToSet,o="\u2192",i=[2,2,2,2],g=[];for(let{engine:l,range:p,rangeToSet:u}of a)v.extend(l)(`${r.white("Simplified computed engine range constraint:")} ${r.blue(u)}`),i=[Math.max(i[0],l.length+2),Math.max(i[1],p.length+2),o.length+2,Math.max(i[3],u.length+2)],g.push([l,p,o,u]);if(a.length===0)e.title=`All computed engines range constraints are up-to-date ${r.green(":)")}`;else{let l=te(i);l.push(...g);let p=`Computed engines range constraints:
3
-
4
- ${l.toString()}`;n.update||(p+=`
5
-
6
- Run ${r.cyan(re(n))} to upgrade package.json.`),e.title=p}},"task")},{title:"Updating package.json...",skip:s(()=>n.update?!n.update:"Update is disabled by default.","skip"),task:s(t=>(v(`${r.white("Write JSON to")} ${r.blue("package.json")}`),Promise.all([w.writeFile(n.packageJsonPath,JSON.stringify(B(t.packageJson),null,2)+`
7
- `),w.writeFile(n.packageLockPath,JSON.stringify(t.packageLock,null,2)+`
8
- `)])),"task")},{title:"Enabling engine-strict using .npmrc...",skip:s(()=>n.enableEngineStrict?!n.enableEngineStrict:"Enabling engine-strict is disabled by default.","skip"),task:s(async()=>{let t=".npmrc";try{await w.access(t,w.constants.F_OK|w.constants.R_OK),(await w.readFile(t,"utf8")).includes("engine-strict=true")?v(".npmrc file already contains engine-strict=true"):(await w.appendFile(t,`engine-strict=true
9
- `),v(".npmrc file has been updated to set engine-strict=true"))}catch{await w.writeFile(t,`engine-strict=true
10
- `),v(".npmrc file has been created and set engine-strict=true")}},"task")}],"checkEnginesTasks"),ce=s(({options:n,context:e})=>new _([{title:"Checking npm package engines range constraints in package-lock.json...",task:s((t,a)=>a.newListr(o=>oe({parent:o,options:n})),"task")}],e),"checkEnginesCommand");import le from"yargs";import{hideBin as ge}from"yargs/helpers";var T=le(ge(process.argv)),A=T.scriptName("nce").usage("Usage: $0 [options]").example("$0","Check package-lock.json file in current working directory.").strict().options({quiet:{boolean:!0,alias:"q",default:!1,description:"Enable quiet mode."},debug:{boolean:!0,alias:"d",default:!1,description:"Enable debug mode. Can be used with environment variable DEBUG=nce."},verbose:{boolean:!0,alias:"v",default:!1,description:"A little more detailed than the default output."},engines:{array:!0,alias:"e",description:"Select engines to check. Default will check all engines defined."},update:{boolean:!0,alias:"u",default:!1,description:"Update engines in package.json and package-lock.json."},enableEngineStrict:{boolean:!0,default:!1,description:"Enable engine strict."}}).help("help").version().wrap(T.terminalWidth()).epilog("\xA9 2023 Samuel MARLHENS").argv;(async()=>{let n=await pe("package.json",{type:"file",cwd:ue(de(import.meta.url))}),e=JSON.parse(await me.readFile(n,"utf8")),t=fe({pkg:e,updateCheckInterval:1e3*60,shouldNotifyInNpmScript:!0});t.update&&t.update.latest!==e.version&&t.notify({defer:!1,isGlobal:!0});let a=await A;await P(a)})();
2
+ import{checkEnginesFromCLI as e}from"../lib/nce.js";import{cli as t}from"../lib/yargs.js";import*as n from"empathic/find";import r from"node:fs/promises";import{dirname as i}from"node:path";import{fileURLToPath as a}from"node:url";import o from"update-notifier";(async()=>{let s=n.file(`package.json`,{cwd:i(a(import.meta.url))}),c=JSON.parse(await r.readFile(s,`utf8`)),l=o({pkg:c,updateCheckInterval:1e3*60,shouldNotifyInNpmScript:!0});l.update&&l.update.latest!==c.version&&l.notify({defer:!1,isGlobal:!0}),await e(await t)})();export{};
@@ -0,0 +1 @@
1
+ var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(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},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return s}});
package/dist/lib/nce.cjs CHANGED
@@ -1,9 +1,5 @@
1
- "use strict";var W=Object.create;var V=Object.defineProperty;var K=Object.getOwnPropertyDescriptor;var B=Object.getOwnPropertyNames;var G=Object.getPrototypeOf,Q=Object.prototype.hasOwnProperty;var o=(n,e)=>V(n,"name",{value:e,configurable:!0});var X=(n,e)=>{for(var t in e)V(n,t,{get:e[t],enumerable:!0})},L=(n,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of B(e))!Q.call(n,s)&&s!==t&&V(n,s,{get:()=>e[s],enumerable:!(i=K(e,s))||i.enumerable});return n};var v=(n,e,t)=>(t=n!=null?W(G(n)):{},L(e||!n||!n.__esModule?V(t,"default",{value:n,enumerable:!0}):t,n)),Y=n=>L(V({},"__esModule",{value:!0}),n);var me={};X(me,{applyMinVersionToRangeSet:()=>q,checkEnginesFromCLI:()=>se,checkEnginesFromString:()=>D,humanizeRange:()=>x,rangeOptions:()=>m,restrictiveRange:()=>E,setToRange:()=>$,sortRangeSet:()=>R,validatePackageJson:()=>U,validatePackageLock:()=>I});module.exports=Y(me);var T=v(require("ajv"),1),r=v(require("chalk"),1),A=v(require("cli-table"),1),J=v(require("debug"),1),M=require("listr2"),S=require("lodash-es"),f=v(require("fs/promises"),1),O=require("path"),c=v(require("semver"),1),z=v(require("sort-package-json"),1);var N=["node","npm","yarn"],Z="package-lock.json",ee="package.json",ne="nce",j=(0,J.default)(ne),te=o(()=>J.default.disable(),"namespaces"),re=o(n=>J.default.enable(n),"enableNamespaces"),ie=o(({debug:n,quiet:e,verbose:t},i=process.env)=>{if(e)return{renderer:"silent"};if(t)return{renderer:"verbose"};let s=i.TERM==="dumb";return n||s?{renderer:"simple"}:i.NODE_ENV==="test"?{renderer:"test"}:{renderer:"default",rendererOptions:{dateFormat:!1}}},"renderer"),se=o(async n=>{var l;let e=n,t=o(g=>N.includes(g),"isValidConstraintEngine"),i={workingDir:(0,O.normalize)(process.cwd()),update:e.update||!1,verbose:e.verbose||!1,quiet:e.quiet||!1,debug:e.debug||!1,engines:((l=e.engines)==null?void 0:l.filter(t))||[],enableEngineStrict:e.enableEngineStrict||!1,packageLockPath:(0,O.join)(process.cwd(),Z),packageJsonPath:(0,O.join)(process.cwd(),ee)},s={...ie({quiet:i.quiet,debug:i.debug,verbose:i.verbose})},a=te();return i.debug&&re(a),pe({options:i,context:s}).run()},"checkEnginesFromCLI"),F=new T.default,C={type:"object",properties:{engines:{anyOf:[{type:"object",additionalProperties:{type:"string"},oneOf:[{required:["node"]},{required:["npm"]},{required:["yarn"]}]},{type:"array",items:{type:"string"}},{type:"object",not:{required:["engines"]}}]}}},ae={type:"object",properties:{lockfileVersion:{type:"number",enum:[1,2,3]},dependencies:{type:"object",patternProperties:{"^.*$":C}},packages:{type:"object",patternProperties:{"^.*$":C}}},required:["lockfileVersion"],oneOf:[{properties:{lockfileVersion:{const:1}},required:["dependencies"],not:{required:["packages"]}},{properties:{lockfileVersion:{const:2}},required:["dependencies"]},{properties:{lockfileVersion:{const:3}},required:["packages"],not:{required:["dependencies"]}}]},m={loose:!1},R=o(n=>[...n.map(e=>[...e])].sort((e,t)=>c.compare(e[0].semver,t[0].semver)),"sortRangeSet"),$=o(n=>new c.Range(n.map(e=>e.map(t=>t.value).join(" ")).join("||"),m),"setToRange"),q=o((n,e)=>[...n.map(t=>[...t])].filter(t=>t[0].semver.major>=e.major).map(t=>(t[0].semver.major===e.major&&c.gte(e,t[0].semver,m)&&(t[0]=new c.Comparator(`${t[0].operator}${e.raw}`)),t)),"applyMinVersionToRangeSet"),E=o((n,e,t,i)=>{if(i(`${r.default.white("Compare:")} ${r.default.blue(n.raw)} ${r.default.white("and")} ${r.default.blue(e.raw)}`),c.subset(n,e))return i(`${r.default.white("Range")} ${r.default.green(n.raw)} ${r.default.white("is a subset of")} ${r.default.blue(e.raw)}`),t.push(e.raw),n;if(c.subset(e,n))return i(`${r.default.white("Range")} ${r.default.green(e.raw)} ${r.default.white("is a subset of")} ${r.default.blue(n.raw)}`),t.push(n.raw),e;if(n.intersects(e,m)){if(!e.intersects(n,m))return i(`${r.default.red("No intersection")} ${r.default.white("between")} ${r.default.blue(e.raw)} ${r.default.white("and")} ${r.default.blue(n.raw)}, ${r.default.white("returning")} ${r.default.green(e.raw)}`),e}else return i(`${r.default.red("No intersection")} ${r.default.white("between")} ${r.default.blue(n.raw)} ${r.default.white("and")} ${r.default.blue(e.raw)}, ${r.default.white("returning")} ${r.default.green(n.raw)}`),n;let s=c.minVersion(n,m)||new c.SemVer("*"),a=c.minVersion(e,m)||new c.SemVer("*"),l=R(n.set),g=R(e.set);for(;s.major!==a.major;)s.major>a.major?g=g.slice(1):l=l.slice(1),s=c.minVersion($(l),m)||new c.SemVer("*"),a=c.minVersion($(g),m)||new c.SemVer("*");if(!c.eq(s,a,m)){let y=c.compare(s,a)===-1?a:s;i(`${r.default.white("Applying minimal version")} ${r.default.yellow(y.version)} ${r.default.white("to both ranges.")}`);let d=$(q(l,y)),h=$(q(g,y));return d.test(y.raw)?h.test(y.raw)?d.intersects(h,m)?E(d,h,t,i):h.intersects(d,m)?E(h,d,t,i):(i(`${r.default.white("Unable to find intersection range")}: ${r.default.blue(d.raw)} and ${r.default.blue(h.raw)}, returning ${r.default.green(d.raw)}`),d):(i(`${r.default.white("Following range is not valid")}: ${r.default.red(h.raw)}, returning ${r.default.green(d.raw)}`),d):(i(`${r.default.white("Following range is not valid")}: ${r.default.red(d.raw)}, returning ${r.default.green(h.raw)}`),h)}let p=l.shift(),u=g.shift(),k=p||u;if(!k)throw new Error("Not yet implemented :/");let w=[k],b=$(l),_=$(g),H=E(b,_,t,i);return w.push(...R(H.set)),$(w)},"restrictiveRange"),x=o(n=>{if(!n||n.raw==="*")return"*";let e=[];return R(n.set).forEach(i=>{let[s,a]=i;i.length===2&&s.operator===">="&&a.operator==="<"&&s.semver.major+1===a.semver.major?e.push(`^${s.semver.version}`):i.length===1&&s.operator===">="?e.push(s.value):e.push(`${s.value} ${(a==null?void 0:a.value)||""}`.trim())}),e.join(" || ")},"humanizeRange"),oe=o((n,e)=>{var t;if(typeof n=="object"&&e in n)return n[e];if((0,S.isArray)(n)&&n.some(i=>i.includes(e)))return(t=n.find(i=>i.includes(e)))==null?void 0:t.replace(e,"")},"getConstraintFromEngines"),P=o(({packages:n,constraintKey:e,debug:t})=>{let i=new c.Range("*"),s=[],a=t.extend(e);for(let[l,g]of Object.entries(n)){let{engines:p}=g;if(!p){a(`${r.default.white("Package")} ${r.default.gray(l)} ${r.default.white("has no engines")}`);continue}let u=oe(p,e);if(!u){a(`${r.default.white("Package")} ${r.default.gray(l)} ${r.default.white("has no constraints for current engine")}`);continue}let k=c.validRange(u);if(!k){a(`${r.default.red(u)} ${r.default.white("is not a valid semver range")}`);continue}if(s.indexOf(k)!==-1){a(`${r.default.white("Ignored range:")} ${r.default.gray(k)}`);continue}let w=new c.Range(k,m);if(!i){i=w,a(`${r.default.white("New most restrictive range:")} ${r.default.green(i.raw)}`);continue}let b=E(i,w,s,a);i.raw!==b.raw&&(i=b,a(`${r.default.white("New most restrictive range:")} ${r.default.green(i.raw)}`))}return a(i?`${r.default.white("Final computed engine range constraint:")} ${r.default.blue(i.raw)}`:`${r.default.white("No computed engine range constraint")}`),i},"computeEnginesConstraint"),ce=o(n=>new A.default({style:{head:[],border:[],compact:!1,"padding-left":1,"padding-right":1},colWidths:n,colAligns:["left","left","left","left"],chars:{top:"","top-mid":"","top-left":"","top-right":"",bottom:"","bottom-mid":"","bottom-left":"","bottom-right":"",left:"","left-mid":"",mid:"","mid-mid":"",right:"","right-mid":"",middle:""}}),"createOutputTable"),ge=o(n=>{let e=["nce"];return n.engines&&e.push(...n.engines.map(t=>["-e",t]).flat()),n.quiet&&e.push("-q"),n.debug&&e.push("-d"),n.verbose&&e.push("-v"),e.push("-u"),e.join(" ")},"generateUpdateCommandFromContext"),D=o(n=>{let e=JSON.parse(n.packageLockString),t=JSON.parse(n.packageJsonString),i=n.engines,s=[],a=o(p=>N.indexOf(p)!==-1,"filterEngineConstraintKey"),l=[...N];i&&i.length>0&&(l=i.filter(a));let g;e.lockfileVersion===1?g=e.dependencies:e.lockfileVersion===2?g=e.packages?e.packages:e.dependencies:e.lockfileVersion===3&&(g=e.packages);for(let p of l){let u=P({packages:{"":{engines:t.engines||{}}},constraintKey:p,debug:j}),k=P({packages:(0,S.merge)({},{"":{engines:t.engines||{}}},g),constraintKey:p,debug:j}),w=x(k),b=x(u);w!==b&&(s.push({engine:p,range:b,rangeToSet:w}),t.engines=(0,S.merge)({},t.engines,{[p]:w}),(e.lockfileVersion===2||e.lockfileVersion===3)&&e.packages&&(e.packages[""].engines=(0,S.merge)({},e.packages[""].engines,{[p]:w})))}return{packageJson:t,packageLock:e,enginesRangeToSet:s}},"checkEnginesFromString"),I=o(n=>{let e=F.compile(ae),t=e(JSON.parse(n.packageLockString));if(!t)throw new Error(`Invalid package-lock.json: ${F.errorsText(e.errors)}`);return t},"validatePackageLock"),U=o(n=>{let e=F.compile(C),t=e(JSON.parse(n.packageJsonString));if(!t)throw new Error(`Invalid package.json: ${F.errorsText(e.errors)}`);return t},"validatePackageJson"),le=o(({options:n,parent:e})=>[{title:"Reading package-lock.json...",task:o(async t=>{t.packageLockString=await f.default.readFile(n.packageLockPath,"utf8")},"task")},{title:"Reading package.json...",task:o(async t=>{t.packageJsonString=await f.default.readFile(n.packageJsonPath,"utf8")},"task")},{title:"Validating package-lock.json...",task:o(t=>{I(t)},"task")},{title:"Validating package.json...",task:o(t=>{U(t)},"task")},{title:"Compute engines range constraints...",task:o(t=>{Object.assign(t,D((0,S.merge)({},t,{engines:n.engines})))},"task")},{title:"Output computed engines range constraints...",task:o(t=>{let i=t.enginesRangeToSet,s="\u2192",a=[2,2,2,2],l=[];for(let{engine:g,range:p,rangeToSet:u}of i)j.extend(g)(`${r.default.white("Simplified computed engine range constraint:")} ${r.default.blue(u)}`),a=[Math.max(a[0],g.length+2),Math.max(a[1],p.length+2),s.length+2,Math.max(a[3],u.length+2)],l.push([g,p,s,u]);if(i.length===0)e.title=`All computed engines range constraints are up-to-date ${r.default.green(":)")}`;else{let g=ce(a);g.push(...l);let p=`Computed engines range constraints:
2
-
3
- ${g.toString()}`;n.update||(p+=`
4
-
5
- Run ${r.default.cyan(ge(n))} to upgrade package.json.`),e.title=p}},"task")},{title:"Updating package.json...",skip:o(()=>n.update?!n.update:"Update is disabled by default.","skip"),task:o(t=>(j(`${r.default.white("Write JSON to")} ${r.default.blue("package.json")}`),Promise.all([f.default.writeFile(n.packageJsonPath,JSON.stringify((0,z.default)(t.packageJson),null,2)+`
6
- `),f.default.writeFile(n.packageLockPath,JSON.stringify(t.packageLock,null,2)+`
7
- `)])),"task")},{title:"Enabling engine-strict using .npmrc...",skip:o(()=>n.enableEngineStrict?!n.enableEngineStrict:"Enabling engine-strict is disabled by default.","skip"),task:o(async()=>{let t=".npmrc";try{await f.default.access(t,f.default.constants.F_OK|f.default.constants.R_OK),(await f.default.readFile(t,"utf8")).includes("engine-strict=true")?j(".npmrc file already contains engine-strict=true"):(await f.default.appendFile(t,`engine-strict=true
8
- `),j(".npmrc file has been updated to set engine-strict=true"))}catch{await f.default.writeFile(t,`engine-strict=true
9
- `),j(".npmrc file has been created and set engine-strict=true")}},"task")}],"checkEnginesTasks"),pe=o(({options:n,context:e})=>new M.Listr([{title:"Checking npm package engines range constraints in package-lock.json...",task:o((t,i)=>i.newListr(s=>le({parent:s,options:n})),"task")}],e),"checkEnginesCommand");0&&(module.exports={applyMinVersionToRangeSet,checkEnginesFromCLI,checkEnginesFromString,humanizeRange,rangeOptions,restrictiveRange,setToRange,sortRangeSet,validatePackageJson,validatePackageLock});
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../chunk-Bmb41Sf3.cjs`);let t=require(`node:fs/promises`);t=e.t(t);let n=require(`node:path`),r=require(`ajv`);r=e.t(r);let i=require(`cli-table`);i=e.t(i);let a=require(`listr2`),o=require(`lodash-es`),s=require(`obug`),c=require(`picocolors`);c=e.t(c);let l=require(`semver`);l=e.t(l);let u=require(`sort-package-json`);u=e.t(u);const d=[`node`,`npm`,`yarn`],f=(0,s.createDebug)(`nce`),p=()=>(0,s.disable)(),m=e=>(0,s.enable)(e),h=({debug:e,quiet:t,verbose:n},r=process.env)=>{if(t)return{renderer:`silent`};if(n)return{renderer:`verbose`};let i=r.TERM===`dumb`;return e||i?{renderer:`simple`}:r.NODE_ENV===`test`?{renderer:`test`}:{renderer:`default`,rendererOptions:{dateFormat:!1}}},g=async e=>{let t=e,r={workingDir:(0,n.normalize)(process.cwd()),update:t.update||!1,verbose:t.verbose||!1,quiet:t.quiet||!1,debug:t.debug||!1,engines:t.engines?.filter(e=>d.includes(e))||[],enableEngineStrict:t.enableEngineStrict||!1,packageLockPath:(0,n.join)(process.cwd(),`package-lock.json`),packageJsonPath:(0,n.join)(process.cwd(),`package.json`)},i={...h({quiet:r.quiet,debug:r.debug,verbose:r.verbose})},a=p();return r.debug&&m(a),P({options:r,context:i}).run()},_=new r.default,v={type:`object`,properties:{engines:{anyOf:[{type:`object`,additionalProperties:{type:`string`},oneOf:[{required:[`node`]},{required:[`npm`]},{required:[`yarn`]}]},{type:`array`,items:{type:`string`}},{type:`object`,not:{required:[`engines`]}}]}}},y={type:`object`,properties:{lockfileVersion:{type:`number`,enum:[1,2,3]},dependencies:{type:`object`,patternProperties:{"^.*$":v}},packages:{type:`object`,patternProperties:{"^.*$":v}}},required:[`lockfileVersion`],oneOf:[{properties:{lockfileVersion:{const:1}},required:[`dependencies`],not:{required:[`packages`]}},{properties:{lockfileVersion:{const:2}},required:[`dependencies`]},{properties:{lockfileVersion:{const:3}},required:[`packages`],not:{required:[`dependencies`]}}]},b={loose:!1},x=e=>[...e.map(e=>[...e])].sort((e,t)=>l.compare(e[0].semver,t[0].semver)),S=e=>new l.Range(e.map(e=>e.map(e=>e.value).join(` `)).join(`||`),b),C=(e,t)=>[...e.map(e=>[...e])].filter(e=>e[0].semver.major>=t.major).map(e=>(e[0].semver.major===t.major&&l.gte(t,e[0].semver,b)&&(e[0]=new l.Comparator(`${e[0].operator}${t.raw}`)),e)),w=(e,t,n,r)=>{if(r(`${c.default.white(`Compare:`)} ${c.default.blue(e.raw)} ${c.default.white(`and`)} ${c.default.blue(t.raw)}`),l.subset(e,t))return r(`${c.default.white(`Range`)} ${c.default.green(e.raw)} ${c.default.white(`is a subset of`)} ${c.default.blue(t.raw)}`),n.push(t.raw),e;if(l.subset(t,e))return r(`${c.default.white(`Range`)} ${c.default.green(t.raw)} ${c.default.white(`is a subset of`)} ${c.default.blue(e.raw)}`),n.push(e.raw),t;if(!e.intersects(t,b))return r(`${c.default.red(`No intersection`)} ${c.default.white(`between`)} ${c.default.blue(e.raw)} ${c.default.white(`and`)} ${c.default.blue(t.raw)}, ${c.default.white(`returning`)} ${c.default.green(e.raw)}`),e;if(!t.intersects(e,b))return r(`${c.default.red(`No intersection`)} ${c.default.white(`between`)} ${c.default.blue(t.raw)} ${c.default.white(`and`)} ${c.default.blue(e.raw)}, ${c.default.white(`returning`)} ${c.default.green(t.raw)}`),t;let i=l.minVersion(e,b)||new l.SemVer(`*`),a=l.minVersion(t,b)||new l.SemVer(`*`),o=x(e.set),s=x(t.set);for(;i.major!==a.major;)i.major>a.major?s=s.slice(1):o=o.slice(1),i=l.minVersion(S(o),b)||new l.SemVer(`*`),a=l.minVersion(S(s),b)||new l.SemVer(`*`);if(!l.eq(i,a,b)){let e=l.compare(i,a)===-1?a:i;r(`${c.default.white(`Applying minimal version`)} ${c.default.yellow(e.version)} ${c.default.white(`to both ranges.`)}`);let t=S(C(o,e)),u=S(C(s,e));return t.test(e.raw)?u.test(e.raw)?t.intersects(u,b)?w(t,u,n,r):u.intersects(t,b)?w(u,t,n,r):(r(`${c.default.white(`Unable to find intersection range`)}: ${c.default.blue(t.raw)} and ${c.default.blue(u.raw)}, returning ${c.default.green(t.raw)}`),t):(r(`${c.default.white(`Following range is not valid`)}: ${c.default.red(u.raw)}, returning ${c.default.green(t.raw)}`),t):(r(`${c.default.white(`Following range is not valid`)}: ${c.default.red(t.raw)}, returning ${c.default.green(u.raw)}`),u)}let u=o.shift(),d=s.shift(),f=u||d;if(!f)throw Error(`Not yet implemented :/`);let p=[f],m=w(S(o),S(s),n,r);return p.push(...x(m.set)),S(p)},T=e=>{if(!e||e.raw===`*`)return`*`;let t=[];return x(e.set).forEach(e=>{let[n,r]=e;e.length===2&&n.operator===`>=`&&r.operator===`<`&&n.semver.major+1===r.semver.major?t.push(`^${n.semver.version}`):e.length===1&&n.operator===`>=`?t.push(n.value):t.push(`${n.value} ${r?.value||``}`.trim())}),t.join(` || `)},E=(e,t)=>{if(typeof e==`object`&&t in e)return e[t];if((0,o.isArray)(e)&&e.some(e=>e.includes(t)))return e.find(e=>e.includes(t))?.replace(t,``)},D=({packages:e,constraintKey:t,debug:n})=>{let r=new l.Range(`*`),i=[],a=n.extend(t);for(let[n,o]of Object.entries(e)){let{engines:e}=o;if(!e){a(`${c.default.white(`Package`)} ${c.default.gray(n)} ${c.default.white(`has no engines`)}`);continue}let s=E(e,t);if(!s){a(`${c.default.white(`Package`)} ${c.default.gray(n)} ${c.default.white(`has no constraints for current engine`)}`);continue}let u=l.validRange(s);if(!u){a(`${c.default.red(s)} ${c.default.white(`is not a valid semver range`)}`);continue}if(i.indexOf(u)!==-1){a(`${c.default.white(`Ignored range:`)} ${c.default.gray(u)}`);continue}let d=new l.Range(u,b);if(!r){r=d,a(`${c.default.white(`New most restrictive range:`)} ${c.default.green(r.raw)}`);continue}let f=w(r,d,i,a);r.raw!==f.raw&&(r=f,a(`${c.default.white(`New most restrictive range:`)} ${c.default.green(r.raw)}`))}return a(r?`${c.default.white(`Final computed engine range constraint:`)} ${c.default.blue(r.raw)}`:`${c.default.white(`No computed engine range constraint`)}`),r},O=e=>new i.default({style:{head:[],border:[],compact:!1,"padding-left":1,"padding-right":1},colWidths:e,colAligns:[`left`,`left`,`left`,`left`],chars:{top:``,"top-mid":``,"top-left":``,"top-right":``,bottom:``,"bottom-mid":``,"bottom-left":``,"bottom-right":``,left:``,"left-mid":``,mid:``,"mid-mid":``,right:``,"right-mid":``,middle:``}}),k=e=>{let t=[`nce`];return e.engines&&t.push(...e.engines.map(e=>[`-e`,e]).flat()),e.quiet&&t.push(`-q`),e.debug&&t.push(`-d`),e.verbose&&t.push(`-v`),t.push(`-u`),t.join(` `)},A=e=>{let t=JSON.parse(e.packageLockString),n=JSON.parse(e.packageJsonString),r=e.engines,i=[],a=e=>d.indexOf(e)!==-1,s=[...d];r&&r.length>0&&(s=r.filter(a));let c;t.lockfileVersion===1?c=t.dependencies:t.lockfileVersion===2?c=t.packages?t.packages:t.dependencies:t.lockfileVersion===3&&(c=t.packages);for(let e of s){let r=D({packages:{"":{engines:n.engines||{}}},constraintKey:e,debug:f}),a=T(D({packages:(0,o.merge)({},{"":{engines:n.engines||{}}},c),constraintKey:e,debug:f})),s=T(r);a!==s&&(i.push({engine:e,range:s,rangeToSet:a}),n.engines=(0,o.merge)({},n.engines,{[e]:a}),(t.lockfileVersion===2||t.lockfileVersion===3)&&t.packages&&(t.packages[``].engines=(0,o.merge)({},t.packages[``].engines,{[e]:a})))}return{packageJson:n,packageLock:t,enginesRangeToSet:i}},j=e=>{let t=_.compile(y),n=t(JSON.parse(e.packageLockString));if(!n)throw Error(`Invalid package-lock.json: ${_.errorsText(t.errors)}`);return n},M=e=>{let t=_.compile(v),n=t(JSON.parse(e.packageJsonString));if(!n)throw Error(`Invalid package.json: ${_.errorsText(t.errors)}`);return n},N=({options:e,parent:n})=>[{title:`Reading package-lock.json...`,task:async n=>{n.packageLockString=await t.default.readFile(e.packageLockPath,`utf8`)}},{title:`Reading package.json...`,task:async n=>{n.packageJsonString=await t.default.readFile(e.packageJsonPath,`utf8`)}},{title:`Validating package-lock.json...`,task:e=>{j(e)}},{title:`Validating package.json...`,task:e=>{M(e)}},{title:`Compute engines range constraints...`,task:t=>{Object.assign(t,A((0,o.merge)({},t,{engines:e.engines})))}},{title:`Output computed engines range constraints...`,task:t=>{let r=t.enginesRangeToSet,i=[2,2,2,2],a=[];for(let{engine:e,range:t,rangeToSet:n}of r)f.extend(e)(`${c.default.white(`Simplified computed engine range constraint:`)} ${c.default.blue(n)}`),i=[Math.max(i[0],e.length+2),Math.max(i[1],t.length+2),3,Math.max(i[3],n.length+2)],a.push([e,t,`→`,n]);if(r.length===0)n.title=`All computed engines range constraints are up-to-date ${c.default.green(`:)`)}`;else{let t=O(i);t.push(...a);let r=`Computed engines range constraints:\n\n${t.toString()}`;e.update||(r+=`\n\nRun ${c.default.cyan(k(e))} to upgrade package.json.`),n.title=r}}},{title:`Updating package.json...`,skip:()=>e.update?!e.update:`Update is disabled by default.`,task:n=>(f(`${c.default.white(`Write JSON to`)} ${c.default.blue(`package.json`)}`),Promise.all([t.default.writeFile(e.packageJsonPath,JSON.stringify((0,u.default)(n.packageJson),null,2)+`
2
+ `),t.default.writeFile(e.packageLockPath,JSON.stringify(n.packageLock,null,2)+`
3
+ `)]))},{title:`Enabling engine-strict using .npmrc...`,skip:()=>e.enableEngineStrict?!e.enableEngineStrict:`Enabling engine-strict is disabled by default.`,task:async()=>{let e=`.npmrc`;try{await t.default.access(e,t.default.constants.F_OK|t.default.constants.R_OK),(await t.default.readFile(e,`utf8`)).includes(`engine-strict=true`)?f(`.npmrc file already contains engine-strict=true`):(await t.default.appendFile(e,`engine-strict=true
4
+ `),f(`.npmrc file has been updated to set engine-strict=true`))}catch{await t.default.writeFile(e,`engine-strict=true
5
+ `),f(`.npmrc file has been created and set engine-strict=true`)}}}],P=({options:e,context:t})=>new a.Listr([{title:`Checking npm package engines range constraints in package-lock.json...`,task:(t,n)=>n.newListr(t=>N({parent:t,options:e}))}],t);exports.applyMinVersionToRangeSet=C,exports.checkEnginesFromCLI=g,exports.checkEnginesFromString=A,exports.humanizeRange=T,exports.rangeOptions=b,exports.restrictiveRange=w,exports.setToRange=S,exports.sortRangeSet=x,exports.validatePackageJson=M,exports.validatePackageLock=j;
@@ -1,59 +1,49 @@
1
- import * as semver from 'semver';
1
+ import { CLIArgs } from "./yargs.cjs";
2
+ import * as semver from "semver";
2
3
 
3
- type CLIArgs = {
4
- [p: string]: unknown;
5
- update?: boolean;
6
- quiet?: boolean;
7
- verbose?: boolean;
8
- debug?: boolean;
9
- enableEngineStrict?: boolean;
10
- engines?: string[];
11
- _?: Array<string | number>;
12
- $0?: string;
13
- };
14
-
15
- declare const EngineConstraintKeys: readonly ["node", "npm", "yarn"];
4
+ //#region lib/nce.d.ts
5
+ declare const EngineConstraintKeys: readonly ['node', 'npm', 'yarn'];
16
6
  type EngineConstraintKeysType = typeof EngineConstraintKeys;
17
7
  type EngineConstraintKey = EngineConstraintKeysType[number];
18
8
  type LockPackageEnginesObject = Partial<Record<EngineConstraintKey, string>>;
19
9
  type LockPackageEnginesArray = string[];
20
10
  type LockPackageEngines = LockPackageEnginesObject | LockPackageEnginesArray;
21
11
  type OptionalEngines = {
22
- engines?: LockPackageEngines;
12
+ engines?: LockPackageEngines;
23
13
  };
24
14
  type PackageDependencies = {
25
- [dependencyName: string]: OptionalEngines;
15
+ [dependencyName: string]: OptionalEngines;
26
16
  };
27
17
  type PackageLockDependencies = {
28
- dependencies: PackageDependencies;
18
+ dependencies: PackageDependencies;
29
19
  };
30
20
  type PackageLockPackages = {
31
- packages: PackageDependencies;
21
+ packages: PackageDependencies;
32
22
  };
33
23
  type PackageLockVersion1 = {
34
- lockfileVersion: 1;
24
+ lockfileVersion: 1;
35
25
  } & PackageLockDependencies;
36
26
  type PackageLockVersion2 = {
37
- lockfileVersion: 2;
27
+ lockfileVersion: 2;
38
28
  } & Partial<PackageLockPackages> & PackageLockDependencies;
39
29
  type PackageLockVersion3 = {
40
- lockfileVersion: 3;
30
+ lockfileVersion: 3;
41
31
  } & PackageLockPackages;
42
32
  type PackageLock = PackageLockVersion1 | PackageLockVersion2 | PackageLockVersion3;
43
33
  type EngineRangeToSet = {
44
- engine: EngineConstraintKey;
45
- range: string;
46
- rangeToSet: string;
34
+ engine: EngineConstraintKey;
35
+ range: string;
36
+ rangeToSet: string;
47
37
  };
48
38
  type CheckEnginesInput = {
49
- engines?: EngineConstraintKey[] | undefined;
50
- packageLockString: string;
51
- packageJsonString: string;
39
+ engines?: EngineConstraintKey[] | undefined;
40
+ packageLockString: string;
41
+ packageJsonString: string;
52
42
  };
53
43
  type CheckEnginesOutput = {
54
- packageJson: OptionalEngines;
55
- packageLock: PackageLock;
56
- enginesRangeToSet: EngineRangeToSet[];
44
+ packageJson: OptionalEngines;
45
+ packageLock: PackageLock;
46
+ enginesRangeToSet: EngineRangeToSet[];
57
47
  };
58
48
  type CheckEnginesContext = CheckEnginesInput & Partial<CheckEnginesOutput>;
59
49
  declare const checkEnginesFromCLI: (args: CLIArgs) => Promise<CheckEnginesContext>;
@@ -64,7 +54,7 @@ declare const applyMinVersionToRangeSet: (set: ReadonlyArray<ReadonlyArray<semve
64
54
  declare const restrictiveRange: (r1: semver.Range, r2: semver.Range, ignoredRanges: string[], debug: (str: string) => void) => semver.Range;
65
55
  declare const humanizeRange: (range?: semver.Range) => string;
66
56
  declare const checkEnginesFromString: (ctx: CheckEnginesInput) => CheckEnginesOutput;
67
- declare const validatePackageLock: (ctx: Pick<CheckEnginesInput, "packageLockString">) => boolean;
68
- declare const validatePackageJson: (ctx: Pick<CheckEnginesInput, "packageJsonString">) => boolean;
69
-
70
- export { type CheckEnginesContext, type CheckEnginesInput, type CheckEnginesOutput, applyMinVersionToRangeSet, checkEnginesFromCLI, checkEnginesFromString, humanizeRange, rangeOptions, restrictiveRange, setToRange, sortRangeSet, validatePackageJson, validatePackageLock };
57
+ declare const validatePackageLock: (ctx: Pick<CheckEnginesInput, 'packageLockString'>) => boolean;
58
+ declare const validatePackageJson: (ctx: Pick<CheckEnginesInput, 'packageJsonString'>) => boolean;
59
+ //#endregion
60
+ export { CheckEnginesContext, CheckEnginesInput, CheckEnginesOutput, applyMinVersionToRangeSet, checkEnginesFromCLI, checkEnginesFromString, humanizeRange, rangeOptions, restrictiveRange, setToRange, sortRangeSet, validatePackageJson, validatePackageLock };
@@ -1,59 +1,49 @@
1
- import * as semver from 'semver';
1
+ import { CLIArgs } from "./yargs.js";
2
+ import * as semver from "semver";
2
3
 
3
- type CLIArgs = {
4
- [p: string]: unknown;
5
- update?: boolean;
6
- quiet?: boolean;
7
- verbose?: boolean;
8
- debug?: boolean;
9
- enableEngineStrict?: boolean;
10
- engines?: string[];
11
- _?: Array<string | number>;
12
- $0?: string;
13
- };
14
-
15
- declare const EngineConstraintKeys: readonly ["node", "npm", "yarn"];
4
+ //#region lib/nce.d.ts
5
+ declare const EngineConstraintKeys: readonly ['node', 'npm', 'yarn'];
16
6
  type EngineConstraintKeysType = typeof EngineConstraintKeys;
17
7
  type EngineConstraintKey = EngineConstraintKeysType[number];
18
8
  type LockPackageEnginesObject = Partial<Record<EngineConstraintKey, string>>;
19
9
  type LockPackageEnginesArray = string[];
20
10
  type LockPackageEngines = LockPackageEnginesObject | LockPackageEnginesArray;
21
11
  type OptionalEngines = {
22
- engines?: LockPackageEngines;
12
+ engines?: LockPackageEngines;
23
13
  };
24
14
  type PackageDependencies = {
25
- [dependencyName: string]: OptionalEngines;
15
+ [dependencyName: string]: OptionalEngines;
26
16
  };
27
17
  type PackageLockDependencies = {
28
- dependencies: PackageDependencies;
18
+ dependencies: PackageDependencies;
29
19
  };
30
20
  type PackageLockPackages = {
31
- packages: PackageDependencies;
21
+ packages: PackageDependencies;
32
22
  };
33
23
  type PackageLockVersion1 = {
34
- lockfileVersion: 1;
24
+ lockfileVersion: 1;
35
25
  } & PackageLockDependencies;
36
26
  type PackageLockVersion2 = {
37
- lockfileVersion: 2;
27
+ lockfileVersion: 2;
38
28
  } & Partial<PackageLockPackages> & PackageLockDependencies;
39
29
  type PackageLockVersion3 = {
40
- lockfileVersion: 3;
30
+ lockfileVersion: 3;
41
31
  } & PackageLockPackages;
42
32
  type PackageLock = PackageLockVersion1 | PackageLockVersion2 | PackageLockVersion3;
43
33
  type EngineRangeToSet = {
44
- engine: EngineConstraintKey;
45
- range: string;
46
- rangeToSet: string;
34
+ engine: EngineConstraintKey;
35
+ range: string;
36
+ rangeToSet: string;
47
37
  };
48
38
  type CheckEnginesInput = {
49
- engines?: EngineConstraintKey[] | undefined;
50
- packageLockString: string;
51
- packageJsonString: string;
39
+ engines?: EngineConstraintKey[] | undefined;
40
+ packageLockString: string;
41
+ packageJsonString: string;
52
42
  };
53
43
  type CheckEnginesOutput = {
54
- packageJson: OptionalEngines;
55
- packageLock: PackageLock;
56
- enginesRangeToSet: EngineRangeToSet[];
44
+ packageJson: OptionalEngines;
45
+ packageLock: PackageLock;
46
+ enginesRangeToSet: EngineRangeToSet[];
57
47
  };
58
48
  type CheckEnginesContext = CheckEnginesInput & Partial<CheckEnginesOutput>;
59
49
  declare const checkEnginesFromCLI: (args: CLIArgs) => Promise<CheckEnginesContext>;
@@ -64,7 +54,7 @@ declare const applyMinVersionToRangeSet: (set: ReadonlyArray<ReadonlyArray<semve
64
54
  declare const restrictiveRange: (r1: semver.Range, r2: semver.Range, ignoredRanges: string[], debug: (str: string) => void) => semver.Range;
65
55
  declare const humanizeRange: (range?: semver.Range) => string;
66
56
  declare const checkEnginesFromString: (ctx: CheckEnginesInput) => CheckEnginesOutput;
67
- declare const validatePackageLock: (ctx: Pick<CheckEnginesInput, "packageLockString">) => boolean;
68
- declare const validatePackageJson: (ctx: Pick<CheckEnginesInput, "packageJsonString">) => boolean;
69
-
70
- export { type CheckEnginesContext, type CheckEnginesInput, type CheckEnginesOutput, applyMinVersionToRangeSet, checkEnginesFromCLI, checkEnginesFromString, humanizeRange, rangeOptions, restrictiveRange, setToRange, sortRangeSet, validatePackageJson, validatePackageLock };
57
+ declare const validatePackageLock: (ctx: Pick<CheckEnginesInput, 'packageLockString'>) => boolean;
58
+ declare const validatePackageJson: (ctx: Pick<CheckEnginesInput, 'packageJsonString'>) => boolean;
59
+ //#endregion
60
+ export { CheckEnginesContext, CheckEnginesInput, CheckEnginesOutput, applyMinVersionToRangeSet, checkEnginesFromCLI, checkEnginesFromString, humanizeRange, rangeOptions, restrictiveRange, setToRange, sortRangeSet, validatePackageJson, validatePackageLock };
package/dist/lib/nce.js CHANGED
@@ -1,9 +1,5 @@
1
- var P=Object.defineProperty;var a=(n,e)=>P(n,"name",{value:e,configurable:!0});import T from"ajv";import r from"chalk";import A from"cli-table";import F from"debug";import{Listr as M}from"listr2";import{isArray as z,merge as S}from"lodash-es";import w from"fs/promises";import{join as J,normalize as D}from"path";import*as c from"semver";import I from"sort-package-json";var E=["node","npm","yarn"],U="package-lock.json",_="package.json",H="nce",v=F(H),W=a(()=>F.disable(),"namespaces"),K=a(n=>F.enable(n),"enableNamespaces"),B=a(({debug:n,quiet:e,verbose:t},i=process.env)=>{if(e)return{renderer:"silent"};if(t)return{renderer:"verbose"};let o=i.TERM==="dumb";return n||o?{renderer:"simple"}:i.NODE_ENV==="test"?{renderer:"test"}:{renderer:"default",rendererOptions:{dateFormat:!1}}},"renderer"),we=a(async n=>{var l;let e=n,t=a(g=>E.includes(g),"isValidConstraintEngine"),i={workingDir:D(process.cwd()),update:e.update||!1,verbose:e.verbose||!1,quiet:e.quiet||!1,debug:e.debug||!1,engines:((l=e.engines)==null?void 0:l.filter(t))||[],enableEngineStrict:e.enableEngineStrict||!1,packageLockPath:J(process.cwd(),U),packageJsonPath:J(process.cwd(),_)},o={...B({quiet:i.quiet,debug:i.debug,verbose:i.verbose})},s=W();return i.debug&&K(s),re({options:i,context:o}).run()},"checkEnginesFromCLI"),R=new T,O={type:"object",properties:{engines:{anyOf:[{type:"object",additionalProperties:{type:"string"},oneOf:[{required:["node"]},{required:["npm"]},{required:["yarn"]}]},{type:"array",items:{type:"string"}},{type:"object",not:{required:["engines"]}}]}}},G={type:"object",properties:{lockfileVersion:{type:"number",enum:[1,2,3]},dependencies:{type:"object",patternProperties:{"^.*$":O}},packages:{type:"object",patternProperties:{"^.*$":O}}},required:["lockfileVersion"],oneOf:[{properties:{lockfileVersion:{const:1}},required:["dependencies"],not:{required:["packages"]}},{properties:{lockfileVersion:{const:2}},required:["dependencies"]},{properties:{lockfileVersion:{const:3}},required:["packages"],not:{required:["dependencies"]}}]},m={loose:!1},y=a(n=>[...n.map(e=>[...e])].sort((e,t)=>c.compare(e[0].semver,t[0].semver)),"sortRangeSet"),b=a(n=>new c.Range(n.map(e=>e.map(t=>t.value).join(" ")).join("||"),m),"setToRange"),N=a((n,e)=>[...n.map(t=>[...t])].filter(t=>t[0].semver.major>=e.major).map(t=>(t[0].semver.major===e.major&&c.gte(e,t[0].semver,m)&&(t[0]=new c.Comparator(`${t[0].operator}${e.raw}`)),t)),"applyMinVersionToRangeSet"),V=a((n,e,t,i)=>{if(i(`${r.white("Compare:")} ${r.blue(n.raw)} ${r.white("and")} ${r.blue(e.raw)}`),c.subset(n,e))return i(`${r.white("Range")} ${r.green(n.raw)} ${r.white("is a subset of")} ${r.blue(e.raw)}`),t.push(e.raw),n;if(c.subset(e,n))return i(`${r.white("Range")} ${r.green(e.raw)} ${r.white("is a subset of")} ${r.blue(n.raw)}`),t.push(n.raw),e;if(n.intersects(e,m)){if(!e.intersects(n,m))return i(`${r.red("No intersection")} ${r.white("between")} ${r.blue(e.raw)} ${r.white("and")} ${r.blue(n.raw)}, ${r.white("returning")} ${r.green(e.raw)}`),e}else return i(`${r.red("No intersection")} ${r.white("between")} ${r.blue(n.raw)} ${r.white("and")} ${r.blue(e.raw)}, ${r.white("returning")} ${r.green(n.raw)}`),n;let o=c.minVersion(n,m)||new c.SemVer("*"),s=c.minVersion(e,m)||new c.SemVer("*"),l=y(n.set),g=y(e.set);for(;o.major!==s.major;)o.major>s.major?g=g.slice(1):l=l.slice(1),o=c.minVersion(b(l),m)||new c.SemVer("*"),s=c.minVersion(b(g),m)||new c.SemVer("*");if(!c.eq(o,s,m)){let j=c.compare(o,s)===-1?s:o;i(`${r.white("Applying minimal version")} ${r.yellow(j.version)} ${r.white("to both ranges.")}`);let d=b(N(l,j)),h=b(N(g,j));return d.test(j.raw)?h.test(j.raw)?d.intersects(h,m)?V(d,h,t,i):h.intersects(d,m)?V(h,d,t,i):(i(`${r.white("Unable to find intersection range")}: ${r.blue(d.raw)} and ${r.blue(h.raw)}, returning ${r.green(d.raw)}`),d):(i(`${r.white("Following range is not valid")}: ${r.red(h.raw)}, returning ${r.green(d.raw)}`),d):(i(`${r.white("Following range is not valid")}: ${r.red(d.raw)}, returning ${r.green(h.raw)}`),h)}let p=l.shift(),u=g.shift(),k=p||u;if(!k)throw new Error("Not yet implemented :/");let f=[k],$=b(l),x=b(g),L=V($,x,t,i);return f.push(...y(L.set)),b(f)},"restrictiveRange"),C=a(n=>{if(!n||n.raw==="*")return"*";let e=[];return y(n.set).forEach(i=>{let[o,s]=i;i.length===2&&o.operator===">="&&s.operator==="<"&&o.semver.major+1===s.semver.major?e.push(`^${o.semver.version}`):i.length===1&&o.operator===">="?e.push(o.value):e.push(`${o.value} ${(s==null?void 0:s.value)||""}`.trim())}),e.join(" || ")},"humanizeRange"),Q=a((n,e)=>{var t;if(typeof n=="object"&&e in n)return n[e];if(z(n)&&n.some(i=>i.includes(e)))return(t=n.find(i=>i.includes(e)))==null?void 0:t.replace(e,"")},"getConstraintFromEngines"),q=a(({packages:n,constraintKey:e,debug:t})=>{let i=new c.Range("*"),o=[],s=t.extend(e);for(let[l,g]of Object.entries(n)){let{engines:p}=g;if(!p){s(`${r.white("Package")} ${r.gray(l)} ${r.white("has no engines")}`);continue}let u=Q(p,e);if(!u){s(`${r.white("Package")} ${r.gray(l)} ${r.white("has no constraints for current engine")}`);continue}let k=c.validRange(u);if(!k){s(`${r.red(u)} ${r.white("is not a valid semver range")}`);continue}if(o.indexOf(k)!==-1){s(`${r.white("Ignored range:")} ${r.gray(k)}`);continue}let f=new c.Range(k,m);if(!i){i=f,s(`${r.white("New most restrictive range:")} ${r.green(i.raw)}`);continue}let $=V(i,f,o,s);i.raw!==$.raw&&(i=$,s(`${r.white("New most restrictive range:")} ${r.green(i.raw)}`))}return s(i?`${r.white("Final computed engine range constraint:")} ${r.blue(i.raw)}`:`${r.white("No computed engine range constraint")}`),i},"computeEnginesConstraint"),X=a(n=>new A({style:{head:[],border:[],compact:!1,"padding-left":1,"padding-right":1},colWidths:n,colAligns:["left","left","left","left"],chars:{top:"","top-mid":"","top-left":"","top-right":"",bottom:"","bottom-mid":"","bottom-left":"","bottom-right":"",left:"","left-mid":"",mid:"","mid-mid":"",right:"","right-mid":"",middle:""}}),"createOutputTable"),Y=a(n=>{let e=["nce"];return n.engines&&e.push(...n.engines.map(t=>["-e",t]).flat()),n.quiet&&e.push("-q"),n.debug&&e.push("-d"),n.verbose&&e.push("-v"),e.push("-u"),e.join(" ")},"generateUpdateCommandFromContext"),Z=a(n=>{let e=JSON.parse(n.packageLockString),t=JSON.parse(n.packageJsonString),i=n.engines,o=[],s=a(p=>E.indexOf(p)!==-1,"filterEngineConstraintKey"),l=[...E];i&&i.length>0&&(l=i.filter(s));let g;e.lockfileVersion===1?g=e.dependencies:e.lockfileVersion===2?g=e.packages?e.packages:e.dependencies:e.lockfileVersion===3&&(g=e.packages);for(let p of l){let u=q({packages:{"":{engines:t.engines||{}}},constraintKey:p,debug:v}),k=q({packages:S({},{"":{engines:t.engines||{}}},g),constraintKey:p,debug:v}),f=C(k),$=C(u);f!==$&&(o.push({engine:p,range:$,rangeToSet:f}),t.engines=S({},t.engines,{[p]:f}),(e.lockfileVersion===2||e.lockfileVersion===3)&&e.packages&&(e.packages[""].engines=S({},e.packages[""].engines,{[p]:f})))}return{packageJson:t,packageLock:e,enginesRangeToSet:o}},"checkEnginesFromString"),ee=a(n=>{let e=R.compile(G),t=e(JSON.parse(n.packageLockString));if(!t)throw new Error(`Invalid package-lock.json: ${R.errorsText(e.errors)}`);return t},"validatePackageLock"),ne=a(n=>{let e=R.compile(O),t=e(JSON.parse(n.packageJsonString));if(!t)throw new Error(`Invalid package.json: ${R.errorsText(e.errors)}`);return t},"validatePackageJson"),te=a(({options:n,parent:e})=>[{title:"Reading package-lock.json...",task:a(async t=>{t.packageLockString=await w.readFile(n.packageLockPath,"utf8")},"task")},{title:"Reading package.json...",task:a(async t=>{t.packageJsonString=await w.readFile(n.packageJsonPath,"utf8")},"task")},{title:"Validating package-lock.json...",task:a(t=>{ee(t)},"task")},{title:"Validating package.json...",task:a(t=>{ne(t)},"task")},{title:"Compute engines range constraints...",task:a(t=>{Object.assign(t,Z(S({},t,{engines:n.engines})))},"task")},{title:"Output computed engines range constraints...",task:a(t=>{let i=t.enginesRangeToSet,o="\u2192",s=[2,2,2,2],l=[];for(let{engine:g,range:p,rangeToSet:u}of i)v.extend(g)(`${r.white("Simplified computed engine range constraint:")} ${r.blue(u)}`),s=[Math.max(s[0],g.length+2),Math.max(s[1],p.length+2),o.length+2,Math.max(s[3],u.length+2)],l.push([g,p,o,u]);if(i.length===0)e.title=`All computed engines range constraints are up-to-date ${r.green(":)")}`;else{let g=X(s);g.push(...l);let p=`Computed engines range constraints:
2
-
3
- ${g.toString()}`;n.update||(p+=`
4
-
5
- Run ${r.cyan(Y(n))} to upgrade package.json.`),e.title=p}},"task")},{title:"Updating package.json...",skip:a(()=>n.update?!n.update:"Update is disabled by default.","skip"),task:a(t=>(v(`${r.white("Write JSON to")} ${r.blue("package.json")}`),Promise.all([w.writeFile(n.packageJsonPath,JSON.stringify(I(t.packageJson),null,2)+`
6
- `),w.writeFile(n.packageLockPath,JSON.stringify(t.packageLock,null,2)+`
7
- `)])),"task")},{title:"Enabling engine-strict using .npmrc...",skip:a(()=>n.enableEngineStrict?!n.enableEngineStrict:"Enabling engine-strict is disabled by default.","skip"),task:a(async()=>{let t=".npmrc";try{await w.access(t,w.constants.F_OK|w.constants.R_OK),(await w.readFile(t,"utf8")).includes("engine-strict=true")?v(".npmrc file already contains engine-strict=true"):(await w.appendFile(t,`engine-strict=true
8
- `),v(".npmrc file has been updated to set engine-strict=true"))}catch{await w.writeFile(t,`engine-strict=true
9
- `),v(".npmrc file has been created and set engine-strict=true")}},"task")}],"checkEnginesTasks"),re=a(({options:n,context:e})=>new M([{title:"Checking npm package engines range constraints in package-lock.json...",task:a((t,i)=>i.newListr(o=>te({parent:o,options:n})),"task")}],e),"checkEnginesCommand");export{N as applyMinVersionToRangeSet,we as checkEnginesFromCLI,Z as checkEnginesFromString,C as humanizeRange,m as rangeOptions,V as restrictiveRange,b as setToRange,y as sortRangeSet,ne as validatePackageJson,ee as validatePackageLock};
1
+ import e from"node:fs/promises";import{join as t,normalize as n}from"node:path";import r from"ajv";import i from"cli-table";import{Listr as a}from"listr2";import{isArray as o,merge as s}from"lodash-es";import{createDebug as c,disable as l,enable as u}from"obug";import d from"picocolors";import*as f from"semver";import p from"sort-package-json";const m=[`node`,`npm`,`yarn`],h=c(`nce`),g=()=>l(),_=e=>u(e),v=({debug:e,quiet:t,verbose:n},r=process.env)=>{if(t)return{renderer:`silent`};if(n)return{renderer:`verbose`};let i=r.TERM===`dumb`;return e||i?{renderer:`simple`}:r.NODE_ENV===`test`?{renderer:`test`}:{renderer:`default`,rendererOptions:{dateFormat:!1}}},y=async e=>{let r=e,i={workingDir:n(process.cwd()),update:r.update||!1,verbose:r.verbose||!1,quiet:r.quiet||!1,debug:r.debug||!1,engines:r.engines?.filter(e=>m.includes(e))||[],enableEngineStrict:r.enableEngineStrict||!1,packageLockPath:t(process.cwd(),`package-lock.json`),packageJsonPath:t(process.cwd(),`package.json`)},a={...v({quiet:i.quiet,debug:i.debug,verbose:i.verbose})},o=g();return i.debug&&_(o),L({options:i,context:a}).run()},b=new r,x={type:`object`,properties:{engines:{anyOf:[{type:`object`,additionalProperties:{type:`string`},oneOf:[{required:[`node`]},{required:[`npm`]},{required:[`yarn`]}]},{type:`array`,items:{type:`string`}},{type:`object`,not:{required:[`engines`]}}]}}},S={type:`object`,properties:{lockfileVersion:{type:`number`,enum:[1,2,3]},dependencies:{type:`object`,patternProperties:{"^.*$":x}},packages:{type:`object`,patternProperties:{"^.*$":x}}},required:[`lockfileVersion`],oneOf:[{properties:{lockfileVersion:{const:1}},required:[`dependencies`],not:{required:[`packages`]}},{properties:{lockfileVersion:{const:2}},required:[`dependencies`]},{properties:{lockfileVersion:{const:3}},required:[`packages`],not:{required:[`dependencies`]}}]},C={loose:!1},w=e=>[...e.map(e=>[...e])].sort((e,t)=>f.compare(e[0].semver,t[0].semver)),T=e=>new f.Range(e.map(e=>e.map(e=>e.value).join(` `)).join(`||`),C),E=(e,t)=>[...e.map(e=>[...e])].filter(e=>e[0].semver.major>=t.major).map(e=>(e[0].semver.major===t.major&&f.gte(t,e[0].semver,C)&&(e[0]=new f.Comparator(`${e[0].operator}${t.raw}`)),e)),D=(e,t,n,r)=>{if(r(`${d.white(`Compare:`)} ${d.blue(e.raw)} ${d.white(`and`)} ${d.blue(t.raw)}`),f.subset(e,t))return r(`${d.white(`Range`)} ${d.green(e.raw)} ${d.white(`is a subset of`)} ${d.blue(t.raw)}`),n.push(t.raw),e;if(f.subset(t,e))return r(`${d.white(`Range`)} ${d.green(t.raw)} ${d.white(`is a subset of`)} ${d.blue(e.raw)}`),n.push(e.raw),t;if(!e.intersects(t,C))return r(`${d.red(`No intersection`)} ${d.white(`between`)} ${d.blue(e.raw)} ${d.white(`and`)} ${d.blue(t.raw)}, ${d.white(`returning`)} ${d.green(e.raw)}`),e;if(!t.intersects(e,C))return r(`${d.red(`No intersection`)} ${d.white(`between`)} ${d.blue(t.raw)} ${d.white(`and`)} ${d.blue(e.raw)}, ${d.white(`returning`)} ${d.green(t.raw)}`),t;let i=f.minVersion(e,C)||new f.SemVer(`*`),a=f.minVersion(t,C)||new f.SemVer(`*`),o=w(e.set),s=w(t.set);for(;i.major!==a.major;)i.major>a.major?s=s.slice(1):o=o.slice(1),i=f.minVersion(T(o),C)||new f.SemVer(`*`),a=f.minVersion(T(s),C)||new f.SemVer(`*`);if(!f.eq(i,a,C)){let e=f.compare(i,a)===-1?a:i;r(`${d.white(`Applying minimal version`)} ${d.yellow(e.version)} ${d.white(`to both ranges.`)}`);let t=T(E(o,e)),c=T(E(s,e));return t.test(e.raw)?c.test(e.raw)?t.intersects(c,C)?D(t,c,n,r):c.intersects(t,C)?D(c,t,n,r):(r(`${d.white(`Unable to find intersection range`)}: ${d.blue(t.raw)} and ${d.blue(c.raw)}, returning ${d.green(t.raw)}`),t):(r(`${d.white(`Following range is not valid`)}: ${d.red(c.raw)}, returning ${d.green(t.raw)}`),t):(r(`${d.white(`Following range is not valid`)}: ${d.red(t.raw)}, returning ${d.green(c.raw)}`),c)}let c=o.shift(),l=s.shift(),u=c||l;if(!u)throw Error(`Not yet implemented :/`);let p=[u],m=D(T(o),T(s),n,r);return p.push(...w(m.set)),T(p)},O=e=>{if(!e||e.raw===`*`)return`*`;let t=[];return w(e.set).forEach(e=>{let[n,r]=e;e.length===2&&n.operator===`>=`&&r.operator===`<`&&n.semver.major+1===r.semver.major?t.push(`^${n.semver.version}`):e.length===1&&n.operator===`>=`?t.push(n.value):t.push(`${n.value} ${r?.value||``}`.trim())}),t.join(` || `)},k=(e,t)=>{if(typeof e==`object`&&t in e)return e[t];if(o(e)&&e.some(e=>e.includes(t)))return e.find(e=>e.includes(t))?.replace(t,``)},A=({packages:e,constraintKey:t,debug:n})=>{let r=new f.Range(`*`),i=[],a=n.extend(t);for(let[n,o]of Object.entries(e)){let{engines:e}=o;if(!e){a(`${d.white(`Package`)} ${d.gray(n)} ${d.white(`has no engines`)}`);continue}let s=k(e,t);if(!s){a(`${d.white(`Package`)} ${d.gray(n)} ${d.white(`has no constraints for current engine`)}`);continue}let c=f.validRange(s);if(!c){a(`${d.red(s)} ${d.white(`is not a valid semver range`)}`);continue}if(i.indexOf(c)!==-1){a(`${d.white(`Ignored range:`)} ${d.gray(c)}`);continue}let l=new f.Range(c,C);if(!r){r=l,a(`${d.white(`New most restrictive range:`)} ${d.green(r.raw)}`);continue}let u=D(r,l,i,a);r.raw!==u.raw&&(r=u,a(`${d.white(`New most restrictive range:`)} ${d.green(r.raw)}`))}return a(r?`${d.white(`Final computed engine range constraint:`)} ${d.blue(r.raw)}`:`${d.white(`No computed engine range constraint`)}`),r},j=e=>new i({style:{head:[],border:[],compact:!1,"padding-left":1,"padding-right":1},colWidths:e,colAligns:[`left`,`left`,`left`,`left`],chars:{top:``,"top-mid":``,"top-left":``,"top-right":``,bottom:``,"bottom-mid":``,"bottom-left":``,"bottom-right":``,left:``,"left-mid":``,mid:``,"mid-mid":``,right:``,"right-mid":``,middle:``}}),M=e=>{let t=[`nce`];return e.engines&&t.push(...e.engines.map(e=>[`-e`,e]).flat()),e.quiet&&t.push(`-q`),e.debug&&t.push(`-d`),e.verbose&&t.push(`-v`),t.push(`-u`),t.join(` `)},N=e=>{let t=JSON.parse(e.packageLockString),n=JSON.parse(e.packageJsonString),r=e.engines,i=[],a=e=>m.indexOf(e)!==-1,o=[...m];r&&r.length>0&&(o=r.filter(a));let c;t.lockfileVersion===1?c=t.dependencies:t.lockfileVersion===2?c=t.packages?t.packages:t.dependencies:t.lockfileVersion===3&&(c=t.packages);for(let e of o){let r=A({packages:{"":{engines:n.engines||{}}},constraintKey:e,debug:h}),a=O(A({packages:s({},{"":{engines:n.engines||{}}},c),constraintKey:e,debug:h})),o=O(r);a!==o&&(i.push({engine:e,range:o,rangeToSet:a}),n.engines=s({},n.engines,{[e]:a}),(t.lockfileVersion===2||t.lockfileVersion===3)&&t.packages&&(t.packages[``].engines=s({},t.packages[``].engines,{[e]:a})))}return{packageJson:n,packageLock:t,enginesRangeToSet:i}},P=e=>{let t=b.compile(S),n=t(JSON.parse(e.packageLockString));if(!n)throw Error(`Invalid package-lock.json: ${b.errorsText(t.errors)}`);return n},F=e=>{let t=b.compile(x),n=t(JSON.parse(e.packageJsonString));if(!n)throw Error(`Invalid package.json: ${b.errorsText(t.errors)}`);return n},I=({options:t,parent:n})=>[{title:`Reading package-lock.json...`,task:async n=>{n.packageLockString=await e.readFile(t.packageLockPath,`utf8`)}},{title:`Reading package.json...`,task:async n=>{n.packageJsonString=await e.readFile(t.packageJsonPath,`utf8`)}},{title:`Validating package-lock.json...`,task:e=>{P(e)}},{title:`Validating package.json...`,task:e=>{F(e)}},{title:`Compute engines range constraints...`,task:e=>{Object.assign(e,N(s({},e,{engines:t.engines})))}},{title:`Output computed engines range constraints...`,task:e=>{let r=e.enginesRangeToSet,i=[2,2,2,2],a=[];for(let{engine:e,range:t,rangeToSet:n}of r)h.extend(e)(`${d.white(`Simplified computed engine range constraint:`)} ${d.blue(n)}`),i=[Math.max(i[0],e.length+2),Math.max(i[1],t.length+2),3,Math.max(i[3],n.length+2)],a.push([e,t,`→`,n]);if(r.length===0)n.title=`All computed engines range constraints are up-to-date ${d.green(`:)`)}`;else{let e=j(i);e.push(...a);let r=`Computed engines range constraints:\n\n${e.toString()}`;t.update||(r+=`\n\nRun ${d.cyan(M(t))} to upgrade package.json.`),n.title=r}}},{title:`Updating package.json...`,skip:()=>t.update?!t.update:`Update is disabled by default.`,task:n=>(h(`${d.white(`Write JSON to`)} ${d.blue(`package.json`)}`),Promise.all([e.writeFile(t.packageJsonPath,JSON.stringify(p(n.packageJson),null,2)+`
2
+ `),e.writeFile(t.packageLockPath,JSON.stringify(n.packageLock,null,2)+`
3
+ `)]))},{title:`Enabling engine-strict using .npmrc...`,skip:()=>t.enableEngineStrict?!t.enableEngineStrict:`Enabling engine-strict is disabled by default.`,task:async()=>{let t=`.npmrc`;try{await e.access(t,e.constants.F_OK|e.constants.R_OK),(await e.readFile(t,`utf8`)).includes(`engine-strict=true`)?h(`.npmrc file already contains engine-strict=true`):(await e.appendFile(t,`engine-strict=true
4
+ `),h(`.npmrc file has been updated to set engine-strict=true`))}catch{await e.writeFile(t,`engine-strict=true
5
+ `),h(`.npmrc file has been created and set engine-strict=true`)}}}],L=({options:e,context:t})=>new a([{title:`Checking npm package engines range constraints in package-lock.json...`,task:(t,n)=>n.newListr(t=>I({parent:t,options:e}))}],t);export{E as applyMinVersionToRangeSet,y as checkEnginesFromCLI,N as checkEnginesFromString,O as humanizeRange,C as rangeOptions,D as restrictiveRange,T as setToRange,w as sortRangeSet,F as validatePackageJson,P as validatePackageLock};
@@ -1 +1 @@
1
- "use strict";var d=Object.create;var n=Object.defineProperty;var u=Object.getOwnPropertyDescriptor;var p=Object.getOwnPropertyNames;var g=Object.getPrototypeOf,f=Object.prototype.hasOwnProperty;var b=(e,a)=>{for(var i in a)n(e,i,{get:a[i],enumerable:!0})},o=(e,a,i,l)=>{if(a&&typeof a=="object"||typeof a=="function")for(let t of p(a))!f.call(e,t)&&t!==i&&n(e,t,{get:()=>a[t],enumerable:!(l=u(a,t))||l.enumerable});return e};var m=(e,a,i)=>(i=e!=null?d(g(e)):{},o(a||!e||!e.__esModule?n(i,"default",{value:e,enumerable:!0}):i,e)),h=e=>o(n({},"__esModule",{value:!0}),e);var v={};b(v,{cli:()=>k});module.exports=h(v);var s=m(require("yargs"),1),c=require("yargs/helpers"),r=(0,s.default)((0,c.hideBin)(process.argv)),k=r.scriptName("nce").usage("Usage: $0 [options]").example("$0","Check package-lock.json file in current working directory.").strict().options({quiet:{boolean:!0,alias:"q",default:!1,description:"Enable quiet mode."},debug:{boolean:!0,alias:"d",default:!1,description:"Enable debug mode. Can be used with environment variable DEBUG=nce."},verbose:{boolean:!0,alias:"v",default:!1,description:"A little more detailed than the default output."},engines:{array:!0,alias:"e",description:"Select engines to check. Default will check all engines defined."},update:{boolean:!0,alias:"u",default:!1,description:"Update engines in package.json and package-lock.json."},enableEngineStrict:{boolean:!0,default:!1,description:"Enable engine strict."}}).help("help").version().wrap(r.terminalWidth()).epilog("\xA9 2023 Samuel MARLHENS").argv;0&&(module.exports={cli});
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../chunk-Bmb41Sf3.cjs`);let t=require(`yargs`);t=e.t(t);let n=require(`yargs/helpers`);const r=(0,t.default)((0,n.hideBin)(process.argv)),i=r.scriptName(`nce`).usage(`Usage: $0 [options]`).example(`$0`,`Check package-lock.json file in current working directory.`).strict().options({quiet:{boolean:!0,alias:`q`,default:!1,description:`Enable quiet mode.`},debug:{boolean:!0,alias:`d`,default:!1,description:`Enable debug mode. Can be used with environment variable DEBUG=nce.`},verbose:{boolean:!0,alias:`v`,default:!1,description:`A little more detailed than the default output.`},engines:{array:!0,alias:`e`,description:`Select engines to check. Default will check all engines defined.`},update:{boolean:!0,alias:`u`,default:!1,description:`Update engines in package.json and package-lock.json.`},enableEngineStrict:{boolean:!0,default:!1,description:`Enable engine strict.`}}).help(`help`).version().wrap(r.terminalWidth()).epilog( 2023 Samuel MARLHENS`).argv;exports.cli=i;
@@ -0,0 +1,15 @@
1
+ //#region lib/yargs.d.ts
2
+ type CLIArgs = {
3
+ [p: string]: unknown;
4
+ update?: boolean;
5
+ quiet?: boolean;
6
+ verbose?: boolean;
7
+ debug?: boolean;
8
+ enableEngineStrict?: boolean;
9
+ engines?: string[];
10
+ _?: Array<string | number>;
11
+ $0?: string;
12
+ };
13
+ declare const cli: Promise<CLIArgs>;
14
+ //#endregion
15
+ export { CLIArgs, cli };
@@ -0,0 +1,15 @@
1
+ //#region lib/yargs.d.ts
2
+ type CLIArgs = {
3
+ [p: string]: unknown;
4
+ update?: boolean;
5
+ quiet?: boolean;
6
+ verbose?: boolean;
7
+ debug?: boolean;
8
+ enableEngineStrict?: boolean;
9
+ engines?: string[];
10
+ _?: Array<string | number>;
11
+ $0?: string;
12
+ };
13
+ declare const cli: Promise<CLIArgs>;
14
+ //#endregion
15
+ export { CLIArgs, cli };
package/dist/lib/yargs.js CHANGED
@@ -1 +1 @@
1
- import a from"yargs";import{hideBin as i}from"yargs/helpers";var e=a(i(process.argv)),r=e.scriptName("nce").usage("Usage: $0 [options]").example("$0","Check package-lock.json file in current working directory.").strict().options({quiet:{boolean:!0,alias:"q",default:!1,description:"Enable quiet mode."},debug:{boolean:!0,alias:"d",default:!1,description:"Enable debug mode. Can be used with environment variable DEBUG=nce."},verbose:{boolean:!0,alias:"v",default:!1,description:"A little more detailed than the default output."},engines:{array:!0,alias:"e",description:"Select engines to check. Default will check all engines defined."},update:{boolean:!0,alias:"u",default:!1,description:"Update engines in package.json and package-lock.json."},enableEngineStrict:{boolean:!0,default:!1,description:"Enable engine strict."}}).help("help").version().wrap(e.terminalWidth()).epilog("\xA9 2023 Samuel MARLHENS").argv;export{r as cli};
1
+ import e from"yargs";import{hideBin as t}from"yargs/helpers";const n=e(t(process.argv)),r=n.scriptName(`nce`).usage(`Usage: $0 [options]`).example(`$0`,`Check package-lock.json file in current working directory.`).strict().options({quiet:{boolean:!0,alias:`q`,default:!1,description:`Enable quiet mode.`},debug:{boolean:!0,alias:`d`,default:!1,description:`Enable debug mode. Can be used with environment variable DEBUG=nce.`},verbose:{boolean:!0,alias:`v`,default:!1,description:`A little more detailed than the default output.`},engines:{array:!0,alias:`e`,description:`Select engines to check. Default will check all engines defined.`},update:{boolean:!0,alias:`u`,default:!1,description:`Update engines in package.json and package-lock.json.`},enableEngineStrict:{boolean:!0,default:!1,description:`Enable engine strict.`}}).help(`help`).version().wrap(n.terminalWidth()).epilog( 2023 Samuel MARLHENS`).argv;export{r as cli};
package/package.json CHANGED
@@ -1,38 +1,27 @@
1
1
  {
2
2
  "name": "@smarlhens/npm-check-engines",
3
- "version": "0.14.0",
3
+ "version": "0.14.2",
4
4
  "description": "Node.JS engines constraint checker written in TypeScript.",
5
5
  "keywords": [
6
+ "engines",
6
7
  "node",
7
8
  "npm",
8
- "engines",
9
9
  "typescript"
10
10
  ],
11
11
  "homepage": "https://github.com/smarlhens/npm-check-engines#readme",
12
12
  "bugs": {
13
13
  "url": "https://github.com/smarlhens/npm-check-engines/issues"
14
14
  },
15
- "repository": {
16
- "type": "git",
17
- "url": "git+https://github.com/smarlhens/npm-check-engines.git"
18
- },
19
15
  "license": "BlueOak-1.0.0",
20
16
  "author": {
21
17
  "name": "Samuel MARLHENS",
22
18
  "email": "samuel.marlhens@proton.me",
23
19
  "url": "https://github.com/smarlhens"
24
20
  },
25
- "type": "module",
26
- "exports": {
27
- ".": {
28
- "types": "./dist/nce.d.ts",
29
- "require": "./dist/lib/nce.cjs",
30
- "import": "./dist/lib/nce.js"
31
- }
21
+ "repository": {
22
+ "type": "git",
23
+ "url": "git+https://github.com/smarlhens/npm-check-engines.git"
32
24
  },
33
- "main": "./dist/lib/nce.cjs",
34
- "module": "./dist/lib/nce.js",
35
- "types": "./dist/nce.d.ts",
36
25
  "bin": {
37
26
  "nce": "dist/bin/nce.js",
38
27
  "npm-check-engines": "dist/bin/nce.js"
@@ -44,63 +33,76 @@
44
33
  "dist",
45
34
  "LICENSE.md"
46
35
  ],
36
+ "type": "module",
37
+ "main": "./dist/lib/nce.cjs",
38
+ "module": "./dist/lib/nce.js",
39
+ "types": "./dist/lib/nce.d.ts",
40
+ "exports": {
41
+ ".": {
42
+ "types": {
43
+ "require": "./dist/lib/nce.d.cts",
44
+ "import": "./dist/lib/nce.d.ts"
45
+ },
46
+ "require": "./dist/lib/nce.cjs",
47
+ "import": "./dist/lib/nce.js"
48
+ }
49
+ },
47
50
  "scripts": {
48
- "prebuild": "rimraf dist",
49
- "build": "tsup",
51
+ "build": "tsdown",
50
52
  "dev": "node --experimental-specifier-resolution=node --loader ts-node/esm ./bin/nce.ts",
51
- "lint": "npm run prettier:check",
53
+ "fmt:check": "oxfmt --check",
54
+ "fmt:write": "oxfmt",
55
+ "lint": "npm run fmt:check",
52
56
  "lint-staged": "lint-staged",
53
57
  "pre-commit": "npm run lint-staged",
54
58
  "prepare": "husky",
55
- "prettier:check": "prettier --check ./**/*.{ts,json,yml,md}",
56
- "prettier:write": "prettier --write ./**/*.{ts,json,yml,md}",
57
59
  "pretest": "npm run build",
58
60
  "test": "vitest run",
59
61
  "test:ci": "npm run test:coverage",
60
62
  "test:coverage": "npm run test -- --coverage",
61
63
  "test:snapshot": "npm run test -- -u",
62
- "test:watch": "vitest watch"
64
+ "test:watch": "vitest watch",
65
+ "typecheck": "tsgo --noEmit"
63
66
  },
64
67
  "dependencies": {
65
68
  "ajv": "8.18.0",
66
- "chalk": "5.6.2",
67
69
  "cli-table": "0.3.11",
68
- "debug": "4.4.3",
69
- "find-up": "7.0.0",
70
- "listr2": "8.3.3",
70
+ "empathic": "2.0.0",
71
+ "listr2": "9.0.5",
71
72
  "lodash-es": "4.17.23",
73
+ "obug": "2.1.1",
74
+ "picocolors": "1.1.1",
72
75
  "semver": "7.7.4",
73
- "sort-package-json": "2.15.1",
76
+ "sort-package-json": "3.6.1",
74
77
  "update-notifier": "7.3.1",
75
- "yargs": "17.7.2"
78
+ "yargs": "18.0.0"
76
79
  },
77
80
  "devDependencies": {
81
+ "@arethetypeswrong/core": "0.18.2",
78
82
  "@commitlint/cli": "20.5.0",
79
83
  "@commitlint/config-conventional": "20.5.0",
80
- "@swc/core": "1.15.21",
81
- "@trivago/prettier-plugin-sort-imports": "5.2.2",
82
84
  "@types/cli-table": "0.3.4",
83
- "@types/debug": "4.1.13",
84
85
  "@types/lodash-es": "4.17.12",
85
86
  "@types/node": "20.19.37",
86
87
  "@types/semver": "7.7.1",
87
88
  "@types/update-notifier": "6.0.8",
88
89
  "@types/yargs": "17.0.35",
89
- "@vitest/coverage-v8": "3.2.4",
90
- "execa": "9.6.1",
90
+ "@typescript/native-preview": "7.0.0-dev.20260327.2",
91
+ "@vitest/coverage-v8": "4.1.1",
91
92
  "husky": "9.1.7",
92
- "knip": "5.53.0",
93
- "lint-staged": "15.5.2",
94
- "prettier": "3.8.1",
95
- "rimraf": "5.0.10",
93
+ "knip": "6.0.6",
94
+ "lint-staged": "16.4.0",
95
+ "oxfmt": "0.42.0",
96
+ "publint": "0.3.18",
97
+ "tinyexec": "1.0.4",
96
98
  "ts-node": "10.9.2",
99
+ "tsdown": "0.21.6",
97
100
  "tslib": "2.8.1",
98
- "tsup": "8.5.1",
99
101
  "typescript": "5.9.3",
100
- "vitest": "3.2.4"
102
+ "vitest": "4.1.1"
101
103
  },
102
104
  "engines": {
103
- "node": "^20.5.0 || ^22.0.0 || >=24.0.0",
104
- "npm": ">=8.0.0"
105
+ "node": "^20.19.0 || ^22.12.0 || >=24.0.0",
106
+ "npm": ">=10.0.0"
105
107
  }
106
108
  }