From 0638cb43fd7b55a33c2d3c6b4bdbd23eca61f4f3 Mon Sep 17 00:00:00 2001 From: Jonas Strassel Date: Wed, 12 Feb 2025 12:54:07 +0100 Subject: [PATCH] fix: always print heading and at least a fallback message closes #6 --- action.yml | 2 +- dist/action.js | 4 ++-- src/lib.ts | 9 +++++++-- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/action.yml b/action.yml index 779aa25..3a083b0 100644 --- a/action.yml +++ b/action.yml @@ -4,7 +4,7 @@ inputs: heading: description: "The heading to use for the report." required: false - default: "Gas report" + default: "Forge Gas Snapshots" token: description: "The GitHub token to use for the API requests." required: false diff --git a/dist/action.js b/dist/action.js index 98cda90..0cdb9f1 100644 --- a/dist/action.js +++ b/dist/action.js @@ -66,8 +66,8 @@ globstar while`,e,g,A,E,l),this.matchOne(e.slice(g),A.slice(E),t))return this.de >>> no match, partial?`,e,g,A,E),g===n))}var u;if(typeof a=="string"?(u=c===a,this.debug("string match",a,c,u)):(u=c.match(a),this.debug("pattern match",a,c,u)),!u)return!1}if(s===n&&o===i)return!0;if(s===n)return t;if(o===i)return s===n-1&&e[s]==="";throw new Error("wtf?")};function Ev(e){return e.replace(/\\(.)/g,"$1")}function lv(e){return e.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&")}});var am=h(xA=>{"use strict";var uv=xA&&xA.__createBinding||(Object.create?function(e,A,t,r){r===void 0&&(r=t);var s=Object.getOwnPropertyDescriptor(A,t);(!s||("get"in s?!A.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return A[t]}}),Object.defineProperty(e,r,s)}:function(e,A,t,r){r===void 0&&(r=t),e[r]=A[t]}),Qv=xA&&xA.__setModuleDefault||(Object.create?function(e,A){Object.defineProperty(e,"default",{enumerable:!0,value:A})}:function(e,A){e.default=A}),im=xA&&xA.__importStar||function(e){if(e&&e.__esModule)return e;var A={};if(e!=null)for(var t in e)t!=="default"&&Object.prototype.hasOwnProperty.call(e,t)&&uv(A,e,t);return Qv(A,e),A},hv=xA&&xA.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(xA,"__esModule",{value:!0});xA.Path=void 0;var xo=im(require("path")),zt=im(zi()),Yo=hv(require("assert")),Cv=process.platform==="win32",nl=class{constructor(A){if(this.segments=[],typeof A=="string")if((0,Yo.default)(A,"Parameter 'itemPath' must not be empty"),A=zt.safeTrimTrailingSeparator(A),!zt.hasRoot(A))this.segments=A.split(xo.sep);else{let t=A,r=zt.dirname(t);for(;r!==t;){let s=xo.basename(t);this.segments.unshift(s),t=r,r=zt.dirname(t)}this.segments.unshift(t)}else{(0,Yo.default)(A.length>0,"Parameter 'itemPath' must not be an empty array");for(let t=0;t{"use strict";var Bv=YA&&YA.__createBinding||(Object.create?function(e,A,t,r){r===void 0&&(r=t);var s=Object.getOwnPropertyDescriptor(A,t);(!s||("get"in s?!A.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return A[t]}}),Object.defineProperty(e,r,s)}:function(e,A,t,r){r===void 0&&(r=t),e[r]=A[t]}),Iv=YA&&YA.__setModuleDefault||(Object.create?function(e,A){Object.defineProperty(e,"default",{enumerable:!0,value:A})}:function(e,A){e.default=A}),cl=YA&&YA.__importStar||function(e){if(e&&e.__esModule)return e;var A={};if(e!=null)for(var t in e)t!=="default"&&Object.prototype.hasOwnProperty.call(e,t)&&Bv(A,e,t);return Iv(A,e),A},dv=YA&&YA.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(YA,"__esModule",{value:!0});YA.Pattern=void 0;var fv=cl(require("os")),Jo=cl(require("path")),gA=cl(zi()),Fr=dv(require("assert")),pv=nm(),il=ea(),ra=am(),Tt=process.platform==="win32",al=class e{constructor(A,t=!1,r,s){this.negate=!1;let o;if(typeof A=="string")o=A.trim();else{r=r||[],(0,Fr.default)(r.length,"Parameter 'segments' must not empty");let c=e.getLiteral(r[0]);(0,Fr.default)(c&&gA.hasAbsoluteRoot(c),"Parameter 'segments' first element must be a root path"),o=new ra.Path(r).toString().trim(),A&&(o=`!${o}`)}for(;o.startsWith("!");)this.negate=!this.negate,o=o.substr(1).trim();o=e.fixupPattern(o,s),this.segments=new ra.Path(o).segments,this.trailingSeparator=gA.normalizeSeparators(o).endsWith(Jo.sep),o=gA.safeTrimTrailingSeparator(o);let n=!1,i=this.segments.map(c=>e.getLiteral(c)).filter(c=>!n&&!(n=c===""));this.searchPath=new ra.Path(i).toString(),this.rootRegExp=new RegExp(e.regExpEscape(i[0]),Tt?"i":""),this.isImplicitPattern=t;let a={dot:!0,nobrace:!0,nocase:Tt,nocomment:!0,noext:!0,nonegate:!0};o=Tt?o.replace(/\\/g,"/"):o,this.minimatch=new pv.Minimatch(o,a)}match(A){return this.segments[this.segments.length-1]==="**"?(A=gA.normalizeSeparators(A),!A.endsWith(Jo.sep)&&this.isImplicitPattern===!1&&(A=`${A}${Jo.sep}`)):A=gA.safeTrimTrailingSeparator(A),this.minimatch.match(A)?this.trailingSeparator?il.MatchKind.Directory:il.MatchKind.All:il.MatchKind.None}partialMatch(A){return A=gA.safeTrimTrailingSeparator(A),gA.dirname(A)===A?this.rootRegExp.test(A):this.minimatch.matchOne(A.split(Tt?/\\+/:/\/+/),this.minimatch.set[0],!0)}static globEscape(A){return(Tt?A:A.replace(/\\/g,"\\\\")).replace(/(\[)(?=[^/]+\])/g,"[[]").replace(/\?/g,"[?]").replace(/\*/g,"[*]")}static fixupPattern(A,t){(0,Fr.default)(A,"pattern cannot be empty");let r=new ra.Path(A).segments.map(s=>e.getLiteral(s));if((0,Fr.default)(r.every((s,o)=>(s!=="."||o===0)&&s!==".."),`Invalid pattern '${A}'. Relative pathing '.' and '..' is not allowed.`),(0,Fr.default)(!gA.hasRoot(A)||r[0],`Invalid pattern '${A}'. Root segment must not contain globs.`),A=gA.normalizeSeparators(A),A==="."||A.startsWith(`.${Jo.sep}`))A=e.globEscape(process.cwd())+A.substr(1);else if(A==="~"||A.startsWith(`~${Jo.sep}`))t=t||fv.homedir(),(0,Fr.default)(t,"Unable to determine HOME directory"),(0,Fr.default)(gA.hasAbsoluteRoot(t),`Expected HOME directory to be a rooted path. Actual '${t}'`),A=e.globEscape(t)+A.substr(1);else if(Tt&&(A.match(/^[A-Z]:$/i)||A.match(/^[A-Z]:[^\\]/i))){let s=gA.ensureAbsoluteRoot("C:\\dummy-root",A.substr(0,2));A.length>2&&!s.endsWith("\\")&&(s+="\\"),A=e.globEscape(s)+A.substr(2)}else if(Tt&&(A==="\\"||A.match(/^\\[^\\]/))){let s=gA.ensureAbsoluteRoot("C:\\dummy-root","\\");s.endsWith("\\")||(s+="\\"),A=e.globEscape(s)+A.substr(1)}else A=gA.ensureAbsoluteRoot(e.globEscape(process.cwd()),A);return gA.normalizeSeparators(A)}static getLiteral(A){let t="";for(let r=0;r=0){if(o.length>1)return"";if(o){t+=o,r=n;continue}}}}t+=s}return t}static regExpEscape(A){return A.replace(/[[\\^$.|?*+()]/g,"\\$&")}};YA.Pattern=al});var gm=h(sa=>{"use strict";Object.defineProperty(sa,"__esModule",{value:!0});sa.SearchState=void 0;var gl=class{constructor(A,t){this.path=A,this.level=t}};sa.SearchState=gl});var Cm=h(ke=>{"use strict";var mv=ke&&ke.__createBinding||(Object.create?function(e,A,t,r){r===void 0&&(r=t);var s=Object.getOwnPropertyDescriptor(A,t);(!s||("get"in s?!A.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return A[t]}}),Object.defineProperty(e,r,s)}:function(e,A,t,r){r===void 0&&(r=t),e[r]=A[t]}),yv=ke&&ke.__setModuleDefault||(Object.create?function(e,A){Object.defineProperty(e,"default",{enumerable:!0,value:A})}:function(e,A){e.default=A}),Ho=ke&&ke.__importStar||function(e){if(e&&e.__esModule)return e;var A={};if(e!=null)for(var t in e)t!=="default"&&Object.prototype.hasOwnProperty.call(e,t)&&mv(A,e,t);return yv(A,e),A},El=ke&&ke.__awaiter||function(e,A,t,r){function s(o){return o instanceof t?o:new t(function(n){n(o)})}return new(t||(t=Promise))(function(o,n){function i(g){try{c(r.next(g))}catch(E){n(E)}}function a(g){try{c(r.throw(g))}catch(E){n(E)}}function c(g){g.done?o(g.value):s(g.value).then(i,a)}c((r=r.apply(e,A||[])).next())})},wv=ke&&ke.__asyncValues||function(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var A=e[Symbol.asyncIterator],t;return A?A.call(e):(e=typeof __values=="function"?__values(e):e[Symbol.iterator](),t={},r("next"),r("throw"),r("return"),t[Symbol.asyncIterator]=function(){return this},t);function r(o){t[o]=e[o]&&function(n){return new Promise(function(i,a){n=e[o](n),s(i,a,n.done,n.value)})}}function s(o,n,i,a){Promise.resolve(a).then(function(c){o({value:c,done:i})},n)}},$t=ke&&ke.__await||function(e){return this instanceof $t?(this.v=e,this):new $t(e)},Dv=ke&&ke.__asyncGenerator||function(e,A,t){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var r=t.apply(e,A||[]),s,o=[];return s={},n("next"),n("throw"),n("return"),s[Symbol.asyncIterator]=function(){return this},s;function n(l){r[l]&&(s[l]=function(u){return new Promise(function(Q,I){o.push([l,u,Q,I])>1||i(l,u)})})}function i(l,u){try{a(r[l](u))}catch(Q){E(o[0][3],Q)}}function a(l){l.value instanceof $t?Promise.resolve(l.value.v).then(c,g):E(o[0][2],l)}function c(l){i("next",l)}function g(l){i("throw",l)}function E(l,u){l(u),o.shift(),o.length&&i(o[0][0],o[0][1])}};Object.defineProperty(ke,"__esModule",{value:!0});ke.DefaultGlobber=void 0;var ll=Ho(Fs()),Oo=Ho(require("fs")),Em=Ho(Gp()),lm=Ho(require("path")),oa=Ho(xp()),um=ea(),Qm=cm(),hm=gm(),bv=process.platform==="win32",ul=class e{constructor(A){this.patterns=[],this.searchPaths=[],this.options=Em.getOptions(A)}getSearchPaths(){return this.searchPaths.slice()}glob(){var A,t,r,s;return El(this,void 0,void 0,function*(){let o=[];try{for(var n=!0,i=wv(this.globGenerator()),a;a=yield i.next(),A=a.done,!A;n=!0){s=a.value,n=!1;let c=s;o.push(c)}}catch(c){t={error:c}}finally{try{!n&&!A&&(r=i.return)&&(yield r.call(i))}finally{if(t)throw t.error}}return o})}globGenerator(){return Dv(this,arguments,function*(){let t=Em.getOptions(this.options),r=[];for(let n of this.patterns)r.push(n),t.implicitDescendants&&(n.trailingSeparator||n.segments[n.segments.length-1]!=="**")&&r.push(new Qm.Pattern(n.negate,!0,n.segments.concat("**")));let s=[];for(let n of oa.getSearchPaths(r)){ll.debug(`Search path '${n}'`);try{yield $t(Oo.promises.lstat(n))}catch(i){if(i.code==="ENOENT")continue;throw i}s.unshift(new hm.SearchState(n,1))}let o=[];for(;s.length;){let n=s.pop(),i=oa.match(r,n.path),a=!!i||oa.partialMatch(r,n.path);if(!i&&!a)continue;let c=yield $t(e.stat(n,t,o));if(c&&!(t.excludeHiddenFiles&&lm.basename(n.path).match(/^\./)))if(c.isDirectory()){if(i&um.MatchKind.Directory&&t.matchDirectories)yield yield $t(n.path);else if(!a)continue;let g=n.level+1,E=(yield $t(Oo.promises.readdir(n.path))).map(l=>new hm.SearchState(lm.join(n.path,l),g));s.push(...E.reverse())}else i&um.MatchKind.File&&(yield yield $t(n.path))}})}static create(A,t){return El(this,void 0,void 0,function*(){let r=new e(t);bv&&(A=A.replace(/\r\n/g,` `),A=A.replace(/\r/g,` `));let s=A.split(` -`).map(o=>o.trim());for(let o of s)!o||o.startsWith("#")||r.patterns.push(new Qm.Pattern(o));return r.searchPaths.push(...oa.getSearchPaths(r.patterns)),r})}static stat(A,t,r){return El(this,void 0,void 0,function*(){let s;if(t.followSymbolicLinks)try{s=yield Oo.promises.stat(A.path)}catch(o){if(o.code==="ENOENT"){if(t.omitBrokenSymbolicLinks){ll.debug(`Broken symlink '${A.path}'`);return}throw new Error(`No information found for the path '${A.path}'. This may indicate a broken symbolic link.`)}throw o}else s=yield Oo.promises.lstat(A.path);if(s.isDirectory()&&t.followSymbolicLinks){let o=yield Oo.promises.realpath(A.path);for(;r.length>=A.level;)r.pop();if(r.some(n=>n===o)){ll.debug(`Symlink cycle detected for path '${A.path}' and realpath '${o}'`);return}r.push(o)}return s})}};ke.DefaultGlobber=ul});var fm=h(EA=>{"use strict";var Rv=EA&&EA.__createBinding||(Object.create?function(e,A,t,r){r===void 0&&(r=t);var s=Object.getOwnPropertyDescriptor(A,t);(!s||("get"in s?!A.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return A[t]}}),Object.defineProperty(e,r,s)}:function(e,A,t,r){r===void 0&&(r=t),e[r]=A[t]}),kv=EA&&EA.__setModuleDefault||(Object.create?function(e,A){Object.defineProperty(e,"default",{enumerable:!0,value:A})}:function(e,A){e.default=A}),vs=EA&&EA.__importStar||function(e){if(e&&e.__esModule)return e;var A={};if(e!=null)for(var t in e)t!=="default"&&Object.prototype.hasOwnProperty.call(e,t)&&Rv(A,e,t);return kv(A,e),A},Fv=EA&&EA.__awaiter||function(e,A,t,r){function s(o){return o instanceof t?o:new t(function(n){n(o)})}return new(t||(t=Promise))(function(o,n){function i(g){try{c(r.next(g))}catch(E){n(E)}}function a(g){try{c(r.throw(g))}catch(E){n(E)}}function c(g){g.done?o(g.value):s(g.value).then(i,a)}c((r=r.apply(e,A||[])).next())})},Sv=EA&&EA.__asyncValues||function(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var A=e[Symbol.asyncIterator],t;return A?A.call(e):(e=typeof __values=="function"?__values(e):e[Symbol.iterator](),t={},r("next"),r("throw"),r("return"),t[Symbol.asyncIterator]=function(){return this},t);function r(o){t[o]=e[o]&&function(n){return new Promise(function(i,a){n=e[o](n),s(i,a,n.done,n.value)})}}function s(o,n,i,a){Promise.resolve(a).then(function(c){o({value:c,done:i})},n)}};Object.defineProperty(EA,"__esModule",{value:!0});EA.hashFiles=void 0;var Bm=vs(require("crypto")),Im=vs(Fs()),dm=vs(require("fs")),Tv=vs(require("stream")),Nv=vs(require("util")),Uv=vs(require("path"));function Lv(e,A,t=!1){var r,s,o,n,i;return Fv(this,void 0,void 0,function*(){let a=t?Im.info:Im.debug,c=!1,g=A||((i=process.env.GITHUB_WORKSPACE)!==null&&i!==void 0?i:process.cwd()),E=Bm.createHash("sha256"),l=0;try{for(var u=!0,Q=Sv(e.globGenerator()),I;I=yield Q.next(),r=I.done,!r;u=!0){n=I.value,u=!1;let B=n;if(a(B),!B.startsWith(`${g}${Uv.sep}`)){a(`Ignore '${B}' since it is not under GITHUB_WORKSPACE.`);continue}if(dm.statSync(B).isDirectory()){a(`Skip directory '${B}'.`);continue}let d=Bm.createHash("sha256");yield Nv.promisify(Tv.pipeline)(dm.createReadStream(B),d),E.write(d.digest()),l++,c||(c=!0)}}catch(B){s={error:B}}finally{try{!u&&!r&&(o=Q.return)&&(yield o.call(Q))}finally{if(s)throw s.error}}return E.end(),c?(a(`Found ${l} files to hash.`),E.digest("hex")):(a("No matches found for glob"),"")})}EA.hashFiles=Lv});var ym=h(er=>{"use strict";var pm=er&&er.__awaiter||function(e,A,t,r){function s(o){return o instanceof t?o:new t(function(n){n(o)})}return new(t||(t=Promise))(function(o,n){function i(g){try{c(r.next(g))}catch(E){n(E)}}function a(g){try{c(r.throw(g))}catch(E){n(E)}}function c(g){g.done?o(g.value):s(g.value).then(i,a)}c((r=r.apply(e,A||[])).next())})};Object.defineProperty(er,"__esModule",{value:!0});er.hashFiles=er.create=void 0;var Gv=Cm(),vv=fm();function mm(e,A){return pm(this,void 0,void 0,function*(){return yield Gv.DefaultGlobber.create(e,A)})}er.create=mm;function Mv(e,A="",t,r=!1){return pm(this,void 0,void 0,function*(){let s=!0;t&&typeof t.followSymbolicLinks=="boolean"&&(s=t.followSymbolicLinks);let o=yield mm(e,{followSymbolicLinks:s});return(0,vv.hashFiles)(o,A,r)})}er.hashFiles=Mv});var bm=require("fs/promises"),lA=Ur(Fs()),Ms=Ur(Lp()),Rm=Ur(ym());var _v=new Intl.NumberFormat("en-US"),Ql=e=>_v.format(Number(e));function wm({before:e,after:A}){let t={},r={},s={},o={},n=Object.keys(e),i=Object.keys(A),a=n.filter(g=>Number.isNaN(Number(e[g]))),c=i.filter(g=>Number.isNaN(Number(A[g])));if(a.length>0)throw new Error(`The following keys in before are not numbers: ${a.join(", ")}`);if(c.length>0)throw new Error(`The following keys in after are not numbers: ${c.join(", ")}`);for(let g of n){let E=g,l=e[g],u=A[g];if(!u)t[E]=Ql(l);else if(l!==u){let Q=Math.abs(Number(l)-Number(u)),I=Math.round(Q/Number(l)*100),B=Number(l)${B}${I}% (${d}${Q}) ${Ql(u)}`}else o[E]=Ql(l)}for(let g of i){let E=g,l=e[g],u=A[g];l||(r[E]=u)}return{removed:t,added:r,changed:s,unchanged:o}}var Dm=(e,A)=>{let t="| Path | Value |",r="| --- | ---: |",s="",o=[`### \u267B\uFE0F ${e}`,t,r],n=[],i=[s,"
\u{1F515} Unchanged",s,t,r],a=[],c=(E,l)=>`| ${E} | ${l} |`,g=E=>E.map(([l,u])=>c(`${l}`,`${u}`));for(let{path:E,diff:l}of A){let u=l.changed,Q=l.added,I=l.removed,B=l.unchanged;Object.keys(u).length+Object.keys(Q).length+Object.keys(I).length>0&&(n.push(c(`**${E}**`,"")),n.push(...g(Object.entries(u))),n.push(...g(Object.entries(I))),n.push(...g(Object.entries(Q)))),Object.keys(B).length>0&&(a.push(c(`**${E}**`,"")),a.push(...g(Object.entries(B))))}return n.length>0&&(n=[...o,...n,"
"]),a.length>0&&(a=[...i,...a,""]),n.concat(a).join(` -`)};var km=Ur(require("path")),xv=(0,lA.getInput)("heading"),Yv=(0,Ms.getOctokit)((0,lA.getInput)("token")),Jv=async(e,A)=>{let{data:t}=await Yv.rest.repos.getContent({repo:Ms.context.repo.repo,owner:Ms.context.repo.owner,path:e,ref:A}).catch(r=>r.response);return!t||!("content"in t)?{}:JSON.parse(atob(t.content))},Ov=async()=>{(0,lA.debug)("Starting run");let e=(0,lA.getInput)("base_ref")===""?void 0:(0,lA.getInput)("base_ref"),A=Ms.context.payload.pull_request?.base.ref;!e&&!A&&console.log("No 'base_ref' provided and not a pull request. Skipping.");let t=[],s=await(await(0,Rm.create)((0,lA.getInput)("files"))).glob();(0,lA.debug)(`Files to compare: ${s.join(", ")}`);for(let n of s){let i=km.default.relative(process.cwd(),n);(0,lA.debug)(`Comparing ${i}`);let a=await Jv(i,e??A),c=JSON.parse(await(0,bm.readFile)(n,"utf8")),g=wm({before:a,after:c});t.push({path:i,diff:g})}(0,lA.debug)(`Results: ${JSON.stringify(t)}`);let o=Dm(xv,t);(0,lA.debug)(`Report: ${o}`),(0,lA.setOutput)("report",o)};Ov(); +`).map(o=>o.trim());for(let o of s)!o||o.startsWith("#")||r.patterns.push(new Qm.Pattern(o));return r.searchPaths.push(...oa.getSearchPaths(r.patterns)),r})}static stat(A,t,r){return El(this,void 0,void 0,function*(){let s;if(t.followSymbolicLinks)try{s=yield Oo.promises.stat(A.path)}catch(o){if(o.code==="ENOENT"){if(t.omitBrokenSymbolicLinks){ll.debug(`Broken symlink '${A.path}'`);return}throw new Error(`No information found for the path '${A.path}'. This may indicate a broken symbolic link.`)}throw o}else s=yield Oo.promises.lstat(A.path);if(s.isDirectory()&&t.followSymbolicLinks){let o=yield Oo.promises.realpath(A.path);for(;r.length>=A.level;)r.pop();if(r.some(n=>n===o)){ll.debug(`Symlink cycle detected for path '${A.path}' and realpath '${o}'`);return}r.push(o)}return s})}};ke.DefaultGlobber=ul});var fm=h(EA=>{"use strict";var Rv=EA&&EA.__createBinding||(Object.create?function(e,A,t,r){r===void 0&&(r=t);var s=Object.getOwnPropertyDescriptor(A,t);(!s||("get"in s?!A.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return A[t]}}),Object.defineProperty(e,r,s)}:function(e,A,t,r){r===void 0&&(r=t),e[r]=A[t]}),kv=EA&&EA.__setModuleDefault||(Object.create?function(e,A){Object.defineProperty(e,"default",{enumerable:!0,value:A})}:function(e,A){e.default=A}),vs=EA&&EA.__importStar||function(e){if(e&&e.__esModule)return e;var A={};if(e!=null)for(var t in e)t!=="default"&&Object.prototype.hasOwnProperty.call(e,t)&&Rv(A,e,t);return kv(A,e),A},Fv=EA&&EA.__awaiter||function(e,A,t,r){function s(o){return o instanceof t?o:new t(function(n){n(o)})}return new(t||(t=Promise))(function(o,n){function i(g){try{c(r.next(g))}catch(E){n(E)}}function a(g){try{c(r.throw(g))}catch(E){n(E)}}function c(g){g.done?o(g.value):s(g.value).then(i,a)}c((r=r.apply(e,A||[])).next())})},Sv=EA&&EA.__asyncValues||function(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var A=e[Symbol.asyncIterator],t;return A?A.call(e):(e=typeof __values=="function"?__values(e):e[Symbol.iterator](),t={},r("next"),r("throw"),r("return"),t[Symbol.asyncIterator]=function(){return this},t);function r(o){t[o]=e[o]&&function(n){return new Promise(function(i,a){n=e[o](n),s(i,a,n.done,n.value)})}}function s(o,n,i,a){Promise.resolve(a).then(function(c){o({value:c,done:i})},n)}};Object.defineProperty(EA,"__esModule",{value:!0});EA.hashFiles=void 0;var Bm=vs(require("crypto")),Im=vs(Fs()),dm=vs(require("fs")),Tv=vs(require("stream")),Nv=vs(require("util")),Uv=vs(require("path"));function Lv(e,A,t=!1){var r,s,o,n,i;return Fv(this,void 0,void 0,function*(){let a=t?Im.info:Im.debug,c=!1,g=A||((i=process.env.GITHUB_WORKSPACE)!==null&&i!==void 0?i:process.cwd()),E=Bm.createHash("sha256"),l=0;try{for(var u=!0,Q=Sv(e.globGenerator()),I;I=yield Q.next(),r=I.done,!r;u=!0){n=I.value,u=!1;let B=n;if(a(B),!B.startsWith(`${g}${Uv.sep}`)){a(`Ignore '${B}' since it is not under GITHUB_WORKSPACE.`);continue}if(dm.statSync(B).isDirectory()){a(`Skip directory '${B}'.`);continue}let d=Bm.createHash("sha256");yield Nv.promisify(Tv.pipeline)(dm.createReadStream(B),d),E.write(d.digest()),l++,c||(c=!0)}}catch(B){s={error:B}}finally{try{!u&&!r&&(o=Q.return)&&(yield o.call(Q))}finally{if(s)throw s.error}}return E.end(),c?(a(`Found ${l} files to hash.`),E.digest("hex")):(a("No matches found for glob"),"")})}EA.hashFiles=Lv});var ym=h(er=>{"use strict";var pm=er&&er.__awaiter||function(e,A,t,r){function s(o){return o instanceof t?o:new t(function(n){n(o)})}return new(t||(t=Promise))(function(o,n){function i(g){try{c(r.next(g))}catch(E){n(E)}}function a(g){try{c(r.throw(g))}catch(E){n(E)}}function c(g){g.done?o(g.value):s(g.value).then(i,a)}c((r=r.apply(e,A||[])).next())})};Object.defineProperty(er,"__esModule",{value:!0});er.hashFiles=er.create=void 0;var Gv=Cm(),vv=fm();function mm(e,A){return pm(this,void 0,void 0,function*(){return yield Gv.DefaultGlobber.create(e,A)})}er.create=mm;function Mv(e,A="",t,r=!1){return pm(this,void 0,void 0,function*(){let s=!0;t&&typeof t.followSymbolicLinks=="boolean"&&(s=t.followSymbolicLinks);let o=yield mm(e,{followSymbolicLinks:s});return(0,vv.hashFiles)(o,A,r)})}er.hashFiles=Mv});var bm=require("fs/promises"),lA=Ur(Fs()),Ms=Ur(Lp()),Rm=Ur(ym());var _v=new Intl.NumberFormat("en-US"),Ql=e=>_v.format(Number(e));function wm({before:e,after:A}){let t={},r={},s={},o={},n=Object.keys(e),i=Object.keys(A),a=n.filter(g=>Number.isNaN(Number(e[g]))),c=i.filter(g=>Number.isNaN(Number(A[g])));if(a.length>0)throw new Error(`The following keys in before are not numbers: ${a.join(", ")}`);if(c.length>0)throw new Error(`The following keys in after are not numbers: ${c.join(", ")}`);for(let g of n){let E=g,l=e[g],u=A[g];if(!u)t[E]=Ql(l);else if(l!==u){let Q=Math.abs(Number(l)-Number(u)),I=Math.round(Q/Number(l)*100),B=Number(l)${B}${I}% (${d}${Q}) ${Ql(u)}`}else o[E]=Ql(l)}for(let g of i){let E=g,l=e[g],u=A[g];l||(r[E]=u)}return{removed:t,added:r,changed:s,unchanged:o}}var Dm=(e,A)=>{let t="| Path | Value |",r="| --- | ---: |",s="",o=[t,r],n=[],i=[s,"
\u{1F515} Unchanged",s,t,r],a=[],c=(l,u)=>`| ${l} | ${u} |`,g=l=>l.map(([u,Q])=>c(`${u}`,`${Q}`));for(let{path:l,diff:u}of A){let Q=u.changed,I=u.added,B=u.removed,d=u.unchanged;Object.keys(Q).length+Object.keys(I).length+Object.keys(B).length>0&&(n.push(c(`**${l}**`,"")),n.push(...g(Object.entries(Q))),n.push(...g(Object.entries(B))),n.push(...g(Object.entries(I)))),Object.keys(d).length>0&&(a.push(c(`**${l}**`,"")),a.push(...g(Object.entries(d))))}n.length>0&&(n=[...o,...n,"
"]),a.length>0&&(a=[...i,...a,""]);let E=n.concat(a);return E.length===0&&(E=["Seems like you are not measuring gas of any operations yet. \u{1F914}","Consider adding some [snapshot tests](https://book.getfoundry.sh/forge/gas-section-snapshots?highlight=snapshot#snapshotgas-cheatcodes) to measure regressions & improvements."]),[`### \u267B\uFE0F ${e}`,E.join(` +`)]};var km=Ur(require("path")),xv=(0,lA.getInput)("heading"),Yv=(0,Ms.getOctokit)((0,lA.getInput)("token")),Jv=async(e,A)=>{let{data:t}=await Yv.rest.repos.getContent({repo:Ms.context.repo.repo,owner:Ms.context.repo.owner,path:e,ref:A}).catch(r=>r.response);return!t||!("content"in t)?{}:JSON.parse(atob(t.content))},Ov=async()=>{(0,lA.debug)("Starting run");let e=(0,lA.getInput)("base_ref")===""?void 0:(0,lA.getInput)("base_ref"),A=Ms.context.payload.pull_request?.base.ref;!e&&!A&&console.log("No 'base_ref' provided and not a pull request. Skipping.");let t=[],s=await(await(0,Rm.create)((0,lA.getInput)("files"))).glob();(0,lA.debug)(`Files to compare: ${s.join(", ")}`);for(let n of s){let i=km.default.relative(process.cwd(),n);(0,lA.debug)(`Comparing ${i}`);let a=await Jv(i,e??A),c=JSON.parse(await(0,bm.readFile)(n,"utf8")),g=wm({before:a,after:c});t.push({path:i,diff:g})}(0,lA.debug)(`Results: ${JSON.stringify(t)}`);let o=Dm(xv,t);(0,lA.debug)(`Report: ${o}`),(0,lA.setOutput)("report",o)};Ov(); /*! Bundled license information: undici/lib/fetch/body.js: diff --git a/src/lib.ts b/src/lib.ts index 5501ffc..2c26c71 100644 --- a/src/lib.ts +++ b/src/lib.ts @@ -85,7 +85,7 @@ export const formatDiffMd = ( const hr = "| --- | ---: |"; const br = ""; - const changedLinesHeader: string[] = [`### ♻️ ${heading}`, th, hr]; + const changedLinesHeader: string[] = [th, hr]; let changedLines: string[] = []; const unchangedLinesHeader: string[] = [ br, @@ -131,5 +131,10 @@ export const formatDiffMd = ( unchangedLines = [...unchangedLinesHeader, ...unchangedLines, ""]; } - return changedLines.concat(unchangedLines).join("\n"); + let lines = changedLines.concat(unchangedLines) + if (lines.length === 0) { + lines = ["Seems like you are not measuring gas of any operations yet. 🤔", "Consider adding some [snapshot tests](https://book.getfoundry.sh/forge/gas-section-snapshots?highlight=snapshot#snapshotgas-cheatcodes) to measure regressions & improvements."]; + } + + return [`### ♻️ ${heading}`, lines.join("\n")]; };