fix: address review feedback — PATH ordering and regex anchoring

- Swap addPath order so pnpmHome (with pnpm.exe) is prepended last
  and has highest precedence over pnpmHome/bin.
- Anchor version regex with $ and allow prerelease suffixes.
This commit is contained in:
Zoltan Kochan committed 2026-03-27 20:38:35 +01:00
1 parent 825c5d3936
commit 19566048c2
3 files changed
+9 -8

No files matched your search

+4 -4
View File
@@ -36,7 +36,7 @@ jobs:
run: |
actual="$(pnpm --version)"
echo "pnpm version: ${actual}"
if [[ ! "${actual}" =~ ^[0-9]+\.[0-9]+\.[0-9]+ ]]; then
if [[ ! "${actual}" =~ ^[0-9]+\.[0-9]+\.[0-9]+(-.+)?$ ]]; then
echo "ERROR: pnpm --version did not produce valid output"
exit 1
fi
@@ -81,7 +81,7 @@ jobs:
run: |
actual="$(pnpm --version)"
echo "pnpm version: ${actual}"
if [[ ! "${actual}" =~ ^[0-9]+\.[0-9]+\.[0-9]+ ]]; then
if [[ ! "${actual}" =~ ^[0-9]+\.[0-9]+\.[0-9]+(-.+)?$ ]]; then
echo "ERROR: pnpm --version did not produce valid output"
exit 1
fi
@@ -115,7 +115,7 @@ jobs:
run: |
actual="$(pnpm --version)"
echo "pnpm version: ${actual}"
if [[ ! "${actual}" =~ ^[0-9]+\.[0-9]+\.[0-9]+ ]]; then
if [[ ! "${actual}" =~ ^[0-9]+\.[0-9]+\.[0-9]+(-.+)?$ ]]; then
echo "ERROR: pnpm --version did not produce valid output"
exit 1
fi
@@ -220,7 +220,7 @@ jobs:
run: |
actual="$(pnpm --version)"
echo "pnpm version: ${actual}"
if [[ ! "${actual}" =~ ^[0-9]+\.[0-9]+\.[0-9]+ ]]; then
if [[ ! "${actual}" =~ ^[0-9]+\.[0-9]+\.[0-9]+(-.+)?$ ]]; then
echo "ERROR: pnpm --version did not produce valid output"
exit 1
fi
+1 -1
View File
@@ -261,7 +261,7 @@ ${r.comment}`:r.comment}this.doc.range[2]=r.offset;break}default:this.errors.pus
`)+1;for(;r!==0;)this.onNewLine(this.offset+r),r=this.source.indexOf(`
`,r)+1}yield*this.pop();break;default:yield*this.pop(),yield*this.step()}}*blockMap(e){let r=e.items[e.items.length-1];switch(this.type){case"newline":if(this.onKeyLine=!1,r.value){let n="end"in r.value?r.value.end:void 0;(Array.isArray(n)?n[n.length-1]:void 0)?.type==="comment"?n?.push(this.sourceToken):e.items.push({start:[this.sourceToken]})}else r.sep?r.sep.push(this.sourceToken):r.start.push(this.sourceToken);return;case"space":case"comment":if(r.value)e.items.push({start:[this.sourceToken]});else if(r.sep)r.sep.push(this.sourceToken);else{if(this.atIndentedComment(r.start,e.indent)){let i=e.items[e.items.length-2]?.value?.end;if(Array.isArray(i)){Array.prototype.push.apply(i,r.start),i.push(this.sourceToken),e.items.pop();return}}r.start.push(this.sourceToken)}return}if(this.indent>=e.indent){let n=!this.onKeyLine&&this.indent===e.indent,i=n&&(r.sep||r.explicitKey)&&this.type!=="seq-item-ind",s=[];if(i&&r.sep&&!r.value){let o=[];for(let a=0;a<r.sep.length;++a){let A=r.sep[a];switch(A.type){case"newline":o.push(a);break;case"space":break;case"comment":A.indent>e.indent&&(o.length=0);break;default:o.length=0}}o.length>=2&&(s=r.sep.splice(o[1]))}switch(this.type){case"anchor":case"tag":i||r.value?(s.push(this.sourceToken),e.items.push({start:s}),this.onKeyLine=!0):r.sep?r.sep.push(this.sourceToken):r.start.push(this.sourceToken);return;case"explicit-key-ind":!r.sep&&!r.explicitKey?(r.start.push(this.sourceToken),r.explicitKey=!0):i||r.value?(s.push(this.sourceToken),e.items.push({start:s,explicitKey:!0})):this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:[this.sourceToken],explicitKey:!0}]}),this.onKeyLine=!0;return;case"map-value-ind":if(r.explicitKey)if(r.sep)if(r.value)e.items.push({start:[],key:null,sep:[this.sourceToken]});else if(VA(r.sep,"map-value-ind"))this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:s,key:null,sep:[this.sourceToken]}]});else if(T8(r.key)&&!VA(r.sep,"newline")){let o=kd(r.start),a=r.key,A=r.sep;A.push(this.sourceToken),delete r.key,delete r.sep,this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:o,key:a,sep:A}]})}else s.length>0?r.sep=r.sep.concat(s,this.sourceToken):r.sep.push(this.sourceToken);else if(VA(r.start,"newline"))Object.assign(r,{key:null,sep:[this.sourceToken]});else{let o=kd(r.start);this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:o,key:null,sep:[this.sourceToken]}]})}else r.sep?r.value||i?e.items.push({start:s,key:null,sep:[this.sourceToken]}):VA(r.sep,"map-value-ind")?this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:[],key:null,sep:[this.sourceToken]}]}):r.sep.push(this.sourceToken):Object.assign(r,{key:null,sep:[this.sourceToken]});this.onKeyLine=!0;return;case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":{let o=this.flowScalar(this.type);i||r.value?(e.items.push({start:s,key:o,sep:[]}),this.onKeyLine=!0):r.sep?this.stack.push(o):(Object.assign(r,{key:o,sep:[]}),this.onKeyLine=!0);return}default:{let o=this.startBlockValue(e);if(o){n&&o.type!=="block-seq"&&e.items.push({start:s}),this.stack.push(o);return}}}}yield*this.pop(),yield*this.step()}*blockSequence(e){let r=e.items[e.items.length-1];switch(this.type){case"newline":if(r.value){let n="end"in r.value?r.value.end:void 0;(Array.isArray(n)?n[n.length-1]:void 0)?.type==="comment"?n?.push(this.sourceToken):e.items.push({start:[this.sourceToken]})}else r.start.push(this.sourceToken);return;case"space":case"comment":if(r.value)e.items.push({start:[this.sourceToken]});else{if(this.atIndentedComment(r.start,e.indent)){let i=e.items[e.items.length-2]?.value?.end;if(Array.isArray(i)){Array.prototype.push.apply(i,r.start),i.push(this.sourceToken),e.items.pop();return}}r.start.push(this.sourceToken)}return;case"anchor":case"tag":if(r.value||this.indent<=e.indent)break;r.start.push(this.sourceToken);return;case"seq-item-ind":if(this.indent!==e.indent)break;r.value||VA(r.start,"seq-item-ind")?e.items.push({start:[this.sourceToken]}):r.start.push(this.sourceToken);return}if(this.indent>e.indent){let n=this.startBlockValue(e);if(n){this.stack.push(n);return}}yield*this.pop(),yield*this.step()}*flowCollection(e){let r=e.items[e.items.length-1];if(this.type==="flow-error-end"){let n;do yield*this.pop(),n=this.peek(1);while(n&&n.type==="flow-collection")}else if(e.end.length===0){switch(this.type){case"comma":case"explicit-key-ind":!r||r.sep?e.items.push({start:[this.sourceToken]}):r.start.push(this.sourceToken);return;case"map-value-ind":!r||r.value?e.items.push({start:[],key:null,sep:[this.sourceToken]}):r.sep?r.sep.push(this.sourceToken):Object.assign(r,{key:null,sep:[this.sourceToken]});return;case"space":case"comment":case"newline":case"anchor":case"tag":!r||r.value?e.items.push({start:[this.sourceToken]}):r.sep?r.sep.push(this.sourceToken):r.start.push(this.sourceToken);return;case"alias":case"scalar":case"singl Line truncated
`)+1;for(;r!==0;)this.onNewLine(this.offset+r),r=this.source.indexOf(`
`,r)+1}return{type:e,offset:this.offset,indent:this.indent,source:this.source}}startBlockValue(e){switch(this.type){case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":return this.flowScalar(this.type);case"block-scalar-header":return{type:"block-scalar",offset:this.offset,indent:this.indent,props:[this.sourceToken],source:""};case"flow-map-start":case"flow-seq-start":return{type:"flow-collection",offset:this.offset,indent:this.indent,start:this.sourceToken,items:[],end:[]};case"seq-item-ind":return{type:"block-seq",offset:this.offset,indent:this.indent,items:[{start:[this.sourceToken]}]};case"explicit-key-ind":{this.onKeyLine=!0;let r=QQ(e),n=kd(r);return n.push(this.sourceToken),{type:"block-map",offset:this.offset,indent:this.indent,items:[{start:n,explicitKey:!0}]}}case"map-value-ind":{this.onKeyLine=!0;let r=QQ(e),n=kd(r);return{type:"block-map",offset:this.offset,indent:this.indent,items:[{start:n,key:null,sep:[this.sourceToken]}]}}}return null}atIndentedComment(e,r){return this.type!=="comment"||this.indent<=r?!1:e.every(n=>n.type==="newline"||n.type==="space")}*documentEnd(e){this.type!=="doc-mode"&&(e.end?e.end.push(this.sourceToken):e.end=[this.sourceToken],this.type==="newline"&&(yield*this.pop()))}*lineEnd(e){switch(this.type){case"comma":case"doc-start":case"doc-end":case"flow-seq-end":case"flow-map-end":case"map-value-ind":yield*this.pop(),yield*this.step();break;case"newline":this.onKeyLine=!1;default:e.end?e.end.push(this.sourceToken):e.end=[this.sourceToken],this.type==="newline"&&(yield*this.pop())}}};O8.Parser=AP});var q8=h(Em=>{"use strict";var L8=Wk(),dPe=lm(),ym=fm(),fPe=JD(),hPe=He(),gPe=aP(),M8=cP();function F8(t){let e=t.prettyErrors!==!1;return{lineCounter:t.lineCounter||e&&new gPe.LineCounter||null,prettyErrors:e}}function mPe(t,e={}){let{lineCounter:r,prettyErrors:n}=F8(e),i=new M8.Parser(r?.addNewLine),s=new L8.Composer(e),o=Array.from(s.compose(i.parse(t)));if(n&&r)for(let a of o)a.errors.forEach(ym.prettifyError(t,r)),a.warnings.forEach(ym.prettifyError(t,r));return o.length>0?o:Object.assign([],{empty:!0},s.streamInfo())}function U8(t,e={}){let{lineCounter:r,prettyErrors:n}=F8(e),i=new M8.Parser(r?.addNewLine),s=new L8.Composer(e),o=null;for(let a of s.compose(i.parse(t),!0,t.length))if(!o)o=a;else if(o.options.logLevel!=="silent"){o.errors.push(new ym.YAMLParseError(a.range.slice(0,2),"MULTIPLE_DOCS","Source contains multiple documents; please use YAML.parseAllDocuments()"));break}return n&&r&&(o.errors.forEach(ym.prettifyError(t,r)),o.warnings.forEach(ym.prettifyError(t,r))),o}function pPe(t,e,r){let n;typeof e=="function"?n=e:r===void 0&&e&&typeof e=="object"&&(r=e);let i=U8(t,r);if(!i)return null;if(i.warnings.forEach(s=>fPe.warn(i.options.logLevel,s)),i.errors.length>0){if(i.options.logLevel!=="silent")throw i.errors[0];i.errors=[]}return i.toJS(Object.assign({reviver:n},r))}function yPe(t,e,r){let n=null;if(typeof e=="function"||Array.isArray(e)?n=e:r===void 0&&e&&(r=e),typeof r=="string"&&(r=r.length),typeof r=="number"){let i=Math.round(r);r=i<1?void 0:i>8?{indent:8}:{indent:i}}if(t===void 0){let{keepUndefined:i}=r??e??{};if(!i)return}return hPe.isDocument(t)&&!n?t.toString(r):new dPe.Document(t,n,r).toString(r)}Em.parse=pPe;Em.parseAllDocuments=mPe;Em.parseDocument=U8;Em.stringify=yPe});var uP=h(tt=>{"use strict";var EPe=Wk(),CPe=lm(),IPe=vk(),lP=fm(),BPe=Jg(),Ta=He(),QPe=_a(),bPe=sr(),NPe=ka(),wPe=Pa(),SPe=IQ(),xPe=sP(),vPe=aP(),RPe=cP(),bQ=q8(),H8=jg();tt.Composer=EPe.Composer;tt.Document=CPe.Document;tt.Schema=IPe.Schema;tt.YAMLError=lP.YAMLError;tt.YAMLParseError=lP.YAMLParseError;tt.YAMLWarning=lP.YAMLWarning;tt.Alias=BPe.Alias;tt.isAlias=Ta.isAlias;tt.isCollection=Ta.isCollection;tt.isDocument=Ta.isDocument;tt.isMap=Ta.isMap;tt.isNode=Ta.isNode;tt.isPair=Ta.isPair;tt.isScalar=Ta.isScalar;tt.isSeq=Ta.isSeq;tt.Pair=QPe.Pair;tt.Scalar=bPe.Scalar;tt.YAMLMap=NPe.YAMLMap;tt.YAMLSeq=wPe.YAMLSeq;tt.CST=SPe;tt.Lexer=xPe.Lexer;tt.LineCounter=vPe.LineCounter;tt.Parser=RPe.Parser;tt.parse=bQ.parse;tt.parseAllDocuments=bQ.parseAllDocuments;tt.parseDocument=bQ.parseDocument;tt.stringify=bQ.stringify;tt.visit=H8.visit;tt.visitAsync=H8.visitAsync});var Gd=Ct(at());var U$=Ct(CB()),Qd=Ct(at());var T$=Ct(CB()),ki=Ct(at()),O$=Ct(Pf()),L$=Ct(P$()),M$=Ct(require("os"));async function F$(t){let e=await Vve();(0,ki.saveState)("cache_path",e);let r=await(0,L$.hashFiles)(t.cacheDependencyPath);if(!r)throw new Error("Some specified paths were not resolved, unable to cache dependencies.");let n=`pnpm-cache-${process.env.RUNNER_OS}-${M$.default.arch()}-${r}`;(0,ki.debug)(`Primary key is ${n}`),(0,ki.saveState)("cache_primary_key",n);let i=await(0,T$.restoreCache)([e],n);if((0,ki.setOutput)("cache-hit",!!i),!i){(0,ki.info)("Cache is not found");return}(0,ki.saveState)("cache_restored_key",i),(0,ki.info)(`Cache restored from key: ${i}`)}async function Vve(){let{stdout:t}=await(0,O$.getExecOutput)("pnpm store path --silent"),e=t.trim();return(0,ki.debug)(`Cache folLine truncated
`,r)+1}return{type:e,offset:this.offset,indent:this.indent,source:this.source}}startBlockValue(e){switch(this.type){case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":return this.flowScalar(this.type);case"block-scalar-header":return{type:"block-scalar",offset:this.offset,indent:this.indent,props:[this.sourceToken],source:""};case"flow-map-start":case"flow-seq-start":return{type:"flow-collection",offset:this.offset,indent:this.indent,start:this.sourceToken,items:[],end:[]};case"seq-item-ind":return{type:"block-seq",offset:this.offset,indent:this.indent,items:[{start:[this.sourceToken]}]};case"explicit-key-ind":{this.onKeyLine=!0;let r=QQ(e),n=kd(r);return n.push(this.sourceToken),{type:"block-map",offset:this.offset,indent:this.indent,items:[{start:n,explicitKey:!0}]}}case"map-value-ind":{this.onKeyLine=!0;let r=QQ(e),n=kd(r);return{type:"block-map",offset:this.offset,indent:this.indent,items:[{start:n,key:null,sep:[this.sourceToken]}]}}}return null}atIndentedComment(e,r){return this.type!=="comment"||this.indent<=r?!1:e.every(n=>n.type==="newline"||n.type==="space")}*documentEnd(e){this.type!=="doc-mode"&&(e.end?e.end.push(this.sourceToken):e.end=[this.sourceToken],this.type==="newline"&&(yield*this.pop()))}*lineEnd(e){switch(this.type){case"comma":case"doc-start":case"doc-end":case"flow-seq-end":case"flow-map-end":case"map-value-ind":yield*this.pop(),yield*this.step();break;case"newline":this.onKeyLine=!1;default:e.end?e.end.push(this.sourceToken):e.end=[this.sourceToken],this.type==="newline"&&(yield*this.pop())}}};O8.Parser=AP});var q8=h(Em=>{"use strict";var L8=Wk(),dPe=lm(),ym=fm(),fPe=JD(),hPe=He(),gPe=aP(),M8=cP();function F8(t){let e=t.prettyErrors!==!1;return{lineCounter:t.lineCounter||e&&new gPe.LineCounter||null,prettyErrors:e}}function mPe(t,e={}){let{lineCounter:r,prettyErrors:n}=F8(e),i=new M8.Parser(r?.addNewLine),s=new L8.Composer(e),o=Array.from(s.compose(i.parse(t)));if(n&&r)for(let a of o)a.errors.forEach(ym.prettifyError(t,r)),a.warnings.forEach(ym.prettifyError(t,r));return o.length>0?o:Object.assign([],{empty:!0},s.streamInfo())}function U8(t,e={}){let{lineCounter:r,prettyErrors:n}=F8(e),i=new M8.Parser(r?.addNewLine),s=new L8.Composer(e),o=null;for(let a of s.compose(i.parse(t),!0,t.length))if(!o)o=a;else if(o.options.logLevel!=="silent"){o.errors.push(new ym.YAMLParseError(a.range.slice(0,2),"MULTIPLE_DOCS","Source contains multiple documents; please use YAML.parseAllDocuments()"));break}return n&&r&&(o.errors.forEach(ym.prettifyError(t,r)),o.warnings.forEach(ym.prettifyError(t,r))),o}function pPe(t,e,r){let n;typeof e=="function"?n=e:r===void 0&&e&&typeof e=="object"&&(r=e);let i=U8(t,r);if(!i)return null;if(i.warnings.forEach(s=>fPe.warn(i.options.logLevel,s)),i.errors.length>0){if(i.options.logLevel!=="silent")throw i.errors[0];i.errors=[]}return i.toJS(Object.assign({reviver:n},r))}function yPe(t,e,r){let n=null;if(typeof e=="function"||Array.isArray(e)?n=e:r===void 0&&e&&(r=e),typeof r=="string"&&(r=r.length),typeof r=="number"){let i=Math.round(r);r=i<1?void 0:i>8?{indent:8}:{indent:i}}if(t===void 0){let{keepUndefined:i}=r??e??{};if(!i)return}return hPe.isDocument(t)&&!n?t.toString(r):new dPe.Document(t,n,r).toString(r)}Em.parse=pPe;Em.parseAllDocuments=mPe;Em.parseDocument=U8;Em.stringify=yPe});var uP=h(tt=>{"use strict";var EPe=Wk(),CPe=lm(),IPe=vk(),lP=fm(),BPe=Jg(),Ta=He(),QPe=_a(),bPe=sr(),NPe=ka(),wPe=Pa(),SPe=IQ(),xPe=sP(),vPe=aP(),RPe=cP(),bQ=q8(),H8=jg();tt.Composer=EPe.Composer;tt.Document=CPe.Document;tt.Schema=IPe.Schema;tt.YAMLError=lP.YAMLError;tt.YAMLParseError=lP.YAMLParseError;tt.YAMLWarning=lP.YAMLWarning;tt.Alias=BPe.Alias;tt.isAlias=Ta.isAlias;tt.isCollection=Ta.isCollection;tt.isDocument=Ta.isDocument;tt.isMap=Ta.isMap;tt.isNode=Ta.isNode;tt.isPair=Ta.isPair;tt.isScalar=Ta.isScalar;tt.isSeq=Ta.isSeq;tt.Pair=QPe.Pair;tt.Scalar=bPe.Scalar;tt.YAMLMap=NPe.YAMLMap;tt.YAMLSeq=wPe.YAMLSeq;tt.CST=SPe;tt.Lexer=xPe.Lexer;tt.LineCounter=vPe.LineCounter;tt.Parser=RPe.Parser;tt.parse=bQ.parse;tt.parseAllDocuments=bQ.parseAllDocuments;tt.parseDocument=bQ.parseDocument;tt.stringify=bQ.stringify;tt.visit=H8.visit;tt.visitAsync=H8.visitAsync});var Gd=Ct(at());var U$=Ct(CB()),Qd=Ct(at());var T$=Ct(CB()),ki=Ct(at()),O$=Ct(Pf()),L$=Ct(P$()),M$=Ct(require("os"));async function F$(t){let e=await Vve();(0,ki.saveState)("cache_path",e);let r=await(0,L$.hashFiles)(t.cacheDependencyPath);if(!r)throw new Error("Some specified paths were not resolved, unable to cache dependencies.");let n=`pnpm-cache-${process.env.RUNNER_OS}-${M$.default.arch()}-${r}`;(0,ki.debug)(`Primary key is ${n}`),(0,ki.saveState)("cache_primary_key",n);let i=await(0,T$.restoreCache)([e],n);if((0,ki.setOutput)("cache-hit",!!i),!i){(0,ki.info)("Cache is not found");return}(0,ki.saveState)("cache_restored_key",i),(0,ki.info)(`Cache restored from key: ${i}`)}async function Vve(){let{stdout:t}=await(0,O$.getExecOutput)("pnpm store path --silent"),e=t.trim();return(0,ki.debug)(`Cache folLine truncated
- version ${e} in the GitHub Action config with the key "version"
- version ${i} in the package.json with the key "packageManager"
Remove one of these versions to avoid version mismatch errors like ERR_PNPM_BAD_PM_VERSION`);return e}if(!(typeof i=="string"&&i.startsWith("pnpm@"))&&!(s?.packageManager?.name==="pnpm"&&s.packageManager.version))throw n?new Error(`No pnpm version is specified.
+4 -3
View File
@@ -40,12 +40,13 @@ export async function runSelfInstaller(inputs: Inputs): Promise<number> {
const pnpmHome = standalone && process.platform === 'win32'
? path.join(dest, 'node_modules', '@pnpm', 'exe')
: path.join(dest, 'node_modules', '.bin')
// pnpm expects PNPM_HOME/bin in PATH for global binaries (e.g. node
// installed via `pnpm runtime`). Add it first so the next addPath
// (pnpmHome itself, which contains pnpm.exe) has higher precedence.
addPath(path.join(pnpmHome, 'bin'))
addPath(pnpmHome)
exportVariable('PNPM_HOME', pnpmHome)
// pnpm expects PNPM_HOME/bin in PATH for global binaries
addPath(path.join(pnpmHome, 'bin'))
// Ensure pnpm bin link exists — npm ci sometimes doesn't create it
if (process.platform !== 'win32') {
const pnpmBinLink = path.join(dest, 'node_modules', '.bin', 'pnpm')