@smarlhens/npm-check-engines 0.12.0 → 0.13.0
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/dist/bin/nce.cjs +7 -7
- package/dist/bin/nce.js +7 -7
- package/dist/lib/nce.cjs +7 -7
- package/dist/lib/nce.js +7 -7
- package/dist/nce.d.ts +1 -2
- package/package.json +14 -14
package/dist/bin/nce.cjs
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
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 c=(n,e)=>O(n,"name",{value:e,configurable:!0});var ae=(n,e,t,
|
|
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 c=(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=c(()=>typeof document>"u"?new URL("file:"+__filename).href:document.currentScript&&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),A=require("listr2"),S=require("lodash-es"),f=k(require("fs/promises"),1),R=require("path"),o=k(require("semver"),1),I=k(require("sort-package-json"),1);var F=["node","npm","yarn"],se="package-lock.json",oe="package.json",ce="nce",j=(0,J.default)(ce),le=c(()=>J.default.disable(),"namespaces"),pe=c(n=>J.default.enable(n),"enableNamespaces"),ge=c(({debug:n,quiet:e,verbose:t},a=process.env)=>{if(e)return{renderer:"silent"};if(t)return{renderer:"simple"};let i=a.TERM==="dumb";return n||i||a.NODE_ENV==="test"?{renderer:"verbose"}:{renderer:"default",rendererOptions:{dateFormat:!1}}},"renderer"),M=c(async n=>{var p;let e=n,t=c(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})},s=le();return a.debug&&pe(s),$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=c(n=>[...n.map(e=>[...e])].sort((e,t)=>o.compare(e[0].semver,t[0].semver)),"sortRangeSet"),v=c(n=>new o.Range(n.map(e=>e.map(t=>t.value).join(" ")).join("||"),m),"setToRange"),x=c((n,e)=>[...n.map(t=>[...t])].filter(t=>t[0].semver.major>=e.major).map(t=>(t[0].semver.major===e.major&&o.gte(e,t[0].semver,m)&&(t[0]=new o.Comparator(`${t[0].operator}${e.raw}`)),t)),"applyMinVersionToRangeSet"),N=c((n,e,t,a)=>{if(a(`${r.default.white("Compare:")} ${r.default.blue(n.raw)} ${r.default.white("and")} ${r.default.blue(e.raw)}`),o.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(o.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=o.minVersion(n,m)||new o.SemVer("*"),s=o.minVersion(e,m)||new o.SemVer("*"),p=V(n.set),l=V(e.set);for(;i.major!==s.major;)i.major>s.major?l=l.slice(1):p=p.slice(1),i=o.minVersion(v(p),m)||new o.SemVer("*"),s=o.minVersion(v(l),m)||new o.SemVer("*");if(!o.eq(i,s,m)){let y=o.compare(i,s)===-1?s: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=c(n=>{if(!n||n.raw==="*")return"*";let e=[];return V(n.set).forEach(a=>{let[i,s]=a;a.length===2&&i.operator===">="&&s.operator==="<"&&i.semver.major+1===s.semver.major?e.push(`^${i.semver.version}`):a.length===1&&i.operator===">="?e.push(i.value):e.push(`${i.value} ${(s==null?void 0:s.value)||""}`.trim())}),e.join(" || ")},"humanizeRange"),ue=c((n,e)=>{var t;if(typeof n=="object"&&e in n)return n[e];if((0,S.isArray)(n)&&n.some(a=>a.includes(e)))return(t=n.find(a=>a.includes(e)))==null?void 0:t.replace(e,"")},"getConstraintFromEngines"),P=c(({packages:n,constraintKey:e,debug:t})=>{let a=new o.Range("*"),i=[],s=t.extend(e);for(let[p,l]of Object.entries(n)){let{engines:g}=l;if(!g){s(`${r.default.white("Package")} ${r.default.gray(p)} ${r.default.white("has no engines")}`);continue}let u=ue(g,e);if(!u){s(`${r.default.white("Package")} ${r.default.gray(p)} ${r.default.white("has no constraints for current engine")}`);continue}let h=o.validRange(u);if(!h){s(`${r.default.red(u)} ${r.default.white("is not a valid semver range")}`);continue}if(i.indexOf(h)!==-1){s(`${r.default.white("Ignored range:")} ${r.default.gray(h)}`);continue}let w=new o.Range(h,m);if(!a){a=w,s(`${r.default.white("New most restrictive range:")} ${r.default.green(a.raw)}`);continue}let $=N(a,w,i,s);a.raw!==$.raw&&(a=$,s(`${r.default.white("New most restrictive range:")} ${r.default.green(a.raw)}`))}return s(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=c(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=c(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=c(n=>{let e=JSON.parse(n.packageLockString),t=JSON.parse(n.packageJsonString),a=n.engines,i=[],s=c(g=>F.indexOf(g)!==-1,"filterEngineConstraintKey"),p=[...F];a&&a.length>0&&(p=a.filter(s));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:j}),h=P({packages:(0,S.merge)({},{"":{engines:t.engines||{}}},l),constraintKey:g,debug:j}),w=L(h),$=L(u);w!==$&&(i.push({engine:g,range:$,rangeToSet:w}),t.engines=(0,S.merge)({},t.engines,{[g]:w}),(e.lockfileVersion===2||e.lockfileVersion===3)&&e.packages&&(e.packages[""].engines=(0,S.merge)({},e.packages[""].engines,{[g]:w})))}return{packageJson:t,packageLock:e,enginesRangeToSet:i}},"checkEnginesFromString"),ke=c(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=c(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=c(({options:n,parent:e})=>[{title:"Reading package-lock.json...",task:async t=>{t.packageLockString=await f.default.readFile(n.packageLockPath,"utf8")}},{title:"Reading package.json...",task:async t=>{t.packageJsonString=await f.default.readFile(n.packageJsonPath,"utf8")}},{title:"Validating package-lock.json...",task:t=>{ke(t)}},{title:"Validating package.json...",task:t=>{he(t)}},{title:"Compute engines range constraints...",task:t=>{Object.assign(t,we((0,S.merge)({},t,{engines:n.engines})))}},{title:"Output computed engines range constraints...",task:t=>{let a=t.enginesRangeToSet,i="\u2192",s=[2,2,2,2],p=[];for(let{engine:l,range:g,rangeToSet:u}of a)j.extend(l)(`${r.default.white("Simplified computed engine range constraint:")} ${r.default.blue(u)}`),s=[Math.max(s[0],l.length+2),Math.max(s[1],g.length+2),i.length+2,Math.max(s[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(s);l.push(...p);let g=`Computed engines range constraints:
|
|
3
3
|
|
|
4
|
-
${l.toString()}`;n.update||(
|
|
4
|
+
${l.toString()}`;n.update||(g+=`
|
|
5
5
|
|
|
6
|
-
Run ${
|
|
7
|
-
`),
|
|
8
|
-
`)]))},{title:"Enabling engine-strict using .npmrc...",skip:()=>n.enableEngineStrict?!n.enableEngineStrict:"Enabling engine-strict is disabled by default.",task:async()=>{let t=".npmrc";try{await
|
|
9
|
-
`)
|
|
10
|
-
`)
|
|
6
|
+
Run ${r.default.cyan(fe(n))} to upgrade package.json.`),e.title=g}}},{title:"Updating package.json...",skip:()=>n.update?!n.update:"Update is disabled by default.",task:t=>(j(`${r.default.white("Write JSON to")} ${r.default.blue("package.json")}`),Promise.all([f.default.writeFile(n.packageJsonPath,JSON.stringify((0,I.default)(t.packageJson),null,2)+`
|
|
7
|
+
`),f.default.writeFile(n.packageLockPath,JSON.stringify(t.packageLock,null,2)+`
|
|
8
|
+
`)]))},{title:"Enabling engine-strict using .npmrc...",skip:()=>n.enableEngineStrict?!n.enableEngineStrict:"Enabling engine-strict is disabled by default.",task: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
|
|
9
|
+
`),j(".npmrc file has been updated to set engine-strict=true"))}catch{await f.default.writeFile(t,`engine-strict=true
|
|
10
|
+
`),j(".npmrc file has been created and set engine-strict=true")}}}],"checkEnginesTasks"),$e=c(({options:n,context:e})=>new A.Listr([{title:"Checking npm package engines range constraints in package-lock.json...",task:(t,a)=>a.newListr(i=>be({parent:i,options:n}))}],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)})();
|
package/dist/bin/nce.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
var D=Object.defineProperty;var
|
|
2
|
+
var D=Object.defineProperty;var l=(n,e)=>D(n,"name",{value:e,configurable:!0});import{findUp as pe}from"find-up";import me from"node:fs/promises";import{dirname as ue}from"node:path";import{fileURLToPath as de}from"node: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"node:fs/promises";import{join as J,normalize as W}from"node:path";import*as o 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=l(()=>C.disable(),"namespaces"),Y=l(n=>C.enable(n),"enableNamespaces"),Z=l(({debug:n,quiet:e,verbose:t},a=process.env)=>{if(e)return{renderer:"silent"};if(t)return{renderer:"simple"};let s=a.TERM==="dumb";return n||s||a.NODE_ENV==="test"?{renderer:"verbose"}:{renderer:"default",rendererOptions:{dateFormat:!1}}},"renderer"),P=l(async n=>{var g;let e=n,t=l(c=>V.includes(c),"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)},s={...Z({quiet:a.quiet,debug:a.debug,verbose:a.verbose})},i=X();return a.debug&&Y(i),ce({options:a,context:s}).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=l(n=>[...n.map(e=>[...e])].sort((e,t)=>o.compare(e[0].semver,t[0].semver)),"sortRangeSet"),$=l(n=>new o.Range(n.map(e=>e.map(t=>t.value).join(" ")).join("||"),m),"setToRange"),O=l((n,e)=>[...n.map(t=>[...t])].filter(t=>t[0].semver.major>=e.major).map(t=>(t[0].semver.major===e.major&&o.gte(e,t[0].semver,m)&&(t[0]=new o.Comparator(`${t[0].operator}${e.raw}`)),t)),"applyMinVersionToRangeSet"),E=l((n,e,t,a)=>{if(a(`${r.white("Compare:")} ${r.blue(n.raw)} ${r.white("and")} ${r.blue(e.raw)}`),o.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(o.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 s=o.minVersion(n,m)||new o.SemVer("*"),i=o.minVersion(e,m)||new o.SemVer("*"),g=S(n.set),c=S(e.set);for(;s.major!==i.major;)s.major>i.major?c=c.slice(1):g=g.slice(1),s=o.minVersion($(g),m)||new o.SemVer("*"),i=o.minVersion($(c),m)||new o.SemVer("*");if(!o.eq(s,i,m)){let j=o.compare(s,i)===-1?i:s;a(`${r.white("Applying minimal version")} ${r.yellow(j.version)} ${r.white("to both ranges.")}`);let d=$(O(g,j)),h=$(O(c,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=c.shift(),k=p||u;if(!k)throw new Error("Not yet implemented :/");let f=[k],b=$(g),U=$(c),I=E(b,U,t,a);return f.push(...S(I.set)),$(f)},"restrictiveRange"),F=l(n=>{if(!n||n.raw==="*")return"*";let e=[];return S(n.set).forEach(a=>{let[s,i]=a;a.length===2&&s.operator===">="&&i.operator==="<"&&s.semver.major+1===i.semver.major?e.push(`^${s.semver.version}`):a.length===1&&s.operator===">="?e.push(s.value):e.push(`${s.value} ${(i==null?void 0:i.value)||""}`.trim())}),e.join(" || ")},"humanizeRange"),ne=l((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=l(({packages:n,constraintKey:e,debug:t})=>{let a=new o.Range("*"),s=[],i=t.extend(e);for(let[g,c]of Object.entries(n)){let{engines:p}=c;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=o.validRange(u);if(!k){i(`${r.red(u)} ${r.white("is not a valid semver range")}`);continue}if(s.indexOf(k)!==-1){i(`${r.white("Ignored range:")} ${r.gray(k)}`);continue}let f=new o.Range(k,m);if(!a){a=f,i(`${r.white("New most restrictive range:")} ${r.green(a.raw)}`);continue}let b=E(a,f,s,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=l(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=l(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=l(n=>{let e=JSON.parse(n.packageLockString),t=JSON.parse(n.packageJsonString),a=n.engines,s=[],i=l(p=>V.indexOf(p)!==-1,"filterEngineConstraintKey"),g=[...V];a&&a.length>0&&(g=a.filter(i));let c;e.lockfileVersion===1?c=e.dependencies:e.lockfileVersion===2?c=e.packages?e.packages:e.dependencies:e.lockfileVersion===3&&(c=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||{}}},c),constraintKey:p,debug:v}),f=F(k),b=F(u);f!==b&&(s.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:s}},"checkEnginesFromString"),ie=l(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=l(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=l(({options:n,parent:e})=>[{title:"Reading package-lock.json...",task:async t=>{t.packageLockString=await w.readFile(n.packageLockPath,"utf8")}},{title:"Reading package.json...",task:async t=>{t.packageJsonString=await w.readFile(n.packageJsonPath,"utf8")}},{title:"Validating package-lock.json...",task:t=>{ie(t)}},{title:"Validating package.json...",task:t=>{se(t)}},{title:"Compute engines range constraints...",task:t=>{Object.assign(t,ae(y({},t,{engines:n.engines})))}},{title:"Output computed engines range constraints...",task:t=>{let a=t.enginesRangeToSet,s="\u2192",i=[2,2,2,2],g=[];for(let{engine:c,range:p,rangeToSet:u}of a)v.extend(c)(`${r.white("Simplified computed engine range constraint:")} ${r.blue(u)}`),i=[Math.max(i[0],c.length+2),Math.max(i[1],p.length+2),s.length+2,Math.max(i[3],u.length+2)],g.push([c,p,s,u]);if(a.length===0)e.title=`All computed engines range constraints are up-to-date ${r.green(":)")}`;else{let c=te(i);c.push(...g);let p=`Computed engines range constraints:
|
|
3
3
|
|
|
4
|
-
${
|
|
4
|
+
${c.toString()}`;n.update||(p+=`
|
|
5
5
|
|
|
6
|
-
Run ${
|
|
7
|
-
`),
|
|
8
|
-
`)]))},{title:"Enabling engine-strict using .npmrc...",skip:()=>
|
|
9
|
-
`),v(".npmrc file has been updated to set engine-strict=true"))}catch{await
|
|
10
|
-
`),v(".npmrc file has been created and set engine-strict=true")}}}],"checkEnginesTasks"),ce=
|
|
6
|
+
Run ${r.cyan(re(n))} to upgrade package.json.`),e.title=p}}},{title:"Updating package.json...",skip:()=>n.update?!n.update:"Update is disabled by default.",task: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
|
+
`)]))},{title:"Enabling engine-strict using .npmrc...",skip:()=>n.enableEngineStrict?!n.enableEngineStrict:"Enabling engine-strict is disabled by default.",task: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")}}}],"checkEnginesTasks"),ce=l(({options:n,context:e})=>new _([{title:"Checking npm package engines range constraints in package-lock.json...",task:(t,a)=>a.newListr(s=>oe({parent:s,options:n}))}],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)})();
|
package/dist/lib/nce.cjs
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
"use strict";var W=Object.create;var
|
|
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 g=(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"),o=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=g(()=>J.default.disable(),"namespaces"),re=g(n=>J.default.enable(n),"enableNamespaces"),ie=g(({debug:n,quiet:e,verbose:t},i=process.env)=>{if(e)return{renderer:"silent"};if(t)return{renderer:"simple"};let s=i.TERM==="dumb";return n||s||i.NODE_ENV==="test"?{renderer:"verbose"}:{renderer:"default",rendererOptions:{dateFormat:!1}}},"renderer"),se=g(async n=>{var l;let e=n,t=g(c=>N.includes(c),"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=g(n=>[...n.map(e=>[...e])].sort((e,t)=>o.compare(e[0].semver,t[0].semver)),"sortRangeSet"),$=g(n=>new o.Range(n.map(e=>e.map(t=>t.value).join(" ")).join("||"),m),"setToRange"),q=g((n,e)=>[...n.map(t=>[...t])].filter(t=>t[0].semver.major>=e.major).map(t=>(t[0].semver.major===e.major&&o.gte(e,t[0].semver,m)&&(t[0]=new o.Comparator(`${t[0].operator}${e.raw}`)),t)),"applyMinVersionToRangeSet"),E=g((n,e,t,i)=>{if(i(`${r.default.white("Compare:")} ${r.default.blue(n.raw)} ${r.default.white("and")} ${r.default.blue(e.raw)}`),o.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(o.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=o.minVersion(n,m)||new o.SemVer("*"),a=o.minVersion(e,m)||new o.SemVer("*"),l=R(n.set),c=R(e.set);for(;s.major!==a.major;)s.major>a.major?c=c.slice(1):l=l.slice(1),s=o.minVersion($(l),m)||new o.SemVer("*"),a=o.minVersion($(c),m)||new o.SemVer("*");if(!o.eq(s,a,m)){let y=o.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(c,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=c.shift(),k=p||u;if(!k)throw new Error("Not yet implemented :/");let w=[k],b=$(l),_=$(c),H=E(b,_,t,i);return w.push(...R(H.set)),$(w)},"restrictiveRange"),x=g(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=g((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=g(({packages:n,constraintKey:e,debug:t})=>{let i=new o.Range("*"),s=[],a=t.extend(e);for(let[l,c]of Object.entries(n)){let{engines:p}=c;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=o.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 o.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=g(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=g(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=g(n=>{let e=JSON.parse(n.packageLockString),t=JSON.parse(n.packageJsonString),i=n.engines,s=[],a=g(p=>N.indexOf(p)!==-1,"filterEngineConstraintKey"),l=[...N];i&&i.length>0&&(l=i.filter(a));let c;e.lockfileVersion===1?c=e.dependencies:e.lockfileVersion===2?c=e.packages?e.packages:e.dependencies:e.lockfileVersion===3&&(c=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||{}}},c),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=g(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=g(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=g(({options:n,parent:e})=>[{title:"Reading package-lock.json...",task:async t=>{t.packageLockString=await f.default.readFile(n.packageLockPath,"utf8")}},{title:"Reading package.json...",task:async t=>{t.packageJsonString=await f.default.readFile(n.packageJsonPath,"utf8")}},{title:"Validating package-lock.json...",task:t=>{I(t)}},{title:"Validating package.json...",task:t=>{U(t)}},{title:"Compute engines range constraints...",task:t=>{Object.assign(t,D((0,S.merge)({},t,{engines:n.engines})))}},{title:"Output computed engines range constraints...",task:t=>{let i=t.enginesRangeToSet,s="\u2192",a=[2,2,2,2],l=[];for(let{engine:c,range:p,rangeToSet:u}of i)j.extend(c)(`${r.default.white("Simplified computed engine range constraint:")} ${r.default.blue(u)}`),a=[Math.max(a[0],c.length+2),Math.max(a[1],p.length+2),s.length+2,Math.max(a[3],u.length+2)],l.push([c,p,s,u]);if(i.length===0)e.title=`All computed engines range constraints are up-to-date ${r.default.green(":)")}`;else{let c=ce(a);c.push(...l);let p=`Computed engines range constraints:
|
|
2
2
|
|
|
3
|
-
${
|
|
3
|
+
${c.toString()}`;n.update||(p+=`
|
|
4
4
|
|
|
5
|
-
Run ${
|
|
6
|
-
`),
|
|
7
|
-
`)]))},{title:"Enabling engine-strict using .npmrc...",skip:()=>n.enableEngineStrict?!n.enableEngineStrict:"Enabling engine-strict is disabled by default.",task:async()=>{let t=".npmrc";try{await
|
|
8
|
-
`),
|
|
9
|
-
`),
|
|
5
|
+
Run ${r.default.cyan(ge(n))} to upgrade package.json.`),e.title=p}}},{title:"Updating package.json...",skip:()=>n.update?!n.update:"Update is disabled by default.",task: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
|
+
`)]))},{title:"Enabling engine-strict using .npmrc...",skip:()=>n.enableEngineStrict?!n.enableEngineStrict:"Enabling engine-strict is disabled by default.",task: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")}}}],"checkEnginesTasks"),pe=g(({options:n,context:e})=>new M.Listr([{title:"Checking npm package engines range constraints in package-lock.json...",task:(t,i)=>i.newListr(s=>le({parent:s,options:n}))}],e),"checkEnginesCommand");0&&(module.exports={applyMinVersionToRangeSet,checkEnginesFromCLI,checkEnginesFromString,humanizeRange,rangeOptions,restrictiveRange,setToRange,sortRangeSet,validatePackageJson,validatePackageLock});
|
package/dist/lib/nce.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
var P=Object.defineProperty;var
|
|
1
|
+
var P=Object.defineProperty;var g=(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"node:fs/promises";import{join as J,normalize as D}from"node:path";import*as o 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=g(()=>F.disable(),"namespaces"),K=g(n=>F.enable(n),"enableNamespaces"),B=g(({debug:n,quiet:e,verbose:t},i=process.env)=>{if(e)return{renderer:"silent"};if(t)return{renderer:"simple"};let a=i.TERM==="dumb";return n||a||i.NODE_ENV==="test"?{renderer:"verbose"}:{renderer:"default",rendererOptions:{dateFormat:!1}}},"renderer"),we=g(async n=>{var l;let e=n,t=g(c=>E.includes(c),"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(),_)},a={...B({quiet:i.quiet,debug:i.debug,verbose:i.verbose})},s=W();return i.debug&&K(s),re({options:i,context:a}).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=g(n=>[...n.map(e=>[...e])].sort((e,t)=>o.compare(e[0].semver,t[0].semver)),"sortRangeSet"),b=g(n=>new o.Range(n.map(e=>e.map(t=>t.value).join(" ")).join("||"),m),"setToRange"),N=g((n,e)=>[...n.map(t=>[...t])].filter(t=>t[0].semver.major>=e.major).map(t=>(t[0].semver.major===e.major&&o.gte(e,t[0].semver,m)&&(t[0]=new o.Comparator(`${t[0].operator}${e.raw}`)),t)),"applyMinVersionToRangeSet"),V=g((n,e,t,i)=>{if(i(`${r.white("Compare:")} ${r.blue(n.raw)} ${r.white("and")} ${r.blue(e.raw)}`),o.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(o.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 a=o.minVersion(n,m)||new o.SemVer("*"),s=o.minVersion(e,m)||new o.SemVer("*"),l=y(n.set),c=y(e.set);for(;a.major!==s.major;)a.major>s.major?c=c.slice(1):l=l.slice(1),a=o.minVersion(b(l),m)||new o.SemVer("*"),s=o.minVersion(b(c),m)||new o.SemVer("*");if(!o.eq(a,s,m)){let j=o.compare(a,s)===-1?s:a;i(`${r.white("Applying minimal version")} ${r.yellow(j.version)} ${r.white("to both ranges.")}`);let d=b(N(l,j)),h=b(N(c,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=c.shift(),k=p||u;if(!k)throw new Error("Not yet implemented :/");let f=[k],$=b(l),x=b(c),L=V($,x,t,i);return f.push(...y(L.set)),b(f)},"restrictiveRange"),C=g(n=>{if(!n||n.raw==="*")return"*";let e=[];return y(n.set).forEach(i=>{let[a,s]=i;i.length===2&&a.operator===">="&&s.operator==="<"&&a.semver.major+1===s.semver.major?e.push(`^${a.semver.version}`):i.length===1&&a.operator===">="?e.push(a.value):e.push(`${a.value} ${(s==null?void 0:s.value)||""}`.trim())}),e.join(" || ")},"humanizeRange"),Q=g((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=g(({packages:n,constraintKey:e,debug:t})=>{let i=new o.Range("*"),a=[],s=t.extend(e);for(let[l,c]of Object.entries(n)){let{engines:p}=c;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=o.validRange(u);if(!k){s(`${r.red(u)} ${r.white("is not a valid semver range")}`);continue}if(a.indexOf(k)!==-1){s(`${r.white("Ignored range:")} ${r.gray(k)}`);continue}let f=new o.Range(k,m);if(!i){i=f,s(`${r.white("New most restrictive range:")} ${r.green(i.raw)}`);continue}let $=V(i,f,a,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=g(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=g(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=g(n=>{let e=JSON.parse(n.packageLockString),t=JSON.parse(n.packageJsonString),i=n.engines,a=[],s=g(p=>E.indexOf(p)!==-1,"filterEngineConstraintKey"),l=[...E];i&&i.length>0&&(l=i.filter(s));let c;e.lockfileVersion===1?c=e.dependencies:e.lockfileVersion===2?c=e.packages?e.packages:e.dependencies:e.lockfileVersion===3&&(c=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||{}}},c),constraintKey:p,debug:v}),f=C(k),$=C(u);f!==$&&(a.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:a}},"checkEnginesFromString"),ee=g(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=g(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=g(({options:n,parent:e})=>[{title:"Reading package-lock.json...",task:async t=>{t.packageLockString=await w.readFile(n.packageLockPath,"utf8")}},{title:"Reading package.json...",task:async t=>{t.packageJsonString=await w.readFile(n.packageJsonPath,"utf8")}},{title:"Validating package-lock.json...",task:t=>{ee(t)}},{title:"Validating package.json...",task:t=>{ne(t)}},{title:"Compute engines range constraints...",task:t=>{Object.assign(t,Z(S({},t,{engines:n.engines})))}},{title:"Output computed engines range constraints...",task:t=>{let i=t.enginesRangeToSet,a="\u2192",s=[2,2,2,2],l=[];for(let{engine:c,range:p,rangeToSet:u}of i)v.extend(c)(`${r.white("Simplified computed engine range constraint:")} ${r.blue(u)}`),s=[Math.max(s[0],c.length+2),Math.max(s[1],p.length+2),a.length+2,Math.max(s[3],u.length+2)],l.push([c,p,a,u]);if(i.length===0)e.title=`All computed engines range constraints are up-to-date ${r.green(":)")}`;else{let c=X(s);c.push(...l);let p=`Computed engines range constraints:
|
|
2
2
|
|
|
3
|
-
${
|
|
3
|
+
${c.toString()}`;n.update||(p+=`
|
|
4
4
|
|
|
5
|
-
Run ${
|
|
6
|
-
`),
|
|
7
|
-
`)]))},{title:"Enabling engine-strict using .npmrc...",skip:()=>n.enableEngineStrict?!n.enableEngineStrict:"Enabling engine-strict is disabled by default.",task:async()=>{let t=".npmrc";try{await
|
|
8
|
-
`)
|
|
9
|
-
`)
|
|
5
|
+
Run ${r.cyan(Y(n))} to upgrade package.json.`),e.title=p}}},{title:"Updating package.json...",skip:()=>n.update?!n.update:"Update is disabled by default.",task: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
|
+
`)]))},{title:"Enabling engine-strict using .npmrc...",skip:()=>n.enableEngineStrict?!n.enableEngineStrict:"Enabling engine-strict is disabled by default.",task: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")}}}],"checkEnginesTasks"),re=g(({options:n,context:e})=>new M([{title:"Checking npm package engines range constraints in package-lock.json...",task:(t,i)=>i.newListr(a=>te({parent:a,options:n}))}],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};
|
package/dist/nce.d.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { Debugger } from 'debug';
|
|
2
1
|
import * as semver from 'semver';
|
|
3
2
|
|
|
4
3
|
type CLIArgs = {
|
|
@@ -62,7 +61,7 @@ declare const rangeOptions: semver.Options;
|
|
|
62
61
|
declare const sortRangeSet: (set: ReadonlyArray<ReadonlyArray<semver.Comparator>>) => semver.Comparator[][];
|
|
63
62
|
declare const setToRange: (set: semver.Comparator[][]) => semver.Range;
|
|
64
63
|
declare const applyMinVersionToRangeSet: (set: ReadonlyArray<ReadonlyArray<semver.Comparator>>, minVersion: semver.SemVer) => semver.Comparator[][];
|
|
65
|
-
declare const restrictiveRange: (r1: semver.Range, r2: semver.Range, ignoredRanges: string[], debug:
|
|
64
|
+
declare const restrictiveRange: (r1: semver.Range, r2: semver.Range, ignoredRanges: string[], debug: (str: string) => void) => semver.Range;
|
|
66
65
|
declare const humanizeRange: (range?: semver.Range) => string;
|
|
67
66
|
declare const checkEnginesFromString: (ctx: CheckEnginesInput) => CheckEnginesOutput;
|
|
68
67
|
declare const validatePackageLock: (ctx: Pick<CheckEnginesInput, 'packageLockString'>) => boolean;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@smarlhens/npm-check-engines",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.13.0",
|
|
4
4
|
"description": "Node.JS engines constraint checker written in TypeScript.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"node",
|
|
@@ -64,7 +64,7 @@
|
|
|
64
64
|
"cli-table": "0.3.11",
|
|
65
65
|
"debug": "4.3.4",
|
|
66
66
|
"find-up": "6.3.0",
|
|
67
|
-
"listr2": "5.0.
|
|
67
|
+
"listr2": "5.0.8",
|
|
68
68
|
"lodash-es": "4.17.21",
|
|
69
69
|
"semver": "7.3.8",
|
|
70
70
|
"sort-package-json": "2.4.1",
|
|
@@ -72,28 +72,28 @@
|
|
|
72
72
|
"yargs": "17.7.1"
|
|
73
73
|
},
|
|
74
74
|
"devDependencies": {
|
|
75
|
-
"@commitlint/cli": "17.
|
|
75
|
+
"@commitlint/cli": "17.5.1",
|
|
76
76
|
"@commitlint/config-conventional": "17.4.4",
|
|
77
|
-
"@swc/core": "1.3.
|
|
77
|
+
"@swc/core": "1.3.44",
|
|
78
78
|
"@trivago/prettier-plugin-sort-imports": "4.1.1",
|
|
79
79
|
"@types/cli-table": "0.3.1",
|
|
80
80
|
"@types/debug": "4.1.7",
|
|
81
|
-
"@types/lodash-es": "4.17.
|
|
82
|
-
"@types/node": "18.
|
|
81
|
+
"@types/lodash-es": "4.17.7",
|
|
82
|
+
"@types/node": "18.15.11",
|
|
83
83
|
"@types/semver": "7.3.13",
|
|
84
84
|
"@types/update-notifier": "6.0.2",
|
|
85
|
-
"@types/yargs": "17.0.
|
|
86
|
-
"@vitest/coverage-c8": "0.29.
|
|
87
|
-
"execa": "7.
|
|
85
|
+
"@types/yargs": "17.0.24",
|
|
86
|
+
"@vitest/coverage-c8": "0.29.8",
|
|
87
|
+
"execa": "7.1.1",
|
|
88
88
|
"husky": "8.0.3",
|
|
89
|
-
"lint-staged": "13.
|
|
90
|
-
"prettier": "2.8.
|
|
91
|
-
"rimraf": "4.
|
|
89
|
+
"lint-staged": "13.2.0",
|
|
90
|
+
"prettier": "2.8.7",
|
|
91
|
+
"rimraf": "4.4.1",
|
|
92
92
|
"ts-node": "10.9.1",
|
|
93
93
|
"tslib": "2.5.0",
|
|
94
|
-
"tsup": "6.
|
|
94
|
+
"tsup": "6.7.0",
|
|
95
95
|
"typescript": "4.9.5",
|
|
96
|
-
"vitest": "0.29.
|
|
96
|
+
"vitest": "0.29.8"
|
|
97
97
|
},
|
|
98
98
|
"engines": {
|
|
99
99
|
"node": "^16.14.0 || ^18.0.0",
|