From 35c1ace2bc68be1356dc6565a8a05ff02e33d75d Mon Sep 17 00:00:00 2001 From: Damien Retzinger Date: Sun, 17 May 2026 19:01:11 -0400 Subject: [PATCH] feat(resolve-check-config): defined required integration test services required (#269) --- resolve-check-config/dist/index.js | 2 +- .../src/kinds/extension.spec.ts | 59 +++++++++++++++---- resolve-check-config/src/kinds/extension.ts | 5 +- 3 files changed, 52 insertions(+), 14 deletions(-) diff --git a/resolve-check-config/dist/index.js b/resolve-check-config/dist/index.js index 95cc04a..522cc3b 100644 --- a/resolve-check-config/dist/index.js +++ b/resolve-check-config/dist/index.js @@ -58,7 +58,7 @@ ${e.format(t)} Error Message: ${n.message}`)})).result)===null||t===void 0?void 0:t.value;if(!i)throw new Error("Response json body do not have ID Token field");return i})}static getIDToken(e){return el(this,void 0,void 0,function*(){try{let t=A.getIDTokenUrl();if(e){let s=encodeURIComponent(e);t=`${t}&audience=${s}`}(0,tl.debug)(`ID token url is ${t}`);let r=yield A.getCall(t);return(0,tl.setSecret)(r),r}catch(t){throw new Error(`Error message: ${t.message}`)}})}};kr.OidcClient=JE});var VE=I(TA=>{"use strict";var TE=TA&&TA.__awaiter||function(A,e,t,r){function s(i){return i instanceof t?i:new t(function(n){n(i)})}return new(t||(t=Promise))(function(i,n){function o(Q){try{E(r.next(Q))}catch(a){n(a)}}function g(Q){try{E(r.throw(Q))}catch(a){n(a)}}function E(Q){Q.done?i(Q.value):s(Q.value).then(o,g)}E((r=r.apply(A,e||[])).next())})};Object.defineProperty(TA,"__esModule",{value:!0});TA.summary=TA.markdownSummary=TA.SUMMARY_DOCS_URL=TA.SUMMARY_ENV_VAR=void 0;var NN=require("os"),vE=require("fs"),{access:bN,appendFile:mN,writeFile:SN}=vE.promises;TA.SUMMARY_ENV_VAR="GITHUB_STEP_SUMMARY";TA.SUMMARY_DOCS_URL="https://docs.github.com/actions/using-workflows/workflow-commands-for-github-actions#adding-a-job-summary";var HE=class{constructor(){this._buffer=""}filePath(){return TE(this,void 0,void 0,function*(){if(this._filePath)return this._filePath;let e=process.env[TA.SUMMARY_ENV_VAR];if(!e)throw new Error(`Unable to find environment variable for $${TA.SUMMARY_ENV_VAR}. Check if your runtime environment supports job summaries.`);try{yield bN(e,vE.constants.R_OK|vE.constants.W_OK)}catch{throw new Error(`Unable to access summary file: '${e}'. Check if the file has correct read/write permissions.`)}return this._filePath=e,this._filePath})}wrap(e,t,r={}){let s=Object.entries(r).map(([i,n])=>` ${i}="${n}"`).join("");return t?`<${e}${s}>${t}`:`<${e}${s}>`}write(e){return TE(this,void 0,void 0,function*(){let t=!!e?.overwrite,r=yield this.filePath();return yield(t?SN:mN)(r,this._buffer,{encoding:"utf8"}),this.emptyBuffer()})}clear(){return TE(this,void 0,void 0,function*(){return this.emptyBuffer().write({overwrite:!0})})}stringify(){return this._buffer}isEmptyBuffer(){return this._buffer.length===0}emptyBuffer(){return this._buffer="",this}addRaw(e,t=!1){return this._buffer+=e,t?this.addEOL():this}addEOL(){return this.addRaw(NN.EOL)}addCodeBlock(e,t){let r=Object.assign({},t&&{lang:t}),s=this.wrap("pre",this.wrap("code",e),r);return this.addRaw(s).addEOL()}addList(e,t=!1){let r=t?"ol":"ul",s=e.map(n=>this.wrap("li",n)).join(""),i=this.wrap(r,s);return this.addRaw(i).addEOL()}addTable(e){let t=e.map(s=>{let i=s.map(n=>{if(typeof n=="string")return this.wrap("td",n);let{header:o,data:g,colspan:E,rowspan:Q}=n,a=o?"th":"td",B=Object.assign(Object.assign({},E&&{colspan:E}),Q&&{rowspan:Q});return this.wrap(a,g,B)}).join("");return this.wrap("tr",i)}).join(""),r=this.wrap("table",t);return this.addRaw(r).addEOL()}addDetails(e,t){let r=this.wrap("details",this.wrap("summary",e)+t);return this.addRaw(r).addEOL()}addImage(e,t,r){let{width:s,height:i}=r||{},n=Object.assign(Object.assign({},s&&{width:s}),i&&{height:i}),o=this.wrap("img",null,Object.assign({src:e,alt:t},n));return this.addRaw(o).addEOL()}addHeading(e,t){let r=`h${t}`,s=["h1","h2","h3","h4","h5","h6"].includes(r)?r:"h1",i=this.wrap(s,e);return this.addRaw(i).addEOL()}addSeparator(){let e=this.wrap("hr",null);return this.addRaw(e).addEOL()}addBreak(){let e=this.wrap("br",null);return this.addRaw(e).addEOL()}addQuote(e,t){let r=Object.assign({},t&&{cite:t}),s=this.wrap("blockquote",e,r);return this.addRaw(s).addEOL()}addLink(e,t){let r=this.wrap("a",e,{href:t});return this.addRaw(r).addEOL()}},sl=new HE;TA.markdownSummary=sl;TA.summary=sl});var il=I(vA=>{"use strict";var UN=vA&&vA.__createBinding||(Object.create?(function(A,e,t,r){r===void 0&&(r=t);var s=Object.getOwnPropertyDescriptor(e,t);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[t]}}),Object.defineProperty(A,r,s)}):(function(A,e,t,r){r===void 0&&(r=t),A[r]=e[t]})),LN=vA&&vA.__setModuleDefault||(Object.create?(function(A,e){Object.defineProperty(A,"default",{enumerable:!0,value:e})}):function(A,e){A.default=e}),MN=vA&&vA.__importStar||function(A){if(A&&A.__esModule)return A;var e={};if(A!=null)for(var t in A)t!=="default"&&Object.prototype.hasOwnProperty.call(A,t)&&UN(e,A,t);return LN(e,A),e};Object.defineProperty(vA,"__esModule",{value:!0});vA.toPlatformPath=vA.toWin32Path=vA.toPosixPath=void 0;var YN=MN(require("path"));function xN(A){return A.replace(/[\\]/g,"/")}vA.toPosixPath=xN;function JN(A){return A.replace(/[/]/g,"\\")}vA.toWin32Path=JN;function GN(A){return A.replace(/[/\\]/g,YN.sep)}vA.toPlatformPath=GN});var OE=I(D=>{"use strict";var TN=D&&D.__createBinding||(Object.create?(function(A,e,t,r){r===void 0&&(r=t),Object.defineProperty(A,r,{enumerable:!0,get:function(){return e[t]}})}):(function(A,e,t,r){r===void 0&&(r=t),A[r]=e[t]})),vN=D&&D.__setModuleDefault||(Object.create?(function(A,e){Object.defineProperty(A,"default",{enumerable:!0,value:e})}):function(A,e){A.default=e}),ol=D&&D.__importStar||function(A){if(A&&A.__esModule)return A;var e={};if(A!=null)for(var t in A)t!=="default"&&Object.hasOwnProperty.call(A,t)&&TN(e,A,t);return vN(e,A),e},qE=D&&D.__awaiter||function(A,e,t,r){function s(i){return i instanceof t?i:new t(function(n){n(i)})}return new(t||(t=Promise))(function(i,n){function o(Q){try{E(r.next(Q))}catch(a){n(a)}}function g(Q){try{E(r.throw(Q))}catch(a){n(a)}}function E(Q){Q.done?i(Q.value):s(Q.value).then(o,g)}E((r=r.apply(A,e||[])).next())})},HA;Object.defineProperty(D,"__esModule",{value:!0});D.getCmdPath=D.tryGetExecutablePath=D.isRooted=D.isDirectory=D.exists=D.READONLY=D.UV_FS_O_EXLOCK=D.IS_WINDOWS=D.unlink=D.symlink=D.stat=D.rmdir=D.rm=D.rename=D.readlink=D.readdir=D.open=D.mkdir=D.lstat=D.copyFile=D.chmod=void 0;var gl=ol(require("fs")),hn=ol(require("path"));HA=gl.promises,D.chmod=HA.chmod,D.copyFile=HA.copyFile,D.lstat=HA.lstat,D.mkdir=HA.mkdir,D.open=HA.open,D.readdir=HA.readdir,D.readlink=HA.readlink,D.rename=HA.rename,D.rm=HA.rm,D.rmdir=HA.rmdir,D.stat=HA.stat,D.symlink=HA.symlink,D.unlink=HA.unlink;D.IS_WINDOWS=process.platform==="win32";D.UV_FS_O_EXLOCK=268435456;D.READONLY=gl.constants.O_RDONLY;function HN(A){return qE(this,void 0,void 0,function*(){try{yield D.stat(A)}catch(e){if(e.code==="ENOENT")return!1;throw e}return!0})}D.exists=HN;function VN(A,e=!1){return qE(this,void 0,void 0,function*(){return(e?yield D.stat(A):yield D.lstat(A)).isDirectory()})}D.isDirectory=VN;function qN(A){if(A=WN(A),!A)throw new Error('isRooted() parameter "p" cannot be empty');return D.IS_WINDOWS?A.startsWith("\\")||/^[A-Z]:/i.test(A):A.startsWith("/")}D.isRooted=qN;function ON(A,e){return qE(this,void 0,void 0,function*(){let t;try{t=yield D.stat(A)}catch(s){s.code!=="ENOENT"&&console.log(`Unexpected error attempting to determine if executable file exists '${A}': ${s}`)}if(t&&t.isFile()){if(D.IS_WINDOWS){let s=hn.extname(A).toUpperCase();if(e.some(i=>i.toUpperCase()===s))return A}else if(nl(t))return A}let r=A;for(let s of e){A=r+s,t=void 0;try{t=yield D.stat(A)}catch(i){i.code!=="ENOENT"&&console.log(`Unexpected error attempting to determine if executable file exists '${A}': ${i}`)}if(t&&t.isFile()){if(D.IS_WINDOWS){try{let i=hn.dirname(A),n=hn.basename(A).toUpperCase();for(let o of yield D.readdir(i))if(n===o.toUpperCase()){A=hn.join(i,o);break}}catch(i){console.log(`Unexpected error attempting to determine the actual case of the file '${A}': ${i}`)}return A}else if(nl(t))return A}}return""})}D.tryGetExecutablePath=ON;function WN(A){return A=A||"",D.IS_WINDOWS?(A=A.replace(/\//g,"\\"),A.replace(/\\\\+/g,"\\")):A.replace(/\/\/+/g,"/")}function nl(A){return(A.mode&1)>0||(A.mode&8)>0&&A.gid===process.getgid()||(A.mode&64)>0&&A.uid===process.getuid()}function PN(){var A;return(A=process.env.COMSPEC)!==null&&A!==void 0?A:"cmd.exe"}D.getCmdPath=PN});var Il=I(sA=>{"use strict";var _N=sA&&sA.__createBinding||(Object.create?(function(A,e,t,r){r===void 0&&(r=t),Object.defineProperty(A,r,{enumerable:!0,get:function(){return e[t]}})}):(function(A,e,t,r){r===void 0&&(r=t),A[r]=e[t]})),ZN=sA&&sA.__setModuleDefault||(Object.create?(function(A,e){Object.defineProperty(A,"default",{enumerable:!0,value:e})}):function(A,e){A.default=e}),El=sA&&sA.__importStar||function(A){if(A&&A.__esModule)return A;var e={};if(A!=null)for(var t in A)t!=="default"&&Object.hasOwnProperty.call(A,t)&&_N(e,A,t);return ZN(e,A),e},Bt=sA&&sA.__awaiter||function(A,e,t,r){function s(i){return i instanceof t?i:new t(function(n){n(i)})}return new(t||(t=Promise))(function(i,n){function o(Q){try{E(r.next(Q))}catch(a){n(a)}}function g(Q){try{E(r.throw(Q))}catch(a){n(a)}}function E(Q){Q.done?i(Q.value):s(Q.value).then(o,g)}E((r=r.apply(A,e||[])).next())})};Object.defineProperty(sA,"__esModule",{value:!0});sA.findInPath=sA.which=sA.mkdirP=sA.rmRF=sA.mv=sA.cp=void 0;var XN=require("assert"),Ye=El(require("path")),V=El(OE());function KN(A,e,t={}){return Bt(this,void 0,void 0,function*(){let{force:r,recursive:s,copySourceDirectory:i}=zN(t),n=(yield V.exists(e))?yield V.stat(e):null;if(n&&n.isFile()&&!r)return;let o=n&&n.isDirectory()&&i?Ye.join(e,Ye.basename(A)):e;if(!(yield V.exists(A)))throw new Error(`no such file or directory: ${A}`);if((yield V.stat(A)).isDirectory())if(s)yield Cl(A,o,0,r);else throw new Error(`Failed to copy. ${A} is a directory, but tried to copy without recursive flag.`);else{if(Ye.relative(A,o)==="")throw new Error(`'${o}' and '${A}' are the same file`);yield cl(A,o,r)}})}sA.cp=KN;function jN(A,e,t={}){return Bt(this,void 0,void 0,function*(){if(yield V.exists(e)){let r=!0;if((yield V.isDirectory(e))&&(e=Ye.join(e,Ye.basename(A)),r=yield V.exists(e)),r)if(t.force==null||t.force)yield Ql(e);else throw new Error("Destination already exists")}yield WE(Ye.dirname(e)),yield V.rename(A,e)})}sA.mv=jN;function Ql(A){return Bt(this,void 0,void 0,function*(){if(V.IS_WINDOWS&&/[*"<>|]/.test(A))throw new Error('File path must not contain `*`, `"`, `<`, `>` or `|` on Windows');try{yield V.rm(A,{force:!0,maxRetries:3,recursive:!0,retryDelay:300})}catch(e){throw new Error(`File was unable to be removed ${e}`)}})}sA.rmRF=Ql;function WE(A){return Bt(this,void 0,void 0,function*(){XN.ok(A,"a path argument must be provided"),yield V.mkdir(A,{recursive:!0})})}sA.mkdirP=WE;function al(A,e){return Bt(this,void 0,void 0,function*(){if(!A)throw new Error("parameter 'tool' is required");if(e){let r=yield al(A,!1);if(!r)throw V.IS_WINDOWS?new Error(`Unable to locate executable file: ${A}. Please verify either the file path exists or the file can be found within a directory specified by the PATH environment variable. Also verify the file has a valid extension for an executable file.`):new Error(`Unable to locate executable file: ${A}. Please verify either the file path exists or the file can be found within a directory specified by the PATH environment variable. Also check the file mode to verify the file is executable.`);return r}let t=yield Bl(A);return t&&t.length>0?t[0]:""})}sA.which=al;function Bl(A){return Bt(this,void 0,void 0,function*(){if(!A)throw new Error("parameter 'tool' is required");let e=[];if(V.IS_WINDOWS&&process.env.PATHEXT)for(let s of process.env.PATHEXT.split(Ye.delimiter))s&&e.push(s);if(V.isRooted(A)){let s=yield V.tryGetExecutablePath(A,e);return s?[s]:[]}if(A.includes(Ye.sep))return[];let t=[];if(process.env.PATH)for(let s of process.env.PATH.split(Ye.delimiter))s&&t.push(s);let r=[];for(let s of t){let i=yield V.tryGetExecutablePath(Ye.join(s,A),e);i&&r.push(i)}return r})}sA.findInPath=Bl;function zN(A){let e=A.force==null?!0:A.force,t=!!A.recursive,r=A.copySourceDirectory==null?!0:!!A.copySourceDirectory;return{force:e,recursive:t,copySourceDirectory:r}}function Cl(A,e,t,r){return Bt(this,void 0,void 0,function*(){if(t>=255)return;t++,yield WE(e);let s=yield V.readdir(A);for(let i of s){let n=`${A}/${i}`,o=`${e}/${i}`;(yield V.lstat(n)).isDirectory()?yield Cl(n,o,t,r):yield cl(n,o,r)}yield V.chmod(e,(yield V.stat(A)).mode)})}function cl(A,e,t){return Bt(this,void 0,void 0,function*(){if((yield V.lstat(A)).isSymbolicLink()){try{yield V.lstat(e),yield V.unlink(e)}catch(s){s.code==="EPERM"&&(yield V.chmod(e,"0666"),yield V.unlink(e))}let r=yield V.readlink(A);yield V.symlink(r,e,V.IS_WINDOWS?"junction":null)}else(!(yield V.exists(e))||t)&&(yield V.copyFile(A,e))})}});var dl=I(VA=>{"use strict";var $N=VA&&VA.__createBinding||(Object.create?(function(A,e,t,r){r===void 0&&(r=t),Object.defineProperty(A,r,{enumerable:!0,get:function(){return e[t]}})}):(function(A,e,t,r){r===void 0&&(r=t),A[r]=e[t]})),Ab=VA&&VA.__setModuleDefault||(Object.create?(function(A,e){Object.defineProperty(A,"default",{enumerable:!0,value:e})}):function(A,e){A.default=e}),Fr=VA&&VA.__importStar||function(A){if(A&&A.__esModule)return A;var e={};if(A!=null)for(var t in A)t!=="default"&&Object.hasOwnProperty.call(A,t)&&$N(e,A,t);return Ab(e,A),e},hl=VA&&VA.__awaiter||function(A,e,t,r){function s(i){return i instanceof t?i:new t(function(n){n(i)})}return new(t||(t=Promise))(function(i,n){function o(Q){try{E(r.next(Q))}catch(a){n(a)}}function g(Q){try{E(r.throw(Q))}catch(a){n(a)}}function E(Q){Q.done?i(Q.value):s(Q.value).then(o,g)}E((r=r.apply(A,e||[])).next())})};Object.defineProperty(VA,"__esModule",{value:!0});VA.argStringToArray=VA.ToolRunner=void 0;var ln=Fr(require("os")),ul=Fr(require("events")),eb=Fr(require("child_process")),tb=Fr(require("path")),rb=Fr(Il()),ll=Fr(OE()),sb=require("timers"),un=process.platform==="win32",PE=class extends ul.EventEmitter{constructor(e,t,r){if(super(),!e)throw new Error("Parameter 'toolPath' cannot be null or empty.");this.toolPath=e,this.args=t||[],this.options=r||{}}_debug(e){this.options.listeners&&this.options.listeners.debug&&this.options.listeners.debug(e)}_getCommandString(e,t){let r=this._getSpawnFileName(),s=this._getSpawnArgs(e),i=t?"":"[command]";if(un)if(this._isCmdFile()){i+=r;for(let n of s)i+=` ${n}`}else if(e.windowsVerbatimArguments){i+=`"${r}"`;for(let n of s)i+=` ${n}`}else{i+=this._windowsQuoteCmdArg(r);for(let n of s)i+=` ${this._windowsQuoteCmdArg(n)}`}else{i+=r;for(let n of s)i+=` ${n}`}return i}_processLineBuffer(e,t,r){try{let s=t+e.toString(),i=s.indexOf(ln.EOL);for(;i>-1;){let n=s.substring(0,i);r(n),s=s.substring(i+ln.EOL.length),i=s.indexOf(ln.EOL)}return s}catch(s){return this._debug(`error processing line. Failed with error ${s}`),""}}_getSpawnFileName(){return un&&this._isCmdFile()?process.env.COMSPEC||"cmd.exe":this.toolPath}_getSpawnArgs(e){if(un&&this._isCmdFile()){let t=`/D /S /C "${this._windowsQuoteCmdArg(this.toolPath)}`;for(let r of this.args)t+=" ",t+=e.windowsVerbatimArguments?r:this._windowsQuoteCmdArg(r);return t+='"',[t]}return this.args}_endsWith(e,t){return e.endsWith(t)}_isCmdFile(){let e=this.toolPath.toUpperCase();return this._endsWith(e,".CMD")||this._endsWith(e,".BAT")}_windowsQuoteCmdArg(e){if(!this._isCmdFile())return this._uvQuoteCmdArg(e);if(!e)return'""';let t=[" "," ","&","(",")","[","]","{","}","^","=",";","!","'","+",",","`","~","|","<",">",'"'],r=!1;for(let n of e)if(t.some(o=>o===n)){r=!0;break}if(!r)return e;let s='"',i=!0;for(let n=e.length;n>0;n--)s+=e[n-1],i&&e[n-1]==="\\"?s+="\\":e[n-1]==='"'?(i=!0,s+='"'):i=!1;return s+='"',s.split("").reverse().join("")}_uvQuoteCmdArg(e){if(!e)return'""';if(!e.includes(" ")&&!e.includes(" ")&&!e.includes('"'))return e;if(!e.includes('"')&&!e.includes("\\"))return`"${e}"`;let t='"',r=!0;for(let s=e.length;s>0;s--)t+=e[s-1],r&&e[s-1]==="\\"?t+="\\":e[s-1]==='"'?(r=!0,t+="\\"):r=!1;return t+='"',t.split("").reverse().join("")}_cloneExecOptions(e){e=e||{};let t={cwd:e.cwd||process.cwd(),env:e.env||process.env,silent:e.silent||!1,windowsVerbatimArguments:e.windowsVerbatimArguments||!1,failOnStdErr:e.failOnStdErr||!1,ignoreReturnCode:e.ignoreReturnCode||!1,delay:e.delay||1e4};return t.outStream=e.outStream||process.stdout,t.errStream=e.errStream||process.stderr,t}_getSpawnOptions(e,t){e=e||{};let r={};return r.cwd=e.cwd,r.env=e.env,r.windowsVerbatimArguments=e.windowsVerbatimArguments||this._isCmdFile(),e.windowsVerbatimArguments&&(r.argv0=`"${t}"`),r}exec(){return hl(this,void 0,void 0,function*(){return!ll.isRooted(this.toolPath)&&(this.toolPath.includes("/")||un&&this.toolPath.includes("\\"))&&(this.toolPath=tb.resolve(process.cwd(),this.options.cwd||process.cwd(),this.toolPath)),this.toolPath=yield rb.which(this.toolPath,!0),new Promise((e,t)=>hl(this,void 0,void 0,function*(){this._debug(`exec tool: ${this.toolPath}`),this._debug("arguments:");for(let E of this.args)this._debug(` ${E}`);let r=this._cloneExecOptions(this.options);!r.silent&&r.outStream&&r.outStream.write(this._getCommandString(r)+ln.EOL);let s=new _E(r,this.toolPath);if(s.on("debug",E=>{this._debug(E)}),this.options.cwd&&!(yield ll.exists(this.options.cwd)))return t(new Error(`The cwd: ${this.options.cwd} does not exist!`));let i=this._getSpawnFileName(),n=eb.spawn(i,this._getSpawnArgs(r),this._getSpawnOptions(this.options,i)),o="";n.stdout&&n.stdout.on("data",E=>{this.options.listeners&&this.options.listeners.stdout&&this.options.listeners.stdout(E),!r.silent&&r.outStream&&r.outStream.write(E),o=this._processLineBuffer(E,o,Q=>{this.options.listeners&&this.options.listeners.stdline&&this.options.listeners.stdline(Q)})});let g="";if(n.stderr&&n.stderr.on("data",E=>{s.processStderr=!0,this.options.listeners&&this.options.listeners.stderr&&this.options.listeners.stderr(E),!r.silent&&r.errStream&&r.outStream&&(r.failOnStdErr?r.errStream:r.outStream).write(E),g=this._processLineBuffer(E,g,Q=>{this.options.listeners&&this.options.listeners.errline&&this.options.listeners.errline(Q)})}),n.on("error",E=>{s.processError=E.message,s.processExited=!0,s.processClosed=!0,s.CheckComplete()}),n.on("exit",E=>{s.processExitCode=E,s.processExited=!0,this._debug(`Exit code ${E} received from tool '${this.toolPath}'`),s.CheckComplete()}),n.on("close",E=>{s.processExitCode=E,s.processExited=!0,s.processClosed=!0,this._debug(`STDIO streams have closed for tool '${this.toolPath}'`),s.CheckComplete()}),s.on("done",(E,Q)=>{o.length>0&&this.emit("stdline",o),g.length>0&&this.emit("errline",g),n.removeAllListeners(),E?t(E):e(Q)}),this.options.input){if(!n.stdin)throw new Error("child process missing stdin");n.stdin.end(this.options.input)}}))})}};VA.ToolRunner=PE;function ib(A){let e=[],t=!1,r=!1,s="";function i(n){r&&n!=='"'&&(s+="\\"),s+=n,r=!1}for(let n=0;n0&&(e.push(s),s="");continue}i(o)}return s.length>0&&e.push(s.trim()),e}VA.argStringToArray=ib;var _E=class A extends ul.EventEmitter{constructor(e,t){if(super(),this.processClosed=!1,this.processError="",this.processExitCode=0,this.processExited=!1,this.processStderr=!1,this.delay=1e4,this.done=!1,this.timeout=null,!t)throw new Error("toolPath must not be empty");this.options=e,this.toolPath=t,e.delay&&(this.delay=e.delay)}CheckComplete(){this.done||(this.processClosed?this._setResult():this.processExited&&(this.timeout=sb.setTimeout(A.HandleTimeout,this.delay,this)))}_debug(e){this.emit("debug",e)}_setResult(){let e;this.processExited&&(this.processError?e=new Error(`There was an error when attempting to execute the process '${this.toolPath}'. This may indicate the process failed to start. Error: ${this.processError}`):this.processExitCode!==0&&!this.options.ignoreReturnCode?e=new Error(`The process '${this.toolPath}' failed with exit code ${this.processExitCode}`):this.processStderr&&this.options.failOnStdErr&&(e=new Error(`The process '${this.toolPath}' failed because one or more lines were written to the STDERR stream`))),this.timeout&&(clearTimeout(this.timeout),this.timeout=null),this.done=!0,this.emit("done",e,this.processExitCode)}static HandleTimeout(e){if(!e.done){if(!e.processClosed&&e.processExited){let t=`The STDIO streams did not close within ${e.delay/1e3} seconds of the exit event from process '${e.toolPath}'. This may indicate a child process inherited the STDIO streams and has not yet exited.`;e._debug(t)}e._setResult()}}}});var pl=I(qA=>{"use strict";var nb=qA&&qA.__createBinding||(Object.create?(function(A,e,t,r){r===void 0&&(r=t),Object.defineProperty(A,r,{enumerable:!0,get:function(){return e[t]}})}):(function(A,e,t,r){r===void 0&&(r=t),A[r]=e[t]})),ob=qA&&qA.__setModuleDefault||(Object.create?(function(A,e){Object.defineProperty(A,"default",{enumerable:!0,value:e})}):function(A,e){A.default=e}),gb=qA&&qA.__importStar||function(A){if(A&&A.__esModule)return A;var e={};if(A!=null)for(var t in A)t!=="default"&&Object.hasOwnProperty.call(A,t)&&nb(e,A,t);return ob(e,A),e},wl=qA&&qA.__awaiter||function(A,e,t,r){function s(i){return i instanceof t?i:new t(function(n){n(i)})}return new(t||(t=Promise))(function(i,n){function o(Q){try{E(r.next(Q))}catch(a){n(a)}}function g(Q){try{E(r.throw(Q))}catch(a){n(a)}}function E(Q){Q.done?i(Q.value):s(Q.value).then(o,g)}E((r=r.apply(A,e||[])).next())})};Object.defineProperty(qA,"__esModule",{value:!0});qA.getExecOutput=qA.exec=void 0;var fl=require("string_decoder"),yl=gb(dl());function Dl(A,e,t){return wl(this,void 0,void 0,function*(){let r=yl.argStringToArray(A);if(r.length===0)throw new Error("Parameter 'commandLine' cannot be null or empty.");let s=r[0];return e=r.slice(1).concat(e||[]),new yl.ToolRunner(s,e,t).exec()})}qA.exec=Dl;function Eb(A,e,t){var r,s;return wl(this,void 0,void 0,function*(){let i="",n="",o=new fl.StringDecoder("utf8"),g=new fl.StringDecoder("utf8"),E=(r=t?.listeners)===null||r===void 0?void 0:r.stdout,Q=(s=t?.listeners)===null||s===void 0?void 0:s.stderr,a=u=>{n+=g.write(u),Q&&Q(u)},B=u=>{i+=o.write(u),E&&E(u)},c=Object.assign(Object.assign({},t?.listeners),{stdout:B,stderr:a}),C=yield Dl(A,e,Object.assign(Object.assign({},t),{listeners:c}));return i+=o.end(),n+=g.end(),{exitCode:C,stdout:i,stderr:n}})}qA.getExecOutput=Eb});var kl=I(G=>{"use strict";var Qb=G&&G.__createBinding||(Object.create?(function(A,e,t,r){r===void 0&&(r=t);var s=Object.getOwnPropertyDescriptor(e,t);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[t]}}),Object.defineProperty(A,r,s)}):(function(A,e,t,r){r===void 0&&(r=t),A[r]=e[t]})),ab=G&&G.__setModuleDefault||(Object.create?(function(A,e){Object.defineProperty(A,"default",{enumerable:!0,value:e})}):function(A,e){A.default=e}),Bb=G&&G.__importStar||function(A){if(A&&A.__esModule)return A;var e={};if(A!=null)for(var t in A)t!=="default"&&Object.prototype.hasOwnProperty.call(A,t)&&Qb(e,A,t);return ab(e,A),e},fn=G&&G.__awaiter||function(A,e,t,r){function s(i){return i instanceof t?i:new t(function(n){n(i)})}return new(t||(t=Promise))(function(i,n){function o(Q){try{E(r.next(Q))}catch(a){n(a)}}function g(Q){try{E(r.throw(Q))}catch(a){n(a)}}function E(Q){Q.done?i(Q.value):s(Q.value).then(o,g)}E((r=r.apply(A,e||[])).next())})},Cb=G&&G.__importDefault||function(A){return A&&A.__esModule?A:{default:A}};Object.defineProperty(G,"__esModule",{value:!0});G.getDetails=G.isLinux=G.isMacOS=G.isWindows=G.arch=G.platform=void 0;var Rl=Cb(require("os")),dn=Bb(pl()),cb=()=>fn(void 0,void 0,void 0,function*(){let{stdout:A}=yield dn.getExecOutput('powershell -command "(Get-CimInstance -ClassName Win32_OperatingSystem).Version"',void 0,{silent:!0}),{stdout:e}=yield dn.getExecOutput('powershell -command "(Get-CimInstance -ClassName Win32_OperatingSystem).Caption"',void 0,{silent:!0});return{name:e.trim(),version:A.trim()}}),Ib=()=>fn(void 0,void 0,void 0,function*(){var A,e,t,r;let{stdout:s}=yield dn.getExecOutput("sw_vers",void 0,{silent:!0}),i=(e=(A=s.match(/ProductVersion:\s*(.+)/))===null||A===void 0?void 0:A[1])!==null&&e!==void 0?e:"";return{name:(r=(t=s.match(/ProductName:\s*(.+)/))===null||t===void 0?void 0:t[1])!==null&&r!==void 0?r:"",version:i}}),hb=()=>fn(void 0,void 0,void 0,function*(){let{stdout:A}=yield dn.getExecOutput("lsb_release",["-i","-r","-s"],{silent:!0}),[e,t]=A.trim().split(` `);return{name:e,version:t}});G.platform=Rl.default.platform();G.arch=Rl.default.arch();G.isWindows=G.platform==="win32";G.isMacOS=G.platform==="darwin";G.isLinux=G.platform==="linux";function lb(){return fn(this,void 0,void 0,function*(){return Object.assign(Object.assign({},yield G.isWindows?cb():G.isMacOS?Ib():hb()),{platform:G.platform,arch:G.arch,isWindows:G.isWindows,isMacOS:G.isMacOS,isLinux:G.isLinux})})}G.getDetails=lb});var GE=I(w=>{"use strict";var ub=w&&w.__createBinding||(Object.create?(function(A,e,t,r){r===void 0&&(r=t);var s=Object.getOwnPropertyDescriptor(e,t);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[t]}}),Object.defineProperty(A,r,s)}):(function(A,e,t,r){r===void 0&&(r=t),A[r]=e[t]})),db=w&&w.__setModuleDefault||(Object.create?(function(A,e){Object.defineProperty(A,"default",{enumerable:!0,value:e})}):function(A,e){A.default=e}),XE=w&&w.__importStar||function(A){if(A&&A.__esModule)return A;var e={};if(A!=null)for(var t in A)t!=="default"&&Object.prototype.hasOwnProperty.call(A,t)&&ub(e,A,t);return db(e,A),e},Fl=w&&w.__awaiter||function(A,e,t,r){function s(i){return i instanceof t?i:new t(function(n){n(i)})}return new(t||(t=Promise))(function(i,n){function o(Q){try{E(r.next(Q))}catch(a){n(a)}}function g(Q){try{E(r.throw(Q))}catch(a){n(a)}}function E(Q){Q.done?i(Q.value):s(Q.value).then(o,g)}E((r=r.apply(A,e||[])).next())})};Object.defineProperty(w,"__esModule",{value:!0});w.platform=w.toPlatformPath=w.toWin32Path=w.toPosixPath=w.markdownSummary=w.summary=w.getIDToken=w.getState=w.saveState=w.group=w.endGroup=w.startGroup=w.info=w.notice=w.warning=w.error=w.debug=w.isDebug=w.setFailed=w.setCommandEcho=w.setOutput=w.getBooleanInput=w.getMultilineInput=w.getInput=w.addPath=w.setSecret=w.exportVariable=w.ExitCode=void 0;var Ce=tQ(),Lt=iQ(),Nr=ys(),Nl=XE(require("os")),fb=XE(require("path")),yb=rl(),ZE;(function(A){A[A.Success=0]="Success",A[A.Failure=1]="Failure"})(ZE||(w.ExitCode=ZE={}));function wb(A,e){let t=(0,Nr.toCommandValue)(e);if(process.env[A]=t,process.env.GITHUB_ENV||"")return(0,Lt.issueFileCommand)("ENV",(0,Lt.prepareKeyValueMessage)(A,e));(0,Ce.issueCommand)("set-env",{name:A},t)}w.exportVariable=wb;function Db(A){(0,Ce.issueCommand)("add-mask",{},A)}w.setSecret=Db;function pb(A){process.env.GITHUB_PATH||""?(0,Lt.issueFileCommand)("PATH",A):(0,Ce.issueCommand)("add-path",{},A),process.env.PATH=`${A}${fb.delimiter}${process.env.PATH}`}w.addPath=pb;function KE(A,e){let t=process.env[`INPUT_${A.replace(/ /g,"_").toUpperCase()}`]||"";if(e&&e.required&&!t)throw new Error(`Input required and not supplied: ${A}`);return e&&e.trimWhitespace===!1?t:t.trim()}w.getInput=KE;function Rb(A,e){let t=KE(A,e).split(` `).filter(r=>r!=="");return e&&e.trimWhitespace===!1?t:t.map(r=>r.trim())}w.getMultilineInput=Rb;function kb(A,e){let t=["true","True","TRUE"],r=["false","False","FALSE"],s=KE(A,e);if(t.includes(s))return!0;if(r.includes(s))return!1;throw new TypeError(`Input does not meet YAML 1.2 "Core Schema" specification: ${A} -Support boolean input list: \`true | True | TRUE | false | False | FALSE\``)}w.getBooleanInput=kb;function Fb(A,e){if(process.env.GITHUB_OUTPUT||"")return(0,Lt.issueFileCommand)("OUTPUT",(0,Lt.prepareKeyValueMessage)(A,e));process.stdout.write(Nl.EOL),(0,Ce.issueCommand)("set-output",{name:A},(0,Nr.toCommandValue)(e))}w.setOutput=Fb;function Nb(A){(0,Ce.issue)("echo",A?"on":"off")}w.setCommandEcho=Nb;function bb(A){process.exitCode=ZE.Failure,bl(A)}w.setFailed=bb;function mb(){return process.env.RUNNER_DEBUG==="1"}w.isDebug=mb;function Sb(A){(0,Ce.issueCommand)("debug",{},A)}w.debug=Sb;function bl(A,e={}){(0,Ce.issueCommand)("error",(0,Nr.toCommandProperties)(e),A instanceof Error?A.toString():A)}w.error=bl;function Ub(A,e={}){(0,Ce.issueCommand)("warning",(0,Nr.toCommandProperties)(e),A instanceof Error?A.toString():A)}w.warning=Ub;function Lb(A,e={}){(0,Ce.issueCommand)("notice",(0,Nr.toCommandProperties)(e),A instanceof Error?A.toString():A)}w.notice=Lb;function Mb(A){process.stdout.write(A+Nl.EOL)}w.info=Mb;function ml(A){(0,Ce.issue)("group",A)}w.startGroup=ml;function Sl(){(0,Ce.issue)("endgroup")}w.endGroup=Sl;function Yb(A,e){return Fl(this,void 0,void 0,function*(){ml(A);let t;try{t=yield e()}finally{Sl()}return t})}w.group=Yb;function xb(A,e){if(process.env.GITHUB_STATE||"")return(0,Lt.issueFileCommand)("STATE",(0,Lt.prepareKeyValueMessage)(A,e));(0,Ce.issueCommand)("save-state",{name:A},(0,Nr.toCommandValue)(e))}w.saveState=xb;function Jb(A){return process.env[`STATE_${A}`]||""}w.getState=Jb;function Gb(A){return Fl(this,void 0,void 0,function*(){return yield yb.OidcClient.getIDToken(A)})}w.getIDToken=Gb;var Tb=VE();Object.defineProperty(w,"summary",{enumerable:!0,get:function(){return Tb.summary}});var vb=VE();Object.defineProperty(w,"markdownSummary",{enumerable:!0,get:function(){return vb.markdownSummary}});var jE=il();Object.defineProperty(w,"toPosixPath",{enumerable:!0,get:function(){return jE.toPosixPath}});Object.defineProperty(w,"toWin32Path",{enumerable:!0,get:function(){return jE.toWin32Path}});Object.defineProperty(w,"toPlatformPath",{enumerable:!0,get:function(){return jE.toPlatformPath}});w.platform=XE(kl())});var Pb={};jl(Pb,{run:()=>Ol});module.exports=zl(Pb);var fe=Rn(GE()),wn=Rn(require("fs")),ql=Rn(require("path"));var Hb=A=>A==="store"||A==="extension",Ul=A=>{if(!Hb(A))throw new Error(`check-config: \`kind\` must be 'store' or 'extension' (got ${JSON.stringify(A)})`);return A};var Ll={db:["mysql"],search:["opensearch","elasticsearch"],queue:["rabbitmq"],cache:["valkey","redis"],web:["nginx","php-fpm"]},Ml=A=>typeof A=="string"&&A in Ll,Yl=A=>{let e=new Set;for(let t of A)for(let r of Ll[t])e.add(r);return e};var Vb=(A,e,t)=>{if(e===void 0)return{enabled:!0,tiers:t.services};if(typeof e=="boolean")return{enabled:e,tiers:t.services};if(e===null||typeof e!="object"||Array.isArray(e))throw new Error(`check-config: job "${A}" must be a boolean or an object (got ${Array.isArray(e)?"array":typeof e})`);let{enabled:r,services:s}=e,i=r===void 0?!0:!!r;if(s===void 0)return{enabled:i,tiers:t.services};if(!Array.isArray(s))throw new Error(`check-config: job "${A}".services must be an array of tier names`);let n=[];for(let o of s){if(!Ml(o))throw new Error(`check-config: job "${A}".services contains unknown tier "${String(o)}"`);n.push(o)}return{enabled:i,tiers:n}},qb=(A,e)=>{if(!e||e.length===0)return A;let t=new Set,r=[];for(let s of e)t.has(s)||(t.add(s),r.push(s));for(let s of A)t.has(s)||(t.add(s),r.push(s));return r},Ob=(A,e)=>{let t=Yl(e),r=A.services??{},s={};for(let[i,n]of Object.entries(r))t.has(i)&&(s[i]=n);return{...A,services:s}},Wb=(A,e)=>({...A,include:A.include.map(t=>Ob(t,e))}),yn=(A,e,t,r)=>{let s=A.jobs??{};if(s===null||typeof s!="object"||Array.isArray(s))throw new Error("check-config: `jobs` must be an object");for(let n of Object.keys(s))if(!(n in t))throw new Error(`check-config: unknown job "${n}" for kind "${e}". Known jobs: ${Object.keys(t).join(", ")}`);let i={};for(let[n,o]of Object.entries(t)){let g=s[n],{enabled:E,tiers:Q}=Vb(n,g,o),a=qb(Q,o.requiredServices);i[n]={enabled:E,matrix:Wb(r,a)}}return i},xl=A=>{let e=A.trim();if(e==="")return{};let t;try{t=JSON.parse(e)}catch(r){throw new Error(`check-config: failed to parse JSON: ${r.message}`)}if(t===null||typeof t!="object"||Array.isArray(t))throw new Error("check-config: top-level value must be an object");return t},Jl=A=>{let e=A.trim();if(e==="")throw new Error("check-config: `matrix` input is required");let t;try{t=JSON.parse(e)}catch(s){throw new Error(`check-config: failed to parse \`matrix\` input as JSON: ${s.message}`)}if(t===null||typeof t!="object"||Array.isArray(t))throw new Error("check-config: `matrix` must be a JSON object");let r=t.include;if(!Array.isArray(r))throw new Error("check-config: `matrix.include` must be an array");return t};var Gl={"unit-test":{services:[]},"coding-standard":{services:[]},"smoke-test":{services:[],requiredServices:["db","search","queue","cache","web"]}},EU=Object.keys(Gl),Tl=(A,e)=>yn(A,"store",Gl,e);var vl={"unit-test-extension":{services:[]},"compile-extension":{services:[]},"coding-standard":{services:[]},integration_test:{services:[]}},BU=Object.keys(vl),Hl=(A,e)=>yn(A,"extension",vl,e);var Vl=(A,e,t)=>e==="store"?Tl(A,t):Hl(A,t);var Ol=async()=>{try{let A=Ul(fe.getInput("kind",{required:!0})),e=Jl(fe.getInput("matrix",{required:!0})),t=fe.getInput("config_path")||`.github/check-${A}.json`,r=process.env.GITHUB_WORKSPACE||process.cwd(),s=ql.resolve(r,t),i={};if(wn.existsSync(s)){let o=wn.readFileSync(s,"utf-8");i=xl(o),fe.info(`resolve-check-config: read ${s}`)}else fe.info(`resolve-check-config: ${s} not found \u2014 emitting defaults for every known job`);let n=Vl(i,A,e);fe.setOutput("resolved",JSON.stringify(n))}catch(A){fe.setFailed(A.message)}};Ol();0&&(module.exports={run}); +Support boolean input list: \`true | True | TRUE | false | False | FALSE\``)}w.getBooleanInput=kb;function Fb(A,e){if(process.env.GITHUB_OUTPUT||"")return(0,Lt.issueFileCommand)("OUTPUT",(0,Lt.prepareKeyValueMessage)(A,e));process.stdout.write(Nl.EOL),(0,Ce.issueCommand)("set-output",{name:A},(0,Nr.toCommandValue)(e))}w.setOutput=Fb;function Nb(A){(0,Ce.issue)("echo",A?"on":"off")}w.setCommandEcho=Nb;function bb(A){process.exitCode=ZE.Failure,bl(A)}w.setFailed=bb;function mb(){return process.env.RUNNER_DEBUG==="1"}w.isDebug=mb;function Sb(A){(0,Ce.issueCommand)("debug",{},A)}w.debug=Sb;function bl(A,e={}){(0,Ce.issueCommand)("error",(0,Nr.toCommandProperties)(e),A instanceof Error?A.toString():A)}w.error=bl;function Ub(A,e={}){(0,Ce.issueCommand)("warning",(0,Nr.toCommandProperties)(e),A instanceof Error?A.toString():A)}w.warning=Ub;function Lb(A,e={}){(0,Ce.issueCommand)("notice",(0,Nr.toCommandProperties)(e),A instanceof Error?A.toString():A)}w.notice=Lb;function Mb(A){process.stdout.write(A+Nl.EOL)}w.info=Mb;function ml(A){(0,Ce.issue)("group",A)}w.startGroup=ml;function Sl(){(0,Ce.issue)("endgroup")}w.endGroup=Sl;function Yb(A,e){return Fl(this,void 0,void 0,function*(){ml(A);let t;try{t=yield e()}finally{Sl()}return t})}w.group=Yb;function xb(A,e){if(process.env.GITHUB_STATE||"")return(0,Lt.issueFileCommand)("STATE",(0,Lt.prepareKeyValueMessage)(A,e));(0,Ce.issueCommand)("save-state",{name:A},(0,Nr.toCommandValue)(e))}w.saveState=xb;function Jb(A){return process.env[`STATE_${A}`]||""}w.getState=Jb;function Gb(A){return Fl(this,void 0,void 0,function*(){return yield yb.OidcClient.getIDToken(A)})}w.getIDToken=Gb;var Tb=VE();Object.defineProperty(w,"summary",{enumerable:!0,get:function(){return Tb.summary}});var vb=VE();Object.defineProperty(w,"markdownSummary",{enumerable:!0,get:function(){return vb.markdownSummary}});var jE=il();Object.defineProperty(w,"toPosixPath",{enumerable:!0,get:function(){return jE.toPosixPath}});Object.defineProperty(w,"toWin32Path",{enumerable:!0,get:function(){return jE.toWin32Path}});Object.defineProperty(w,"toPlatformPath",{enumerable:!0,get:function(){return jE.toPlatformPath}});w.platform=XE(kl())});var Pb={};jl(Pb,{run:()=>Ol});module.exports=zl(Pb);var fe=Rn(GE()),wn=Rn(require("fs")),ql=Rn(require("path"));var Hb=A=>A==="store"||A==="extension",Ul=A=>{if(!Hb(A))throw new Error(`check-config: \`kind\` must be 'store' or 'extension' (got ${JSON.stringify(A)})`);return A};var Ll={db:["mysql"],search:["opensearch","elasticsearch"],queue:["rabbitmq"],cache:["valkey","redis"],web:["nginx","php-fpm"]},Ml=A=>typeof A=="string"&&A in Ll,Yl=A=>{let e=new Set;for(let t of A)for(let r of Ll[t])e.add(r);return e};var Vb=(A,e,t)=>{if(e===void 0)return{enabled:!0,tiers:t.services};if(typeof e=="boolean")return{enabled:e,tiers:t.services};if(e===null||typeof e!="object"||Array.isArray(e))throw new Error(`check-config: job "${A}" must be a boolean or an object (got ${Array.isArray(e)?"array":typeof e})`);let{enabled:r,services:s}=e,i=r===void 0?!0:!!r;if(s===void 0)return{enabled:i,tiers:t.services};if(!Array.isArray(s))throw new Error(`check-config: job "${A}".services must be an array of tier names`);let n=[];for(let o of s){if(!Ml(o))throw new Error(`check-config: job "${A}".services contains unknown tier "${String(o)}"`);n.push(o)}return{enabled:i,tiers:n}},qb=(A,e)=>{if(!e||e.length===0)return A;let t=new Set,r=[];for(let s of e)t.has(s)||(t.add(s),r.push(s));for(let s of A)t.has(s)||(t.add(s),r.push(s));return r},Ob=(A,e)=>{let t=Yl(e),r=A.services??{},s={};for(let[i,n]of Object.entries(r))t.has(i)&&(s[i]=n);return{...A,services:s}},Wb=(A,e)=>({...A,include:A.include.map(t=>Ob(t,e))}),yn=(A,e,t,r)=>{let s=A.jobs??{};if(s===null||typeof s!="object"||Array.isArray(s))throw new Error("check-config: `jobs` must be an object");for(let n of Object.keys(s))if(!(n in t))throw new Error(`check-config: unknown job "${n}" for kind "${e}". Known jobs: ${Object.keys(t).join(", ")}`);let i={};for(let[n,o]of Object.entries(t)){let g=s[n],{enabled:E,tiers:Q}=Vb(n,g,o),a=qb(Q,o.requiredServices);i[n]={enabled:E,matrix:Wb(r,a)}}return i},xl=A=>{let e=A.trim();if(e==="")return{};let t;try{t=JSON.parse(e)}catch(r){throw new Error(`check-config: failed to parse JSON: ${r.message}`)}if(t===null||typeof t!="object"||Array.isArray(t))throw new Error("check-config: top-level value must be an object");return t},Jl=A=>{let e=A.trim();if(e==="")throw new Error("check-config: `matrix` input is required");let t;try{t=JSON.parse(e)}catch(s){throw new Error(`check-config: failed to parse \`matrix\` input as JSON: ${s.message}`)}if(t===null||typeof t!="object"||Array.isArray(t))throw new Error("check-config: `matrix` must be a JSON object");let r=t.include;if(!Array.isArray(r))throw new Error("check-config: `matrix.include` must be an array");return t};var Gl={"unit-test":{services:[]},"coding-standard":{services:[]},"smoke-test":{services:[],requiredServices:["db","search","queue","cache","web"]}},EU=Object.keys(Gl),Tl=(A,e)=>yn(A,"store",Gl,e);var vl={"unit-test-extension":{services:[]},"compile-extension":{services:[]},"coding-standard":{services:[]},integration_test:{services:[],requiredServices:["db","search","queue","cache"]}},BU=Object.keys(vl),Hl=(A,e)=>yn(A,"extension",vl,e);var Vl=(A,e,t)=>e==="store"?Tl(A,t):Hl(A,t);var Ol=async()=>{try{let A=Ul(fe.getInput("kind",{required:!0})),e=Jl(fe.getInput("matrix",{required:!0})),t=fe.getInput("config_path")||`.github/check-${A}.json`,r=process.env.GITHUB_WORKSPACE||process.cwd(),s=ql.resolve(r,t),i={};if(wn.existsSync(s)){let o=wn.readFileSync(s,"utf-8");i=xl(o),fe.info(`resolve-check-config: read ${s}`)}else fe.info(`resolve-check-config: ${s} not found \u2014 emitting defaults for every known job`);let n=Vl(i,A,e);fe.setOutput("resolved",JSON.stringify(n))}catch(A){fe.setFailed(A.message)}};Ol();0&&(module.exports={run}); /*! Bundled license information: undici/lib/fetch/body.js: diff --git a/resolve-check-config/src/kinds/extension.spec.ts b/resolve-check-config/src/kinds/extension.spec.ts index 857e692..87a17c5 100644 --- a/resolve-check-config/src/kinds/extension.spec.ts +++ b/resolve-check-config/src/kinds/extension.spec.ts @@ -1,14 +1,17 @@ import { EXTENSION_JOBS, KNOWN_JOBS_EXTENSION, resolveExtensionConfig } from './extension'; import { Matrix } from '../types'; +const FULL_SERVICES = { + mysql: { image: 'mysql:8' }, + opensearch: { image: 'opensearchproject/opensearch:2' }, + rabbitmq: { image: 'rabbitmq:3' }, + valkey: { image: 'valkey:8' }, + nginx: { image: 'nginx:1.27' }, + 'php-fpm': { image: 'php:8.3-fpm' }, +}; + const MATRIX: Matrix = { - include: [{ - php: '8.3', - services: { - mysql: { image: 'mysql:8' }, - opensearch: { image: 'opensearchproject/opensearch:2' }, - }, - }], + include: [{ php: '8.3', services: { ...FULL_SERVICES } }], }; describe('EXTENSION_JOBS', () => { @@ -24,6 +27,23 @@ describe('EXTENSION_JOBS', () => { it('keeps KNOWN_JOBS_EXTENSION in sync with the map keys', () => { expect([...KNOWN_JOBS_EXTENSION].sort()).toEqual(Object.keys(EXTENSION_JOBS).sort()); }); + + it('declares integration_test required tiers (no web)', () => { + expect(EXTENSION_JOBS['integration_test'].services).toEqual([]); + expect([...EXTENSION_JOBS['integration_test'].requiredServices!].sort()).toEqual([ + 'cache', + 'db', + 'queue', + 'search', + ]); + }); + + it('leaves the non-service jobs with empty defaults', () => { + for (const name of ['unit-test-extension', 'compile-extension', 'coding-standard']) { + expect(EXTENSION_JOBS[name].services).toEqual([]); + expect(EXTENSION_JOBS[name].requiredServices).toBeUndefined(); + } + }); }); describe('resolveExtensionConfig', () => { @@ -37,19 +57,34 @@ describe('resolveExtensionConfig', () => { ]); }); - it('emits services={} for every job under the current defaults', () => { + it('emits services={} for the non-service jobs', () => { const resolved = resolveExtensionConfig({}, MATRIX); - for (const name of Object.keys(resolved)) { + for (const name of ['unit-test-extension', 'compile-extension', 'coding-standard']) { expect(resolved[name].matrix.include[0].services).toEqual({}); } }); - it('still accepts a caller-supplied services override', () => { + it('integration_test includes mysql/search/queue/cache but NOT nginx/php-fpm', () => { + const resolved = resolveExtensionConfig({}, MATRIX); + expect(Object.keys(resolved['integration_test'].matrix.include[0].services!).sort()).toEqual([ + 'mysql', + 'opensearch', + 'rabbitmq', + 'valkey', + ]); + }); + + it('keeps integration_test required tiers even when caller overrides services to []', () => { const resolved = resolveExtensionConfig( - { jobs: { integration_test: { services: ['search'] } } }, + { jobs: { integration_test: { services: [] } } }, MATRIX, ); - expect(Object.keys(resolved['integration_test'].matrix.include[0].services!)).toEqual(['opensearch']); + expect(Object.keys(resolved['integration_test'].matrix.include[0].services!).sort()).toEqual([ + 'mysql', + 'opensearch', + 'rabbitmq', + 'valkey', + ]); }); it('throws on a typo in the job name', () => { diff --git a/resolve-check-config/src/kinds/extension.ts b/resolve-check-config/src/kinds/extension.ts index d046fc7..1fc80da 100644 --- a/resolve-check-config/src/kinds/extension.ts +++ b/resolve-check-config/src/kinds/extension.ts @@ -12,7 +12,10 @@ export const EXTENSION_JOBS: Record = { 'unit-test-extension': { services: [] }, 'compile-extension': { services: [] }, 'coding-standard': { services: [] }, - 'integration_test': { services: [] }, + 'integration_test': { + services: [], + requiredServices: ['db', 'search', 'queue', 'cache'], + }, }; export const KNOWN_JOBS_EXTENSION: readonly string[] = Object.keys(EXTENSION_JOBS);