@currents/cmd 1.2.0-beta.0 → 1.2.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/README.md CHANGED
@@ -71,7 +71,7 @@ For more examples and usage options, run `npx currents api --help`.
71
71
 
72
72
  ## Cache test artifacts
73
73
 
74
- The `currents cache` command allows you to archive files from specified locations and save them under an ID in Currents storage. It also stores a meta file with configuration data. You can provide the ID manually or it can be generated based on CI environment variables (only GitHub and GitLab are supported).
74
+ The `currents cache` command allows you to archive files from specified locations and save them under an ID in Currents storage. It also stores a meta file with configuration data. You can provide the ID manually or it can be generated based on CI environment variables (only GitHub, GitLab, and Circle CI are supported).
75
75
 
76
76
  To cache files, use the following command:
77
77
 
package/dist/bin/index.js CHANGED
@@ -1,69 +1,69 @@
1
1
  #! /usr/bin/env node
2
- "use strict";var jo=Object.create;var xe=Object.defineProperty;var Ko=Object.getOwnPropertyDescriptor;var $o=Object.getOwnPropertyNames;var Vo=Object.getPrototypeOf,Jo=Object.prototype.hasOwnProperty;var Yo=(e,t)=>{for(var r in t)xe(e,r,{get:t[r],enumerable:!0})},qo=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of $o(t))!Jo.call(e,n)&&n!==r&&xe(e,n,{get:()=>t[n],enumerable:!(o=Ko(t,n))||o.enumerable});return e};var p=(e,t,r)=>(r=e!=null?jo(Vo(e)):{},qo(t||!e||!e.__esModule?xe(r,"default",{value:e,enumerable:!0}):r,e));var Hd=require("source-map-support/register");var Go=require("@commander-js/extra-typings");var st={name:"@currents/cmd",version:"1.2.0-beta.0",main:"./dist/index.js",author:"Currents Software Inc",license:"GPL-3.0-or-later",description:"Currents CLI tools",scripts:{test:"vitest",rm:"rimraf dist",lint:'TIMING=1 eslint "**/*.ts*"',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":"^7.0.2","@types/archiver":"^6.0.2","@types/async-retry":"^1.4.8","@types/debug":"^4.1.12","@types/fs-extra":"^11.0.4","@types/getos":"^3.0.4","@types/lodash":"^4.17.5","@types/node":"^20.14.2","@types/proxy-from-env":"^1.0.4","@types/semver":"^7.5.8","@types/tmp":"^0.2.6","@types/unzipper":"^0.10.10","@types/uuid":"^9.0.8",jest:"^29.7.0",rimraf:"^5.0.7",tsup:"^8.1.0",typescript:"^5.4.5",vitest:"^1.3.0"},dependencies:{"@commander-js/extra-typings":"^11.1.0","@currents/commit-info":"1.0.1-beta.0",archiver:"^7.0.1","async-retry":"^1.3.3",axios:"^1.7.2","axios-retry":"^4.4.0",commander:"^11.1.0",debug:"^4.3.5",dotenv:"^16.0.3",execa:"^8.0.1","fs-extra":"^11.2.0",getos:"^3.2.1","jest-cli":"^29.7.0","jest-config":"^29.7.0","https-proxy-agent":"^7.0.4",lodash:"^4.17.21",nanoid:"^3.3.4","pretty-ms":"^7.0.1","proxy-from-env":"^1.1.0",semver:"^7.6.0","source-map-support":"^0.5.21",tmp:"^0.2.3","tmp-promise":"^3.0.3","ts-pattern":"^5.2.0",unzipper:"^0.12.3"},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 ee=st.version;var it=require("@commander-js/extra-typings");var Qo=[];function Ue(e){Qo.push(e)}var I=p(require("chalk")),S=p(require("util"));var we=require("debug"),zo=p(require("fs-extra")),a=(0,we.debug)("currents"),Xo=null;function ct(){we.debug.enable("currents,currents:*")}function pt(e){Xo=e}var mt=[],dt=[];var te=(...e)=>{let t=S.default.format(...e);Ue(t),console.log(t)},Zo=(...e)=>{let t=S.default.format(...e);Ue(t),console.error(t)},G=te,f=(...e)=>{let t=S.default.format(...e);return dt.push(t),a("WARNING: ",t),te(I.default.bgYellow.black(" WARNING "),t)},Se=(...e)=>{let t=S.default.format(...ut(e));return a("WARNING: ",S.default.format(...e)),te(I.default.bgYellow.black(" WARNING "),t)},re=(...e)=>te(I.default.green.bold(S.default.format(...e))),C=(...e)=>{let t=S.default.format(...ut(e));return mt.push(t),a("ERROR: ",S.default.format(...e)),Zo(I.default.bgRed.white(" ERROR "),t)};var ut=e=>e.map(t=>t instanceof Error?t.message:t),oe=(e=2)=>console.log(Array(e).fill("").join(`
3
- `)),ki=I.default.cyan,Gi=I.default.blueBright,Fi=I.default.red,Hi=I.default.yellow,ji=I.default.green,Ki=I.default.gray,$i=I.default.white,Vi=I.default.black,Ji=I.default.magenta,h=I.default.dim,Yi=I.default.bold;var Eo=p(require("chalk"));var ne=class extends Error{};function lt(e){return Object.entries(e??{}).reduce((t,[r,o])=>o===void 0?t:{...t,[r]:o},{})}function _(e,t){return"env"in e[t]&&e[t].env?e[t].env:""}function tn(e,t){return e[t].cli}function rn(e,t){return e[t].name}function F(e,t,r,o){let n={...lt(o),...lt(r())};return t.forEach(s=>{if(!n[s])throw C(`${rn(e,s)} is required for Currents Reporter. Use the following methods to set the value:
4
- - as environment variable: ${h(_(e,s))}
5
- - as CLI flag of the command: ${h(tn(e,s))}`),new ne("Missing required config variable")}),n}var on={apiKey:{name:"Api Key",env:"CURRENTS_API_KEY",cli:"--api-key"},debug:{name:"Debug",env:"CURRENTS_DEBUG",cli:"--debug"}},nn={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"}},D={...on,...nn};function ft(){return{apiKey:process.env[D.apiKey.env],debug:!!process.env[D.debug.env]}}var an=a.extend("config"),sn=["apiKey","projectId"],De=null;function gt(e){De=F(D,sn,ft,e),an("Resolved config: %o",De)}function ie(){return De}var ae=p(require("fs-extra")),Ct=require("path");async function H(e){try{return await ae.default.readJson(e)}catch(t){throw C("Error while reading JSON file: %s",e,t),C}}async function j(e,t){try{return await ae.default.writeFile(e,t,"utf8"),e}catch(r){throw C(`Error writing file at ${e}:`,r),r}}async function Et(e){let t=(0,Ct.dirname)(e);await ae.default.ensureDir(t)}var se={};Yo(se,{getNanoid:()=>cn,userFacingNanoid:()=>ve});var Ne=require("nanoid"),ht="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",cn=(e=16)=>(0,Ne.customAlphabet)(ht,e)(),ve=(0,Ne.customAlphabet)(ht,12);var Jt=require("fs/promises");var Bt=p(require("lodash"));var bt=p(require("axios")),At=p(require("axios-retry")),xt=p(require("lodash"));var Le=()=>process.env.CURRENTS_API_URL??"https://cy.currents.dev",Rt=()=>process.env.CURRENTS_REST_API_URL??"https://api.currents.dev",It=()=>3e4;var Be=require("axios"),Me=p(require("pretty-ms"));var _t=a.extend("http"),ce=e=>[3*1e3,15*1e3,30*1e3][e-1],Tt=e=>(_t("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,Be.isAxiosError)(e)}),"code"in e&&e.code&&["ECONNABORTED","ECONNREFUSED","ECONNRESET","ETIMEDOUT","ENETRESET"].includes(e.code)?!0:(0,Be.isAxiosError)(e)?[429,502,503,504].includes(e.response?.status??0):!1),pe=()=>3;function Ot(e,t,r){_t("Network request '%s' failed: '%s'. Next attempt is in %s (%d/%d).",`${r.method?.toUpperCase()} ${r.url}`,t.message,(0,Me.default)(ce(e)),e,pe()),f("Network request '%s' failed: '%s'. Next attempt is in %s (%d/%d).",`${r.method?.toUpperCase()} ${r.url}`,t.message,(0,Me.default)(ce(e)),e,pe())}var Pt=a.extend("http");var ke={api:null,restApi:null};function pn(e){let t=bt.default.create({baseURL:e==="api"?Le():Rt(),timeout:It(),transitional:{clarifyTimeoutError:!0}});return t.interceptors.request.use(r=>{let o=r["axios-retry"]?.retryCount??0;r.headers.get("Content-Type")||r.headers.set("Content-Type","application/json");let n={...xt.default.pick(r,"method","url","headers"),data:Buffer.isBuffer(r.data)?"buffer":r.data};return o?Pt("network request retry: %o",yt({...n,isRetry:!0})):Pt("network request: %o",yt(n)),r}),(0,At.default)(t,{retries:pe(),retryCondition:Tt,retryDelay:ce,shouldResetTimeout:!0,onRetry:Ot}),t}function Ut(e){return ke[e]===null&&(ke[e]=pn(e)),ke[e]}function yt(e){return{method:e.method,baseUrl:Le(),url:e.url,data:e.isRetry?"<retry>":mn(e.data),headers:{...e.headers,"x-currents-key":"***"}}}function mn(e){return e?.results?.raw?{...e,results:{...e.results,raw:"***"}}:e}var Dt=require("axios"),Nt=p(require("lodash")),T=require("ts-pattern");function vt(e){(0,T.match)(e).when(Dt.isAxiosError,dn).otherwise(()=>{f("Unexpected error while sending network request: %s",e)})}function dn(e){return(0,T.match)(e).with({code:"ECONNABORTED"},()=>{f("Network connection aborted")}).with({code:"ECONNREFUSED"},()=>{f("Network connection aborted")}).with({code:"ECONNRESET"},()=>{f("Network connection reset")}).with({code:"ETIMEDOUT"},()=>{f("Network connection timeout")}).with({response:T.P.not(T.P.nullish)},t=>{un(t,{status:t.response.status,data:t.response.data})}).otherwise(t=>{f(`[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 un(e,{status:t,data:r}){(0,T.match)(t).with(401,()=>{f(`[currents] ${e.response?.config.method} ${e.response?.config.url}} - 401 Unauthorized Request from cloud service`)}).with(400,()=>{f(`[currents] ${e.response?.config.method} ${e.response?.config.url} - 400 Bad Request from cloud service:
7
- %o`,r)}).with(429,()=>{f(`[currents] ${e.response?.config.method} ${e.response?.config.url} - 429 Too Many Requests from cloud service`)}).with(422,()=>{ln(e,r)}).otherwise(()=>{f(`[currents] Unexpected network response: %s
8
- %O`,e.message,{method:e.response?.config.method,url:e.response?.config.url,status:e.response?.status})})}function ln(e,t){(0,T.match)(t).with({code:wt.MISSING_SUITE,message:T.P.string,errors:T.P.array(T.P.string)},async r=>{let{message:o,errors:n}=r;oe(1),C(...St(o,n))}).with({code:wt.RUN_EXPIRED,message:T.P.string},r=>{f(r.message)}).with({message:T.P.string,errors:T.P.array(T.P.string)},r=>{let{message:o,errors:n}=r;oe(1),f(...St(o,n)),oe(1)}).otherwise(()=>{f(`[currents] Unexpected network response: %s
9
- %O`,e.message,{method:e.response?.config.method,url:e.response?.config.url,status:e.response?.status})})}var wt={RUN_CANCELLED:"RUN_CANCELLED",RUN_EXPIRED:"RUN_EXPIRED",MISSING_SUITE:"MISSING_SUITE"};function St(e,t){return Nt.default.isString(e)?t?.length===0?[e]:[e,`
2
+ "use strict";var Yo=Object.create;var Ue=Object.defineProperty;var qo=Object.getOwnPropertyDescriptor;var Wo=Object.getOwnPropertyNames;var Qo=Object.getPrototypeOf,zo=Object.prototype.hasOwnProperty;var Xo=(e,t)=>{for(var r in t)Ue(e,r,{get:t[r],enumerable:!0})},Zo=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Wo(t))!zo.call(e,n)&&n!==r&&Ue(e,n,{get:()=>t[n],enumerable:!(o=qo(t,n))||o.enumerable});return e};var u=(e,t,r)=>(r=e!=null?Yo(Qo(e)):{},Zo(t||!e||!e.__esModule?Ue(r,"default",{value:e,enumerable:!0}):r,e));var ad=require("source-map-support/register");var $o=require("@commander-js/extra-typings");var ct={name:"@currents/cmd",version:"1.2.0",main:"./dist/index.js",author:"Currents Software Inc",license:"GPL-3.0-or-later",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":"^7.0.2","@types/archiver":"^6.0.3","@types/async-retry":"^1.4.8","@types/debug":"^4.1.12","@types/fs-extra":"^11.0.4","@types/getos":"^3.0.4","@types/lodash":"^4.17.5","@types/node":"^20.14.2","@types/proxy-from-env":"^1.0.4","@types/semver":"^7.5.8","@types/tmp":"^0.2.6","@types/unzipper":"^0.10.10","@types/uuid":"^9.0.8","@types/xml2js":"^0.4.14",jest:"^29.7.0",rimraf:"^5.0.7",tsup:"^8.1.0",typescript:"^5.4.5",vitest:"^2.1.4"},dependencies:{"@commander-js/extra-typings":"^11.1.0","@currents/commit-info":"1.0.1-beta.0",archiver:"^7.0.1","async-retry":"^1.3.3",axios:"^1.7.2","axios-retry":"^4.4.0",commander:"^11.1.0",debug:"^4.3.5",dotenv:"^16.4.5",execa:"^8.0.1","fs-extra":"^11.2.0",getos:"^3.2.1","https-proxy-agent":"^7.0.4","jest-cli":"^29.7.0","jest-config":"^29.7.0",lodash:"^4.17.21",nanoid:"^3.3.4","pretty-ms":"^7.0.1","proxy-from-env":"^1.1.0",semver:"^7.6.0","source-map-support":"^0.5.21",tmp:"^0.2.3","tmp-promise":"^3.0.3","ts-pattern":"^5.2.0",unzipper:"^0.12.3",xml2js:"^0.6.2"},bin:{currents:"./dist/bin/index.js","currents-cli":"./dist/bin/index.js"},files:["dist","!**/*.map","!**/*/*.map"],keywords:["cloud test dashboard","test reporter","test results","currents","currents dashboard","ci"],exports:{".":{import:"./dist/index.js",require:"./dist/index.js",types:"./dist/index.d.ts"},"./discovery/jest":{import:"./dist/services/upload/discovery/jest/reporter.js",require:"./dist/services/upload/discovery/jest/reporter.js",types:"./dist/services/upload/discovery/jest/reporter.d.ts"},"./package.json":"./package.json"},"release-it":{npm:{publish:!1},github:{release:!0,releaseName:"${npm.name} v${version}"},plugins:{"@release-it/conventional-changelog":{preset:"angular",header:"# Changelog",ignoreVersion:!0,infile:"./CHANGELOG.md"}},git:{commitMessage:"chore: release ${npm.name} v${version}",tagName:"${npm.name}-v${version}"}}};var ee=ct.version;var st=require("@commander-js/extra-typings");var tn=[];function we(e){tn.push(e)}var I=u(require("chalk")),S=u(require("util"));var Se=require("debug"),rn=u(require("fs-extra")),s=(0,Se.debug)("currents"),on=null;function mt(){Se.debug.enable("currents,currents:*")}function pt(e){on=e}var ut=[],dt=[];var te=(...e)=>{let t=S.default.format(...e);we(t),console.log(t)},nn=(...e)=>{let t=S.default.format(...e);we(t),console.error(t)},G=te,f=(...e)=>{let t=S.default.format(...e);return dt.push(t),s("WARNING: ",t),te(I.default.bgYellow.black(" WARNING "),t)},De=(...e)=>{let t=S.default.format(...lt(e));return s("WARNING: ",S.default.format(...e)),te(I.default.bgYellow.black(" WARNING "),t)},re=(...e)=>te(I.default.green.bold(S.default.format(...e))),g=(...e)=>{let t=S.default.format(...lt(e));return ut.push(t),s("ERROR: ",S.default.format(...e)),nn(I.default.bgRed.white(" ERROR "),t)};var lt=e=>e.map(t=>t instanceof Error?t.message:t),oe=(e=2)=>console.log(Array(e).fill("").join(`
3
+ `)),Ji=I.default.cyan,Yi=I.default.blueBright,qi=I.default.red,Wi=I.default.yellow,Qi=I.default.green,zi=I.default.gray,Xi=I.default.white,Zi=I.default.black,es=I.default.magenta,E=I.default.dim,ts=I.default.bold;var To=u(require("chalk"));var ne=class extends Error{};function ft(e){return Object.entries(e??{}).reduce((t,[r,o])=>o===void 0?t:{...t,[r]:o},{})}function _(e,t){return"env"in e[t]&&e[t].env?e[t].env:""}function an(e,t){return e[t].cli}function cn(e,t){return e[t].name}function H(e,t,r,o){let n={...ft(o),...ft(r())};return t.forEach(a=>{if(!n[a])throw g(`${cn(e,a)} is required for Currents Reporter. Use the following methods to set the value:
4
+ - as environment variable: ${E(_(e,a))}
5
+ - as CLI flag of the command: ${E(an(e,a))}`),new ne("Missing required config variable")}),n}var mn={apiKey:{name:"Api Key",env:"CURRENTS_API_KEY",cli:"--api-key"},debug:{name:"Debug",env:"CURRENTS_DEBUG",cli:"--debug"}},pn={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"}},D={...mn,...pn};function gt(){return{apiKey:process.env[D.apiKey.env],debug:!!process.env[D.debug.env]}}var un=s.extend("config"),dn=["apiKey","projectId"],Ne=null;function Ct(e){Ne=H(D,dn,gt,e),un("Resolved config: %o",Ne)}function ie(){return Ne}var se=u(require("fs-extra")),Et=require("path");async function j(e){try{return await se.default.readJson(e)}catch(t){throw g("Error while reading JSON file: %s",e,t),g}}async function K(e,t){try{return await se.default.writeFile(e,t,"utf8"),e}catch(r){throw g(`Error writing file at ${e}:`,r),r}}async function ht(e){let t=(0,Et.dirname)(e);await se.default.ensureDir(t)}var ae={};Xo(ae,{getNanoid:()=>ln,userFacingNanoid:()=>Le});var ve=require("nanoid"),Rt="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",ln=(e=16)=>(0,ve.customAlphabet)(Rt,e)(),Le=(0,ve.customAlphabet)(Rt,12);var Yt=require("fs/promises");var Mt=u(require("lodash"));var At=u(require("axios")),xt=u(require("axios-retry")),Ut=u(require("lodash"));var Be=()=>process.env.CURRENTS_API_URL??"https://cy.currents.dev",It=()=>process.env.CURRENTS_REST_API_URL??"https://api.currents.dev",_t=()=>3e4;var Me=require("axios"),Fe=u(require("pretty-ms"));var Tt=s.extend("http"),ce=e=>[3*1e3,15*1e3,30*1e3][e-1],Ot=e=>(Tt("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,Me.isAxiosError)(e)}),"code"in e&&e.code&&["ECONNABORTED","ECONNREFUSED","ECONNRESET","ETIMEDOUT","ENETRESET"].includes(e.code)?!0:(0,Me.isAxiosError)(e)?[429,502,503,504].includes(e.response?.status??0):!1),me=()=>3;function yt(e,t,r){Tt("Network request '%s' failed: '%s'. Next attempt is in %s (%d/%d).",`${r.method?.toUpperCase()} ${r.url}`,t.message,(0,Fe.default)(ce(e)),e,me()),f("Network request '%s' failed: '%s'. Next attempt is in %s (%d/%d).",`${r.method?.toUpperCase()} ${r.url}`,t.message,(0,Fe.default)(ce(e)),e,me())}var Pt=s.extend("http");var ke={api:null,restApi:null};function fn(e){let t=At.default.create({baseURL:e==="api"?Be():It(),timeout:_t(),transitional:{clarifyTimeoutError:!0}});return t.interceptors.request.use(r=>{let o=r["axios-retry"]?.retryCount??0;r.headers.get("Content-Type")||r.headers.set("Content-Type","application/json");let n={...Ut.default.pick(r,"method","url","headers"),data:Buffer.isBuffer(r.data)?"buffer":r.data};return o?Pt("network request retry: %o",bt({...n,isRetry:!0})):Pt("network request: %o",bt(n)),r}),(0,xt.default)(t,{retries:me(),retryCondition:Ot,retryDelay:ce,shouldResetTimeout:!0,onRetry:yt}),t}function wt(e){return ke[e]===null&&(ke[e]=fn(e)),ke[e]}function bt(e){return{method:e.method,baseUrl:Be(),url:e.url,data:e.isRetry?"<retry>":gn(e.data),headers:{...e.headers,"x-currents-key":"***"}}}function gn(e){return e?.results?.raw?{...e,results:{...e.results,raw:"***"}}:e}var Nt=require("axios"),vt=u(require("lodash")),T=require("ts-pattern");function Lt(e){(0,T.match)(e).when(Nt.isAxiosError,Cn).otherwise(()=>{f("Unexpected error while sending network request: %s",e)})}function Cn(e){return(0,T.match)(e).with({code:"ECONNABORTED"},()=>{f("Network connection aborted")}).with({code:"ECONNREFUSED"},()=>{f("Network connection aborted")}).with({code:"ECONNRESET"},()=>{f("Network connection reset")}).with({code:"ETIMEDOUT"},()=>{f("Network connection timeout")}).with({response:T.P.not(T.P.nullish)},t=>{En(t,{status:t.response.status,data:t.response.data})}).otherwise(t=>{f(`[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 En(e,{status:t,data:r}){(0,T.match)(t).with(401,()=>{f(`[currents] ${e.response?.config.method} ${e.response?.config.url}} - 401 Unauthorized Request from cloud service`)}).with(400,()=>{f(`[currents] ${e.response?.config.method} ${e.response?.config.url} - 400 Bad Request from cloud service:
7
+ %o`,r)}).with(429,()=>{f(`[currents] ${e.response?.config.method} ${e.response?.config.url} - 429 Too Many Requests from cloud service`)}).with(422,()=>{hn(e,r)}).otherwise(()=>{f(`[currents] Unexpected network response: %s
8
+ %O`,e.message,{method:e.response?.config.method,url:e.response?.config.url,status:e.response?.status})})}function hn(e,t){(0,T.match)(t).with({code:St.MISSING_SUITE,message:T.P.string,errors:T.P.array(T.P.string)},async r=>{let{message:o,errors:n}=r;oe(1),g(...Dt(o,n))}).with({code:St.RUN_EXPIRED,message:T.P.string},r=>{f(r.message)}).with({message:T.P.string,errors:T.P.array(T.P.string)},r=>{let{message:o,errors:n}=r;oe(1),f(...Dt(o,n)),oe(1)}).otherwise(()=>{f(`[currents] Unexpected network response: %s
9
+ %O`,e.message,{method:e.response?.config.method,url:e.response?.config.url,status:e.response?.status})})}var St={RUN_CANCELLED:"RUN_CANCELLED",RUN_EXPIRED:"RUN_EXPIRED",MISSING_SUITE:"MISSING_SUITE"};function Dt(e,t){return vt.default.isString(e)?t?.length===0?[e]:[e,`
10
10
  ${(t??[]).map(r=>` - ${r}`).join(`
11
11
  `)}
12
- `]:["Unexpected network error"]}var Lt=a.extend("http");async function K(e,t,r=Ut){try{let o=await r(e).request(t);return Lt("network response: %o",{...Bt.default.omit(o,"request","config"),url:o.config.url,method:o.config.method}),o}catch(o){let n=o;throw Lt("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}),vt(n),n}}var me=a.extend("api");async function kt(e){try{return me("Request params: %o",e),K("api",{url:"cache/upload",method:"POST",data:e}).then(t=>t.data)}catch(t){throw me("Failed to create cache:",t),t}}async function Gt(e){try{return me("Request params: %o",e),K("api",{url:"cache/download",method:"POST",data:e}).then(t=>t.data)}catch(t){throw me("Failed to retrieve cache:",t),t}}var Ht=require("util"),jt=require("zlib");var Ft=a.extend("api"),fn=(0,Ht.promisify)(jt.gzip);async function Kt(e){try{Ft("Run params: %o",e);let t=await gn(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 Ft("Failed to create the run:",t),t}}async function gn(e){try{return await fn(e)}catch(t){throw C("Failed to compress run payload:",t),t}}var $t=a.extend("api");async function Vt(e,t){try{return $t("Run params: %o",t),K("restApi",{url:"v1/runs/previous",params:t,method:"GET",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`}}).then(r=>r.data)}catch(r){throw $t("Failed to obtain run data:",r),r}}async function Ge(){try{let e=ie();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 Vt(e.apiKey,t);await Cn(e.pwLastRun&&r.data.pwLastRun?r.data.pwLastRun:r.data,e)}catch(e){throw a("Failed to get run data"),e}}async function Cn(e,t){let r=JSON.stringify(e,null,2);t.output?(await Et(t.output),await(0,Jt.writeFile)(t.output,r,"utf-8")):G(r)}var br=require("axios");var P=require("@commander-js/extra-typings");var En={recordKey:{name:"Record Key",env:"CURRENTS_RECORD_KEY",cli:"--key"},debug:{name:"Debug",env:"CURRENTS_DEBUG",cli:"--debug"}},hn={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"}},Rn={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"}},L={...En,...hn,...Rn};function Fe(){return{recordKey:process.env[L.recordKey.env],debug:process.env[L.debug.env]}}var Yt=a.extend("config"),qt=["recordKey"],z;function Wt(e){z={type:"SET_COMMAND_CONFIG",values:F(L,qt,Fe,e)},Yt("Resolved config: %o",z)}function Qt(e){z={type:"GET_COMMAND_CONFIG",values:F(L,qt,Fe,e)},Yt("Resolved config: %o",z)}function B(){return z}function zt(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 Xt(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}}var Zt=require("@commander-js/extra-typings");function $(e,t=[]){return e?t.concat(e.split(",").map(r=>r.trim())):t}async function M(e,t){try{t.debug&&ct(),await e(t),process.exit(0)}catch(r){C(r.message);let o=r instanceof Zt.CommanderError?r.exitCode:1;process.exit(o)}}var He=new P.Option("-k, --key <record-key>","Your secret Record Key obtained from Currents").env(_(L,"recordKey")),je=new P.Option("--debug","Enable debug logging").env(_(L,"debug")).default(!1),Ke=new P.Option("--id <id>","The ID the data is saved under in the cache"),er=new P.Option("--path <path>","Comma-separated list of paths to cache").argParser($),de=(t=>(t.lastRun="last-run",t))(de||{}),$e=new P.Option("--preset <preset-name>",'A set of predefined options. Use "last-run" to get the last run data').choices(Object.values(de)),tr=new P.Option("--output-dir <dir>","Path to the directory where output will be written"),rr=new P.Option("--pw-output-dir <dir>","Directory for artifacts produced by Playwright tests").default("test-results"),X=".currents_env",or=new P.Option("--preset-output <path>","Path to the file containing the preset output").default(X),Ve=new P.Option("--matrix-index <number>","The index of the matrix to use").default(1).argParser(nr),Je=new P.Option("--matrix-total <number>","The total number of matrices available").default(1).argParser(nr);function nr(e){let t=parseInt(e,10);if(isNaN(t)||t<=0||!Number.isInteger(t))throw new P.InvalidArgumentError("A positive integer is expected.");return t}var ir=new P.Option("--continue","Continue the script execution if the cache is not found").default(!1);var E=require("lodash");var ue=a.extend("ci"),In=(e,...t)=>(0,E.chain)(t).compact().join(e).value(),_n=(e,t)=>(0,E.set)(e,(0,E.camelCase)(t),process.env[t]),g=e=>(0,E.transform)(e,_n,{}),Tn=()=>process.env.TF_BUILD&&process.env.TF_BUILD_BUILDNUMBER,On=()=>process.env.TF_BUILD&&process.env.AZURE_HTTP_USER_AGENT,Pn=()=>(0,E.some)(process.env,(e,t)=>/^CODEBUILD_/.test(t)),yn=()=>process.env.bamboo_buildNumber,bn=()=>process.env.CI_NAME&&process.env.CI_NAME==="codeship"&&process.env.CODESHIP,An=()=>process.env.CI_NAME&&process.env.CI_NAME==="codeship"&&!process.env.CODESHIP,xn=()=>(0,E.some)(process.env,(e,t)=>/^CONCOURSE_/.test(t)),Un=()=>process.env.GITLAB_CI||process.env.CI_SERVER_NAME&&/^GitLab/.test(process.env.CI_SERVER_NAME),wn=()=>process.env.GCP_PROJECT||process.env.GCLOUD_PROJECT||process.env.GOOGLE_CLOUD_PROJECT,Sn=()=>process.env.JENKINS_URL||process.env.JENKINS_HOME||process.env.JENKINS_VERSION||process.env.HUDSON_URL||process.env.HUDSON_HOME,Dn=()=>process.env.WERCKER||process.env.WERCKER_MAIN_PIPELINE_STARTED,Nn={appveyor:"APPVEYOR",azure:On,awsCodeBuild:Pn,bamboo:yn,bitbucket:"BITBUCKET_BUILD_NUMBER",buildkite:"BUILDKITE",circle:"CIRCLECI",codeshipBasic:bn,codeshipPro:An,concourse:xn,codeFresh:"CF_BUILD_ID",drone:"DRONE",githubActions:"GITHUB_ACTIONS",gitlab:Un,goCD:"GO_JOB_NAME",googleCloud:wn,jenkins:Sn,semaphore:"SEMAPHORE",shippable:"SHIPPABLE",teamcity:"TEAMCITY_VERSION",teamfoundation:Tn,travis:"TRAVIS",wercker:Dn,netlify:"NETLIFY",layerci:"LAYERCI"};function vn(){let{env:e}=process;return(0,E.findKey)(Nn,t=>{if((0,E.isString)(t))return e[t];if((0,E.isFunction)(t))return t()})}var ar=()=>({appveyor:g(["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:g(["BUILD_BUILDID","BUILD_BUILDNUMBER","BUILD_CONTAINERID","BUILD_REPOSITORY_URI","SYSTEM_TEAMPROJECT","SYSTEM_COLLECTIONURI"]),awsCodeBuild:g(["CODEBUILD_BUILD_ID","CODEBUILD_BUILD_NUMBER","CODEBUILD_RESOLVED_SOURCE_VERSION","CODEBUILD_SOURCE_REPO_URL","CODEBUILD_SOURCE_VERSION"]),bamboo:g(["bamboo_buildNumber","bamboo_buildResultsUrl","bamboo_planRepository_repositoryUrl","bamboo_buildKey"]),bitbucket:g(["BITBUCKET_REPO_SLUG","BITBUCKET_REPO_OWNER","BITBUCKET_BUILD_NUMBER","BITBUCKET_PARALLEL_STEP","BITBUCKET_STEP_RUN_NUMBER","BITBUCKET_PR_ID","BITBUCKET_PR_DESTINATION_BRANCH","BITBUCKET_PR_DESTINATION_COMMIT"]),buildkite:g(["BUILDKITE_REPO","BUILDKITE_SOURCE","BUILDKITE_JOB_ID","BUILDKITE_BUILD_ID","BUILDKITE_BUILD_URL","BUILDKITE_BUILD_NUMBER","BUILDKITE_PULL_REQUEST","BUILDKITE_PULL_REQUEST_REPO","BUILDKITE_PULL_REQUEST_BASE_BRANCH"]),circle:g(["CIRCLE_JOB","CIRCLE_BUILD_NUM","CIRCLE_BUILD_URL","CIRCLE_PR_NUMBER","CIRCLE_PR_REPONAME","CIRCLE_PR_USERNAME","CIRCLE_COMPARE_URL","CIRCLE_WORKFLOW_ID","CIRCLE_WORKFLOW_WORKSPACE_ID","CIRCLE_PULL_REQUEST","CIRCLE_REPOSITORY_URL","CI_PULL_REQUEST","CIRCLE_NODE_INDEX","CIRCLE_NODE_TOTAL"]),codeshipBasic:g(["CI_BUILD_ID","CI_REPO_NAME","CI_BUILD_URL","CI_PROJECT_ID","CI_BUILD_NUMBER","CI_PULL_REQUEST"]),codeshipPro:g(["CI_BUILD_ID","CI_REPO_NAME","CI_PROJECT_ID"]),concourse:g(["BUILD_ID","BUILD_NAME","BUILD_JOB_NAME","BUILD_PIPELINE_NAME","BUILD_TEAM_NAME","ATC_EXTERNAL_URL"]),codeFresh:g(["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:g(["DRONE_JOB_NUMBER","DRONE_BUILD_LINK","DRONE_BUILD_NUMBER","DRONE_PULL_REQUEST"]),githubActions:g(["GITHUB_WORKFLOW","GITHUB_ACTION","GITHUB_EVENT_NAME","GITHUB_RUN_ID","GITHUB_RUN_ATTEMPT","GITHUB_REPOSITORY"]),gitlab:g(["CI_PIPELINE_ID","CI_PIPELINE_URL","CI_BUILD_ID","CI_JOB_ID","CI_JOB_URL","CI_JOB_NAME","CI_NODE_INDEX","CI_NODE_TOTAL","GITLAB_HOST","CI_PROJECT_ID","CI_PROJECT_URL","CI_REPOSITORY_URL","CI_ENVIRONMENT_URL","CI_DEFAULT_BRANCH","RUN_ATTEMPT"]),goCD:g(["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:g(["BUILD_ID","PROJECT_ID","REPO_NAME","BRANCH_NAME","TAG_NAME","COMMIT_SHA","SHORT_SHA"]),jenkins:g(["BUILD_ID","BUILD_URL","BUILD_NUMBER","ghprbPullId"]),semaphore:g(["SEMAPHORE_BRANCH_ID","SEMAPHORE_BUILD_NUMBER","SEMAPHORE_CURRENT_JOB","SEMAPHORE_CURRENT_THREAD","SEMAPHORE_EXECUTABLE_UUID","SEMAPHORE_GIT_BRANCH","SEMAPHORE_GIT_DIR","SEMAPHORE_GIT_REF","SEMAPHORE_GIT_REF_TYPE","SEMAPHORE_GIT_REPO_SLUG","SEMAPHORE_GIT_SHA","SEMAPHORE_GIT_URL","SEMAPHORE_JOB_COUNT","SEMAPHORE_JOB_ID","SEMAPHORE_JOB_NAME","SEMAPHORE_JOB_UUID","SEMAPHORE_PIPELINE_ID","SEMAPHORE_PLATFORM","SEMAPHORE_PROJECT_DIR","SEMAPHORE_PROJECT_HASH_ID","SEMAPHORE_PROJECT_ID","SEMAPHORE_PROJECT_NAME","SEMAPHORE_PROJECT_UUID","SEMAPHORE_REPO_SLUG","SEMAPHORE_TRIGGER_SOURCE","SEMAPHORE_WORKFLOW_ID","PULL_REQUEST_NUMBER"]),shippable:g(["SHIPPABLE_BUILD_ID","SHIPPABLE_BUILD_NUMBER","SHIPPABLE_COMMIT_RANGE","SHIPPABLE_CONTAINER_NAME","SHIPPABLE_JOB_ID","SHIPPABLE_JOB_NUMBER","SHIPPABLE_REPO_SLUG","IS_FORK","IS_GIT_TAG","IS_PRERELEASE","IS_RELEASE","REPOSITORY_URL","REPO_FULL_NAME","REPO_NAME","BUILD_URL","BASE_BRANCH","HEAD_BRANCH","IS_PULL_REQUEST","PULL_REQUEST","PULL_REQUEST_BASE_BRANCH","PULL_REQUEST_REPO_FULL_NAME"]),teamcity:null,teamfoundation:g(["BUILD_BUILDID","BUILD_BUILDNUMBER","BUILD_CONTAINERID"]),travis:g(["TRAVIS_JOB_ID","TRAVIS_BUILD_ID","TRAVIS_BUILD_WEB_URL","TRAVIS_REPO_SLUG","TRAVIS_JOB_NUMBER","TRAVIS_EVENT_TYPE","TRAVIS_COMMIT_RANGE","TRAVIS_BUILD_NUMBER","TRAVIS_PULL_REQUEST","TRAVIS_PULL_REQUEST_BRANCH","TRAVIS_PULL_REQUEST_SHA"]),wercker:null,netlify:g(["BUILD_ID","CONTEXT","URL","DEPLOY_URL","DEPLOY_PRIME_URL","DEPLOY_ID"]),layerci:g(["LAYERCI_JOB_ID","LAYERCI_RUNNER_ID","RETRY_INDEX","LAYERCI_PULL_REQUEST","LAYERCI_REPO_NAME","LAYERCI_REPO_OWNER","LAYERCI_BRANCH","GIT_TAG"])}),Ln=()=>{let{env:e}=process;return{appveyor:{sha:e.APPVEYOR_REPO_COMMIT,branch:e.APPVEYOR_PULL_REQUEST_HEAD_REPO_BRANCH||e.APPVEYOR_REPO_BRANCH,message:In(`
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},codeshipBasic:{sha:e.CI_COMMIT_ID,branch:e.CI_BRANCH,message:e.CI_COMMIT_MESSAGE,authorName:e.CI_COMMITTER_NAME,authorEmail:e.CI_COMMITTER_EMAIL},codeshipPro:{sha:e.CI_COMMIT_ID,branch:e.CI_BRANCH,message:e.CI_COMMIT_MESSAGE,authorName:e.CI_COMMITTER_NAME,authorEmail:e.CI_COMMITTER_EMAIL},codeFresh:{sha:e.CF_REVISION,branch:e.CF_BRANCH,message:e.CF_COMMIT_MESSAGE,authorName:e.CF_COMMIT_AUTHOR},drone:{sha:e.DRONE_COMMIT_SHA,branch:e.DRONE_SOURCE_BRANCH,message:e.DRONE_COMMIT_MESSAGE,authorName:e.DRONE_COMMIT_AUTHOR,authorEmail:e.DRONE_COMMIT_AUTHOR_EMAIL,remoteOrigin:e.DRONE_GIT_HTTP_URL,defaultBranch:e.DRONE_REPO_BRANCH},githubActions:{sha:e.GITHUB_SHA,branch:e.GH_BRANCH||e.GITHUB_REF,defaultBranch:e.GITHUB_BASE_REF,remoteBranch:e.GITHUB_HEAD_REF,runAttempt:e.GITHUB_RUN_ATTEMPT},gitlab:{sha:e.CI_COMMIT_SHA,branch:e.CI_COMMIT_REF_NAME,message:e.CI_COMMIT_MESSAGE,authorName:e.GITLAB_USER_NAME,authorEmail:e.GITLAB_USER_EMAIL,remoteOrigin:e.CI_REPOSITORY_URL,defaultBranch:e.CI_DEFAULT_BRANCH},googleCloud:{sha:e.COMMIT_SHA,branch:e.BRANCH_NAME},jenkins:{sha:e.GIT_COMMIT,branch:e.GIT_BRANCH},semaphore:{sha:e.SEMAPHORE_GIT_SHA,branch:e.SEMAPHORE_GIT_BRANCH,remoteOrigin:e.SEMAPHORE_GIT_REPO_SLUG},shippable:{sha:e.COMMIT,branch:e.BRANCH,message:e.COMMIT_MESSAGE,authorName:e.COMMITTER},snap:null,teamcity:null,teamfoundation:{sha:e.BUILD_SOURCEVERSION,branch:e.BUILD_SOURCEBRANCHNAME,message:e.BUILD_SOURCEVERSIONMESSAGE,authorName:e.BUILD_SOURCEVERSIONAUTHOR},travis:{sha:e.TRAVIS_PULL_REQUEST_SHA||e.TRAVIS_COMMIT,branch:e.TRAVIS_PULL_REQUEST_BRANCH||e.TRAVIS_BRANCH,message:e.TRAVIS_COMMIT_MESSAGE},wercker:null,netlify:{sha:e.COMMIT_REF,branch:e.BRANCH,remoteOrigin:e.REPOSITORY_URL},layerci:{sha:e.GIT_COMMIT,branch:e.LAYERCI_BRANCH,message:e.GIT_COMMIT_TITLE}}},sr=e=>{let t=cr();return t?(0,E.chain)(e()).get(t).value():{}};function Bn(){return(0,E.chain)(ar()).omitBy(E.isNull).keys().value()}function Mn(e){return e&&Bn().includes(e)}function cr(){let e=vn();return ue("detected CI provider name: %s",e),e||null}function kn(){return sr(ar)}function pr(){return sr(Ln)}function V(e){let t=kn(),r=cr(),o=Gn(e,r);return ue("detected CI provider: %s",r),ue("detected CI params: %O",t),ue("detected CI build ID: %o",o),{params:t,provider:r,ciBuildId:o}}function Gn(e,t){return e?{source:"user",value:e}:Mn(t)?{source:"server",value:null}:{source:"random",value:`auto:${ve()}`}}var mr=p(require("archiver")),dr=p(require("fs-extra")),J=p(require("path")),ur=p(require("unzipper"));var Fn=50*1024*1024;async function lr(e,t=Fn){return new Promise((r,o)=>{let n=(0,mr.default)("zip",{zlib:{level:9}}),s=[],m=0;n.on("data",c=>{s.push(c),m+=c.length,m>t&&o(new Error(`Zip size exceeded the limit of ${t} bytes`))}),n.on("warning",c=>{c.code==="ENOENT"?f(c):o(c)}),n.on("error",c=>o(c)),n.on("end",()=>{let c=Buffer.concat(s);r(c)});let u=async c=>{let l=process.cwd(),O=J.default.normalize(c),A=J.default.relative(l,O),y=await dr.default.stat(c);y.isDirectory()?n.directory(c,A):n.file(c,{name:A,stats:y})};(async c=>{for(let l of c)await u(l);await n.finalize()})(e).catch(o)})}async function fr(e,t){return ur.default.Open.buffer(e).then(r=>r.extract({path:t,concurrency:3}))}function gr(e){let t=process.cwd();return e.filter(r=>{let o=J.default.resolve(r),n=J.default.relative(t,o);return r.startsWith("..")||J.default.isAbsolute(n)?(f(`Invalid path: "${r}". Path traversal detected. The path was skipped.`),!1):!0})}var Ir=p(require("async-retry")),_r=require("axios");var Cr=p(require("axios")),Er=require("https-proxy-agent"),hr=p(require("proxy-from-env"));var Hn=a.extend("axios");function Ye(e={}){let t=Cr.default.create(e);return t.interceptors.request.use(r=>{let o={...r},n=t.getUri(r),s=hr.default.getProxyForUrl(n);return s&&(Hn("Using HTTP proxy %s for %s ",s,n),o.proxy=!1,o.httpsAgent=jn(s)),o}),t}var le=null;function jn(e){return le||(le=new Er.HttpsProxyAgent(e),le)}var ge=a.extend("upload"),fe=5;async function qe(e,t,r){return ge("Uploading buffer %s",e.name,{buffer:Buffer.byteLength(e.buffer)}),$n(e.buffer,e.uploadUrl,t,r)}async function Kn(e,t,r,o){return Ye().request({method:"put",url:t,data:e,onUploadProgress:o,headers:{"Content-Disposition":"inline","Content-Type":r}})}async function We(e,t){try{let r=await Ye().get(e,{responseType:"arraybuffer",onDownloadProgress:t});return Buffer.from(r.data)}catch(r){throw(0,_r.isAxiosError)(r)&&ge("Failed to download %s: %s",e,r.message),r}}async function $n(...e){await(0,Ir.default)(async()=>{await Kn(...e)},{retries:fe,onRetry:(t,r)=>{if(ge("Upload failed %d out of %d attempts: %s",r,fe,t.message),r===fe){C(`Cannot upload after ${r} times: ${t.message}`);return}f(`Upload failed ${r} out of ${fe} attempts: ${t.message}`)}})}var Qe=e=>({total:t,loaded:r})=>{};function Rr(e){return e/1e3/1e3}var ze=p(require("lodash"));async function Tr(e,t){switch(t.provider){case"githubActions":await Vn(e,t);break;case"gitlab":await Pr(e,t);break;case"circle":await yr(e,t);break;default:break}}async function Or(e,t,r){switch(t.provider){case"gitlab":await Pr(e,t,r);break;case"circle":await yr(e,t,r);break;default:break}}async function Pr(e,t,r=null){let o=t.params,n=r?.ci.params,m=(n?Y(n.runAttempt,0):0)+1,u=Y(o.ciNodeIndex,1),d=Y(o.ciNodeTotal,1),c=m>1?"--last-failed":"",l="";d>1&&(l=m>1?"--shard=1/1":`--shard=${u}/${d}`);let O=[c,l].filter(Boolean).join(" ");await j(e.presetOutput??X,`EXTRA_PW_FLAGS="${O}"
12
+ `]:["Unexpected network error"]}var Bt=s.extend("http");async function $(e,t,r=wt){try{let o=await r(e).request(t);return Bt("network response: %o",{...Mt.default.omit(o,"request","config"),url:o.config.url,method:o.config.method}),o}catch(o){let n=o;throw Bt("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}),Lt(n),n}}var pe=s.extend("api");async function kt(e){try{return pe("Request params: %o",e),$("api",{url:"cache/upload",method:"POST",data:e}).then(t=>t.data)}catch(t){throw pe("Failed to create cache:",t),t}}async function Gt(e){try{return pe("Request params: %o",e),$("api",{url:"cache/download",method:"POST",data:e}).then(t=>t.data)}catch(t){throw pe("Failed to retrieve cache:",t),t}}var jt=require("util"),Kt=require("zlib");var Ht=s.extend("api"),Rn=(0,jt.promisify)(Kt.gzip);async function $t(e){try{Ht("Run params: %o",e);let t=await In(JSON.stringify(e));return $("api",{url:"v1/runs",method:"POST",headers:{"Content-Type":"application/json","Content-Encoding":"gzip"},data:t}).then(r=>r.data)}catch(t){throw Ht("Failed to create the run:",t),t}}async function In(e){try{return await Rn(e)}catch(t){throw g("Failed to compress run payload:",t),t}}var Vt=s.extend("api");async function Jt(e,t){try{return Vt("Run params: %o",t),$("restApi",{url:"v1/runs/previous",params:t,method:"GET",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`}}).then(r=>r.data)}catch(r){throw Vt("Failed to obtain run data:",r),r}}async function Ge(){try{let e=ie();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 Jt(e.apiKey,t);await _n(e.pwLastRun&&r.data.pwLastRun?r.data.pwLastRun:r.data,e)}catch(e){throw s("Failed to get run data"),e}}async function _n(e,t){let r=JSON.stringify(e,null,2);t.output?(await ht(t.output),await(0,Yt.writeFile)(t.output,r,"utf-8")):G(r)}var Ar=require("axios");var y=require("@commander-js/extra-typings");var Tn={recordKey:{name:"Record Key",env:"CURRENTS_RECORD_KEY",cli:"--key"},debug:{name:"Debug",env:"CURRENTS_DEBUG",cli:"--debug"}},On={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"}},yn={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"}},L={...Tn,...On,...yn};function He(){return{recordKey:process.env[L.recordKey.env],debug:process.env[L.debug.env]}}var qt=s.extend("config"),Wt=["recordKey"],z;function Qt(e){z={type:"SET_COMMAND_CONFIG",values:H(L,Wt,He,e)},qt("Resolved config: %o",z)}function zt(e){z={type:"GET_COMMAND_CONFIG",values:H(L,Wt,He,e)},qt("Resolved config: %o",z)}function B(){return z}function Xt(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 Zt(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}}var er=require("@commander-js/extra-typings");function V(e,t=[]){return e?t.concat(e.split(",").map(r=>r.trim())):t}async function M(e,t){try{t.debug&&mt(),await e(t),process.exit(0)}catch(r){g(r.message);let o=r instanceof er.CommanderError?r.exitCode:1;process.exit(o)}}var je=new y.Option("-k, --key <record-key>","Your secret Record Key obtained from Currents").env(_(L,"recordKey")),Ke=new y.Option("--debug","Enable debug logging").env(_(L,"debug")).default(!1),$e=new y.Option("--id <id>","The ID the data is saved under in the cache"),tr=new y.Option("--path <path>","Comma-separated list of paths to cache").argParser(V),ue=(t=>(t.lastRun="last-run",t))(ue||{}),Ve=new y.Option("--preset <preset-name>",'A set of predefined options. Use "last-run" to get the last run data').choices(Object.values(ue)),rr=new y.Option("--output-dir <dir>","Path to the directory where output will be written"),or=new y.Option("--pw-output-dir <dir>","Directory for artifacts produced by Playwright tests").default("test-results"),X=".currents_env",nr=new y.Option("--preset-output <path>","Path to the file containing the preset output").default(X),Je=new y.Option("--matrix-index <number>","The index of the matrix to use").default(1).argParser(ir),Ye=new y.Option("--matrix-total <number>","The total number of matrices available").default(1).argParser(ir);function ir(e){let t=parseInt(e,10);if(isNaN(t)||t<=0||!Number.isInteger(t))throw new y.InvalidArgumentError("A positive integer is expected.");return t}var sr=new y.Option("--continue","Continue the script execution if the cache is not found").default(!1);var h=require("lodash");var de=s.extend("ci"),Pn=(e,...t)=>(0,h.chain)(t).compact().join(e).value(),bn=(e,t)=>(0,h.set)(e,(0,h.camelCase)(t),process.env[t]),C=e=>(0,h.transform)(e,bn,{}),An=()=>process.env.TF_BUILD&&process.env.TF_BUILD_BUILDNUMBER,xn=()=>process.env.TF_BUILD&&process.env.AZURE_HTTP_USER_AGENT,Un=()=>(0,h.some)(process.env,(e,t)=>/^CODEBUILD_/.test(t)),wn=()=>process.env.bamboo_buildNumber,Sn=()=>process.env.CI_NAME&&process.env.CI_NAME==="codeship"&&process.env.CODESHIP,Dn=()=>process.env.CI_NAME&&process.env.CI_NAME==="codeship"&&!process.env.CODESHIP,Nn=()=>(0,h.some)(process.env,(e,t)=>/^CONCOURSE_/.test(t)),vn=()=>process.env.GITLAB_CI||process.env.CI_SERVER_NAME&&/^GitLab/.test(process.env.CI_SERVER_NAME),Ln=()=>process.env.GCP_PROJECT||process.env.GCLOUD_PROJECT||process.env.GOOGLE_CLOUD_PROJECT,Bn=()=>process.env.JENKINS_URL||process.env.JENKINS_HOME||process.env.JENKINS_VERSION||process.env.HUDSON_URL||process.env.HUDSON_HOME,Mn=()=>process.env.WERCKER||process.env.WERCKER_MAIN_PIPELINE_STARTED,Fn={appveyor:"APPVEYOR",azure:xn,awsCodeBuild:Un,bamboo:wn,bitbucket:"BITBUCKET_BUILD_NUMBER",buildkite:"BUILDKITE",circle:"CIRCLECI",codeshipBasic:Sn,codeshipPro:Dn,concourse:Nn,codeFresh:"CF_BUILD_ID",drone:"DRONE",githubActions:"GITHUB_ACTIONS",gitlab:vn,goCD:"GO_JOB_NAME",googleCloud:Ln,jenkins:Bn,semaphore:"SEMAPHORE",shippable:"SHIPPABLE",teamcity:"TEAMCITY_VERSION",teamfoundation:An,travis:"TRAVIS",wercker:Mn,netlify:"NETLIFY",layerci:"LAYERCI"};function kn(){let{env:e}=process;return(0,h.findKey)(Fn,t=>{if((0,h.isString)(t))return e[t];if((0,h.isFunction)(t))return t()})}var ar=()=>({appveyor:C(["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:C(["BUILD_BUILDID","BUILD_BUILDNUMBER","BUILD_CONTAINERID","BUILD_REPOSITORY_URI","SYSTEM_TEAMPROJECT","SYSTEM_COLLECTIONURI"]),awsCodeBuild:C(["CODEBUILD_BUILD_ID","CODEBUILD_BUILD_NUMBER","CODEBUILD_RESOLVED_SOURCE_VERSION","CODEBUILD_SOURCE_REPO_URL","CODEBUILD_SOURCE_VERSION"]),bamboo:C(["bamboo_buildNumber","bamboo_buildResultsUrl","bamboo_planRepository_repositoryUrl","bamboo_buildKey"]),bitbucket:C(["BITBUCKET_REPO_SLUG","BITBUCKET_REPO_OWNER","BITBUCKET_BUILD_NUMBER","BITBUCKET_PARALLEL_STEP","BITBUCKET_STEP_RUN_NUMBER","BITBUCKET_PR_ID","BITBUCKET_PR_DESTINATION_BRANCH","BITBUCKET_PR_DESTINATION_COMMIT"]),buildkite:C(["BUILDKITE_REPO","BUILDKITE_SOURCE","BUILDKITE_JOB_ID","BUILDKITE_BUILD_ID","BUILDKITE_BUILD_URL","BUILDKITE_BUILD_NUMBER","BUILDKITE_PULL_REQUEST","BUILDKITE_PULL_REQUEST_REPO","BUILDKITE_PULL_REQUEST_BASE_BRANCH"]),circle:C(["CIRCLE_JOB","CIRCLE_BUILD_NUM","CIRCLE_BUILD_URL","CIRCLE_PR_NUMBER","CIRCLE_PR_REPONAME","CIRCLE_PR_USERNAME","CIRCLE_COMPARE_URL","CIRCLE_WORKFLOW_ID","CIRCLE_WORKFLOW_WORKSPACE_ID","CIRCLE_PULL_REQUEST","CIRCLE_REPOSITORY_URL","CI_PULL_REQUEST","CIRCLE_NODE_INDEX","CIRCLE_NODE_TOTAL"]),codeshipBasic:C(["CI_BUILD_ID","CI_REPO_NAME","CI_BUILD_URL","CI_PROJECT_ID","CI_BUILD_NUMBER","CI_PULL_REQUEST"]),codeshipPro:C(["CI_BUILD_ID","CI_REPO_NAME","CI_PROJECT_ID"]),concourse:C(["BUILD_ID","BUILD_NAME","BUILD_JOB_NAME","BUILD_PIPELINE_NAME","BUILD_TEAM_NAME","ATC_EXTERNAL_URL"]),codeFresh:C(["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:C(["DRONE_JOB_NUMBER","DRONE_BUILD_LINK","DRONE_BUILD_NUMBER","DRONE_PULL_REQUEST"]),githubActions:C(["GITHUB_WORKFLOW","GITHUB_ACTION","GITHUB_EVENT_NAME","GITHUB_RUN_ID","GITHUB_RUN_ATTEMPT","GITHUB_REPOSITORY"]),gitlab:C(["CI_PIPELINE_ID","CI_PIPELINE_URL","CI_BUILD_ID","CI_JOB_ID","CI_JOB_URL","CI_JOB_NAME","CI_NODE_INDEX","CI_NODE_TOTAL","GITLAB_HOST","CI_PROJECT_ID","CI_PROJECT_URL","CI_REPOSITORY_URL","CI_ENVIRONMENT_URL","CI_DEFAULT_BRANCH","RUN_ATTEMPT"]),goCD:C(["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:C(["BUILD_ID","PROJECT_ID","REPO_NAME","BRANCH_NAME","TAG_NAME","COMMIT_SHA","SHORT_SHA"]),jenkins:C(["BUILD_ID","BUILD_URL","BUILD_NUMBER","ghprbPullId"]),semaphore:C(["SEMAPHORE_BRANCH_ID","SEMAPHORE_BUILD_NUMBER","SEMAPHORE_CURRENT_JOB","SEMAPHORE_CURRENT_THREAD","SEMAPHORE_EXECUTABLE_UUID","SEMAPHORE_GIT_BRANCH","SEMAPHORE_GIT_DIR","SEMAPHORE_GIT_REF","SEMAPHORE_GIT_REF_TYPE","SEMAPHORE_GIT_REPO_SLUG","SEMAPHORE_GIT_SHA","SEMAPHORE_GIT_URL","SEMAPHORE_JOB_COUNT","SEMAPHORE_JOB_ID","SEMAPHORE_JOB_NAME","SEMAPHORE_JOB_UUID","SEMAPHORE_PIPELINE_ID","SEMAPHORE_PLATFORM","SEMAPHORE_PROJECT_DIR","SEMAPHORE_PROJECT_HASH_ID","SEMAPHORE_PROJECT_ID","SEMAPHORE_PROJECT_NAME","SEMAPHORE_PROJECT_UUID","SEMAPHORE_REPO_SLUG","SEMAPHORE_TRIGGER_SOURCE","SEMAPHORE_WORKFLOW_ID","PULL_REQUEST_NUMBER"]),shippable:C(["SHIPPABLE_BUILD_ID","SHIPPABLE_BUILD_NUMBER","SHIPPABLE_COMMIT_RANGE","SHIPPABLE_CONTAINER_NAME","SHIPPABLE_JOB_ID","SHIPPABLE_JOB_NUMBER","SHIPPABLE_REPO_SLUG","IS_FORK","IS_GIT_TAG","IS_PRERELEASE","IS_RELEASE","REPOSITORY_URL","REPO_FULL_NAME","REPO_NAME","BUILD_URL","BASE_BRANCH","HEAD_BRANCH","IS_PULL_REQUEST","PULL_REQUEST","PULL_REQUEST_BASE_BRANCH","PULL_REQUEST_REPO_FULL_NAME"]),teamcity:null,teamfoundation:C(["BUILD_BUILDID","BUILD_BUILDNUMBER","BUILD_CONTAINERID"]),travis:C(["TRAVIS_JOB_ID","TRAVIS_BUILD_ID","TRAVIS_BUILD_WEB_URL","TRAVIS_REPO_SLUG","TRAVIS_JOB_NUMBER","TRAVIS_EVENT_TYPE","TRAVIS_COMMIT_RANGE","TRAVIS_BUILD_NUMBER","TRAVIS_PULL_REQUEST","TRAVIS_PULL_REQUEST_BRANCH","TRAVIS_PULL_REQUEST_SHA"]),wercker:null,netlify:C(["BUILD_ID","CONTEXT","URL","DEPLOY_URL","DEPLOY_PRIME_URL","DEPLOY_ID"]),layerci:C(["LAYERCI_JOB_ID","LAYERCI_RUNNER_ID","RETRY_INDEX","LAYERCI_PULL_REQUEST","LAYERCI_REPO_NAME","LAYERCI_REPO_OWNER","LAYERCI_BRANCH","GIT_TAG"])}),Gn=()=>{let{env:e}=process;return{appveyor:{sha:e.APPVEYOR_REPO_COMMIT,branch:e.APPVEYOR_PULL_REQUEST_HEAD_REPO_BRANCH||e.APPVEYOR_REPO_BRANCH,message:Pn(`
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},codeshipBasic:{sha:e.CI_COMMIT_ID,branch:e.CI_BRANCH,message:e.CI_COMMIT_MESSAGE,authorName:e.CI_COMMITTER_NAME,authorEmail:e.CI_COMMITTER_EMAIL},codeshipPro:{sha:e.CI_COMMIT_ID,branch:e.CI_BRANCH,message:e.CI_COMMIT_MESSAGE,authorName:e.CI_COMMITTER_NAME,authorEmail:e.CI_COMMITTER_EMAIL},codeFresh:{sha:e.CF_REVISION,branch:e.CF_BRANCH,message:e.CF_COMMIT_MESSAGE,authorName:e.CF_COMMIT_AUTHOR},drone:{sha:e.DRONE_COMMIT_SHA,branch:e.DRONE_SOURCE_BRANCH,message:e.DRONE_COMMIT_MESSAGE,authorName:e.DRONE_COMMIT_AUTHOR,authorEmail:e.DRONE_COMMIT_AUTHOR_EMAIL,remoteOrigin:e.DRONE_GIT_HTTP_URL,defaultBranch:e.DRONE_REPO_BRANCH},githubActions:{sha:e.GITHUB_SHA,branch:e.GH_BRANCH||e.GITHUB_REF,defaultBranch:e.GITHUB_BASE_REF,remoteBranch:e.GITHUB_HEAD_REF,runAttempt:e.GITHUB_RUN_ATTEMPT},gitlab:{sha:e.CI_COMMIT_SHA,branch:e.CI_COMMIT_REF_NAME,message:e.CI_COMMIT_MESSAGE,authorName:e.GITLAB_USER_NAME,authorEmail:e.GITLAB_USER_EMAIL,remoteOrigin:e.CI_REPOSITORY_URL,defaultBranch:e.CI_DEFAULT_BRANCH},googleCloud:{sha:e.COMMIT_SHA,branch:e.BRANCH_NAME},jenkins:{sha:e.GIT_COMMIT,branch:e.GIT_BRANCH},semaphore:{sha:e.SEMAPHORE_GIT_SHA,branch:e.SEMAPHORE_GIT_BRANCH,remoteOrigin:e.SEMAPHORE_GIT_REPO_SLUG},shippable:{sha:e.COMMIT,branch:e.BRANCH,message:e.COMMIT_MESSAGE,authorName:e.COMMITTER},snap:null,teamcity:null,teamfoundation:{sha:e.BUILD_SOURCEVERSION,branch:e.BUILD_SOURCEBRANCHNAME,message:e.BUILD_SOURCEVERSIONMESSAGE,authorName:e.BUILD_SOURCEVERSIONAUTHOR},travis:{sha:e.TRAVIS_PULL_REQUEST_SHA||e.TRAVIS_COMMIT,branch:e.TRAVIS_PULL_REQUEST_BRANCH||e.TRAVIS_BRANCH,message:e.TRAVIS_COMMIT_MESSAGE},wercker:null,netlify:{sha:e.COMMIT_REF,branch:e.BRANCH,remoteOrigin:e.REPOSITORY_URL},layerci:{sha:e.GIT_COMMIT,branch:e.LAYERCI_BRANCH,message:e.GIT_COMMIT_TITLE}}},cr=e=>{let t=mr();return t?(0,h.chain)(e()).get(t).value():{}};function Hn(){return(0,h.chain)(ar()).omitBy(h.isNull).keys().value()}function jn(e){return e&&Hn().includes(e)}function mr(){let e=kn();return de("detected CI provider name: %s",e),e||null}function Kn(){return cr(ar)}function pr(){return cr(Gn)}function J(e){let t=Kn(),r=mr(),o=$n(e,r);return de("detected CI provider: %s",r),de("detected CI params: %O",t),de("detected CI build ID: %o",o),{params:t,provider:r,ciBuildId:o}}function $n(e,t){return e?{source:"user",value:e}:jn(t)?{source:"server",value:null}:{source:"random",value:`auto:${Le()}`}}var ur=u(require("archiver")),dr=u(require("fs-extra")),Y=u(require("path")),lr=u(require("unzipper"));var Vn=50*1024*1024;async function fr(e,t=Vn){return new Promise((r,o)=>{let n=(0,ur.default)("zip",{zlib:{level:9}}),a=[],m=0;n.on("data",c=>{a.push(c),m+=c.length,m>t&&o(new Error(`Zip size exceeded the limit of ${t} bytes`))}),n.on("warning",c=>{c.code==="ENOENT"?f(c):o(c)}),n.on("error",c=>o(c)),n.on("end",()=>{let c=Buffer.concat(a);r(c)});let d=async c=>{let l=process.cwd(),O=Y.default.normalize(c),A=Y.default.relative(l,O),P=await dr.default.stat(c);P.isDirectory()?n.directory(c,A):n.file(c,{name:A,stats:P})};(async c=>{for(let l of c)await d(l);await n.finalize()})(e).catch(o)})}async function gr(e,t){return lr.default.Open.buffer(e).then(r=>r.extract({path:t,concurrency:3}))}function Cr(e){let t=process.cwd();return e.filter(r=>{let o=Y.default.resolve(r),n=Y.default.relative(t,o);return r.startsWith("..")||Y.default.isAbsolute(n)?(f(`Invalid path: "${r}". Path traversal detected. The path was skipped.`),!1):!0})}var _r=u(require("async-retry")),Tr=require("axios");var Er=u(require("axios")),hr=require("https-proxy-agent"),Rr=u(require("proxy-from-env"));var Jn=s.extend("axios");function qe(e={}){let t=Er.default.create(e);return t.interceptors.request.use(r=>{let o={...r},n=t.getUri(r),a=Rr.default.getProxyForUrl(n);return a&&(Jn("Using HTTP proxy %s for %s ",a,n),o.proxy=!1,o.httpsAgent=Yn(a)),o}),t}var le=null;function Yn(e){return le||(le=new hr.HttpsProxyAgent(e),le)}var ge=s.extend("upload"),fe=5;async function We(e,t,r){return ge("Uploading buffer %s",e.name,{buffer:Buffer.byteLength(e.buffer)}),Wn(e.buffer,e.uploadUrl,t,r)}async function qn(e,t,r,o){return qe().request({method:"put",url:t,data:e,onUploadProgress:o,headers:{"Content-Disposition":"inline","Content-Type":r}})}async function Qe(e,t){try{let r=await qe().get(e,{responseType:"arraybuffer",onDownloadProgress:t});return Buffer.from(r.data)}catch(r){throw(0,Tr.isAxiosError)(r)&&ge("Failed to download %s: %s",e,r.message),r}}async function Wn(...e){await(0,_r.default)(async()=>{await qn(...e)},{retries:fe,onRetry:(t,r)=>{if(ge("Upload failed %d out of %d attempts: %s",r,fe,t.message),r===fe){g(`Cannot upload after ${r} times: ${t.message}`);return}f(`Upload failed ${r} out of ${fe} attempts: ${t.message}`)}})}var ze=e=>({total:t,loaded:r})=>{};function Ir(e){return e/1e3/1e3}var Xe=u(require("lodash"));async function Or(e,t){switch(t.provider){case"githubActions":await Qn(e,t);break;case"gitlab":await Pr(e,t);break;case"circle":await br(e,t);break;default:break}}async function yr(e,t,r){switch(t.provider){case"gitlab":await Pr(e,t,r);break;case"circle":await br(e,t,r);break;default:break}}async function Pr(e,t,r=null){let o=t.params,n=r?.ci.params,m=(n?q(n.runAttempt,0):0)+1,d=q(o.ciNodeIndex,1),p=q(o.ciNodeTotal,1),c=m>1?"--last-failed":"",l="";p>1&&(l=m>1?"--shard=1/1":`--shard=${d}/${p}`);let O=[c,l].filter(Boolean).join(" ");await K(e.presetOutput??X,`EXTRA_PW_FLAGS="${O}"
14
14
  EXTRA_PWCP_FLAGS="${c}"
15
15
  RUN_ATTEMPT="${m}"
16
- `)}async function Vn(e,t){let{matrixIndex:r,matrixTotal:o}=e,n=t.params,s=Y(n.githubRunAttempt,1),m=s>1?"--last-failed":"",u="";o>1&&(u=s>1?"--shard=1/1":`--shard=${r}/${o}`);let d=[m,u].filter(Boolean).join(" "),c=e.presetOutput??X;await j(c,d),a('Dumped PW config: "%s" for GHA to %s',d,c)}async function yr(e,t,r=null){let o=t.params,n=r?.ci.params,s=n?.circleWorkflowId,m=n?.circleWorkflowWorkspaceId,u=Y(o.circleNodeIndex,0),d=Y(o.circleNodeTotal,1),c=m==o.circleWorkflowWorkspaceId&&s!==o.circleWorkflowId,l=c?"--last-failed":"",O="";d>1&&(O=c?"--shard=1/1":`--shard=${u+1}/${d}`);let A=[l,O].filter(Boolean).join(" "),y=e.presetOutput??X;await j(y,A),a('Dumped PW config: "%s" for Circle to %s',A,y)}var Y=(e,t)=>{let r=ze.default.toNumber(e);return ze.default.isNaN(r)?t:r};async function Xe(){let e=B();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:m}=e.values,u=e.values.outputDir,d=V();o==="last-run"&&await Tr(e.values,d);let c=await Gt({recordKey:t,ci:d,id:r,config:{matrixIndex:n,matrixTotal:s}});try{await Jn({readUrl:c.readUrl,outputDir:u});let l=await Yn(c.metaReadUrl);o==="last-run"&&await Or(e.values,d,l),re("Cache restored. Cache ID: %s",c.cacheId)}catch(l){if((0,br.isAxiosError)(l)&&(l.response?.status===403||l.response?.status===404)){let O=`Cache with ID "${c.cacheId}" not found`;if(m){Se(O);return}throw new Error(O)}throw l}}async function Jn({readUrl:e,outputDir:t}){let r=await We(e);await fr(r,t||"."),a("Cache downloaded")}async function Yn(e){let t=await We(e),r=JSON.parse(t.toString("utf-8"));return a("Meta file: %O",r),r}var Ar=p(require("path"));var xr=require("lodash");function Ur({config:e,cacheId:t,orgId:r,path:o,ci:n}){let s={id:t,orgId:r,config:(0,xr.omit)(e,"recordKey"),path:o,ci:n,createdAt:new Date().toISOString()};return Buffer.from(JSON.stringify(s))}var wr=e=>Ar.default.resolve(e??"test-results",".last-run.json");async function Ze(){let e=B();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:m}=e.values,u=e.values.path?.length?gr(e.values.path):[],d=[];u&&u.length>0&&d.push(...u);let c=V();if(o==="last-run"){let O=wr(n);d.push(O)}if(d.length===0)throw new Error("No paths available to upload");let l=await kt({recordKey:t,ci:c,id:r,config:{matrixIndex:s,matrixTotal:m}});await qn({archive:await lr(d),cacheId:l.cacheId,uploadUrl:l.uploadUrl}),await Wn({meta:Ur({cacheId:l.cacheId,config:e.values,ci:c,orgId:l.orgId,path:d}),cacheId:l.cacheId,uploadUrl:l.metaUploadUrl}),re("Cache uploaded. Cache ID: %s",l.cacheId)}async function qn({archive:e,cacheId:t,uploadUrl:r}){try{let o="application/zip";await qe({buffer:e,contentType:o,name:t,uploadUrl:r},o,Qe(t)),a("Cache archive uploaded",{cacheId:t})}catch(o){throw a("Failed to upload cache archive",o),o}}async function Wn({meta:e,cacheId:t,uploadUrl:r}){try{let o=`${t}_meta`,n="application/json";await qe({buffer:e,contentType:n,name:o,uploadUrl:r},n,Qe(o)),a("Cache meta uploaded",{cacheId:t})}catch(o){throw a("Failed to upload cache meta",o),o}}var Dr=require("@currents/commit-info"),Nr=require("lodash");var Ce=require("lodash");var et=a.extend("ci-git");function Sr(e){et("git commit existing info: %O",e);let t=pr();et("commit info from provider environment variables: %O",t);let r=(0,Ce.transform)(e,(o,n,s)=>{let m=n||(t?t[s]:null);return o[s]=(0,Ce.defaultTo)(m,null)});return et("combined git and environment variables from provider: %O",r),r}var Qn=async()=>{let e=await(0,Dr.commitInfo)();return Sr({branch:e.branch,remoteOrigin:e.remote,authorEmail:e.email,authorName:e.author,message:e.message,sha:e.sha,ghaEventData:e.ghaEventData})},vr=(0,Nr.memoize)(Qn);var Lr=p(require("getos")),Br=require("lodash"),b=require("os"),Mr=require("util"),zn=async()=>{if((0,b.platform)()==="linux")try{let e=await(0,Mr.promisify)(Lr.default)();return"dist"in e&&"release"in e?[e.dist,e.release].join(" - "):(0,b.release)()}catch{return(0,b.release)()}return(0,b.release)()},Xn=async()=>{let e=await zn();return{osName:(0,b.platform)(),osVersion:e,osCpus:[],osMemory:{free:(0,b.freemem)(),total:(0,b.totalmem)()}}},kr=(0,Br.memoize)(Xn);var io=require("lodash"),Te=p(require("path")),ao=p(require("semver"));var R={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 Gr(){return{projectId:process.env[R.projectId.env],recordKey:process.env[R.recordKey.env],ciBuildId:process.env[R.ciBuildId.env],tag:process.env[R.tag.env]?process.env[R.tag.env]?.split(",").map(e=>e.trim()):void 0,disableTitleTags:!!process.env[R.disableTitleTags.env],removeTitleTags:!!process.env[R.removeTitleTags.env],debug:!!process.env[R.debug.env],machineId:process.env[R.machineId.env]}}var Zn=a.extend("config"),ei=["projectId","recordKey"],tt=null;function Fr(e){tt=F(R,ei,Gr,e),Zn("Resolved Currents config: %o",tt)}function Ee(){return tt}function Hr(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 Xr=p(require("fs-extra")),Zr=require("jest-cli"),eo=p(require("tmp"));var Qr=require("lodash");var jr=require("lodash"),ti=["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 Kr(e){return(0,jr.omit)(e,...ti)}function $r(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 Yr=p(require("fs")),qr=require("jest-config"),rt=require("lodash"),ot=p(require("path"));function he(e,t){return(...r)=>new Promise((o,n)=>{let s=0,m=()=>{s++;try{let u=e(...r);o(u)}catch(u){if(s>=t.length)n(u);else{let d=t[s-1];setTimeout(m,d)}}};m()})}var Vr=p(require("fs-extra")),ri=p(require("path"));async function Re(e){let t=await Vr.default.pathExists(e);if(!t)throw new Error("File does not exist");return t}var Jr=a.extend("jest-discovery");async function Wr(e){try{let{config:t,configPath:r}=await(0,qr.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,rt.omit)(t,o);if(s.projects&&(s.projects=s.projects.map(d=>typeof d!="string"?(0,rt.omit)(d,n):d)),s.rootDir&&Object.keys(s).length===1)return null;let m=ot.default.resolve(r?ot.default.dirname(r):process.cwd(),`.jest-scanner-${new Date().getTime()}.config.js`),u=`module.exports=${JSON.stringify(s,null,2)}`;return Jr("configFileContent: %O",u),Yr.default.writeFileSync(m,u),await he(Re,[200,200,200,200,200,1e3])(m),m}catch(t){return C("Failed to recreate the config file"),Jr("error %o",t),null}}async function zr(e){let t="!!##ThisPatternWillNotMatchAnyTestName##!!",r=e.options,o=Kr(r),n=$r(o),s=r.config,m=await Wr(s);return{cliArgs:[n,"--testNamePattern",t,"--reporters","@currents/cmd/discovery/jest","--shard=1/1",m?`--config=${m}`:"",...e.args].filter(d=>!(0,Qr.isEmpty)(d)),configFilePath:m}}var oi=a.extend("jest-discovery");async function to(e,t){console.time(h("@currents/jest:fullTestSuite-ready"));let{cliArgs:r,configFilePath:o}=await zr(t);try{let n=eo.default.fileSync({postfix:".json"});return oi("running scanner: %o",r),process.env.CURRENTS_DISCOVERY_PATH=n.name,await(0,Zr.run)(r.concat(["--openHandlesTimeout=0"])),await he(Re,Array.from({length:300},()=>100))(n.name),console.timeEnd(h("@currents/jest:fullTestSuite-ready")),await H(n.name)}catch(n){return C("Failed to obtain the jest full test suite:",n),[]}finally{o&&Xr.default.unlinkSync(o)}}var q=class{constructor(t){this.config=t}async getFullTestSuite(){return[]}};var Ie=class extends q{constructor(t){super(t)}async getFullTestSuite(){return to(this.config.frameworkConfig,this.config.cliArgs)}};function ro(e){switch(e.framework){case"jest":return new Ie(e);default:return new q(e)}}var W=p(require("fs-extra")),N=p(require("path"));async function oo(e){let t=await ni(e?.reportDir);if(!t)throw new Error("Failed to find the report dir");return{reportDir:t,configFilePath:e?.configFilePath??N.default.join(t,"config.json")}}async function ni(e){return e?(await _e(e),e):ii((0,N.join)(process.cwd(),".currents"))}async function ii(e){let t=await W.default.readdir(e),r=null;for(let o of t){let n=N.default.join(e,o),s=await W.default.stat(n);s.isDirectory()&&(!r||s.birthtime>r.birthtime)&&(r={name:o,birthtime:s.birthtime})}return r?(0,N.resolve)(e,r.name):null}async function _e(e){try{return await W.default.pathExists(e)}catch{return C("Error checking if path exists:",C),!1}}async function no(e){let t=N.default.join(e,"instances");return ai(t)}async function ai(e){let t=await W.default.readdir(e),r=[];for(let o of t){let n=N.default.join(e,o);(await W.default.stat(n)).isFile()&&r.push(n)}return r}async function nt(){let e=Ee();if(!e)throw new Error("Currents config is missing!");let t=await oo(e);pt(mi(t.reportDir)),a("Reporter options: %o",t),G("Report directory: %s",t.reportDir);let r=await H(t.configFilePath);a("Report config: %o",r);let o=await no(t.reportDir);a("Found %d instance results in the reportDir: %s",o.length,t.reportDir);let n=ci(t.reportDir),s=await _e(n),m=pi(t.reportDir),u=null;if(s){let x=await H(n);f("Marker file detected. The report was already uploaded: %o",{runUrl:x.response.runUrl,isoDate:x.isoDate}),await _e(m)&&(u=await H(m),a("Full test suite file detected: %s",m))}if(u)a("The discovery stage was skipped");else{if(u=await ro(r).getFullTestSuite(),di(u))throw new Error("Failed to discover the full test suite!");await j(m,JSON.stringify(u))}let d=u.length===1?u[0].name:null,c={currents:e},l={type:r.framework,version:r.frameworkVersion,clientVersion:ee},O=se.userFacingNanoid(),A=V(e.ciBuildId),y={};for await(let x of o){let w=await H(x);y[w.groupId]||(y[w.groupId]=[]),y[w.groupId].push(w)}for await(let x of Object.keys(y)){let w=y[x],Ae=x;d&&(a("Default group found: %s, overwriting the group in the results",d),Ae=d,w=w.map(k=>({...k,groupId:d})));try{let k=await si({ci:A,group:Ae,instances:w,fullTestSuite:u,config:c,machineId:O,framework:l});a("Api response: %o",k),G("[%s] Run created: %s",Ae,k.runUrl);let Ho={response:k,isoDate:new Date().toISOString()};await j(n,JSON.stringify(Ho)),a("Marker file %s: %s",s?"overwritten":"created",n)}catch(k){throw a("Failed to upload the results to the dashboard"),k}}}async function si({ci:e,group:t,instances:r,fullTestSuite:o,config:n,machineId:s,framework:m}){let u=await vr(),d=await kr(),c={browserName:"node",browserVersion:ao.default.coerce(process.version)?.version},{currents:l}=n,A={platform:{...c,...d},ci:e,commit:u,group:t,fullTestSuite:o,config:n,projectId:l.projectId,recordKey:l.recordKey,ciBuildId:e.ciBuildId.value??void 0,tags:l.tag??[],machineId:l.machineId??s,framework:m,instances:r};return a("Creating run: %o",(0,io.mapValues)(A,(y,x)=>x==="recordKey"?"******":y)),Kt(A)}function ci(e){return Te.default.join(e,"upload.marker.json")}function pi(e){return Te.default.join(e,"fullTestSuite.json")}function mi(e){return Te.default.join(e,`.debug-${new Date().toISOString()}.log`)}function di(e){return e.length===0||e.some(t=>t.tests.length===0)}var ui=a.extend("cli");async function so(e){await M(async t=>{gt(t);let r=ie();ui("Config: %o",r),await Ge()},e)}var v=require("@commander-js/extra-typings");var co=new v.Option("--api-key <api-key>","API key from Currents dashboard for authentication").env(_(D,"apiKey")),po=new v.Option("-o, --output <path>","Path to the file where output will be written").env(_(D,"output")),mo=new v.Option("--ci-build-id <id>","Unique identifier for the run"),uo=new v.Option("-p, --project-id <project>","Project ID from Currents associated with the run").env(_(D,"projectId")),lo=new v.Option("-t, --tag <tag>","Comma-separated list of tags for the run").argParser($),fo=new v.Option("--debug","Enable debug logging").env(_(D,"debug")).default(!1),go=new v.Option("-b, --branch <branch>","Branch name for the recorded run"),Co=new v.Option("--pw-last-run",'Generate output formatted for Playwright ".last-run.json"');var Oe="api",li=e=>`
16
+ `)}async function Qn(e,t){let{matrixIndex:r,matrixTotal:o}=e,n=t.params,a=q(n.githubRunAttempt,1),m=a>1?"--last-failed":"",d="";o>1&&(d=a>1?"--shard=1/1":`--shard=${r}/${o}`);let p=[m,d].filter(Boolean).join(" "),c=e.presetOutput??X;await K(c,p),s('Dumped PW config: "%s" for GHA to %s',p,c)}async function br(e,t,r=null){let o=t.params,n=r?.ci.params,a=n?.circleWorkflowId,m=n?.circleWorkflowWorkspaceId,d=q(o.circleNodeIndex,0),p=q(o.circleNodeTotal,1),c=m==o.circleWorkflowWorkspaceId&&a!==o.circleWorkflowId,l=c?"--last-failed":"",O="";p>1&&(O=c?"--shard=1/1":`--shard=${d+1}/${p}`);let A=[l,O].filter(Boolean).join(" "),P=e.presetOutput??X;await K(P,A),s('Dumped PW config: "%s" for Circle to %s',A,P)}var q=(e,t)=>{let r=Xe.default.toNumber(e);return Xe.default.isNaN(r)?t:r};async function Ze(){let e=B();if(e.type!=="GET_COMMAND_CONFIG"||!e.values)throw new Error("Config is missing!");let{recordKey:t,id:r,preset:o,matrixIndex:n,matrixTotal:a,continue:m}=e.values,d=e.values.outputDir,p=J();o==="last-run"&&await Or(e.values,p);let c=await Gt({recordKey:t,ci:p,id:r,config:{matrixIndex:n,matrixTotal:a}});try{await zn({readUrl:c.readUrl,outputDir:d});let l=await Xn(c.metaReadUrl);o==="last-run"&&await yr(e.values,p,l),re("Cache restored. Cache ID: %s",c.cacheId)}catch(l){if((0,Ar.isAxiosError)(l)&&(l.response?.status===403||l.response?.status===404)){let O=`Cache with ID "${c.cacheId}" not found`;if(m){De(O);return}throw new Error(O)}throw l}}async function zn({readUrl:e,outputDir:t}){let r=await Qe(e);await gr(r,t||"."),s("Cache downloaded")}async function Xn(e){let t=await Qe(e),r=JSON.parse(t.toString("utf-8"));return s("Meta file: %O",r),r}var xr=u(require("path"));var Ur=require("lodash");function wr({config:e,cacheId:t,orgId:r,path:o,ci:n}){let a={id:t,orgId:r,config:(0,Ur.omit)(e,"recordKey"),path:o,ci:n,createdAt:new Date().toISOString()};return Buffer.from(JSON.stringify(a))}var Sr=e=>xr.default.resolve(e??"test-results",".last-run.json");async function et(){let e=B();if(e.type!=="SET_COMMAND_CONFIG"||!e.values)throw new Error("Config is missing!");let{recordKey:t,id:r,preset:o,pwOutputDir:n,matrixIndex:a,matrixTotal:m}=e.values,d=e.values.path?.length?Cr(e.values.path):[],p=[];d&&d.length>0&&p.push(...d);let c=J();if(o==="last-run"){let O=Sr(n);p.push(O)}if(p.length===0)throw new Error("No paths available to upload");let l=await kt({recordKey:t,ci:c,id:r,config:{matrixIndex:a,matrixTotal:m}});await Zn({archive:await fr(p),cacheId:l.cacheId,uploadUrl:l.uploadUrl}),await ei({meta:wr({cacheId:l.cacheId,config:e.values,ci:c,orgId:l.orgId,path:p}),cacheId:l.cacheId,uploadUrl:l.metaUploadUrl}),re("Cache uploaded. Cache ID: %s",l.cacheId)}async function Zn({archive:e,cacheId:t,uploadUrl:r}){try{let o="application/zip";await We({buffer:e,contentType:o,name:t,uploadUrl:r},o,ze(t)),s("Cache archive uploaded",{cacheId:t})}catch(o){throw s("Failed to upload cache archive",o),o}}async function ei({meta:e,cacheId:t,uploadUrl:r}){try{let o=`${t}_meta`,n="application/json";await We({buffer:e,contentType:n,name:o,uploadUrl:r},n,ze(o)),s("Cache meta uploaded",{cacheId:t})}catch(o){throw s("Failed to upload cache meta",o),o}}var Nr=require("@currents/commit-info"),vr=require("lodash");var Ce=require("lodash");var tt=s.extend("ci-git");function Dr(e){tt("git commit existing info: %O",e);let t=pr();tt("commit info from provider environment variables: %O",t);let r=(0,Ce.transform)(e,(o,n,a)=>{let m=n||(t?t[a]:null);return o[a]=(0,Ce.defaultTo)(m,null)});return tt("combined git and environment variables from provider: %O",r),r}var ti=async()=>{let e=await(0,Nr.commitInfo)();return Dr({branch:e.branch,remoteOrigin:e.remote,authorEmail:e.email,authorName:e.author,message:e.message,sha:e.sha,ghaEventData:e.ghaEventData})},Lr=(0,vr.memoize)(ti);var Br=u(require("getos")),Mr=require("lodash"),b=require("os"),Fr=require("util"),ri=async()=>{if((0,b.platform)()==="linux")try{let e=await(0,Fr.promisify)(Br.default)();return"dist"in e&&"release"in e?[e.dist,e.release].join(" - "):(0,b.release)()}catch{return(0,b.release)()}return(0,b.release)()},oi=async()=>{let e=await ri();return{osName:(0,b.platform)(),osVersion:e,osCpus:[],osMemory:{free:(0,b.freemem)(),total:(0,b.totalmem)()}}},kr=(0,Mr.memoize)(oi);var po=require("lodash"),Oe=u(require("path")),uo=u(require("semver"));var R={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 Gr(){return{projectId:process.env[R.projectId.env],recordKey:process.env[R.recordKey.env],ciBuildId:process.env[R.ciBuildId.env],tag:process.env[R.tag.env]?process.env[R.tag.env]?.split(",").map(e=>e.trim()):void 0,disableTitleTags:!!process.env[R.disableTitleTags.env],removeTitleTags:!!process.env[R.removeTitleTags.env],debug:!!process.env[R.debug.env],machineId:process.env[R.machineId.env]}}var ni=s.extend("config"),ii=["projectId","recordKey"],rt=null;function Hr(e){rt=H(R,ii,Gr,e),ni("Resolved Currents config: %o",rt)}function Ee(){return rt}function jr(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 Zr=u(require("fs-extra")),eo=require("jest-cli"),to=u(require("tmp"));var zr=require("lodash");function Kr(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 $r=require("lodash"),si=["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 Vr(e){return(0,$r.omit)(e,...si)}var qr=u(require("fs")),Wr=require("jest-config"),ot=require("lodash"),nt=u(require("path"));function he(e,t){return(...r)=>new Promise((o,n)=>{let a=0,m=()=>{a++;try{let d=e(...r);o(d)}catch(d){if(a>=t.length)n(d);else{let p=t[a-1];setTimeout(m,p)}}};m()})}var Jr=u(require("fs-extra")),ai=u(require("path"));async function Re(e){let t=await Jr.default.pathExists(e);if(!t)throw new Error("File does not exist");return t}var Yr=s.extend("jest-discovery");async function Qr(e){try{let{config:t,configPath:r}=await(0,Wr.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,ot.omit)(t,o);if(a.projects&&(a.projects=a.projects.map(p=>typeof p!="string"?(0,ot.omit)(p,n):p)),a.rootDir&&Object.keys(a).length===1)return null;let m=nt.default.resolve(r?nt.default.dirname(r):process.cwd(),`.jest-scanner-${new Date().getTime()}.config.js`),d=`module.exports=${JSON.stringify(a,null,2)}`;return Yr("configFileContent: %O",d),qr.default.writeFileSync(m,d),await he(Re,[200,200,200,200,200,1e3])(m),m}catch(t){return g("Failed to recreate the config file"),Yr("error %o",t),null}}async function Xr(e){let t="!!##ThisPatternWillNotMatchAnyTestName##!!",r=e.options,o=Vr(r),n=Kr(o),a=r.config,m=await Qr(a);return{cliArgs:[n,"--testNamePattern",t,"--reporters","@currents/cmd/discovery/jest","--shard=1/1",m?`--config=${m}`:"",...e.args].filter(p=>!(0,zr.isEmpty)(p)),configFilePath:m}}var ci=s.extend("jest-discovery");async function ro(e,t){console.time(E("@currents/jest:fullTestSuite-ready"));let{cliArgs:r,configFilePath:o}=await Xr(t);try{let n=to.default.fileSync({postfix:".json"});return ci("running scanner: %o",r),process.env.CURRENTS_DISCOVERY_PATH=n.name,await(0,eo.run)(r.concat(["--openHandlesTimeout=0"])),await he(Re,Array.from({length:300},()=>100))(n.name),console.timeEnd(E("@currents/jest:fullTestSuite-ready")),await j(n.name)}catch(n){return g("Failed to obtain the jest full test suite:",n),[]}finally{o&&Zr.default.unlinkSync(o)}}var F=class{constructor(t){this.config=t}async getFullTestSuite(){return[]}};var Ie=class extends F{constructor(t){super(t)}async getFullTestSuite(){return ro(this.config.frameworkConfig,this.config.cliArgs)}};var oo=u(require("fs-extra"));var no=u(require("crypto")),io=require("xml2js"),mi=s.extend("junit-discovery");async function so(e,t){console.time(E("@currents/junit:fullTestSuite-ready"));try{mi("running scanner: %o",t);let r=t.options.jUnitFile;process.env.CURRENTS_DISCOVERY_PATH=r;let o=oo.default.readFileSync(r,"utf-8"),n=await(0,io.parseStringPromise)(o,{explicitArray:!1,mergeAttrs:!0});return pi(n)}catch(r){return g("Failed to obtain the junit full test suite:",r),[]}}function pi(e){let t=[],r=e.testsuites?.testsuite,o=Array.isArray(r)?r:[r],n={name:e.testsuites?.name??"No name",tags:[],tests:[]};return o.forEach(a=>{let m=a?.testcase;(Array.isArray(m)?m:[m]).forEach(p=>{let c={title:[p?.name??""],spec:a?.name??"No name",tags:[],testId:ui(p?.name??"No name",a?.name??"No name")};n.tests.push(c)})}),t.push(n),t}function ui(e,t){let r=`${e}${t}`;return no.default.createHash("sha256").update(r).digest("hex").substring(0,16)}var _e=class extends F{constructor(t){super(t)}async getFullTestSuite(){return so(this.config.frameworkConfig,this.config.cliArgs)}};function ao(e){switch(e.framework){case"jest":return new Ie(e);case"junit":return new _e(e);default:return new F(e)}}var W=u(require("fs-extra")),N=u(require("path"));async function co(e){let t=await di(e?.reportDir);if(!t)throw new Error("Failed to find the report dir");return{reportDir:t,configFilePath:e?.configFilePath??N.default.join(t,"config.json")}}async function di(e){return e?(await Te(e),e):li((0,N.join)(process.cwd(),".currents"))}async function li(e){let t=await W.default.readdir(e),r=null;for(let o of t){let n=N.default.join(e,o),a=await W.default.stat(n);a.isDirectory()&&(!r||a.birthtime>r.birthtime)&&(r={name:o,birthtime:a.birthtime})}return r?(0,N.resolve)(e,r.name):null}async function Te(e){try{return await W.default.pathExists(e)}catch{return g("Error checking if path exists:",g),!1}}async function mo(e){let t=N.default.join(e,"instances");return fi(t)}async function fi(e){let t=await W.default.readdir(e),r=[];for(let o of t){let n=N.default.join(e,o);(await W.default.stat(n)).isFile()&&r.push(n)}return r}async function it(){let e=Ee();if(!e)throw new Error("Currents config is missing!");let t=await co(e);pt(hi(t.reportDir)),s("Reporter options: %o",t),G("Report directory: %s",t.reportDir);let r=await j(t.configFilePath);s("Report config: %o",r);let o=await mo(t.reportDir);s("Found %d instance results in the reportDir: %s",o.length,t.reportDir);let n=Ci(t.reportDir),a=await Te(n),m=Ei(t.reportDir),d=null;if(a){let x=await j(n);f("Marker file detected. The report was already uploaded: %o",{runUrl:x.response.runUrl,isoDate:x.isoDate}),await Te(m)&&(d=await j(m),s("Full test suite file detected: %s",m))}if(d)s("The discovery stage was skipped");else{if(d=await ao(r).getFullTestSuite(),Ri(d))throw new Error("Failed to discover the full test suite!");await K(m,JSON.stringify(d))}let p=d.length===1?d[0].name:null,c={currents:e},l={type:r.framework,version:r.frameworkVersion,clientVersion:ee,frameworkConfig:{originFramework:r.frameworkConfig?.originFramework,originFrameworkVersion:r.frameworkConfig?.originFrameworkVersion}},O=ae.userFacingNanoid(),A=J(e.ciBuildId),P={};for await(let x of o){let w=await j(x);P[w.groupId]||(P[w.groupId]=[]),P[w.groupId].push(w)}for await(let x of Object.keys(P)){let w=P[x],xe=x;p&&(s("Default group found: %s, overwriting the group in the results",p),xe=p,w=w.map(k=>({...k,groupId:p})));try{let k=await gi({ci:A,group:xe,instances:w,fullTestSuite:d,config:c,machineId:O,framework:l});s("Api response: %o",k),G("[%s] Run created: %s",xe,k.runUrl);let Jo={response:k,isoDate:new Date().toISOString()};await K(n,JSON.stringify(Jo)),s("Marker file %s: %s",a?"overwritten":"created",n)}catch(k){throw s("Failed to upload the results to the dashboard"),k}}}async function gi({ci:e,group:t,instances:r,fullTestSuite:o,config:n,machineId:a,framework:m}){let d=await Lr(),p=await kr(),c={browserName:"node",browserVersion:uo.default.coerce(process.version)?.version},{currents:l}=n,A={platform:{...c,...p},ci:e,commit:d,group:t,fullTestSuite:o,config:n,projectId:l.projectId,recordKey:l.recordKey,ciBuildId:e.ciBuildId.value??void 0,tags:l.tag??[],machineId:l.machineId??a,framework:m,instances:r,previousCiBuildId:process.env.CURRENTS_PREVIOUS_CI_BUILD_ID};return s("Creating run: %o",(0,po.mapValues)(A,(P,x)=>x==="recordKey"?"******":P)),$t(A)}function Ci(e){return Oe.default.join(e,"upload.marker.json")}function Ei(e){return Oe.default.join(e,"fullTestSuite.json")}function hi(e){return Oe.default.join(e,`.debug-${new Date().toISOString()}.log`)}function Ri(e){return e.length===0||e.some(t=>t.tests.length===0)}var Ii=s.extend("cli");async function lo(e){await M(async t=>{Ct(t);let r=ie();Ii("Config: %o",r),await Ge()},e)}var v=require("@commander-js/extra-typings");var fo=new v.Option("--api-key <api-key>","API key from Currents dashboard for authentication").env(_(D,"apiKey")),go=new v.Option("-o, --output <path>","Path to the file where output will be written").env(_(D,"output")),Co=new v.Option("--ci-build-id <id>","Unique identifier for the run"),Eo=new v.Option("-p, --project-id <project>","Project ID from Currents associated with the run").env(_(D,"projectId")),ho=new v.Option("-t, --tag <tag>","Comma-separated list of tags for the run").argParser(V),Ro=new v.Option("--debug","Enable debug logging").env(_(D,"debug")).default(!1),Io=new v.Option("-b, --branch <branch>","Branch name for the recorded run"),_o=new v.Option("--pw-last-run",'Generate output formatted for Playwright ".last-run.json"');var ye="api",_i=e=>`
17
17
 
18
- ${Eo.default.bold("Examples")}
18
+ ${To.default.bold("Examples")}
19
19
 
20
20
  Obtain run data by --ci-build-id:
21
- ${h(`${e} ${Oe} get-run --api-key <api-key> --ci-build-id <ci-build-id>`)}
21
+ ${E(`${e} ${ye} get-run --api-key <api-key> --ci-build-id <ci-build-id>`)}
22
22
 
23
23
  Obtain most recent run data by filters:
24
- ${h(`${e} ${Oe} get-run --api-key <api-key> --project-id <project-id> --branch <branch> --tag tagA,tagB`)}
24
+ ${E(`${e} ${ye} get-run --api-key <api-key> --project-id <project-id> --branch <branch> --tag tagA,tagB`)}
25
25
 
26
26
  Obtain last run data that matches the Playwright "test-results/.last-run.json":
27
- ${h(`${e} ${Oe} get-run --api-key <api-key> --ci-build-id <ci-build-id> --pw-last-run --output <output-path>`)}
27
+ ${E(`${e} ${ye} get-run --api-key <api-key> --ci-build-id <ci-build-id> --pw-last-run --output <output-path>`)}
28
28
 
29
- `,ho=e=>new it.Command().command(Oe).showHelpAfterError("(add --help for additional information)").allowUnknownOption().addCommand(fi(e)),fi=e=>new it.Command().name("get-run").description(`Receive information from Currents API ${li(e)}`).allowUnknownOption().addOption(co).addOption(fo).addOption(mo).addOption(uo).addOption(go).addOption(lo).addOption(po).addOption(Co).action(so);var Pe=require("@commander-js/extra-typings");var _o=p(require("chalk"));var gi=a.extend("cli");async function Ro(e){await M(async t=>{Qt(zt(t));let r=B();gi("Config: %o",{...r.values,recordKey:r.values?.recordKey?"*****":void 0}),await Xe()},e)}var Ci=a.extend("cli");async function Io(e){await M(async t=>{Wt(Xt(t));let r=B();Ci("Config: %o",{...r.values,recordKey:r.values?.recordKey?"*****":void 0}),await Ze()},e)}var Q="cache",Ei=e=>`
29
+ `,Oo=e=>new st.Command().command(ye).showHelpAfterError("(add --help for additional information)").allowUnknownOption().addCommand(Ti(e)),Ti=e=>new st.Command().name("get-run").description(`Receive information from Currents API ${_i(e)}`).allowUnknownOption().addOption(fo).addOption(Ro).addOption(Co).addOption(Eo).addOption(Io).addOption(ho).addOption(go).addOption(_o).action(lo);var Pe=require("@commander-js/extra-typings");var bo=u(require("chalk"));var Oi=s.extend("cli");async function yo(e){await M(async t=>{zt(Xt(t));let r=B();Oi("Config: %o",{...r.values,recordKey:r.values?.recordKey?"*****":void 0}),await Ze()},e)}var yi=s.extend("cli");async function Po(e){await M(async t=>{Qt(Zt(t));let r=B();yi("Config: %o",{...r.values,recordKey:r.values?.recordKey?"*****":void 0}),await et()},e)}var Q="cache",Pi=e=>`
30
30
 
31
- ${_o.default.bold("Examples")}
31
+ ${bo.default.bold("Examples")}
32
32
 
33
33
  Save files to the cache under a specific ID:
34
- ${h(`${e} ${Q} set --key <record-key> --id <id> --path <path-1,path-2,...path-n>`)}
34
+ ${E(`${e} ${Q} set --key <record-key> --id <id> --path <path-1,path-2,...path-n>`)}
35
35
 
36
36
  Retrieve files from the cache saved under a specific ID:
37
- ${h(`${e} ${Q} get --key <record-key> --id <id>`)}
37
+ ${E(`${e} ${Q} get --key <record-key> --id <id>`)}
38
38
 
39
39
  Store the last run data in the cache:
40
- ${h(`${e} ${Q} set --key <record-key> --preset last-run`)}
40
+ ${E(`${e} ${Q} set --key <record-key> --preset last-run`)}
41
41
 
42
42
  Retrieve the last run data from the cache:
43
- ${h(`${e} ${Q} get --key <record-key> --preset last-run`)}
43
+ ${E(`${e} ${Q} get --key <record-key> --preset last-run`)}
44
44
 
45
45
  Retrieve the last run data from the cache and save it to a custom directory:
46
- ${h(`${e} ${Q} get --key <record-key> --preset last-run --output-dir <outputDir>`)}
46
+ ${E(`${e} ${Q} get --key <record-key> --preset last-run --output-dir <outputDir>`)}
47
47
 
48
- `,To=e=>new Pe.Command().command(Q).description(`Cache data to Currents ${Ei(e)}`).showHelpAfterError("(add --help for additional information)").allowUnknownOption().addCommand(hi()).addCommand(Ri()),hi=()=>new Pe.Command().name("set").allowUnknownOption().addOption(He).addOption(Ke).addOption($e).addOption(er).addOption(je).addOption(rr).addOption(Ve).addOption(Je).action(Io),Ri=()=>new Pe.Command().name("get").allowUnknownOption().addOption(He).addOption(Ke).addOption($e).addOption(tr).addOption(or).addOption(je).addOption(Ve).addOption(Je).addOption(ir).action(Ro);var Bo=require("@commander-js/extra-typings"),Mo=p(require("chalk"));var U=require("@commander-js/extra-typings");var Oo=new U.Option("--ci-build-id <id>","the unique identifier for the recorded build (run)").env(_(R,"ciBuildId")),Po=new U.Option("-k, --key <record-key>","your secret Record Key obtained from Currents").env(_(R,"recordKey")),yo=new U.Option("-p, --project-id <project>","the project ID for results reporting obtained from Currents").env(_(R,"projectId")),bo=new U.Option("-t, --tag <tag>","comma-separated tag(s) for recorded runs in Currents").argParser($),Ao=new U.Option("--remove-title-tags","remove tags from test names in Currents, e.g. `Test name @smoke` becomes `Test name` in the dashboard").default(!1),xo=new U.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),Uo=new U.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,"machineId")),wo=new U.Option("--report-dir <string>","explicit path to the report directory").env(_(R,"reportDir")),So=new U.Option("--debug","enable debug logs").env(_(R,"debug")).default(!1);var vo=p(require("fs"));var Do=require("tmp-promise"),No=async()=>{let{path:e}=await(0,Do.file)();return e};var at=a.extend("cli"),ye=class{constructor(t){this.configFilePath=null;this.cliOptions=t,at("CLI options: %o",this.cliOptions),this.parsedConfig=Hr(this.cliOptions),at("Parsed config from CLI options: %o",this.parsedConfig)}async getConfigFilePath(){if(this.configFilePath)return this.configFilePath;let t=await No();return vo.default.writeFileSync(t,JSON.stringify(this.parsedConfig)),at("CLI options temp file path: %s",t),this.configFilePath=t,t}};async function Lo(e){await M(async t=>{let r=new ye(t);Fr(r.parsedConfig);let o=Ee();G("Currents config: %o",{...o,recordKey:o?.recordKey?"*****":void 0}),await nt()},e)}var Z="upload",Ii=e=>`
48
+ `,Ao=e=>new Pe.Command().command(Q).description(`Cache data to Currents ${Pi(e)}`).showHelpAfterError("(add --help for additional information)").allowUnknownOption().addCommand(bi()).addCommand(Ai()),bi=()=>new Pe.Command().name("set").allowUnknownOption().addOption(je).addOption($e).addOption(Ve).addOption(tr).addOption(Ke).addOption(or).addOption(Je).addOption(Ye).action(Po),Ai=()=>new Pe.Command().name("get").allowUnknownOption().addOption(je).addOption($e).addOption(Ve).addOption(rr).addOption(nr).addOption(Ke).addOption(Je).addOption(Ye).addOption(sr).action(yo);var Ho=require("@commander-js/extra-typings"),jo=u(require("chalk"));var U=require("@commander-js/extra-typings");var xo=new U.Option("--ci-build-id <id>","the unique identifier for the recorded build (run)").env(_(R,"ciBuildId")),Uo=new U.Option("-k, --key <record-key>","your secret Record Key obtained from Currents").env(_(R,"recordKey")),wo=new U.Option("-p, --project-id <project>","the project ID for results reporting obtained from Currents").env(_(R,"projectId")),So=new U.Option("-t, --tag <tag>","comma-separated tag(s) for recorded runs in Currents").argParser(V),Do=new U.Option("--remove-title-tags","remove tags from test names in Currents, e.g. `Test name @smoke` becomes `Test name` in the dashboard").default(!1),No=new U.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),vo=new U.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,"machineId")),Lo=new U.Option("--report-dir <string>","explicit path to the report directory").env(_(R,"reportDir")),Bo=new U.Option("--debug","enable debug logs").env(_(R,"debug")).default(!1);var ko=u(require("fs"));var Mo=require("tmp-promise"),Fo=async()=>{let{path:e}=await(0,Mo.file)();return e};var at=s.extend("cli"),be=class{constructor(t){this.configFilePath=null;this.cliOptions=t,at("CLI options: %o",this.cliOptions),this.parsedConfig=jr(this.cliOptions),at("Parsed config from CLI options: %o",this.parsedConfig)}async getConfigFilePath(){if(this.configFilePath)return this.configFilePath;let t=await Fo();return ko.default.writeFileSync(t,JSON.stringify(this.parsedConfig)),at("CLI options temp file path: %s",t),this.configFilePath=t,t}};async function Go(e){await M(async t=>{let r=new be(t);Hr(r.parsedConfig);let o=Ee();G("Currents config: %o",{...o,recordKey:o?.recordKey?"*****":void 0}),await it()},e)}var Z="upload",xi=e=>`
49
49
 
50
- ${Mo.default.bold("Examples")}
50
+ ${jo.default.bold("Examples")}
51
51
 
52
52
  Upload test results to Currents:
53
- ${h(`${e} ${Z} --key <record-key> --project-id <id> --ci-build-id <build-id>`)}
53
+ ${E(`${e} ${Z} --key <record-key> --project-id <id> --ci-build-id <build-id>`)}
54
54
 
55
55
  Upload test results to Currents, add tags "tagA", "tagB" to the recorded run:
56
- ${h(`${e} ${Z} --key <record-key> --project-id <id> --ci-build-id <build-id> --tag tagA --tag tagB`)}
56
+ ${E(`${e} ${Z} --key <record-key> --project-id <id> --ci-build-id <build-id> --tag tagA --tag tagB`)}
57
57
 
58
58
  Provide a custom path to the reports directory:
59
- ${h(`${e} ${Z} --key <record-key> --project-id <id> --ci-build-id <build-id> --report-dir <report-dir>`)}
59
+ ${E(`${e} ${Z} --key <record-key> --project-id <id> --ci-build-id <build-id> --report-dir <report-dir>`)}
60
60
 
61
- `,ko=e=>new Bo.Command().name(Z).command(Z).showHelpAfterError("(add --help for additional information)").allowUnknownOption().description(`Upload test results generated by Currents reporters to https://currents.dev
62
- ${Ii(e)}`).addOption(Oo).addOption(Po).addOption(yo).addOption(bo).addOption(Ao).addOption(xo).addOption(Uo).addOption(So).addOption(wo).action(r=>Lo(r));var _i=`
61
+ `,Ko=e=>new Ho.Command().name(Z).command(Z).showHelpAfterError("(add --help for additional information)").allowUnknownOption().description(`Upload test results generated by Currents reporters to https://currents.dev
62
+ ${xi(e)}`).addOption(xo).addOption(Uo).addOption(wo).addOption(So).addOption(Do).addOption(No).addOption(vo).addOption(Bo).addOption(Lo).action(r=>Go(r));var Ui=`
63
63
  ----------------------------------------------------
64
64
  \u{1F4D6} Documentation: https://docs.currents.dev
65
65
  \u{1F919} Support: support@currents.dev
66
66
  ----------------------------------------------------
67
- `,be="currents",Fo=()=>new Go.Command(be).version(ee).description(`Currents CLI ${_i}`).addCommand(ko(be),{isDefault:!0}).addCommand(To(be)).addCommand(ho(be));import("dotenv/config");function Ti(){Fo().parse()}Ti();
67
+ `,Ae="currents",Vo=()=>new $o.Command(Ae).version(ee).description(`Currents CLI ${Ui}`).addCommand(Ko(Ae),{isDefault:!0}).addCommand(Ao(Ae)).addCommand(Oo(Ae));import("dotenv/config");function wi(){Vo().parse()}wi();
68
68
  /*! For license information please see index.js.LEGAL.txt */
69
69
  //# sourceMappingURL=index.js.map
package/dist/index.js CHANGED
@@ -1,12 +1,12 @@
1
- "use strict";var Ct=Object.create;var D=Object.defineProperty;var Tt=Object.getOwnPropertyDescriptor;var ht=Object.getOwnPropertyNames;var Ot=Object.getPrototypeOf,Pt=Object.prototype.hasOwnProperty;var ie=(e,t)=>{for(var r in t)D(e,r,{get:t[r],enumerable:!0})},ae=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of ht(t))!Pt.call(e,o)&&o!==r&&D(e,o,{get:()=>t[o],enumerable:!(n=Tt(t,o))||n.enumerable});return e};var u=(e,t,r)=>(r=e!=null?Ct(Ot(e)):{},ae(t||!e||!e.__esModule?D(r,"default",{value:e,enumerable:!0}):r,e)),Ut=e=>ae(D({},"__esModule",{value:!0}),e);var Or={};ie(Or,{handleCurrentsReport:()=>It});module.exports=Ut(Or);var ce=require("debug"),At=u(require("fs-extra")),i=(0,ce.debug)("currents"),St=null;function ue(e){St=e}var B={};ie(B,{getNanoid:()=>Lt,userFacingNanoid:()=>$});var Y=require("nanoid"),me="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",Lt=(e=16)=>(0,Y.customAlphabet)(me,e)(),$=(0,Y.customAlphabet)(me,12);var m=require("lodash");var y=i.extend("ci"),Nt=(e,...t)=>(0,m.chain)(t).compact().join(e).value(),Dt=(e,t)=>(0,m.set)(e,(0,m.camelCase)(t),process.env[t]),c=e=>(0,m.transform)(e,Dt,{}),Bt=()=>process.env.TF_BUILD&&process.env.TF_BUILD_BUILDNUMBER,yt=()=>process.env.TF_BUILD&&process.env.AZURE_HTTP_USER_AGENT,bt=()=>(0,m.some)(process.env,(e,t)=>/^CODEBUILD_/.test(t)),Mt=()=>process.env.bamboo_buildNumber,vt=()=>process.env.CI_NAME&&process.env.CI_NAME==="codeship"&&process.env.CODESHIP,xt=()=>process.env.CI_NAME&&process.env.CI_NAME==="codeship"&&!process.env.CODESHIP,wt=()=>(0,m.some)(process.env,(e,t)=>/^CONCOURSE_/.test(t)),Ft=()=>process.env.GITLAB_CI||process.env.CI_SERVER_NAME&&/^GitLab/.test(process.env.CI_SERVER_NAME),Ht=()=>process.env.GCP_PROJECT||process.env.GCLOUD_PROJECT||process.env.GOOGLE_CLOUD_PROJECT,Gt=()=>process.env.JENKINS_URL||process.env.JENKINS_HOME||process.env.JENKINS_VERSION||process.env.HUDSON_URL||process.env.HUDSON_HOME,kt=()=>process.env.WERCKER||process.env.WERCKER_MAIN_PIPELINE_STARTED,jt={appveyor:"APPVEYOR",azure:yt,awsCodeBuild:bt,bamboo:Mt,bitbucket:"BITBUCKET_BUILD_NUMBER",buildkite:"BUILDKITE",circle:"CIRCLECI",codeshipBasic:vt,codeshipPro:xt,concourse:wt,codeFresh:"CF_BUILD_ID",drone:"DRONE",githubActions:"GITHUB_ACTIONS",gitlab:Ft,goCD:"GO_JOB_NAME",googleCloud:Ht,jenkins:Gt,semaphore:"SEMAPHORE",shippable:"SHIPPABLE",teamcity:"TEAMCITY_VERSION",teamfoundation:Bt,travis:"TRAVIS",wercker:kt,netlify:"NETLIFY",layerci:"LAYERCI"};function Vt(){let{env:e}=process;return(0,m.findKey)(jt,t=>{if((0,m.isString)(t))return e[t];if((0,m.isFunction)(t))return t()})}var pe=()=>({appveyor:c(["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:c(["BUILD_BUILDID","BUILD_BUILDNUMBER","BUILD_CONTAINERID","BUILD_REPOSITORY_URI","SYSTEM_TEAMPROJECT","SYSTEM_COLLECTIONURI"]),awsCodeBuild:c(["CODEBUILD_BUILD_ID","CODEBUILD_BUILD_NUMBER","CODEBUILD_RESOLVED_SOURCE_VERSION","CODEBUILD_SOURCE_REPO_URL","CODEBUILD_SOURCE_VERSION"]),bamboo:c(["bamboo_buildNumber","bamboo_buildResultsUrl","bamboo_planRepository_repositoryUrl","bamboo_buildKey"]),bitbucket:c(["BITBUCKET_REPO_SLUG","BITBUCKET_REPO_OWNER","BITBUCKET_BUILD_NUMBER","BITBUCKET_PARALLEL_STEP","BITBUCKET_STEP_RUN_NUMBER","BITBUCKET_PR_ID","BITBUCKET_PR_DESTINATION_BRANCH","BITBUCKET_PR_DESTINATION_COMMIT"]),buildkite:c(["BUILDKITE_REPO","BUILDKITE_SOURCE","BUILDKITE_JOB_ID","BUILDKITE_BUILD_ID","BUILDKITE_BUILD_URL","BUILDKITE_BUILD_NUMBER","BUILDKITE_PULL_REQUEST","BUILDKITE_PULL_REQUEST_REPO","BUILDKITE_PULL_REQUEST_BASE_BRANCH"]),circle:c(["CIRCLE_JOB","CIRCLE_BUILD_NUM","CIRCLE_BUILD_URL","CIRCLE_PR_NUMBER","CIRCLE_PR_REPONAME","CIRCLE_PR_USERNAME","CIRCLE_COMPARE_URL","CIRCLE_WORKFLOW_ID","CIRCLE_WORKFLOW_WORKSPACE_ID","CIRCLE_PULL_REQUEST","CIRCLE_REPOSITORY_URL","CI_PULL_REQUEST","CIRCLE_NODE_INDEX","CIRCLE_NODE_TOTAL"]),codeshipBasic:c(["CI_BUILD_ID","CI_REPO_NAME","CI_BUILD_URL","CI_PROJECT_ID","CI_BUILD_NUMBER","CI_PULL_REQUEST"]),codeshipPro:c(["CI_BUILD_ID","CI_REPO_NAME","CI_PROJECT_ID"]),concourse:c(["BUILD_ID","BUILD_NAME","BUILD_JOB_NAME","BUILD_PIPELINE_NAME","BUILD_TEAM_NAME","ATC_EXTERNAL_URL"]),codeFresh:c(["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:c(["DRONE_JOB_NUMBER","DRONE_BUILD_LINK","DRONE_BUILD_NUMBER","DRONE_PULL_REQUEST"]),githubActions:c(["GITHUB_WORKFLOW","GITHUB_ACTION","GITHUB_EVENT_NAME","GITHUB_RUN_ID","GITHUB_RUN_ATTEMPT","GITHUB_REPOSITORY"]),gitlab:c(["CI_PIPELINE_ID","CI_PIPELINE_URL","CI_BUILD_ID","CI_JOB_ID","CI_JOB_URL","CI_JOB_NAME","CI_NODE_INDEX","CI_NODE_TOTAL","GITLAB_HOST","CI_PROJECT_ID","CI_PROJECT_URL","CI_REPOSITORY_URL","CI_ENVIRONMENT_URL","CI_DEFAULT_BRANCH","RUN_ATTEMPT"]),goCD:c(["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:c(["BUILD_ID","PROJECT_ID","REPO_NAME","BRANCH_NAME","TAG_NAME","COMMIT_SHA","SHORT_SHA"]),jenkins:c(["BUILD_ID","BUILD_URL","BUILD_NUMBER","ghprbPullId"]),semaphore:c(["SEMAPHORE_BRANCH_ID","SEMAPHORE_BUILD_NUMBER","SEMAPHORE_CURRENT_JOB","SEMAPHORE_CURRENT_THREAD","SEMAPHORE_EXECUTABLE_UUID","SEMAPHORE_GIT_BRANCH","SEMAPHORE_GIT_DIR","SEMAPHORE_GIT_REF","SEMAPHORE_GIT_REF_TYPE","SEMAPHORE_GIT_REPO_SLUG","SEMAPHORE_GIT_SHA","SEMAPHORE_GIT_URL","SEMAPHORE_JOB_COUNT","SEMAPHORE_JOB_ID","SEMAPHORE_JOB_NAME","SEMAPHORE_JOB_UUID","SEMAPHORE_PIPELINE_ID","SEMAPHORE_PLATFORM","SEMAPHORE_PROJECT_DIR","SEMAPHORE_PROJECT_HASH_ID","SEMAPHORE_PROJECT_ID","SEMAPHORE_PROJECT_NAME","SEMAPHORE_PROJECT_UUID","SEMAPHORE_REPO_SLUG","SEMAPHORE_TRIGGER_SOURCE","SEMAPHORE_WORKFLOW_ID","PULL_REQUEST_NUMBER"]),shippable:c(["SHIPPABLE_BUILD_ID","SHIPPABLE_BUILD_NUMBER","SHIPPABLE_COMMIT_RANGE","SHIPPABLE_CONTAINER_NAME","SHIPPABLE_JOB_ID","SHIPPABLE_JOB_NUMBER","SHIPPABLE_REPO_SLUG","IS_FORK","IS_GIT_TAG","IS_PRERELEASE","IS_RELEASE","REPOSITORY_URL","REPO_FULL_NAME","REPO_NAME","BUILD_URL","BASE_BRANCH","HEAD_BRANCH","IS_PULL_REQUEST","PULL_REQUEST","PULL_REQUEST_BASE_BRANCH","PULL_REQUEST_REPO_FULL_NAME"]),teamcity:null,teamfoundation:c(["BUILD_BUILDID","BUILD_BUILDNUMBER","BUILD_CONTAINERID"]),travis:c(["TRAVIS_JOB_ID","TRAVIS_BUILD_ID","TRAVIS_BUILD_WEB_URL","TRAVIS_REPO_SLUG","TRAVIS_JOB_NUMBER","TRAVIS_EVENT_TYPE","TRAVIS_COMMIT_RANGE","TRAVIS_BUILD_NUMBER","TRAVIS_PULL_REQUEST","TRAVIS_PULL_REQUEST_BRANCH","TRAVIS_PULL_REQUEST_SHA"]),wercker:null,netlify:c(["BUILD_ID","CONTEXT","URL","DEPLOY_URL","DEPLOY_PRIME_URL","DEPLOY_ID"]),layerci:c(["LAYERCI_JOB_ID","LAYERCI_RUNNER_ID","RETRY_INDEX","LAYERCI_PULL_REQUEST","LAYERCI_REPO_NAME","LAYERCI_REPO_OWNER","LAYERCI_BRANCH","GIT_TAG"])}),Kt=()=>{let{env:e}=process;return{appveyor:{sha:e.APPVEYOR_REPO_COMMIT,branch:e.APPVEYOR_PULL_REQUEST_HEAD_REPO_BRANCH||e.APPVEYOR_REPO_BRANCH,message:Nt(`
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},codeshipBasic:{sha:e.CI_COMMIT_ID,branch:e.CI_BRANCH,message:e.CI_COMMIT_MESSAGE,authorName:e.CI_COMMITTER_NAME,authorEmail:e.CI_COMMITTER_EMAIL},codeshipPro:{sha:e.CI_COMMIT_ID,branch:e.CI_BRANCH,message:e.CI_COMMIT_MESSAGE,authorName:e.CI_COMMITTER_NAME,authorEmail:e.CI_COMMITTER_EMAIL},codeFresh:{sha:e.CF_REVISION,branch:e.CF_BRANCH,message:e.CF_COMMIT_MESSAGE,authorName:e.CF_COMMIT_AUTHOR},drone:{sha:e.DRONE_COMMIT_SHA,branch:e.DRONE_SOURCE_BRANCH,message:e.DRONE_COMMIT_MESSAGE,authorName:e.DRONE_COMMIT_AUTHOR,authorEmail:e.DRONE_COMMIT_AUTHOR_EMAIL,remoteOrigin:e.DRONE_GIT_HTTP_URL,defaultBranch:e.DRONE_REPO_BRANCH},githubActions:{sha:e.GITHUB_SHA,branch:e.GH_BRANCH||e.GITHUB_REF,defaultBranch:e.GITHUB_BASE_REF,remoteBranch:e.GITHUB_HEAD_REF,runAttempt:e.GITHUB_RUN_ATTEMPT},gitlab:{sha:e.CI_COMMIT_SHA,branch:e.CI_COMMIT_REF_NAME,message:e.CI_COMMIT_MESSAGE,authorName:e.GITLAB_USER_NAME,authorEmail:e.GITLAB_USER_EMAIL,remoteOrigin:e.CI_REPOSITORY_URL,defaultBranch:e.CI_DEFAULT_BRANCH},googleCloud:{sha:e.COMMIT_SHA,branch:e.BRANCH_NAME},jenkins:{sha:e.GIT_COMMIT,branch:e.GIT_BRANCH},semaphore:{sha:e.SEMAPHORE_GIT_SHA,branch:e.SEMAPHORE_GIT_BRANCH,remoteOrigin:e.SEMAPHORE_GIT_REPO_SLUG},shippable:{sha:e.COMMIT,branch:e.BRANCH,message:e.COMMIT_MESSAGE,authorName:e.COMMITTER},snap:null,teamcity:null,teamfoundation:{sha:e.BUILD_SOURCEVERSION,branch:e.BUILD_SOURCEBRANCHNAME,message:e.BUILD_SOURCEVERSIONMESSAGE,authorName:e.BUILD_SOURCEVERSIONAUTHOR},travis:{sha:e.TRAVIS_PULL_REQUEST_SHA||e.TRAVIS_COMMIT,branch:e.TRAVIS_PULL_REQUEST_BRANCH||e.TRAVIS_BRANCH,message:e.TRAVIS_COMMIT_MESSAGE},wercker:null,netlify:{sha:e.COMMIT_REF,branch:e.BRANCH,remoteOrigin:e.REPOSITORY_URL},layerci:{sha:e.GIT_COMMIT,branch:e.LAYERCI_BRANCH,message:e.GIT_COMMIT_TITLE}}},le=e=>{let t=Ee();return t?(0,m.chain)(e()).get(t).value():{}};function Jt(){return(0,m.chain)(pe()).omitBy(m.isNull).keys().value()}function Yt(e){return e&&Jt().includes(e)}function Ee(){let e=Vt();return y("detected CI provider name: %s",e),e||null}function $t(){return le(pe)}function de(){return le(Kt)}function ge(e){let t=$t(),r=Ee(),n=qt(e,r);return y("detected CI provider: %s",r),y("detected CI params: %O",t),y("detected CI build ID: %o",n),{params:t,provider:r,ciBuildId:n}}function qt(e,t){return e?{source:"user",value:e}:Yt(t)?{source:"server",value:null}:{source:"random",value:`auto:${$()}`}}var Re=require("@currents/commit-info"),Ie=require("lodash");var b=require("lodash");var q=i.extend("ci-git");function _e(e){q("git commit existing info: %O",e);let t=de();q("commit info from provider environment variables: %O",t);let r=(0,b.transform)(e,(n,o,a)=>{let p=o||(t?t[a]:null);return n[a]=(0,b.defaultTo)(p,null)});return q("combined git and environment variables from provider: %O",r),r}var Qt=async()=>{let e=await(0,Re.commitInfo)();return _e({branch:e.branch,remoteOrigin:e.remote,authorEmail:e.email,authorName:e.author,message:e.message,sha:e.sha,ghaEventData:e.ghaEventData})},fe=(0,Ie.memoize)(Qt);var Ce=u(require("getos")),Te=require("lodash"),I=require("os"),he=require("util"),Wt=async()=>{if((0,I.platform)()==="linux")try{let e=await(0,he.promisify)(Ce.default)();return"dist"in e&&"release"in e?[e.dist,e.release].join(" - "):(0,I.release)()}catch{return(0,I.release)()}return(0,I.release)()},zt=async()=>{let e=await Wt();return{osName:(0,I.platform)(),osVersion:e,osCpus:[],osMemory:{free:(0,I.freemem)(),total:(0,I.totalmem)()}}},Oe=(0,Te.memoize)(zt);var Pe={name:"@currents/cmd",version:"1.2.0-beta.0",main:"./dist/index.js",author:"Currents Software Inc",license:"GPL-3.0-or-later",description:"Currents CLI tools",scripts:{test:"vitest",rm:"rimraf dist",lint:'TIMING=1 eslint "**/*.ts*"',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":"^7.0.2","@types/archiver":"^6.0.2","@types/async-retry":"^1.4.8","@types/debug":"^4.1.12","@types/fs-extra":"^11.0.4","@types/getos":"^3.0.4","@types/lodash":"^4.17.5","@types/node":"^20.14.2","@types/proxy-from-env":"^1.0.4","@types/semver":"^7.5.8","@types/tmp":"^0.2.6","@types/unzipper":"^0.10.10","@types/uuid":"^9.0.8",jest:"^29.7.0",rimraf:"^5.0.7",tsup:"^8.1.0",typescript:"^5.4.5",vitest:"^1.3.0"},dependencies:{"@commander-js/extra-typings":"^11.1.0","@currents/commit-info":"1.0.1-beta.0",archiver:"^7.0.1","async-retry":"^1.3.3",axios:"^1.7.2","axios-retry":"^4.4.0",commander:"^11.1.0",debug:"^4.3.5",dotenv:"^16.0.3",execa:"^8.0.1","fs-extra":"^11.2.0",getos:"^3.2.1","jest-cli":"^29.7.0","jest-config":"^29.7.0","https-proxy-agent":"^7.0.4",lodash:"^4.17.21",nanoid:"^3.3.4","pretty-ms":"^7.0.1","proxy-from-env":"^1.1.0",semver:"^7.6.0","source-map-support":"^0.5.21",tmp:"^0.2.3","tmp-promise":"^3.0.3","ts-pattern":"^5.2.0",unzipper:"^0.12.3"},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 Ue=Pe.version;var Zt=[];function Q(e){Zt.push(e)}var R=u(require("chalk")),A=u(require("util"));var Ae=[],Se=[];var Le=(...e)=>{let t=A.default.format(...e);Q(t),console.log(t)},er=(...e)=>{let t=A.default.format(...e);Q(t),console.error(t)},W=Le,E=(...e)=>{let t=A.default.format(...e);return Se.push(t),i("WARNING: ",t),Le(R.default.bgYellow.black(" WARNING "),t)};var d=(...e)=>{let t=A.default.format(...tr(e));return Ae.push(t),i("ERROR: ",A.default.format(...e)),er(R.default.bgRed.white(" ERROR "),t)};var tr=e=>e.map(t=>t instanceof Error?t.message:t),M=(e=2)=>console.log(Array(e).fill("").join(`
3
- `)),oo=R.default.cyan,no=R.default.blueBright,so=R.default.red,io=R.default.yellow,ao=R.default.green,co=R.default.gray,uo=R.default.white,mo=R.default.black,po=R.default.magenta,v=R.default.dim,lo=R.default.bold;var z=u(require("fs-extra")),or=require("path");async function P(e){try{return await z.default.readJson(e)}catch(t){throw d("Error while reading JSON file: %s",e,t),d}}async function X(e,t){try{return await z.default.writeFile(e,t,"utf8"),e}catch(r){throw d(`Error writing file at ${e}:`,r),r}}var _t=require("lodash"),V=u(require("path")),Rt=u(require("semver"));var Ye=u(require("lodash"));var xe=u(require("axios")),we=u(require("axios-retry")),Fe=u(require("lodash"));var Z=()=>process.env.CURRENTS_API_URL??"https://cy.currents.dev",Ne=()=>process.env.CURRENTS_REST_API_URL??"https://api.currents.dev",De=()=>3e4;var ee=require("axios"),te=u(require("pretty-ms"));var Be=i.extend("http"),x=e=>[3*1e3,15*1e3,30*1e3][e-1],ye=e=>(Be("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),w=()=>3;function be(e,t,r){Be("Network request '%s' failed: '%s'. Next attempt is in %s (%d/%d).",`${r.method?.toUpperCase()} ${r.url}`,t.message,(0,te.default)(x(e)),e,w()),E("Network request '%s' failed: '%s'. Next attempt is in %s (%d/%d).",`${r.method?.toUpperCase()} ${r.url}`,t.message,(0,te.default)(x(e)),e,w())}var Me=i.extend("http");var re={api:null,restApi:null};function nr(e){let t=xe.default.create({baseURL:e==="api"?Z():Ne(),timeout:De(),transitional:{clarifyTimeoutError:!0}});return t.interceptors.request.use(r=>{let n=r["axios-retry"]?.retryCount??0;r.headers.get("Content-Type")||r.headers.set("Content-Type","application/json");let o={...Fe.default.pick(r,"method","url","headers"),data:Buffer.isBuffer(r.data)?"buffer":r.data};return n?Me("network request retry: %o",ve({...o,isRetry:!0})):Me("network request: %o",ve(o)),r}),(0,we.default)(t,{retries:w(),retryCondition:ye,retryDelay:x,shouldResetTimeout:!0,onRetry:be}),t}function He(e){return re[e]===null&&(re[e]=nr(e)),re[e]}function ve(e){return{method:e.method,baseUrl:Z(),url:e.url,data:e.isRetry?"<retry>":sr(e.data),headers:{...e.headers,"x-currents-key":"***"}}}function sr(e){return e?.results?.raw?{...e,results:{...e.results,raw:"***"}}:e}var je=require("axios"),Ve=u(require("lodash")),g=require("ts-pattern");function Ke(e){(0,g.match)(e).when(je.isAxiosError,ir).otherwise(()=>{E("Unexpected error while sending network request: %s",e)})}function ir(e){return(0,g.match)(e).with({code:"ECONNABORTED"},()=>{E("Network connection aborted")}).with({code:"ECONNREFUSED"},()=>{E("Network connection aborted")}).with({code:"ECONNRESET"},()=>{E("Network connection reset")}).with({code:"ETIMEDOUT"},()=>{E("Network connection timeout")}).with({response:g.P.not(g.P.nullish)},t=>{ar(t,{status:t.response.status,data:t.response.data})}).otherwise(t=>{E(`[currents] Unexpected network error: %s
4
- %O`,e.message,{method:e.response?.config.method,url:e.response?.config.url,status:e.response?.status,payload:e.response?.config.data})})}function ar(e,{status:t,data:r}){(0,g.match)(t).with(401,()=>{E(`[currents] ${e.response?.config.method} ${e.response?.config.url}} - 401 Unauthorized Request from cloud service`)}).with(400,()=>{E(`[currents] ${e.response?.config.method} ${e.response?.config.url} - 400 Bad Request from cloud service:
5
- %o`,r)}).with(429,()=>{E(`[currents] ${e.response?.config.method} ${e.response?.config.url} - 429 Too Many Requests from cloud service`)}).with(422,()=>{cr(e,r)}).otherwise(()=>{E(`[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,g.match)(t).with({code:Ge.MISSING_SUITE,message:g.P.string,errors:g.P.array(g.P.string)},async r=>{let{message:n,errors:o}=r;M(1),d(...ke(n,o))}).with({code:Ge.RUN_EXPIRED,message:g.P.string},r=>{E(r.message)}).with({message:g.P.string,errors:g.P.array(g.P.string)},r=>{let{message:n,errors:o}=r;M(1),E(...ke(n,o)),M(1)}).otherwise(()=>{E(`[currents] Unexpected network response: %s
7
- %O`,e.message,{method:e.response?.config.method,url:e.response?.config.url,status:e.response?.status})})}var Ge={RUN_CANCELLED:"RUN_CANCELLED",RUN_EXPIRED:"RUN_EXPIRED",MISSING_SUITE:"MISSING_SUITE"};function ke(e,t){return Ve.default.isString(e)?t?.length===0?[e]:[e,`
1
+ "use strict";var Ut=Object.create;var B=Object.defineProperty;var At=Object.getOwnPropertyDescriptor;var St=Object.getOwnPropertyNames;var Lt=Object.getPrototypeOf,Nt=Object.prototype.hasOwnProperty;var ae=(e,t)=>{for(var r in t)B(e,r,{get:t[r],enumerable:!0})},ce=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of St(t))!Nt.call(e,o)&&o!==r&&B(e,o,{get:()=>t[o],enumerable:!(n=At(t,o))||n.enumerable});return e};var u=(e,t,r)=>(r=e!=null?Ut(Lt(e)):{},ce(t||!e||!e.__esModule?B(r,"default",{value:e,enumerable:!0}):r,e)),Dt=e=>ce(B({},"__esModule",{value:!0}),e);var yr={};ae(yr,{handleCurrentsReport:()=>Ot});module.exports=Dt(yr);var ue=require("debug"),yt=u(require("fs-extra")),i=(0,ue.debug)("currents"),Bt=null;function me(e){Bt=e}var b={};ae(b,{getNanoid:()=>bt,userFacingNanoid:()=>q});var $=require("nanoid"),le="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",bt=(e=16)=>(0,$.customAlphabet)(le,e)(),q=(0,$.customAlphabet)(le,12);var l=require("lodash");var x=i.extend("ci"),xt=(e,...t)=>(0,l.chain)(t).compact().join(e).value(),vt=(e,t)=>(0,l.set)(e,(0,l.camelCase)(t),process.env[t]),m=e=>(0,l.transform)(e,vt,{}),Mt=()=>process.env.TF_BUILD&&process.env.TF_BUILD_BUILDNUMBER,wt=()=>process.env.TF_BUILD&&process.env.AZURE_HTTP_USER_AGENT,Ft=()=>(0,l.some)(process.env,(e,t)=>/^CODEBUILD_/.test(t)),Ht=()=>process.env.bamboo_buildNumber,kt=()=>process.env.CI_NAME&&process.env.CI_NAME==="codeship"&&process.env.CODESHIP,Gt=()=>process.env.CI_NAME&&process.env.CI_NAME==="codeship"&&!process.env.CODESHIP,jt=()=>(0,l.some)(process.env,(e,t)=>/^CONCOURSE_/.test(t)),Vt=()=>process.env.GITLAB_CI||process.env.CI_SERVER_NAME&&/^GitLab/.test(process.env.CI_SERVER_NAME),Kt=()=>process.env.GCP_PROJECT||process.env.GCLOUD_PROJECT||process.env.GOOGLE_CLOUD_PROJECT,Jt=()=>process.env.JENKINS_URL||process.env.JENKINS_HOME||process.env.JENKINS_VERSION||process.env.HUDSON_URL||process.env.HUDSON_HOME,Yt=()=>process.env.WERCKER||process.env.WERCKER_MAIN_PIPELINE_STARTED,$t={appveyor:"APPVEYOR",azure:wt,awsCodeBuild:Ft,bamboo:Ht,bitbucket:"BITBUCKET_BUILD_NUMBER",buildkite:"BUILDKITE",circle:"CIRCLECI",codeshipBasic:kt,codeshipPro:Gt,concourse:jt,codeFresh:"CF_BUILD_ID",drone:"DRONE",githubActions:"GITHUB_ACTIONS",gitlab:Vt,goCD:"GO_JOB_NAME",googleCloud:Kt,jenkins:Jt,semaphore:"SEMAPHORE",shippable:"SHIPPABLE",teamcity:"TEAMCITY_VERSION",teamfoundation:Mt,travis:"TRAVIS",wercker:Yt,netlify:"NETLIFY",layerci:"LAYERCI"};function qt(){let{env:e}=process;return(0,l.findKey)($t,t=>{if((0,l.isString)(t))return e[t];if((0,l.isFunction)(t))return t()})}var pe=()=>({appveyor:m(["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:m(["BUILD_BUILDID","BUILD_BUILDNUMBER","BUILD_CONTAINERID","BUILD_REPOSITORY_URI","SYSTEM_TEAMPROJECT","SYSTEM_COLLECTIONURI"]),awsCodeBuild:m(["CODEBUILD_BUILD_ID","CODEBUILD_BUILD_NUMBER","CODEBUILD_RESOLVED_SOURCE_VERSION","CODEBUILD_SOURCE_REPO_URL","CODEBUILD_SOURCE_VERSION"]),bamboo:m(["bamboo_buildNumber","bamboo_buildResultsUrl","bamboo_planRepository_repositoryUrl","bamboo_buildKey"]),bitbucket:m(["BITBUCKET_REPO_SLUG","BITBUCKET_REPO_OWNER","BITBUCKET_BUILD_NUMBER","BITBUCKET_PARALLEL_STEP","BITBUCKET_STEP_RUN_NUMBER","BITBUCKET_PR_ID","BITBUCKET_PR_DESTINATION_BRANCH","BITBUCKET_PR_DESTINATION_COMMIT"]),buildkite:m(["BUILDKITE_REPO","BUILDKITE_SOURCE","BUILDKITE_JOB_ID","BUILDKITE_BUILD_ID","BUILDKITE_BUILD_URL","BUILDKITE_BUILD_NUMBER","BUILDKITE_PULL_REQUEST","BUILDKITE_PULL_REQUEST_REPO","BUILDKITE_PULL_REQUEST_BASE_BRANCH"]),circle:m(["CIRCLE_JOB","CIRCLE_BUILD_NUM","CIRCLE_BUILD_URL","CIRCLE_PR_NUMBER","CIRCLE_PR_REPONAME","CIRCLE_PR_USERNAME","CIRCLE_COMPARE_URL","CIRCLE_WORKFLOW_ID","CIRCLE_WORKFLOW_WORKSPACE_ID","CIRCLE_PULL_REQUEST","CIRCLE_REPOSITORY_URL","CI_PULL_REQUEST","CIRCLE_NODE_INDEX","CIRCLE_NODE_TOTAL"]),codeshipBasic:m(["CI_BUILD_ID","CI_REPO_NAME","CI_BUILD_URL","CI_PROJECT_ID","CI_BUILD_NUMBER","CI_PULL_REQUEST"]),codeshipPro:m(["CI_BUILD_ID","CI_REPO_NAME","CI_PROJECT_ID"]),concourse:m(["BUILD_ID","BUILD_NAME","BUILD_JOB_NAME","BUILD_PIPELINE_NAME","BUILD_TEAM_NAME","ATC_EXTERNAL_URL"]),codeFresh:m(["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:m(["DRONE_JOB_NUMBER","DRONE_BUILD_LINK","DRONE_BUILD_NUMBER","DRONE_PULL_REQUEST"]),githubActions:m(["GITHUB_WORKFLOW","GITHUB_ACTION","GITHUB_EVENT_NAME","GITHUB_RUN_ID","GITHUB_RUN_ATTEMPT","GITHUB_REPOSITORY"]),gitlab:m(["CI_PIPELINE_ID","CI_PIPELINE_URL","CI_BUILD_ID","CI_JOB_ID","CI_JOB_URL","CI_JOB_NAME","CI_NODE_INDEX","CI_NODE_TOTAL","GITLAB_HOST","CI_PROJECT_ID","CI_PROJECT_URL","CI_REPOSITORY_URL","CI_ENVIRONMENT_URL","CI_DEFAULT_BRANCH","RUN_ATTEMPT"]),goCD:m(["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:m(["BUILD_ID","PROJECT_ID","REPO_NAME","BRANCH_NAME","TAG_NAME","COMMIT_SHA","SHORT_SHA"]),jenkins:m(["BUILD_ID","BUILD_URL","BUILD_NUMBER","ghprbPullId"]),semaphore:m(["SEMAPHORE_BRANCH_ID","SEMAPHORE_BUILD_NUMBER","SEMAPHORE_CURRENT_JOB","SEMAPHORE_CURRENT_THREAD","SEMAPHORE_EXECUTABLE_UUID","SEMAPHORE_GIT_BRANCH","SEMAPHORE_GIT_DIR","SEMAPHORE_GIT_REF","SEMAPHORE_GIT_REF_TYPE","SEMAPHORE_GIT_REPO_SLUG","SEMAPHORE_GIT_SHA","SEMAPHORE_GIT_URL","SEMAPHORE_JOB_COUNT","SEMAPHORE_JOB_ID","SEMAPHORE_JOB_NAME","SEMAPHORE_JOB_UUID","SEMAPHORE_PIPELINE_ID","SEMAPHORE_PLATFORM","SEMAPHORE_PROJECT_DIR","SEMAPHORE_PROJECT_HASH_ID","SEMAPHORE_PROJECT_ID","SEMAPHORE_PROJECT_NAME","SEMAPHORE_PROJECT_UUID","SEMAPHORE_REPO_SLUG","SEMAPHORE_TRIGGER_SOURCE","SEMAPHORE_WORKFLOW_ID","PULL_REQUEST_NUMBER"]),shippable:m(["SHIPPABLE_BUILD_ID","SHIPPABLE_BUILD_NUMBER","SHIPPABLE_COMMIT_RANGE","SHIPPABLE_CONTAINER_NAME","SHIPPABLE_JOB_ID","SHIPPABLE_JOB_NUMBER","SHIPPABLE_REPO_SLUG","IS_FORK","IS_GIT_TAG","IS_PRERELEASE","IS_RELEASE","REPOSITORY_URL","REPO_FULL_NAME","REPO_NAME","BUILD_URL","BASE_BRANCH","HEAD_BRANCH","IS_PULL_REQUEST","PULL_REQUEST","PULL_REQUEST_BASE_BRANCH","PULL_REQUEST_REPO_FULL_NAME"]),teamcity:null,teamfoundation:m(["BUILD_BUILDID","BUILD_BUILDNUMBER","BUILD_CONTAINERID"]),travis:m(["TRAVIS_JOB_ID","TRAVIS_BUILD_ID","TRAVIS_BUILD_WEB_URL","TRAVIS_REPO_SLUG","TRAVIS_JOB_NUMBER","TRAVIS_EVENT_TYPE","TRAVIS_COMMIT_RANGE","TRAVIS_BUILD_NUMBER","TRAVIS_PULL_REQUEST","TRAVIS_PULL_REQUEST_BRANCH","TRAVIS_PULL_REQUEST_SHA"]),wercker:null,netlify:m(["BUILD_ID","CONTEXT","URL","DEPLOY_URL","DEPLOY_PRIME_URL","DEPLOY_ID"]),layerci:m(["LAYERCI_JOB_ID","LAYERCI_RUNNER_ID","RETRY_INDEX","LAYERCI_PULL_REQUEST","LAYERCI_REPO_NAME","LAYERCI_REPO_OWNER","LAYERCI_BRANCH","GIT_TAG"])}),Qt=()=>{let{env:e}=process;return{appveyor:{sha:e.APPVEYOR_REPO_COMMIT,branch:e.APPVEYOR_PULL_REQUEST_HEAD_REPO_BRANCH||e.APPVEYOR_REPO_BRANCH,message:xt(`
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},codeshipBasic:{sha:e.CI_COMMIT_ID,branch:e.CI_BRANCH,message:e.CI_COMMIT_MESSAGE,authorName:e.CI_COMMITTER_NAME,authorEmail:e.CI_COMMITTER_EMAIL},codeshipPro:{sha:e.CI_COMMIT_ID,branch:e.CI_BRANCH,message:e.CI_COMMIT_MESSAGE,authorName:e.CI_COMMITTER_NAME,authorEmail:e.CI_COMMITTER_EMAIL},codeFresh:{sha:e.CF_REVISION,branch:e.CF_BRANCH,message:e.CF_COMMIT_MESSAGE,authorName:e.CF_COMMIT_AUTHOR},drone:{sha:e.DRONE_COMMIT_SHA,branch:e.DRONE_SOURCE_BRANCH,message:e.DRONE_COMMIT_MESSAGE,authorName:e.DRONE_COMMIT_AUTHOR,authorEmail:e.DRONE_COMMIT_AUTHOR_EMAIL,remoteOrigin:e.DRONE_GIT_HTTP_URL,defaultBranch:e.DRONE_REPO_BRANCH},githubActions:{sha:e.GITHUB_SHA,branch:e.GH_BRANCH||e.GITHUB_REF,defaultBranch:e.GITHUB_BASE_REF,remoteBranch:e.GITHUB_HEAD_REF,runAttempt:e.GITHUB_RUN_ATTEMPT},gitlab:{sha:e.CI_COMMIT_SHA,branch:e.CI_COMMIT_REF_NAME,message:e.CI_COMMIT_MESSAGE,authorName:e.GITLAB_USER_NAME,authorEmail:e.GITLAB_USER_EMAIL,remoteOrigin:e.CI_REPOSITORY_URL,defaultBranch:e.CI_DEFAULT_BRANCH},googleCloud:{sha:e.COMMIT_SHA,branch:e.BRANCH_NAME},jenkins:{sha:e.GIT_COMMIT,branch:e.GIT_BRANCH},semaphore:{sha:e.SEMAPHORE_GIT_SHA,branch:e.SEMAPHORE_GIT_BRANCH,remoteOrigin:e.SEMAPHORE_GIT_REPO_SLUG},shippable:{sha:e.COMMIT,branch:e.BRANCH,message:e.COMMIT_MESSAGE,authorName:e.COMMITTER},snap:null,teamcity:null,teamfoundation:{sha:e.BUILD_SOURCEVERSION,branch:e.BUILD_SOURCEBRANCHNAME,message:e.BUILD_SOURCEVERSIONMESSAGE,authorName:e.BUILD_SOURCEVERSIONAUTHOR},travis:{sha:e.TRAVIS_PULL_REQUEST_SHA||e.TRAVIS_COMMIT,branch:e.TRAVIS_PULL_REQUEST_BRANCH||e.TRAVIS_BRANCH,message:e.TRAVIS_COMMIT_MESSAGE},wercker:null,netlify:{sha:e.COMMIT_REF,branch:e.BRANCH,remoteOrigin:e.REPOSITORY_URL},layerci:{sha:e.GIT_COMMIT,branch:e.LAYERCI_BRANCH,message:e.GIT_COMMIT_TITLE}}},Ee=e=>{let t=ge();return t?(0,l.chain)(e()).get(t).value():{}};function Wt(){return(0,l.chain)(pe()).omitBy(l.isNull).keys().value()}function zt(e){return e&&Wt().includes(e)}function ge(){let e=qt();return x("detected CI provider name: %s",e),e||null}function Xt(){return Ee(pe)}function de(){return Ee(Qt)}function _e(e){let t=Xt(),r=ge(),n=Zt(e,r);return x("detected CI provider: %s",r),x("detected CI params: %O",t),x("detected CI build ID: %o",n),{params:t,provider:r,ciBuildId:n}}function Zt(e,t){return e?{source:"user",value:e}:zt(t)?{source:"server",value:null}:{source:"random",value:`auto:${q()}`}}var fe=require("@currents/commit-info"),Ie=require("lodash");var v=require("lodash");var Q=i.extend("ci-git");function Re(e){Q("git commit existing info: %O",e);let t=de();Q("commit info from provider environment variables: %O",t);let r=(0,v.transform)(e,(n,o,a)=>{let c=o||(t?t[a]:null);return n[a]=(0,v.defaultTo)(c,null)});return Q("combined git and environment variables from provider: %O",r),r}var er=async()=>{let e=await(0,fe.commitInfo)();return Re({branch:e.branch,remoteOrigin:e.remote,authorEmail:e.email,authorName:e.author,message:e.message,sha:e.sha,ghaEventData:e.ghaEventData})},Ce=(0,Ie.memoize)(er);var Te=u(require("getos")),he=require("lodash"),f=require("os"),Oe=require("util"),tr=async()=>{if((0,f.platform)()==="linux")try{let e=await(0,Oe.promisify)(Te.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)()},rr=async()=>{let e=await tr();return{osName:(0,f.platform)(),osVersion:e,osCpus:[],osMemory:{free:(0,f.freemem)(),total:(0,f.totalmem)()}}},Pe=(0,he.memoize)(rr);var Ue={name:"@currents/cmd",version:"1.2.0",main:"./dist/index.js",author:"Currents Software Inc",license:"GPL-3.0-or-later",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":"^7.0.2","@types/archiver":"^6.0.3","@types/async-retry":"^1.4.8","@types/debug":"^4.1.12","@types/fs-extra":"^11.0.4","@types/getos":"^3.0.4","@types/lodash":"^4.17.5","@types/node":"^20.14.2","@types/proxy-from-env":"^1.0.4","@types/semver":"^7.5.8","@types/tmp":"^0.2.6","@types/unzipper":"^0.10.10","@types/uuid":"^9.0.8","@types/xml2js":"^0.4.14",jest:"^29.7.0",rimraf:"^5.0.7",tsup:"^8.1.0",typescript:"^5.4.5",vitest:"^2.1.4"},dependencies:{"@commander-js/extra-typings":"^11.1.0","@currents/commit-info":"1.0.1-beta.0",archiver:"^7.0.1","async-retry":"^1.3.3",axios:"^1.7.2","axios-retry":"^4.4.0",commander:"^11.1.0",debug:"^4.3.5",dotenv:"^16.4.5",execa:"^8.0.1","fs-extra":"^11.2.0",getos:"^3.2.1","https-proxy-agent":"^7.0.4","jest-cli":"^29.7.0","jest-config":"^29.7.0",lodash:"^4.17.21",nanoid:"^3.3.4","pretty-ms":"^7.0.1","proxy-from-env":"^1.1.0",semver:"^7.6.0","source-map-support":"^0.5.21",tmp:"^0.2.3","tmp-promise":"^3.0.3","ts-pattern":"^5.2.0",unzipper:"^0.12.3",xml2js:"^0.6.2"},bin:{currents:"./dist/bin/index.js","currents-cli":"./dist/bin/index.js"},files:["dist","!**/*.map","!**/*/*.map"],keywords:["cloud test dashboard","test reporter","test results","currents","currents dashboard","ci"],exports:{".":{import:"./dist/index.js",require:"./dist/index.js",types:"./dist/index.d.ts"},"./discovery/jest":{import:"./dist/services/upload/discovery/jest/reporter.js",require:"./dist/services/upload/discovery/jest/reporter.js",types:"./dist/services/upload/discovery/jest/reporter.d.ts"},"./package.json":"./package.json"},"release-it":{npm:{publish:!1},github:{release:!0,releaseName:"${npm.name} v${version}"},plugins:{"@release-it/conventional-changelog":{preset:"angular",header:"# Changelog",ignoreVersion:!0,infile:"./CHANGELOG.md"}},git:{commitMessage:"chore: release ${npm.name} v${version}",tagName:"${npm.name}-v${version}"}}};var Ae=Ue.version;var nr=[];function W(e){nr.push(e)}var R=u(require("chalk")),S=u(require("util"));var Se=[],Le=[];var Ne=(...e)=>{let t=S.default.format(...e);W(t),console.log(t)},sr=(...e)=>{let t=S.default.format(...e);W(t),console.error(t)},z=Ne,E=(...e)=>{let t=S.default.format(...e);return Le.push(t),i("WARNING: ",t),Ne(R.default.bgYellow.black(" WARNING "),t)};var g=(...e)=>{let t=S.default.format(...ir(e));return Se.push(t),i("ERROR: ",S.default.format(...e)),sr(R.default.bgRed.white(" ERROR "),t)};var ir=e=>e.map(t=>t instanceof Error?t.message:t),M=(e=2)=>console.log(Array(e).fill("").join(`
3
+ `)),lo=R.default.cyan,po=R.default.blueBright,Eo=R.default.red,go=R.default.yellow,_o=R.default.green,Ro=R.default.gray,fo=R.default.white,Io=R.default.black,Co=R.default.magenta,L=R.default.dim,To=R.default.bold;var X=u(require("fs-extra")),cr=require("path");async function U(e){try{return await X.default.readJson(e)}catch(t){throw g("Error while reading JSON file: %s",e,t),g}}async function Z(e,t){try{return await X.default.writeFile(e,t,"utf8"),e}catch(r){throw g(`Error writing file at ${e}:`,r),r}}var Tt=require("lodash"),J=u(require("path")),ht=u(require("semver"));var $e=u(require("lodash"));var we=u(require("axios")),Fe=u(require("axios-retry")),He=u(require("lodash"));var ee=()=>process.env.CURRENTS_API_URL??"https://cy.currents.dev",De=()=>process.env.CURRENTS_REST_API_URL??"https://api.currents.dev",ye=()=>3e4;var te=require("axios"),re=u(require("pretty-ms"));var Be=i.extend("http"),w=e=>[3*1e3,15*1e3,30*1e3][e-1],be=e=>(Be("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,te.isAxiosError)(e)}),"code"in e&&e.code&&["ECONNABORTED","ECONNREFUSED","ECONNRESET","ETIMEDOUT","ENETRESET"].includes(e.code)?!0:(0,te.isAxiosError)(e)?[429,502,503,504].includes(e.response?.status??0):!1),F=()=>3;function xe(e,t,r){Be("Network request '%s' failed: '%s'. Next attempt is in %s (%d/%d).",`${r.method?.toUpperCase()} ${r.url}`,t.message,(0,re.default)(w(e)),e,F()),E("Network request '%s' failed: '%s'. Next attempt is in %s (%d/%d).",`${r.method?.toUpperCase()} ${r.url}`,t.message,(0,re.default)(w(e)),e,F())}var ve=i.extend("http");var oe={api:null,restApi:null};function ur(e){let t=we.default.create({baseURL:e==="api"?ee():De(),timeout:ye(),transitional:{clarifyTimeoutError:!0}});return t.interceptors.request.use(r=>{let n=r["axios-retry"]?.retryCount??0;r.headers.get("Content-Type")||r.headers.set("Content-Type","application/json");let o={...He.default.pick(r,"method","url","headers"),data:Buffer.isBuffer(r.data)?"buffer":r.data};return n?ve("network request retry: %o",Me({...o,isRetry:!0})):ve("network request: %o",Me(o)),r}),(0,Fe.default)(t,{retries:F(),retryCondition:be,retryDelay:w,shouldResetTimeout:!0,onRetry:xe}),t}function ke(e){return oe[e]===null&&(oe[e]=ur(e)),oe[e]}function Me(e){return{method:e.method,baseUrl:ee(),url:e.url,data:e.isRetry?"<retry>":mr(e.data),headers:{...e.headers,"x-currents-key":"***"}}}function mr(e){return e?.results?.raw?{...e,results:{...e.results,raw:"***"}}:e}var Ve=require("axios"),Ke=u(require("lodash")),_=require("ts-pattern");function Je(e){(0,_.match)(e).when(Ve.isAxiosError,lr).otherwise(()=>{E("Unexpected error while sending network request: %s",e)})}function lr(e){return(0,_.match)(e).with({code:"ECONNABORTED"},()=>{E("Network connection aborted")}).with({code:"ECONNREFUSED"},()=>{E("Network connection aborted")}).with({code:"ECONNRESET"},()=>{E("Network connection reset")}).with({code:"ETIMEDOUT"},()=>{E("Network connection timeout")}).with({response:_.P.not(_.P.nullish)},t=>{pr(t,{status:t.response.status,data:t.response.data})}).otherwise(t=>{E(`[currents] Unexpected network error: %s
4
+ %O`,e.message,{method:e.response?.config.method,url:e.response?.config.url,status:e.response?.status,payload:e.response?.config.data})})}function pr(e,{status:t,data:r}){(0,_.match)(t).with(401,()=>{E(`[currents] ${e.response?.config.method} ${e.response?.config.url}} - 401 Unauthorized Request from cloud service`)}).with(400,()=>{E(`[currents] ${e.response?.config.method} ${e.response?.config.url} - 400 Bad Request from cloud service:
5
+ %o`,r)}).with(429,()=>{E(`[currents] ${e.response?.config.method} ${e.response?.config.url} - 429 Too Many Requests from cloud service`)}).with(422,()=>{Er(e,r)}).otherwise(()=>{E(`[currents] Unexpected network response: %s
6
+ %O`,e.message,{method:e.response?.config.method,url:e.response?.config.url,status:e.response?.status})})}function Er(e,t){(0,_.match)(t).with({code:Ge.MISSING_SUITE,message:_.P.string,errors:_.P.array(_.P.string)},async r=>{let{message:n,errors:o}=r;M(1),g(...je(n,o))}).with({code:Ge.RUN_EXPIRED,message:_.P.string},r=>{E(r.message)}).with({message:_.P.string,errors:_.P.array(_.P.string)},r=>{let{message:n,errors:o}=r;M(1),E(...je(n,o)),M(1)}).otherwise(()=>{E(`[currents] Unexpected network response: %s
7
+ %O`,e.message,{method:e.response?.config.method,url:e.response?.config.url,status:e.response?.status})})}var Ge={RUN_CANCELLED:"RUN_CANCELLED",RUN_EXPIRED:"RUN_EXPIRED",MISSING_SUITE:"MISSING_SUITE"};function je(e,t){return Ke.default.isString(e)?t?.length===0?[e]:[e,`
8
8
  ${(t??[]).map(r=>` - ${r}`).join(`
9
9
  `)}
10
- `]:["Unexpected network error"]}var Je=i.extend("http");async function F(e,t,r=He){try{let n=await r(e).request(t);return Je("network response: %o",{...Ye.default.omit(n,"request","config"),url:n.config.url,method:n.config.method}),n}catch(n){let o=n;throw Je("network error: %o",{code:o.code,message:o.message,url:o.config?.url,method:o.config?.method,status:o.response?.status,headers:o.response?.headers,data:o.response?.data}),Ke(o),o}}var rn=i.extend("api");var Qe=require("util"),We=require("zlib");var qe=i.extend("api"),ur=(0,Qe.promisify)(We.gzip);async function ze(e){try{qe("Run params: %o",e);let t=await mr(JSON.stringify(e));return F("api",{url:"v1/runs",method:"POST",headers:{"Content-Type":"application/json","Content-Encoding":"gzip"},data:t}).then(r=>r.data)}catch(t){throw qe("Failed to create the run:",t),t}}async function mr(e){try{return await ur(e)}catch(t){throw d("Failed to compress run payload:",t),t}}var gn=i.extend("api");var xn=i.extend("config");var pr=null;function Xe(){return pr}var ut=u(require("fs-extra")),mt=require("jest-cli"),pt=u(require("tmp"));var at=require("lodash");var Ze=require("lodash"),lr=["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 et(e){return(0,Ze.omit)(e,...lr)}function tt(e){let t=[];for(let[r,n]of Object.entries(e))r==="_"||r==="$0"||r.includes("-")||(typeof n=="boolean"?n&&t.push(`--${r}`):Array.isArray(n)?n.forEach(o=>{t.push(`--${r}=${o}`)}):t.push(`--${r}=${n}`));return t.join(" ")}var nt=u(require("fs")),st=require("jest-config"),oe=require("lodash"),ne=u(require("path"));function H(e,t){return(...r)=>new Promise((n,o)=>{let a=0,p=()=>{a++;try{let l=e(...r);n(l)}catch(l){if(a>=t.length)o(l);else{let _=t[a-1];setTimeout(p,_)}}};p()})}var rt=u(require("fs-extra")),Er=u(require("path"));async function G(e){let t=await rt.default.pathExists(e);if(!t)throw new Error("File does not exist");return t}var ot=i.extend("jest-discovery");async function it(e){try{let{config:t,configPath:r}=await(0,st.readInitialOptions)(e),n=["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"],o=["collectCoverageFrom","coverageDirectory","coveragePathIgnorePatterns","detectLeaks","detectOpenHandles","errorOnDeprecated","forceCoverageMatch","openHandlesTimeout","runner","watchPathIgnorePatterns"],a=(0,oe.omit)(t,n);if(a.projects&&(a.projects=a.projects.map(_=>typeof _!="string"?(0,oe.omit)(_,o):_)),a.rootDir&&Object.keys(a).length===1)return null;let p=ne.default.resolve(r?ne.default.dirname(r):process.cwd(),`.jest-scanner-${new Date().getTime()}.config.js`),l=`module.exports=${JSON.stringify(a,null,2)}`;return ot("configFileContent: %O",l),nt.default.writeFileSync(p,l),await H(G,[200,200,200,200,200,1e3])(p),p}catch(t){return d("Failed to recreate the config file"),ot("error %o",t),null}}async function ct(e){let t="!!##ThisPatternWillNotMatchAnyTestName##!!",r=e.options,n=et(r),o=tt(n),a=r.config,p=await it(a);return{cliArgs:[o,"--testNamePattern",t,"--reporters","@currents/cmd/discovery/jest","--shard=1/1",p?`--config=${p}`:"",...e.args].filter(_=>!(0,at.isEmpty)(_)),configFilePath:p}}var dr=i.extend("jest-discovery");async function lt(e,t){console.time(v("@currents/jest:fullTestSuite-ready"));let{cliArgs:r,configFilePath:n}=await ct(t);try{let o=pt.default.fileSync({postfix:".json"});return dr("running scanner: %o",r),process.env.CURRENTS_DISCOVERY_PATH=o.name,await(0,mt.run)(r.concat(["--openHandlesTimeout=0"])),await H(G,Array.from({length:300},()=>100))(o.name),console.timeEnd(v("@currents/jest:fullTestSuite-ready")),await P(o.name)}catch(o){return d("Failed to obtain the jest full test suite:",o),[]}finally{n&&ut.default.unlinkSync(n)}}var S=class{constructor(t){this.config=t}async getFullTestSuite(){return[]}};var k=class extends S{constructor(t){super(t)}async getFullTestSuite(){return lt(this.config.frameworkConfig,this.config.cliArgs)}};function Et(e){switch(e.framework){case"jest":return new k(e);default:return new S(e)}}var L=u(require("fs-extra")),T=u(require("path"));async function dt(e){let t=await gr(e?.reportDir);if(!t)throw new Error("Failed to find the report dir");return{reportDir:t,configFilePath:e?.configFilePath??T.default.join(t,"config.json")}}async function gr(e){return e?(await j(e),e):_r((0,T.join)(process.cwd(),".currents"))}async function _r(e){let t=await L.default.readdir(e),r=null;for(let n of t){let o=T.default.join(e,n),a=await L.default.stat(o);a.isDirectory()&&(!r||a.birthtime>r.birthtime)&&(r={name:n,birthtime:a.birthtime})}return r?(0,T.resolve)(e,r.name):null}async function j(e){try{return await L.default.pathExists(e)}catch{return d("Error checking if path exists:",d),!1}}async function gt(e){let t=T.default.join(e,"instances");return Rr(t)}async function Rr(e){let t=await L.default.readdir(e),r=[];for(let n of t){let o=T.default.join(e,n);(await L.default.stat(o)).isFile()&&r.push(o)}return r}async function It(){let e=Xe();if(!e)throw new Error("Currents config is missing!");let t=await dt(e);ue(Tr(t.reportDir)),i("Reporter options: %o",t),W("Report directory: %s",t.reportDir);let r=await P(t.configFilePath);i("Report config: %o",r);let n=await gt(t.reportDir);i("Found %d instance results in the reportDir: %s",n.length,t.reportDir);let o=fr(t.reportDir),a=await j(o),p=Cr(t.reportDir),l=null;if(a){let f=await P(o);E("Marker file detected. The report was already uploaded: %o",{runUrl:f.response.runUrl,isoDate:f.isoDate}),await j(p)&&(l=await P(p),i("Full test suite file detected: %s",p))}if(l)i("The discovery stage was skipped");else{if(l=await Et(r).getFullTestSuite(),hr(l))throw new Error("Failed to discover the full test suite!");await X(p,JSON.stringify(l))}let _=l.length===1?l[0].name:null,K={currents:e},U={type:r.framework,version:r.frameworkVersion,clientVersion:Ue},se=B.userFacingNanoid(),N=ge(e.ciBuildId),h={};for await(let f of n){let C=await P(f);h[C.groupId]||(h[C.groupId]=[]),h[C.groupId].push(C)}for await(let f of Object.keys(h)){let C=h[f],J=f;_&&(i("Default group found: %s, overwriting the group in the results",_),J=_,C=C.map(O=>({...O,groupId:_})));try{let O=await Ir({ci:N,group:J,instances:C,fullTestSuite:l,config:K,machineId:se,framework:U});i("Api response: %o",O),W("[%s] Run created: %s",J,O.runUrl);let ft={response:O,isoDate:new Date().toISOString()};await X(o,JSON.stringify(ft)),i("Marker file %s: %s",a?"overwritten":"created",o)}catch(O){throw i("Failed to upload the results to the dashboard"),O}}}async function Ir({ci:e,group:t,instances:r,fullTestSuite:n,config:o,machineId:a,framework:p}){let l=await fe(),_=await Oe(),K={browserName:"node",browserVersion:Rt.default.coerce(process.version)?.version},{currents:U}=o,N={platform:{...K,..._},ci:e,commit:l,group:t,fullTestSuite:n,config:o,projectId:U.projectId,recordKey:U.recordKey,ciBuildId:e.ciBuildId.value??void 0,tags:U.tag??[],machineId:U.machineId??a,framework:p,instances:r};return i("Creating run: %o",(0,_t.mapValues)(N,(h,f)=>f==="recordKey"?"******":h)),ze(N)}function fr(e){return V.default.join(e,"upload.marker.json")}function Cr(e){return V.default.join(e,"fullTestSuite.json")}function Tr(e){return V.default.join(e,`.debug-${new Date().toISOString()}.log`)}function hr(e){return e.length===0||e.some(t=>t.tests.length===0)}0&&(module.exports={handleCurrentsReport});
10
+ `]:["Unexpected network error"]}var Ye=i.extend("http");async function H(e,t,r=ke){try{let n=await r(e).request(t);return Ye("network response: %o",{...$e.default.omit(n,"request","config"),url:n.config.url,method:n.config.method}),n}catch(n){let o=n;throw Ye("network error: %o",{code:o.code,message:o.message,url:o.config?.url,method:o.config?.method,status:o.response?.status,headers:o.response?.headers,data:o.response?.data}),Je(o),o}}var ln=i.extend("api");var We=require("util"),ze=require("zlib");var Qe=i.extend("api"),gr=(0,We.promisify)(ze.gzip);async function Xe(e){try{Qe("Run params: %o",e);let t=await dr(JSON.stringify(e));return H("api",{url:"v1/runs",method:"POST",headers:{"Content-Type":"application/json","Content-Encoding":"gzip"},data:t}).then(r=>r.data)}catch(t){throw Qe("Failed to create the run:",t),t}}async function dr(e){try{return await gr(e)}catch(t){throw g("Failed to compress run payload:",t),t}}var On=i.extend("api");var Kn=i.extend("config");var _r=null;function Ze(){return _r}var mt=u(require("fs-extra")),lt=require("jest-cli"),pt=u(require("tmp"));var ct=require("lodash");function et(e){let t=[];for(let[r,n]of Object.entries(e))r==="_"||r==="$0"||r.includes("-")||(typeof n=="boolean"?n&&t.push(`--${r}`):Array.isArray(n)?n.forEach(o=>{t.push(`--${r}=${o}`)}):t.push(`--${r}=${n}`));return t.join(" ")}var tt=require("lodash"),Rr=["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 rt(e){return(0,tt.omit)(e,...Rr)}var st=u(require("fs")),it=require("jest-config"),ne=require("lodash"),se=u(require("path"));function k(e,t){return(...r)=>new Promise((n,o)=>{let a=0,c=()=>{a++;try{let p=e(...r);n(p)}catch(p){if(a>=t.length)o(p);else{let d=t[a-1];setTimeout(c,d)}}};c()})}var ot=u(require("fs-extra")),fr=u(require("path"));async function G(e){let t=await ot.default.pathExists(e);if(!t)throw new Error("File does not exist");return t}var nt=i.extend("jest-discovery");async function at(e){try{let{config:t,configPath:r}=await(0,it.readInitialOptions)(e),n=["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"],o=["collectCoverageFrom","coverageDirectory","coveragePathIgnorePatterns","detectLeaks","detectOpenHandles","errorOnDeprecated","forceCoverageMatch","openHandlesTimeout","runner","watchPathIgnorePatterns"],a=(0,ne.omit)(t,n);if(a.projects&&(a.projects=a.projects.map(d=>typeof d!="string"?(0,ne.omit)(d,o):d)),a.rootDir&&Object.keys(a).length===1)return null;let c=se.default.resolve(r?se.default.dirname(r):process.cwd(),`.jest-scanner-${new Date().getTime()}.config.js`),p=`module.exports=${JSON.stringify(a,null,2)}`;return nt("configFileContent: %O",p),st.default.writeFileSync(c,p),await k(G,[200,200,200,200,200,1e3])(c),c}catch(t){return g("Failed to recreate the config file"),nt("error %o",t),null}}async function ut(e){let t="!!##ThisPatternWillNotMatchAnyTestName##!!",r=e.options,n=rt(r),o=et(n),a=r.config,c=await at(a);return{cliArgs:[o,"--testNamePattern",t,"--reporters","@currents/cmd/discovery/jest","--shard=1/1",c?`--config=${c}`:"",...e.args].filter(d=>!(0,ct.isEmpty)(d)),configFilePath:c}}var Ir=i.extend("jest-discovery");async function Et(e,t){console.time(L("@currents/jest:fullTestSuite-ready"));let{cliArgs:r,configFilePath:n}=await ut(t);try{let o=pt.default.fileSync({postfix:".json"});return Ir("running scanner: %o",r),process.env.CURRENTS_DISCOVERY_PATH=o.name,await(0,lt.run)(r.concat(["--openHandlesTimeout=0"])),await k(G,Array.from({length:300},()=>100))(o.name),console.timeEnd(L("@currents/jest:fullTestSuite-ready")),await U(o.name)}catch(o){return g("Failed to obtain the jest full test suite:",o),[]}finally{n&&mt.default.unlinkSync(n)}}var h=class{constructor(t){this.config=t}async getFullTestSuite(){return[]}};var j=class extends h{constructor(t){super(t)}async getFullTestSuite(){return Et(this.config.frameworkConfig,this.config.cliArgs)}};var gt=u(require("fs-extra"));var dt=u(require("crypto")),_t=require("xml2js"),Cr=i.extend("junit-discovery");async function Rt(e,t){console.time(L("@currents/junit:fullTestSuite-ready"));try{Cr("running scanner: %o",t);let r=t.options.jUnitFile;process.env.CURRENTS_DISCOVERY_PATH=r;let n=gt.default.readFileSync(r,"utf-8"),o=await(0,_t.parseStringPromise)(n,{explicitArray:!1,mergeAttrs:!0});return Tr(o)}catch(r){return g("Failed to obtain the junit full test suite:",r),[]}}function Tr(e){let t=[],r=e.testsuites?.testsuite,n=Array.isArray(r)?r:[r],o={name:e.testsuites?.name??"No name",tags:[],tests:[]};return n.forEach(a=>{let c=a?.testcase;(Array.isArray(c)?c:[c]).forEach(d=>{let D={title:[d?.name??""],spec:a?.name??"No name",tags:[],testId:hr(d?.name??"No name",a?.name??"No name")};o.tests.push(D)})}),t.push(o),t}function hr(e,t){let r=`${e}${t}`;return dt.default.createHash("sha256").update(r).digest("hex").substring(0,16)}var V=class extends h{constructor(t){super(t)}async getFullTestSuite(){return Rt(this.config.frameworkConfig,this.config.cliArgs)}};function ft(e){switch(e.framework){case"jest":return new j(e);case"junit":return new V(e);default:return new h(e)}}var N=u(require("fs-extra")),T=u(require("path"));async function It(e){let t=await Or(e?.reportDir);if(!t)throw new Error("Failed to find the report dir");return{reportDir:t,configFilePath:e?.configFilePath??T.default.join(t,"config.json")}}async function Or(e){return e?(await K(e),e):Pr((0,T.join)(process.cwd(),".currents"))}async function Pr(e){let t=await N.default.readdir(e),r=null;for(let n of t){let o=T.default.join(e,n),a=await N.default.stat(o);a.isDirectory()&&(!r||a.birthtime>r.birthtime)&&(r={name:n,birthtime:a.birthtime})}return r?(0,T.resolve)(e,r.name):null}async function K(e){try{return await N.default.pathExists(e)}catch{return g("Error checking if path exists:",g),!1}}async function Ct(e){let t=T.default.join(e,"instances");return Ur(t)}async function Ur(e){let t=await N.default.readdir(e),r=[];for(let n of t){let o=T.default.join(e,n);(await N.default.stat(o)).isFile()&&r.push(o)}return r}async function Ot(){let e=Ze();if(!e)throw new Error("Currents config is missing!");let t=await It(e);me(Nr(t.reportDir)),i("Reporter options: %o",t),z("Report directory: %s",t.reportDir);let r=await U(t.configFilePath);i("Report config: %o",r);let n=await Ct(t.reportDir);i("Found %d instance results in the reportDir: %s",n.length,t.reportDir);let o=Sr(t.reportDir),a=await K(o),c=Lr(t.reportDir),p=null;if(a){let I=await U(o);E("Marker file detected. The report was already uploaded: %o",{runUrl:I.response.runUrl,isoDate:I.isoDate}),await K(c)&&(p=await U(c),i("Full test suite file detected: %s",c))}if(p)i("The discovery stage was skipped");else{if(p=await ft(r).getFullTestSuite(),Dr(p))throw new Error("Failed to discover the full test suite!");await Z(c,JSON.stringify(p))}let d=p.length===1?p[0].name:null,D={currents:e},A={type:r.framework,version:r.frameworkVersion,clientVersion:Ae,frameworkConfig:{originFramework:r.frameworkConfig?.originFramework,originFrameworkVersion:r.frameworkConfig?.originFrameworkVersion}},ie=b.userFacingNanoid(),y=_e(e.ciBuildId),O={};for await(let I of n){let C=await U(I);O[C.groupId]||(O[C.groupId]=[]),O[C.groupId].push(C)}for await(let I of Object.keys(O)){let C=O[I],Y=I;d&&(i("Default group found: %s, overwriting the group in the results",d),Y=d,C=C.map(P=>({...P,groupId:d})));try{let P=await Ar({ci:y,group:Y,instances:C,fullTestSuite:p,config:D,machineId:ie,framework:A});i("Api response: %o",P),z("[%s] Run created: %s",Y,P.runUrl);let Pt={response:P,isoDate:new Date().toISOString()};await Z(o,JSON.stringify(Pt)),i("Marker file %s: %s",a?"overwritten":"created",o)}catch(P){throw i("Failed to upload the results to the dashboard"),P}}}async function Ar({ci:e,group:t,instances:r,fullTestSuite:n,config:o,machineId:a,framework:c}){let p=await Ce(),d=await Pe(),D={browserName:"node",browserVersion:ht.default.coerce(process.version)?.version},{currents:A}=o,y={platform:{...D,...d},ci:e,commit:p,group:t,fullTestSuite:n,config:o,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",(0,Tt.mapValues)(y,(O,I)=>I==="recordKey"?"******":O)),Xe(y)}function Sr(e){return J.default.join(e,"upload.marker.json")}function Lr(e){return J.default.join(e,"fullTestSuite.json")}function Nr(e){return J.default.join(e,`.debug-${new Date().toISOString()}.log`)}function Dr(e){return e.length===0||e.some(t=>t.tests.length===0)}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.2.0-beta.0",
3
+ "version": "1.2.0",
4
4
  "main": "./dist/index.js",
5
5
  "author": "Currents Software Inc",
6
6
  "license": "GPL-3.0-or-later",
@@ -9,6 +9,7 @@
9
9
  "test": "vitest",
10
10
  "rm": "rimraf dist",
11
11
  "lint": "TIMING=1 eslint \"**/*.ts*\"",
12
+ "types": "tsc --noEmit",
12
13
  "build": "tsup-node --minify --dts",
13
14
  "dev": "tsup-node --watch --dts",
14
15
  "release": "release-it",
@@ -18,7 +19,7 @@
18
19
  "@jest/reporters": "^29.7.0",
19
20
  "@jest/types": "^29.6.3",
20
21
  "@release-it/conventional-changelog": "^7.0.2",
21
- "@types/archiver": "^6.0.2",
22
+ "@types/archiver": "^6.0.3",
22
23
  "@types/async-retry": "^1.4.8",
23
24
  "@types/debug": "^4.1.12",
24
25
  "@types/fs-extra": "^11.0.4",
@@ -30,11 +31,12 @@
30
31
  "@types/tmp": "^0.2.6",
31
32
  "@types/unzipper": "^0.10.10",
32
33
  "@types/uuid": "^9.0.8",
34
+ "@types/xml2js": "^0.4.14",
33
35
  "jest": "^29.7.0",
34
36
  "rimraf": "^5.0.7",
35
37
  "tsup": "^8.1.0",
36
38
  "typescript": "^5.4.5",
37
- "vitest": "^1.3.0"
39
+ "vitest": "^2.1.4"
38
40
  },
39
41
  "dependencies": {
40
42
  "@commander-js/extra-typings": "^11.1.0",
@@ -45,13 +47,13 @@
45
47
  "axios-retry": "^4.4.0",
46
48
  "commander": "^11.1.0",
47
49
  "debug": "^4.3.5",
48
- "dotenv": "^16.0.3",
50
+ "dotenv": "^16.4.5",
49
51
  "execa": "^8.0.1",
50
52
  "fs-extra": "^11.2.0",
51
53
  "getos": "^3.2.1",
54
+ "https-proxy-agent": "^7.0.4",
52
55
  "jest-cli": "^29.7.0",
53
56
  "jest-config": "^29.7.0",
54
- "https-proxy-agent": "^7.0.4",
55
57
  "lodash": "^4.17.21",
56
58
  "nanoid": "^3.3.4",
57
59
  "pretty-ms": "^7.0.1",
@@ -61,7 +63,8 @@
61
63
  "tmp": "^0.2.3",
62
64
  "tmp-promise": "^3.0.3",
63
65
  "ts-pattern": "^5.2.0",
64
- "unzipper": "^0.12.3"
66
+ "unzipper": "^0.12.3",
67
+ "xml2js": "^0.6.2"
65
68
  },
66
69
  "bin": {
67
70
  "currents": "./dist/bin/index.js",