@currents/cmd 1.9.9 → 1.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/bin/index.js CHANGED
@@ -1,79 +1,94 @@
1
1
  #! /usr/bin/env node
2
- "use strict";var Ii=Object.create;var re=Object.defineProperty;var _i=Object.getOwnPropertyDescriptor;var Ri=Object.getOwnPropertyNames;var Ti=Object.getPrototypeOf,hi=Object.prototype.hasOwnProperty;var Oi=(t,e)=>{for(var r in e)re(t,r,{get:e[r],enumerable:!0})},Ui=(t,e,r,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of Ri(e))!hi.call(t,n)&&n!==r&&re(t,n,{get:()=>e[n],enumerable:!(o=_i(e,n))||o.enumerable});return t};var l=(t,e,r)=>(r=t!=null?Ii(Ti(t)):{},Ui(e||!t||!t.__esModule?re(r,"default",{value:t,enumerable:!0}):r,t));var rE=require("source-map-support/register");var gi=require("@commander-js/extra-typings");var We={name:"@currents/cmd",version:"1.9.9",main:"./dist/index.js",author:{name:"Currents Software Inc",email:"hello@currents.dev"},license:"MIT",repository:{type:"git",url:"https://github.com/currents-dev/currents-reporter"},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","release-it":"^19.2.4","@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":"^25.5.0","@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","@types/xxhashjs":"^0.2.4",jest:"^29.7.0",rimraf:"^6.0.1",tsup:"^8.3.5",typescript:"^5.9.3",vitest:"^2.1.9"},dependencies:{"@commander-js/extra-typings":"^13.1.0","@currents/commit-info":"1.0.1-beta.0",archiver:"^7.0.1","async-retry":"^1.3.3",axios:"1.15.0","axios-retry":"4.5.0",chalk:"^4.1.2",commander:"^13.1.0",debug:"^4.4.0",dotenv:"^17.2.3",execa:"^9.5.1","fs-extra":"^11.3.4",getos:"^3.2.1",globby:"^11.1.0","https-proxy-agent":"^7.0.4","jest-cli":"^30.2.0","jest-config":"^30.3.0",lodash:"^4.18.1",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.5","tmp-promise":"^3.0.3","ts-pattern":"^5.8.0",unzipper:"^0.12.3",uuid:"11.1.0",xml2js:"^0.6.2",xxhashjs:"^0.2.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 at=We.version;var ve=require("@commander-js/extra-typings");var Ai=[];function oe(t){Ai.push(t)}var y=l(require("chalk")),H=l(require("util"));var ne=require("debug"),Si=l(require("fs-extra")),s=(0,ne.debug)("currents"),Pi=null;function qe(){ne.debug.enable("currents,currents:*")}function Qe(t){Pi=t}var ze=[],Xe=[];var Ot=(...t)=>{let e=H.default.format(...t);oe(e),console.log(e)},Di=(...t)=>{let e=H.default.format(...t);oe(e),console.error(e)},A=Ot,g=(...t)=>{let e=H.default.format(...t);return Xe.push(e),s("WARNING: ",e),Ot(y.default.bgYellow.black(" WARNING "),e)},Z=(...t)=>{let e=H.default.format(...Ze(t));return s("WARNING: ",H.default.format(...t)),Ot(y.default.bgYellow.black(" WARNING "),e)},Ut=(...t)=>Ot(y.default.green.bold(H.default.format(...t))),E=(...t)=>{let e=H.default.format(...Ze(t));return ze.push(e),s("ERROR: ",H.default.format(...t)),Di(y.default.bgRed.white(" ERROR "),e)};var Ze=t=>t.map(e=>e instanceof Error?e.message:e),yt=(t=2)=>console.log(Array(t).fill("").join(`
3
- `)),Ns=y.default.cyan,Ls=y.default.blueBright,Bs=y.default.red,Ms=y.default.yellow,vs=y.default.green,Fs=y.default.gray,Gs=y.default.white,ks=y.default.black,Hs=y.default.magenta,C=y.default.dim,Ks=y.default.bold;var In=l(require("chalk"));function tr(t,e){if(!t)return t;let r={...t};return e.forEach(o=>{r.hasOwnProperty(o)&&(r[o]="*****")}),r}function At(t){return tr(t,["apiKey"])}function T(t){return tr(t,["recordKey","key"])}var st=class extends Error{};var F=l(require("fs-extra")),gt=require("path"),er=require("uuid");async function tt(t){try{return await F.default.readJson(t)}catch(e){throw E("Error while reading JSON file: %s",t,e),E}}async function et(t,e){try{return await F.default.writeFile(t,e,"utf8"),t}catch(r){throw E(`Error writing file at ${t}:`,r),r}}async function Et(t,e){try{try{return await F.default.access(t),t}catch{return await F.default.writeFile(t,e,"utf8"),t}}catch(r){throw E(`Error writing file at ${t}:`,r),r}}async function rr(t,e){if(e){await F.default.ensureDir(t);return}let r=(0,gt.dirname)(t);await F.default.ensureDir(r)}function bi(){let t=new Date().toISOString().replace(/[:.]/g,"-"),e=(0,er.v4)();return`${t}-${e}`}async function or(t,e){let r=bi(),o=(0,gt.join)(t,e,r);return Ct(o)}async function Ct(t){try{return await F.default.ensureDir(t),s("Folder created",t),t}catch(e){throw E(`Failed to create folder at ${t}:`,e),e}}async function nr(t,e){try{return await F.default.ensureDir((0,gt.dirname)(e)),await F.default.copy(t,e),s("File copied from %s to %s",t,e),e}catch(r){throw E(`Failed to copy file from ${t} to ${e}:`,r),r}}var ir=l(require("crypto"));function rt(t){return ir.createHash("sha256").update(t).digest("base64").slice(0,8).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}var St={};Oi(St,{getNanoid:()=>xi,userFacingNanoid:()=>ae});var ie=require("nanoid"),ar="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",xi=(t=16)=>(0,ie.customAlphabet)(ar,t)(),ae=(0,ie.customAlphabet)(ar,12);function sr(t){return Object.entries(t??{}).reduce((e,[r,o])=>o===void 0?e:{...e,[r]:o},{})}function h(t,e){return"env"in t[e]&&t[e].env?t[e].env:""}function Ni(t,e){return t[e].cli}function Li(t,e){return t[e].name}function K(t,e,r,o,n){let a={...sr(o),...sr(r())};return e.forEach(c=>{if(!a[c])throw E(`${Li(t,c)} is required for Currents Reporter. Use the following methods to set the value:
4
- - as environment variable: ${C(h(t,c))}
5
- - as CLI flag of the command: ${C(Ni(t,c))}`),new st("Missing required config variable")}),typeof n=="function"&&n(a),a}var Bi={apiKey:{name:"Api Key",env:"CURRENTS_API_KEY",cli:"--api-key"},debug:{name:"Debug",env:"CURRENTS_DEBUG",cli:"--debug"}},Mi={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"}},j={...Bi,...Mi};function cr(){return{apiKey:process.env[j.apiKey.env],debug:!!process.env[j.debug.env]}}var vi=s.extend("config"),Fi=["apiKey","projectId"],Gi=t=>{let{ciBuildId:e,tag:r,branch:o}=t;if(!([e,r,o].filter(Boolean).length===1||r&&o&&!e))throw E('"ciBuildId", "tag", "branch" or a combination of "tag" and "branch" are expected to be provided'),new st("Missing or invalid parameters")},se=null;function pr(t){se=K(j,Fi,cr,t,Gi),vi("Resolved config: %o",At(se))}function Pt(){return se}var Fr=require("fs/promises");var Sr=l(require("lodash"));var Cr=l(require("axios")),Ir=l(require("axios-retry")),_r=l(require("lodash"));var mr=()=>process.env.CURRENTS_API_URL??"https://cy.currents.dev",ur=()=>process.env.CURRENTS_REST_API_URL??"https://api.currents.dev",dr=()=>3e4;var ce=require("axios"),pe=l(require("pretty-ms"));var lr=s.extend("http"),Dt=t=>[3*1e3,15*1e3,30*1e3][t-1],fr=t=>(lr("isRetriableError: %o",{message:t.message,code:"code"in t?t.code:void 0,status:"response"in t?t.response?.status:void 0,headers:"response"in t?t.response?.headers:void 0,data:"response"in t?t.response?.data:void 0,isAxiosError:(0,ce.isAxiosError)(t)}),"code"in t&&t.code&&["ECONNABORTED","ECONNREFUSED","ECONNRESET","ETIMEDOUT","ENETRESET"].includes(t.code)?!0:(0,ce.isAxiosError)(t)?[429,502,503,504].includes(t.response?.status??0):!1),wt=()=>3;function gr(t,e,r){lr("Network request '%s' failed: '%s'. Next attempt is in %s (%d/%d).",`${r.method?.toUpperCase()} ${r.url}`,e.message,(0,pe.default)(Dt(t)),t,wt()),g("Network request '%s' failed: '%s'. Next attempt is in %s (%d/%d).",`${r.method?.toUpperCase()} ${r.url}`,e.message,(0,pe.default)(Dt(t)),t,wt())}var me=s.extend("http");var ue={api:null,restApi:null};function ki(t){let e=t==="api"?mr():ur();me("client base url: %s",e);let r=Cr.default.create({baseURL:e,timeout:dr(),transitional:{clarifyTimeoutError:!0}});return r.interceptors.request.use(o=>{let n=o["axios-retry"]?.retryCount??0;o.headers.set({"x-cmd-version":at}),o.headers.get("Content-Type")||o.headers.set("Content-Type","application/json");let a={..._r.default.pick(o,"method","url","headers"),baseURL:e,data:Buffer.isBuffer(o.data)?"buffer":o.data,params:o.params};return n?me("network request retry: %o",Er({...a,baseURL:e,isRetry:!0})):me("network request: %o",Er(a)),o}),(0,Ir.default)(r,{retries:wt(),retryCondition:fr,retryDelay:Dt,shouldResetTimeout:!0,onRetry:gr}),r}function Rr(t){return ue[t]===null&&(ue[t]=ki(t)),ue[t]}function Er(t){return{method:t.method,baseURL:t.baseURL,url:t.url,data:t.isRetry?"<retry>":Hi(t.data),params:t.isRetry?"<retry>":t.params,headers:{...t.headers,Authorization:"Bearer ***","x-currents-key":"***"}}}function Hi(t){return t?.results?.raw?{...t,results:{...t.results,raw:"***"}}:t}var Or=require("axios"),Ur=l(require("lodash")),S=require("ts-pattern");function yr(t){(0,S.match)(t).when(Or.isAxiosError,Ki).otherwise(()=>{g("Unexpected error while sending network request: %s",t)})}function Ki(t){return(0,S.match)(t).with({code:"ECONNABORTED"},()=>{g("Network connection aborted")}).with({code:"ECONNREFUSED"},()=>{g("Network connection aborted")}).with({code:"ECONNRESET"},()=>{g("Network connection reset")}).with({code:"ETIMEDOUT"},()=>{g("Network connection timeout")}).with({response:S.P.not(S.P.nullish)},e=>{ji(e,{status:e.response.status,data:e.response.data})}).otherwise(e=>{g(`[currents] Unexpected network error: %s
6
- %O`,t.message,{method:t.response?.config.method,url:t.response?.config.url,status:t.response?.status,payload:t.response?.config.data})})}function ji(t,{status:e,data:r}){(0,S.match)(e).with(401,()=>{g(`[currents] ${t.response?.config.method} ${t.response?.config.url}} - 401 Unauthorized Request from cloud service`)}).with(400,()=>{g(`[currents] ${t.response?.config.method} ${t.response?.config.url} - 400 Bad Request from cloud service:
7
- %o`,r)}).with(404,()=>{g(`[currents] ${t.response?.config.method} ${t.response?.config.url} - 404 Not Found from cloud service`)}).with(429,()=>{g(`[currents] ${t.response?.config.method} ${t.response?.config.url} - 429 Too Many Requests from cloud service`)}).with(422,()=>{$i(t,r)}).otherwise(()=>{g(`[currents] Unexpected network response: %s
8
- %O`,t.message,{method:t.response?.config.method,url:t.response?.config.url,status:t.response?.status})})}function $i(t,e){(0,S.match)(e).with({code:Tr.MISSING_SUITE,message:S.P.string,errors:S.P.array(S.P.string)},async r=>{let{message:o,errors:n}=r;yt(1),E(...hr(o,n))}).with({code:Tr.RUN_EXPIRED,message:S.P.string},r=>{g(r.message)}).with({message:S.P.string,errors:S.P.array(S.P.string)},r=>{let{message:o,errors:n}=r;yt(1),g(...hr(o,n)),yt(1)}).otherwise(()=>{g(`[currents] Unexpected network response: %s
9
- %O`,t.message,{method:t.response?.config.method,url:t.response?.config.url,status:t.response?.status})})}var Tr={RUN_CANCELLED:"RUN_CANCELLED",RUN_EXPIRED:"RUN_EXPIRED",MISSING_SUITE:"MISSING_SUITE"};function hr(t,e){return Ur.default.isString(t)?e?.length===0?[t]:[t,`
10
- ${(e??[]).map(r=>` - ${r}`).join(`
2
+ "use strict";var ki=Object.create;var st=Object.defineProperty;var Gi=Object.getOwnPropertyDescriptor;var Hi=Object.getOwnPropertyNames;var Ki=Object.getPrototypeOf,ji=Object.prototype.hasOwnProperty;var $i=(e,t)=>{for(var r in t)st(e,r,{get:t[r],enumerable:!0})},Vi=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Hi(t))!ji.call(e,n)&&n!==r&&st(e,n,{get:()=>t[n],enumerable:!(o=Gi(t,n))||o.enumerable});return e};var d=(e,t,r)=>(r=e!=null?ki(Ki(e)):{},Vi(t||!e||!e.__esModule?st(r,"default",{value:e,enumerable:!0}):r,e));var _C=require("source-map-support/register");var vi=require("@commander-js/extra-typings");var nr={name:"@currents/cmd",version:"1.10.0",main:"./dist/index.js",author:{name:"Currents Software Inc",email:"hello@currents.dev"},license:"MIT",repository:{type:"git",url:"https://github.com/currents-dev/currents-reporter"},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":"^12.0.0","release-it":"^19.2.4","@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":"^25.5.0","@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","@types/xxhashjs":"^0.2.4",jest:"^29.7.0",rimraf:"^6.0.1",tsup:"^8.3.5",typescript:"^5.9.3",vitest:"^4.1.0"},dependencies:{"@commander-js/extra-typings":"^13.1.0","@currents/commit-info":"1.0.1-beta.0",archiver:"^7.0.1","async-retry":"^1.3.3",axios:"1.18.1","axios-retry":"4.5.0",chalk:"^4.1.2",commander:"^13.1.0",debug:"^4.4.0",dotenv:"^17.4.2",execa:"^9.5.1","fs-extra":"^11.3.4",getos:"^3.2.1",globby:"^11.1.0","https-proxy-agent":"^7.0.4","jest-cli":"^30.2.0","jest-config":"^30.3.0",lodash:"^4.18.1",nanoid:"^3.3.8","pretty-ms":"^7.0.1","proxy-from-env":"^1.1.0",semver:"^7.8.5","source-map-support":"^0.5.21",tmp:"^0.2.7","tmp-promise":"^3.0.3","ts-pattern":"^5.8.0",unzipper:"^0.12.3",uuid:"11.1.1",xml2js:"^0.6.2",xxhashjs:"^0.2.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 ce=nr.version;var Yt=require("@commander-js/extra-typings");var Ji=[];function ct(e){Ji.push(e)}var S=d(require("chalk")),$=d(require("util"));var pt=require("debug"),Wi=d(require("fs-extra")),a=(0,pt.debug)("currents"),qi=null;function ir(){pt.debug.enable("currents,currents:*")}function ar(e){qi=e}var sr=[],cr=[];var Ue=(...e)=>{let t=$.default.format(...e);ct(t),console.log(t)},Qi=(...e)=>{let t=$.default.format(...e);ct(t),console.error(t)},y=Ue,C=(...e)=>{let t=$.default.format(...e);return cr.push(t),a("WARNING: ",t),Ue(S.default.bgYellow.black(" WARNING "),t)},te=(...e)=>{let t=$.default.format(...pr(e));return a("WARNING: ",$.default.format(...e)),Ue(S.default.bgYellow.black(" WARNING "),t)},Ae=(...e)=>Ue(S.default.green.bold($.default.format(...e))),E=(...e)=>{let t=$.default.format(...pr(e));return sr.push(t),a("ERROR: ",$.default.format(...e)),Qi(S.default.bgRed.white(" ERROR "),t)};var pr=e=>e.map(t=>t instanceof Error?t.message:t),Se=(e=2)=>console.log(Array(e).fill("").join(`
3
+ `)),nc=S.default.cyan,ic=S.default.blueBright,ac=S.default.red,sc=S.default.yellow,cc=S.default.green,pc=S.default.gray,mc=S.default.white,uc=S.default.black,dc=S.default.magenta,g=S.default.dim,lc=S.default.bold;var wn=d(require("chalk"));function mr(e,t){if(!e)return e;let r={...e};return t.forEach(o=>{r.hasOwnProperty(o)&&(r[o]="*****")}),r}function Pe(e){return mr(e,["apiKey"])}function I(e){return mr(e,["recordKey","key"])}var q=class extends Error{};var H=d(require("fs-extra")),Ie=require("path"),ur=require("uuid");async function re(e){try{return await H.default.readJson(e)}catch(t){throw E("Error while reading JSON file: %s",e,t),E}}async function oe(e,t){try{return await H.default.writeFile(e,t,"utf8"),e}catch(r){throw E(`Error writing file at ${e}:`,r),r}}async function Re(e,t){try{try{return await H.default.access(e),e}catch{return await H.default.writeFile(e,t,"utf8"),e}}catch(r){throw E(`Error writing file at ${e}:`,r),r}}async function dr(e,t){if(t){await H.default.ensureDir(e);return}let r=(0,Ie.dirname)(e);await H.default.ensureDir(r)}function Xi(){let e=new Date().toISOString().replace(/[:.]/g,"-"),t=(0,ur.v4)();return`${e}-${t}`}async function lr(e,t){let r=Xi(),o=(0,Ie.join)(e,t,r);return _e(o)}async function _e(e){try{return await H.default.ensureDir(e),a("Folder created",e),e}catch(t){throw E(`Failed to create folder at ${e}:`,t),t}}async function fr(e,t){try{return await H.default.ensureDir((0,Ie.dirname)(t)),await H.default.copy(e,t),a("File copied from %s to %s",e,t),t}catch(r){throw E(`Failed to copy file from ${e} to ${t}:`,r),r}}var gr=d(require("crypto"));function ne(e){return gr.createHash("sha256").update(e).digest("base64").slice(0,8).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}var De={};$i(De,{getNanoid:()=>Zi,userFacingNanoid:()=>ut});var mt=require("nanoid"),Er="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",Zi=(e=16)=>(0,mt.customAlphabet)(Er,e)(),ut=(0,mt.customAlphabet)(Er,12);function Cr(e){return Object.entries(e??{}).reduce((t,[r,o])=>o===void 0?t:{...t,[r]:o},{})}function Ir(e){if(!(e===void 0||e.trim()===""))return!["false","0","no","off"].includes(e.trim().toLowerCase())}function R(e,t){return"env"in e[t]&&e[t].env?e[t].env:""}function we(e,t){return e[t].cli}function be(e,t){return e[t].name}function L(e,t,r,o,n){let s={...Cr(o),...Cr(r())};return t.forEach(c=>{if(!s[c])throw E(`${be(e,c)} is required for Currents Reporter. Use the following methods to set the value:
4
+ - as environment variable: ${g(R(e,c))}
5
+ - as CLI flag of the command: ${g(we(e,c))}`),new q("Missing required config variable")}),typeof n=="function"&&n(s),s}var ea={apiKey:{name:"Api Key",env:"CURRENTS_API_KEY",cli:"--api-key"},debug:{name:"Debug",env:"CURRENTS_DEBUG",cli:"--debug"}},ta={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"}},V={...ea,...ta};function Rr(){return{apiKey:process.env[V.apiKey.env],debug:!!process.env[V.debug.env]}}var ra=a.extend("config"),oa=["apiKey","projectId"],na=e=>{let{ciBuildId:t,tag:r,branch:o}=e;if(!([t,r,o].filter(Boolean).length===1||r&&o&&!t))throw E('"ciBuildId", "tag", "branch" or a combination of "tag" and "branch" are expected to be provided'),new q("Missing or invalid parameters")},dt=null;function _r(e){dt=L(V,oa,Rr,e,na),ra("Resolved config: %o",Pe(dt))}function xe(){return dt}var Wr=require("fs/promises");var Mr=d(require("lodash"));var Pr=d(require("axios")),Dr=d(require("axios-retry")),Ct=d(require("lodash"));var Tr=()=>process.env.CURRENTS_API_URL??"https://cy.currents.dev",hr=()=>process.env.CURRENTS_REST_API_URL??"https://api.currents.dev",Or=()=>3e4;var lt=require("axios"),ft=d(require("pretty-ms"));var yr=a.extend("http"),Ne=e=>[3*1e3,15*1e3,30*1e3][e-1],Ur=e=>(yr("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,lt.isAxiosError)(e)}),"code"in e&&e.code&&["ECONNABORTED","ECONNREFUSED","ECONNRESET","ETIMEDOUT","ENETRESET"].includes(e.code)?!0:(0,lt.isAxiosError)(e)?[429,502,503,504].includes(e.response?.status??0):!1),Be=()=>3;function Ar(e,t,r){yr("Network request '%s' failed: '%s'. Next attempt is in %s (%d/%d).",`${r.method?.toUpperCase()} ${r.url}`,t.message,(0,ft.default)(Ne(e)),e,Be()),C("Network request '%s' failed: '%s'. Next attempt is in %s (%d/%d).",`${r.method?.toUpperCase()} ${r.url}`,t.message,(0,ft.default)(Ne(e)),e,Be())}var gt=a.extend("http");var Et={api:null,restApi:null};function ia(e){let t=e==="api"?Tr():hr();gt("client base url: %s",t);let r=Pr.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":ce}),o.headers.get("Content-Type")||o.headers.set("Content-Type","application/json");let s={...Ct.default.pick(o,"method","url","headers"),baseURL:t,data:Buffer.isBuffer(o.data)?"buffer":o.data,params:o.params};return n?gt("network request retry: %o",Sr({...s,baseURL:t,isRetry:!0})):gt("network request: %o",Sr(s)),o}),(0,Dr.default)(r,{retries:Be(),retryCondition:Ur,retryDelay:Ne,shouldResetTimeout:!0,onRetry:Ar}),r}function wr(e){return Et[e]===null&&(Et[e]=ia(e)),Et[e]}function Sr(e){return{method:e.method,baseURL:e.baseURL,url:e.url,data:e.isRetry?"<retry>":aa(e.data),params:e.isRetry?"<retry>":e.params,headers:{...e.headers,Authorization:"Bearer ***","x-currents-key":"***"}}}function aa(e){return e?.results?.raw?I({...e,results:{...e.results,raw:"***"}}):Ct.default.isPlainObject(e)?I(e):e}var Nr=require("axios"),Br=d(require("lodash")),P=require("ts-pattern");function Lr(e){(0,P.match)(e).when(Nr.isAxiosError,sa).otherwise(()=>{C("Unexpected error while sending network request: %s",e)})}function sa(e){return(0,P.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:P.P.not(P.P.nullish)},t=>{ca(t,{status:t.response.status,data:t.response.data})}).otherwise(t=>{C(`[currents] Unexpected network error: %s
6
+ %O`,e.message,{method:e.response?.config.method,url:e.response?.config.url,status:e.response?.status,payload:e.response?.config.data})})}function ca(e,{status:t,data:r}){(0,P.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:
7
+ %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,()=>{pa(e,r)}).otherwise(()=>{C(`[currents] Unexpected network response: %s
8
+ %O`,e.message,{method:e.response?.config.method,url:e.response?.config.url,status:e.response?.status})})}function pa(e,t){(0,P.match)(t).with({code:br.MISSING_SUITE,message:P.P.string,errors:P.P.array(P.P.string)},async r=>{let{message:o,errors:n}=r;Se(1),E(...xr(o,n))}).with({code:br.RUN_EXPIRED,message:P.P.string},r=>{C(r.message)}).with({message:P.P.string,errors:P.P.array(P.P.string)},r=>{let{message:o,errors:n}=r;Se(1),C(...xr(o,n)),Se(1)}).otherwise(()=>{C(`[currents] Unexpected network response: %s
9
+ %O`,e.message,{method:e.response?.config.method,url:e.response?.config.url,status:e.response?.status})})}var br={RUN_CANCELLED:"RUN_CANCELLED",RUN_EXPIRED:"RUN_EXPIRED",MISSING_SUITE:"MISSING_SUITE"};function xr(e,t){return Br.default.isString(e)?t?.length===0?[e]:[e,`
10
+ ${(t??[]).map(r=>` - ${r}`).join(`
11
11
  `)}
12
- `]:["Unexpected network error"]}var Ar=s.extend("http");async function J(t,e,r=Rr){try{let o=await r(t).request(e);return Ar("network response: %o",{...Sr.default.omit(o,"request","config"),url:o.config.url,method:o.config.method}),o}catch(o){let n=o;throw Ar("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}),yr(n),n}}var ct=s.extend("api");async function Dr(t){try{return ct("Request params: %o",T(t)),J("api",{url:"cache/upload",method:"POST",data:t}).then(e=>e.data)}catch(e){throw ct("Failed to create cache:",e),e}}async function wr(t){try{return ct("Request params: %o",t),J("api",{url:"cache/v2/download",method:"POST",data:t}).then(e=>e.data)}catch(e){throw ct("Failed to retrieve cache:",e),e}}async function br(t){try{return ct("Request params: %o",t),J("api",{url:"cache/meta",method:"POST",data:t}).then(e=>e.data)}catch(e){throw ct("Failed to retrieve reference cache meta:",e),e}}var Nr=require("util"),Lr=require("zlib");var xr=s.extend("api"),Vi=(0,Nr.promisify)(Lr.gzip);async function Br(t){try{xr("Run params: %o",T(t));let e=await Yi(JSON.stringify(t));return J("api",{url:"v1/runs",method:"POST",headers:{"Content-Type":"application/json","Content-Encoding":"gzip"},data:e}).then(r=>r.data)}catch(e){throw xr("Failed to create the run:",e),e}}async function Yi(t){try{return await Vi(t)}catch(e){throw E("Failed to compress run payload:",e),e}}var Mr=s.extend("api");async function vr(t,e){try{return Mr("Run params: %o",e),J("restApi",{url:"v1/runs/find",params:e,method:"GET",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t}`}}).then(r=>r.data)}catch(r){throw Mr("Failed to obtain run data:",r),r}}async function de(){try{let t=Pt();if(!t)throw new Error("Config is missing!");let e=t.ciBuildId?{projectId:t.projectId,ciBuildId:t.ciBuildId,pwLastRun:t.pwLastRun}:{projectId:t.projectId,branch:t.branch,tag:t.tag,pwLastRun:t.pwLastRun},r=await vr(t.apiKey,e);await Ji(t.pwLastRun&&r.data.pwLastRun?r.data.pwLastRun:r.data,t)}catch(t){throw s("Failed to get run data"),t}}async function Ji(t,e){let r=JSON.stringify(t,null,2);e.output?(await rr(e.output),await(0,Fr.writeFile)(e.output,r,"utf-8"),A(`Successfully written to ${e.output}`)):A(r)}var Uo=require("axios"),Pe=l(require("path"));var P=require("@commander-js/extra-typings");var Wi={recordKey:{name:"Record Key",env:"CURRENTS_RECORD_KEY",cli:"--key"},debug:{name:"Debug",env:"CURRENTS_DEBUG",cli:"--debug"}},qi={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"}},Qi={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"}},W={...Wi,...qi,...Qi};function le(){return{recordKey:process.env[W.recordKey.env],debug:process.env[W.debug.env]}}var Gr=s.extend("config"),kr=["recordKey"],ot;function Hr(t){ot={type:"SET_COMMAND_CONFIG",values:K(W,kr,le,t)},Gr("Resolved config: %o",{...ot,values:T(ot.values)})}function Kr(t){ot={type:"GET_COMMAND_CONFIG",values:K(W,kr,le,t)},Gr("Resolved config: %o",{...ot,values:T(ot.values)})}function q(){return ot}function jr(t){return{recordKey:t.key,id:t.id,preset:t.preset,outputDir:t.outputDir,presetOutput:t.presetOutput,debug:t.debug,matrixIndex:t.matrixIndex,matrixTotal:t.matrixTotal,continue:t.continue}}function $r(t){return{recordKey:t.key,id:t.id,preset:t.preset,pwOutputDir:t.pwOutputDir,path:t.path,debug:t.debug,matrixIndex:t.matrixIndex,matrixTotal:t.matrixTotal,continue:t.continue}}var Vr=require("@commander-js/extra-typings");function pt(t,e=[]){return t?e.concat(t.split(",").map(r=>r.trim())):e}async function G(t,e){try{e.debug&&qe(),await t(e),process.exit(0)}catch(r){E(r.message);let o=r instanceof Vr.CommanderError?r.exitCode:1;process.exit(o)}}var fe=new P.Option("-k, --key <record-key>","Your secret Record Key obtained from Currents").env(h(W,"recordKey")),ge=new P.Option("--debug","Enable debug logging").env(h(W,"debug")).default(!1),Ee=new P.Option("--id <id>","The ID the data is saved under in the cache"),Yr=new P.Option("--path <path>",'Comma-separated list of paths to cache, enquote for globs e.g. "dist/**/*"').argParser(pt),bt=(e=>(e.lastRun="last-run",e))(bt||{}),Ce=new P.Option("--preset <preset-name>",'A set of predefined options. Use "last-run" to get the last run data').choices(Object.values(bt)),Jr=new P.Option("--output-dir <dir>","Path to the directory where output will be written"),Wr=new P.Option("--pw-output-dir <dir>","Directory for artifacts produced by Playwright tests").default("test-results"),It=".currents_env",qr=new P.Option("--preset-output <path>","Path to the file containing the preset output").default(It),Ie=new P.Option("--matrix-index <number>","The index of the matrix to use").default(1).argParser(Qr),_e=new P.Option("--matrix-total <number>","The total number of matrices available").default(1).argParser(Qr);function Qr(t){let e=parseInt(t,10);if(isNaN(e)||e<=0||!Number.isInteger(e))throw new P.InvalidArgumentError("A positive integer is expected.");return e}var zr=new P.Option("--continue","Continue the script execution if the cache is not found").default(!1),Xr=new P.Option("--continue","Continue the script execution if upload paths are not found").default(!1);var R=require("lodash");var xt=s.extend("ci"),zi=(t,...e)=>(0,R.chain)(e).compact().join(t).value(),Xi=(t,e)=>(0,R.set)(t,(0,R.camelCase)(e),process.env[e]),O=t=>(0,R.transform)(t,Xi,{}),Zi=()=>process.env.TF_BUILD&&process.env.AZURE_HTTP_USER_AGENT,ta=()=>(0,R.some)(process.env,(t,e)=>/^CODEBUILD_/.test(e)),ea=()=>process.env.bamboo_buildNumber,ra=()=>(0,R.some)(process.env,(t,e)=>/^CONCOURSE_/.test(e)),oa=()=>process.env.GITLAB_CI||process.env.CI_SERVER_NAME&&/^GitLab/.test(process.env.CI_SERVER_NAME),na=()=>!!(process.env.BUILD_ID&&process.env.PROJECT_ID&&process.env.PROJECT_NUMBER||process.env.GCP_PROJECT||process.env.GCLOUD_PROJECT||process.env.GOOGLE_CLOUD_PROJECT),ia=()=>process.env.JENKINS_URL||process.env.JENKINS_HOME||process.env.JENKINS_VERSION||process.env.HUDSON_URL||process.env.HUDSON_HOME,aa={appveyor:"APPVEYOR",azure:Zi,awsCodeBuild:ta,bamboo:ea,bitbucket:"BITBUCKET_BUILD_NUMBER",buildkite:"BUILDKITE",circle:"CIRCLECI",concourse:ra,codeFresh:"CF_BUILD_ID",drone:"DRONE",githubActions:"GITHUB_ACTIONS",gitlab:oa,goCD:"GO_JOB_NAME",jenkins:ia,googleCloud:na,semaphore:"SEMAPHORE",teamcity:"TEAMCITY_VERSION",travis:"TRAVIS",netlify:"NETLIFY"};function sa(){let{env:t}=process;return(0,R.findKey)(aa,e=>{if((0,R.isString)(e))return t[e];if((0,R.isFunction)(e))return e()})}var Zr=()=>({appveyor:O(["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:O(["AGENT_BUILDDIRECTORY","AGENT_ID","AGENT_JOBNAME","AGENT_JOBSTATUS","AGENT_MACHINENAME","AGENT_NAME","AGENT_OS","AGENT_OSARCHITECTURE","BUILD_BUILDID","BUILD_BUILDNUMBER","BUILD_BUILDURI","BUILD_CONTAINERID","BUILD_CRONSCHEDULE_DISPLAYNAME","BUILD_DEFINITIONNAME","BUILD_DEFINITIONVERSION","BUILD_QUEUEDBY","BUILD_QUEUEDBYID","BUILD_REASON","BUILD_REPOSITORY_ID","BUILD_REPOSITORY_NAME","BUILD_REPOSITORY_PROVIDER","BUILD_REPOSITORY_URI","BUILD_REQUESTEDFOR","BUILD_REQUESTEDFOREMAIL","BUILD_REQUESTEDFORID","BUILD_SOURCEBRANCH","BUILD_SOURCEBRANCHNAME","BUILD_SOURCESDIRECTORY","BUILD_SOURCEVERSION","BUILD_SOURCEVERSIONAUTHOR","BUILD_SOURCEVERSIONMESSAGE","BUILD_STAGINGDIRECTORY","BUILD_TRIGGEREDBY_BUILDID","BUILD_TRIGGEREDBY_BUILDNUMBER","BUILD_TRIGGEREDBY_DEFINITIONID","BUILD_TRIGGEREDBY_DEFINITIONNAME","BUILD_TRIGGEREDBY_PROJECTID","COMMON_TESTRESULTSDIRECTORY","PIPELINE_WORKSPACE","SYSTEM_COLLECTIONID","SYSTEM_COLLECTIONURI","SYSTEM_DEFAULTWORKINGDIRECTORY","SYSTEM_DEFINITIONID","SYSTEM_HOSTTYPE","SYSTEM_JOBATTEMPT","SYSTEM_JOBDISPLAYNAME","SYSTEM_JOBID","SYSTEM_JOBNAME","SYSTEM_PHASEATTEMPT","SYSTEM_PHASEDISPLAYNAME","SYSTEM_PHASENAME","SYSTEM_PLANID","SYSTEM_PULLREQUEST_ISFORK","SYSTEM_PULLREQUEST_PULLREQUESTID","SYSTEM_PULLREQUEST_PULLREQUESTNUMBER","SYSTEM_PULLREQUEST_SOURCEREPOSITORYURI","SYSTEM_PULLREQUEST_SOURCEBRANCH","SYSTEM_PULLREQUEST_SOURCECOMMITID","SYSTEM_PULLREQUEST_TARGETBRANCH","SYSTEM_PULLREQUEST_TARGETBRANCHNAME","SYSTEM_STAGEATTEMPT","SYSTEM_STAGEDISPLAYNAME","SYSTEM_STAGENAME","SYSTEM_TEAMFOUNDATIONCOLLECTIONURI","SYSTEM_TEAMPROJECT","SYSTEM_TEAMPROJECTID","SYSTEM_TIMELINEID"]),awsCodeBuild:O(["AWS_DEFAULT_REGION","AWS_REGION","CODEBUILD_BATCH_BUILD_IDENTIFIER","CODEBUILD_BUILD_ARN","CODEBUILD_BUILD_ID","CODEBUILD_BUILD_IMAGE","CODEBUILD_BUILD_NUMBER","CODEBUILD_BUILD_SUCCEEDING","CODEBUILD_BUILD_URL","CODEBUILD_INITIATOR","CODEBUILD_PROJECT_ARN","CODEBUILD_PUBLIC_BUILD_URL","CODEBUILD_RESOLVED_SOURCE_VERSION","CODEBUILD_SOURCE_REPO_URL","CODEBUILD_SOURCE_VERSION","CODEBUILD_SRC_DIR","CODEBUILD_START_TIME","CODEBUILD_WEBHOOK_ACTOR_ACCOUNT_ID","CODEBUILD_WEBHOOK_BASE_REF","CODEBUILD_WEBHOOK_EVENT","CODEBUILD_WEBHOOK_HEAD_REF","CODEBUILD_WEBHOOK_MERGE_COMMIT","CODEBUILD_WEBHOOK_PREV_COMMIT","CODEBUILD_WEBHOOK_TRIGGER","CODEBUILD_WEBHOOK_LABEL","CODEBUILD_WEBHOOK_RUN_ID","CODEBUILD_WEBHOOK_JOB_ID","CODEBUILD_WEBHOOK_WORKFLOW_NAME","CODEBUILD_RUNNER_OWNER","CODEBUILD_RUNNER_REPO","CODEBUILD_RUNNER_REPO_DOMAIN","CODEBUILD_RUNNER_WITH_BUILDSPEC"]),bamboo:O(["bamboo_buildNumber","bamboo_buildResultsUrl","bamboo_planRepository_repositoryUrl","bamboo_buildKey"]),bitbucket:O(["CI","BITBUCKET_WORKSPACE","BITBUCKET_REPO_SLUG","BITBUCKET_REPO_UUID","BITBUCKET_REPO_FULL_NAME","BITBUCKET_REPO_IS_PRIVATE","BITBUCKET_REPO_OWNER","BITBUCKET_REPO_OWNER_UUID","BITBUCKET_PROJECT_KEY","BITBUCKET_PROJECT_UUID","BITBUCKET_BUILD_NUMBER","BITBUCKET_PIPELINE_UUID","BITBUCKET_STEP_UUID","BITBUCKET_STEP_RUN_NUMBER","BITBUCKET_STEP_TRIGGERER_UUID","BITBUCKET_PARALLEL_STEP","BITBUCKET_PARALLEL_STEP_COUNT","BITBUCKET_CLONE_DIR","BITBUCKET_COMMIT","BITBUCKET_BRANCH","BITBUCKET_TAG","BITBUCKET_BOOKMARK","BITBUCKET_GIT_HTTP_ORIGIN","BITBUCKET_GIT_SSH_ORIGIN","BITBUCKET_PR_ID","BITBUCKET_PR_DESTINATION_BRANCH","BITBUCKET_PR_DESTINATION_COMMIT","BITBUCKET_DEPLOYMENT_ENVIRONMENT","BITBUCKET_DEPLOYMENT_ENVIRONMENT_UUID","BITBUCKET_EXIT_CODE"]),buildkite:O(["BUILDKITE_ORGANIZATION_SLUG","BUILDKITE_PIPELINE_ID","BUILDKITE_PIPELINE_NAME","BUILDKITE_PIPELINE_SLUG","BUILDKITE_PIPELINE_DEFAULT_BRANCH","BUILDKITE_REPO","BUILDKITE_SOURCE","BUILDKITE_BRANCH","BUILDKITE_TAG","BUILDKITE_COMMIT","BUILDKITE_MESSAGE","BUILDKITE_BUILD_AUTHOR","BUILDKITE_BUILD_AUTHOR_EMAIL","BUILDKITE_JOB_ID","BUILDKITE_BUILD_ID","BUILDKITE_BUILD_URL","BUILDKITE_BUILD_NUMBER","BUILDKITE_LABEL","BUILDKITE_COMMAND","BUILDKITE_STEP_ID","BUILDKITE_STEP_KEY","BUILDKITE_PARALLEL_JOB","BUILDKITE_PARALLEL_JOB_COUNT","BUILDKITE_RETRY_COUNT","BUILDKITE_COMPUTE_TYPE","BUILDKITE_CLUSTER_NAME","BUILDKITE_PULL_REQUEST","BUILDKITE_PULL_REQUEST_REPO","BUILDKITE_PULL_REQUEST_BASE_BRANCH","BUILDKITE_PULL_REQUEST_DRAFT","BUILDKITE_PULL_REQUEST_LABELS","BUILDKITE_MERGE_QUEUE_BASE_BRANCH","BUILDKITE_MERGE_QUEUE_BASE_COMMIT","BUILDKITE_REBUILT_FROM_BUILD_ID","BUILDKITE_REBUILT_FROM_BUILD_NUMBER","BUILDKITE_TRIGGERED_FROM_BUILD_ID","BUILDKITE_TRIGGERED_FROM_BUILD_NUMBER","BUILDKITE_TRIGGERED_FROM_BUILD_PIPELINE_SLUG"]),circle:O(["CI","CIRCLECI","CIRCLE_BRANCH","CIRCLE_BUILD_NUM","CIRCLE_BUILD_URL","CIRCLE_PREVIOUS_BUILD_NUM","CIRCLE_JOB","CIRCLE_WORKFLOW_ID","CIRCLE_WORKFLOW_JOB_ID","CIRCLE_WORKFLOW_WORKSPACE_ID","CIRCLE_PIPELINE_ID","CIRCLE_ORGANIZATION_ID","CIRCLE_PROJECT_ID","CIRCLE_PROJECT_REPONAME","CIRCLE_PROJECT_USERNAME","CIRCLE_REPOSITORY_URL","CIRCLE_WORKING_DIRECTORY","CIRCLE_SHA1","CIRCLE_TAG","CIRCLE_USERNAME","CIRCLE_NODE_INDEX","CIRCLE_NODE_TOTAL","CIRCLE_PR_NUMBER","CIRCLE_PR_REPONAME","CIRCLE_PR_USERNAME","CIRCLE_PULL_REQUEST","CIRCLE_PULL_REQUESTS","CI_PULL_REQUEST"]),concourse:O(["BUILD_ID","BUILD_NAME","BUILD_JOB_NAME","BUILD_PIPELINE_NAME","BUILD_TEAM_NAME","ATC_EXTERNAL_URL"]),codeFresh:O(["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:O(["DRONE_BUILD_LINK","DRONE_BUILD_NUMBER","DRONE_PULL_REQUEST"]),githubActions:O(["CI","GITHUB_ACTIONS","GITHUB_WORKFLOW","GITHUB_WORKFLOW_REF","GITHUB_WORKFLOW_SHA","GITHUB_ACTION","GITHUB_ACTION_PATH","GITHUB_ACTION_REPOSITORY","GITHUB_JOB","GITHUB_EVENT_NAME","GITHUB_EVENT_PATH","GITHUB_RUN_ID","GITHUB_RUN_NUMBER","GITHUB_RUN_ATTEMPT","GITHUB_REPOSITORY","GITHUB_REPOSITORY_ID","GITHUB_REPOSITORY_OWNER","GITHUB_REPOSITORY_OWNER_ID","GITHUB_REF","GITHUB_REF_NAME","GITHUB_REF_TYPE","GITHUB_REF_PROTECTED","GITHUB_BASE_REF","GITHUB_HEAD_REF","GITHUB_SHA","GITHUB_ACTOR","GITHUB_ACTOR_ID","GITHUB_TRIGGERING_ACTOR","GITHUB_SERVER_URL","GITHUB_API_URL","GITHUB_GRAPHQL_URL","GITHUB_WORKSPACE","GITHUB_RETENTION_DAYS","RUNNER_OS","RUNNER_ARCH","RUNNER_NAME","RUNNER_ENVIRONMENT","RUNNER_DEBUG"]),gitlab:O(["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","CI_MERGE_REQUEST_IID","CI_MERGE_REQUEST_PROJECT_URL","CI_MERGE_REQUEST_TITLE","CI_MERGE_REQUEST_SOURCE_BRANCH_NAME","CI_MERGE_REQUEST_TARGET_BRANCH_NAME","CI_OPEN_MERGE_REQUESTS"]),goCD:O(["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:O(["BUILD_ID","PROJECT_ID","REPO_NAME","BRANCH_NAME","TAG_NAME","COMMIT_SHA","SHORT_SHA"]),jenkins:O(["BRANCH_NAME","BUILD_DISPLAY_NAME","BUILD_ID","BUILD_NUMBER","BUILD_TAG","BUILD_URL","CHANGE_AUTHOR","CHANGE_AUTHOR_DISPLAY_NAME","CHANGE_AUTHOR_EMAIL","CHANGE_BRANCH","CHANGE_FORK","CHANGE_ID","CHANGE_TARGET","CHANGE_TITLE","CHANGE_URL","CI","EXECUTOR_NUMBER","JAVA_HOME","JENKINS_HOME","JENKINS_URL","JOB_BASE_NAME","JOB_NAME","JOB_URL","NODE_LABELS","NODE_NAME","RUN_ARTIFACTS_DISPLAY_URL","RUN_CHANGES_DISPLAY_URL","TAG_NAME","WORKSPACE","WORKSPACE_TMP","GIT_AUTHOR_EMAIL","GIT_AUTHOR_NAME","GIT_BRANCH","GIT_COMMIT","GIT_COMMITTER_EMAIL","GIT_COMMITTER_NAME","GIT_LOCAL_BRANCH","GIT_PREVIOUS_COMMIT","GIT_PREVIOUS_SUCCESSFUL_COMMIT","GIT_URL","ghprbActualCommit","ghprbGhRepository","ghprbPullId","ghprbPullLink","ghprbSourceBranch","ghprbTargetBranch","ghprbTriggerAuthorLogin"]),semaphore:O(["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"]),teamcity:null,travis:O(["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"]),netlify:O(["BUILD_ID","CONTEXT","URL","DEPLOY_URL","DEPLOY_PRIME_URL","DEPLOY_ID"])}),ca=()=>{let{env:t}=process;return{appveyor:{sha:t.APPVEYOR_REPO_COMMIT,branch:t.APPVEYOR_PULL_REQUEST_HEAD_REPO_BRANCH||t.APPVEYOR_REPO_BRANCH,message:zi(`
13
- `,t.APPVEYOR_REPO_COMMIT_MESSAGE,t.APPVEYOR_REPO_COMMIT_MESSAGE_EXTENDED),authorName:t.APPVEYOR_REPO_COMMIT_AUTHOR,authorEmail:t.APPVEYOR_REPO_COMMIT_AUTHOR_EMAIL},awsCodeBuild:{sha:t.CODEBUILD_RESOLVED_SOURCE_VERSION,remoteOrigin:t.CODEBUILD_SOURCE_REPO_URL},azure:{sha:t.BUILD_SOURCEVERSION,branch:t.BUILD_SOURCEBRANCHNAME,message:t.BUILD_SOURCEVERSIONMESSAGE,authorName:t.BUILD_SOURCEVERSIONAUTHOR,authorEmail:t.BUILD_REQUESTEDFOREMAIL},bamboo:{sha:t.bamboo_planRepository_revision,branch:t.bamboo_planRepository_branch,authorName:t.bamboo_planRepository_username,remoteOrigin:t.bamboo_planRepository_repositoryURL},bitbucket:{sha:t.BITBUCKET_COMMIT,branch:t.BITBUCKET_BRANCH},buildkite:{sha:t.BUILDKITE_COMMIT,branch:t.BUILDKITE_BRANCH,message:t.BUILDKITE_MESSAGE,authorName:t.BUILDKITE_BUILD_CREATOR,authorEmail:t.BUILDKITE_BUILD_CREATOR_EMAIL,remoteOrigin:t.BUILDKITE_REPO,defaultBranch:t.BUILDKITE_PIPELINE_DEFAULT_BRANCH},circle:{sha:t.CIRCLE_SHA1,branch:t.CIRCLE_BRANCH,authorName:t.CIRCLE_USERNAME,remoteOrigin:t.CIRCLE_REPOSITORY_URL},codeFresh:{sha:t.CF_REVISION,branch:t.CF_BRANCH,message:t.CF_COMMIT_MESSAGE,authorName:t.CF_COMMIT_AUTHOR},drone:{sha:t.DRONE_COMMIT_SHA,branch:t.DRONE_SOURCE_BRANCH,message:t.DRONE_COMMIT_MESSAGE,authorName:t.DRONE_COMMIT_AUTHOR,authorEmail:t.DRONE_COMMIT_AUTHOR_EMAIL,remoteOrigin:t.DRONE_GIT_HTTP_URL,defaultBranch:t.DRONE_REPO_BRANCH},githubActions:{sha:t.GITHUB_SHA,branch:t.GH_BRANCH||t.GITHUB_REF,defaultBranch:t.GITHUB_BASE_REF,remoteBranch:t.GITHUB_HEAD_REF,runAttempt:t.GITHUB_RUN_ATTEMPT},gitlab:{sha:t.CI_COMMIT_SHA,branch:t.CI_COMMIT_REF_NAME,message:t.CI_COMMIT_MESSAGE,authorName:t.GITLAB_USER_NAME,authorEmail:t.GITLAB_USER_EMAIL,remoteOrigin:t.CI_REPOSITORY_URL,defaultBranch:t.CI_DEFAULT_BRANCH},googleCloud:{sha:t.COMMIT_SHA,branch:t.BRANCH_NAME},jenkins:{sha:t.GIT_COMMIT,branch:t.GIT_BRANCH},semaphore:{sha:t.SEMAPHORE_GIT_SHA,branch:t.SEMAPHORE_GIT_BRANCH,remoteOrigin:t.SEMAPHORE_GIT_REPO_SLUG},snap:null,teamcity:null,travis:{sha:t.TRAVIS_PULL_REQUEST_SHA||t.TRAVIS_COMMIT,branch:t.TRAVIS_PULL_REQUEST_BRANCH||t.TRAVIS_BRANCH,message:t.TRAVIS_COMMIT_MESSAGE},netlify:{sha:t.COMMIT_REF,branch:t.BRANCH,remoteOrigin:t.REPOSITORY_URL}}},to=t=>{let e=eo();return e?(0,R.chain)(t()).get(e).value():{}};function pa(){return(0,R.chain)(Zr()).omitBy(R.isNull).keys().value()}function ma(t){return t&&pa().includes(t)}function eo(){let t=sa();return xt("detected CI provider name: %s",t),t||null}function ua(){return to(Zr)}function ro(){return to(ca)}function mt(t){let e=ua(),r=eo(),o=da(t,r);return xt("detected CI provider: %s",r),xt("detected CI params: %O",e),xt("detected CI build ID: %o",o),{params:e,provider:r,ciBuildId:o}}function da(t,e){return t?{source:"user",value:t}:ma(e)?{source:"server",value:null}:{source:"random",value:`auto:${ae()}`}}var oo=l(require("archiver")),no=l(require("fs-extra")),Re=l(require("path")),io=l(require("unzipper"));var la=50*1024*1024;async function ao(t,e=la){return new Promise((r,o)=>{let n=(0,oo.default)("zip",{zlib:{level:9}}),a=[],c=0;n.on("data",m=>{a.push(m),c+=m.length,c>e&&o(new Error(`Zip size exceeded the limit of ${e} bytes`))}),n.on("warning",m=>{m.code==="ENOENT"?g(m):o(m)}),n.on("error",m=>o(m)),n.on("end",()=>{let m=Buffer.concat(a);r(m)});let p=async m=>{let f=process.cwd(),d=Re.default.normalize(m),_=Re.default.relative(f,d),I=await no.default.stat(m);I.isDirectory()?n.directory(m,_):n.file(m,{name:_,stats:I})};(async m=>{for(let f of m)await p(f);await n.finalize()})(t).catch(o)})}async function so(t,e){return io.default.Open.buffer(t).then(r=>r.extract({path:e,concurrency:3}))}var lo=l(require("async-retry")),fo=require("axios");var co=l(require("axios")),po=require("https-proxy-agent"),mo=l(require("proxy-from-env"));var fa=s.extend("axios");function Te(t={}){let e=co.default.create(t);return e.interceptors.request.use(r=>{let o={...r},n=e.getUri(r),a=mo.default.getProxyForUrl(n);return a&&(fa("Using HTTP proxy %s for %s ",a,n),o.proxy=!1,o.httpsAgent=ga(a)),o}),e}var Nt=null;function ga(t){return Nt||(Nt=new po.HttpsProxyAgent(t),Nt)}var Bt=s.extend("upload"),Lt=5;async function he(t,e,r){return Bt("Uploading buffer %s",t.name,{buffer:Buffer.byteLength(t.buffer)}),Ca(t.buffer,t.uploadUrl,e,r)}async function Ea(t,e,r,o){return Te().request({method:"put",url:e,data:t,onUploadProgress:o,headers:{"Content-Disposition":"inline","Content-Type":r}})}async function Oe(t,e){try{let r=await Te().get(t,{responseType:"arraybuffer",onDownloadProgress:e});return Buffer.from(r.data)}catch(r){throw(0,fo.isAxiosError)(r)&&Bt("Failed to download %s: %s",t,r.message),r}}async function Ca(...t){await(0,lo.default)(async()=>{await Ea(...t)},{retries:Lt,onRetry:(e,r)=>{if(Bt("Upload failed %d out of %d attempts: %s",r,Lt,e.message),r===Lt){E(`Cannot upload after ${r} times: ${e.message}`);return}g(`Upload failed ${r} out of ${Lt} attempts: ${e.message}`)}})}var Ue=t=>({total:e,loaded:r})=>{};function uo(t){return t/1e3/1e3}var Se=l(require("lodash"));var Q=l(require("path")),Ae=l(require("globby"));var go=require("lodash");function ye({config:t,cacheId:e,orgId:r,path:o,ci:n,cacheKey:a,metaCacheKey:c}){let p={id:e,orgId:r,config:(0,go.omit)(t,"recordKey"),path:o,ci:n,createdAt:new Date().toISOString(),cacheKey:a,metaCacheKey:c};return Buffer.from(JSON.stringify(p))}function Eo(t,e){t instanceof Error?Z("%s. %s.",e,t.message):Z("%s. %s.",e,"Unknown error")}var Co=async t=>{let e=Q.default.resolve(t??"./test-results"),r=[Q.default.posix.join(e.replace(/\\/g,"/"),"**/.last-run.json"),Q.default.posix.join(e.replace(/\\/g,"/"),".last-run.json")];return Ae.sync(r)},Io=async(t=[])=>{let e=Ia(t),r=[];return e.length>0&&r.push(...Ae.sync(t.map(o=>o.replace(/\\/g,"/")))),r};function Ia(t){let e=process.cwd();return t.filter(r=>{let o=Q.default.resolve(r),n=Q.default.relative(e,o);return r.startsWith("..")||Q.default.isAbsolute(n)?(Eo(null,`Invalid path: "${r}". Path traversal detected. The path was skipped.`),!1):!0})}function Mt(t){return t?t.path.some(e=>Q.default.basename(e)===".last-run.json"):!1}async function _o(t,e){switch(e.provider){case"githubActions":await ho(t,e);break;case"gitlab":await To(t,e);break;case"circle":await Oo(t,e);break;default:break}}async function Ro(t,e,r){switch(e.provider){case"githubActions":await ho(t,e,r);break;case"gitlab":await To(t,e,r);break;case"circle":await Oo(t,e,r);break;default:break}}async function To(t,e,r=null){let o=e.params,n=r?.ci.params,c=(n?ut(n.runAttempt,0):0)+1,p=ut(o.ciNodeIndex,1),u=ut(o.ciNodeTotal,1),m=Mt(r),f=c>1&&m,d=f?"--last-failed":"",_="";u>1&&(_=f?"--shard=1/1":`--shard=${p}/${u}`);let I=[d,_].filter(Boolean).join(" ");await et(t.presetOutput??It,`EXTRA_PW_FLAGS="${I}"
14
- EXTRA_PWCP_FLAGS="${d}"
12
+ `]:["Unexpected network error"]}var vr=a.extend("http");async function K(e,t,r=wr){try{let o=await r(e).request(t);return vr("network response: %o",{...Mr.default.omit(o,"request","config"),url:o.config.url,method:o.config.method}),o}catch(o){let n=o;throw vr("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}),Lr(n),n}}var pe=a.extend("api");async function Fr(e){try{return pe("Request params: %o",I(e)),K("api",{url:"cache/upload",method:"POST",data:e}).then(t=>t.data)}catch(t){throw pe("Failed to create cache:",t),t}}async function kr(e){try{return pe("Request params: %o",e),K("api",{url:"cache/v2/download",method:"POST",data:e}).then(t=>t.data)}catch(t){throw pe("Failed to retrieve cache:",t),t}}async function Gr(e){try{return pe("Request params: %o",e),K("api",{url:"cache/meta",method:"POST",data:e}).then(t=>t.data)}catch(t){throw pe("Failed to retrieve reference cache meta:",t),t}}var ma=a.extend("api");async function Hr(e){return ma("Cancel params: %o",I(e)),(await K("api",{url:"v1/runs/cancel",method:"POST",data:e})).data}var jr=require("util"),$r=require("zlib");var Kr=a.extend("api"),ua=(0,jr.promisify)($r.gzip);async function Vr(e){try{Kr("Run params: %o",I(e));let t=await da(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 Kr("Failed to create the run:",t),t}}async function da(e){try{return await ua(e)}catch(t){throw E("Failed to compress run payload:",t),t}}var Yr=a.extend("api");async function Jr(e,t){try{return Yr("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 Yr("Failed to obtain run data:",r),r}}async function Rt(){try{let e=xe();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 Jr(e.apiKey,t);await la(e.pwLastRun&&r.data.pwLastRun?r.data.pwLastRun:r.data,e)}catch(e){throw a("Failed to get run data"),e}}async function la(e,t){let r=JSON.stringify(e,null,2);t.output?(await dr(t.output),await(0,Wr.writeFile)(t.output,r,"utf-8"),y(`Successfully written to ${t.output}`)):y(r)}var Bo=require("axios"),Lt=d(require("path"));var D=require("@commander-js/extra-typings");var fa={recordKey:{name:"Record Key",env:"CURRENTS_RECORD_KEY",cli:"--key"},debug:{name:"Debug",env:"CURRENTS_DEBUG",cli:"--debug"}},ga={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"}},Ea={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"}},Q={...fa,...ga,...Ea};function _t(){return{recordKey:process.env[Q.recordKey.env],debug:process.env[Q.debug.env]}}var qr=a.extend("config"),Qr=["recordKey"],ie;function zr(e){ie={type:"SET_COMMAND_CONFIG",values:L(Q,Qr,_t,e)},qr("Resolved config: %o",{...ie,values:I(ie.values)})}function Xr(e){ie={type:"GET_COMMAND_CONFIG",values:L(Q,Qr,_t,e)},qr("Resolved config: %o",{...ie,values:I(ie.values)})}function z(){return ie}function Zr(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 eo(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 to=require("@commander-js/extra-typings");function me(e,t=[]){return e?t.concat(e.split(",").map(r=>r.trim())):t}async function x(e,t){try{t.debug&&ir(),await e(t),process.exit(0)}catch(r){E(r.message);let o=r instanceof to.CommanderError?r.exitCode:1;process.exit(o)}}var Tt=new D.Option("-k, --key <record-key>","Your secret Record Key obtained from Currents").env(R(Q,"recordKey")),ht=new D.Option("--debug","Enable debug logging").env(R(Q,"debug")).default(!1),Ot=new D.Option("--id <id>","The ID the data is saved under in the cache"),ro=new D.Option("--path <path>",'Comma-separated list of paths to cache, enquote for globs e.g. "dist/**/*"').argParser(me),Le=(t=>(t.lastRun="last-run",t))(Le||{}),yt=new D.Option("--preset <preset-name>",'A set of predefined options. Use "last-run" to get the last run data').choices(Object.values(Le)),oo=new D.Option("--output-dir <dir>","Path to the directory where output will be written"),no=new D.Option("--pw-output-dir <dir>","Directory for artifacts produced by Playwright tests").default("test-results"),Te=".currents_env",io=new D.Option("--preset-output <path>","Path to the file containing the preset output").default(Te),Ut=new D.Option("--matrix-index <number>","The index of the matrix to use").default(1).argParser(ao),At=new D.Option("--matrix-total <number>","The total number of matrices available").default(1).argParser(ao);function ao(e){let t=parseInt(e,10);if(isNaN(t)||t<=0||!Number.isInteger(t))throw new D.InvalidArgumentError("A positive integer is expected.");return t}var so=new D.Option("--continue","Continue the script execution if the cache is not found").default(!1),co=new D.Option("--continue","Continue the script execution if upload paths are not found").default(!1);var h=require("lodash");var ve=a.extend("ci"),Ca=(e,...t)=>(0,h.chain)(t).compact().join(e).value(),Ia=(e,t)=>(0,h.set)(e,(0,h.camelCase)(t),process.env[t]),U=e=>(0,h.transform)(e,Ia,{}),Ra=()=>process.env.TF_BUILD&&process.env.AZURE_HTTP_USER_AGENT,_a=()=>(0,h.some)(process.env,(e,t)=>/^CODEBUILD_/.test(t)),Ta=()=>process.env.bamboo_buildNumber,ha=()=>(0,h.some)(process.env,(e,t)=>/^CONCOURSE_/.test(t)),Oa=()=>process.env.GITLAB_CI||process.env.CI_SERVER_NAME&&/^GitLab/.test(process.env.CI_SERVER_NAME),ya=()=>!!(process.env.BUILD_ID&&process.env.PROJECT_ID&&process.env.PROJECT_NUMBER||process.env.GCP_PROJECT||process.env.GCLOUD_PROJECT||process.env.GOOGLE_CLOUD_PROJECT),Ua=()=>process.env.JENKINS_URL||process.env.JENKINS_HOME||process.env.JENKINS_VERSION||process.env.HUDSON_URL||process.env.HUDSON_HOME,Aa={appveyor:"APPVEYOR",azure:Ra,awsCodeBuild:_a,bamboo:Ta,bitbucket:"BITBUCKET_BUILD_NUMBER",buildkite:"BUILDKITE",circle:"CIRCLECI",concourse:ha,codeFresh:"CF_BUILD_ID",drone:"DRONE",githubActions:"GITHUB_ACTIONS",gitlab:Oa,goCD:"GO_JOB_NAME",jenkins:Ua,googleCloud:ya,semaphore:"SEMAPHORE",teamcity:"TEAMCITY_VERSION",travis:"TRAVIS",netlify:"NETLIFY"};function Sa(){let{env:e}=process;return(0,h.findKey)(Aa,t=>{if((0,h.isString)(t))return e[t];if((0,h.isFunction)(t))return t()})}var po=()=>({appveyor:U(["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:U(["AGENT_BUILDDIRECTORY","AGENT_ID","AGENT_JOBNAME","AGENT_JOBSTATUS","AGENT_MACHINENAME","AGENT_NAME","AGENT_OS","AGENT_OSARCHITECTURE","BUILD_BUILDID","BUILD_BUILDNUMBER","BUILD_BUILDURI","BUILD_CONTAINERID","BUILD_CRONSCHEDULE_DISPLAYNAME","BUILD_DEFINITIONNAME","BUILD_DEFINITIONVERSION","BUILD_QUEUEDBY","BUILD_QUEUEDBYID","BUILD_REASON","BUILD_REPOSITORY_ID","BUILD_REPOSITORY_NAME","BUILD_REPOSITORY_PROVIDER","BUILD_REPOSITORY_URI","BUILD_REQUESTEDFOR","BUILD_REQUESTEDFOREMAIL","BUILD_REQUESTEDFORID","BUILD_SOURCEBRANCH","BUILD_SOURCEBRANCHNAME","BUILD_SOURCESDIRECTORY","BUILD_SOURCEVERSION","BUILD_SOURCEVERSIONAUTHOR","BUILD_SOURCEVERSIONMESSAGE","BUILD_STAGINGDIRECTORY","BUILD_TRIGGEREDBY_BUILDID","BUILD_TRIGGEREDBY_BUILDNUMBER","BUILD_TRIGGEREDBY_DEFINITIONID","BUILD_TRIGGEREDBY_DEFINITIONNAME","BUILD_TRIGGEREDBY_PROJECTID","COMMON_TESTRESULTSDIRECTORY","PIPELINE_WORKSPACE","SYSTEM_COLLECTIONID","SYSTEM_COLLECTIONURI","SYSTEM_DEFAULTWORKINGDIRECTORY","SYSTEM_DEFINITIONID","SYSTEM_HOSTTYPE","SYSTEM_JOBATTEMPT","SYSTEM_JOBDISPLAYNAME","SYSTEM_JOBID","SYSTEM_JOBNAME","SYSTEM_PHASEATTEMPT","SYSTEM_PHASEDISPLAYNAME","SYSTEM_PHASENAME","SYSTEM_PLANID","SYSTEM_PULLREQUEST_ISFORK","SYSTEM_PULLREQUEST_PULLREQUESTID","SYSTEM_PULLREQUEST_PULLREQUESTNUMBER","SYSTEM_PULLREQUEST_SOURCEREPOSITORYURI","SYSTEM_PULLREQUEST_SOURCEBRANCH","SYSTEM_PULLREQUEST_SOURCECOMMITID","SYSTEM_PULLREQUEST_TARGETBRANCH","SYSTEM_PULLREQUEST_TARGETBRANCHNAME","SYSTEM_STAGEATTEMPT","SYSTEM_STAGEDISPLAYNAME","SYSTEM_STAGENAME","SYSTEM_TEAMFOUNDATIONCOLLECTIONURI","SYSTEM_TEAMPROJECT","SYSTEM_TEAMPROJECTID","SYSTEM_TIMELINEID"]),awsCodeBuild:U(["AWS_DEFAULT_REGION","AWS_REGION","CODEBUILD_BATCH_BUILD_IDENTIFIER","CODEBUILD_BUILD_ARN","CODEBUILD_BUILD_ID","CODEBUILD_BUILD_IMAGE","CODEBUILD_BUILD_NUMBER","CODEBUILD_BUILD_SUCCEEDING","CODEBUILD_BUILD_URL","CODEBUILD_INITIATOR","CODEBUILD_PROJECT_ARN","CODEBUILD_PUBLIC_BUILD_URL","CODEBUILD_RESOLVED_SOURCE_VERSION","CODEBUILD_SOURCE_REPO_URL","CODEBUILD_SOURCE_VERSION","CODEBUILD_SRC_DIR","CODEBUILD_START_TIME","CODEBUILD_WEBHOOK_ACTOR_ACCOUNT_ID","CODEBUILD_WEBHOOK_BASE_REF","CODEBUILD_WEBHOOK_EVENT","CODEBUILD_WEBHOOK_HEAD_REF","CODEBUILD_WEBHOOK_MERGE_COMMIT","CODEBUILD_WEBHOOK_PREV_COMMIT","CODEBUILD_WEBHOOK_TRIGGER","CODEBUILD_WEBHOOK_LABEL","CODEBUILD_WEBHOOK_RUN_ID","CODEBUILD_WEBHOOK_JOB_ID","CODEBUILD_WEBHOOK_WORKFLOW_NAME","CODEBUILD_RUNNER_OWNER","CODEBUILD_RUNNER_REPO","CODEBUILD_RUNNER_REPO_DOMAIN","CODEBUILD_RUNNER_WITH_BUILDSPEC"]),bamboo:U(["bamboo_buildNumber","bamboo_buildResultsUrl","bamboo_planRepository_repositoryUrl","bamboo_buildKey"]),bitbucket:U(["CI","BITBUCKET_WORKSPACE","BITBUCKET_REPO_SLUG","BITBUCKET_REPO_UUID","BITBUCKET_REPO_FULL_NAME","BITBUCKET_REPO_IS_PRIVATE","BITBUCKET_REPO_OWNER","BITBUCKET_REPO_OWNER_UUID","BITBUCKET_PROJECT_KEY","BITBUCKET_PROJECT_UUID","BITBUCKET_BUILD_NUMBER","BITBUCKET_PIPELINE_UUID","BITBUCKET_STEP_UUID","BITBUCKET_STEP_RUN_NUMBER","BITBUCKET_STEP_TRIGGERER_UUID","BITBUCKET_PARALLEL_STEP","BITBUCKET_PARALLEL_STEP_COUNT","BITBUCKET_CLONE_DIR","BITBUCKET_COMMIT","BITBUCKET_BRANCH","BITBUCKET_TAG","BITBUCKET_BOOKMARK","BITBUCKET_GIT_HTTP_ORIGIN","BITBUCKET_GIT_SSH_ORIGIN","BITBUCKET_PR_ID","BITBUCKET_PR_DESTINATION_BRANCH","BITBUCKET_PR_DESTINATION_COMMIT","BITBUCKET_DEPLOYMENT_ENVIRONMENT","BITBUCKET_DEPLOYMENT_ENVIRONMENT_UUID","BITBUCKET_EXIT_CODE"]),buildkite:U(["BUILDKITE_ORGANIZATION_SLUG","BUILDKITE_PIPELINE_ID","BUILDKITE_PIPELINE_NAME","BUILDKITE_PIPELINE_SLUG","BUILDKITE_PIPELINE_DEFAULT_BRANCH","BUILDKITE_REPO","BUILDKITE_SOURCE","BUILDKITE_BRANCH","BUILDKITE_TAG","BUILDKITE_COMMIT","BUILDKITE_MESSAGE","BUILDKITE_BUILD_AUTHOR","BUILDKITE_BUILD_AUTHOR_EMAIL","BUILDKITE_JOB_ID","BUILDKITE_BUILD_ID","BUILDKITE_BUILD_URL","BUILDKITE_BUILD_NUMBER","BUILDKITE_LABEL","BUILDKITE_COMMAND","BUILDKITE_STEP_ID","BUILDKITE_STEP_KEY","BUILDKITE_PARALLEL_JOB","BUILDKITE_PARALLEL_JOB_COUNT","BUILDKITE_RETRY_COUNT","BUILDKITE_COMPUTE_TYPE","BUILDKITE_CLUSTER_NAME","BUILDKITE_PULL_REQUEST","BUILDKITE_PULL_REQUEST_REPO","BUILDKITE_PULL_REQUEST_BASE_BRANCH","BUILDKITE_PULL_REQUEST_DRAFT","BUILDKITE_PULL_REQUEST_LABELS","BUILDKITE_MERGE_QUEUE_BASE_BRANCH","BUILDKITE_MERGE_QUEUE_BASE_COMMIT","BUILDKITE_REBUILT_FROM_BUILD_ID","BUILDKITE_REBUILT_FROM_BUILD_NUMBER","BUILDKITE_TRIGGERED_FROM_BUILD_ID","BUILDKITE_TRIGGERED_FROM_BUILD_NUMBER","BUILDKITE_TRIGGERED_FROM_BUILD_PIPELINE_SLUG"]),circle:U(["CI","CIRCLECI","CIRCLE_BRANCH","CIRCLE_BUILD_NUM","CIRCLE_BUILD_URL","CIRCLE_PREVIOUS_BUILD_NUM","CIRCLE_JOB","CIRCLE_WORKFLOW_ID","CIRCLE_WORKFLOW_JOB_ID","CIRCLE_WORKFLOW_WORKSPACE_ID","CIRCLE_PIPELINE_ID","CIRCLE_ORGANIZATION_ID","CIRCLE_PROJECT_ID","CIRCLE_PROJECT_REPONAME","CIRCLE_PROJECT_USERNAME","CIRCLE_REPOSITORY_URL","CIRCLE_WORKING_DIRECTORY","CIRCLE_SHA1","CIRCLE_TAG","CIRCLE_USERNAME","CIRCLE_NODE_INDEX","CIRCLE_NODE_TOTAL","CIRCLE_PR_NUMBER","CIRCLE_PR_REPONAME","CIRCLE_PR_USERNAME","CIRCLE_PULL_REQUEST","CIRCLE_PULL_REQUESTS","CI_PULL_REQUEST"]),concourse:U(["BUILD_ID","BUILD_NAME","BUILD_JOB_NAME","BUILD_PIPELINE_NAME","BUILD_TEAM_NAME","ATC_EXTERNAL_URL"]),codeFresh:U(["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:U(["DRONE_BUILD_LINK","DRONE_BUILD_NUMBER","DRONE_PULL_REQUEST"]),githubActions:U(["CI","GITHUB_ACTIONS","GITHUB_WORKFLOW","GITHUB_WORKFLOW_REF","GITHUB_WORKFLOW_SHA","GITHUB_ACTION","GITHUB_ACTION_PATH","GITHUB_ACTION_REPOSITORY","GITHUB_JOB","GITHUB_EVENT_NAME","GITHUB_EVENT_PATH","GITHUB_RUN_ID","GITHUB_RUN_NUMBER","GITHUB_RUN_ATTEMPT","GITHUB_REPOSITORY","GITHUB_REPOSITORY_ID","GITHUB_REPOSITORY_OWNER","GITHUB_REPOSITORY_OWNER_ID","GITHUB_REF","GITHUB_REF_NAME","GITHUB_REF_TYPE","GITHUB_REF_PROTECTED","GITHUB_BASE_REF","GITHUB_HEAD_REF","GITHUB_SHA","GITHUB_ACTOR","GITHUB_ACTOR_ID","GITHUB_TRIGGERING_ACTOR","GITHUB_SERVER_URL","GITHUB_API_URL","GITHUB_GRAPHQL_URL","GITHUB_WORKSPACE","GITHUB_RETENTION_DAYS","RUNNER_OS","RUNNER_ARCH","RUNNER_NAME","RUNNER_ENVIRONMENT","RUNNER_DEBUG"]),gitlab:U(["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","CI_MERGE_REQUEST_IID","CI_MERGE_REQUEST_PROJECT_URL","CI_MERGE_REQUEST_TITLE","CI_MERGE_REQUEST_SOURCE_BRANCH_NAME","CI_MERGE_REQUEST_TARGET_BRANCH_NAME","CI_OPEN_MERGE_REQUESTS"]),goCD:U(["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:U(["BUILD_ID","PROJECT_ID","REPO_NAME","BRANCH_NAME","TAG_NAME","COMMIT_SHA","SHORT_SHA"]),jenkins:U(["BRANCH_NAME","BUILD_DISPLAY_NAME","BUILD_ID","BUILD_NUMBER","BUILD_TAG","BUILD_URL","CHANGE_AUTHOR","CHANGE_AUTHOR_DISPLAY_NAME","CHANGE_AUTHOR_EMAIL","CHANGE_BRANCH","CHANGE_FORK","CHANGE_ID","CHANGE_TARGET","CHANGE_TITLE","CHANGE_URL","CI","EXECUTOR_NUMBER","JAVA_HOME","JENKINS_HOME","JENKINS_URL","JOB_BASE_NAME","JOB_NAME","JOB_URL","NODE_LABELS","NODE_NAME","RUN_ARTIFACTS_DISPLAY_URL","RUN_CHANGES_DISPLAY_URL","TAG_NAME","WORKSPACE","WORKSPACE_TMP","GIT_AUTHOR_EMAIL","GIT_AUTHOR_NAME","GIT_BRANCH","GIT_COMMIT","GIT_COMMITTER_EMAIL","GIT_COMMITTER_NAME","GIT_LOCAL_BRANCH","GIT_PREVIOUS_COMMIT","GIT_PREVIOUS_SUCCESSFUL_COMMIT","GIT_URL","ghprbActualCommit","ghprbGhRepository","ghprbPullId","ghprbPullLink","ghprbSourceBranch","ghprbTargetBranch","ghprbTriggerAuthorLogin"]),semaphore:U(["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"]),teamcity:null,travis:U(["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"]),netlify:U(["BUILD_ID","CONTEXT","URL","DEPLOY_URL","DEPLOY_PRIME_URL","DEPLOY_ID"])}),Pa=()=>{let{env:e}=process;return{appveyor:{sha:e.APPVEYOR_REPO_COMMIT,branch:e.APPVEYOR_PULL_REQUEST_HEAD_REPO_BRANCH||e.APPVEYOR_REPO_BRANCH,message:Ca(`
13
+ `,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},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},snap:null,teamcity:null,travis:{sha:e.TRAVIS_PULL_REQUEST_SHA||e.TRAVIS_COMMIT,branch:e.TRAVIS_PULL_REQUEST_BRANCH||e.TRAVIS_BRANCH,message:e.TRAVIS_COMMIT_MESSAGE},netlify:{sha:e.COMMIT_REF,branch:e.BRANCH,remoteOrigin:e.REPOSITORY_URL}}},mo=e=>{let t=uo();return t?(0,h.chain)(e()).get(t).value():{}};function Da(){return(0,h.chain)(po()).omitBy(h.isNull).keys().value()}function wa(e){return e&&Da().includes(e)}function uo(){let e=Sa();return ve("detected CI provider name: %s",e),e||null}function ba(){return mo(po)}function lo(){return mo(Pa)}function ue(e){let t=ba(),r=uo(),o=xa(e,r);return ve("detected CI provider: %s",r),ve("detected CI params: %O",t),ve("detected CI build ID: %o",o),{params:t,provider:r,ciBuildId:o}}function xa(e,t){return e?{source:"user",value:e}:wa(t)?{source:"server",value:null}:{source:"random",value:`auto:${ut()}`}}var fo=d(require("archiver")),go=d(require("fs-extra")),St=d(require("path")),Eo=d(require("unzipper"));var Na=50*1024*1024;async function Co(e,t=Na){return new Promise((r,o)=>{let n=(0,fo.default)("zip",{zlib:{level:9}}),s=[],c=0;n.on("data",m=>{s.push(m),c+=m.length,c>t&&o(new Error(`Zip size exceeded the limit of ${t} bytes`))}),n.on("warning",m=>{m.code==="ENOENT"?C(m):o(m)}),n.on("error",m=>o(m)),n.on("end",()=>{let m=Buffer.concat(s);r(m)});let p=async m=>{let f=process.cwd(),l=St.default.normalize(m),T=St.default.relative(f,l),_=await go.default.stat(m);_.isDirectory()?n.directory(m,T):n.file(m,{name:T,stats:_})};(async m=>{for(let f of m)await p(f);await n.finalize()})(e).catch(o)})}async function Io(e,t){return Eo.default.Open.buffer(e).then(r=>r.extract({path:t,concurrency:3}))}var Oo=d(require("async-retry")),yo=require("axios");var Ro=d(require("axios")),_o=require("https-proxy-agent"),To=d(require("proxy-from-env"));var Ba=a.extend("axios");function Pt(e={}){let t=Ro.default.create(e);return t.interceptors.request.use(r=>{let o={...r},n=t.getUri(r),s=To.default.getProxyForUrl(n);return s&&(Ba("Using HTTP proxy %s for %s ",s,n),o.proxy=!1,o.httpsAgent=La(s)),o}),t}var Me=null;function La(e){return Me||(Me=new _o.HttpsProxyAgent(e),Me)}var ke=a.extend("upload"),Fe=5;async function Dt(e,t,r){return ke("Uploading buffer %s",e.name,{buffer:Buffer.byteLength(e.buffer)}),Ma(e.buffer,e.uploadUrl,t,r)}async function va(e,t,r,o){return Pt().request({method:"put",url:t,data:e,onUploadProgress:o,headers:{"Content-Disposition":"inline","Content-Type":r}})}async function wt(e,t){try{let r=await Pt().get(e,{responseType:"arraybuffer",onDownloadProgress:t});return Buffer.from(r.data)}catch(r){throw(0,yo.isAxiosError)(r)&&ke("Failed to download %s: %s",e,r.message),r}}async function Ma(...e){await(0,Oo.default)(async()=>{await va(...e)},{retries:Fe,onRetry:(t,r)=>{if(ke("Upload failed %d out of %d attempts: %s",r,Fe,t.message),r===Fe){E(`Cannot upload after ${r} times: ${t.message}`);return}C(`Upload failed ${r} out of ${Fe} attempts: ${t.message}`)}})}var bt=e=>({total:t,loaded:r})=>{};function ho(e){return e/1e3/1e3}var Bt=d(require("lodash"));var X=d(require("path")),Nt=d(require("globby"));var Uo=require("lodash");function xt({config:e,cacheId:t,orgId:r,path:o,ci:n,cacheKey:s,metaCacheKey:c}){let p={id:t,orgId:r,config:(0,Uo.omit)(e,"recordKey"),path:o,ci:n,createdAt:new Date().toISOString(),cacheKey:s,metaCacheKey:c};return Buffer.from(JSON.stringify(p))}function Ao(e,t){e instanceof Error?te("%s. %s.",t,e.message):te("%s. %s.",t,"Unknown error")}var So=async e=>{let t=X.default.resolve(e??"./test-results"),r=[X.default.posix.join(t.replace(/\\/g,"/"),"**/.last-run.json"),X.default.posix.join(t.replace(/\\/g,"/"),".last-run.json")];return Nt.sync(r)},Po=async(e=[])=>{let t=Fa(e),r=[];return t.length>0&&r.push(...Nt.sync(e.map(o=>o.replace(/\\/g,"/")))),r};function Fa(e){let t=process.cwd();return e.filter(r=>{let o=X.default.resolve(r),n=X.default.relative(t,o);return r.startsWith("..")||X.default.isAbsolute(n)?(Ao(null,`Invalid path: "${r}". Path traversal detected. The path was skipped.`),!1):!0})}function Ge(e){return e?e.path.some(t=>X.default.basename(t)===".last-run.json"):!1}async function Do(e,t){switch(t.provider){case"githubActions":await xo(e,t);break;case"gitlab":await bo(e,t);break;case"circle":await No(e,t);break;default:break}}async function wo(e,t,r){switch(t.provider){case"githubActions":await xo(e,t,r);break;case"gitlab":await bo(e,t,r);break;case"circle":await No(e,t,r);break;default:break}}async function bo(e,t,r=null){let o=t.params,n=r?.ci.params,c=(n?de(n.runAttempt,0):0)+1,p=de(o.ciNodeIndex,1),u=de(o.ciNodeTotal,1),m=Ge(r),f=c>1&&m,l=f?"--last-failed":"",T="";u>1&&(T=f?"--shard=1/1":`--shard=${p}/${u}`);let _=[l,T].filter(Boolean).join(" ");await oe(e.presetOutput??Te,`EXTRA_PW_FLAGS="${_}"
14
+ EXTRA_PWCP_FLAGS="${l}"
15
15
  RUN_ATTEMPT=${c}
16
- `)}async function ho(t,e,r=null){let{matrixIndex:o,matrixTotal:n}=t,a=e.params,c=ut(a.githubRunAttempt,1),p=Mt(r),u=c>1&&p,m=u?"--last-failed":"",f="";n>1&&(f=u?"--shard=1/1":`--shard=${o}/${n}`);let d=[m,f].filter(Boolean).join(" "),_=t.presetOutput??It;await et(_,d),s('Dumped PW config: "%s" for GHA to %s',d,_)}async function Oo(t,e,r=null){let o=e.params,n=r?.ci.params,a=n?.circleWorkflowId,c=n?.circleWorkflowWorkspaceId,p=ut(o.circleNodeIndex,0),u=ut(o.circleNodeTotal,1),m=c==o.circleWorkflowWorkspaceId&&a!==o.circleWorkflowId,f=Mt(r),d=m&&f,_=d?"--last-failed":"",I="";u>1&&(I=d?"--shard=1/1":`--shard=${p+1}/${u}`);let D=[_,I].filter(Boolean).join(" "),M=t.presetOutput??It;await et(M,D),s('Dumped PW config: "%s" for Circle to %s',D,M)}var ut=(t,e)=>{let r=Se.default.toNumber(t);return Se.default.isNaN(r)?e:r};async function De(){let t=q();if(t.type!=="GET_COMMAND_CONFIG"||!t.values)throw new Error("Config is missing!");let{recordKey:e,id:r,preset:o,matrixIndex:n,matrixTotal:a,continue:c}=t.values,p=t.values.outputDir,u=mt();o==="last-run"&&await _o(t.values,u);let{cacheId:m,refMetaReadUrl:f}=await br({recordKey:e,ci:u,id:r,config:{matrixIndex:n,matrixTotal:a}});try{let d=await Ta(f),{readUrl:_}=await wr({recordKey:e,cacheKey:d.cacheKey}),I=await _a({readUrl:_,outputDir:p});o==="last-run"&&await Ro(t.values,u,d),A(C("- restoring cache to"),I),Ut("Cache restored. Cache ID: %s",m)}catch(d){if((0,Uo.isAxiosError)(d)&&(d.response?.status===403||d.response?.status===404)){let _=`Cache with ID "${m}" not found`;if(c){Z(_);return}throw new Error(_)}throw d}}async function _a({readUrl:t,outputDir:e}){let r=await Oe(t),o=Ra(e);return await so(r,o),s("Cache downloaded",{readUrl:t,destination:o}),o}function Ra(t){let e=t??process.cwd();return Pe.default.isAbsolute(e)?e:Pe.default.resolve(process.cwd(),e)}async function Ta(t){let e=await Oe(t),r=JSON.parse(e.toString("utf-8"));return s("Meta file downloaded: %O",r),r}var Ao=require("lodash");async function we(){let t=q();if(t.type!=="SET_COMMAND_CONFIG"||!t.values)throw new Error("Config is missing!");let{recordKey:e,id:r,preset:o,pwOutputDir:n,matrixIndex:a,matrixTotal:c,continue:p}=t.values,u=await Io(t.values.path),m=t.values.path||[],f=mt();if(o==="last-run"&&(m.push(n),u.push(...await Co(n))),u.length===0){let M=`No files available to upload: ${m.filter(Boolean).join(",")}`;if(!p)throw new Error(M);Z(M)}let d=await Dr({recordKey:e,ci:f,id:r,config:{matrixIndex:a,matrixTotal:c}});s("Cache upload url created",{result:d});let _=Oa(f),I=u.length>0?await ao(u):null,D=[];I&&D.push(ha({archive:I,cacheId:d.cacheId,uploadUrl:d.uploadUrl}).then(()=>{Ua(u),s("Cache archive uploaded",{uploadUrl:d.uploadUrl})})),D.push(yo({meta:ye({cacheId:d.cacheId,config:t.values,ci:_,orgId:d.orgId,path:u}),cacheId:d.cacheId,uploadUrl:d.metaUploadUrl}).then(()=>s("Meta uploaded",{uploadUrl:d.metaUploadUrl})),yo({meta:ye({cacheId:d.cacheId,config:t.values,ci:_,orgId:d.orgId,path:u,cacheKey:d.cacheKey,metaCacheKey:d.metaCacheKey}),cacheId:d.cacheId,uploadUrl:d.refMetaUploadUrl}).then(()=>s("Ref meta uploaded",{uploadUrl:d.refMetaUploadUrl}))),await Promise.all(D),Ut("Cache uploaded. Cache ID: %s",d.cacheId)}async function ha({archive:t,cacheId:e,uploadUrl:r}){try{let o="application/zip";await he({buffer:t,contentType:o,name:e,uploadUrl:r},o,Ue(e)),s("Cache archive uploaded",{cacheId:e})}catch(o){throw s("Failed to upload cache archive",o),o}}async function yo({meta:t,cacheId:e,uploadUrl:r}){try{let o=`${e}_meta`,n="application/json";await he({buffer:t,contentType:n,name:o,uploadUrl:r},n,Ue(o)),s("Cache meta uploaded",{cacheId:e})}catch(o){throw s("Failed to upload cache meta",o),o}}function Oa(t){return t.ciBuildId.source==="server"||t.ciBuildId.source==="random"?(0,Ao.omit)(t,"ciBuildId"):t}function Ua(t){A(`Cache upload paths:
17
- `+t.map(e=>`${C("- uploading")} ${e}`).join(`
18
- `))}var Po=require("@currents/commit-info"),Do=require("lodash");var vt=require("lodash");var be=s.extend("ci-git");function So(t){be("git commit existing info: %O",t);let e=ro();be("commit info from provider environment variables: %O",e);let r=(0,vt.transform)(t,(o,n,a)=>{let c=n||(e?e[a]:null);return o[a]=(0,vt.defaultTo)(c,null)});return be("combined git and environment variables from provider: %O",r),r}var ya=async()=>{let t=await(0,Po.commitInfo)();return So({branch:t.branch,remoteOrigin:t.remote,authorEmail:t.email,authorName:t.author,message:t.message,sha:t.sha,ghaEventData:t.ghaEventData})},wo=(0,Do.memoize)(ya);var bo=l(require("getos")),xo=require("lodash"),N=require("os"),No=require("util"),Aa=async()=>{if((0,N.platform)()==="linux")try{let t=await(0,No.promisify)(bo.default)();return"dist"in t&&"release"in t?[t.dist,t.release].join(" - "):(0,N.release)()}catch{return(0,N.release)()}return(0,N.release)()},Sa=async()=>{let t=await Aa();return{osName:(0,N.platform)(),osVersion:t,osCpus:[],osMemory:{free:(0,N.freemem)(),total:(0,N.totalmem)()}}},Lo=(0,xo.memoize)(Sa);var sn=l(require("axios")),Be=l(require("fs-extra")),$t=l(require("path")),cn=l(require("semver"));var U={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 Bo(){return{projectId:process.env[U.projectId.env],recordKey:process.env[U.recordKey.env],ciBuildId:process.env[U.ciBuildId.env],tag:process.env[U.tag.env]?process.env[U.tag.env]?.split(",").map(t=>t.trim()):void 0,disableTitleTags:process.env[U.disableTitleTags.env],removeTitleTags:process.env[U.removeTitleTags.env],debug:process.env[U.debug.env],machineId:process.env[U.machineId.env]}}var Pa=s.extend("config"),Da=["projectId","recordKey"],xe=null;function Mo(t){xe=K(U,Da,Bo,t),Pa("Resolved Currents config: %o",xe)}function Ft(){return xe}function vo(t){return{ciBuildId:t.ciBuildId,projectId:t.projectId,recordKey:t.key,tag:t.tag,removeTitleTags:t.removeTitleTags,disableTitleTags:t.disableTitleTags,debug:t.debug,machineId:t.machineId,reportDir:t.reportDir}}var z=class{constructor(e){this.config=e}async getFullTestSuite(){return[]}};var Wo=l(require("fs-extra")),qo=require("jest-cli"),Qo=l(require("tmp"));var Yo=require("lodash");function Fo(t){let e=[];for(let[r,o]of Object.entries(t))r==="_"||r==="$0"||r.includes("-")||(typeof o=="boolean"?o&&e.push(`--${r}`):Array.isArray(o)?o.forEach(n=>{e.push(`--${r}=${n}`)}):e.push(`--${r}=${o}`));return e.join(" ")}var Go=require("lodash"),wa=["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 ko(t){return(0,Go.omit)(t,...wa)}var jo=l(require("fs")),$o=require("jest-config"),Ne=require("lodash"),Le=l(require("path"));function Gt(t,e){return(...r)=>new Promise((o,n)=>{let a=0,c=()=>{a++;try{let p=t(...r);o(p)}catch(p){if(a>=e.length)n(p);else{let u=e[a-1];setTimeout(c,u)}}};c()})}var Ho=l(require("fs-extra")),ba=l(require("path"));async function kt(t){let e=await Ho.default.pathExists(t);if(!e)throw new Error("File does not exist");return e}var Ko=s.extend("jest-discovery");async function Vo(t){try{let{config:e,configPath:r}=await(0,$o.readInitialOptions)(t),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,Ne.omit)(e,o);if(a.projects&&(a.projects=a.projects.map(u=>typeof u!="string"?(0,Ne.omit)(u,n):u)),a.rootDir&&Object.keys(a).length===1)return null;let c=Le.default.resolve(r?Le.default.dirname(r):process.cwd(),`.jest-scanner-${new Date().getTime()}.config.js`),p=`module.exports=${JSON.stringify(a,null,2)}`;return Ko("configFileContent: %O",p),jo.default.writeFileSync(c,p),await Gt(kt,[200,200,200,200,200,1e3])(c),c}catch(e){return E("Failed to recreate the config file"),Ko("error %o",e),null}}async function Jo(t){let e="!!##ThisPatternWillNotMatchAnyTestName##!!",r=t.options,o=ko(r),n=Fo(o),a=r.config,c=await Vo(a);return{cliArgs:[n,"--testNamePattern",e,"--reporters","@currents/cmd/discovery/jest","--shard=1/1",c?`--config=${c}`:"",...t.args].filter(u=>!(0,Yo.isEmpty)(u)),configFilePath:c}}var xa=s.extend("jest-discovery");async function zo(t,e){console.time(C("@currents/jest:fullTestSuite-ready"));let{cliArgs:r,configFilePath:o}=await Jo(e);try{let n=Qo.default.fileSync({postfix:".json"});return xa("running scanner: %o",r),process.env.CURRENTS_DISCOVERY_PATH=n.name,await(0,qo.run)(r.concat(["--openHandlesTimeout=0"])),await Gt(kt,Array.from({length:300},()=>100))(n.name),console.timeEnd(C("@currents/jest:fullTestSuite-ready")),await tt(n.name)}catch(n){return E("Failed to obtain the jest full test suite:",n),[]}finally{o&&Wo.default.unlinkSync(o)}}var Ht=class extends z{constructor(e){super(e)}async getFullTestSuite(){return zo(this.config.frameworkConfig,this.config.cliArgs)}};var Zo=l(require("fs-extra"));var Xo=l(require("path"));function dt(t){return Xo.default.join(t,"fullTestSuite.json")}var Na=s.extend("junit-discovery");async function tn(t){console.time(C("@currents/junit:fullTestSuite-ready"));try{Na("running scanner: %o",t);let e=dt(t);process.env.CURRENTS_DISCOVERY_PATH=e;let r=Zo.default.readFileSync(e,"utf-8");return JSON.parse(r)}catch(e){return E("Failed to obtain the junit full test suite:",e),[]}}var Kt=class extends z{constructor(e,r){super(e),this.reportDir=r}async getFullTestSuite(){return tn(this.reportDir)}};function en(t,e){switch(t.framework){case"jest":return new Ht(t);case"junit":return new Kt(t,e);default:return new z(t)}}var lt=l(require("fs-extra")),$=l(require("path"));async function rn(t){let e=await La(t?.reportDir);if(!e)throw new Error("Failed to find the report dir");return{reportDir:e,configFilePath:t?.configFilePath??$.default.join(e,"config.json")}}async function La(t){return t?(await jt(t),t):Ba((0,$.join)(process.cwd(),".currents"))}async function Ba(t){let e=await lt.default.readdir(t),r=null;for(let o of e){let n=$.default.join(t,o),a=await lt.default.stat(n);a.isDirectory()&&(!r||a.birthtime>r.birthtime)&&(r={name:o,birthtime:a.birthtime})}return r?(0,$.resolve)(t,r.name):null}async function jt(t){try{return await lt.default.pathExists(t)}catch{return E("Error checking if path exists:",E),!1}}async function on(t){let e=$.default.join(t,"instances");return Ma(e)}async function Ma(t){let e=await lt.default.readdir(t),r=[];for(let o of e){let n=$.default.join(t,o);(await lt.default.stat(n)).isFile()&&r.push(n)}return r}var va=t=>Buffer.byteLength(JSON.stringify(t),"utf8"),nn=(t,e=1048576)=>{let r=[],o=[],n=0;for(let a of t){let c=va(a);n+c>e&&(r.push(o),o=[],n=0),o.push(a),n+=c}return o.length>0&&r.push(o),r};var Fa=3e4;async function Me(){let t=Ft();if(!t)throw new Error("Currents config is missing!");let e=await rn(t);Qe(ka(e.reportDir)),s("Reporter options: %o",e),A("Report directory: %s",e.reportDir);let r=await tt(e.configFilePath);s("Report config: %o",r);let o=await on(e.reportDir);s("Found %d instance results in the reportDir: %s",o.length,e.reportDir);let n=Ga(e.reportDir),a=await jt(n),c=dt(e.reportDir),p=null;if(a){let v=await tt(n);g("Marker file detected. The report was already uploaded: %o",{runUrl:v.response.runUrl,isoDate:v.isoDate})}if(await jt(c)&&(p=await tt(c),s("Full test suite file detected: %s",c)),p)s("The discovery stage was skipped");else{if(p=await en(r,e.reportDir).getFullTestSuite(),Ha(p))throw new Error("Failed to discover the full test suite!");await et(c,JSON.stringify(p))}let m=p.length===1?p[0].name:null,f={currents:t},d={type:r.framework,version:r.frameworkVersion,clientVersion:at,frameworkConfig:{originFramework:r.frameworkConfig?.originFramework,originFrameworkVersion:r.frameworkConfig?.originFrameworkVersion}},_=St.userFacingNanoid(),I=mt(t.ciBuildId),D={};for await(let v of o){let b=await tt(v);D[b.groupId]||(D[b.groupId]=[]),D[b.groupId].push(b)}let M=new Map;Object.values(D).forEach(v=>{v.forEach(b=>{b.artifacts?.forEach(x=>{x&&M.set(x.path,x.contentType)}),b.results.tests.forEach(x=>{x.artifacts?.forEach(w=>{w&&M.set(w.path,w.contentType)}),x.attempts.forEach(w=>{w.artifacts?.forEach(X=>{X&&M.set(X.path,X.contentType)})})})})});for await(let v of Object.keys(D)){let b=D[v],x=v;m&&(s("Default group found: %s, overwriting the group in the results",m),x=m,b=b.map(w=>({...w,groupId:m})));try{let w=nn(b),X=await an({ci:I,group:x,instances:[],fullTestSuite:p,config:f,machineId:_,framework:d});for(let te=0;te<w.length;te++){let ee=await an({ci:I,group:x,instances:w[te],fullTestSuite:[],config:f,machineId:_,framework:d});ee.artifactUploadUrls&&ee.artifactUploadUrls.length>0&&await Ka(ee.artifactUploadUrls,e.reportDir,M)}s("Api response: %o",X),A("[%s] Run created: %s",x,X.runUrl);let Ci={response:X,isoDate:new Date().toISOString()};await et(n,JSON.stringify(Ci)),s("Marker file %s: %s",a?"overwritten":"created",n)}catch(w){throw s("Failed to upload the results to the dashboard"),w}}}async function an({ci:t,group:e,instances:r,fullTestSuite:o,config:n,machineId:a,framework:c}){let p=await wo(),u=await Lo(),m={browserName:"node",browserVersion:cn.default.coerce(process.version)?.version},{currents:f}=n,_={platform:{...m,...u},ci:t,commit:p,group:e,fullTestSuite:o,config:n,projectId:f.projectId,recordKey:f.recordKey,ciBuildId:t.ciBuildId.value??void 0,tags:f.tag??[],machineId:f.machineId??a,framework:c,instances:r,previousCiBuildId:process.env.CURRENTS_PREVIOUS_CI_BUILD_ID};return s("Creating run: %o",T(_)),Br(_)}function Ga(t){return $t.default.join(t,"upload.marker.json")}function ka(t){return $t.default.join(t,`.debug-${new Date().toISOString()}.log`)}function Ha(t){return t.length===0||t.some(e=>e.tests.length===0)}async function Ka(t,e,r){s("Uploading %d artifacts",t.length),await Promise.all(t.map(o=>{let n=$t.default.join(e,o.path),a=r.get(o.path)||"application/octet-stream";return ja(n,a,o.uploadUrl)}))}var ja=async(t,e,r)=>{try{if(!await Be.default.pathExists(t)){g("Artifact file not found: %s",t);return}let o=await Be.default.readFile(t);await sn.default.put(r,o,{headers:{"Content-Type":e},timeout:Fa})}catch(o){s("Failed to upload artifact %s: %o",t,o)}};var $a=s.extend("cli");async function pn(t){await G(async e=>{pr(e);let r=Pt();$a("Config: %o",At(r)),await de()},t)}var V=require("@commander-js/extra-typings");var mn=new V.Option("--api-key <api-key>","API key from Currents dashboard for authentication").env(h(j,"apiKey")),un=new V.Option("-o, --output <path>","Path to the file where output will be written").env(h(j,"output")),dn=new V.Option("--ci-build-id <id>","Unique identifier for the run"),ln=new V.Option("-p, --project-id <project>","Project ID from Currents associated with the run").env(h(j,"projectId")),fn=new V.Option("-t, --tag <tag>","Filter by comma-separated list of tags").argParser(pt),gn=new V.Option("--debug","Enable debug logging").env(h(j,"debug")).default(!1),En=new V.Option("-b, --branch <branch>","Filter by git branch name"),Cn=new V.Option("--pw-last-run",'Create Playwright ".last-run.json" file with the failed test(s) from the run');var Vt="api",Va=t=>`
16
+ `)}async function xo(e,t,r=null){let{matrixIndex:o,matrixTotal:n}=e,s=t.params,c=de(s.githubRunAttempt,1),p=Ge(r),u=c>1&&p,m=u?"--last-failed":"",f="";n>1&&(f=u?"--shard=1/1":`--shard=${o}/${n}`);let l=[m,f].filter(Boolean).join(" "),T=e.presetOutput??Te;await oe(T,l),a('Dumped PW config: "%s" for GHA to %s',l,T)}async function No(e,t,r=null){let o=t.params,n=r?.ci.params,s=n?.circleWorkflowId,c=n?.circleWorkflowWorkspaceId,p=de(o.circleNodeIndex,0),u=de(o.circleNodeTotal,1),m=c==o.circleWorkflowWorkspaceId&&s!==o.circleWorkflowId,f=Ge(r),l=m&&f,T=l?"--last-failed":"",_="";u>1&&(_=l?"--shard=1/1":`--shard=${p+1}/${u}`);let w=[T,_].filter(Boolean).join(" "),k=e.presetOutput??Te;await oe(k,w),a('Dumped PW config: "%s" for Circle to %s',w,k)}var de=(e,t)=>{let r=Bt.default.toNumber(e);return Bt.default.isNaN(r)?t:r};async function vt(){let e=z();if(e.type!=="GET_COMMAND_CONFIG"||!e.values)throw new Error("Config is missing!");let{recordKey:t,id:r,preset:o,matrixIndex:n,matrixTotal:s,continue:c}=e.values,p=e.values.outputDir,u=ue();o==="last-run"&&await Do(e.values,u);let{cacheId:m,refMetaReadUrl:f}=await Gr({recordKey:t,ci:u,id:r,config:{matrixIndex:n,matrixTotal:s}});try{let l=await Ha(f),{readUrl:T}=await kr({recordKey:t,cacheKey:l.cacheKey}),_=await ka({readUrl:T,outputDir:p});o==="last-run"&&await wo(e.values,u,l),y(g("- restoring cache to"),_),Ae("Cache restored. Cache ID: %s",m)}catch(l){if((0,Bo.isAxiosError)(l)&&(l.response?.status===403||l.response?.status===404)){let T=`Cache with ID "${m}" not found`;if(c){te(T);return}throw new Error(T)}throw l}}async function ka({readUrl:e,outputDir:t}){let r=await wt(e),o=Ga(t);return await Io(r,o),a("Cache downloaded",{readUrl:e,destination:o}),o}function Ga(e){let t=e??process.cwd();return Lt.default.isAbsolute(t)?t:Lt.default.resolve(process.cwd(),t)}async function Ha(e){let t=await wt(e),r=JSON.parse(t.toString("utf-8"));return a("Meta file downloaded: %O",r),r}var vo=require("lodash");async function Mt(){let e=z();if(e.type!=="SET_COMMAND_CONFIG"||!e.values)throw new Error("Config is missing!");let{recordKey:t,id:r,preset:o,pwOutputDir:n,matrixIndex:s,matrixTotal:c,continue:p}=e.values,u=await Po(e.values.path),m=e.values.path||[],f=ue();if(o==="last-run"&&(m.push(n),u.push(...await So(n))),u.length===0){let k=`No files available to upload: ${m.filter(Boolean).join(",")}`;if(!p)throw new Error(k);te(k)}let l=await Fr({recordKey:t,ci:f,id:r,config:{matrixIndex:s,matrixTotal:c}});a("Cache upload url created",{result:l});let T=ja(f),_=u.length>0?await Co(u):null,w=[];_&&w.push(Ka({archive:_,cacheId:l.cacheId,uploadUrl:l.uploadUrl}).then(()=>{$a(u),a("Cache archive uploaded",{uploadUrl:l.uploadUrl})})),w.push(Lo({meta:xt({cacheId:l.cacheId,config:e.values,ci:T,orgId:l.orgId,path:u}),cacheId:l.cacheId,uploadUrl:l.metaUploadUrl}).then(()=>a("Meta uploaded",{uploadUrl:l.metaUploadUrl})),Lo({meta:xt({cacheId:l.cacheId,config:e.values,ci:T,orgId:l.orgId,path:u,cacheKey:l.cacheKey,metaCacheKey:l.metaCacheKey}),cacheId:l.cacheId,uploadUrl:l.refMetaUploadUrl}).then(()=>a("Ref meta uploaded",{uploadUrl:l.refMetaUploadUrl}))),await Promise.all(w),Ae("Cache uploaded. Cache ID: %s",l.cacheId)}async function Ka({archive:e,cacheId:t,uploadUrl:r}){try{let o="application/zip";await Dt({buffer:e,contentType:o,name:t,uploadUrl:r},o,bt(t)),a("Cache archive uploaded",{cacheId:t})}catch(o){throw a("Failed to upload cache archive",o),o}}async function Lo({meta:e,cacheId:t,uploadUrl:r}){try{let o=`${t}_meta`,n="application/json";await Dt({buffer:e,contentType:n,name:o,uploadUrl:r},n,bt(o)),a("Cache meta uploaded",{cacheId:t})}catch(o){throw a("Failed to upload cache meta",o),o}}function ja(e){return e.ciBuildId.source==="server"||e.ciBuildId.source==="random"?(0,vo.omit)(e,"ciBuildId"):e}function $a(e){y(`Cache upload paths:
17
+ `+e.map(t=>`${g("- uploading")} ${t}`).join(`
18
+ `))}var O={recordKey:{name:"Record Key",env:"CURRENTS_RECORD_KEY",cli:"--key"},projectId:{name:"Project ID",env:"CURRENTS_PROJECT_ID",cli:"--project-id"},ciBuildId:{name:"CI Build ID",env:"CURRENTS_CI_BUILD_ID",cli:"--ci-build-id"},runId:{name:"Run ID",env:"CURRENTS_RUN_ID",cli:"--run-id"},debug:{name:"Debug",env:"CURRENTS_DEBUG",cli:"--debug"}};function Mo(){return{recordKey:process.env[O.recordKey.env],projectId:process.env[O.projectId.env],ciBuildId:process.env[O.ciBuildId.env],runId:process.env[O.runId.env],debug:Ir(process.env[O.debug.env])}}var Va=a.extend("config"),Ya=["recordKey","projectId"];function Ja(e){if(!(e.runId||e.ciBuildId))throw E(`${be(O,"runId")} or ${be(O,"ciBuildId")} is required for Currents Reporter. Use the following methods to set the value:
19
+ - as environment variable: ${g(R(O,"runId"))} or ${g(R(O,"ciBuildId"))}
20
+ - as CLI flag of the command: ${g(we(O,"runId"))} or ${g(we(O,"ciBuildId"))}`),new q("Missing required config variable")}var Ft=null;function Fo(e){Ft=L(O,Ya,Mo,e,Ja),Va("Resolved config: %o",I(Ft))}function He(){return Ft}async function kt(){let e=He();if(!e)throw new Error("Config is missing!");let t=e.runId?`runId: ${e.runId}`:`ciBuildId: ${e.ciBuildId}`;try{let r=await Hr({recordKey:e.recordKey,projectId:e.projectId,ciBuildId:e.ciBuildId,runId:e.runId});return r.data.runId?y('Run "%s" (%s) is cancelled',r.data.runId,t):y('No run to cancel (%s) in project "%s"',t,e.projectId),r}catch(r){throw a("Failed to cancel the run"),r}}var Go=require("@currents/commit-info"),Ho=require("lodash");var Ke=require("lodash");var Gt=a.extend("ci-git");function ko(e){Gt("git commit existing info: %O",e);let t=lo();Gt("commit info from provider environment variables: %O",t);let r=(0,Ke.transform)(e,(o,n,s)=>{let c=n||(t?t[s]:null);return o[s]=(0,Ke.defaultTo)(c,null)});return Gt("combined git and environment variables from provider: %O",r),r}var Wa=async()=>{let e=await(0,Go.commitInfo)();return ko({branch:e.branch,remoteOrigin:e.remote,authorEmail:e.email,authorName:e.author,message:e.message,sha:e.sha,ghaEventData:e.ghaEventData})},Ko=(0,Ho.memoize)(Wa);var jo=d(require("getos")),$o=require("lodash"),v=require("os"),Vo=require("util"),qa=async()=>{if((0,v.platform)()==="linux")try{let e=await(0,Vo.promisify)(jo.default)();return"dist"in e&&"release"in e?[e.dist,e.release].join(" - "):(0,v.release)()}catch{return(0,v.release)()}return(0,v.release)()},Qa=async()=>{let e=await qa();return{osName:(0,v.platform)(),osVersion:e,osCpus:[],osMemory:{free:(0,v.freemem)(),total:(0,v.totalmem)()}}},Yo=(0,$o.memoize)(Qa);var Rn=d(require("axios")),$t=d(require("fs-extra")),qe=d(require("path")),_n=d(require("semver"));var A={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 Jo(){return{projectId:process.env[A.projectId.env],recordKey:process.env[A.recordKey.env],ciBuildId:process.env[A.ciBuildId.env],tag:process.env[A.tag.env]?process.env[A.tag.env]?.split(",").map(e=>e.trim()):void 0,disableTitleTags:process.env[A.disableTitleTags.env],removeTitleTags:process.env[A.removeTitleTags.env],debug:process.env[A.debug.env],machineId:process.env[A.machineId.env]}}var za=a.extend("config"),Xa=["projectId","recordKey"],Ht=null;function Wo(e){Ht=L(A,Xa,Jo,e),za("Resolved Currents config: %o",Ht)}function je(){return Ht}function qo(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 Z=class{constructor(t){this.config=t}async getFullTestSuite(){return[]}};var sn=d(require("fs-extra")),cn=require("jest-cli"),pn=d(require("tmp"));var nn=require("lodash");function Qo(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 zo=require("lodash"),Za=["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 Xo(e){return(0,zo.omit)(e,...Za)}var tn=d(require("fs")),rn=require("jest-config"),Kt=require("lodash"),jt=d(require("path"));function $e(e,t){return(...r)=>new Promise((o,n)=>{let s=0,c=()=>{s++;try{let p=e(...r);o(p)}catch(p){if(s>=t.length)n(p);else{let u=t[s-1];setTimeout(c,u)}}};c()})}var Zo=d(require("fs-extra")),es=d(require("path"));async function Ve(e){let t=await Zo.default.pathExists(e);if(!t)throw new Error("File does not exist");return t}var en=a.extend("jest-discovery");async function on(e){try{let{config:t,configPath:r}=await(0,rn.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"],s=(0,Kt.omit)(t,o);if(s.projects&&(s.projects=s.projects.map(u=>typeof u!="string"?(0,Kt.omit)(u,n):u)),s.rootDir&&Object.keys(s).length===1)return null;let c=jt.default.resolve(r?jt.default.dirname(r):process.cwd(),`.jest-scanner-${new Date().getTime()}.config.cjs`),p=`module.exports=${JSON.stringify(s,null,2)}`;return en("configFileContent: %O",p),tn.default.writeFileSync(c,p),await $e(Ve,[200,200,200,200,200,1e3])(c),c}catch(t){return E("Failed to recreate the config file"),en("error %o",t),null}}async function an(e){let t="!!##ThisPatternWillNotMatchAnyTestName##!!",r=e.options,o=Xo(r),n=Qo(o),s=r.config,c=await on(s);return{cliArgs:[n,"--testNamePattern",t,"--reporters","@currents/cmd/discovery/jest","--shard=1/1",c?`--config=${c}`:"",...e.args].filter(u=>!(0,nn.isEmpty)(u)),configFilePath:c}}var ts=a.extend("jest-discovery");async function mn(e,t){console.time(g("@currents/jest:fullTestSuite-ready"));let{cliArgs:r,configFilePath:o}=await an(t);try{let n=pn.default.fileSync({postfix:".json"});return ts("running scanner: %o",r),process.env.CURRENTS_DISCOVERY_PATH=n.name,await(0,cn.run)(r.concat(["--openHandlesTimeout=0"])),await $e(Ve,Array.from({length:300},()=>100))(n.name),console.timeEnd(g("@currents/jest:fullTestSuite-ready")),await re(n.name)}catch(n){return E("Failed to obtain the jest full test suite:",n),[]}finally{o&&sn.default.unlinkSync(o)}}var Ye=class extends Z{constructor(t){super(t)}async getFullTestSuite(){return mn(this.config.frameworkConfig,this.config.cliArgs)}};var dn=d(require("fs-extra"));var un=d(require("path"));function le(e){return un.default.join(e,"fullTestSuite.json")}var rs=a.extend("junit-discovery");async function ln(e){console.time(g("@currents/junit:fullTestSuite-ready"));try{rs("running scanner: %o",e);let t=le(e);process.env.CURRENTS_DISCOVERY_PATH=t;let r=dn.default.readFileSync(t,"utf-8");return JSON.parse(r)}catch(t){return E("Failed to obtain the junit full test suite:",t),[]}}var Je=class extends Z{constructor(t,r){super(t),this.reportDir=r}async getFullTestSuite(){return ln(this.reportDir)}};function fn(e,t){switch(e.framework){case"jest":return new Ye(e);case"junit":return new Je(e,t);default:return new Z(e)}}var fe=d(require("fs-extra")),Y=d(require("path"));async function gn(e){let t=await os(e?.reportDir);if(!t)throw new Error("Failed to find the report dir");return{reportDir:t,configFilePath:e?.configFilePath??Y.default.join(t,"config.json")}}async function os(e){return e?(await We(e),e):ns((0,Y.join)(process.cwd(),".currents"))}async function ns(e){let t=await fe.default.readdir(e),r=null;for(let o of t){let n=Y.default.join(e,o),s=await fe.default.stat(n);s.isDirectory()&&(!r||s.birthtime>r.birthtime)&&(r={name:o,birthtime:s.birthtime})}return r?(0,Y.resolve)(e,r.name):null}async function We(e){try{return await fe.default.pathExists(e)}catch{return E("Error checking if path exists:",E),!1}}async function En(e){let t=Y.default.join(e,"instances");return is(t)}async function is(e){let t=await fe.default.readdir(e),r=[];for(let o of t){let n=Y.default.join(e,o);(await fe.default.stat(n)).isFile()&&r.push(n)}return r}var as=e=>Buffer.byteLength(JSON.stringify(e),"utf8"),Cn=(e,t=1048576)=>{let r=[],o=[],n=0;for(let s of e){let c=as(s);n+c>t&&(r.push(o),o=[],n=0),o.push(s),n+=c}return o.length>0&&r.push(o),r};var ss=3e4;async function Vt(){let e=je();if(!e)throw new Error("Currents config is missing!");let t=await gn(e);ar(ps(t.reportDir)),a("Reporter options: %o",t),y("Report directory: %s",t.reportDir);let r=await re(t.configFilePath);a("Report config: %o",r);let o=await En(t.reportDir);a("Found %d instance results in the reportDir: %s",o.length,t.reportDir);let n=cs(t.reportDir),s=await We(n),c=le(t.reportDir),p=null;if(s){let G=await re(n);C("Marker file detected. The report was already uploaded: %o",{runUrl:G.response.runUrl,isoDate:G.isoDate})}if(await We(c)&&(p=await re(c),a("Full test suite file detected: %s",c)),p)a("The discovery stage was skipped");else{if(p=await fn(r,t.reportDir).getFullTestSuite(),ms(p))throw new Error("Failed to discover the full test suite!");await oe(c,JSON.stringify(p))}let m=p.length===1?p[0].name:null,f={currents:e},l={type:r.framework,version:r.frameworkVersion,clientVersion:ce,frameworkConfig:{originFramework:r.frameworkConfig?.originFramework,originFrameworkVersion:r.frameworkConfig?.originFrameworkVersion}},T=De.userFacingNanoid(),_=ue(e.ciBuildId),w={};for await(let G of o){let N=await re(G);w[N.groupId]||(w[N.groupId]=[]),w[N.groupId].push(N)}let k=new Map;Object.values(w).forEach(G=>{G.forEach(N=>{N.artifacts?.forEach(B=>{B&&k.set(B.path,B.contentType)}),N.results.tests.forEach(B=>{B.artifacts?.forEach(b=>{b&&k.set(b.path,b.contentType)}),B.attempts.forEach(b=>{b.artifacts?.forEach(ee=>{ee&&k.set(ee.path,ee.contentType)})})})})});for await(let G of Object.keys(w)){let N=w[G],B=G;m&&(a("Default group found: %s, overwriting the group in the results",m),B=m,N=N.map(b=>({...b,groupId:m})));try{let b=Cn(N),ee=await In({ci:_,group:B,instances:[],fullTestSuite:p,config:f,machineId:T,framework:l});for(let it=0;it<b.length;it++){let at=await In({ci:_,group:B,instances:b[it],fullTestSuite:[],config:f,machineId:T,framework:l});at.artifactUploadUrls&&at.artifactUploadUrls.length>0&&await us(at.artifactUploadUrls,t.reportDir,k)}a("Api response: %o",ee),y("[%s] Run created: %s",B,ee.runUrl);let Fi={response:ee,isoDate:new Date().toISOString()};await oe(n,JSON.stringify(Fi)),a("Marker file %s: %s",s?"overwritten":"created",n)}catch(b){throw a("Failed to upload the results to the dashboard"),b}}}async function In({ci:e,group:t,instances:r,fullTestSuite:o,config:n,machineId:s,framework:c}){let p=await Ko(),u=await Yo(),m={browserName:"node",browserVersion:_n.default.coerce(process.version)?.version},{currents:f}=n,T={platform:{...m,...u},ci:e,commit:p,group:t,fullTestSuite:o,config:n,projectId:f.projectId,recordKey:f.recordKey,ciBuildId:e.ciBuildId.value??void 0,tags:f.tag??[],machineId:f.machineId??s,framework:c,instances:r,previousCiBuildId:process.env.CURRENTS_PREVIOUS_CI_BUILD_ID};return a("Creating run: %o",I(T)),Vr(T)}function cs(e){return qe.default.join(e,"upload.marker.json")}function ps(e){return qe.default.join(e,`.debug-${new Date().toISOString()}.log`)}function ms(e){return e.length===0||e.some(t=>t.tests.length===0)}async function us(e,t,r){a("Uploading %d artifacts",e.length),await Promise.all(e.map(o=>{let n=qe.default.join(t,o.path),s=r.get(o.path)||"application/octet-stream";return ds(n,s,o.uploadUrl)}))}var ds=async(e,t,r)=>{try{if(!await $t.default.pathExists(e)){C("Artifact file not found: %s",e);return}let o=await $t.default.readFile(e);await Rn.default.put(r,o,{headers:{"Content-Type":t},timeout:ss})}catch(o){a("Failed to upload artifact %s: %o",e,o)}};var ls=a.extend("cli");async function Tn(e){await x(async t=>{_r(t);let r=xe();ls("Config: %o",Pe(r)),await Rt()},e)}var J=require("@commander-js/extra-typings");var hn=new J.Option("--api-key <api-key>","API key from Currents dashboard for authentication").env(R(V,"apiKey")),On=new J.Option("-o, --output <path>","Path to the file where output will be written").env(R(V,"output")),yn=new J.Option("--ci-build-id <id>","Unique identifier for the run"),Un=new J.Option("-p, --project-id <project>","Project ID from Currents associated with the run").env(R(V,"projectId")),An=new J.Option("-t, --tag <tag>","Filter by comma-separated list of tags").argParser(me),Sn=new J.Option("--debug","Enable debug logging").env(R(V,"debug")).default(!1),Pn=new J.Option("-b, --branch <branch>","Filter by git branch name"),Dn=new J.Option("--pw-last-run",'Create Playwright ".last-run.json" file with the failed test(s) from the run');var Qe="api",fs=e=>`
19
21
 
20
- ${In.default.bold("Examples")}
22
+ ${wn.default.bold("Examples")}
21
23
 
22
24
  Obtain run data by --ci-build-id:
23
- ${C(`${t} ${Vt} get-run --api-key <api-key> --ci-build-id <ci-build-id>`)}
25
+ ${g(`${e} ${Qe} get-run --api-key <api-key> --ci-build-id <ci-build-id>`)}
24
26
 
25
27
  Obtain the most recent run data by filters:
26
- ${C(`${t} ${Vt} get-run --api-key <api-key> --project-id <project-id> --branch <branch> --tag tagA,tagB`)}
28
+ ${g(`${e} ${Qe} get-run --api-key <api-key> --project-id <project-id> --branch <branch> --tag tagA,tagB`)}
27
29
 
28
30
  Obtain run data by --ci-build-id, save the failed test in a format compatible with Playwright --last-failed:
29
- ${C(`${t} ${Vt} get-run --api-key <api-key> --ci-build-id <ci-build-id> --pw-last-run --output <output-path>`)}
31
+ ${g(`${e} ${Qe} get-run --api-key <api-key> --ci-build-id <ci-build-id> --pw-last-run --output <output-path>`)}
30
32
 
31
- `,_n=t=>new ve.Command().command(Vt).description("Interact with the Currents API").showHelpAfterError("(add --help for additional information)").allowUnknownOption().addCommand(Ya(t)),Ya=t=>new ve.Command().name("get-run").description(`Retrieve run data from Currents API ${Va(t)}`).allowUnknownOption().addOption(mn).addOption(gn).addOption(dn).addOption(ln).addOption(En).addOption(fn).addOption(un).addOption(Cn).action(pn);var Yt=require("@commander-js/extra-typings");var hn=l(require("chalk"));var Ja=s.extend("cli");async function Rn(t){await G(async e=>{Kr(jr(e));let r=q();Ja("Config: %o",T(r.values)),await De()},t)}var Wa=s.extend("cli");async function Tn(t){await G(async e=>{Hr($r(e));let r=q();Wa("Config: %o",T(r.values)),await we()},t)}var ft="cache",qa=t=>`
33
+ `,bn=e=>new Yt.Command().command(Qe).description("Interact with the Currents API").showHelpAfterError("(add --help for additional information)").allowUnknownOption().addCommand(gs(e)),gs=e=>new Yt.Command().name("get-run").description(`Retrieve run data from Currents API ${fs(e)}`).allowUnknownOption().addOption(hn).addOption(Sn).addOption(yn).addOption(Un).addOption(Pn).addOption(An).addOption(On).addOption(Dn).action(Tn);var ze=require("@commander-js/extra-typings");var Bn=d(require("chalk"));var Es=a.extend("cli");async function xn(e){await x(async t=>{Xr(Zr(t));let r=z();Es("Config: %o",I(r.values)),await vt()},e)}var Cs=a.extend("cli");async function Nn(e){await x(async t=>{zr(eo(t));let r=z();Cs("Config: %o",I(r.values)),await Mt()},e)}var ge="cache",Is=e=>`
32
34
 
33
- ${hn.default.bold("Examples")}
35
+ ${Bn.default.bold("Examples")}
34
36
 
35
37
  Save files to the cache under a specific ID:
36
- ${C(`${t} ${ft} set --key <record-key> --id <id> --path <path-1,path-2,...path-n>`)}
38
+ ${g(`${e} ${ge} set --key <record-key> --id <id> --path <path-1,path-2,...path-n>`)}
37
39
 
38
40
  Retrieve files from the cache saved under a specific ID:
39
- ${C(`${t} ${ft} get --key <record-key> --id <id>`)}
41
+ ${g(`${e} ${ge} get --key <record-key> --id <id>`)}
40
42
 
41
43
  Store the last run data in the cache:
42
- ${C(`${t} ${ft} set --key <record-key> --preset last-run`)}
44
+ ${g(`${e} ${ge} set --key <record-key> --preset last-run`)}
43
45
 
44
46
  Retrieve the last run data from the cache:
45
- ${C(`${t} ${ft} get --key <record-key> --preset last-run`)}
47
+ ${g(`${e} ${ge} get --key <record-key> --preset last-run`)}
46
48
 
47
49
  Retrieve the last run data from the cache and save it to a custom directory:
48
- ${C(`${t} ${ft} get --key <record-key> --preset last-run --output-dir <outputDir>`)}
50
+ ${g(`${e} ${ge} get --key <record-key> --preset last-run --output-dir <outputDir>`)}
49
51
 
50
- `,On=t=>new Yt.Command().command(ft).description(`Cache data to Currents ${qa(t)}`).showHelpAfterError("(add --help for additional information)").allowUnknownOption().addCommand(Qa()).addCommand(za()),Qa=()=>new Yt.Command().name("set").allowUnknownOption().addOption(fe).addOption(Ee).addOption(Ce).addOption(Yr).addOption(ge).addOption(Wr).addOption(Ie).addOption(_e).addOption(Xr).action(Tn),za=()=>new Yt.Command().name("get").allowUnknownOption().addOption(fe).addOption(Ee).addOption(Ce).addOption(Jr).addOption(qr).addOption(ge).addOption(Ie).addOption(_e).addOption(zr).action(Rn);var vn=require("@commander-js/extra-typings"),Fn=l(require("chalk"));var k=require("@commander-js/extra-typings");var Un=new k.Option("--ci-build-id <id>","the unique identifier for the recorded build (run)").env(h(U,"ciBuildId")),yn=new k.Option("-k, --key <record-key>","your secret Record Key obtained from Currents").env(h(U,"recordKey")),An=new k.Option("-p, --project-id <project>","the project ID for results reporting obtained from Currents").env(h(U,"projectId")),Sn=new k.Option("-t, --tag <tag>","comma-separated tag(s) for recorded runs in Currents").argParser(pt),Pn=new k.Option("--remove-title-tags","remove tags from test names in Currents, e.g. `Test name @smoke` becomes `Test name` in the dashboard").default(!1),Dn=new k.Option("--disable-title-tags","disable parsing tags from test title, e.g. `Test name @smoke` would not be tagged with `smoke` in the dashboard").default(!1),wn=new k.Option("--machine-id <string>","unique identifier of the machine running the tests. If not provided, it will be generated automatically. See: https://docs.currents.dev/?q=machineId").env(h(U,"machineId")),bn=new k.Option("--report-dir <string>","explicit path to the report directory").env(h(U,"reportDir")),xn=new k.Option("--debug","enable debug logs").env(h(U,"debug")).default(!1);var Bn=l(require("fs"));var Nn=require("tmp-promise"),Ln=async()=>{let{path:t}=await(0,Nn.file)();return t};var Fe=s.extend("cli"),Jt=class{constructor(e){this.configFilePath=null;this.cliOptions=e,Fe("CLI options: %o",T(this.cliOptions)),this.parsedConfig=vo(this.cliOptions),Fe("Parsed config from CLI options: %o",T(this.parsedConfig))}async getConfigFilePath(){if(this.configFilePath)return this.configFilePath;let e=await Ln();return Bn.default.writeFileSync(e,JSON.stringify(this.parsedConfig)),Fe("CLI options temp file path: %s",e),this.configFilePath=e,e}};async function Mn(t){await G(async e=>{let r=new Jt(e);Mo(r.parsedConfig);let o=Ft();A("Currents config: %o",T(o)),await Me()},t)}var _t="upload",Xa=t=>`
52
+ `,Ln=e=>new ze.Command().command(ge).description(`Cache data to Currents ${Is(e)}`).showHelpAfterError("(add --help for additional information)").allowUnknownOption().addCommand(Rs()).addCommand(_s()),Rs=()=>new ze.Command().name("set").allowUnknownOption().addOption(Tt).addOption(Ot).addOption(yt).addOption(ro).addOption(ht).addOption(no).addOption(Ut).addOption(At).addOption(co).action(Nn),_s=()=>new ze.Command().name("get").allowUnknownOption().addOption(Tt).addOption(Ot).addOption(yt).addOption(oo).addOption(io).addOption(ht).addOption(Ut).addOption(At).addOption(so).action(xn);var Kn=require("@commander-js/extra-typings");var jn=d(require("chalk"));var Ts=a.extend("cli");async function vn(e){await x(async({key:t,...r})=>{Fo({...r,recordKey:t});let o=He();Ts("Config: %o",I(o??{})),await kt()},e)}var Ee=require("@commander-js/extra-typings");var Mn=new Ee.Option("-k, --key <record-key>","your secret Record Key obtained from Currents").env(R(O,"recordKey")),Fn=new Ee.Option("-p, --project-id <project>","the project ID the run belongs to").env(R(O,"projectId")),kn=new Ee.Option("--ci-build-id <id>","the unique identifier of the build (run) to cancel").env(R(O,"ciBuildId")),Gn=new Ee.Option("--run-id <id>","the identifier of the run to cancel, as reported when the run was created").env(R(O,"runId")),Hn=new Ee.Option("--debug","enable debug logs").env(R(O,"debug")).default(!1);var Jt="cancel",hs=e=>`
51
53
 
52
- ${Fn.default.bold("Examples")}
54
+ ${jn.default.bold("Examples")}
55
+
56
+ Cancel the run recorded under a CI build id:
57
+ ${g(`${e} ${Jt} --key <record-key> --project-id <id> --ci-build-id <build-id>`)}
58
+
59
+ Cancel a run by its id, as reported when the run was created:
60
+ ${g(`${e} ${Jt} --key <record-key> --project-id <id> --run-id <run-id>`)}
61
+
62
+ Cancel the run when a GitHub Actions workflow is cancelled:
63
+ ${g("- if: ${{ cancelled() }}\n run: npx currents cancel")}
64
+
65
+ `,$n=e=>new Kn.Command().name(Jt).description(`Cancel a run in progress, e.g. when the CI job it belongs to is cancelled ${hs(e)}`).allowUnknownOption().addOption(Mn).addOption(Fn).addOption(kn).addOption(Gn).addOption(Hn).action(vn);var ni=require("@commander-js/extra-typings"),ii=d(require("chalk"));var j=require("@commander-js/extra-typings");var Vn=new j.Option("--ci-build-id <id>","the unique identifier for the recorded build (run)").env(R(A,"ciBuildId")),Yn=new j.Option("-k, --key <record-key>","your secret Record Key obtained from Currents").env(R(A,"recordKey")),Jn=new j.Option("-p, --project-id <project>","the project ID for results reporting obtained from Currents").env(R(A,"projectId")),Wn=new j.Option("-t, --tag <tag>","comma-separated tag(s) for recorded runs in Currents").argParser(me),qn=new j.Option("--remove-title-tags","remove tags from test names in Currents, e.g. `Test name @smoke` becomes `Test name` in the dashboard").default(!1),Qn=new j.Option("--disable-title-tags","disable parsing tags from test title, e.g. `Test name @smoke` would not be tagged with `smoke` in the dashboard").default(!1),zn=new j.Option("--machine-id <string>","unique identifier of the machine running the tests. If not provided, it will be generated automatically. See: https://docs.currents.dev/?q=machineId").env(R(A,"machineId")),Xn=new j.Option("--report-dir <string>","explicit path to the report directory").env(R(A,"reportDir")),Zn=new j.Option("--debug","enable debug logs").env(R(A,"debug")).default(!1);var ri=d(require("fs"));var ei=require("tmp-promise"),ti=async()=>{let{path:e}=await(0,ei.file)();return e};var Wt=a.extend("cli"),Xe=class{constructor(t){this.configFilePath=null;this.cliOptions=t,Wt("CLI options: %o",I(this.cliOptions)),this.parsedConfig=qo(this.cliOptions),Wt("Parsed config from CLI options: %o",I(this.parsedConfig))}async getConfigFilePath(){if(this.configFilePath)return this.configFilePath;let t=await ti();return ri.default.writeFileSync(t,JSON.stringify(this.parsedConfig)),Wt("CLI options temp file path: %s",t),this.configFilePath=t,t}};async function oi(e){await x(async t=>{let r=new Xe(t);Wo(r.parsedConfig);let o=je();y("Currents config: %o",I(o)),await Vt()},e)}var he="upload",Os=e=>`
66
+
67
+ ${ii.default.bold("Examples")}
53
68
 
54
69
  Upload test results to Currents:
55
- ${C(`${t} ${_t} --key <record-key> --project-id <id> --ci-build-id <build-id>`)}
70
+ ${g(`${e} ${he} --key <record-key> --project-id <id> --ci-build-id <build-id>`)}
56
71
 
57
72
  Upload test results to Currents, add tags "tagA", "tagB" to the recorded run:
58
- ${C(`${t} ${_t} --key <record-key> --project-id <id> --ci-build-id <build-id> --tag tagA --tag tagB`)}
73
+ ${g(`${e} ${he} --key <record-key> --project-id <id> --ci-build-id <build-id> --tag tagA --tag tagB`)}
59
74
 
60
75
  Provide a custom path to the reports directory:
61
- ${C(`${t} ${_t} --key <record-key> --project-id <id> --ci-build-id <build-id> --report-dir <report-dir>`)}
76
+ ${g(`${e} ${he} --key <record-key> --project-id <id> --ci-build-id <build-id> --report-dir <report-dir>`)}
62
77
 
63
- `,Gn=t=>new vn.Command().name(_t).command(_t).showHelpAfterError("(add --help for additional information)").allowUnknownOption().description(`Upload test results generated by Currents reporters to https://currents.dev
64
- ${Xa(t)}`).addOption(Un).addOption(yn).addOption(An).addOption(Sn).addOption(Pn).addOption(Dn).addOption(wn).addOption(xn).addOption(bn).action(r=>Mn(r));var di=require("@commander-js/extra-typings");var li=l(require("chalk"));var Rt={debug:{name:"Debug",env:"CURRENTS_DEBUG",cli:"--debug"},inputFormat:{name:"Input Format",cli:"--input-format"},inputFiles:{name:"Input File",cli:"--input-file"},outputDir:{name:"Output Dir",cli:"--output-dir"},framework:{name:"Framework",cli:"--framework"},frameworkVersion:{name:"Framework Version",cli:"--framework-version"}};function kn(){return{debug:process.env[Rt.debug.env]}}var Za=s.extend("config"),ts=["inputFormat","inputFiles","framework"],Ge=null;function Hn(t){Ge=K(Rt,ts,kn,t),Za("Resolved config: %o",Ge)}function Wt(){return Ge}function Kn(t){return{inputFiles:t.inputFile,inputFormat:t.inputFormat,outputDir:t.outputDir,framework:t.framework,frameworkVersion:t.frameworkVersion,debug:t.debug}}var it=require("path");var Jn=require("lodash"),Wn=l(require("crypto"));var L=require("path"),Qt=async(t,e,r,o)=>{if(t)for(let n of t)try{let a=(0,L.resolve)(o,n.path),c=(0,L.relative)(o,a);if(c.startsWith("..")||(0,L.isAbsolute)(c)){s("Skipping artifact outside workspace: %s (resolved: %s)",n.path,a);continue}let p=`${rt(e+n.path)}.${(0,L.extname)(n.path).slice(1)||"bin"}`;await nr(a,(0,L.join)(r,p)),n.path=(0,L.join)("artifacts",p)}catch(a){s("Failed to copy artifact %s: %o",n.path,a)}};function $n(t){let e=Yn(t.properties?.property??t.property);return qt(e,"currents.artifact.instance.","spec")}function Vn(t){let e=Yn(t.properties?.property),r=qt(e,"currents.artifact.test.","test"),o=new Map;es(e).forEach((c,p)=>{o.has(p)||o.set(p,[]),o.get(p).push(...c)});let a=qt(e,"currents.artifact.attempt.","attempt");return a.length>0&&(o.has(0)||o.set(0,[]),o.get(0).push(...a)),{testArtifacts:r,attemptArtifacts:o}}function es(t){let e=new Map,r=/^currents\.artifact\.attempt\.(\d+)\.(.+)$/,o=new Map;for(let n of t){let a=n.value??n._;if(!n.name||!a)continue;let c=n.name.match(r);if(!c)continue;let[,p,u]=c,m=parseInt(p,10);o.has(m)||o.set(m,[]),o.get(m).push({name:`currents.artifact.attempt.${u}`,value:a})}for(let[n,a]of o.entries()){let c=qt(a,"currents.artifact.attempt.","attempt");c.length>0&&e.set(n,c)}return e}function qt(t,e,r){let o=[],n={};for(let a of t){let c=a.value??a._;if(!a.name||!c||!a.name.startsWith(e))continue;let p=a.name.slice(e.length);/^\d+\./.test(p)||["path","type","contentType","name"].includes(p)&&(n[p]&&(jn(n)&&o.push({...n,level:r}),n={}),n[p]=c)}return jn(n)&&o.push({...n,level:r}),o}function jn(t){return!!(t.path&&t.type&&t.contentType)}function Yn(t){return t?Array.isArray(t)?t:[t]:[]}function qn(t,e,r,o){let n=nt(t.failure),a=n.length>0,c=e?.timestamp??"",p="skipped"in t,u=p?"pending":a?"failed":"passed",{testArtifacts:m,attemptArtifacts:f}=Vn(t);return{_t:zt(c),testId:je(Tt(t.name,o).join(", "),o),title:Tt(t.name,o),state:u,isFlaky:rs(),expectedStatus:"passed",timeout:os(),location:ns(e?.file??""),retries:is(n),artifacts:m,attempts:as(t,n,$e(c),r,f,p)}}function je(t,e){let r=`${t}${e}`;return Wn.default.createHash("sha256").update(r).digest("hex").substring(0,16)}function zt(t){return Qn(t)?new Date(t).getTime():new Date().getTime()}function $e(t){return Qn(t)?new Date(t).toISOString():new Date().toISOString()}function Qn(t){let e=new Date(t);return!isNaN(e.getTime())}function Tt(t,e){return[e,t].filter(Boolean)}function rs(){return!1}function os(){return 0}function ns(t){return{column:1,file:t,line:1}}function is(t){let e=0;return t.forEach(r=>{typeof r!="string"&&e++}),e}function as(t,e,r,o,n,a){let c=t.time?Xt(t.time):0;if(a)return[{_s:"pending",attempt:0,startTime:r,steps:[],duration:c,status:"skipped",stdout:ke(t?.["system-out"]),stderr:He(t?.["system-err"]),artifacts:n.get(0),errors:[],error:void 0}];if(e.length===0){let p=[];return n.forEach(u=>{p.push(...u)}),[{_s:"passed",attempt:0,startTime:r,steps:[],duration:c,status:"passed",stdout:ke(t?.["system-out"]),stderr:He(t?.["system-err"]),artifacts:p,errors:[],error:void 0}]}return e.reduce((p,u,m)=>{if(u!=="true"&&u!=="false"){let f=ss(u);p.push({_s:"failed",attempt:m,startTime:cs(o,r),steps:[],duration:c,status:"failed",stdout:ke(t?.["system-out"]),stderr:He(t?.["system-err"]),artifacts:n.get(m),errors:f,error:f[0]})}return p},[])}function ke(t){return t?[t]:[]}function He(t){return t?[t]:[]}function ss(t){return t==="true"||t==="false"?[]:[typeof t=="string"?{message:t}:{message:t.message,stack:t._,value:t.type}]}function cs(t,e){let r=zt(e)+t;return new Date(r).toISOString()}function nt(t){return t?Array.isArray(t)?t:[t]:[]}function ps(t){return Math.round(t*1e3)}function Xt(t){let e=parseFloat(t);return isNaN(e)?0:ps(e)}function Zt(t,e,r){let o=(0,Jn.isNumber)(r)&&r>0,n=!!t.id&&Ke(e,"id",t.id);if(t.file){let a=Ke(e,"file",t.file);return a&&!n?`${t.file} - ${t.id}`:a&&o?`${t.file} - ${r}`:t.file}if(t.name){let a=Ke(e,"name",t.name);return a&&!n?`${t.name} - ${t.id}`:a&&o?`${t.name} - ${r}`:t.name}return t.id?n&&o?`${t.id} - ${r}`:t.id:o?`unknown - ${r}`:"unknown"}function Ke(t,e,r){return t.filter(n=>n[e]===r).length>1}function zn(t){let e=[];return t.forEach(r=>{let o=nt(r.testsuites?.testsuite),n={name:r.testsuites?.name??"No name",tags:[],tests:[]};o?.forEach(a=>{let c=Zt(a,o);nt(a?.testcase)?.forEach(u=>{let m={title:Tt(u.name,c),spec:c,tags:[],testId:je(Tt(u.name,c).join(", "),c)};n.tests.push(m)})}),e.push(n)}),e}var Y=require("@commander-js/extra-typings"),Xn=l(require("globby"));var Zn=new Y.Option("--debug","Enable debug logging").env(h(Rt,"debug")).default(!1),Ve=(e=>(e.junit="junit",e))(Ve||{}),ti=new Y.Option("--input-format <string>","the format of the input test reports").choices(Object.values(Ve)),ei=new Y.Option("--input-file <patterns>",'comma-separated glob patterns to match report file paths (e.g., "report1.xml,report2.xml")').argParser(ms),ri=new Y.Option("-o, --output-dir <string>","the directory to save the converted test reports"),Ye=(n=>(n.postman="postman",n.node="node",n.vitest="vitest",n.wdio="wdio",n))(Ye||{}),oi=new Y.Option("--framework <string>","the testing framework used to generate the test reports").choices(Object.values(Ye)),ni=new Y.Option("--framework-version <string>","the version of the testing framework used to generate the test reports");function ms(t){let e=t.split(",").map(o=>o.trim()),r=Xn.sync(e);if(r.length===0)throw new Y.InvalidArgumentError("No files found with the provided patterns");return r}async function B(t){let e=new Map;return t.forEach(r=>{let o=nt(r.testsuites?.testsuite),n=r.testsuites?.name??"No name";o.forEach((a,c)=>{let p=Zt(a,o,c),u=us(a,n,p),m=rt(n+p);u.results.tests.length!==0&&e.set(m,u)})}),e}function us(t,e,r){let o=$e(t.timestamp??""),n=t.time?Xt(t.time):0,a=new Date(zt(t.timestamp??"")+n),c=nt(t.testcase),p=[t["system-out"],t["system-err"],...c.flatMap(I=>[I["system-out"],I["system-err"]])].filter(I=>I).join(`
65
- `),u=0,m=c.filter(I=>"failure"in I).length,f=c.filter(I=>"skipped"in I).length,d=c.length-m-f;return{groupId:e,spec:r,startTime:o,artifacts:$n(t),_stdout:p,results:{stats:{suites:1,tests:c.length,passes:d,pending:f,skipped:0,failures:m,flaky:0,wallClockStartedAt:o,wallClockEndedAt:a.toISOString(),wallClockDuration:n},tests:c?.map(I=>(c[0]?.time&&(u+=Xt(c[0].time)),qn(I,t,u,r)))}}}async function ii({inputFormat:t,framework:e,parsedXMLArray:r}){return t==="junit"?ds(e,r):new Map}async function ds(t,e){switch(t){case"node":return B(e);case"postman":return B(e);case"vitest":return B(e);case"wdio":return B(e);default:return g("Unsupported framework: %s",t),new Map}}var ai=require("fs-extra"),si=require("xml2js");async function ci(t){let e=await Promise.all(t.map(o=>(0,ai.readFile)(o,"utf-8"))),r=(await Promise.all(e.map(ls))).filter(Boolean);return e.length!==r.length&&g("Some files could not be parsed. Enable debug logging for more details"),r}async function ls(t){let e=t.trim();if(!e)return null;try{return await(0,si.parseStringPromise)(e,{explicitArray:!1,mergeAttrs:!0})||null}catch(r){return s("Error parsing XML input",r),null}}function pi(t){return{framework:t.inputFormat,frameworkVersion:t.frameworkVersion??null,frameworkConfig:{originFramework:t.framework,originFrameworkVersion:t.frameworkVersion}}}async function mi(){try{let t=Wt();if(!t)throw new Error("Config is missing!");let e=t.outputDir?await Ct(t.outputDir):await or(process.cwd(),".currents"),r=await Ct((0,it.join)(e,"instances")),o=pi(t);s("Report config:",o),A("[currents] Convertion files: %s",t.inputFiles.join(", ")),await Et((0,it.join)(e,"config.json"),JSON.stringify(o));let n=await ci(t.inputFiles);if(n.length===0)throw new Error("No valid XML JUnit report was found.");let a=zn(n);await Et(dt(e),JSON.stringify(a));let c=await ii({inputFormat:t.inputFormat,framework:t.framework,parsedXMLArray:n}),p=await Ct((0,it.join)(e,"artifacts")),u=process.cwd();await Promise.all(Array.from(c.values()).map(async m=>{if(await Qt(m.artifacts,m.spec,p,u),m._stdout){let f=`${rt(m.spec)}.stdout.txt`;await Et((0,it.join)(p,f),m._stdout),m.artifacts||(m.artifacts=[]),m.artifacts.push({path:(0,it.join)("artifacts",f),type:"stdout",contentType:"text/plain",level:"spec"}),delete m._stdout}for(let f of m.results.tests){await Qt(f.artifacts,f.testId,p,u);for(let d of f.attempts)await Qt(d.artifacts,f.testId+d.attempt,p,u)}})),await Promise.all(Array.from(c.entries()).map(([m,f])=>Et((0,it.join)(r,`${rt(m)}.json`),JSON.stringify(f)))),A("[currents] Conversion completed, report saved to: %s",e)}catch(t){throw s("Failed to convert: %o",t),t}}var fs=s.extend("cli");async function ui(t){await G(async e=>{Hn(Kn(e));let r=Wt();fs("Config: %o",r),await mi()},t)}var Je="convert",gs=t=>`
78
+ `,ai=e=>new ni.Command().name(he).command(he).showHelpAfterError("(add --help for additional information)").allowUnknownOption().description(`Upload test results generated by Currents reporters to https://currents.dev
79
+ ${Os(e)}`).addOption(Vn).addOption(Yn).addOption(Jn).addOption(Wn).addOption(qn).addOption(Qn).addOption(zn).addOption(Zn).addOption(Xn).action(r=>oi(r));var Ni=require("@commander-js/extra-typings");var Bi=d(require("chalk"));var Oe={debug:{name:"Debug",env:"CURRENTS_DEBUG",cli:"--debug"},inputFormat:{name:"Input Format",cli:"--input-format"},inputFiles:{name:"Input File",cli:"--input-file"},outputDir:{name:"Output Dir",cli:"--output-dir"},framework:{name:"Framework",cli:"--framework"},frameworkVersion:{name:"Framework Version",cli:"--framework-version"}};function si(){return{debug:process.env[Oe.debug.env]}}var ys=a.extend("config"),Us=["inputFormat","inputFiles","framework"],qt=null;function ci(e){qt=L(Oe,Us,si,e),ys("Resolved config: %o",qt)}function Ze(){return qt}function pi(e){return{inputFiles:e.inputFile,inputFormat:e.inputFormat,outputDir:e.outputDir,framework:e.framework,frameworkVersion:e.frameworkVersion,debug:e.debug}}var se=require("path");var fi=require("lodash"),gi=d(require("crypto"));var M=require("path"),tt=async(e,t,r,o)=>{if(e)for(let n of e)try{let s=(0,M.resolve)(o,n.path),c=(0,M.relative)(o,s);if(c.startsWith("..")||(0,M.isAbsolute)(c)){a("Skipping artifact outside workspace: %s (resolved: %s)",n.path,s);continue}let p=`${ne(t+n.path)}.${(0,M.extname)(n.path).slice(1)||"bin"}`;await fr(s,(0,M.join)(r,p)),n.path=(0,M.join)("artifacts",p)}catch(s){a("Failed to copy artifact %s: %o",n.path,s)}};function ui(e){let t=li(e.properties?.property??e.property);return et(t,"currents.artifact.instance.","spec")}function di(e){let t=li(e.properties?.property),r=et(t,"currents.artifact.test.","test"),o=new Map;As(t).forEach((c,p)=>{o.has(p)||o.set(p,[]),o.get(p).push(...c)});let s=et(t,"currents.artifact.attempt.","attempt");return s.length>0&&(o.has(0)||o.set(0,[]),o.get(0).push(...s)),{testArtifacts:r,attemptArtifacts:o}}function As(e){let t=new Map,r=/^currents\.artifact\.attempt\.(\d+)\.(.+)$/,o=new Map;for(let n of e){let s=n.value??n._;if(!n.name||!s)continue;let c=n.name.match(r);if(!c)continue;let[,p,u]=c,m=parseInt(p,10);o.has(m)||o.set(m,[]),o.get(m).push({name:`currents.artifact.attempt.${u}`,value:s})}for(let[n,s]of o.entries()){let c=et(s,"currents.artifact.attempt.","attempt");c.length>0&&t.set(n,c)}return t}function et(e,t,r){let o=[],n={};for(let s of e){let c=s.value??s._;if(!s.name||!c||!s.name.startsWith(t))continue;let p=s.name.slice(t.length);/^\d+\./.test(p)||["path","type","contentType","name"].includes(p)&&(n[p]&&(mi(n)&&o.push({...n,level:r}),n={}),n[p]=c)}return mi(n)&&o.push({...n,level:r}),o}function mi(e){return!!(e.path&&e.type&&e.contentType)}function li(e){return e?Array.isArray(e)?e:[e]:[]}function Ei(e,t,r,o){let n=ae(e.failure),s=n.length>0,c=t?.timestamp??"",p="skipped"in e,u=p?"pending":s?"failed":"passed",{testArtifacts:m,attemptArtifacts:f}=di(e);return{_t:rt(c),testId:Zt(ye(e.name,o).join(", "),o),title:ye(e.name,o),state:u,isFlaky:Ss(),expectedStatus:"passed",timeout:Ps(),location:Ds(t?.file??""),retries:ws(n),artifacts:m,attempts:bs(e,n,er(c),r,f,p)}}function Zt(e,t){let r=`${e}${t}`;return gi.default.createHash("sha256").update(r).digest("hex").substring(0,16)}function rt(e){return Ci(e)?new Date(e).getTime():new Date().getTime()}function er(e){return Ci(e)?new Date(e).toISOString():new Date().toISOString()}function Ci(e){let t=new Date(e);return!isNaN(t.getTime())}function ye(e,t){return[t,e].filter(Boolean)}function Ss(){return!1}function Ps(){return 0}function Ds(e){return{column:1,file:e,line:1}}function ws(e){let t=0;return e.forEach(r=>{typeof r!="string"&&t++}),t}function bs(e,t,r,o,n,s){let c=e.time?ot(e.time):0;if(s)return[{_s:"pending",attempt:0,startTime:r,steps:[],duration:c,status:"skipped",stdout:Qt(e?.["system-out"]),stderr:zt(e?.["system-err"]),artifacts:n.get(0),errors:[],error:void 0}];if(t.length===0){let p=[];return n.forEach(u=>{p.push(...u)}),[{_s:"passed",attempt:0,startTime:r,steps:[],duration:c,status:"passed",stdout:Qt(e?.["system-out"]),stderr:zt(e?.["system-err"]),artifacts:p,errors:[],error:void 0}]}return t.reduce((p,u,m)=>{if(u!=="true"&&u!=="false"){let f=xs(u);p.push({_s:"failed",attempt:m,startTime:Ns(o,r),steps:[],duration:c,status:"failed",stdout:Qt(e?.["system-out"]),stderr:zt(e?.["system-err"]),artifacts:n.get(m),errors:f,error:f[0]})}return p},[])}function Qt(e){return e?[e]:[]}function zt(e){return e?[e]:[]}function xs(e){return e==="true"||e==="false"?[]:[typeof e=="string"?{message:e}:{message:e.message,stack:e._,value:e.type}]}function Ns(e,t){let r=rt(t)+e;return new Date(r).toISOString()}function ae(e){return e?Array.isArray(e)?e:[e]:[]}function Bs(e){return Math.round(e*1e3)}function ot(e){let t=parseFloat(e);return isNaN(t)?0:Bs(t)}function nt(e,t,r){let o=(0,fi.isNumber)(r)&&r>0,n=!!e.id&&Xt(t,"id",e.id);if(e.file){let s=Xt(t,"file",e.file);return s&&!n?`${e.file} - ${e.id}`:s&&o?`${e.file} - ${r}`:e.file}if(e.name){let s=Xt(t,"name",e.name);return s&&!n?`${e.name} - ${e.id}`:s&&o?`${e.name} - ${r}`:e.name}return e.id?n&&o?`${e.id} - ${r}`:e.id:o?`unknown - ${r}`:"unknown"}function Xt(e,t,r){return e.filter(n=>n[t]===r).length>1}function Ii(e){let t=[];return e.forEach(r=>{let o=ae(r.testsuites?.testsuite),n={name:r.testsuites?.name??"No name",tags:[],tests:[]};o?.forEach(s=>{let c=nt(s,o);ae(s?.testcase)?.forEach(u=>{let m={title:ye(u.name,c),spec:c,tags:[],testId:Zt(ye(u.name,c).join(", "),c)};n.tests.push(m)})}),t.push(n)}),t}var W=require("@commander-js/extra-typings"),Ri=d(require("globby"));var _i=new W.Option("--debug","Enable debug logging").env(R(Oe,"debug")).default(!1),tr=(t=>(t.junit="junit",t))(tr||{}),Ti=new W.Option("--input-format <string>","the format of the input test reports").choices(Object.values(tr)),hi=new W.Option("--input-file <patterns>",'comma-separated glob patterns to match report file paths (e.g., "report1.xml,report2.xml")').argParser(Ls),Oi=new W.Option("-o, --output-dir <string>","the directory to save the converted test reports"),rr=(n=>(n.postman="postman",n.node="node",n.vitest="vitest",n.wdio="wdio",n))(rr||{}),yi=new W.Option("--framework <string>","the testing framework used to generate the test reports").choices(Object.values(rr)),Ui=new W.Option("--framework-version <string>","the version of the testing framework used to generate the test reports");function Ls(e){let t=e.split(",").map(o=>o.trim()),r=Ri.sync(t);if(r.length===0)throw new W.InvalidArgumentError("No files found with the provided patterns");return r}async function F(e){let t=new Map;return e.forEach(r=>{let o=ae(r.testsuites?.testsuite),n=r.testsuites?.name??"No name";o.forEach((s,c)=>{let p=nt(s,o,c),u=vs(s,n,p),m=ne(n+p);u.results.tests.length!==0&&t.set(m,u)})}),t}function vs(e,t,r){let o=er(e.timestamp??""),n=e.time?ot(e.time):0,s=new Date(rt(e.timestamp??"")+n),c=ae(e.testcase),p=[e["system-out"],e["system-err"],...c.flatMap(_=>[_["system-out"],_["system-err"]])].filter(_=>_).join(`
80
+ `),u=0,m=c.filter(_=>"failure"in _).length,f=c.filter(_=>"skipped"in _).length,l=c.length-m-f;return{groupId:t,spec:r,startTime:o,artifacts:ui(e),_stdout:p,results:{stats:{suites:1,tests:c.length,passes:l,pending:f,skipped:0,failures:m,flaky:0,wallClockStartedAt:o,wallClockEndedAt:s.toISOString(),wallClockDuration:n},tests:c?.map(_=>(c[0]?.time&&(u+=ot(c[0].time)),Ei(_,e,u,r)))}}}async function Ai({inputFormat:e,framework:t,parsedXMLArray:r}){return e==="junit"?Ms(t,r):new Map}async function Ms(e,t){switch(e){case"node":return F(t);case"postman":return F(t);case"vitest":return F(t);case"wdio":return F(t);default:return C("Unsupported framework: %s",e),new Map}}var Si=require("fs-extra"),Pi=require("xml2js");async function Di(e){let t=await Promise.all(e.map(o=>(0,Si.readFile)(o,"utf-8"))),r=(await Promise.all(t.map(Fs))).filter(Boolean);return t.length!==r.length&&C("Some files could not be parsed. Enable debug logging for more details"),r}async function Fs(e){let t=e.trim();if(!t)return null;try{return await(0,Pi.parseStringPromise)(t,{explicitArray:!1,mergeAttrs:!0})||null}catch(r){return a("Error parsing XML input",r),null}}function wi(e){return{framework:e.inputFormat,frameworkVersion:e.frameworkVersion??null,frameworkConfig:{originFramework:e.framework,originFrameworkVersion:e.frameworkVersion}}}async function bi(){try{let e=Ze();if(!e)throw new Error("Config is missing!");let t=e.outputDir?await _e(e.outputDir):await lr(process.cwd(),".currents"),r=await _e((0,se.join)(t,"instances")),o=wi(e);a("Report config:",o),y("[currents] Convertion files: %s",e.inputFiles.join(", ")),await Re((0,se.join)(t,"config.json"),JSON.stringify(o));let n=await Di(e.inputFiles);if(n.length===0)throw new Error("No valid XML JUnit report was found.");let s=Ii(n);await Re(le(t),JSON.stringify(s));let c=await Ai({inputFormat:e.inputFormat,framework:e.framework,parsedXMLArray:n}),p=await _e((0,se.join)(t,"artifacts")),u=process.cwd();await Promise.all(Array.from(c.values()).map(async m=>{if(await tt(m.artifacts,m.spec,p,u),m._stdout){let f=`${ne(m.spec)}.stdout.txt`;await Re((0,se.join)(p,f),m._stdout),m.artifacts||(m.artifacts=[]),m.artifacts.push({path:(0,se.join)("artifacts",f),type:"stdout",contentType:"text/plain",level:"spec"}),delete m._stdout}for(let f of m.results.tests){await tt(f.artifacts,f.testId,p,u);for(let l of f.attempts)await tt(l.artifacts,f.testId+l.attempt,p,u)}})),await Promise.all(Array.from(c.entries()).map(([m,f])=>Re((0,se.join)(r,`${ne(m)}.json`),JSON.stringify(f)))),y("[currents] Conversion completed, report saved to: %s",t)}catch(e){throw a("Failed to convert: %o",e),e}}var ks=a.extend("cli");async function xi(e){await x(async t=>{ci(pi(t));let r=Ze();ks("Config: %o",r),await bi()},e)}var or="convert",Gs=e=>`
66
81
 
67
- ${li.default.bold("Examples")}
82
+ ${Bi.default.bold("Examples")}
68
83
 
69
84
  Convert JUnit test reports to Currents format:
70
- ${C(`${t} ${Je} --input-format junit --input-file ./*.xml --framework postman`)}
71
- `,fi=t=>new di.Command().name(Je).command(Je).showHelpAfterError("(add --help for additional information)").allowUnknownOption().description(`Convert reports from various testing frameworks to Currents format
72
- ${gs(t)}`).addOption(Zn).addOption(ti).addOption(ei).addOption(ri).addOption(oi).addOption(ni).action(r=>ui(r));var Es=`
85
+ ${g(`${e} ${or} --input-format junit --input-file ./*.xml --framework postman`)}
86
+ `,Li=e=>new Ni.Command().name(or).command(or).showHelpAfterError("(add --help for additional information)").allowUnknownOption().description(`Convert reports from various testing frameworks to Currents format
87
+ ${Gs(e)}`).addOption(_i).addOption(Ti).addOption(hi).addOption(Oi).addOption(yi).addOption(Ui).action(r=>xi(r));var Hs=`
73
88
  ----------------------------------------------------
74
89
  \u{1F4D6} Documentation: https://docs.currents.dev
75
90
  \u{1F919} Support: support@currents.dev
76
91
  ----------------------------------------------------
77
- `,ht="currents",Ei=()=>new gi.Command(ht).version(at).description(`Currents CLI ${Es}`).addCommand(Gn(ht),{isDefault:!0}).addCommand(On(ht)).addCommand(_n(ht)).addCommand(fi(ht));import("dotenv/config");function Cs(){Ei().parse()}Cs();
92
+ `,Ce="currents",Mi=()=>new vi.Command(Ce).version(ce).description(`Currents CLI ${Hs}`).addCommand(ai(Ce),{isDefault:!0}).addCommand(Ln(Ce)).addCommand(bn(Ce)).addCommand($n(Ce)).addCommand(Li(Ce));import("dotenv/config");function Ks(){Mi().parse()}Ks();
78
93
  /*! For license information please see index.js.LEGAL.txt */
79
94
  //# sourceMappingURL=index.js.map
package/dist/index.js CHANGED
@@ -1,12 +1,12 @@
1
- "use strict";var bt=Object.create;var v=Object.defineProperty;var vt=Object.getOwnPropertyDescriptor;var wt=Object.getOwnPropertyNames;var Gt=Object.getPrototypeOf,Ht=Object.prototype.hasOwnProperty;var le=(e,t)=>{for(var r in t)v(e,r,{get:t[r],enumerable:!0})},Te=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of wt(t))!Ht.call(e,n)&&n!==r&&v(e,n,{get:()=>t[n],enumerable:!(o=vt(t,n))||o.enumerable});return e};var E=(e,t,r)=>(r=e!=null?bt(Gt(e)):{},Te(t||!e||!e.__esModule?v(r,"default",{value:e,enumerable:!0}):r,e)),Ft=e=>Te(v({},"__esModule",{value:!0}),e);var Hr={};le(Hr,{handleCurrentsReport:()=>Mt});module.exports=Ft(Hr);var ge=require("debug"),Kt=E(require("fs-extra")),i=(0,ge.debug)("currents"),kt=null;function de(e){kt=e}var w={};le(w,{getNanoid:()=>jt,userFacingNanoid:()=>re});var te=require("nanoid"),fe="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",jt=(e=16)=>(0,te.customAlphabet)(fe,e)(),re=(0,te.customAlphabet)(fe,12);var _=require("lodash");var G=i.extend("ci"),Yt=(e,...t)=>(0,_.chain)(t).compact().join(e).value(),Vt=(e,t)=>(0,_.set)(e,(0,_.camelCase)(t),process.env[t]),p=e=>(0,_.transform)(e,Vt,{}),Jt=()=>process.env.TF_BUILD&&process.env.AZURE_HTTP_USER_AGENT,Wt=()=>(0,_.some)(process.env,(e,t)=>/^CODEBUILD_/.test(t)),$t=()=>process.env.bamboo_buildNumber,Qt=()=>(0,_.some)(process.env,(e,t)=>/^CONCOURSE_/.test(t)),qt=()=>process.env.GITLAB_CI||process.env.CI_SERVER_NAME&&/^GitLab/.test(process.env.CI_SERVER_NAME),zt=()=>!!(process.env.BUILD_ID&&process.env.PROJECT_ID&&process.env.PROJECT_NUMBER||process.env.GCP_PROJECT||process.env.GCLOUD_PROJECT||process.env.GOOGLE_CLOUD_PROJECT),Xt=()=>process.env.JENKINS_URL||process.env.JENKINS_HOME||process.env.JENKINS_VERSION||process.env.HUDSON_URL||process.env.HUDSON_HOME,Zt={appveyor:"APPVEYOR",azure:Jt,awsCodeBuild:Wt,bamboo:$t,bitbucket:"BITBUCKET_BUILD_NUMBER",buildkite:"BUILDKITE",circle:"CIRCLECI",concourse:Qt,codeFresh:"CF_BUILD_ID",drone:"DRONE",githubActions:"GITHUB_ACTIONS",gitlab:qt,goCD:"GO_JOB_NAME",jenkins:Xt,googleCloud:zt,semaphore:"SEMAPHORE",teamcity:"TEAMCITY_VERSION",travis:"TRAVIS",netlify:"NETLIFY"};function er(){let{env:e}=process;return(0,_.findKey)(Zt,t=>{if((0,_.isString)(t))return e[t];if((0,_.isFunction)(t))return t()})}var Ce=()=>({appveyor:p(["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:p(["AGENT_BUILDDIRECTORY","AGENT_ID","AGENT_JOBNAME","AGENT_JOBSTATUS","AGENT_MACHINENAME","AGENT_NAME","AGENT_OS","AGENT_OSARCHITECTURE","BUILD_BUILDID","BUILD_BUILDNUMBER","BUILD_BUILDURI","BUILD_CONTAINERID","BUILD_CRONSCHEDULE_DISPLAYNAME","BUILD_DEFINITIONNAME","BUILD_DEFINITIONVERSION","BUILD_QUEUEDBY","BUILD_QUEUEDBYID","BUILD_REASON","BUILD_REPOSITORY_ID","BUILD_REPOSITORY_NAME","BUILD_REPOSITORY_PROVIDER","BUILD_REPOSITORY_URI","BUILD_REQUESTEDFOR","BUILD_REQUESTEDFOREMAIL","BUILD_REQUESTEDFORID","BUILD_SOURCEBRANCH","BUILD_SOURCEBRANCHNAME","BUILD_SOURCESDIRECTORY","BUILD_SOURCEVERSION","BUILD_SOURCEVERSIONAUTHOR","BUILD_SOURCEVERSIONMESSAGE","BUILD_STAGINGDIRECTORY","BUILD_TRIGGEREDBY_BUILDID","BUILD_TRIGGEREDBY_BUILDNUMBER","BUILD_TRIGGEREDBY_DEFINITIONID","BUILD_TRIGGEREDBY_DEFINITIONNAME","BUILD_TRIGGEREDBY_PROJECTID","COMMON_TESTRESULTSDIRECTORY","PIPELINE_WORKSPACE","SYSTEM_COLLECTIONID","SYSTEM_COLLECTIONURI","SYSTEM_DEFAULTWORKINGDIRECTORY","SYSTEM_DEFINITIONID","SYSTEM_HOSTTYPE","SYSTEM_JOBATTEMPT","SYSTEM_JOBDISPLAYNAME","SYSTEM_JOBID","SYSTEM_JOBNAME","SYSTEM_PHASEATTEMPT","SYSTEM_PHASEDISPLAYNAME","SYSTEM_PHASENAME","SYSTEM_PLANID","SYSTEM_PULLREQUEST_ISFORK","SYSTEM_PULLREQUEST_PULLREQUESTID","SYSTEM_PULLREQUEST_PULLREQUESTNUMBER","SYSTEM_PULLREQUEST_SOURCEREPOSITORYURI","SYSTEM_PULLREQUEST_SOURCEBRANCH","SYSTEM_PULLREQUEST_SOURCECOMMITID","SYSTEM_PULLREQUEST_TARGETBRANCH","SYSTEM_PULLREQUEST_TARGETBRANCHNAME","SYSTEM_STAGEATTEMPT","SYSTEM_STAGEDISPLAYNAME","SYSTEM_STAGENAME","SYSTEM_TEAMFOUNDATIONCOLLECTIONURI","SYSTEM_TEAMPROJECT","SYSTEM_TEAMPROJECTID","SYSTEM_TIMELINEID"]),awsCodeBuild:p(["AWS_DEFAULT_REGION","AWS_REGION","CODEBUILD_BATCH_BUILD_IDENTIFIER","CODEBUILD_BUILD_ARN","CODEBUILD_BUILD_ID","CODEBUILD_BUILD_IMAGE","CODEBUILD_BUILD_NUMBER","CODEBUILD_BUILD_SUCCEEDING","CODEBUILD_BUILD_URL","CODEBUILD_INITIATOR","CODEBUILD_PROJECT_ARN","CODEBUILD_PUBLIC_BUILD_URL","CODEBUILD_RESOLVED_SOURCE_VERSION","CODEBUILD_SOURCE_REPO_URL","CODEBUILD_SOURCE_VERSION","CODEBUILD_SRC_DIR","CODEBUILD_START_TIME","CODEBUILD_WEBHOOK_ACTOR_ACCOUNT_ID","CODEBUILD_WEBHOOK_BASE_REF","CODEBUILD_WEBHOOK_EVENT","CODEBUILD_WEBHOOK_HEAD_REF","CODEBUILD_WEBHOOK_MERGE_COMMIT","CODEBUILD_WEBHOOK_PREV_COMMIT","CODEBUILD_WEBHOOK_TRIGGER","CODEBUILD_WEBHOOK_LABEL","CODEBUILD_WEBHOOK_RUN_ID","CODEBUILD_WEBHOOK_JOB_ID","CODEBUILD_WEBHOOK_WORKFLOW_NAME","CODEBUILD_RUNNER_OWNER","CODEBUILD_RUNNER_REPO","CODEBUILD_RUNNER_REPO_DOMAIN","CODEBUILD_RUNNER_WITH_BUILDSPEC"]),bamboo:p(["bamboo_buildNumber","bamboo_buildResultsUrl","bamboo_planRepository_repositoryUrl","bamboo_buildKey"]),bitbucket:p(["CI","BITBUCKET_WORKSPACE","BITBUCKET_REPO_SLUG","BITBUCKET_REPO_UUID","BITBUCKET_REPO_FULL_NAME","BITBUCKET_REPO_IS_PRIVATE","BITBUCKET_REPO_OWNER","BITBUCKET_REPO_OWNER_UUID","BITBUCKET_PROJECT_KEY","BITBUCKET_PROJECT_UUID","BITBUCKET_BUILD_NUMBER","BITBUCKET_PIPELINE_UUID","BITBUCKET_STEP_UUID","BITBUCKET_STEP_RUN_NUMBER","BITBUCKET_STEP_TRIGGERER_UUID","BITBUCKET_PARALLEL_STEP","BITBUCKET_PARALLEL_STEP_COUNT","BITBUCKET_CLONE_DIR","BITBUCKET_COMMIT","BITBUCKET_BRANCH","BITBUCKET_TAG","BITBUCKET_BOOKMARK","BITBUCKET_GIT_HTTP_ORIGIN","BITBUCKET_GIT_SSH_ORIGIN","BITBUCKET_PR_ID","BITBUCKET_PR_DESTINATION_BRANCH","BITBUCKET_PR_DESTINATION_COMMIT","BITBUCKET_DEPLOYMENT_ENVIRONMENT","BITBUCKET_DEPLOYMENT_ENVIRONMENT_UUID","BITBUCKET_EXIT_CODE"]),buildkite:p(["BUILDKITE_ORGANIZATION_SLUG","BUILDKITE_PIPELINE_ID","BUILDKITE_PIPELINE_NAME","BUILDKITE_PIPELINE_SLUG","BUILDKITE_PIPELINE_DEFAULT_BRANCH","BUILDKITE_REPO","BUILDKITE_SOURCE","BUILDKITE_BRANCH","BUILDKITE_TAG","BUILDKITE_COMMIT","BUILDKITE_MESSAGE","BUILDKITE_BUILD_AUTHOR","BUILDKITE_BUILD_AUTHOR_EMAIL","BUILDKITE_JOB_ID","BUILDKITE_BUILD_ID","BUILDKITE_BUILD_URL","BUILDKITE_BUILD_NUMBER","BUILDKITE_LABEL","BUILDKITE_COMMAND","BUILDKITE_STEP_ID","BUILDKITE_STEP_KEY","BUILDKITE_PARALLEL_JOB","BUILDKITE_PARALLEL_JOB_COUNT","BUILDKITE_RETRY_COUNT","BUILDKITE_COMPUTE_TYPE","BUILDKITE_CLUSTER_NAME","BUILDKITE_PULL_REQUEST","BUILDKITE_PULL_REQUEST_REPO","BUILDKITE_PULL_REQUEST_BASE_BRANCH","BUILDKITE_PULL_REQUEST_DRAFT","BUILDKITE_PULL_REQUEST_LABELS","BUILDKITE_MERGE_QUEUE_BASE_BRANCH","BUILDKITE_MERGE_QUEUE_BASE_COMMIT","BUILDKITE_REBUILT_FROM_BUILD_ID","BUILDKITE_REBUILT_FROM_BUILD_NUMBER","BUILDKITE_TRIGGERED_FROM_BUILD_ID","BUILDKITE_TRIGGERED_FROM_BUILD_NUMBER","BUILDKITE_TRIGGERED_FROM_BUILD_PIPELINE_SLUG"]),circle:p(["CI","CIRCLECI","CIRCLE_BRANCH","CIRCLE_BUILD_NUM","CIRCLE_BUILD_URL","CIRCLE_PREVIOUS_BUILD_NUM","CIRCLE_JOB","CIRCLE_WORKFLOW_ID","CIRCLE_WORKFLOW_JOB_ID","CIRCLE_WORKFLOW_WORKSPACE_ID","CIRCLE_PIPELINE_ID","CIRCLE_ORGANIZATION_ID","CIRCLE_PROJECT_ID","CIRCLE_PROJECT_REPONAME","CIRCLE_PROJECT_USERNAME","CIRCLE_REPOSITORY_URL","CIRCLE_WORKING_DIRECTORY","CIRCLE_SHA1","CIRCLE_TAG","CIRCLE_USERNAME","CIRCLE_NODE_INDEX","CIRCLE_NODE_TOTAL","CIRCLE_PR_NUMBER","CIRCLE_PR_REPONAME","CIRCLE_PR_USERNAME","CIRCLE_PULL_REQUEST","CIRCLE_PULL_REQUESTS","CI_PULL_REQUEST"]),concourse:p(["BUILD_ID","BUILD_NAME","BUILD_JOB_NAME","BUILD_PIPELINE_NAME","BUILD_TEAM_NAME","ATC_EXTERNAL_URL"]),codeFresh:p(["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:p(["DRONE_BUILD_LINK","DRONE_BUILD_NUMBER","DRONE_PULL_REQUEST"]),githubActions:p(["CI","GITHUB_ACTIONS","GITHUB_WORKFLOW","GITHUB_WORKFLOW_REF","GITHUB_WORKFLOW_SHA","GITHUB_ACTION","GITHUB_ACTION_PATH","GITHUB_ACTION_REPOSITORY","GITHUB_JOB","GITHUB_EVENT_NAME","GITHUB_EVENT_PATH","GITHUB_RUN_ID","GITHUB_RUN_NUMBER","GITHUB_RUN_ATTEMPT","GITHUB_REPOSITORY","GITHUB_REPOSITORY_ID","GITHUB_REPOSITORY_OWNER","GITHUB_REPOSITORY_OWNER_ID","GITHUB_REF","GITHUB_REF_NAME","GITHUB_REF_TYPE","GITHUB_REF_PROTECTED","GITHUB_BASE_REF","GITHUB_HEAD_REF","GITHUB_SHA","GITHUB_ACTOR","GITHUB_ACTOR_ID","GITHUB_TRIGGERING_ACTOR","GITHUB_SERVER_URL","GITHUB_API_URL","GITHUB_GRAPHQL_URL","GITHUB_WORKSPACE","GITHUB_RETENTION_DAYS","RUNNER_OS","RUNNER_ARCH","RUNNER_NAME","RUNNER_ENVIRONMENT","RUNNER_DEBUG"]),gitlab:p(["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","CI_MERGE_REQUEST_IID","CI_MERGE_REQUEST_PROJECT_URL","CI_MERGE_REQUEST_TITLE","CI_MERGE_REQUEST_SOURCE_BRANCH_NAME","CI_MERGE_REQUEST_TARGET_BRANCH_NAME","CI_OPEN_MERGE_REQUESTS"]),goCD:p(["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:p(["BUILD_ID","PROJECT_ID","REPO_NAME","BRANCH_NAME","TAG_NAME","COMMIT_SHA","SHORT_SHA"]),jenkins:p(["BRANCH_NAME","BUILD_DISPLAY_NAME","BUILD_ID","BUILD_NUMBER","BUILD_TAG","BUILD_URL","CHANGE_AUTHOR","CHANGE_AUTHOR_DISPLAY_NAME","CHANGE_AUTHOR_EMAIL","CHANGE_BRANCH","CHANGE_FORK","CHANGE_ID","CHANGE_TARGET","CHANGE_TITLE","CHANGE_URL","CI","EXECUTOR_NUMBER","JAVA_HOME","JENKINS_HOME","JENKINS_URL","JOB_BASE_NAME","JOB_NAME","JOB_URL","NODE_LABELS","NODE_NAME","RUN_ARTIFACTS_DISPLAY_URL","RUN_CHANGES_DISPLAY_URL","TAG_NAME","WORKSPACE","WORKSPACE_TMP","GIT_AUTHOR_EMAIL","GIT_AUTHOR_NAME","GIT_BRANCH","GIT_COMMIT","GIT_COMMITTER_EMAIL","GIT_COMMITTER_NAME","GIT_LOCAL_BRANCH","GIT_PREVIOUS_COMMIT","GIT_PREVIOUS_SUCCESSFUL_COMMIT","GIT_URL","ghprbActualCommit","ghprbGhRepository","ghprbPullId","ghprbPullLink","ghprbSourceBranch","ghprbTargetBranch","ghprbTriggerAuthorLogin"]),semaphore:p(["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"]),teamcity:null,travis:p(["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"]),netlify:p(["BUILD_ID","CONTEXT","URL","DEPLOY_URL","DEPLOY_PRIME_URL","DEPLOY_ID"])}),tr=()=>{let{env:e}=process;return{appveyor:{sha:e.APPVEYOR_REPO_COMMIT,branch:e.APPVEYOR_PULL_REQUEST_HEAD_REPO_BRANCH||e.APPVEYOR_REPO_BRANCH,message:Yt(`
2
- `,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},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},snap:null,teamcity:null,travis:{sha:e.TRAVIS_PULL_REQUEST_SHA||e.TRAVIS_COMMIT,branch:e.TRAVIS_PULL_REQUEST_BRANCH||e.TRAVIS_BRANCH,message:e.TRAVIS_COMMIT_MESSAGE},netlify:{sha:e.COMMIT_REF,branch:e.BRANCH,remoteOrigin:e.REPOSITORY_URL}}},Ue=e=>{let t=Oe();return t?(0,_.chain)(e()).get(t).value():{}};function rr(){return(0,_.chain)(Ce()).omitBy(_.isNull).keys().value()}function or(e){return e&&rr().includes(e)}function Oe(){let e=er();return G("detected CI provider name: %s",e),e||null}function nr(){return Ue(Ce)}function De(){return Ue(tr)}function Ae(e){let t=nr(),r=Oe(),o=sr(e,r);return G("detected CI provider: %s",r),G("detected CI params: %O",t),G("detected CI build ID: %o",o),{params:t,provider:r,ciBuildId:o}}function sr(e,t){return e?{source:"user",value:e}:or(t)?{source:"server",value:null}:{source:"random",value:`auto:${re()}`}}var Le=require("@currents/commit-info"),Be=require("lodash");var H=require("lodash");var oe=i.extend("ci-git");function Se(e){oe("git commit existing info: %O",e);let t=De();oe("commit info from provider environment variables: %O",t);let r=(0,H.transform)(e,(o,n,a)=>{let c=n||(t?t[a]:null);return o[a]=(0,H.defaultTo)(c,null)});return oe("combined git and environment variables from provider: %O",r),r}var ir=async()=>{let e=await(0,Le.commitInfo)();return Se({branch:e.branch,remoteOrigin:e.remote,authorEmail:e.email,authorName:e.author,message:e.message,sha:e.sha,ghaEventData:e.ghaEventData})},he=(0,Be.memoize)(ir);var Ne=E(require("getos")),Pe=require("lodash"),f=require("os"),ye=require("util"),ar=async()=>{if((0,f.platform)()==="linux")try{let e=await(0,ye.promisify)(Ne.default)();return"dist"in e&&"release"in e?[e.dist,e.release].join(" - "):(0,f.release)()}catch{return(0,f.release)()}return(0,f.release)()},Er=async()=>{let e=await ar();return{osName:(0,f.platform)(),osVersion:e,osCpus:[],osMemory:{free:(0,f.freemem)(),total:(0,f.totalmem)()}}},Me=(0,Pe.memoize)(Er);var xe={name:"@currents/cmd",version:"1.9.9",main:"./dist/index.js",author:{name:"Currents Software Inc",email:"hello@currents.dev"},license:"MIT",repository:{type:"git",url:"https://github.com/currents-dev/currents-reporter"},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","release-it":"^19.2.4","@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":"^25.5.0","@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","@types/xxhashjs":"^0.2.4",jest:"^29.7.0",rimraf:"^6.0.1",tsup:"^8.3.5",typescript:"^5.9.3",vitest:"^2.1.9"},dependencies:{"@commander-js/extra-typings":"^13.1.0","@currents/commit-info":"1.0.1-beta.0",archiver:"^7.0.1","async-retry":"^1.3.3",axios:"1.15.0","axios-retry":"4.5.0",chalk:"^4.1.2",commander:"^13.1.0",debug:"^4.4.0",dotenv:"^17.2.3",execa:"^9.5.1","fs-extra":"^11.3.4",getos:"^3.2.1",globby:"^11.1.0","https-proxy-agent":"^7.0.4","jest-cli":"^30.2.0","jest-config":"^30.3.0",lodash:"^4.18.1",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.5","tmp-promise":"^3.0.3","ts-pattern":"^5.8.0",unzipper:"^0.12.3",uuid:"11.1.0",xml2js:"^0.6.2",xxhashjs:"^0.2.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 F=xe.version;function _r(e,t){if(!e)return e;let r={...e};return t.forEach(o=>{r.hasOwnProperty(o)&&(r[o]="*****")}),r}function x(e){return _r(e,["recordKey","key"])}var ur=[];function ne(e){ur.push(e)}var l=E(require("chalk")),N=E(require("util"));var be=[],ve=[];var we=(...e)=>{let t=N.default.format(...e);ne(t),console.log(t)},Ir=(...e)=>{let t=N.default.format(...e);ne(t),console.error(t)},se=we,u=(...e)=>{let t=N.default.format(...e);return ve.push(t),i("WARNING: ",t),we(l.default.bgYellow.black(" WARNING "),t)};var R=(...e)=>{let t=N.default.format(...pr(e));return be.push(t),i("ERROR: ",N.default.format(...e)),Ir(l.default.bgRed.white(" ERROR "),t)};var pr=e=>e.map(t=>t instanceof Error?t.message:t),K=(e=2)=>console.log(Array(e).fill("").join(`
3
- `)),Uo=l.default.cyan,Oo=l.default.blueBright,Do=l.default.red,Ao=l.default.yellow,So=l.default.green,Lo=l.default.gray,Bo=l.default.white,ho=l.default.black,No=l.default.magenta,P=l.default.dim,Po=l.default.bold;var ie=E(require("fs-extra")),Ge=require("path"),mr=require("uuid");async function L(e){try{return await ie.default.readJson(e)}catch(t){throw R("Error while reading JSON file: %s",e,t),R}}async function ae(e,t){try{return await ie.default.writeFile(e,t,"utf8"),e}catch(r){throw R(`Error writing file at ${e}:`,r),r}}var lr=E(require("crypto"));var Pt=E(require("axios")),Re=E(require("fs-extra")),z=E(require("path")),yt=E(require("semver"));var rt=E(require("lodash"));var Je=E(require("axios")),We=E(require("axios-retry")),$e=E(require("lodash"));var He=()=>process.env.CURRENTS_API_URL??"https://cy.currents.dev",Fe=()=>process.env.CURRENTS_REST_API_URL??"https://api.currents.dev",Ke=()=>3e4;var Ee=require("axios"),ce=E(require("pretty-ms"));var ke=i.extend("http"),k=e=>[3*1e3,15*1e3,30*1e3][e-1],je=e=>(ke("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,Ee.isAxiosError)(e)}),"code"in e&&e.code&&["ECONNABORTED","ECONNREFUSED","ECONNRESET","ETIMEDOUT","ENETRESET"].includes(e.code)?!0:(0,Ee.isAxiosError)(e)?[429,502,503,504].includes(e.response?.status??0):!1),j=()=>3;function Ye(e,t,r){ke("Network request '%s' failed: '%s'. Next attempt is in %s (%d/%d).",`${r.method?.toUpperCase()} ${r.url}`,t.message,(0,ce.default)(k(e)),e,j()),u("Network request '%s' failed: '%s'. Next attempt is in %s (%d/%d).",`${r.method?.toUpperCase()} ${r.url}`,t.message,(0,ce.default)(k(e)),e,j())}var _e=i.extend("http");var ue={api:null,restApi:null};function Tr(e){let t=e==="api"?He():Fe();_e("client base url: %s",t);let r=Je.default.create({baseURL:t,timeout:Ke(),transitional:{clarifyTimeoutError:!0}});return r.interceptors.request.use(o=>{let n=o["axios-retry"]?.retryCount??0;o.headers.set({"x-cmd-version":F}),o.headers.get("Content-Type")||o.headers.set("Content-Type","application/json");let a={...$e.default.pick(o,"method","url","headers"),baseURL:t,data:Buffer.isBuffer(o.data)?"buffer":o.data,params:o.params};return n?_e("network request retry: %o",Ve({...a,baseURL:t,isRetry:!0})):_e("network request: %o",Ve(a)),o}),(0,We.default)(r,{retries:j(),retryCondition:je,retryDelay:k,shouldResetTimeout:!0,onRetry:Ye}),r}function Qe(e){return ue[e]===null&&(ue[e]=Tr(e)),ue[e]}function Ve(e){return{method:e.method,baseURL:e.baseURL,url:e.url,data:e.isRetry?"<retry>":gr(e.data),params:e.isRetry?"<retry>":e.params,headers:{...e.headers,Authorization:"Bearer ***","x-currents-key":"***"}}}function gr(e){return e?.results?.raw?{...e,results:{...e.results,raw:"***"}}:e}var Xe=require("axios"),Ze=E(require("lodash")),m=require("ts-pattern");function et(e){(0,m.match)(e).when(Xe.isAxiosError,dr).otherwise(()=>{u("Unexpected error while sending network request: %s",e)})}function dr(e){return(0,m.match)(e).with({code:"ECONNABORTED"},()=>{u("Network connection aborted")}).with({code:"ECONNREFUSED"},()=>{u("Network connection aborted")}).with({code:"ECONNRESET"},()=>{u("Network connection reset")}).with({code:"ETIMEDOUT"},()=>{u("Network connection timeout")}).with({response:m.P.not(m.P.nullish)},t=>{fr(t,{status:t.response.status,data:t.response.data})}).otherwise(t=>{u(`[currents] Unexpected network error: %s
1
+ "use strict";var bt=Object.create;var w=Object.defineProperty;var vt=Object.getOwnPropertyDescriptor;var wt=Object.getOwnPropertyNames;var Gt=Object.getPrototypeOf,Ht=Object.prototype.hasOwnProperty;var ge=(e,t)=>{for(var r in t)w(e,r,{get:t[r],enumerable:!0})},de=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of wt(t))!Ht.call(e,n)&&n!==r&&w(e,n,{get:()=>t[n],enumerable:!(o=vt(t,n))||o.enumerable});return e};var E=(e,t,r)=>(r=e!=null?bt(Gt(e)):{},de(t||!e||!e.__esModule?w(r,"default",{value:e,enumerable:!0}):r,e)),Ft=e=>de(w({},"__esModule",{value:!0}),e);var Hr={};ge(Hr,{handleCurrentsReport:()=>Mt});module.exports=Ft(Hr);var fe=require("debug"),Kt=E(require("fs-extra")),i=(0,fe.debug)("currents"),kt=null;function Ce(e){kt=e}var G={};ge(G,{getNanoid:()=>jt,userFacingNanoid:()=>re});var te=require("nanoid"),Ue="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",jt=(e=16)=>(0,te.customAlphabet)(Ue,e)(),re=(0,te.customAlphabet)(Ue,12);var _=require("lodash");var H=i.extend("ci"),Yt=(e,...t)=>(0,_.chain)(t).compact().join(e).value(),Vt=(e,t)=>(0,_.set)(e,(0,_.camelCase)(t),process.env[t]),p=e=>(0,_.transform)(e,Vt,{}),Jt=()=>process.env.TF_BUILD&&process.env.AZURE_HTTP_USER_AGENT,Wt=()=>(0,_.some)(process.env,(e,t)=>/^CODEBUILD_/.test(t)),$t=()=>process.env.bamboo_buildNumber,Qt=()=>(0,_.some)(process.env,(e,t)=>/^CONCOURSE_/.test(t)),qt=()=>process.env.GITLAB_CI||process.env.CI_SERVER_NAME&&/^GitLab/.test(process.env.CI_SERVER_NAME),zt=()=>!!(process.env.BUILD_ID&&process.env.PROJECT_ID&&process.env.PROJECT_NUMBER||process.env.GCP_PROJECT||process.env.GCLOUD_PROJECT||process.env.GOOGLE_CLOUD_PROJECT),Xt=()=>process.env.JENKINS_URL||process.env.JENKINS_HOME||process.env.JENKINS_VERSION||process.env.HUDSON_URL||process.env.HUDSON_HOME,Zt={appveyor:"APPVEYOR",azure:Jt,awsCodeBuild:Wt,bamboo:$t,bitbucket:"BITBUCKET_BUILD_NUMBER",buildkite:"BUILDKITE",circle:"CIRCLECI",concourse:Qt,codeFresh:"CF_BUILD_ID",drone:"DRONE",githubActions:"GITHUB_ACTIONS",gitlab:qt,goCD:"GO_JOB_NAME",jenkins:Xt,googleCloud:zt,semaphore:"SEMAPHORE",teamcity:"TEAMCITY_VERSION",travis:"TRAVIS",netlify:"NETLIFY"};function er(){let{env:e}=process;return(0,_.findKey)(Zt,t=>{if((0,_.isString)(t))return e[t];if((0,_.isFunction)(t))return t()})}var Oe=()=>({appveyor:p(["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:p(["AGENT_BUILDDIRECTORY","AGENT_ID","AGENT_JOBNAME","AGENT_JOBSTATUS","AGENT_MACHINENAME","AGENT_NAME","AGENT_OS","AGENT_OSARCHITECTURE","BUILD_BUILDID","BUILD_BUILDNUMBER","BUILD_BUILDURI","BUILD_CONTAINERID","BUILD_CRONSCHEDULE_DISPLAYNAME","BUILD_DEFINITIONNAME","BUILD_DEFINITIONVERSION","BUILD_QUEUEDBY","BUILD_QUEUEDBYID","BUILD_REASON","BUILD_REPOSITORY_ID","BUILD_REPOSITORY_NAME","BUILD_REPOSITORY_PROVIDER","BUILD_REPOSITORY_URI","BUILD_REQUESTEDFOR","BUILD_REQUESTEDFOREMAIL","BUILD_REQUESTEDFORID","BUILD_SOURCEBRANCH","BUILD_SOURCEBRANCHNAME","BUILD_SOURCESDIRECTORY","BUILD_SOURCEVERSION","BUILD_SOURCEVERSIONAUTHOR","BUILD_SOURCEVERSIONMESSAGE","BUILD_STAGINGDIRECTORY","BUILD_TRIGGEREDBY_BUILDID","BUILD_TRIGGEREDBY_BUILDNUMBER","BUILD_TRIGGEREDBY_DEFINITIONID","BUILD_TRIGGEREDBY_DEFINITIONNAME","BUILD_TRIGGEREDBY_PROJECTID","COMMON_TESTRESULTSDIRECTORY","PIPELINE_WORKSPACE","SYSTEM_COLLECTIONID","SYSTEM_COLLECTIONURI","SYSTEM_DEFAULTWORKINGDIRECTORY","SYSTEM_DEFINITIONID","SYSTEM_HOSTTYPE","SYSTEM_JOBATTEMPT","SYSTEM_JOBDISPLAYNAME","SYSTEM_JOBID","SYSTEM_JOBNAME","SYSTEM_PHASEATTEMPT","SYSTEM_PHASEDISPLAYNAME","SYSTEM_PHASENAME","SYSTEM_PLANID","SYSTEM_PULLREQUEST_ISFORK","SYSTEM_PULLREQUEST_PULLREQUESTID","SYSTEM_PULLREQUEST_PULLREQUESTNUMBER","SYSTEM_PULLREQUEST_SOURCEREPOSITORYURI","SYSTEM_PULLREQUEST_SOURCEBRANCH","SYSTEM_PULLREQUEST_SOURCECOMMITID","SYSTEM_PULLREQUEST_TARGETBRANCH","SYSTEM_PULLREQUEST_TARGETBRANCHNAME","SYSTEM_STAGEATTEMPT","SYSTEM_STAGEDISPLAYNAME","SYSTEM_STAGENAME","SYSTEM_TEAMFOUNDATIONCOLLECTIONURI","SYSTEM_TEAMPROJECT","SYSTEM_TEAMPROJECTID","SYSTEM_TIMELINEID"]),awsCodeBuild:p(["AWS_DEFAULT_REGION","AWS_REGION","CODEBUILD_BATCH_BUILD_IDENTIFIER","CODEBUILD_BUILD_ARN","CODEBUILD_BUILD_ID","CODEBUILD_BUILD_IMAGE","CODEBUILD_BUILD_NUMBER","CODEBUILD_BUILD_SUCCEEDING","CODEBUILD_BUILD_URL","CODEBUILD_INITIATOR","CODEBUILD_PROJECT_ARN","CODEBUILD_PUBLIC_BUILD_URL","CODEBUILD_RESOLVED_SOURCE_VERSION","CODEBUILD_SOURCE_REPO_URL","CODEBUILD_SOURCE_VERSION","CODEBUILD_SRC_DIR","CODEBUILD_START_TIME","CODEBUILD_WEBHOOK_ACTOR_ACCOUNT_ID","CODEBUILD_WEBHOOK_BASE_REF","CODEBUILD_WEBHOOK_EVENT","CODEBUILD_WEBHOOK_HEAD_REF","CODEBUILD_WEBHOOK_MERGE_COMMIT","CODEBUILD_WEBHOOK_PREV_COMMIT","CODEBUILD_WEBHOOK_TRIGGER","CODEBUILD_WEBHOOK_LABEL","CODEBUILD_WEBHOOK_RUN_ID","CODEBUILD_WEBHOOK_JOB_ID","CODEBUILD_WEBHOOK_WORKFLOW_NAME","CODEBUILD_RUNNER_OWNER","CODEBUILD_RUNNER_REPO","CODEBUILD_RUNNER_REPO_DOMAIN","CODEBUILD_RUNNER_WITH_BUILDSPEC"]),bamboo:p(["bamboo_buildNumber","bamboo_buildResultsUrl","bamboo_planRepository_repositoryUrl","bamboo_buildKey"]),bitbucket:p(["CI","BITBUCKET_WORKSPACE","BITBUCKET_REPO_SLUG","BITBUCKET_REPO_UUID","BITBUCKET_REPO_FULL_NAME","BITBUCKET_REPO_IS_PRIVATE","BITBUCKET_REPO_OWNER","BITBUCKET_REPO_OWNER_UUID","BITBUCKET_PROJECT_KEY","BITBUCKET_PROJECT_UUID","BITBUCKET_BUILD_NUMBER","BITBUCKET_PIPELINE_UUID","BITBUCKET_STEP_UUID","BITBUCKET_STEP_RUN_NUMBER","BITBUCKET_STEP_TRIGGERER_UUID","BITBUCKET_PARALLEL_STEP","BITBUCKET_PARALLEL_STEP_COUNT","BITBUCKET_CLONE_DIR","BITBUCKET_COMMIT","BITBUCKET_BRANCH","BITBUCKET_TAG","BITBUCKET_BOOKMARK","BITBUCKET_GIT_HTTP_ORIGIN","BITBUCKET_GIT_SSH_ORIGIN","BITBUCKET_PR_ID","BITBUCKET_PR_DESTINATION_BRANCH","BITBUCKET_PR_DESTINATION_COMMIT","BITBUCKET_DEPLOYMENT_ENVIRONMENT","BITBUCKET_DEPLOYMENT_ENVIRONMENT_UUID","BITBUCKET_EXIT_CODE"]),buildkite:p(["BUILDKITE_ORGANIZATION_SLUG","BUILDKITE_PIPELINE_ID","BUILDKITE_PIPELINE_NAME","BUILDKITE_PIPELINE_SLUG","BUILDKITE_PIPELINE_DEFAULT_BRANCH","BUILDKITE_REPO","BUILDKITE_SOURCE","BUILDKITE_BRANCH","BUILDKITE_TAG","BUILDKITE_COMMIT","BUILDKITE_MESSAGE","BUILDKITE_BUILD_AUTHOR","BUILDKITE_BUILD_AUTHOR_EMAIL","BUILDKITE_JOB_ID","BUILDKITE_BUILD_ID","BUILDKITE_BUILD_URL","BUILDKITE_BUILD_NUMBER","BUILDKITE_LABEL","BUILDKITE_COMMAND","BUILDKITE_STEP_ID","BUILDKITE_STEP_KEY","BUILDKITE_PARALLEL_JOB","BUILDKITE_PARALLEL_JOB_COUNT","BUILDKITE_RETRY_COUNT","BUILDKITE_COMPUTE_TYPE","BUILDKITE_CLUSTER_NAME","BUILDKITE_PULL_REQUEST","BUILDKITE_PULL_REQUEST_REPO","BUILDKITE_PULL_REQUEST_BASE_BRANCH","BUILDKITE_PULL_REQUEST_DRAFT","BUILDKITE_PULL_REQUEST_LABELS","BUILDKITE_MERGE_QUEUE_BASE_BRANCH","BUILDKITE_MERGE_QUEUE_BASE_COMMIT","BUILDKITE_REBUILT_FROM_BUILD_ID","BUILDKITE_REBUILT_FROM_BUILD_NUMBER","BUILDKITE_TRIGGERED_FROM_BUILD_ID","BUILDKITE_TRIGGERED_FROM_BUILD_NUMBER","BUILDKITE_TRIGGERED_FROM_BUILD_PIPELINE_SLUG"]),circle:p(["CI","CIRCLECI","CIRCLE_BRANCH","CIRCLE_BUILD_NUM","CIRCLE_BUILD_URL","CIRCLE_PREVIOUS_BUILD_NUM","CIRCLE_JOB","CIRCLE_WORKFLOW_ID","CIRCLE_WORKFLOW_JOB_ID","CIRCLE_WORKFLOW_WORKSPACE_ID","CIRCLE_PIPELINE_ID","CIRCLE_ORGANIZATION_ID","CIRCLE_PROJECT_ID","CIRCLE_PROJECT_REPONAME","CIRCLE_PROJECT_USERNAME","CIRCLE_REPOSITORY_URL","CIRCLE_WORKING_DIRECTORY","CIRCLE_SHA1","CIRCLE_TAG","CIRCLE_USERNAME","CIRCLE_NODE_INDEX","CIRCLE_NODE_TOTAL","CIRCLE_PR_NUMBER","CIRCLE_PR_REPONAME","CIRCLE_PR_USERNAME","CIRCLE_PULL_REQUEST","CIRCLE_PULL_REQUESTS","CI_PULL_REQUEST"]),concourse:p(["BUILD_ID","BUILD_NAME","BUILD_JOB_NAME","BUILD_PIPELINE_NAME","BUILD_TEAM_NAME","ATC_EXTERNAL_URL"]),codeFresh:p(["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:p(["DRONE_BUILD_LINK","DRONE_BUILD_NUMBER","DRONE_PULL_REQUEST"]),githubActions:p(["CI","GITHUB_ACTIONS","GITHUB_WORKFLOW","GITHUB_WORKFLOW_REF","GITHUB_WORKFLOW_SHA","GITHUB_ACTION","GITHUB_ACTION_PATH","GITHUB_ACTION_REPOSITORY","GITHUB_JOB","GITHUB_EVENT_NAME","GITHUB_EVENT_PATH","GITHUB_RUN_ID","GITHUB_RUN_NUMBER","GITHUB_RUN_ATTEMPT","GITHUB_REPOSITORY","GITHUB_REPOSITORY_ID","GITHUB_REPOSITORY_OWNER","GITHUB_REPOSITORY_OWNER_ID","GITHUB_REF","GITHUB_REF_NAME","GITHUB_REF_TYPE","GITHUB_REF_PROTECTED","GITHUB_BASE_REF","GITHUB_HEAD_REF","GITHUB_SHA","GITHUB_ACTOR","GITHUB_ACTOR_ID","GITHUB_TRIGGERING_ACTOR","GITHUB_SERVER_URL","GITHUB_API_URL","GITHUB_GRAPHQL_URL","GITHUB_WORKSPACE","GITHUB_RETENTION_DAYS","RUNNER_OS","RUNNER_ARCH","RUNNER_NAME","RUNNER_ENVIRONMENT","RUNNER_DEBUG"]),gitlab:p(["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","CI_MERGE_REQUEST_IID","CI_MERGE_REQUEST_PROJECT_URL","CI_MERGE_REQUEST_TITLE","CI_MERGE_REQUEST_SOURCE_BRANCH_NAME","CI_MERGE_REQUEST_TARGET_BRANCH_NAME","CI_OPEN_MERGE_REQUESTS"]),goCD:p(["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:p(["BUILD_ID","PROJECT_ID","REPO_NAME","BRANCH_NAME","TAG_NAME","COMMIT_SHA","SHORT_SHA"]),jenkins:p(["BRANCH_NAME","BUILD_DISPLAY_NAME","BUILD_ID","BUILD_NUMBER","BUILD_TAG","BUILD_URL","CHANGE_AUTHOR","CHANGE_AUTHOR_DISPLAY_NAME","CHANGE_AUTHOR_EMAIL","CHANGE_BRANCH","CHANGE_FORK","CHANGE_ID","CHANGE_TARGET","CHANGE_TITLE","CHANGE_URL","CI","EXECUTOR_NUMBER","JAVA_HOME","JENKINS_HOME","JENKINS_URL","JOB_BASE_NAME","JOB_NAME","JOB_URL","NODE_LABELS","NODE_NAME","RUN_ARTIFACTS_DISPLAY_URL","RUN_CHANGES_DISPLAY_URL","TAG_NAME","WORKSPACE","WORKSPACE_TMP","GIT_AUTHOR_EMAIL","GIT_AUTHOR_NAME","GIT_BRANCH","GIT_COMMIT","GIT_COMMITTER_EMAIL","GIT_COMMITTER_NAME","GIT_LOCAL_BRANCH","GIT_PREVIOUS_COMMIT","GIT_PREVIOUS_SUCCESSFUL_COMMIT","GIT_URL","ghprbActualCommit","ghprbGhRepository","ghprbPullId","ghprbPullLink","ghprbSourceBranch","ghprbTargetBranch","ghprbTriggerAuthorLogin"]),semaphore:p(["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"]),teamcity:null,travis:p(["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"]),netlify:p(["BUILD_ID","CONTEXT","URL","DEPLOY_URL","DEPLOY_PRIME_URL","DEPLOY_ID"])}),tr=()=>{let{env:e}=process;return{appveyor:{sha:e.APPVEYOR_REPO_COMMIT,branch:e.APPVEYOR_PULL_REQUEST_HEAD_REPO_BRANCH||e.APPVEYOR_REPO_BRANCH,message:Yt(`
2
+ `,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},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},snap:null,teamcity:null,travis:{sha:e.TRAVIS_PULL_REQUEST_SHA||e.TRAVIS_COMMIT,branch:e.TRAVIS_PULL_REQUEST_BRANCH||e.TRAVIS_BRANCH,message:e.TRAVIS_COMMIT_MESSAGE},netlify:{sha:e.COMMIT_REF,branch:e.BRANCH,remoteOrigin:e.REPOSITORY_URL}}},De=e=>{let t=Ae();return t?(0,_.chain)(e()).get(t).value():{}};function rr(){return(0,_.chain)(Oe()).omitBy(_.isNull).keys().value()}function or(e){return e&&rr().includes(e)}function Ae(){let e=er();return H("detected CI provider name: %s",e),e||null}function nr(){return De(Oe)}function Se(){return De(tr)}function Le(e){let t=nr(),r=Ae(),o=sr(e,r);return H("detected CI provider: %s",r),H("detected CI params: %O",t),H("detected CI build ID: %o",o),{params:t,provider:r,ciBuildId:o}}function sr(e,t){return e?{source:"user",value:e}:or(t)?{source:"server",value:null}:{source:"random",value:`auto:${re()}`}}var he=require("@currents/commit-info"),Ne=require("lodash");var F=require("lodash");var oe=i.extend("ci-git");function Be(e){oe("git commit existing info: %O",e);let t=Se();oe("commit info from provider environment variables: %O",t);let r=(0,F.transform)(e,(o,n,a)=>{let c=n||(t?t[a]:null);return o[a]=(0,F.defaultTo)(c,null)});return oe("combined git and environment variables from provider: %O",r),r}var ir=async()=>{let e=await(0,he.commitInfo)();return Be({branch:e.branch,remoteOrigin:e.remote,authorEmail:e.email,authorName:e.author,message:e.message,sha:e.sha,ghaEventData:e.ghaEventData})},Pe=(0,Ne.memoize)(ir);var ye=E(require("getos")),Me=require("lodash"),f=require("os"),xe=require("util"),ar=async()=>{if((0,f.platform)()==="linux")try{let e=await(0,xe.promisify)(ye.default)();return"dist"in e&&"release"in e?[e.dist,e.release].join(" - "):(0,f.release)()}catch{return(0,f.release)()}return(0,f.release)()},Er=async()=>{let e=await ar();return{osName:(0,f.platform)(),osVersion:e,osCpus:[],osMemory:{free:(0,f.freemem)(),total:(0,f.totalmem)()}}},be=(0,Me.memoize)(Er);var ve={name:"@currents/cmd",version:"1.10.0",main:"./dist/index.js",author:{name:"Currents Software Inc",email:"hello@currents.dev"},license:"MIT",repository:{type:"git",url:"https://github.com/currents-dev/currents-reporter"},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":"^12.0.0","release-it":"^19.2.4","@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":"^25.5.0","@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","@types/xxhashjs":"^0.2.4",jest:"^29.7.0",rimraf:"^6.0.1",tsup:"^8.3.5",typescript:"^5.9.3",vitest:"^4.1.0"},dependencies:{"@commander-js/extra-typings":"^13.1.0","@currents/commit-info":"1.0.1-beta.0",archiver:"^7.0.1","async-retry":"^1.3.3",axios:"1.18.1","axios-retry":"4.5.0",chalk:"^4.1.2",commander:"^13.1.0",debug:"^4.4.0",dotenv:"^17.4.2",execa:"^9.5.1","fs-extra":"^11.3.4",getos:"^3.2.1",globby:"^11.1.0","https-proxy-agent":"^7.0.4","jest-cli":"^30.2.0","jest-config":"^30.3.0",lodash:"^4.18.1",nanoid:"^3.3.8","pretty-ms":"^7.0.1","proxy-from-env":"^1.1.0",semver:"^7.8.5","source-map-support":"^0.5.21",tmp:"^0.2.7","tmp-promise":"^3.0.3","ts-pattern":"^5.8.0",unzipper:"^0.12.3",uuid:"11.1.1",xml2js:"^0.6.2",xxhashjs:"^0.2.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 K=ve.version;function _r(e,t){if(!e)return e;let r={...e};return t.forEach(o=>{r.hasOwnProperty(o)&&(r[o]="*****")}),r}function O(e){return _r(e,["recordKey","key"])}var ur=[];function ne(e){ur.push(e)}var l=E(require("chalk")),P=E(require("util"));var we=[],Ge=[];var He=(...e)=>{let t=P.default.format(...e);ne(t),console.log(t)},Ir=(...e)=>{let t=P.default.format(...e);ne(t),console.error(t)},se=He,u=(...e)=>{let t=P.default.format(...e);return Ge.push(t),i("WARNING: ",t),He(l.default.bgYellow.black(" WARNING "),t)};var R=(...e)=>{let t=P.default.format(...pr(e));return we.push(t),i("ERROR: ",P.default.format(...e)),Ir(l.default.bgRed.white(" ERROR "),t)};var pr=e=>e.map(t=>t instanceof Error?t.message:t),k=(e=2)=>console.log(Array(e).fill("").join(`
3
+ `)),Uo=l.default.cyan,Oo=l.default.blueBright,Do=l.default.red,Ao=l.default.yellow,So=l.default.green,Lo=l.default.gray,Bo=l.default.white,ho=l.default.black,No=l.default.magenta,y=l.default.dim,Po=l.default.bold;var ie=E(require("fs-extra")),Fe=require("path"),mr=require("uuid");async function B(e){try{return await ie.default.readJson(e)}catch(t){throw R("Error while reading JSON file: %s",e,t),R}}async function ae(e,t){try{return await ie.default.writeFile(e,t,"utf8"),e}catch(r){throw R(`Error writing file at ${e}:`,r),r}}var lr=E(require("crypto"));var Pt=E(require("axios")),le=E(require("fs-extra")),z=E(require("path")),yt=E(require("semver"));var ot=E(require("lodash"));var $e=E(require("axios")),Qe=E(require("axios-retry")),Ie=E(require("lodash"));var Ke=()=>process.env.CURRENTS_API_URL??"https://cy.currents.dev",ke=()=>process.env.CURRENTS_REST_API_URL??"https://api.currents.dev",je=()=>3e4;var Ee=require("axios"),ce=E(require("pretty-ms"));var Ye=i.extend("http"),j=e=>[3*1e3,15*1e3,30*1e3][e-1],Ve=e=>(Ye("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,Ee.isAxiosError)(e)}),"code"in e&&e.code&&["ECONNABORTED","ECONNREFUSED","ECONNRESET","ETIMEDOUT","ENETRESET"].includes(e.code)?!0:(0,Ee.isAxiosError)(e)?[429,502,503,504].includes(e.response?.status??0):!1),Y=()=>3;function Je(e,t,r){Ye("Network request '%s' failed: '%s'. Next attempt is in %s (%d/%d).",`${r.method?.toUpperCase()} ${r.url}`,t.message,(0,ce.default)(j(e)),e,Y()),u("Network request '%s' failed: '%s'. Next attempt is in %s (%d/%d).",`${r.method?.toUpperCase()} ${r.url}`,t.message,(0,ce.default)(j(e)),e,Y())}var _e=i.extend("http");var ue={api:null,restApi:null};function Tr(e){let t=e==="api"?Ke():ke();_e("client base url: %s",t);let r=$e.default.create({baseURL:t,timeout:je(),transitional:{clarifyTimeoutError:!0}});return r.interceptors.request.use(o=>{let n=o["axios-retry"]?.retryCount??0;o.headers.set({"x-cmd-version":K}),o.headers.get("Content-Type")||o.headers.set("Content-Type","application/json");let a={...Ie.default.pick(o,"method","url","headers"),baseURL:t,data:Buffer.isBuffer(o.data)?"buffer":o.data,params:o.params};return n?_e("network request retry: %o",We({...a,baseURL:t,isRetry:!0})):_e("network request: %o",We(a)),o}),(0,Qe.default)(r,{retries:Y(),retryCondition:Ve,retryDelay:j,shouldResetTimeout:!0,onRetry:Je}),r}function qe(e){return ue[e]===null&&(ue[e]=Tr(e)),ue[e]}function We(e){return{method:e.method,baseURL:e.baseURL,url:e.url,data:e.isRetry?"<retry>":gr(e.data),params:e.isRetry?"<retry>":e.params,headers:{...e.headers,Authorization:"Bearer ***","x-currents-key":"***"}}}function gr(e){return e?.results?.raw?O({...e,results:{...e.results,raw:"***"}}):Ie.default.isPlainObject(e)?O(e):e}var Ze=require("axios"),et=E(require("lodash")),m=require("ts-pattern");function tt(e){(0,m.match)(e).when(Ze.isAxiosError,dr).otherwise(()=>{u("Unexpected error while sending network request: %s",e)})}function dr(e){return(0,m.match)(e).with({code:"ECONNABORTED"},()=>{u("Network connection aborted")}).with({code:"ECONNREFUSED"},()=>{u("Network connection aborted")}).with({code:"ECONNRESET"},()=>{u("Network connection reset")}).with({code:"ETIMEDOUT"},()=>{u("Network connection timeout")}).with({response:m.P.not(m.P.nullish)},t=>{fr(t,{status:t.response.status,data:t.response.data})}).otherwise(t=>{u(`[currents] Unexpected network error: %s
4
4
  %O`,e.message,{method:e.response?.config.method,url:e.response?.config.url,status:e.response?.status,payload:e.response?.config.data})})}function fr(e,{status:t,data:r}){(0,m.match)(t).with(401,()=>{u(`[currents] ${e.response?.config.method} ${e.response?.config.url}} - 401 Unauthorized Request from cloud service`)}).with(400,()=>{u(`[currents] ${e.response?.config.method} ${e.response?.config.url} - 400 Bad Request from cloud service:
5
5
  %o`,r)}).with(404,()=>{u(`[currents] ${e.response?.config.method} ${e.response?.config.url} - 404 Not Found from cloud service`)}).with(429,()=>{u(`[currents] ${e.response?.config.method} ${e.response?.config.url} - 429 Too Many Requests from cloud service`)}).with(422,()=>{Cr(e,r)}).otherwise(()=>{u(`[currents] Unexpected network response: %s
6
- %O`,e.message,{method:e.response?.config.method,url:e.response?.config.url,status:e.response?.status})})}function Cr(e,t){(0,m.match)(t).with({code:qe.MISSING_SUITE,message:m.P.string,errors:m.P.array(m.P.string)},async r=>{let{message:o,errors:n}=r;K(1),R(...ze(o,n))}).with({code:qe.RUN_EXPIRED,message:m.P.string},r=>{u(r.message)}).with({message:m.P.string,errors:m.P.array(m.P.string)},r=>{let{message:o,errors:n}=r;K(1),u(...ze(o,n)),K(1)}).otherwise(()=>{u(`[currents] Unexpected network response: %s
7
- %O`,e.message,{method:e.response?.config.method,url:e.response?.config.url,status:e.response?.status})})}var qe={RUN_CANCELLED:"RUN_CANCELLED",RUN_EXPIRED:"RUN_EXPIRED",MISSING_SUITE:"MISSING_SUITE"};function ze(e,t){return Ze.default.isString(e)?t?.length===0?[e]:[e,`
6
+ %O`,e.message,{method:e.response?.config.method,url:e.response?.config.url,status:e.response?.status})})}function Cr(e,t){(0,m.match)(t).with({code:ze.MISSING_SUITE,message:m.P.string,errors:m.P.array(m.P.string)},async r=>{let{message:o,errors:n}=r;k(1),R(...Xe(o,n))}).with({code:ze.RUN_EXPIRED,message:m.P.string},r=>{u(r.message)}).with({message:m.P.string,errors:m.P.array(m.P.string)},r=>{let{message:o,errors:n}=r;k(1),u(...Xe(o,n)),k(1)}).otherwise(()=>{u(`[currents] Unexpected network response: %s
7
+ %O`,e.message,{method:e.response?.config.method,url:e.response?.config.url,status:e.response?.status})})}var ze={RUN_CANCELLED:"RUN_CANCELLED",RUN_EXPIRED:"RUN_EXPIRED",MISSING_SUITE:"MISSING_SUITE"};function Xe(e,t){return et.default.isString(e)?t?.length===0?[e]:[e,`
8
8
  ${(t??[]).map(r=>` - ${r}`).join(`
9
9
  `)}
10
- `]:["Unexpected network error"]}var tt=i.extend("http");async function Y(e,t,r=Qe){try{let o=await r(e).request(t);return tt("network response: %o",{...rt.default.omit(o,"request","config"),url:o.config.url,method:o.config.method}),o}catch(o){let n=o;throw tt("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}),et(n),n}}var Bn=i.extend("api");var st=require("util"),it=require("zlib");var nt=i.extend("api"),Ur=(0,st.promisify)(it.gzip);async function at(e){try{nt("Run params: %o",x(e));let t=await Or(JSON.stringify(e));return Y("api",{url:"v1/runs",method:"POST",headers:{"Content-Type":"application/json","Content-Encoding":"gzip"},data:t}).then(r=>r.data)}catch(t){throw nt("Failed to create the run:",t),t}}async function Or(e){try{return await Ur(e)}catch(t){throw R("Failed to compress run payload:",t),t}}var Kn=i.extend("api");var Es=i.extend("config");var Dr=null;function Et(){return Dr}var D=class{constructor(t){this.config=t}async getFullTestSuite(){return[]}};var dt=E(require("fs-extra")),ft=require("jest-cli"),Ct=E(require("tmp"));var Tt=require("lodash");function ct(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 _t=require("lodash"),Ar=["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 ut(e){return(0,_t.omit)(e,...Ar)}var Rt=E(require("fs")),mt=require("jest-config"),Ie=require("lodash"),pe=E(require("path"));function V(e,t){return(...r)=>new Promise((o,n)=>{let a=0,c=()=>{a++;try{let I=e(...r);o(I)}catch(I){if(a>=t.length)n(I);else{let C=t[a-1];setTimeout(c,C)}}};c()})}var It=E(require("fs-extra")),Sr=E(require("path"));async function J(e){let t=await It.default.pathExists(e);if(!t)throw new Error("File does not exist");return t}var pt=i.extend("jest-discovery");async function lt(e){try{let{config:t,configPath:r}=await(0,mt.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,Ie.omit)(t,o);if(a.projects&&(a.projects=a.projects.map(C=>typeof C!="string"?(0,Ie.omit)(C,n):C)),a.rootDir&&Object.keys(a).length===1)return null;let c=pe.default.resolve(r?pe.default.dirname(r):process.cwd(),`.jest-scanner-${new Date().getTime()}.config.js`),I=`module.exports=${JSON.stringify(a,null,2)}`;return pt("configFileContent: %O",I),Rt.default.writeFileSync(c,I),await V(J,[200,200,200,200,200,1e3])(c),c}catch(t){return R("Failed to recreate the config file"),pt("error %o",t),null}}async function gt(e){let t="!!##ThisPatternWillNotMatchAnyTestName##!!",r=e.options,o=ut(r),n=ct(o),a=r.config,c=await lt(a);return{cliArgs:[n,"--testNamePattern",t,"--reporters","@currents/cmd/discovery/jest","--shard=1/1",c?`--config=${c}`:"",...e.args].filter(C=>!(0,Tt.isEmpty)(C)),configFilePath:c}}var Lr=i.extend("jest-discovery");async function Ut(e,t){console.time(P("@currents/jest:fullTestSuite-ready"));let{cliArgs:r,configFilePath:o}=await gt(t);try{let n=Ct.default.fileSync({postfix:".json"});return Lr("running scanner: %o",r),process.env.CURRENTS_DISCOVERY_PATH=n.name,await(0,ft.run)(r.concat(["--openHandlesTimeout=0"])),await V(J,Array.from({length:300},()=>100))(n.name),console.timeEnd(P("@currents/jest:fullTestSuite-ready")),await L(n.name)}catch(n){return R("Failed to obtain the jest full test suite:",n),[]}finally{o&&dt.default.unlinkSync(o)}}var W=class extends D{constructor(t){super(t)}async getFullTestSuite(){return Ut(this.config.frameworkConfig,this.config.cliArgs)}};var Dt=E(require("fs-extra"));var Ot=E(require("path"));function $(e){return Ot.default.join(e,"fullTestSuite.json")}var Br=i.extend("junit-discovery");async function At(e){console.time(P("@currents/junit:fullTestSuite-ready"));try{Br("running scanner: %o",e);let t=$(e);process.env.CURRENTS_DISCOVERY_PATH=t;let r=Dt.default.readFileSync(t,"utf-8");return JSON.parse(r)}catch(t){return R("Failed to obtain the junit full test suite:",t),[]}}var Q=class extends D{constructor(t,r){super(t),this.reportDir=r}async getFullTestSuite(){return At(this.reportDir)}};function St(e,t){switch(e.framework){case"jest":return new W(e);case"junit":return new Q(e,t);default:return new D(e)}}var y=E(require("fs-extra")),O=E(require("path"));async function Lt(e){let t=await hr(e?.reportDir);if(!t)throw new Error("Failed to find the report dir");return{reportDir:t,configFilePath:e?.configFilePath??O.default.join(t,"config.json")}}async function hr(e){return e?(await q(e),e):Nr((0,O.join)(process.cwd(),".currents"))}async function Nr(e){let t=await y.default.readdir(e),r=null;for(let o of t){let n=O.default.join(e,o),a=await y.default.stat(n);a.isDirectory()&&(!r||a.birthtime>r.birthtime)&&(r={name:o,birthtime:a.birthtime})}return r?(0,O.resolve)(e,r.name):null}async function q(e){try{return await y.default.pathExists(e)}catch{return R("Error checking if path exists:",R),!1}}async function Bt(e){let t=O.default.join(e,"instances");return Pr(t)}async function Pr(e){let t=await y.default.readdir(e),r=[];for(let o of t){let n=O.default.join(e,o);(await y.default.stat(n)).isFile()&&r.push(n)}return r}var yr=e=>Buffer.byteLength(JSON.stringify(e),"utf8"),ht=(e,t=1048576)=>{let r=[],o=[],n=0;for(let a of e){let c=yr(a);n+c>t&&(r.push(o),o=[],n=0),o.push(a),n+=c}return o.length>0&&r.push(o),r};var Mr=3e4;async function Mt(){let e=Et();if(!e)throw new Error("Currents config is missing!");let t=await Lt(e);de(br(t.reportDir)),i("Reporter options: %o",t),se("Report directory: %s",t.reportDir);let r=await L(t.configFilePath);i("Report config: %o",r);let o=await Bt(t.reportDir);i("Found %d instance results in the reportDir: %s",o.length,t.reportDir);let n=xr(t.reportDir),a=await q(n),c=$(t.reportDir),I=null;if(a){let U=await L(n);u("Marker file detected. The report was already uploaded: %o",{runUrl:U.response.runUrl,isoDate:U.isoDate})}if(await q(c)&&(I=await L(c),i("Full test suite file detected: %s",c)),I)i("The discovery stage was skipped");else{if(I=await St(r,t.reportDir).getFullTestSuite(),vr(I))throw new Error("Failed to discover the full test suite!");await ae(c,JSON.stringify(I))}let B=I.length===1?I[0].name:null,A={currents:e},X={type:r.framework,version:r.frameworkVersion,clientVersion:F,frameworkConfig:{originFramework:r.frameworkConfig?.originFramework,originFrameworkVersion:r.frameworkConfig?.originFrameworkVersion}},M=w.userFacingNanoid(),me=Ae(e.ciBuildId),h={};for await(let U of o){let g=await L(U);h[g.groupId]||(h[g.groupId]=[]),h[g.groupId].push(g)}let b=new Map;Object.values(h).forEach(U=>{U.forEach(g=>{g.artifacts?.forEach(d=>{d&&b.set(d.path,d.contentType)}),g.results.tests.forEach(d=>{d.artifacts?.forEach(T=>{T&&b.set(T.path,T.contentType)}),d.attempts.forEach(T=>{T.artifacts?.forEach(S=>{S&&b.set(S.path,S.contentType)})})})})});for await(let U of Object.keys(h)){let g=h[U],d=U;B&&(i("Default group found: %s, overwriting the group in the results",B),d=B,g=g.map(T=>({...T,groupId:B})));try{let T=ht(g),S=await Nt({ci:me,group:d,instances:[],fullTestSuite:I,config:A,machineId:M,framework:X});for(let Z=0;Z<T.length;Z++){let ee=await Nt({ci:me,group:d,instances:T[Z],fullTestSuite:[],config:A,machineId:M,framework:X});ee.artifactUploadUrls&&ee.artifactUploadUrls.length>0&&await wr(ee.artifactUploadUrls,t.reportDir,b)}i("Api response: %o",S),se("[%s] Run created: %s",d,S.runUrl);let xt={response:S,isoDate:new Date().toISOString()};await ae(n,JSON.stringify(xt)),i("Marker file %s: %s",a?"overwritten":"created",n)}catch(T){throw i("Failed to upload the results to the dashboard"),T}}}async function Nt({ci:e,group:t,instances:r,fullTestSuite:o,config:n,machineId:a,framework:c}){let I=await he(),C=await Me(),B={browserName:"node",browserVersion:yt.default.coerce(process.version)?.version},{currents:A}=n,M={platform:{...B,...C},ci:e,commit:I,group:t,fullTestSuite:o,config:n,projectId:A.projectId,recordKey:A.recordKey,ciBuildId:e.ciBuildId.value??void 0,tags:A.tag??[],machineId:A.machineId??a,framework:c,instances:r,previousCiBuildId:process.env.CURRENTS_PREVIOUS_CI_BUILD_ID};return i("Creating run: %o",x(M)),at(M)}function xr(e){return z.default.join(e,"upload.marker.json")}function br(e){return z.default.join(e,`.debug-${new Date().toISOString()}.log`)}function vr(e){return e.length===0||e.some(t=>t.tests.length===0)}async function wr(e,t,r){i("Uploading %d artifacts",e.length),await Promise.all(e.map(o=>{let n=z.default.join(t,o.path),a=r.get(o.path)||"application/octet-stream";return Gr(n,a,o.uploadUrl)}))}var Gr=async(e,t,r)=>{try{if(!await Re.default.pathExists(e)){u("Artifact file not found: %s",e);return}let o=await Re.default.readFile(e);await Pt.default.put(r,o,{headers:{"Content-Type":t},timeout:Mr})}catch(o){i("Failed to upload artifact %s: %o",e,o)}};0&&(module.exports={handleCurrentsReport});
10
+ `]:["Unexpected network error"]}var rt=i.extend("http");async function b(e,t,r=qe){try{let o=await r(e).request(t);return rt("network response: %o",{...ot.default.omit(o,"request","config"),url:o.config.url,method:o.config.method}),o}catch(o){let n=o;throw rt("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}),tt(n),n}}var hn=i.extend("api");var vn=i.extend("api");var st=require("util"),it=require("zlib");var nt=i.extend("api"),Ur=(0,st.promisify)(it.gzip);async function at(e){try{nt("Run params: %o",O(e));let t=await Or(JSON.stringify(e));return b("api",{url:"v1/runs",method:"POST",headers:{"Content-Type":"application/json","Content-Encoding":"gzip"},data:t}).then(r=>r.data)}catch(t){throw nt("Failed to create the run:",t),t}}async function Or(e){try{return await Ur(e)}catch(t){throw R("Failed to compress run payload:",t),t}}var Qn=i.extend("api");var Ts=i.extend("config");var Dr=null;function Et(){return Dr}var A=class{constructor(t){this.config=t}async getFullTestSuite(){return[]}};var dt=E(require("fs-extra")),ft=require("jest-cli"),Ct=E(require("tmp"));var Tt=require("lodash");function ct(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 _t=require("lodash"),Ar=["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 ut(e){return(0,_t.omit)(e,...Ar)}var Rt=E(require("fs")),mt=require("jest-config"),Re=require("lodash"),me=E(require("path"));function V(e,t){return(...r)=>new Promise((o,n)=>{let a=0,c=()=>{a++;try{let I=e(...r);o(I)}catch(I){if(a>=t.length)n(I);else{let C=t[a-1];setTimeout(c,C)}}};c()})}var It=E(require("fs-extra")),Sr=E(require("path"));async function J(e){let t=await It.default.pathExists(e);if(!t)throw new Error("File does not exist");return t}var pt=i.extend("jest-discovery");async function lt(e){try{let{config:t,configPath:r}=await(0,mt.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,Re.omit)(t,o);if(a.projects&&(a.projects=a.projects.map(C=>typeof C!="string"?(0,Re.omit)(C,n):C)),a.rootDir&&Object.keys(a).length===1)return null;let c=me.default.resolve(r?me.default.dirname(r):process.cwd(),`.jest-scanner-${new Date().getTime()}.config.cjs`),I=`module.exports=${JSON.stringify(a,null,2)}`;return pt("configFileContent: %O",I),Rt.default.writeFileSync(c,I),await V(J,[200,200,200,200,200,1e3])(c),c}catch(t){return R("Failed to recreate the config file"),pt("error %o",t),null}}async function gt(e){let t="!!##ThisPatternWillNotMatchAnyTestName##!!",r=e.options,o=ut(r),n=ct(o),a=r.config,c=await lt(a);return{cliArgs:[n,"--testNamePattern",t,"--reporters","@currents/cmd/discovery/jest","--shard=1/1",c?`--config=${c}`:"",...e.args].filter(C=>!(0,Tt.isEmpty)(C)),configFilePath:c}}var Lr=i.extend("jest-discovery");async function Ut(e,t){console.time(y("@currents/jest:fullTestSuite-ready"));let{cliArgs:r,configFilePath:o}=await gt(t);try{let n=Ct.default.fileSync({postfix:".json"});return Lr("running scanner: %o",r),process.env.CURRENTS_DISCOVERY_PATH=n.name,await(0,ft.run)(r.concat(["--openHandlesTimeout=0"])),await V(J,Array.from({length:300},()=>100))(n.name),console.timeEnd(y("@currents/jest:fullTestSuite-ready")),await B(n.name)}catch(n){return R("Failed to obtain the jest full test suite:",n),[]}finally{o&&dt.default.unlinkSync(o)}}var W=class extends A{constructor(t){super(t)}async getFullTestSuite(){return Ut(this.config.frameworkConfig,this.config.cliArgs)}};var Dt=E(require("fs-extra"));var Ot=E(require("path"));function $(e){return Ot.default.join(e,"fullTestSuite.json")}var Br=i.extend("junit-discovery");async function At(e){console.time(y("@currents/junit:fullTestSuite-ready"));try{Br("running scanner: %o",e);let t=$(e);process.env.CURRENTS_DISCOVERY_PATH=t;let r=Dt.default.readFileSync(t,"utf-8");return JSON.parse(r)}catch(t){return R("Failed to obtain the junit full test suite:",t),[]}}var Q=class extends A{constructor(t,r){super(t),this.reportDir=r}async getFullTestSuite(){return At(this.reportDir)}};function St(e,t){switch(e.framework){case"jest":return new W(e);case"junit":return new Q(e,t);default:return new A(e)}}var M=E(require("fs-extra")),D=E(require("path"));async function Lt(e){let t=await hr(e?.reportDir);if(!t)throw new Error("Failed to find the report dir");return{reportDir:t,configFilePath:e?.configFilePath??D.default.join(t,"config.json")}}async function hr(e){return e?(await q(e),e):Nr((0,D.join)(process.cwd(),".currents"))}async function Nr(e){let t=await M.default.readdir(e),r=null;for(let o of t){let n=D.default.join(e,o),a=await M.default.stat(n);a.isDirectory()&&(!r||a.birthtime>r.birthtime)&&(r={name:o,birthtime:a.birthtime})}return r?(0,D.resolve)(e,r.name):null}async function q(e){try{return await M.default.pathExists(e)}catch{return R("Error checking if path exists:",R),!1}}async function Bt(e){let t=D.default.join(e,"instances");return Pr(t)}async function Pr(e){let t=await M.default.readdir(e),r=[];for(let o of t){let n=D.default.join(e,o);(await M.default.stat(n)).isFile()&&r.push(n)}return r}var yr=e=>Buffer.byteLength(JSON.stringify(e),"utf8"),ht=(e,t=1048576)=>{let r=[],o=[],n=0;for(let a of e){let c=yr(a);n+c>t&&(r.push(o),o=[],n=0),o.push(a),n+=c}return o.length>0&&r.push(o),r};var Mr=3e4;async function Mt(){let e=Et();if(!e)throw new Error("Currents config is missing!");let t=await Lt(e);Ce(br(t.reportDir)),i("Reporter options: %o",t),se("Report directory: %s",t.reportDir);let r=await B(t.configFilePath);i("Report config: %o",r);let o=await Bt(t.reportDir);i("Found %d instance results in the reportDir: %s",o.length,t.reportDir);let n=xr(t.reportDir),a=await q(n),c=$(t.reportDir),I=null;if(a){let U=await B(n);u("Marker file detected. The report was already uploaded: %o",{runUrl:U.response.runUrl,isoDate:U.isoDate})}if(await q(c)&&(I=await B(c),i("Full test suite file detected: %s",c)),I)i("The discovery stage was skipped");else{if(I=await St(r,t.reportDir).getFullTestSuite(),vr(I))throw new Error("Failed to discover the full test suite!");await ae(c,JSON.stringify(I))}let h=I.length===1?I[0].name:null,S={currents:e},X={type:r.framework,version:r.frameworkVersion,clientVersion:K,frameworkConfig:{originFramework:r.frameworkConfig?.originFramework,originFrameworkVersion:r.frameworkConfig?.originFrameworkVersion}},x=G.userFacingNanoid(),Te=Le(e.ciBuildId),N={};for await(let U of o){let g=await B(U);N[g.groupId]||(N[g.groupId]=[]),N[g.groupId].push(g)}let v=new Map;Object.values(N).forEach(U=>{U.forEach(g=>{g.artifacts?.forEach(d=>{d&&v.set(d.path,d.contentType)}),g.results.tests.forEach(d=>{d.artifacts?.forEach(T=>{T&&v.set(T.path,T.contentType)}),d.attempts.forEach(T=>{T.artifacts?.forEach(L=>{L&&v.set(L.path,L.contentType)})})})})});for await(let U of Object.keys(N)){let g=N[U],d=U;h&&(i("Default group found: %s, overwriting the group in the results",h),d=h,g=g.map(T=>({...T,groupId:h})));try{let T=ht(g),L=await Nt({ci:Te,group:d,instances:[],fullTestSuite:I,config:S,machineId:x,framework:X});for(let Z=0;Z<T.length;Z++){let ee=await Nt({ci:Te,group:d,instances:T[Z],fullTestSuite:[],config:S,machineId:x,framework:X});ee.artifactUploadUrls&&ee.artifactUploadUrls.length>0&&await wr(ee.artifactUploadUrls,t.reportDir,v)}i("Api response: %o",L),se("[%s] Run created: %s",d,L.runUrl);let xt={response:L,isoDate:new Date().toISOString()};await ae(n,JSON.stringify(xt)),i("Marker file %s: %s",a?"overwritten":"created",n)}catch(T){throw i("Failed to upload the results to the dashboard"),T}}}async function Nt({ci:e,group:t,instances:r,fullTestSuite:o,config:n,machineId:a,framework:c}){let I=await Pe(),C=await be(),h={browserName:"node",browserVersion:yt.default.coerce(process.version)?.version},{currents:S}=n,x={platform:{...h,...C},ci:e,commit:I,group:t,fullTestSuite:o,config:n,projectId:S.projectId,recordKey:S.recordKey,ciBuildId:e.ciBuildId.value??void 0,tags:S.tag??[],machineId:S.machineId??a,framework:c,instances:r,previousCiBuildId:process.env.CURRENTS_PREVIOUS_CI_BUILD_ID};return i("Creating run: %o",O(x)),at(x)}function xr(e){return z.default.join(e,"upload.marker.json")}function br(e){return z.default.join(e,`.debug-${new Date().toISOString()}.log`)}function vr(e){return e.length===0||e.some(t=>t.tests.length===0)}async function wr(e,t,r){i("Uploading %d artifacts",e.length),await Promise.all(e.map(o=>{let n=z.default.join(t,o.path),a=r.get(o.path)||"application/octet-stream";return Gr(n,a,o.uploadUrl)}))}var Gr=async(e,t,r)=>{try{if(!await le.default.pathExists(e)){u("Artifact file not found: %s",e);return}let o=await le.default.readFile(e);await Pt.default.put(r,o,{headers:{"Content-Type":t},timeout:Mr})}catch(o){i("Failed to upload artifact %s: %o",e,o)}};0&&(module.exports={handleCurrentsReport});
11
11
  /*! For license information please see index.js.LEGAL.txt */
12
12
  //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@currents/cmd",
3
- "version": "1.9.9",
3
+ "version": "1.10.0",
4
4
  "main": "./dist/index.js",
5
5
  "author": {
6
6
  "name": "Currents Software Inc",
@@ -25,7 +25,7 @@
25
25
  "devDependencies": {
26
26
  "@jest/reporters": "^29.7.0",
27
27
  "@jest/types": "^29.6.3",
28
- "@release-it/conventional-changelog": "^10.0.1",
28
+ "@release-it/conventional-changelog": "^12.0.0",
29
29
  "release-it": "^19.2.4",
30
30
  "@types/archiver": "^6.0.3",
31
31
  "@types/async-retry": "^1.4.9",
@@ -45,19 +45,19 @@
45
45
  "rimraf": "^6.0.1",
46
46
  "tsup": "^8.3.5",
47
47
  "typescript": "^5.9.3",
48
- "vitest": "^2.1.9"
48
+ "vitest": "^4.1.0"
49
49
  },
50
50
  "dependencies": {
51
51
  "@commander-js/extra-typings": "^13.1.0",
52
52
  "@currents/commit-info": "1.0.1-beta.0",
53
53
  "archiver": "^7.0.1",
54
54
  "async-retry": "^1.3.3",
55
- "axios": "1.15.0",
55
+ "axios": "1.18.1",
56
56
  "axios-retry": "4.5.0",
57
57
  "chalk": "^4.1.2",
58
58
  "commander": "^13.1.0",
59
59
  "debug": "^4.4.0",
60
- "dotenv": "^17.2.3",
60
+ "dotenv": "^17.4.2",
61
61
  "execa": "^9.5.1",
62
62
  "fs-extra": "^11.3.4",
63
63
  "getos": "^3.2.1",
@@ -69,13 +69,13 @@
69
69
  "nanoid": "^3.3.8",
70
70
  "pretty-ms": "^7.0.1",
71
71
  "proxy-from-env": "^1.1.0",
72
- "semver": "^7.7.1",
72
+ "semver": "^7.8.5",
73
73
  "source-map-support": "^0.5.21",
74
- "tmp": "^0.2.5",
74
+ "tmp": "^0.2.7",
75
75
  "tmp-promise": "^3.0.3",
76
76
  "ts-pattern": "^5.8.0",
77
77
  "unzipper": "^0.12.3",
78
- "uuid": "11.1.0",
78
+ "uuid": "11.1.1",
79
79
  "xml2js": "^0.6.2",
80
80
  "xxhashjs": "^0.2.2"
81
81
  },