@currents/cmd
Version:
Currents CLI tools
50 lines (38 loc) • 60.4 kB
JavaScript
#! /usr/bin/env node
"use strict";var ni=Object.create;var We=Object.defineProperty;var ii=Object.getOwnPropertyDescriptor;var si=Object.getOwnPropertyNames;var ai=Object.getPrototypeOf,ci=Object.prototype.hasOwnProperty;var mi=(e,t)=>{for(var r in t)We(e,r,{get:t[r],enumerable:!0})},pi=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of si(t))!ci.call(e,n)&&n!==r&&We(e,n,{get:()=>t[n],enumerable:!(o=ii(t,n))||o.enumerable});return e};var d=(e,t,r)=>(r=e!=null?ni(ai(e)):{},pi(t||!e||!e.__esModule?We(r,"default",{value:e,enumerable:!0}):r,e));var Lg=require("source-map-support/register");var ti=require("@commander-js/extra-typings");var Gt={name:"@currents/cmd",version:"1.9.4",main:"./dist/index.js",author:{name:"Currents Software Inc",email:"hello@currents.dev"},license:"MIT",description:"Currents CLI tools",scripts:{test:"vitest",rm:"rimraf dist",lint:'TIMING=1 eslint "**/*.ts*"',types:"tsc --noEmit",build:"tsup-node --minify --dts",dev:"tsup-node --watch --dts",release:"release-it","publish:npm":"npm run rm && npm run build && ./publish.js"},devDependencies:{"@jest/reporters":"^29.7.0","@jest/types":"^29.6.3","@release-it/conventional-changelog":"^10.0.1","@types/archiver":"^6.0.3","@types/async-retry":"^1.4.9","@types/debug":"^4.1.12","@types/fs-extra":"^11.0.4","@types/getos":"^3.0.4","@types/lodash":"^4.17.16","@types/node":"^22.13.14","@types/proxy-from-env":"^1.0.4","@types/semver":"^7.5.8","@types/tmp":"^0.2.6","@types/unzipper":"^0.10.11","@types/uuid":"^10.0.0","@types/xml2js":"^0.4.14",jest:"^29.7.0",rimraf:"^6.0.1",tsup:"^8.3.5",typescript:"^5.7.2",vitest:"^2.1.9"},dependencies:{"@commander-js/extra-typings":"^12.1.0","@currents/commit-info":"1.0.1-beta.0",archiver:"^7.0.1","async-retry":"^1.3.3",axios:"^1.8.4","axios-retry":"^4.5.0",chalk:"^4.1.2",commander:"^13.1.0",debug:"^4.4.0",dotenv:"^16.5.0",execa:"^9.5.1","fs-extra":"^11.3.0",getos:"^3.2.1",globby:"^11.1.0","https-proxy-agent":"^7.0.4","jest-cli":"^29.7.0","jest-config":"^29.7.0",lodash:"^4.17.21",nanoid:"^3.3.8","pretty-ms":"^7.0.1","proxy-from-env":"^1.1.0",semver:"^7.7.1","source-map-support":"^0.5.21",tmp:"^0.2.3","tmp-promise":"^3.0.3","ts-pattern":"^5.7.0",unzipper:"^0.12.3",uuid:"^11.1.0",xml2js:"^0.6.2"},bin:{currents:"./dist/bin/index.js","currents-cli":"./dist/bin/index.js"},files:["dist","!**/*.map","!**/*/*.map"],keywords:["cloud test dashboard","test reporter","test results","currents","currents dashboard","ci"],exports:{".":{import:"./dist/index.js",require:"./dist/index.js",types:"./dist/index.d.ts"},"./discovery/jest":{import:"./dist/services/upload/discovery/jest/reporter.js",require:"./dist/services/upload/discovery/jest/reporter.js",types:"./dist/services/upload/discovery/jest/reporter.d.ts"},"./package.json":"./package.json"},"release-it":{npm:{publish:!1},github:{release:!0,releaseName:"${npm.name} v${version}"},plugins:{"@release-it/conventional-changelog":{preset:"angular",header:"# Changelog",ignoreVersion:!0,infile:"./CHANGELOG.md"}},git:{commitMessage:"chore: release ${npm.name} v${version}",tagName:"${npm.name}-v${version}"}}};var Z=Gt.version;var At=require("@commander-js/extra-typings");var di=[];function ze(e){di.push(e)}var w=d(require("chalk")),L=d(require("util"));var Qe=require("debug"),li=d(require("fs-extra")),s=(0,Qe.debug)("currents"),fi=null;function Ht(){Qe.debug.enable("currents,currents:*")}function Kt(e){fi=e}var jt=[],$t=[];var fe=(...e)=>{let t=L.default.format(...e);ze(t),console.log(t)},gi=(...e)=>{let t=L.default.format(...e);ze(t),console.error(t)},x=fe,C=(...e)=>{let t=L.default.format(...e);return $t.push(t),s("WARNING: ",t),fe(w.default.bgYellow.black(" WARNING "),t)},q=(...e)=>{let t=L.default.format(...Vt(e));return s("WARNING: ",L.default.format(...e)),fe(w.default.bgYellow.black(" WARNING "),t)},ge=(...e)=>fe(w.default.green.bold(L.default.format(...e))),h=(...e)=>{let t=L.default.format(...Vt(e));return jt.push(t),s("ERROR: ",L.default.format(...e)),gi(w.default.bgRed.white(" ERROR "),t)};var Vt=e=>e.map(t=>t instanceof Error?t.message:t),Ce=(e=2)=>console.log(Array(e).fill("").join(`
`)),Ia=w.default.cyan,_a=w.default.blueBright,Ta=w.default.red,ya=w.default.yellow,Oa=w.default.green,wa=w.default.gray,Pa=w.default.white,ba=w.default.black,xa=w.default.magenta,g=w.default.dim,Sa=w.default.bold;var cn=d(require("chalk"));function Jt(e,t){if(!e)return e;let r={...e};return t.forEach(o=>{r.hasOwnProperty(o)&&(r[o]="*****")}),r}function he(e){return Jt(e,["apiKey"])}function T(e){return Jt(e,["recordKey","key"])}var ee=class extends Error{};var H=d(require("fs-extra")),Re=require("path"),qt=require("uuid");async function Y(e){try{return await H.default.readJson(e)}catch(t){throw h("Error while reading JSON file: %s",e,t),h}}async function W(e,t){try{return await H.default.writeFile(e,t,"utf8"),e}catch(r){throw h(`Error writing file at ${e}:`,r),r}}async function Ee(e,t){try{try{return await H.default.access(e),e}catch{return await H.default.writeFile(e,t,"utf8"),e}}catch(r){throw h(`Error writing file at ${e}:`,r),r}}async function Yt(e,t){if(t){await H.default.ensureDir(e);return}let r=(0,Re.dirname)(e);await H.default.ensureDir(r)}function hi(){let e=new Date().toISOString().replace(/[:.]/g,"-"),t=(0,qt.v4)();return`${e}-${t}`}async function Wt(e,t){let r=hi(),o=(0,Re.join)(e,t,r);return Ie(o)}async function Ie(e){try{return await H.default.ensureDir(e),s("Folder created",e),e}catch(t){throw h(`Failed to create folder at ${e}:`,t),t}}var zt=d(require("crypto"));function _e(e){return zt.createHash("sha256").update(e).digest("base64").slice(0,8).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}var Te={};mi(Te,{getNanoid:()=>Ri,userFacingNanoid:()=>Ze});var Xe=require("nanoid"),Qt="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",Ri=(e=16)=>(0,Xe.customAlphabet)(Qt,e)(),Ze=(0,Xe.customAlphabet)(Qt,12);function Xt(e){return Object.entries(e??{}).reduce((t,[r,o])=>o===void 0?t:{...t,[r]:o},{})}function y(e,t){return"env"in e[t]&&e[t].env?e[t].env:""}function Ei(e,t){return e[t].cli}function Ii(e,t){return e[t].name}function M(e,t,r,o,n){let a={...Xt(o),...Xt(r())};return t.forEach(c=>{if(!a[c])throw h(`${Ii(e,c)} is required for Currents Reporter. Use the following methods to set the value:
- as environment variable: ${g(y(e,c))}
- as CLI flag of the command: ${g(Ei(e,c))}`),new ee("Missing required config variable")}),typeof n=="function"&&n(a),a}var _i={apiKey:{name:"Api Key",env:"CURRENTS_API_KEY",cli:"--api-key"},debug:{name:"Debug",env:"CURRENTS_DEBUG",cli:"--debug"}},Ti={branch:{name:"Run Branch",cli:"--branch"},output:{name:"Output Path",env:"CURRENTS_OUTPUT",cli:"--output"},ciBuildId:{name:"CI Build ID",cli:"--ci-build-id"},projectId:{name:"Project ID",env:"CURRENTS_PROJECT_ID",cli:"--project-id"},tag:{name:"Run Tag",cli:"--tag"}},B={..._i,...Ti};function Zt(){return{apiKey:process.env[B.apiKey.env],debug:!!process.env[B.debug.env]}}var yi=s.extend("config"),Oi=["apiKey","projectId"],wi=e=>{let{ciBuildId:t,tag:r,branch:o}=e;if(!([t,r,o].filter(Boolean).length===1||r&&o&&!t))throw h('"ciBuildId", "tag", "branch" or a combination of "tag" and "branch" are expected to be provided'),new ee("Missing or invalid parameters")},et=null;function er(e){et=M(B,Oi,Zt,e,wi),yi("Resolved config: %o",he(et))}function ye(){return et}var Sr=require("fs/promises");var Rr=d(require("lodash"));var cr=d(require("axios")),mr=d(require("axios-retry")),pr=d(require("lodash"));var tr=()=>process.env.CURRENTS_API_URL??"https://cy.currents.dev",rr=()=>process.env.CURRENTS_REST_API_URL??"https://api.currents.dev",or=()=>3e4;var tt=require("axios"),rt=d(require("pretty-ms"));var nr=s.extend("http"),Oe=e=>[3*1e3,15*1e3,30*1e3][e-1],ir=e=>(nr("isRetriableError: %o",{message:e.message,code:"code"in e?e.code:void 0,status:"response"in e?e.response?.status:void 0,headers:"response"in e?e.response?.headers:void 0,data:"response"in e?e.response?.data:void 0,isAxiosError:(0,tt.isAxiosError)(e)}),"code"in e&&e.code&&["ECONNABORTED","ECONNREFUSED","ECONNRESET","ETIMEDOUT","ENETRESET"].includes(e.code)?!0:(0,tt.isAxiosError)(e)?[429,502,503,504].includes(e.response?.status??0):!1),we=()=>3;function sr(e,t,r){nr("Network request '%s' failed: '%s'. Next attempt is in %s (%d/%d).",`${r.method?.toUpperCase()} ${r.url}`,t.message,(0,rt.default)(Oe(e)),e,we()),C("Network request '%s' failed: '%s'. Next attempt is in %s (%d/%d).",`${r.method?.toUpperCase()} ${r.url}`,t.message,(0,rt.default)(Oe(e)),e,we())}var ot=s.extend("http");var nt={api:null,restApi:null};function Pi(e){let t=e==="api"?tr():rr();ot("client base url: %s",t);let r=cr.default.create({baseURL:t,timeout:or(),transitional:{clarifyTimeoutError:!0}});return r.interceptors.request.use(o=>{let n=o["axios-retry"]?.retryCount??0;o.headers.set({"x-cmd-version":Z}),o.headers.get("Content-Type")||o.headers.set("Content-Type","application/json");let a={...pr.default.pick(o,"method","url","headers"),baseURL:t,data:Buffer.isBuffer(o.data)?"buffer":o.data,params:o.params};return n?ot("network request retry: %o",ar({...a,baseURL:t,isRetry:!0})):ot("network request: %o",ar(a)),o}),(0,mr.default)(r,{retries:we(),retryCondition:ir,retryDelay:Oe,shouldResetTimeout:!0,onRetry:sr}),r}function ur(e){return nt[e]===null&&(nt[e]=Pi(e)),nt[e]}function ar(e){return{method:e.method,baseURL:e.baseURL,url:e.url,data:e.isRetry?"<retry>":bi(e.data),params:e.isRetry?"<retry>":e.params,headers:{...e.headers,Authorization:"Bearer ***","x-currents-key":"***"}}}function bi(e){return e?.results?.raw?{...e,results:{...e.results,raw:"***"}}:e}var fr=require("axios"),gr=d(require("lodash")),S=require("ts-pattern");function Cr(e){(0,S.match)(e).when(fr.isAxiosError,xi).otherwise(()=>{C("Unexpected error while sending network request: %s",e)})}function xi(e){return(0,S.match)(e).with({code:"ECONNABORTED"},()=>{C("Network connection aborted")}).with({code:"ECONNREFUSED"},()=>{C("Network connection aborted")}).with({code:"ECONNRESET"},()=>{C("Network connection reset")}).with({code:"ETIMEDOUT"},()=>{C("Network connection timeout")}).with({response:S.P.not(S.P.nullish)},t=>{Si(t,{status:t.response.status,data:t.response.data})}).otherwise(t=>{C(`[currents] Unexpected network error: %s
%O`,e.message,{method:e.response?.config.method,url:e.response?.config.url,status:e.response?.status,payload:e.response?.config.data})})}function Si(e,{status:t,data:r}){(0,S.match)(t).with(401,()=>{C(`[currents] ${e.response?.config.method} ${e.response?.config.url}} - 401 Unauthorized Request from cloud service`)}).with(400,()=>{C(`[currents] ${e.response?.config.method} ${e.response?.config.url} - 400 Bad Request from cloud service:
%o`,r)}).with(404,()=>{C(`[currents] ${e.response?.config.method} ${e.response?.config.url} - 404 Not Found from cloud service`)}).with(429,()=>{C(`[currents] ${e.response?.config.method} ${e.response?.config.url} - 429 Too Many Requests from cloud service`)}).with(422,()=>{Ai(e,r)}).otherwise(()=>{C(`[currents] Unexpected network response: %s
%O`,e.message,{method:e.response?.config.method,url:e.response?.config.url,status:e.response?.status})})}function Ai(e,t){(0,S.match)(t).with({code:dr.MISSING_SUITE,message:S.P.string,errors:S.P.array(S.P.string)},async r=>{let{message:o,errors:n}=r;Ce(1),h(...lr(o,n))}).with({code:dr.RUN_EXPIRED,message:S.P.string},r=>{C(r.message)}).with({message:S.P.string,errors:S.P.array(S.P.string)},r=>{let{message:o,errors:n}=r;Ce(1),C(...lr(o,n)),Ce(1)}).otherwise(()=>{C(`[currents] Unexpected network response: %s
%O`,e.message,{method:e.response?.config.method,url:e.response?.config.url,status:e.response?.status})})}var dr={RUN_CANCELLED:"RUN_CANCELLED",RUN_EXPIRED:"RUN_EXPIRED",MISSING_SUITE:"MISSING_SUITE"};function lr(e,t){return gr.default.isString(e)?t?.length===0?[e]:[e,`
${(t??[]).map(r=>` - ${r}`).join(`
`)}
`]:["Unexpected network error"]}var hr=s.extend("http");async function K(e,t,r=ur){try{let o=await r(e).request(t);return hr("network response: %o",{...Rr.default.omit(o,"request","config"),url:o.config.url,method:o.config.method}),o}catch(o){let n=o;throw hr("network error: %o",{code:n.code,message:n.message,url:n.config?.url,method:n.config?.method,status:n.response?.status,headers:n.response?.headers,data:n.response?.data}),Cr(n),n}}var te=s.extend("api");async function Ir(e){try{return te("Request params: %o",T(e)),K("api",{url:"cache/upload",method:"POST",data:e}).then(t=>t.data)}catch(t){throw te("Failed to create cache:",t),t}}async function _r(e){try{return te("Request params: %o",e),K("api",{url:"cache/v2/download",method:"POST",data:e}).then(t=>t.data)}catch(t){throw te("Failed to retrieve cache:",t),t}}async function Tr(e){try{return te("Request params: %o",e),K("api",{url:"cache/meta",method:"POST",data:e}).then(t=>t.data)}catch(t){throw te("Failed to retrieve reference cache meta:",t),t}}var Or=require("util"),wr=require("zlib");var yr=s.extend("api"),Ui=(0,Or.promisify)(wr.gzip);async function Pr(e){try{yr("Run params: %o",T(e));let t=await vi(JSON.stringify(e));return K("api",{url:"v1/runs",method:"POST",headers:{"Content-Type":"application/json","Content-Encoding":"gzip"},data:t}).then(r=>r.data)}catch(t){throw yr("Failed to create the run:",t),t}}async function vi(e){try{return await Ui(e)}catch(t){throw h("Failed to compress run payload:",t),t}}var br=s.extend("api");async function xr(e,t){try{return br("Run params: %o",t),K("restApi",{url:"v1/runs/find",params:t,method:"GET",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`}}).then(r=>r.data)}catch(r){throw br("Failed to obtain run data:",r),r}}async function it(){try{let e=ye();if(!e)throw new Error("Config is missing!");let t=e.ciBuildId?{projectId:e.projectId,ciBuildId:e.ciBuildId,pwLastRun:e.pwLastRun}:{projectId:e.projectId,branch:e.branch,tag:e.tag,pwLastRun:e.pwLastRun},r=await xr(e.apiKey,t);await Di(e.pwLastRun&&r.data.pwLastRun?r.data.pwLastRun:r.data,e)}catch(e){throw s("Failed to get run data"),e}}async function Di(e,t){let r=JSON.stringify(e,null,2);t.output?(await Yt(t.output),await(0,Sr.writeFile)(t.output,r,"utf-8"),x(`Successfully written to ${t.output}`)):x(r)}var go=require("axios"),_t=d(require("path"));var A=require("@commander-js/extra-typings");var Ni={recordKey:{name:"Record Key",env:"CURRENTS_RECORD_KEY",cli:"--key"},debug:{name:"Debug",env:"CURRENTS_DEBUG",cli:"--debug"}},Li={id:{name:"Cache id",cli:"--id"},preset:{name:"Preset",cli:"--preset"},pwOutputDir:{name:"Playwright output directory",cli:"--pw-output-dir"},presetOutput:{name:"Preset output path",cli:"--preset-output"},path:{name:"Paths to cache",cli:"--path"},matrixIndex:{name:"Matrix index",cli:"--matrix-index"},matrixTotal:{name:"Matrix total",cli:"--matrix-total"},continue:{name:"Continue when upload path missing",cli:"--continue"}},Mi={id:{name:"Cache id",cli:"--id"},preset:{name:"Preset",cli:"--preset"},outputDir:{name:"Custom directory to write output",cli:"--output-dir"},matrixIndex:{name:"Matrix index",cli:"--matrix-index"},matrixTotal:{name:"Matrix total",cli:"--matrix-total"},continue:{name:"Continue on cache miss",cli:"--continue"}},j={...Ni,...Li,...Mi};function st(){return{recordKey:process.env[j.recordKey.env],debug:process.env[j.debug.env]}}var Ar=s.extend("config"),Ur=["recordKey"],z;function vr(e){z={type:"SET_COMMAND_CONFIG",values:M(j,Ur,st,e)},Ar("Resolved config: %o",{...z,values:T(z.values)})}function Dr(e){z={type:"GET_COMMAND_CONFIG",values:M(j,Ur,st,e)},Ar("Resolved config: %o",{...z,values:T(z.values)})}function $(){return z}function Nr(e){return{recordKey:e.key,id:e.id,preset:e.preset,outputDir:e.outputDir,presetOutput:e.presetOutput,debug:e.debug,matrixIndex:e.matrixIndex,matrixTotal:e.matrixTotal,continue:e.continue}}function Lr(e){return{recordKey:e.key,id:e.id,preset:e.preset,pwOutputDir:e.pwOutputDir,path:e.path,debug:e.debug,matrixIndex:e.matrixIndex,matrixTotal:e.matrixTotal,continue:e.continue}}var Mr=require("@commander-js/extra-typings");function re(e,t=[]){return e?t.concat(e.split(",").map(r=>r.trim())):t}async function D(e,t){try{t.debug&&Ht(),await e(t),process.exit(0)}catch(r){h(r.message);let o=r instanceof Mr.CommanderError?r.exitCode:1;process.exit(o)}}var at=new A.Option("-k, --key <record-key>","Your secret Record Key obtained from Currents").env(y(j,"recordKey")),ct=new A.Option("--debug","Enable debug logging").env(y(j,"debug")).default(!1),mt=new A.Option("--id <id>","The ID the data is saved under in the cache"),Br=new A.Option("--path <path>",'Comma-separated list of paths to cache, enquote for globs e.g. "dist/**/*"').argParser(re),Pe=(t=>(t.lastRun="last-run",t))(Pe||{}),pt=new A.Option("--preset <preset-name>",'A set of predefined options. Use "last-run" to get the last run data').choices(Object.values(Pe)),kr=new A.Option("--output-dir <dir>","Path to the directory where output will be written"),Fr=new A.Option("--pw-output-dir <dir>","Directory for artifacts produced by Playwright tests").default("test-results"),ce=".currents_env",Gr=new A.Option("--preset-output <path>","Path to the file containing the preset output").default(ce),ut=new A.Option("--matrix-index <number>","The index of the matrix to use").default(1).argParser(Hr),dt=new A.Option("--matrix-total <number>","The total number of matrices available").default(1).argParser(Hr);function Hr(e){let t=parseInt(e,10);if(isNaN(t)||t<=0||!Number.isInteger(t))throw new A.InvalidArgumentError("A positive integer is expected.");return t}var Kr=new A.Option("--continue","Continue the script execution if the cache is not found").default(!1),jr=new A.Option("--continue","Continue the script execution if upload paths are not found").default(!1);var I=require("lodash");var be=s.extend("ci"),Bi=(e,...t)=>(0,I.chain)(t).compact().join(e).value(),ki=(e,t)=>(0,I.set)(e,(0,I.camelCase)(t),process.env[t]),E=e=>(0,I.transform)(e,ki,{}),Fi=()=>process.env.TF_BUILD&&process.env.TF_BUILD_BUILDNUMBER,Gi=()=>process.env.TF_BUILD&&process.env.AZURE_HTTP_USER_AGENT,Hi=()=>(0,I.some)(process.env,(e,t)=>/^CODEBUILD_/.test(t)),Ki=()=>process.env.bamboo_buildNumber,ji=()=>process.env.CI_NAME&&process.env.CI_NAME==="codeship"&&process.env.CODESHIP,$i=()=>process.env.CI_NAME&&process.env.CI_NAME==="codeship"&&!process.env.CODESHIP,Vi=()=>(0,I.some)(process.env,(e,t)=>/^CONCOURSE_/.test(t)),Ji=()=>process.env.GITLAB_CI||process.env.CI_SERVER_NAME&&/^GitLab/.test(process.env.CI_SERVER_NAME),qi=()=>process.env.GCP_PROJECT||process.env.GCLOUD_PROJECT||process.env.GOOGLE_CLOUD_PROJECT,Yi=()=>process.env.JENKINS_URL||process.env.JENKINS_HOME||process.env.JENKINS_VERSION||process.env.HUDSON_URL||process.env.HUDSON_HOME,Wi=()=>process.env.WERCKER||process.env.WERCKER_MAIN_PIPELINE_STARTED,zi={appveyor:"APPVEYOR",azure:Gi,awsCodeBuild:Hi,bamboo:Ki,bitbucket:"BITBUCKET_BUILD_NUMBER",buildkite:"BUILDKITE",circle:"CIRCLECI",codeshipBasic:ji,codeshipPro:$i,concourse:Vi,codeFresh:"CF_BUILD_ID",drone:"DRONE",githubActions:"GITHUB_ACTIONS",gitlab:Ji,goCD:"GO_JOB_NAME",googleCloud:qi,jenkins:Yi,semaphore:"SEMAPHORE",shippable:"SHIPPABLE",teamcity:"TEAMCITY_VERSION",teamfoundation:Fi,travis:"TRAVIS",wercker:Wi,netlify:"NETLIFY",layerci:"LAYERCI"};function Qi(){let{env:e}=process;return(0,I.findKey)(zi,t=>{if((0,I.isString)(t))return e[t];if((0,I.isFunction)(t))return t()})}var $r=()=>({appveyor:E(["APPVEYOR_JOB_ID","APPVEYOR_ACCOUNT_NAME","APPVEYOR_PROJECT_SLUG","APPVEYOR_BUILD_NUMBER","APPVEYOR_BUILD_VERSION","APPVEYOR_PULL_REQUEST_NUMBER","APPVEYOR_PULL_REQUEST_HEAD_REPO_BRANCH"]),azure:E(["BUILD_BUILDID","BUILD_BUILDNUMBER","BUILD_CONTAINERID","BUILD_REPOSITORY_URI","SYSTEM_TEAMPROJECT","SYSTEM_COLLECTIONURI"]),awsCodeBuild:E(["CODEBUILD_BUILD_ID","CODEBUILD_BUILD_NUMBER","CODEBUILD_RESOLVED_SOURCE_VERSION","CODEBUILD_SOURCE_REPO_URL","CODEBUILD_SOURCE_VERSION"]),bamboo:E(["bamboo_buildNumber","bamboo_buildResultsUrl","bamboo_planRepository_repositoryUrl","bamboo_buildKey"]),bitbucket:E(["BITBUCKET_REPO_SLUG","BITBUCKET_REPO_OWNER","BITBUCKET_BUILD_NUMBER","BITBUCKET_PARALLEL_STEP","BITBUCKET_STEP_RUN_NUMBER","BITBUCKET_PR_ID","BITBUCKET_PR_DESTINATION_BRANCH","BITBUCKET_PR_DESTINATION_COMMIT"]),buildkite:E(["BUILDKITE_REPO","BUILDKITE_SOURCE","BUILDKITE_JOB_ID","BUILDKITE_BUILD_ID","BUILDKITE_BUILD_URL","BUILDKITE_BUILD_NUMBER","BUILDKITE_PULL_REQUEST","BUILDKITE_PULL_REQUEST_REPO","BUILDKITE_PULL_REQUEST_BASE_BRANCH"]),circle:E(["CIRCLE_JOB","CIRCLE_BUILD_NUM","CIRCLE_BUILD_URL","CIRCLE_PR_NUMBER","CIRCLE_PR_REPONAME","CIRCLE_PR_USERNAME","CIRCLE_COMPARE_URL","CIRCLE_WORKFLOW_ID","CIRCLE_WORKFLOW_WORKSPACE_ID","CIRCLE_PULL_REQUEST","CIRCLE_REPOSITORY_URL","CI_PULL_REQUEST","CIRCLE_NODE_INDEX","CIRCLE_NODE_TOTAL"]),codeshipBasic:E(["CI_BUILD_ID","CI_REPO_NAME","CI_BUILD_URL","CI_PROJECT_ID","CI_BUILD_NUMBER","CI_PULL_REQUEST"]),codeshipPro:E(["CI_BUILD_ID","CI_REPO_NAME","CI_PROJECT_ID"]),concourse:E(["BUILD_ID","BUILD_NAME","BUILD_JOB_NAME","BUILD_PIPELINE_NAME","BUILD_TEAM_NAME","ATC_EXTERNAL_URL"]),codeFresh:E(["CF_BUILD_ID","CF_BUILD_URL","CF_CURRENT_ATTEMPT","CF_STEP_NAME","CF_PIPELINE_NAME","CF_PIPELINE_TRIGGER_ID","CF_PULL_REQUEST_ID","CF_PULL_REQUEST_IS_FORK","CF_PULL_REQUEST_NUMBER","CF_PULL_REQUEST_TARGET"]),drone:E(["DRONE_JOB_NUMBER","DRONE_BUILD_LINK","DRONE_BUILD_NUMBER","DRONE_PULL_REQUEST"]),githubActions:E(["GITHUB_WORKFLOW","GITHUB_ACTION","GITHUB_EVENT_NAME","GITHUB_RUN_ID","GITHUB_RUN_ATTEMPT","GITHUB_REPOSITORY"]),gitlab:E(["CI_PIPELINE_ID","CI_PIPELINE_URL","CI_BUILD_ID","CI_JOB_ID","CI_JOB_URL","CI_JOB_NAME","CI_NODE_INDEX","CI_NODE_TOTAL","GITLAB_HOST","CI_PROJECT_ID","CI_PROJECT_URL","CI_REPOSITORY_URL","CI_ENVIRONMENT_URL","CI_DEFAULT_BRANCH","RUN_ATTEMPT"]),goCD:E(["GO_SERVER_URL","GO_ENVIRONMENT_NAME","GO_PIPELINE_NAME","GO_PIPELINE_COUNTER","GO_PIPELINE_LABEL","GO_STAGE_NAME","GO_STAGE_COUNTER","GO_JOB_NAME","GO_TRIGGER_USER","GO_REVISION","GO_TO_REVISION","GO_FROM_REVISION","GO_MATERIAL_HAS_CHANGED"]),googleCloud:E(["BUILD_ID","PROJECT_ID","REPO_NAME","BRANCH_NAME","TAG_NAME","COMMIT_SHA","SHORT_SHA"]),jenkins:E(["BUILD_ID","BUILD_URL","BUILD_NUMBER","ghprbPullId"]),semaphore:E(["SEMAPHORE_BRANCH_ID","SEMAPHORE_BUILD_NUMBER","SEMAPHORE_CURRENT_JOB","SEMAPHORE_CURRENT_THREAD","SEMAPHORE_EXECUTABLE_UUID","SEMAPHORE_GIT_BRANCH","SEMAPHORE_GIT_DIR","SEMAPHORE_GIT_REF","SEMAPHORE_GIT_REF_TYPE","SEMAPHORE_GIT_REPO_SLUG","SEMAPHORE_GIT_SHA","SEMAPHORE_GIT_URL","SEMAPHORE_JOB_COUNT","SEMAPHORE_JOB_ID","SEMAPHORE_JOB_NAME","SEMAPHORE_JOB_UUID","SEMAPHORE_PIPELINE_ID","SEMAPHORE_PLATFORM","SEMAPHORE_PROJECT_DIR","SEMAPHORE_PROJECT_HASH_ID","SEMAPHORE_PROJECT_ID","SEMAPHORE_PROJECT_NAME","SEMAPHORE_PROJECT_UUID","SEMAPHORE_REPO_SLUG","SEMAPHORE_TRIGGER_SOURCE","SEMAPHORE_WORKFLOW_ID","PULL_REQUEST_NUMBER"]),shippable:E(["SHIPPABLE_BUILD_ID","SHIPPABLE_BUILD_NUMBER","SHIPPABLE_COMMIT_RANGE","SHIPPABLE_CONTAINER_NAME","SHIPPABLE_JOB_ID","SHIPPABLE_JOB_NUMBER","SHIPPABLE_REPO_SLUG","IS_FORK","IS_GIT_TAG","IS_PRERELEASE","IS_RELEASE","REPOSITORY_URL","REPO_FULL_NAME","REPO_NAME","BUILD_URL","BASE_BRANCH","HEAD_BRANCH","IS_PULL_REQUEST","PULL_REQUEST","PULL_REQUEST_BASE_BRANCH","PULL_REQUEST_REPO_FULL_NAME"]),teamcity:null,teamfoundation:E(["BUILD_BUILDID","BUILD_BUILDNUMBER","BUILD_CONTAINERID"]),travis:E(["TRAVIS_JOB_ID","TRAVIS_BUILD_ID","TRAVIS_BUILD_WEB_URL","TRAVIS_REPO_SLUG","TRAVIS_JOB_NUMBER","TRAVIS_EVENT_TYPE","TRAVIS_COMMIT_RANGE","TRAVIS_BUILD_NUMBER","TRAVIS_PULL_REQUEST","TRAVIS_PULL_REQUEST_BRANCH","TRAVIS_PULL_REQUEST_SHA"]),wercker:null,netlify:E(["BUILD_ID","CONTEXT","URL","DEPLOY_URL","DEPLOY_PRIME_URL","DEPLOY_ID"]),layerci:E(["LAYERCI_JOB_ID","LAYERCI_RUNNER_ID","RETRY_INDEX","LAYERCI_PULL_REQUEST","LAYERCI_REPO_NAME","LAYERCI_REPO_OWNER","LAYERCI_BRANCH","GIT_TAG"])}),Xi=()=>{let{env:e}=process;return{appveyor:{sha:e.APPVEYOR_REPO_COMMIT,branch:e.APPVEYOR_PULL_REQUEST_HEAD_REPO_BRANCH||e.APPVEYOR_REPO_BRANCH,message:Bi(`
`,e.APPVEYOR_REPO_COMMIT_MESSAGE,e.APPVEYOR_REPO_COMMIT_MESSAGE_EXTENDED),authorName:e.APPVEYOR_REPO_COMMIT_AUTHOR,authorEmail:e.APPVEYOR_REPO_COMMIT_AUTHOR_EMAIL},awsCodeBuild:{sha:e.CODEBUILD_RESOLVED_SOURCE_VERSION,remoteOrigin:e.CODEBUILD_SOURCE_REPO_URL},azure:{sha:e.BUILD_SOURCEVERSION,branch:e.BUILD_SOURCEBRANCHNAME,message:e.BUILD_SOURCEVERSIONMESSAGE,authorName:e.BUILD_SOURCEVERSIONAUTHOR,authorEmail:e.BUILD_REQUESTEDFOREMAIL},bamboo:{sha:e.bamboo_planRepository_revision,branch:e.bamboo_planRepository_branch,authorName:e.bamboo_planRepository_username,remoteOrigin:e.bamboo_planRepository_repositoryURL},bitbucket:{sha:e.BITBUCKET_COMMIT,branch:e.BITBUCKET_BRANCH},buildkite:{sha:e.BUILDKITE_COMMIT,branch:e.BUILDKITE_BRANCH,message:e.BUILDKITE_MESSAGE,authorName:e.BUILDKITE_BUILD_CREATOR,authorEmail:e.BUILDKITE_BUILD_CREATOR_EMAIL,remoteOrigin:e.BUILDKITE_REPO,defaultBranch:e.BUILDKITE_PIPELINE_DEFAULT_BRANCH},circle:{sha:e.CIRCLE_SHA1,branch:e.CIRCLE_BRANCH,authorName:e.CIRCLE_USERNAME,remoteOrigin:e.CIRCLE_REPOSITORY_URL},codeshipBasic:{sha:e.CI_COMMIT_ID,branch:e.CI_BRANCH,message:e.CI_COMMIT_MESSAGE,authorName:e.CI_COMMITTER_NAME,authorEmail:e.CI_COMMITTER_EMAIL},codeshipPro:{sha:e.CI_COMMIT_ID,branch:e.CI_BRANCH,message:e.CI_COMMIT_MESSAGE,authorName:e.CI_COMMITTER_NAME,authorEmail:e.CI_COMMITTER_EMAIL},codeFresh:{sha:e.CF_REVISION,branch:e.CF_BRANCH,message:e.CF_COMMIT_MESSAGE,authorName:e.CF_COMMIT_AUTHOR},drone:{sha:e.DRONE_COMMIT_SHA,branch:e.DRONE_SOURCE_BRANCH,message:e.DRONE_COMMIT_MESSAGE,authorName:e.DRONE_COMMIT_AUTHOR,authorEmail:e.DRONE_COMMIT_AUTHOR_EMAIL,remoteOrigin:e.DRONE_GIT_HTTP_URL,defaultBranch:e.DRONE_REPO_BRANCH},githubActions:{sha:e.GITHUB_SHA,branch:e.GH_BRANCH||e.GITHUB_REF,defaultBranch:e.GITHUB_BASE_REF,remoteBranch:e.GITHUB_HEAD_REF,runAttempt:e.GITHUB_RUN_ATTEMPT},gitlab:{sha:e.CI_COMMIT_SHA,branch:e.CI_COMMIT_REF_NAME,message:e.CI_COMMIT_MESSAGE,authorName:e.GITLAB_USER_NAME,authorEmail:e.GITLAB_USER_EMAIL,remoteOrigin:e.CI_REPOSITORY_URL,defaultBranch:e.CI_DEFAULT_BRANCH},googleCloud:{sha:e.COMMIT_SHA,branch:e.BRANCH_NAME},jenkins:{sha:e.GIT_COMMIT,branch:e.GIT_BRANCH},semaphore:{sha:e.SEMAPHORE_GIT_SHA,branch:e.SEMAPHORE_GIT_BRANCH,remoteOrigin:e.SEMAPHORE_GIT_REPO_SLUG},shippable:{sha:e.COMMIT,branch:e.BRANCH,message:e.COMMIT_MESSAGE,authorName:e.COMMITTER},snap:null,teamcity:null,teamfoundation:{sha:e.BUILD_SOURCEVERSION,branch:e.BUILD_SOURCEBRANCHNAME,message:e.BUILD_SOURCEVERSIONMESSAGE,authorName:e.BUILD_SOURCEVERSIONAUTHOR},travis:{sha:e.TRAVIS_PULL_REQUEST_SHA||e.TRAVIS_COMMIT,branch:e.TRAVIS_PULL_REQUEST_BRANCH||e.TRAVIS_BRANCH,message:e.TRAVIS_COMMIT_MESSAGE},wercker:null,netlify:{sha:e.COMMIT_REF,branch:e.BRANCH,remoteOrigin:e.REPOSITORY_URL},layerci:{sha:e.GIT_COMMIT,branch:e.LAYERCI_BRANCH,message:e.GIT_COMMIT_TITLE}}},Vr=e=>{let t=Jr();return t?(0,I.chain)(e()).get(t).value():{}};function Zi(){return(0,I.chain)($r()).omitBy(I.isNull).keys().value()}function es(e){return e&&Zi().includes(e)}function Jr(){let e=Qi();return be("detected CI provider name: %s",e),e||null}function ts(){return Vr($r)}function qr(){return Vr(Xi)}function oe(e){let t=ts(),r=Jr(),o=rs(e,r);return be("detected CI provider: %s",r),be("detected CI params: %O",t),be("detected CI build ID: %o",o),{params:t,provider:r,ciBuildId:o}}function rs(e,t){return e?{source:"user",value:e}:es(t)?{source:"server",value:null}:{source:"random",value:`auto:${Ze()}`}}var Yr=d(require("archiver")),Wr=d(require("fs-extra")),lt=d(require("path")),zr=d(require("unzipper"));var os=50*1024*1024;async function Qr(e,t=os){return new Promise((r,o)=>{let n=(0,Yr.default)("zip",{zlib:{level:9}}),a=[],c=0;n.on("data",u=>{a.push(u),c+=u.length,c>t&&o(new Error(`Zip size exceeded the limit of ${t} bytes`))}),n.on("warning",u=>{u.code==="ENOENT"?C(u):o(u)}),n.on("error",u=>o(u)),n.on("end",()=>{let u=Buffer.concat(a);r(u)});let p=async u=>{let R=process.cwd(),l=lt.default.normalize(u),f=lt.default.relative(R,l),_=await Wr.default.stat(u);_.isDirectory()?n.directory(u,f):n.file(u,{name:f,stats:_})};(async u=>{for(let R of u)await p(R);await n.finalize()})(e).catch(o)})}async function Xr(e,t){return zr.default.Open.buffer(e).then(r=>r.extract({path:t,concurrency:3}))}var oo=d(require("async-retry")),no=require("axios");var Zr=d(require("axios")),eo=require("https-proxy-agent"),to=d(require("proxy-from-env"));var ns=s.extend("axios");function ft(e={}){let t=Zr.default.create(e);return t.interceptors.request.use(r=>{let o={...r},n=t.getUri(r),a=to.default.getProxyForUrl(n);return a&&(ns("Using HTTP proxy %s for %s ",a,n),o.proxy=!1,o.httpsAgent=is(a)),o}),t}var xe=null;function is(e){return xe||(xe=new eo.HttpsProxyAgent(e),xe)}var Ae=s.extend("upload"),Se=5;async function gt(e,t,r){return Ae("Uploading buffer %s",e.name,{buffer:Buffer.byteLength(e.buffer)}),as(e.buffer,e.uploadUrl,t,r)}async function ss(e,t,r,o){return ft().request({method:"put",url:t,data:e,onUploadProgress:o,headers:{"Content-Disposition":"inline","Content-Type":r}})}async function Ct(e,t){try{let r=await ft().get(e,{responseType:"arraybuffer",onDownloadProgress:t});return Buffer.from(r.data)}catch(r){throw(0,no.isAxiosError)(r)&&Ae("Failed to download %s: %s",e,r.message),r}}async function as(...e){await(0,oo.default)(async()=>{await ss(...e)},{retries:Se,onRetry:(t,r)=>{if(Ae("Upload failed %d out of %d attempts: %s",r,Se,t.message),r===Se){h(`Cannot upload after ${r} times: ${t.message}`);return}C(`Upload failed ${r} out of ${Se} attempts: ${t.message}`)}})}var ht=e=>({total:t,loaded:r})=>{};function ro(e){return e/1e3/1e3}var It=d(require("lodash"));var V=d(require("path")),Et=d(require("globby"));var io=require("lodash");function Rt({config:e,cacheId:t,orgId:r,path:o,ci:n,cacheKey:a,metaCacheKey:c}){let p={id:t,orgId:r,config:(0,io.omit)(e,"recordKey"),path:o,ci:n,createdAt:new Date().toISOString(),cacheKey:a,metaCacheKey:c};return Buffer.from(JSON.stringify(p))}function so(e,t){e instanceof Error?q("%s. %s.",t,e.message):q("%s. %s.",t,"Unknown error")}var ao=async e=>{let t=V.default.resolve(e??"./test-results"),r=[V.default.resolve(t,"**/.last-run.json"),V.default.resolve(t,".last-run.json")];return Et.sync(r)},co=async(e=[])=>{let t=cs(e),r=[];return t.length>0&&r.push(...Et.sync(e)),r};function cs(e){let t=process.cwd();return e.filter(r=>{let o=V.default.resolve(r),n=V.default.relative(t,o);return r.startsWith("..")||V.default.isAbsolute(n)?(so(null,`Invalid path: "${r}". Path traversal detected. The path was skipped.`),!1):!0})}function Ue(e){return e?e.path.some(t=>V.default.basename(t)===".last-run.json"):!1}async function mo(e,t){switch(t.provider){case"githubActions":await lo(e,t);break;case"gitlab":await uo(e,t);break;case"circle":await fo(e,t);break;default:break}}async function po(e,t,r){switch(t.provider){case"githubActions":await lo(e,t,r);break;case"gitlab":await uo(e,t,r);break;case"circle":await fo(e,t,r);break;default:break}}async function uo(e,t,r=null){let o=t.params,n=r?.ci.params,c=(n?ne(n.runAttempt,0):0)+1,p=ne(o.ciNodeIndex,1),m=ne(o.ciNodeTotal,1),u=Ue(r),R=c>1&&u,l=R?"--last-failed":"",f="";m>1&&(f=R?"--shard=1/1":`--shard=${p}/${m}`);let _=[l,f].filter(Boolean).join(" ");await W(e.presetOutput??ce,`EXTRA_PW_FLAGS="${_}"
EXTRA_PWCP_FLAGS="${l}"
RUN_ATTEMPT=${c}
`)}async function lo(e,t,r=null){let{matrixIndex:o,matrixTotal:n}=e,a=t.params,c=ne(a.githubRunAttempt,1),p=Ue(r),m=c>1&&p,u=m?"--last-failed":"",R="";n>1&&(R=m?"--shard=1/1":`--shard=${o}/${n}`);let l=[u,R].filter(Boolean).join(" "),f=e.presetOutput??ce;await W(f,l),s('Dumped PW config: "%s" for GHA to %s',l,f)}async function fo(e,t,r=null){let o=t.params,n=r?.ci.params,a=n?.circleWorkflowId,c=n?.circleWorkflowWorkspaceId,p=ne(o.circleNodeIndex,0),m=ne(o.circleNodeTotal,1),u=c==o.circleWorkflowWorkspaceId&&a!==o.circleWorkflowId,R=Ue(r),l=u&&R,f=l?"--last-failed":"",_="";m>1&&(_=l?"--shard=1/1":`--shard=${p+1}/${m}`);let P=[f,_].filter(Boolean).join(" "),b=e.presetOutput??ce;await W(b,P),s('Dumped PW config: "%s" for Circle to %s',P,b)}var ne=(e,t)=>{let r=It.default.toNumber(e);return It.default.isNaN(r)?t:r};async function Tt(){let e=$();if(e.type!=="GET_COMMAND_CONFIG"||!e.values)throw new Error("Config is missing!");let{recordKey:t,id:r,preset:o,matrixIndex:n,matrixTotal:a,continue:c}=e.values,p=e.values.outputDir,m=oe();o==="last-run"&&await mo(e.values,m);let{cacheId:u,refMetaReadUrl:R}=await Tr({recordKey:t,ci:m,id:r,config:{matrixIndex:n,matrixTotal:a}});try{let l=await us(R),{readUrl:f}=await _r({recordKey:t,cacheKey:l.cacheKey}),_=await ms({readUrl:f,outputDir:p});o==="last-run"&&await po(e.values,m,l),x(g("- restoring cache to"),_),ge("Cache restored. Cache ID: %s",u)}catch(l){if((0,go.isAxiosError)(l)&&(l.response?.status===403||l.response?.status===404)){let f=`Cache with ID "${u}" not found`;if(c){q(f);return}throw new Error(f)}throw l}}async function ms({readUrl:e,outputDir:t}){let r=await Ct(e),o=ps(t);return await Xr(r,o),s("Cache downloaded",{readUrl:e,destination:o}),o}function ps(e){let t=e??process.cwd();return _t.default.isAbsolute(t)?t:_t.default.resolve(process.cwd(),t)}async function us(e){let t=await Ct(e),r=JSON.parse(t.toString("utf-8"));return s("Meta file downloaded: %O",r),r}var ho=require("lodash");async function yt(){let e=$();if(e.type!=="SET_COMMAND_CONFIG"||!e.values)throw new Error("Config is missing!");let{recordKey:t,id:r,preset:o,pwOutputDir:n,matrixIndex:a,matrixTotal:c,continue:p}=e.values,m=await co(e.values.path),u=e.values.path||[],R=oe();if(o==="last-run"&&(u.push(n),m.push(...await ao(n))),m.length===0){let b=`No files available to upload: ${u.filter(Boolean).join(",")}`;if(!p)throw new Error(b);q(b)}let l=await Ir({recordKey:t,ci:R,id:r,config:{matrixIndex:a,matrixTotal:c}});s("Cache upload url created",{result:l});let f=ls(R),_=m.length>0?await Qr(m):null,P=[];_&&P.push(ds({archive:_,cacheId:l.cacheId,uploadUrl:l.uploadUrl}).then(()=>{fs(m),s("Cache archive uploaded",{uploadUrl:l.uploadUrl})})),P.push(Co({meta:Rt({cacheId:l.cacheId,config:e.values,ci:f,orgId:l.orgId,path:m}),cacheId:l.cacheId,uploadUrl:l.metaUploadUrl}).then(()=>s("Meta uploaded",{uploadUrl:l.metaUploadUrl})),Co({meta:Rt({cacheId:l.cacheId,config:e.values,ci:f,orgId:l.orgId,path:m,cacheKey:l.cacheKey,metaCacheKey:l.metaCacheKey}),cacheId:l.cacheId,uploadUrl:l.refMetaUploadUrl}).then(()=>s("Ref meta uploaded",{uploadUrl:l.refMetaUploadUrl}))),await Promise.all(P),ge("Cache uploaded. Cache ID: %s",l.cacheId)}async function ds({archive:e,cacheId:t,uploadUrl:r}){try{let o="application/zip";await gt({buffer:e,contentType:o,name:t,uploadUrl:r},o,ht(t)),s("Cache archive uploaded",{cacheId:t})}catch(o){throw s("Failed to upload cache archive",o),o}}async function Co({meta:e,cacheId:t,uploadUrl:r}){try{let o=`${t}_meta`,n="application/json";await gt({buffer:e,contentType:n,name:o,uploadUrl:r},n,ht(o)),s("Cache meta uploaded",{cacheId:t})}catch(o){throw s("Failed to upload cache meta",o),o}}function ls(e){return e.ciBuildId.source==="server"||e.ciBuildId.source==="random"?(0,ho.omit)(e,"ciBuildId"):e}function fs(e){x(`Cache upload paths:
`+e.map(t=>`${g("- uploading")} ${t}`).join(`
`))}var Eo=require("@currents/commit-info"),Io=require("lodash");var ve=require("lodash");var Ot=s.extend("ci-git");function Ro(e){Ot("git commit existing info: %O",e);let t=qr();Ot("commit info from provider environment variables: %O",t);let r=(0,ve.transform)(e,(o,n,a)=>{let c=n||(t?t[a]:null);return o[a]=(0,ve.defaultTo)(c,null)});return Ot("combined git and environment variables from provider: %O",r),r}var gs=async()=>{let e=await(0,Eo.commitInfo)();return Ro({branch:e.branch,remoteOrigin:e.remote,authorEmail:e.email,authorName:e.author,message:e.message,sha:e.sha,ghaEventData:e.ghaEventData})},_o=(0,Io.memoize)(gs);var To=d(require("getos")),yo=require("lodash"),U=require("os"),Oo=require("util"),Cs=async()=>{if((0,U.platform)()==="linux")try{let e=await(0,Oo.promisify)(To.default)();return"dist"in e&&"release"in e?[e.dist,e.release].join(" - "):(0,U.release)()}catch{return(0,U.release)()}return(0,U.release)()},hs=async()=>{let e=await Cs();return{osName:(0,U.platform)(),osVersion:e,osCpus:[],osMemory:{free:(0,U.freemem)(),total:(0,U.totalmem)()}}},wo=(0,yo.memoize)(hs);var xt=d(require("path")),Qo=d(require("semver"));var O={debug:{name:"Debug",env:"CURRENTS_DEBUG",cli:"--debug"},ciBuildId:{name:"CI Build ID",env:"CURRENTS_CI_BUILD_ID",cli:"--ci-build-id"},recordKey:{name:"Record Key",env:"CURRENTS_RECORD_KEY",cli:"--key"},projectId:{name:"Project ID",env:"CURRENTS_PROJECT_ID",cli:"--project-id"},tag:{name:"Currents Tag",env:"CURRENTS_TAG",cli:"--tag"},disableTitleTags:{name:"Disable Title Tags",env:"CURRENTS_DISABLE_TITLE_TAGS",cli:"--disable-title-tags"},removeTitleTags:{name:"Remove Title Tags",env:"CURRENTS_REMOVE_TITLE_TAGS",cli:"--remove-title-tags"},machineId:{name:"Machine ID",env:"CURRENTS_MACHINE_ID",cli:"--machine-id"},reportDir:{name:"Report Directory",env:"CURRENTS_REPORT_DIR",cli:"--report-dir"}};function Po(){return{projectId:process.env[O.projectId.env],recordKey:process.env[O.recordKey.env],ciBuildId:process.env[O.ciBuildId.env],tag:process.env[O.tag.env]?process.env[O.tag.env]?.split(",").map(e=>e.trim()):void 0,disableTitleTags:process.env[O.disableTitleTags.env],removeTitleTags:process.env[O.removeTitleTags.env],debug:process.env[O.debug.env],machineId:process.env[O.machineId.env]}}var Rs=s.extend("config"),Es=["projectId","recordKey"],wt=null;function bo(e){wt=M(O,Es,Po,e),Rs("Resolved Currents config: %o",wt)}function De(){return wt}function xo(e){return{ciBuildId:e.ciBuildId,projectId:e.projectId,recordKey:e.key,tag:e.tag,removeTitleTags:e.removeTitleTags,disableTitleTags:e.disableTitleTags,debug:e.debug,machineId:e.machineId,reportDir:e.reportDir}}var J=class{constructor(t){this.config=t}async getFullTestSuite(){return[]}};var Fo=d(require("fs-extra")),Go=require("jest-cli"),Ho=d(require("tmp"));var Bo=require("lodash");function So(e){let t=[];for(let[r,o]of Object.entries(e))r==="_"||r==="$0"||r.includes("-")||(typeof o=="boolean"?o&&t.push(`--${r}`):Array.isArray(o)?o.forEach(n=>{t.push(`--${r}=${n}`)}):t.push(`--${r}=${o}`));return t.join(" ")}var Ao=require("lodash"),Is=["bail","clearCache","collectCoverage","collectCoverageFrom","color","colors","config","coverage","coverageDirectory","coveragePathIgnorePatterns","coverageProvider","coverageReporters","coverageThreshold","debug","detectLeaks","detectOpenHandles","errorOnDeprecated","expand","forceExit","json","listTests","logHeapUsage","noStackTrace","notify","notifyMode","openHandlesTimeout","outputFile","reporters","runner","shard","showConfig","showSeed","silent","testNamePattern","verbose","waitNextEventLoopTurnForUnhandledRejectionEvents","watch","watchAll","watchPathIgnorePatterns","watchman"];function Uo(e){return(0,Ao.omit)(e,...Is)}var No=d(require("fs")),Lo=require("jest-config"),Pt=require("lodash"),bt=d(require("path"));function Ne(e,t){return(...r)=>new Promise((o,n)=>{let a=0,c=()=>{a++;try{let p=e(...r);o(p)}catch(p){if(a>=t.length)n(p);else{let m=t[a-1];setTimeout(c,m)}}};c()})}var vo=d(require("fs-extra")),_s=d(require("path"));async function Le(e){let t=await vo.default.pathExists(e);if(!t)throw new Error("File does not exist");return t}var Do=s.extend("jest-discovery");async function Mo(e){try{let{config:t,configPath:r}=await(0,Lo.readInitialOptions)(e),o=["collectCoverage","collectCoverageFrom","coverageDirectory","coveragePathIgnorePatterns","coverageProvider","coverageReporters","coverageThreshold","errorOnDeprecated","forceCoverageMatch","notify","notifyMode","openHandlesTimeout","reporters","runner","showSeed","testFailureExitCode","verbose","watchPathIgnorePatterns","watchPlugins","watchman","bail","clearCache","color","colors","debug","detectLeaks","detectOpenHandles","expand","forceExit","json","listTests","logHeapUsage","noStackTrace","outputFile","shard","showConfig","silent","testNamePattern","waitNextEventLoopTurnForUnhandledRejectionEvents","watch","watchAll"],n=["collectCoverageFrom","coverageDirectory","coveragePathIgnorePatterns","detectLeaks","detectOpenHandles","errorOnDeprecated","forceCoverageMatch","openHandlesTimeout","runner","watchPathIgnorePatterns"],a=(0,Pt.omit)(t,o);if(a.projects&&(a.projects=a.projects.map(m=>typeof m!="string"?(0,Pt.omit)(m,n):m)),a.rootDir&&Object.keys(a).length===1)return null;let c=bt.default.resolve(r?bt.default.dirname(r):process.cwd(),`.jest-scanner-${new Date().getTime()}.config.js`),p=`module.exports=${JSON.stringify(a,null,2)}`;return Do("configFileContent: %O",p),No.default.writeFileSync(c,p),await Ne(Le,[200,200,200,200,200,1e3])(c),c}catch(t){return h("Failed to recreate the config file"),Do("error %o",t),null}}async function ko(e){let t="!!##ThisPatternWillNotMatchAnyTestName##!!",r=e.options,o=Uo(r),n=So(o),a=r.config,c=await Mo(a);return{cliArgs:[n,"--testNamePattern",t,"--reporters","@currents/cmd/discovery/jest","--shard=1/1",c?`--config=${c}`:"",...e.args].filter(m=>!(0,Bo.isEmpty)(m)),configFilePath:c}}var Ts=s.extend("jest-discovery");async function Ko(e,t){console.time(g("@currents/jest:fullTestSuite-ready"));let{cliArgs:r,configFilePath:o}=await ko(t);try{let n=Ho.default.fileSync({postfix:".json"});return Ts("running scanner: %o",r),process.env.CURRENTS_DISCOVERY_PATH=n.name,await(0,Go.run)(r.concat(["--openHandlesTimeout=0"])),await Ne(Le,Array.from({length:300},()=>100))(n.name),console.timeEnd(g("@currents/jest:fullTestSuite-ready")),await Y(n.name)}catch(n){return h("Failed to obtain the jest full test suite:",n),[]}finally{o&&Fo.default.unlinkSync(o)}}var Me=class extends J{constructor(t){super(t)}async getFullTestSuite(){return Ko(this.config.frameworkConfig,this.config.cliArgs)}};var $o=d(require("fs-extra"));var jo=d(require("path"));function ie(e){return jo.default.join(e,"fullTestSuite.json")}var ys=s.extend("junit-discovery");async function Vo(e){console.time(g("@currents/junit:fullTestSuite-ready"));try{ys("running scanner: %o",e);let t=ie(e);process.env.CURRENTS_DISCOVERY_PATH=t;let r=$o.default.readFileSync(t,"utf-8");return JSON.parse(r)}catch(t){return h("Failed to obtain the junit full test suite:",t),[]}}var Be=class extends J{constructor(t,r){super(t),this.reportDir=r}async getFullTestSuite(){return Vo(this.reportDir)}};function Jo(e,t){switch(e.framework){case"jest":return new Me(e);case"junit":return new Be(e,t);default:return new J(e)}}var se=d(require("fs-extra")),k=d(require("path"));async function qo(e){let t=await Os(e?.reportDir);if(!t)throw new Error("Failed to find the report dir");return{reportDir:t,configFilePath:e?.configFilePath??k.default.join(t,"config.json")}}async function Os(e){return e?(await ke(e),e):ws((0,k.join)(process.cwd(),".currents"))}async function ws(e){let t=await se.default.readdir(e),r=null;for(let o of t){let n=k.default.join(e,o),a=await se.default.stat(n);a.isDirectory()&&(!r||a.birthtime>r.birthtime)&&(r={name:o,birthtime:a.birthtime})}return r?(0,k.resolve)(e,r.name):null}async function ke(e){try{return await se.default.pathExists(e)}catch{return h("Error checking if path exists:",h),!1}}async function Yo(e){let t=k.default.join(e,"instances");return Ps(t)}async function Ps(e){let t=await se.default.readdir(e),r=[];for(let o of t){let n=k.default.join(e,o);(await se.default.stat(n)).isFile()&&r.push(n)}return r}var bs=e=>Buffer.byteLength(JSON.stringify(e),"utf8"),Wo=(e,t=1048576)=>{let r=[],o=[],n=0;for(let a of e){let c=bs(a);n+c>t&&(r.push(o),o=[],n=0),o.push(a),n+=c}return o.length>0&&r.push(o),r};async function St(){let e=De();if(!e)throw new Error("Currents config is missing!");let t=await qo(e);Kt(Ss(t.reportDir)),s("Reporter options: %o",t),x("Report directory: %s",t.reportDir);let r=await Y(t.configFilePath);s("Report config: %o",r);let o=await Yo(t.reportDir);s("Found %d instance results in the reportDir: %s",o.length,t.reportDir);let n=xs(t.reportDir),a=await ke(n),c=ie(t.reportDir),p=null;if(a){let P=await Y(n);C("Marker file detected. The report was already uploaded: %o",{runUrl:P.response.runUrl,isoDate:P.isoDate}),await ke(c)&&(p=await Y(c),s("Full test suite file detected: %s",c))}if(p)s("The discovery stage was skipped");else{if(p=await Jo(r,t.reportDir).getFullTestSuite(),As(p))throw new Error("Failed to discover the full test suite!");await W(c,JSON.stringify(p))}let m=p.length===1?p[0].name:null,u={currents:e},R={type:r.framework,version:r.frameworkVersion,clientVersion:Z,frameworkConfig:{originFramework:r.frameworkConfig?.originFramework,originFrameworkVersion:r.frameworkConfig?.originFrameworkVersion}},l=Te.userFacingNanoid(),f=oe(e.ciBuildId),_={};for await(let P of o){let b=await Y(P);_[b.groupId]||(_[b.groupId]=[]),_[b.groupId].push(b)}for await(let P of Object.keys(_)){let b=_[P],le=P;m&&(s("Default group found: %s, overwriting the group in the results",m),le=m,b=b.map(X=>({...X,groupId:m})));try{let X=Wo(b),qe=await zo({ci:f,group:le,instances:[],fullTestSuite:p,config:u,machineId:l,framework:R});for(let Ye=0;Ye<X.length;Ye++)await zo({ci:f,group:le,instances:X[Ye],fullTestSuite:[],config:u,machineId:l,framework:R});s("Api response: %o",qe),x("[%s] Run created: %s",le,qe.runUrl);let oi={response:qe,isoDate:new Date().toISOString()};await W(n,JSON.stringify(oi)),s("Marker file %s: %s",a?"overwritten":"created",n)}catch(X){throw s("Failed to upload the results to the dashboard"),X}}}async function zo({ci:e,group:t,instances:r,fullTestSuite:o,config:n,machineId:a,framework:c}){let p=await _o(),m=await wo(),u={browserName:"node",browserVersion:Qo.default.coerce(process.version)?.version},{currents:R}=n,f={platform:{...u,...m},ci:e,commit:p,group:t,fullTestSuite:o,config:n,projectId:R.projectId,recordKey:R.recordKey,ciBuildId:e.ciBuildId.value??void 0,tags:R.tag??[],machineId:R.machineId??a,framework:c,instances:r,previousCiBuildId:process.env.CURRENTS_PREVIOUS_CI_BUILD_ID};return s("Creating run: %o",T(f)),Pr(f)}function xs(e){return xt.default.join(e,"upload.marker.json")}function Ss(e){return xt.default.join(e,`.debug-${new Date().toISOString()}.log`)}function As(e){return e.length===0||e.some(t=>t.tests.length===0)}var Us=s.extend("cli");async function Xo(e){await D(async t=>{er(t);let r=ye();Us("Config: %o",he(r)),await it()},e)}var F=require("@commander-js/extra-typings");var Zo=new F.Option("--api-key <api-key>","API key from Currents dashboard for authentication").env(y(B,"apiKey")),en=new F.Option("-o, --output <path>","Path to the file where output will be written").env(y(B,"output")),tn=new F.Option("--ci-build-id <id>","Unique identifier for the run"),rn=new F.Option("-p, --project-id <project>","Project ID from Currents associated with the run").env(y(B,"projectId")),on=new F.Option("-t, --tag <tag>","Filter by comma-separated list of tags").argParser(re),nn=new F.Option("--debug","Enable debug logging").env(y(B,"debug")).default(!1),sn=new F.Option("-b, --branch <branch>","Filter by git branch name"),an=new F.Option("--pw-last-run",'Create Playwright ".last-run.json" file with the failed test(s) from the run');var Fe="api",vs=e=>`
${cn.default.bold("Examples")}
Obtain run data by --ci-build-id:
${g(`${e} ${Fe} get-run --api-key <api-key> --ci-build-id <ci-build-id>`)}
Obtain the most recent run data by filters:
${g(`${e} ${Fe} get-run --api-key <api-key> --project-id <project-id> --branch <branch> --tag tagA,tagB`)}
Obtain run data by --ci-build-id, save the failed test in a format compatible with Playwright --last-failed:
${g(`${e} ${Fe} get-run --api-key <api-key> --ci-build-id <ci-build-id> --pw-last-run --output <output-path>`)}
`,mn=e=>new At.Command().command(Fe).description("Interact with the Currents API").showHelpAfterError("(add --help for additional information)").allowUnknownOption().addCommand(Ds(e)),Ds=e=>new At.Command().name("get-run").description(`Retrieve run data from Currents API ${vs(e)}`).allowUnknownOption().addOption(Zo).addOption(nn).addOption(tn).addOption(rn).addOption(sn).addOption(on).addOption(en).addOption(an).action(Xo);var Ge=require("@commander-js/extra-typings");var dn=d(require("chalk"));var Ns=s.extend("cli");async function pn(e){await D(async t=>{Dr(Nr(t));let r=$();Ns("Config: %o",T(r.values)),await Tt()},e)}var Ls=s.extend("cli");async function un(e){await D(async t=>{vr(Lr(t));let r=$();Ls("Config: %o",T(r.values)),await yt()},e)}var ae="cache",Ms=e=>`
${dn.default.bold("Examples")}
Save files to the cache under a specific ID:
${g(`${e} ${ae} set --key <record-key> --id <id> --path <path-1,path-2,...path-n>`)}
Retrieve files from the cache saved under a specific ID:
${g(`${e} ${ae} get --key <record-key> --id <id>`)}
Store the last run data in the cache:
${g(`${e} ${ae} set --key <record-key> --preset last-run`)}
Retrieve the last run data from the cache:
${g(`${e} ${ae} get --key <record-key> --preset last-run`)}
Retrieve the last run data from the cache and save it to a custom directory:
${g(`${e} ${ae} get --key <record-key> --preset last-run --output-dir <outputDir>`)}
`,ln=e=>new Ge.Command().command(ae).description(`Cache data to Currents ${Ms(e)}`).showHelpAfterError("(add --help for additional information)").allowUnknownOption().addCommand(Bs()).addCommand(ks()),Bs=()=>new Ge.Command().name("set").allowUnknownOption().addOption(at).addOption(mt).addOption(pt).addOption(Br).addOption(ct).addOption(Fr).addOption(ut).addOption(dt).addOption(jr).action(un),ks=()=>new Ge.Command().name("get").allowUnknownOption().addOption(at).addOption(mt).addOption(pt).addOption(kr).addOption(Gr).addOption(ct).addOption(ut).addOption(dt).addOption(Kr).action(pn);var bn=require("@commander-js/extra-typings"),xn=d(require("chalk"));var N=require("@commander-js/extra-typings");var fn=new N.Option("--ci-build-id <id>","the unique identifier for the recorded build (run)").env(y(O,"ciBuildId")),gn=new N.Option("-k, --key <record-key>","your secret Record Key obtained from Currents").env(y(O,"recordKey")),Cn=new N.Option("-p, --project-id <project>","the project ID for results reporting obtained from Currents").env(y(O,"projectId")),hn=new N.Option("-t, --tag <tag>","comma-separated tag(s) for recorde