@currents/cmd 1.1.0-beta.9 → 1.1.1-beta.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
@@ -8,7 +8,7 @@ CLI tool for [Currents](https://currents.dev) - a cloud platform for debugging,
8
8
  npm install @currents/cmd --save-dev
9
9
  ```
10
10
 
11
- ## Usage
11
+ ## Upload test results
12
12
 
13
13
  - Generate test results with one of the [supported](https://docs.currents.dev) reporters
14
14
  - Upload the results
@@ -19,7 +19,7 @@ npx currents upload --project-id=xxx --key=yyy
19
19
 
20
20
  ℹ️ Get familiar with [CI Build ID 📖](https://docs.currents.dev/guides/ci-build-id) before using `currents` in CI. It is **important** to set the `CI Build ID` explicitly using `--ci-build-id` option, if you are using CI sharding or multiple CI machines to parallelize your tests. If not set explicitly, the `CI Build ID` will be set to a random value.
21
21
 
22
- ## Notes
22
+ ### Notes
23
23
 
24
24
  Obtain `--project-id` and [--key](https://docs.currents.dev/guides/record-key) from https://app.currents.dev to identify the project and associate the results with your organization.
25
25
 
@@ -28,7 +28,7 @@ Obtain `--project-id` and [--key](https://docs.currents.dev/guides/record-key) f
28
28
  - use `process.env.CURRENTS_REPORT_DIR` or `--reportDir` to read the results previously generated by one of supported reporters, otherwise
29
29
  - use the most recently created directory named as `.currents/[timestamp]-[uuidv4()]` in the current working directory
30
30
 
31
- ## Configuration
31
+ ### Configuration
32
32
 
33
33
  Please note that all options apart from `--project-id` and `--key` are optional.
34
34
 
@@ -46,6 +46,47 @@ Please note that all options apart from `--project-id` and `--key` are optional.
46
46
 
47
47
  The configuration is also available by running the CLI command with the `--help` argument.
48
48
 
49
+ ## Use Currents API
50
+
51
+ - Retrieve information about Currents resources in [JSON](https://docs.currents.dev/resources/api/api-resources) format
52
+
53
+ ℹ️ Please note that the command is experimental and was primarily built to obtain test run data in CI. Its functionality might be extended in the future.
54
+
55
+ ℹ️ The command requires the `--project-id` and [`--api-key`](https://docs.currents.dev/resources/api/api-keys#managing-the-api-keys) from [Currents](https://app.currents.dev) to authenticate the request and provide the required data. Alternatively, you can set the `CURRENTS_PROJECT_ID` and `CURRENTS_API_KEY` environment variables.
56
+
57
+ **Supported operations:**
58
+
59
+ - Obtain run data using the [CI Build ID 📖](https://docs.currents.dev/guides/ci-build-id) by running the following command:
60
+
61
+ ```sh
62
+ npx currents api get-run --ci-build-id <ci-build-id> --output path/to/save/run.json
63
+ ```
64
+
65
+ - Obtain the last completed run data, filtered by `--branch` and/or `--tag`, by running the following command:
66
+ ```sh
67
+ npx currents api get-run --branch <branch> --tag <tag-1,tag-2,...tag-n>
68
+ ```
69
+
70
+ For more examples and usage options, run `npx currents api --help`.
71
+
72
+ ## Cache test artifacts
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).
75
+
76
+ To cache files, use the following command:
77
+
78
+ ```sh
79
+ npx currents cache set --key <record-key> --id <id> --path <path-1,path-2,...path-n>
80
+ ```
81
+
82
+ To download files, use the following command:
83
+
84
+ ```sh
85
+ npx currents cache set --key <record-key> --preset last-run
86
+ ```
87
+
88
+ For more examples and usage options, run `npx currents cache --help`.
89
+
49
90
  ## Troubleshooting
50
91
 
51
92
  Run the CLI command with the `--debug` argument or prefix it with `DEBUG="currents,currents:*"` to obtain detailed information about the command execution process.
package/dist/bin/index.js CHANGED
@@ -1,68 +1,69 @@
1
1
  #! /usr/bin/env node
2
- "use strict";var Lo=Object.create;var Ae=Object.defineProperty;var Bo=Object.getOwnPropertyDescriptor;var Mo=Object.getOwnPropertyNames;var Go=Object.getPrototypeOf,Fo=Object.prototype.hasOwnProperty;var ko=(e,t)=>{for(var r in t)Ae(e,r,{get:t[r],enumerable:!0})},Ho=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Mo(t))!Fo.call(e,n)&&n!==r&&Ae(e,n,{get:()=>t[n],enumerable:!(o=Bo(t,n))||o.enumerable});return e};var c=(e,t,r)=>(r=e!=null?Lo(Go(e)):{},Ho(t||!e||!e.__esModule?Ae(r,"default",{value:e,enumerable:!0}):r,e));var Dd=require("source-map-support/register");var xo=require("@commander-js/extra-typings");var ct={name:"@currents/cmd",version:"1.1.0-beta.9",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 re=ct.version;var st=require("@commander-js/extra-typings");var Ko=[];function Ue(e){Ko.push(e)}var I=c(require("chalk")),V=c(require("util"));var we=require("debug"),$o=c(require("fs-extra")),s=(0,we.debug)("currents"),Vo=null;function v(){we.debug.enable("currents,currents:*")}function pt(e){Vo=e}var mt=[],dt=[];var Se=(...e)=>{let t=V.default.format(...e);Ue(t),console.log(t)},Jo=(...e)=>{let t=V.default.format(...e);Ue(t),console.error(t)},k=Se,f=(...e)=>{let t=V.default.format(...e);return dt.push(t),s("WARNING: ",t),Se(I.default.bgYellow.black(" WARNING "),t)},De=(...e)=>{let t=V.default.format(...e);return s("WARNING: ",t),Se(I.default.bgYellow.black(" WARNING "),t)};var l=(...e)=>{let t=V.default.format(...e);return mt.push(t),s("ERROR: ",t),Jo(I.default.bgRed.white(" ERROR "),t)};var oe=(e=2)=>console.log(Array(e).fill("").join(`
3
- `)),Di=I.default.cyan,xi=I.default.blueBright,Ni=I.default.red,vi=I.default.yellow,Li=I.default.green,Bi=I.default.gray,Mi=I.default.white,Gi=I.default.black,Fi=I.default.magenta,E=I.default.dim,ki=I.default.bold;var po=c(require("chalk"));var J=class extends Error{};function ut(e){return Object.entries(e??{}).reduce((t,[r,o])=>o===void 0?t:{...t,[r]:o},{})}function R(e,t){return"env"in e[t]&&e[t].env?e[t].env:""}function qo(e,t){return e[t].cli}function Wo(e,t){return e[t].name}function H(e,t,r,o){let n={...ut(o),...ut(r())};return t.forEach(a=>{if(!n[a])throw l(`${Wo(e,a)} is required for Currents Reporter. Use the following methods to set the value:
4
- - as environment variable: ${E(R(e,a))}
5
- - as CLI flag of the command: ${E(qo(e,a))}`),new J("Missing required config variable")}),n}var Qo={apiKey:{name:"Api Key",env:"CURRENTS_API_KEY",cli:"--api-key"},debug:{name:"Debug",env:"CURRENTS_DEBUG",cli:"--debug"}},zo={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={...Qo,...zo};function lt(){return{apiKey:process.env[D.apiKey.env],debug:!!process.env[D.debug.env]}}var Xo=s.extend("config"),Zo=["apiKey","projectId"],xe=null;function ft(e){xe=H(D,Zo,lt,e),Xo("Resolved config: %o",xe)}function ne(){return xe}var ie=c(require("fs-extra")),gt=require("path");async function j(e){try{return await ie.default.readJson(e)}catch(t){throw l("Error while reading JSON file: %s",e,t),l}}async function Y(e,t){try{return await ie.default.writeFile(e,t,"utf8"),e}catch(r){throw l(`Error writing file at ${e}:`,r),r}}async function Ct(e){let t=(0,gt.dirname)(e);await ie.default.ensureDir(t)}var se={};ko(se,{getNanoid:()=>en,userFacingNanoid:()=>ve});var Ne=require("nanoid"),Et="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",en=(e=16)=>(0,Ne.customAlphabet)(Et,e)(),ve=(0,Ne.customAlphabet)(Et,12);var Vt=require("fs/promises");var Lt=c(require("lodash"));var Pt=c(require("axios")),bt=c(require("axios-retry")),At=c(require("lodash"));var Le=()=>process.env.CURRENTS_API_URL??"https://cy.currents.dev",ht=()=>process.env.CURRENTS_REST_API_URL??"https://api.currents.dev",Rt=()=>3e4;var Be=require("axios"),Me=c(require("pretty-ms"));var _t=s.extend("http"),ae=e=>[3*1e3,15*1e3,30*1e3][e-1],It=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),ce=()=>3;function Tt(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)(ae(e)),e,ce()),f("Network request '%s' failed: '%s'. Next attempt is in %s (%d/%d).",`${r.method?.toUpperCase()} ${r.url}`,t.message,(0,Me.default)(ae(e)),e,ce())}var Ot=s.extend("http");var Ge={api:null,restApi:null};function tn(e){let t=Pt.default.create({baseURL:e==="api"?Le():ht(),timeout:Rt(),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={...At.default.pick(r,"method","url","headers"),data:Buffer.isBuffer(r.data)?"buffer":r.data};return o?Ot("network request retry: %o",yt({...n,isRetry:!0})):Ot("network request: %o",yt(n)),r}),(0,bt.default)(t,{retries:ce(),retryCondition:It,retryDelay:ae,shouldResetTimeout:!0,onRetry:Tt}),t}function Ut(e){return Ge[e]===null&&(Ge[e]=tn(e)),Ge[e]}function yt(e){return{method:e.method,baseUrl:Le(),url:e.url,data:e.isRetry?"<retry>":rn(e.data),headers:{...e.headers,"x-currents-key":"***"}}}function rn(e){return e?.results?.raw?{...e,results:{...e.results,raw:"***"}}:e}var Dt=require("axios"),xt=c(require("lodash")),T=require("ts-pattern");function Nt(e){(0,T.match)(e).when(Dt.isAxiosError,on).otherwise(()=>{f("Unexpected error while sending network request: %s",e)})}function on(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=>{nn(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 nn(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,()=>{sn(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 sn(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),l(...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 xt.default.isString(e)?t?.length===0?[e]:[e,`
2
+ "use strict";var Go=Object.create;var be=Object.defineProperty;var ko=Object.getOwnPropertyDescriptor;var Fo=Object.getOwnPropertyNames;var Ho=Object.getPrototypeOf,jo=Object.prototype.hasOwnProperty;var Ko=(e,t)=>{for(var r in t)be(e,r,{get:t[r],enumerable:!0})},$o=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Fo(t))!jo.call(e,n)&&n!==r&&be(e,n,{get:()=>t[n],enumerable:!(o=ko(t,n))||o.enumerable});return e};var p=(e,t,r)=>(r=e!=null?Go(Ho(e)):{},$o(t||!e||!e.__esModule?be(r,"default",{value:e,enumerable:!0}):r,e));var Md=require("source-map-support/register");var Lo=require("@commander-js/extra-typings");var nt={name:"@currents/cmd",version:"1.1.1-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 Z=nt.version;var rt=require("@commander-js/extra-typings");var Jo=[];function Ae(e){Jo.push(e)}var T=p(require("chalk")),Q=p(require("util"));var xe=require("debug"),Yo=p(require("fs-extra")),a=(0,xe.debug)("currents"),qo=null;function it(){xe.debug.enable("currents,currents:*")}function at(e){qo=e}var st=[],ct=[];var pt=(...e)=>{let t=Q.default.format(...e);Ae(t),console.log(t)},Wo=(...e)=>{let t=Q.default.format(...e);Ae(t),console.error(t)},G=pt,g=(...e)=>{let t=Q.default.format(...e);return ct.push(t),a("WARNING: ",t),pt(T.default.bgYellow.black(" WARNING "),t)};var l=(...e)=>{let t=Q.default.format(...e);return st.push(t),a("ERROR: ",t),Wo(T.default.bgRed.white(" ERROR "),t)};var ee=(e=2)=>console.log(Array(e).fill("").join(`
3
+ `)),vi=T.default.cyan,Li=T.default.blueBright,Bi=T.default.red,Mi=T.default.yellow,Gi=T.default.green,ki=T.default.gray,Fi=T.default.white,Hi=T.default.black,ji=T.default.magenta,R=T.default.dim,Ki=T.default.bold;var lo=p(require("chalk"));var j=class extends Error{};function mt(e){return Object.entries(e??{}).reduce((t,[r,o])=>o===void 0?t:{...t,[r]:o},{})}function I(e,t){return"env"in e[t]&&e[t].env?e[t].env:""}function zo(e,t){return e[t].cli}function Xo(e,t){return e[t].name}function k(e,t,r,o){let n={...mt(o),...mt(r())};return t.forEach(s=>{if(!n[s])throw l(`${Xo(e,s)} is required for Currents Reporter. Use the following methods to set the value:
4
+ - as environment variable: ${R(I(e,s))}
5
+ - as CLI flag of the command: ${R(zo(e,s))}`),new j("Missing required config variable")}),n}var Zo={apiKey:{name:"Api Key",env:"CURRENTS_API_KEY",cli:"--api-key"},debug:{name:"Debug",env:"CURRENTS_DEBUG",cli:"--debug"}},en={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"}},U={...Zo,...en};function dt(){return{apiKey:process.env[U.apiKey.env],debug:!!process.env[U.debug.env]}}var tn=a.extend("config"),rn=["apiKey","projectId"],Ue=null;function ut(e){Ue=k(U,rn,dt,e),tn("Resolved config: %o",Ue)}function te(){return Ue}var re=p(require("fs-extra")),lt=require("path");async function F(e){try{return await re.default.readJson(e)}catch(t){throw l("Error while reading JSON file: %s",e,t),l}}async function K(e,t){try{return await re.default.writeFile(e,t,"utf8"),e}catch(r){throw l(`Error writing file at ${e}:`,r),r}}async function gt(e){let t=(0,lt.dirname)(e);await re.default.ensureDir(t)}var oe={};Ko(oe,{getNanoid:()=>on,userFacingNanoid:()=>Se});var we=require("nanoid"),ft="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",on=(e=16)=>(0,we.customAlphabet)(ft,e)(),Se=(0,we.customAlphabet)(ft,12);var Kt=require("fs/promises");var Nt=p(require("lodash"));var Ot=p(require("axios")),yt=p(require("axios-retry")),Pt=p(require("lodash"));var De=()=>process.env.CURRENTS_API_URL??"https://cy.currents.dev",Ct=()=>process.env.CURRENTS_REST_API_URL??"https://api.currents.dev",Et=()=>3e4;var Ne=require("axios"),ve=p(require("pretty-ms"));var Rt=a.extend("http"),ne=e=>[3*1e3,15*1e3,30*1e3][e-1],ht=e=>(Rt("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,Ne.isAxiosError)(e)}),"code"in e&&e.code&&["ECONNABORTED","ECONNREFUSED","ECONNRESET","ETIMEDOUT","ENETRESET"].includes(e.code)?!0:(0,Ne.isAxiosError)(e)?[429,502,503,504].includes(e.response?.status??0):!1),ie=()=>3;function It(e,t,r){Rt("Network request '%s' failed: '%s'. Next attempt is in %s (%d/%d).",`${r.method?.toUpperCase()} ${r.url}`,t.message,(0,ve.default)(ne(e)),e,ie()),g("Network request '%s' failed: '%s'. Next attempt is in %s (%d/%d).",`${r.method?.toUpperCase()} ${r.url}`,t.message,(0,ve.default)(ne(e)),e,ie())}var _t=a.extend("http");var Le={api:null,restApi:null};function nn(e){let t=Ot.default.create({baseURL:e==="api"?De():Ct(),timeout:Et(),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={...Pt.default.pick(r,"method","url","headers"),data:Buffer.isBuffer(r.data)?"buffer":r.data};return o?_t("network request retry: %o",Tt({...n,isRetry:!0})):_t("network request: %o",Tt(n)),r}),(0,yt.default)(t,{retries:ie(),retryCondition:ht,retryDelay:ne,shouldResetTimeout:!0,onRetry:It}),t}function bt(e){return Le[e]===null&&(Le[e]=nn(e)),Le[e]}function Tt(e){return{method:e.method,baseUrl:De(),url:e.url,data:e.isRetry?"<retry>":an(e.data),headers:{...e.headers,"x-currents-key":"***"}}}function an(e){return e?.results?.raw?{...e,results:{...e.results,raw:"***"}}:e}var Ut=require("axios"),wt=p(require("lodash")),_=require("ts-pattern");function St(e){(0,_.match)(e).when(Ut.isAxiosError,sn).otherwise(()=>{g("Unexpected error while sending network request: %s",e)})}function sn(e){return(0,_.match)(e).with({code:"ECONNABORTED"},()=>{g("Network connection aborted")}).with({code:"ECONNREFUSED"},()=>{g("Network connection aborted")}).with({code:"ECONNRESET"},()=>{g("Network connection reset")}).with({code:"ETIMEDOUT"},()=>{g("Network connection timeout")}).with({response:_.P.not(_.P.nullish)},t=>{cn(t,{status:t.response.status,data:t.response.data})}).otherwise(t=>{g(`[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 cn(e,{status:t,data:r}){(0,_.match)(t).with(401,()=>{g(`[currents] ${e.response?.config.method} ${e.response?.config.url}} - 401 Unauthorized Request from cloud service`)}).with(400,()=>{g(`[currents] ${e.response?.config.method} ${e.response?.config.url} - 400 Bad Request from cloud service:
7
+ %o`,r)}).with(429,()=>{g(`[currents] ${e.response?.config.method} ${e.response?.config.url} - 429 Too Many Requests from cloud service`)}).with(422,()=>{pn(e,r)}).otherwise(()=>{g(`[currents] Unexpected network response: %s
8
+ %O`,e.message,{method:e.response?.config.method,url:e.response?.config.url,status:e.response?.status})})}function pn(e,t){(0,_.match)(t).with({code:At.MISSING_SUITE,message:_.P.string,errors:_.P.array(_.P.string)},async r=>{let{message:o,errors:n}=r;ee(1),l(...xt(o,n))}).with({code:At.RUN_EXPIRED,message:_.P.string},r=>{g(r.message)}).with({message:_.P.string,errors:_.P.array(_.P.string)},r=>{let{message:o,errors:n}=r;ee(1),g(...xt(o,n)),ee(1)}).otherwise(()=>{g(`[currents] Unexpected network response: %s
9
+ %O`,e.message,{method:e.response?.config.method,url:e.response?.config.url,status:e.response?.status})})}var At={RUN_CANCELLED:"RUN_CANCELLED",RUN_EXPIRED:"RUN_EXPIRED",MISSING_SUITE:"MISSING_SUITE"};function xt(e,t){return wt.default.isString(e)?t?.length===0?[e]:[e,`
10
10
  ${(t??[]).map(r=>` - ${r}`).join(`
11
11
  `)}
12
- `]:["Unexpected network error"]}var vt=s.extend("http");async function K(e,t,r=Ut){try{let o=await r(e).request(t);return vt("network response: %o",{...Lt.default.omit(o,"request","config"),url:o.config.url,method:o.config.method}),o}catch(o){let n=o;throw vt("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}),Nt(n),n}}var pe=s.extend("api");async function Mt(e){try{return pe("Request params: %o",e),K("api",{url:"cache/upload",method:"POST",data:e}).then(t=>t.data)}catch(t){throw pe("Failed to create cache:",t),t}}async function Gt(e){try{return pe("Request params: %o",e),K("api",{url:"cache/download",method:"POST",data:e}).then(t=>t.data)}catch(t){throw pe("Failed to retrieve cache:",t),t}}var kt=require("util"),Ht=require("zlib");var Ft=s.extend("api"),an=(0,kt.promisify)(Ht.gzip);async function jt(e){try{Ft("Run params: %o",e);let t=await cn(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 cn(e){try{return await an(e)}catch(t){throw l("Failed to compress run payload:",t),t}}var Kt=s.extend("api");async function $t(e,t){try{return Kt("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 Kt("Failed to obtain run data:",r),r}}async function Fe(){try{let e=ne();if(!e)throw new Error("Config is missing!");e.debug&&v();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 $t(e.apiKey,t);await pn(e.pwLastRun&&r.data.pwLastRun?r.data.pwLastRun:r.data,e)}catch(e){throw s("Failed to get run data"),e}}async function pn(e,t){let r=JSON.stringify(e,null,2);t.output?(await Ct(t.output),await(0,Vt.writeFile)(t.output,r,"utf-8")):k(r)}var A=require("@commander-js/extra-typings");var mn={recordKey:{name:"Record Key",env:"CURRENTS_RECORD_KEY",cli:"--key"},debug:{name:"Debug",env:"CURRENTS_DEBUG",cli:"--debug"}},dn={id:{name:"Cache id",cli:"--id"},preset:{name:"Preset",cli:"--preset"},pwOutputDir:{name:"Playwright output directory",cli:"--pw-output-dir"},pwConfigDump:{name:"Playwright config dump",cli:"--pw-config-dump"},paths:{name:"Paths to cache",cli:"--paths"}},un={id:{name:"Cache id",cli:"--id"},preset:{name:"Preset",cli:"--preset"},pwOutputDir:{name:"Playwright output directory",cli:"--pw-output-dir"},outputDir:{name:"Custom directory to write output",cli:"--output-dir"}},L={...mn,...dn,...un};function ke(){return{recordKey:process.env[L.recordKey.env],debug:!!process.env[L.debug.env]}}var Jt=s.extend("config"),Yt=["recordKey"],ee;function qt(e){ee={type:"SET_COMMAND_CONFIG",values:H(L,Yt,ke,e)},Jt("Resolved config: %o",ee)}function Wt(e){ee={type:"GET_COMMAND_CONFIG",values:H(L,Yt,ke,e)},Jt("Resolved config: %o",ee)}function B(){return ee}function Qt(e){return{recordKey:e.key,id:e.id,preset:e.preset,outputDir:e.outputDir,debug:e.debug}}function zt(e){return{recordKey:e.key,id:e.id,preset:e.preset,pwOutputDir:e.pwOutputDir,pwConfigDump:e.pwConfigDump,paths:e.paths,includeHidden:e.includeHidden,debug:e.debug}}var Xt=require("@commander-js/extra-typings");var Zt=require("axios");function q(e,t=[]){return e?t.concat(e.split(",").map(r=>r.trim())):t}async function M(e,t){try{await e(t),process.exit(0)}catch(r){r instanceof Xt.CommanderError&&(l(r.message),process.exit(r.exitCode)),r instanceof J&&(l(r.message),process.exit(1)),(0,Zt.isAxiosError)(r)&&(l(r.message),process.exit(1)),l("Script execution failed: %o",r),process.exit(1)}}var He=new A.Option("-k, --key <record-key>","Your secret Record Key obtained from Currents").env(R(L,"recordKey")),je=new A.Option("--debug","Enable debug logging").env(R(L,"debug")).default(!1),Ke=new A.Option("--id <id>","The ID the data is saved under in the cache"),er=new A.Option("--paths <paths>","Comma-separated list of paths to cache").argParser(q),me=(t=>(t.lastRun="last-run",t))(me||{}),$e=new A.Option("--preset <preset-name>",'A set of predefined options. Use "last-run" to get the last run data').choices(Object.values(me)),tr=new A.Option("--output-dir <dir>","Path to the directory where output will be written"),Ve=new A.Option("--pw-output-dir <dir>","Directory for artifacts produced by Playwright tests").default("test-results"),rr=new A.Option("--include-hidden","Include hidden files in the cache").hideHelp().default(!1),de=".currents_env",or=new A.Option("--pw-config-dump <path>","Path to the file containing the Playwright configuration dump").default(de);var C=require("lodash");var ue=s.extend("ci"),ln=(e,...t)=>(0,C.chain)(t).compact().join(e).value(),fn=(e,t)=>(0,C.set)(e,(0,C.camelCase)(t),process.env[t]),g=e=>(0,C.transform)(e,fn,{}),gn=()=>process.env.TF_BUILD&&process.env.TF_BUILD_BUILDNUMBER,Cn=()=>process.env.TF_BUILD&&process.env.AZURE_HTTP_USER_AGENT,En=()=>(0,C.some)(process.env,(e,t)=>/^CODEBUILD_/.test(t)),hn=()=>process.env.bamboo_buildNumber,Rn=()=>process.env.CI_NAME&&process.env.CI_NAME==="codeship"&&process.env.CODESHIP,_n=()=>process.env.CI_NAME&&process.env.CI_NAME==="codeship"&&!process.env.CODESHIP,In=()=>(0,C.some)(process.env,(e,t)=>/^CONCOURSE_/.test(t)),Tn=()=>process.env.GITLAB_CI||process.env.CI_SERVER_NAME&&/^GitLab/.test(process.env.CI_SERVER_NAME),On=()=>process.env.GCP_PROJECT||process.env.GCLOUD_PROJECT||process.env.GOOGLE_CLOUD_PROJECT,yn=()=>process.env.JENKINS_URL||process.env.JENKINS_HOME||process.env.JENKINS_VERSION||process.env.HUDSON_URL||process.env.HUDSON_HOME,Pn=()=>process.env.WERCKER||process.env.WERCKER_MAIN_PIPELINE_STARTED,bn={appveyor:"APPVEYOR",azure:Cn,awsCodeBuild:En,bamboo:hn,bitbucket:"BITBUCKET_BUILD_NUMBER",buildkite:"BUILDKITE",circle:"CIRCLECI",codeshipBasic:Rn,codeshipPro:_n,concourse:In,codeFresh:"CF_BUILD_ID",drone:"DRONE",githubActions:"GITHUB_ACTIONS",gitlab:Tn,goCD:"GO_JOB_NAME",googleCloud:On,jenkins:yn,semaphore:"SEMAPHORE",shippable:"SHIPPABLE",teamcity:"TEAMCITY_VERSION",teamfoundation:gn,travis:"TRAVIS",wercker:Pn,netlify:"NETLIFY",layerci:"LAYERCI"};function An(){let{env:e}=process;return(0,C.findKey)(bn,t=>{if((0,C.isString)(t))return e[t];if((0,C.isFunction)(t))return t()})}var nr=()=>({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_PULL_REQUEST","CIRCLE_REPOSITORY_URL","CI_PULL_REQUEST"]),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","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"])}),Un=()=>{let{env:e}=process;return{appveyor:{sha:e.APPVEYOR_REPO_COMMIT,branch:e.APPVEYOR_PULL_REQUEST_HEAD_REPO_BRANCH||e.APPVEYOR_REPO_BRANCH,message:ln(`
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}}},ir=e=>{let t=sr();return t?(0,C.chain)(e()).get(t).value():{}};function wn(){return(0,C.chain)(nr()).omitBy(C.isNull).keys().value()}function Sn(e){return e&&wn().includes(e)}function sr(){let e=An();return ue("detected CI provider name: %s",e),e||null}function Dn(){return ir(nr)}function ar(){return ir(Un)}function W(e){let t=Dn(),r=sr(),o=xn(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 xn(e,t){return e?{source:"user",value:e}:Sn(t)?{source:"server",value:null}:{source:"random",value:`auto:${ve()}`}}var cr=c(require("archiver")),Je=c(require("fs-extra")),G=c(require("path")),pr=c(require("unzipper"));var Nn=50*1024*1024;async function mr(e,t={},r=Nn){return new Promise((o,n)=>{let a=(0,cr.default)("zip",{zlib:{level:9}}),p=[],m=0;a.on("data",d=>{p.push(d),m+=d.length,m>r&&n(new Error(`Zip size exceeded the limit of ${r} bytes`))}),a.on("warning",d=>{d.code==="ENOENT"?f(d):n(d)}),a.on("error",d=>n(d)),a.on("end",()=>{let d=Buffer.concat(p);o(d)});let u=async d=>{let b=process.cwd(),S=G.default.normalize(d),_=G.default.relative(b,S),O=await Je.default.stat(_),y=G.default.dirname(_),$=y==="."?void 0:y;O.isDirectory()?a.directory(_,_,{prefix:$,stats:O}):a.file(S,{name:G.default.basename(_),prefix:$,stats:O})};(async d=>{for(let b of d)if(b==="."){let S=await Je.default.readdir(b);for(let _ of S)await u(_)}else await u(b);a.finalize()})(e).catch(n)})}async function dr(e,t){return pr.default.Open.buffer(e).then(r=>r.extract({path:t,concurrency:3}))}function ur(e){let t=process.cwd();return e.filter(r=>{let o=G.default.resolve(r),n=G.default.relative(t,o);return r.startsWith("..")||G.default.isAbsolute(n)?(f(`Invalid path: "${r}". Path traversal detected. The path was skipped.`),!1):!0})}var lr=c(require("path"));function fr({config:e,cacheId:t,orgId:r,paths:o,ci:n}){let a={id:t,orgId:r,config:e,paths:o,ci:n,createdAt:new Date().toISOString()};return Buffer.from(JSON.stringify(a))}var gr=e=>lr.default.resolve(e??"test-results",".last-run.json");function le(e,t){e instanceof Error?De("%s. %s.",t,e.message):De("%s. %s.",t,"Unknown error")}var _r=c(require("async-retry"));var Cr=c(require("axios")),Er=require("https-proxy-agent"),hr=c(require("proxy-from-env"));var vn=s.extend("axios");function Ye(e={}){let t=Cr.default.create(e);return t.interceptors.request.use(r=>{let o={...r},n=t.getUri(r),a=hr.default.getProxyForUrl(n);return a&&(vn("Using HTTP proxy %s for %s ",a,n),o.proxy=!1,o.httpsAgent=Ln(a)),o}),t}var fe=null;function Ln(e){return fe||(fe=new Er.HttpsProxyAgent(e),fe)}var qe=s.extend("upload"),ge=5;async function We(e,t,r){return qe("Uploading buffer %s",e.name,{buffer:Buffer.byteLength(e.buffer)}),Mn(e.buffer,e.uploadUrl,t,r)}async function Bn(e,t,r,o){return Ye().request({method:"put",url:t,data:e,onUploadProgress:o,headers:{"Content-Disposition":"inline","Content-Type":r}})}async function Qe(e,t){let r=await Ye().get(e,{responseType:"arraybuffer",onDownloadProgress:t});return Buffer.from(r.data)}async function Mn(...e){await(0,_r.default)(async()=>{await Bn(...e)},{retries:ge,onRetry:(t,r)=>{if(qe("Upload failed %d out of %d attempts: %s",r,ge,t.message),r===ge){l(`Cannot upload after ${r} times: ${t.message}`);return}f(`Upload failed ${r} out of ${ge} attempts: ${t.message}`)}})}var ze=e=>({total:t,loaded:r})=>{};function Rr(e){return e/1e3/1e3}var Xe=c(require("lodash"));async function Ir(e,t){switch(t.provider){case"githubActions":await Gn(e,t);break;case"gitlab":await Or(e,t);break;default:break}}async function Tr(e,t,r){switch(t.provider){case"gitlab":await Or(e,t,r);break;default:break}}async function Or(e,t,r=null){let n=(r?Q(r.ci.params?.runAttempt,0):0)+1,a=Q(process.env.CI_NODE_INDEX,1),p=Q(process.env.CI_NODE_TOTAL,1),m=n>1?"--last-failed":"",u="";p>1&&(u=n>1?"--shard=1/1":`--shard=${a}/${p}`);let w=[m,u].filter(Boolean).join(" ");await Y(e.pwConfigDump??de,`EXTRA_PW_FLAGS="${w}"
14
- RUN_ATTEMPT="${n}"
15
- `)}async function Gn(e,t){let r=Q(t.params.GITHUB_RUN_ATTEMPT,1),o=Q(process.env.GH_STRATEGY_NODE_INDEX,1),n=Q(process.env.GH_STRATEGY_JOB_TOTAL,1),a=r>1?"--last-failed":"",p="";n>1&&(p=r>1?"--shard=1/1":`--shard=${o}/${n}`);let m=[a,p].filter(Boolean).join(" ");await Y(e.pwConfigDump??de,m)}var Q=(e,t)=>{let r=Xe.default.toNumber(e);return Xe.default.isNaN(r)?t:r};async function Ze(){try{let e=B();if(e.type!=="GET_COMMAND_CONFIG"||!e.values)throw new Error("Config is missing!");let{recordKey:t,id:r,preset:o}=e.values,n=e.values.outputDir??e.values.pwOutputDir;e.values.debug&&v();let a=W();o==="last-run"&&await Ir(e.values,a);let p=await Gt({recordKey:t,ci:a,id:r});await Fn({readUrl:p.readUrl,outputDir:n});let m=await kn(p.metaReadUrl);o==="last-run"&&await Tr(e.values,a,m)}catch(e){le(e,"Failed to obtain cache")}}async function Fn({readUrl:e,outputDir:t}){try{let r=await Qe(e);await dr(r,t||"."),s("Cache downloaded")}catch(r){throw s("Failed to recreate cache from archive"),r}}async function kn(e){try{let t=await Qe(e),r=JSON.parse(t.toString("utf-8"));return console.log(r),s("Meta file: %O",r),r}catch(t){throw s("Failed to handle the meta"),t}}async function et(){try{let e=B();if(e.type!=="SET_COMMAND_CONFIG"||!e.values)throw new Error("Config is missing!");let{recordKey:t,id:r,debug:o,preset:n,pwOutputDir:a,includeHidden:p}=e.values;o&&v();let m=e.values.paths?ur(e.values.paths):[],u=[];m&&m.length>0&&u.push(...m);let w=W();if(n==="last-run"){let b=gr(a);u.push(b)}if(u.length===0)throw new Error("No paths available to upload");let d=await Mt({recordKey:t,ci:w,id:r});await Hn({archive:await mr(u,{includeHidden:p}),cacheId:d.cacheId,uploadUrl:d.uploadUrl}),await jn({meta:fr({cacheId:d.cacheId,config:e.values,ci:w,orgId:d.orgId,paths:u}),cacheId:d.cacheId,uploadUrl:d.metaUploadUrl})}catch(e){le(e,"Failed to save cache")}}async function Hn({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 jn({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 Pr=require("@currents/commit-info"),br=require("lodash");var Ce=require("lodash");var tt=s.extend("ci-git");function yr(e){tt("git commit existing info: %O",e);let t=ar();tt("commit info from provider environment variables: %O",t);let r=(0,Ce.transform)(e,(o,n,a)=>{let p=n||(t?t[a]:null);return o[a]=(0,Ce.defaultTo)(p,null)});return tt("combined git and environment variables from provider: %O",r),r}var Kn=async()=>{let e=await(0,Pr.commitInfo)();return yr({branch:e.branch,remoteOrigin:e.remote,authorEmail:e.email,authorName:e.author,message:e.message,sha:e.sha,ghaEventData:e.ghaEventData})},Ar=(0,br.memoize)(Kn);var Ur=c(require("getos")),wr=require("lodash"),P=require("os"),Sr=require("util"),$n=async()=>{if((0,P.platform)()==="linux")try{let e=await(0,Sr.promisify)(Ur.default)();return"dist"in e&&"release"in e?[e.dist,e.release].join(" - "):(0,P.release)()}catch{return(0,P.release)()}return(0,P.release)()},Vn=async()=>{let e=await $n();return{osName:(0,P.platform)(),osVersion:e,osCpus:[],osMemory:{free:(0,P.freemem)(),total:(0,P.totalmem)()}}},Dr=(0,wr.memoize)(Vn);var Xr=require("lodash"),Te=c(require("path")),Zr=c(require("semver"));var h={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 xr(){return{projectId:process.env[h.projectId.env],recordKey:process.env[h.recordKey.env],ciBuildId:process.env[h.ciBuildId.env],tag:process.env[h.tag.env]?process.env[h.tag.env]?.split(",").map(e=>e.trim()):void 0,disableTitleTags:!!process.env[h.disableTitleTags.env],removeTitleTags:!!process.env[h.removeTitleTags.env],debug:!!process.env[h.debug.env],machineId:process.env[h.machineId.env]}}var Jn=s.extend("config"),Yn=["projectId","recordKey"],rt=null;function Nr(e){rt=H(h,Yn,xr,e),Jn("Resolved Currents config: %o",rt)}function Ee(){return rt}function vr(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 Vr=c(require("fs-extra")),Jr=require("jest-cli"),Yr=c(require("tmp"));var Kr=require("lodash");var Lr=require("lodash"),qn=["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 Br(e){return(0,Lr.omit)(e,...qn)}function Mr(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 kr=c(require("fs")),Hr=require("jest-config"),ot=require("lodash"),nt=c(require("path"));function he(e,t){return(...r)=>new Promise((o,n)=>{let a=0,p=()=>{a++;try{let m=e(...r);o(m)}catch(m){if(a>=t.length)n(m);else{let u=t[a-1];setTimeout(p,u)}}};p()})}var Gr=c(require("fs-extra")),Wn=c(require("path"));async function Re(e){let t=await Gr.default.pathExists(e);if(!t)throw new Error("File does not exist");return t}var Fr=s.extend("jest-discovery");async function jr(e){try{let{config:t,configPath:r}=await(0,Hr.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(u=>typeof u!="string"?(0,ot.omit)(u,n):u)),a.rootDir&&Object.keys(a).length===1)return null;let p=nt.default.resolve(r?nt.default.dirname(r):process.cwd(),`.jest-scanner-${new Date().getTime()}.config.js`),m=`module.exports=${JSON.stringify(a,null,2)}`;return Fr("configFileContent: %O",m),kr.default.writeFileSync(p,m),await he(Re,[200,200,200,200,200,1e3])(p),p}catch(t){return l("Failed to recreate the config file"),Fr("error %o",t),null}}async function $r(e){let t="!!##ThisPatternWillNotMatchAnyTestName##!!",r=e.options,o=Br(r),n=Mr(o),a=r.config,p=await jr(a);return{cliArgs:[n,"--testNamePattern",t,"--reporters","@currents/cmd/discovery/jest","--shard=1/1",p?`--config=${p}`:"",...e.args].filter(u=>!(0,Kr.isEmpty)(u)),configFilePath:p}}var Qn=s.extend("jest-discovery");async function qr(e,t){console.time(E("@currents/jest:fullTestSuite-ready"));let{cliArgs:r,configFilePath:o}=await $r(t);try{let n=Yr.default.fileSync({postfix:".json"});return Qn("running scanner: %o",r),process.env.CURRENTS_DISCOVERY_PATH=n.name,await(0,Jr.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 l("Failed to obtain the jest full test suite:",n),[]}finally{o&&Vr.default.unlinkSync(o)}}var z=class{constructor(t){this.config=t}async getFullTestSuite(){return[]}};var _e=class extends z{constructor(t){super(t)}async getFullTestSuite(){return qr(this.config.frameworkConfig,this.config.cliArgs)}};function Wr(e){switch(e.framework){case"jest":return new _e(e);default:return new z(e)}}var X=c(require("fs-extra")),x=c(require("path"));async function Qr(e){let t=await zn(e?.reportDir);if(!t)throw new Error("Failed to find the report dir");return{reportDir:t,configFilePath:e?.configFilePath??x.default.join(t,"config.json")}}async function zn(e){return e?(await Ie(e),e):Xn((0,x.join)(process.cwd(),".currents"))}async function Xn(e){let t=await X.default.readdir(e),r=null;for(let o of t){let n=x.default.join(e,o),a=await X.default.stat(n);a.isDirectory()&&(!r||a.birthtime>r.birthtime)&&(r={name:o,birthtime:a.birthtime})}return r?(0,x.resolve)(e,r.name):null}async function Ie(e){try{return await X.default.pathExists(e)}catch{return l("Error checking if path exists:",l),!1}}async function zr(e){let t=x.default.join(e,"instances");return Zn(t)}async function Zn(e){let t=await X.default.readdir(e),r=[];for(let o of t){let n=x.default.join(e,o);(await X.default.stat(n)).isFile()&&r.push(n)}return r}async function it(){let e=Ee();if(!e)throw new Error("Currents config is missing!");e.debug&&v();let t=await Qr(e);pt(oi(t.reportDir)),s("Reporter options: %o",t),k("Report directory: %s",t.reportDir);let r=await j(t.configFilePath);s("Report config: %o",r);let o=await zr(t.reportDir);s("Found %d instance results in the reportDir: %s",o.length,t.reportDir);let n=ti(t.reportDir),a=await Ie(n),p=ri(t.reportDir),m=null;if(a){let O=await j(n);f("Marker file detected. The report was already uploaded: %o",{runUrl:O.response.runUrl,isoDate:O.isoDate}),await Ie(p)&&(m=await j(p),s("Full test suite file detected: %s",p))}if(m)s("The discovery stage was skipped");else{if(m=await Wr(r).getFullTestSuite(),ni(m))throw new Error("Failed to discover the full test suite!");await Y(p,JSON.stringify(m))}let u=m.length===1?m[0].name:null,w={currents:e},d={type:r.framework,version:r.frameworkVersion,clientVersion:re},b=se.userFacingNanoid(),S=W(e.ciBuildId),_={};for await(let O of o){let y=await j(O);_[y.groupId]||(_[y.groupId]=[]),_[y.groupId].push(y)}for await(let O of Object.keys(_)){let y=_[O],$=O;u&&(s("Default group found: %s, overwriting the group in the results",u),$=u,y=y.map(F=>({...F,groupId:u})));try{let F=await ei({ci:S,group:$,instances:y,fullTestSuite:m,config:w,machineId:b,framework:d});s("Api response: %o",F),k("[%s] Run created: %s",$,F.runUrl);let vo={response:F,isoDate:new Date().toISOString()};await Y(n,JSON.stringify(vo)),s("Marker file %s: %s",a?"overwritten":"created",n)}catch(F){throw s("Failed to upload the results to the dashboard"),F}}}async function ei({ci:e,group:t,instances:r,fullTestSuite:o,config:n,machineId:a,framework:p}){let m=await Ar(),u=await Dr(),w={browserName:"node",browserVersion:Zr.default.coerce(process.version)?.version},{currents:d}=n,S={platform:{...w,...u},ci:e,commit:m,group:t,fullTestSuite:o,config:n,projectId:d.projectId,recordKey:d.recordKey,ciBuildId:e.ciBuildId.value??void 0,tags:d.tag??[],machineId:d.machineId??a,framework:p,instances:r};return s("Creating run: %o",(0,Xr.mapValues)(S,(_,O)=>O==="recordKey"?"******":_)),jt(S)}function ti(e){return Te.default.join(e,"upload.marker.json")}function ri(e){return Te.default.join(e,"fullTestSuite.json")}function oi(e){return Te.default.join(e,`.debug-${new Date().toISOString()}.log`)}function ni(e){return e.length===0||e.some(t=>t.tests.length===0)}var ii=s.extend("cli");async function eo(e){await M(async t=>{ft(t);let r=ne();ii("Config: %o",r),await Fe()},e)}var N=require("@commander-js/extra-typings");var to=new N.Option("--api-key <api-key>","API key from Currents dashboard for authentication").env(R(D,"apiKey")),ro=new N.Option("-o, --output <path>","Path to the file where output will be written").env(R(D,"output")),oo=new N.Option("--ci-build-id <id>","Unique identifier for the run"),no=new N.Option("-p, --project-id <project>","Project ID from Currents associated with the run").env(R(D,"projectId")),io=new N.Option("-t, --tag <tag>","Comma-separated list of tags for the run").argParser(q),so=new N.Option("--debug","Enable debug logging").env(R(D,"debug")).default(!1),ao=new N.Option("-b, --branch <branch>","Branch name for the recorded run"),co=new N.Option("--pw-last-run",'Generate output formatted for Playwright ".last-run.json"');var Oe="api",si=e=>`
12
+ `]:["Unexpected network error"]}var Dt=a.extend("http");async function H(e,t,r=bt){try{let o=await r(e).request(t);return Dt("network response: %o",{...Nt.default.omit(o,"request","config"),url:o.config.url,method:o.config.method}),o}catch(o){let n=o;throw Dt("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}),St(n),n}}var ae=a.extend("api");async function Lt(e){try{return ae("Request params: %o",e),H("api",{url:"cache/upload",method:"POST",data:e}).then(t=>t.data)}catch(t){throw ae("Failed to create cache:",t),t}}async function Bt(e){try{return ae("Request params: %o",e),H("api",{url:"cache/download",method:"POST",data:e}).then(t=>t.data)}catch(t){throw ae("Failed to retrieve cache:",t),t}}var Gt=require("util"),kt=require("zlib");var Mt=a.extend("api"),mn=(0,Gt.promisify)(kt.gzip);async function Ft(e){try{Mt("Run params: %o",e);let t=await dn(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 Mt("Failed to create the run:",t),t}}async function dn(e){try{return await mn(e)}catch(t){throw l("Failed to compress run payload:",t),t}}var Ht=a.extend("api");async function jt(e,t){try{return Ht("Run params: %o",t),H("restApi",{url:"v1/runs/previous",params:t,method:"GET",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`}}).then(r=>r.data)}catch(r){throw Ht("Failed to obtain run data:",r),r}}async function Be(){try{let e=te();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 un(e.pwLastRun&&r.data.pwLastRun?r.data.pwLastRun:r.data,e)}catch(e){throw a("Failed to get run data"),e}}async function un(e,t){let r=JSON.stringify(e,null,2);t.output?(await gt(t.output),await(0,Kt.writeFile)(t.output,r,"utf-8")):G(r)}var Tr=require("axios");var O=require("@commander-js/extra-typings");var ln={recordKey:{name:"Record Key",env:"CURRENTS_RECORD_KEY",cli:"--key"},debug:{name:"Debug",env:"CURRENTS_DEBUG",cli:"--debug"}},gn={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"}},fn={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"}},N={...ln,...gn,...fn};function Me(){return{recordKey:process.env[N.recordKey.env],debug:process.env[N.debug.env]}}var $t=a.extend("config"),Vt=["recordKey"],z;function Jt(e){z={type:"SET_COMMAND_CONFIG",values:k(N,Vt,Me,e)},$t("Resolved config: %o",z)}function Yt(e){z={type:"GET_COMMAND_CONFIG",values:k(N,Vt,Me,e)},$t("Resolved config: %o",z)}function v(){return z}function qt(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}}function Wt(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 Qt=require("@commander-js/extra-typings");var zt=require("axios");function $(e,t=[]){return e?t.concat(e.split(",").map(r=>r.trim())):t}async function L(e,t){try{t.debug&&it(),await e(t),process.exit(0)}catch(r){r instanceof Qt.CommanderError&&(l(r.message),process.exit(r.exitCode)),r instanceof j&&(l(r.message),process.exit(1)),(0,zt.isAxiosError)(r)&&(l(r.message),process.exit(1)),l("Script execution failed: %o",r),process.exit(1)}}var Ge=new O.Option("-k, --key <record-key>","Your secret Record Key obtained from Currents").env(I(N,"recordKey")),ke=new O.Option("--debug","Enable debug logging").env(I(N,"debug")).default(!1),Fe=new O.Option("--id <id>","The ID the data is saved under in the cache"),Xt=new O.Option("--path <path>","Comma-separated list of paths to cache").argParser($),se=(t=>(t.lastRun="last-run",t))(se||{}),He=new O.Option("--preset <preset-name>",'A set of predefined options. Use "last-run" to get the last run data').choices(Object.values(se)),Zt=new O.Option("--output-dir <dir>","Path to the directory where output will be written"),er=new O.Option("--pw-output-dir <dir>","Directory for artifacts produced by Playwright tests").default("test-results"),ce=".currents_env",tr=new O.Option("--preset-output <path>","Path to the file containing the preset output").default(ce),je=new O.Option("--matrix-index <number>","The index of the matrix to use").default(1).argParser(rr),Ke=new O.Option("--matrix-total <number>","The total number of matrices available").default(1).argParser(rr);function rr(e){let t=parseInt(e,10);if(isNaN(t)||t<=0||!Number.isInteger(t))throw new O.InvalidArgumentError("A positive integer is expected.");return t}var C=require("lodash");var pe=a.extend("ci"),Cn=(e,...t)=>(0,C.chain)(t).compact().join(e).value(),En=(e,t)=>(0,C.set)(e,(0,C.camelCase)(t),process.env[t]),f=e=>(0,C.transform)(e,En,{}),Rn=()=>process.env.TF_BUILD&&process.env.TF_BUILD_BUILDNUMBER,hn=()=>process.env.TF_BUILD&&process.env.AZURE_HTTP_USER_AGENT,In=()=>(0,C.some)(process.env,(e,t)=>/^CODEBUILD_/.test(t)),_n=()=>process.env.bamboo_buildNumber,Tn=()=>process.env.CI_NAME&&process.env.CI_NAME==="codeship"&&process.env.CODESHIP,On=()=>process.env.CI_NAME&&process.env.CI_NAME==="codeship"&&!process.env.CODESHIP,yn=()=>(0,C.some)(process.env,(e,t)=>/^CONCOURSE_/.test(t)),Pn=()=>process.env.GITLAB_CI||process.env.CI_SERVER_NAME&&/^GitLab/.test(process.env.CI_SERVER_NAME),bn=()=>process.env.GCP_PROJECT||process.env.GCLOUD_PROJECT||process.env.GOOGLE_CLOUD_PROJECT,An=()=>process.env.JENKINS_URL||process.env.JENKINS_HOME||process.env.JENKINS_VERSION||process.env.HUDSON_URL||process.env.HUDSON_HOME,xn=()=>process.env.WERCKER||process.env.WERCKER_MAIN_PIPELINE_STARTED,Un={appveyor:"APPVEYOR",azure:hn,awsCodeBuild:In,bamboo:_n,bitbucket:"BITBUCKET_BUILD_NUMBER",buildkite:"BUILDKITE",circle:"CIRCLECI",codeshipBasic:Tn,codeshipPro:On,concourse:yn,codeFresh:"CF_BUILD_ID",drone:"DRONE",githubActions:"GITHUB_ACTIONS",gitlab:Pn,goCD:"GO_JOB_NAME",googleCloud:bn,jenkins:An,semaphore:"SEMAPHORE",shippable:"SHIPPABLE",teamcity:"TEAMCITY_VERSION",teamfoundation:Rn,travis:"TRAVIS",wercker:xn,netlify:"NETLIFY",layerci:"LAYERCI"};function wn(){let{env:e}=process;return(0,C.findKey)(Un,t=>{if((0,C.isString)(t))return e[t];if((0,C.isFunction)(t))return t()})}var or=()=>({appveyor:f(["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:f(["BUILD_BUILDID","BUILD_BUILDNUMBER","BUILD_CONTAINERID","BUILD_REPOSITORY_URI","SYSTEM_TEAMPROJECT","SYSTEM_COLLECTIONURI"]),awsCodeBuild:f(["CODEBUILD_BUILD_ID","CODEBUILD_BUILD_NUMBER","CODEBUILD_RESOLVED_SOURCE_VERSION","CODEBUILD_SOURCE_REPO_URL","CODEBUILD_SOURCE_VERSION"]),bamboo:f(["bamboo_buildNumber","bamboo_buildResultsUrl","bamboo_planRepository_repositoryUrl","bamboo_buildKey"]),bitbucket:f(["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:f(["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:f(["CIRCLE_JOB","CIRCLE_BUILD_NUM","CIRCLE_BUILD_URL","CIRCLE_PR_NUMBER","CIRCLE_PR_REPONAME","CIRCLE_PR_USERNAME","CIRCLE_COMPARE_URL","CIRCLE_WORKFLOW_ID","CIRCLE_PULL_REQUEST","CIRCLE_REPOSITORY_URL","CI_PULL_REQUEST"]),codeshipBasic:f(["CI_BUILD_ID","CI_REPO_NAME","CI_BUILD_URL","CI_PROJECT_ID","CI_BUILD_NUMBER","CI_PULL_REQUEST"]),codeshipPro:f(["CI_BUILD_ID","CI_REPO_NAME","CI_PROJECT_ID"]),concourse:f(["BUILD_ID","BUILD_NAME","BUILD_JOB_NAME","BUILD_PIPELINE_NAME","BUILD_TEAM_NAME","ATC_EXTERNAL_URL"]),codeFresh:f(["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:f(["DRONE_JOB_NUMBER","DRONE_BUILD_LINK","DRONE_BUILD_NUMBER","DRONE_PULL_REQUEST"]),githubActions:f(["GITHUB_WORKFLOW","GITHUB_ACTION","GITHUB_EVENT_NAME","GITHUB_RUN_ID","GITHUB_RUN_ATTEMPT","GITHUB_REPOSITORY"]),gitlab:f(["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:f(["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:f(["BUILD_ID","PROJECT_ID","REPO_NAME","BRANCH_NAME","TAG_NAME","COMMIT_SHA","SHORT_SHA"]),jenkins:f(["BUILD_ID","BUILD_URL","BUILD_NUMBER","ghprbPullId"]),semaphore:f(["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:f(["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:f(["BUILD_BUILDID","BUILD_BUILDNUMBER","BUILD_CONTAINERID"]),travis:f(["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:f(["BUILD_ID","CONTEXT","URL","DEPLOY_URL","DEPLOY_PRIME_URL","DEPLOY_ID"]),layerci:f(["LAYERCI_JOB_ID","LAYERCI_RUNNER_ID","RETRY_INDEX","LAYERCI_PULL_REQUEST","LAYERCI_REPO_NAME","LAYERCI_REPO_OWNER","LAYERCI_BRANCH","GIT_TAG"])}),Sn=()=>{let{env:e}=process;return{appveyor:{sha:e.APPVEYOR_REPO_COMMIT,branch:e.APPVEYOR_PULL_REQUEST_HEAD_REPO_BRANCH||e.APPVEYOR_REPO_BRANCH,message:Cn(`
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}}},nr=e=>{let t=ir();return t?(0,C.chain)(e()).get(t).value():{}};function Dn(){return(0,C.chain)(or()).omitBy(C.isNull).keys().value()}function Nn(e){return e&&Dn().includes(e)}function ir(){let e=wn();return pe("detected CI provider name: %s",e),e||null}function vn(){return nr(or)}function ar(){return nr(Sn)}function V(e){let t=vn(),r=ir(),o=Ln(e,r);return pe("detected CI provider: %s",r),pe("detected CI params: %O",t),pe("detected CI build ID: %o",o),{params:t,provider:r,ciBuildId:o}}function Ln(e,t){return e?{source:"user",value:e}:Nn(t)?{source:"server",value:null}:{source:"random",value:`auto:${Se()}`}}var sr=p(require("archiver")),cr=p(require("fs-extra")),J=p(require("path")),pr=p(require("unzipper"));var Bn=50*1024*1024;async function mr(e,t=Bn){return new Promise((r,o)=>{let n=(0,sr.default)("zip",{zlib:{level:9}}),s=[],d=0;n.on("data",c=>{s.push(c),d+=c.length,d>t&&o(new Error(`Zip size exceeded the limit of ${t} bytes`))}),n.on("warning",c=>{c.code==="ENOENT"?g(c):o(c)}),n.on("error",c=>o(c)),n.on("end",()=>{let c=Buffer.concat(s);r(c)});let m=async c=>{let E=process.cwd(),D=J.default.normalize(c),B=J.default.relative(E,D),P=await cr.default.stat(c);P.isDirectory()?n.directory(c,B):n.file(c,{name:B,stats:P})};(async c=>{for(let E of c)await m(E);await n.finalize()})(e).catch(o)})}async function dr(e,t){return pr.default.Open.buffer(e).then(r=>r.extract({path:t,concurrency:3}))}function ur(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)?(g(`Invalid path: "${r}". Path traversal detected. The path was skipped.`),!1):!0})}var Er=p(require("async-retry")),Rr=require("axios");var lr=p(require("axios")),gr=require("https-proxy-agent"),fr=p(require("proxy-from-env"));var Mn=a.extend("axios");function $e(e={}){let t=lr.default.create(e);return t.interceptors.request.use(r=>{let o={...r},n=t.getUri(r),s=fr.default.getProxyForUrl(n);return s&&(Mn("Using HTTP proxy %s for %s ",s,n),o.proxy=!1,o.httpsAgent=Gn(s)),o}),t}var me=null;function Gn(e){return me||(me=new gr.HttpsProxyAgent(e),me)}var ue=a.extend("upload"),de=5;async function Ve(e,t,r){return ue("Uploading buffer %s",e.name,{buffer:Buffer.byteLength(e.buffer)}),Fn(e.buffer,e.uploadUrl,t,r)}async function kn(e,t,r,o){return $e().request({method:"put",url:t,data:e,onUploadProgress:o,headers:{"Content-Disposition":"inline","Content-Type":r}})}async function Je(e,t){try{let r=await $e().get(e,{responseType:"arraybuffer",onDownloadProgress:t});return Buffer.from(r.data)}catch(r){throw(0,Rr.isAxiosError)(r)&&ue("Failed to download %s: %s",e,r.message),r}}async function Fn(...e){await(0,Er.default)(async()=>{await kn(...e)},{retries:de,onRetry:(t,r)=>{if(ue("Upload failed %d out of %d attempts: %s",r,de,t.message),r===de){l(`Cannot upload after ${r} times: ${t.message}`);return}g(`Upload failed ${r} out of ${de} attempts: ${t.message}`)}})}var Ye=e=>({total:t,loaded:r})=>{};function Cr(e){return e/1e3/1e3}var qe=p(require("lodash"));async function hr(e,t){switch(t.provider){case"githubActions":await Hn(e,t);break;case"gitlab":await _r(e,t);break;default:break}}async function Ir(e,t,r){switch(t.provider){case"gitlab":await _r(e,t,r);break;default:break}}async function _r(e,t,r=null){let o=t.params,n=r?.ci.params,d=(n?le(n.runAttempt,0):0)+1,m=le(o.ciNodeIndex,1),u=le(o.ciNodeTotal,1),c=d>1?"--last-failed":"",E="";u>1&&(E=d>1?"--shard=1/1":`--shard=${m}/${u}`);let D=[c,E].filter(Boolean).join(" ");await K(e.presetOutput??ce,`EXTRA_PW_FLAGS="${D}"
14
+ EXTRA_PWCP_FLAGS="${c}"
15
+ RUN_ATTEMPT="${d}"
16
+ `)}async function Hn(e,t){let{matrixIndex:r,matrixTotal:o}=e,n=t.params,s=le(n.githubRunAttempt,1),d=s>1?"--last-failed":"",m="";o>1&&(m=s>1?"--shard=1/1":`--shard=${r}/${o}`);let u=[d,m].filter(Boolean).join(" "),c=e.presetOutput??ce;await K(c,u),a('Dumped PW config: "%s" for GHA to %s',u,c)}var le=(e,t)=>{let r=qe.default.toNumber(e);return qe.default.isNaN(r)?t:r};async function We(){let e=v();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}=e.values,d=e.values.outputDir,m=V();o==="last-run"&&await hr(e.values,m);let u=await Bt({recordKey:t,ci:m,id:r,config:{matrixIndex:n,matrixTotal:s}});try{await jn({readUrl:u.readUrl,outputDir:d});let c=await Kn(u.metaReadUrl);o==="last-run"&&await Ir(e.values,m,c)}catch(c){throw(0,Tr.isAxiosError)(c)&&c.response?.status&&(c.response?.status===403||c.response?.status===404)?new Error(`Cache with ID "${u.cacheId}" not found`):c}}async function jn({readUrl:e,outputDir:t}){let r=await Je(e);await dr(r,t||"."),a("Cache downloaded")}async function Kn(e){let t=await Je(e),r=JSON.parse(t.toString("utf-8"));return a("Meta file: %O",r),r}var Or=p(require("path"));var yr=require("lodash");function Pr({config:e,cacheId:t,orgId:r,path:o,ci:n}){let s={id:t,orgId:r,config:(0,yr.omit)(e,"recordKey"),path:o,ci:n,createdAt:new Date().toISOString()};return Buffer.from(JSON.stringify(s))}var br=e=>Or.default.resolve(e??"test-results",".last-run.json");async function Qe(){let e=v();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:d}=e.values,m=e.values.path?ur(e.values.path):[],u=[];m&&m.length>0&&u.push(...m);let c=V();if(o==="last-run"){let D=br(n);u.push(D)}if(u.length===0)throw new Error("No paths available to upload");let E=await Lt({recordKey:t,ci:c,id:r,config:{matrixIndex:s,matrixTotal:d}});await $n({archive:await mr(u),cacheId:E.cacheId,uploadUrl:E.uploadUrl}),await Vn({meta:Pr({cacheId:E.cacheId,config:e.values,ci:c,orgId:E.orgId,path:u}),cacheId:E.cacheId,uploadUrl:E.metaUploadUrl})}async function $n({archive:e,cacheId:t,uploadUrl:r}){try{let o="application/zip";await Ve({buffer:e,contentType:o,name:t,uploadUrl:r},o,Ye(t)),a("Cache archive uploaded",{cacheId:t})}catch(o){throw a("Failed to upload cache archive",o),o}}async function Vn({meta:e,cacheId:t,uploadUrl:r}){try{let o=`${t}_meta`,n="application/json";await Ve({buffer:e,contentType:n,name:o,uploadUrl:r},n,Ye(o)),a("Cache meta uploaded",{cacheId:t})}catch(o){throw a("Failed to upload cache meta",o),o}}var xr=require("@currents/commit-info"),Ur=require("lodash");var ge=require("lodash");var ze=a.extend("ci-git");function Ar(e){ze("git commit existing info: %O",e);let t=ar();ze("commit info from provider environment variables: %O",t);let r=(0,ge.transform)(e,(o,n,s)=>{let d=n||(t?t[s]:null);return o[s]=(0,ge.defaultTo)(d,null)});return ze("combined git and environment variables from provider: %O",r),r}var Jn=async()=>{let e=await(0,xr.commitInfo)();return Ar({branch:e.branch,remoteOrigin:e.remote,authorEmail:e.email,authorName:e.author,message:e.message,sha:e.sha,ghaEventData:e.ghaEventData})},wr=(0,Ur.memoize)(Jn);var Sr=p(require("getos")),Dr=require("lodash"),y=require("os"),Nr=require("util"),Yn=async()=>{if((0,y.platform)()==="linux")try{let e=await(0,Nr.promisify)(Sr.default)();return"dist"in e&&"release"in e?[e.dist,e.release].join(" - "):(0,y.release)()}catch{return(0,y.release)()}return(0,y.release)()},qn=async()=>{let e=await Yn();return{osName:(0,y.platform)(),osVersion:e,osCpus:[],osMemory:{free:(0,y.freemem)(),total:(0,y.totalmem)()}}},vr=(0,Dr.memoize)(qn);var to=require("lodash"),Ie=p(require("path")),ro=p(require("semver"));var h={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 Lr(){return{projectId:process.env[h.projectId.env],recordKey:process.env[h.recordKey.env],ciBuildId:process.env[h.ciBuildId.env],tag:process.env[h.tag.env]?process.env[h.tag.env]?.split(",").map(e=>e.trim()):void 0,disableTitleTags:!!process.env[h.disableTitleTags.env],removeTitleTags:!!process.env[h.removeTitleTags.env],debug:!!process.env[h.debug.env],machineId:process.env[h.machineId.env]}}var Wn=a.extend("config"),Qn=["projectId","recordKey"],Xe=null;function Br(e){Xe=k(h,Qn,Lr,e),Wn("Resolved Currents config: %o",Xe)}function fe(){return Xe}function Mr(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 qr=p(require("fs-extra")),Wr=require("jest-cli"),Qr=p(require("tmp"));var Jr=require("lodash");var Gr=require("lodash"),zn=["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,Gr.omit)(e,...zn)}function Fr(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 Kr=p(require("fs")),$r=require("jest-config"),Ze=require("lodash"),et=p(require("path"));function Ce(e,t){return(...r)=>new Promise((o,n)=>{let s=0,d=()=>{s++;try{let m=e(...r);o(m)}catch(m){if(s>=t.length)n(m);else{let u=t[s-1];setTimeout(d,u)}}};d()})}var Hr=p(require("fs-extra")),Xn=p(require("path"));async function Ee(e){let t=await Hr.default.pathExists(e);if(!t)throw new Error("File does not exist");return t}var jr=a.extend("jest-discovery");async function Vr(e){try{let{config:t,configPath:r}=await(0,$r.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,Ze.omit)(t,o);if(s.projects&&(s.projects=s.projects.map(u=>typeof u!="string"?(0,Ze.omit)(u,n):u)),s.rootDir&&Object.keys(s).length===1)return null;let d=et.default.resolve(r?et.default.dirname(r):process.cwd(),`.jest-scanner-${new Date().getTime()}.config.js`),m=`module.exports=${JSON.stringify(s,null,2)}`;return jr("configFileContent: %O",m),Kr.default.writeFileSync(d,m),await Ce(Ee,[200,200,200,200,200,1e3])(d),d}catch(t){return l("Failed to recreate the config file"),jr("error %o",t),null}}async function Yr(e){let t="!!##ThisPatternWillNotMatchAnyTestName##!!",r=e.options,o=kr(r),n=Fr(o),s=r.config,d=await Vr(s);return{cliArgs:[n,"--testNamePattern",t,"--reporters","@currents/cmd/discovery/jest","--shard=1/1",d?`--config=${d}`:"",...e.args].filter(u=>!(0,Jr.isEmpty)(u)),configFilePath:d}}var Zn=a.extend("jest-discovery");async function zr(e,t){console.time(R("@currents/jest:fullTestSuite-ready"));let{cliArgs:r,configFilePath:o}=await Yr(t);try{let n=Qr.default.fileSync({postfix:".json"});return Zn("running scanner: %o",r),process.env.CURRENTS_DISCOVERY_PATH=n.name,await(0,Wr.run)(r.concat(["--openHandlesTimeout=0"])),await Ce(Ee,Array.from({length:300},()=>100))(n.name),console.timeEnd(R("@currents/jest:fullTestSuite-ready")),await F(n.name)}catch(n){return l("Failed to obtain the jest full test suite:",n),[]}finally{o&&qr.default.unlinkSync(o)}}var Y=class{constructor(t){this.config=t}async getFullTestSuite(){return[]}};var Re=class extends Y{constructor(t){super(t)}async getFullTestSuite(){return zr(this.config.frameworkConfig,this.config.cliArgs)}};function Xr(e){switch(e.framework){case"jest":return new Re(e);default:return new Y(e)}}var q=p(require("fs-extra")),w=p(require("path"));async function Zr(e){let t=await ei(e?.reportDir);if(!t)throw new Error("Failed to find the report dir");return{reportDir:t,configFilePath:e?.configFilePath??w.default.join(t,"config.json")}}async function ei(e){return e?(await he(e),e):ti((0,w.join)(process.cwd(),".currents"))}async function ti(e){let t=await q.default.readdir(e),r=null;for(let o of t){let n=w.default.join(e,o),s=await q.default.stat(n);s.isDirectory()&&(!r||s.birthtime>r.birthtime)&&(r={name:o,birthtime:s.birthtime})}return r?(0,w.resolve)(e,r.name):null}async function he(e){try{return await q.default.pathExists(e)}catch{return l("Error checking if path exists:",l),!1}}async function eo(e){let t=w.default.join(e,"instances");return ri(t)}async function ri(e){let t=await q.default.readdir(e),r=[];for(let o of t){let n=w.default.join(e,o);(await q.default.stat(n)).isFile()&&r.push(n)}return r}async function tt(){let e=fe();if(!e)throw new Error("Currents config is missing!");let t=await Zr(e);at(ai(t.reportDir)),a("Reporter options: %o",t),G("Report directory: %s",t.reportDir);let r=await F(t.configFilePath);a("Report config: %o",r);let o=await eo(t.reportDir);a("Found %d instance results in the reportDir: %s",o.length,t.reportDir);let n=ni(t.reportDir),s=await he(n),d=ii(t.reportDir),m=null;if(s){let b=await F(n);g("Marker file detected. The report was already uploaded: %o",{runUrl:b.response.runUrl,isoDate:b.isoDate}),await he(d)&&(m=await F(d),a("Full test suite file detected: %s",d))}if(m)a("The discovery stage was skipped");else{if(m=await Xr(r).getFullTestSuite(),si(m))throw new Error("Failed to discover the full test suite!");await K(d,JSON.stringify(m))}let u=m.length===1?m[0].name:null,c={currents:e},E={type:r.framework,version:r.frameworkVersion,clientVersion:Z},D=oe.userFacingNanoid(),B=V(e.ciBuildId),P={};for await(let b of o){let x=await F(b);P[x.groupId]||(P[x.groupId]=[]),P[x.groupId].push(x)}for await(let b of Object.keys(P)){let x=P[b],Pe=b;u&&(a("Default group found: %s, overwriting the group in the results",u),Pe=u,x=x.map(M=>({...M,groupId:u})));try{let M=await oi({ci:B,group:Pe,instances:x,fullTestSuite:m,config:c,machineId:D,framework:E});a("Api response: %o",M),G("[%s] Run created: %s",Pe,M.runUrl);let Mo={response:M,isoDate:new Date().toISOString()};await K(n,JSON.stringify(Mo)),a("Marker file %s: %s",s?"overwritten":"created",n)}catch(M){throw a("Failed to upload the results to the dashboard"),M}}}async function oi({ci:e,group:t,instances:r,fullTestSuite:o,config:n,machineId:s,framework:d}){let m=await wr(),u=await vr(),c={browserName:"node",browserVersion:ro.default.coerce(process.version)?.version},{currents:E}=n,B={platform:{...c,...u},ci:e,commit:m,group:t,fullTestSuite:o,config:n,projectId:E.projectId,recordKey:E.recordKey,ciBuildId:e.ciBuildId.value??void 0,tags:E.tag??[],machineId:E.machineId??s,framework:d,instances:r};return a("Creating run: %o",(0,to.mapValues)(B,(P,b)=>b==="recordKey"?"******":P)),Ft(B)}function ni(e){return Ie.default.join(e,"upload.marker.json")}function ii(e){return Ie.default.join(e,"fullTestSuite.json")}function ai(e){return Ie.default.join(e,`.debug-${new Date().toISOString()}.log`)}function si(e){return e.length===0||e.some(t=>t.tests.length===0)}var ci=a.extend("cli");async function oo(e){await L(async t=>{ut(t);let r=te();ci("Config: %o",r),await Be()},e)}var S=require("@commander-js/extra-typings");var no=new S.Option("--api-key <api-key>","API key from Currents dashboard for authentication").env(I(U,"apiKey")),io=new S.Option("-o, --output <path>","Path to the file where output will be written").env(I(U,"output")),ao=new S.Option("--ci-build-id <id>","Unique identifier for the run"),so=new S.Option("-p, --project-id <project>","Project ID from Currents associated with the run").env(I(U,"projectId")),co=new S.Option("-t, --tag <tag>","Comma-separated list of tags for the run").argParser($),po=new S.Option("--debug","Enable debug logging").env(I(U,"debug")).default(!1),mo=new S.Option("-b, --branch <branch>","Branch name for the recorded run"),uo=new S.Option("--pw-last-run",'Generate output formatted for Playwright ".last-run.json"');var _e="api",pi=e=>`
16
17
 
17
- ${po.default.bold("Examples")}
18
+ ${lo.default.bold("Examples")}
18
19
 
19
20
  Obtain run data by --ci-build-id:
20
- ${E(`${e} ${Oe} get-run --api-key <api-key> --ci-build-id <ci-build-id>`)}
21
+ ${R(`${e} ${_e} get-run --api-key <api-key> --ci-build-id <ci-build-id>`)}
21
22
 
22
23
  Obtain most recent run data by filters:
23
- ${E(`${e} ${Oe} get-run --api-key <api-key> --project-id <project-id> --branch <branch> --tag tagA,tagB`)}
24
+ ${R(`${e} ${_e} get-run --api-key <api-key> --project-id <project-id> --branch <branch> --tag tagA,tagB`)}
24
25
 
25
26
  Obtain last run data that matches the Playwright "test-results/.last-run.json":
26
- ${E(`${e} ${Oe} get-run --api-key <api-key> --ci-build-id <ci-build-id> --pw-last-run --output <output-path>`)}
27
+ ${R(`${e} ${_e} get-run --api-key <api-key> --ci-build-id <ci-build-id> --pw-last-run --output <output-path>`)}
27
28
 
28
- `,mo=e=>new st.Command().command(Oe).description(`Receive information from Currents API ${si(e)}`).showHelpAfterError("(add --help for additional information)").allowUnknownOption().addCommand(ai()),ai=()=>new st.Command().name("get-run").allowUnknownOption().addOption(to).addOption(so).addOption(oo).addOption(no).addOption(ao).addOption(io).addOption(ro).addOption(co).action(eo);var ye=require("@commander-js/extra-typings");var fo=c(require("chalk"));var ci=s.extend("cli");async function uo(e){await M(async t=>{Wt(Qt(t));let r=B();ci("Config: %o",{...r.values,recordKey:r.values?.recordKey?"*****":void 0}),await Ze()},e)}var pi=s.extend("cli");async function lo(e){await M(async t=>{qt(zt(t));let r=B();pi("Config: %o",{...r.values,recordKey:r.values?.recordKey?"*****":void 0}),await et()},e)}var Z="cache",mi=e=>`
29
+ `,go=e=>new rt.Command().command(_e).showHelpAfterError("(add --help for additional information)").allowUnknownOption().addCommand(mi(e)),mi=e=>new rt.Command().name("get-run").description(`Receive information from Currents API ${pi(e)}`).allowUnknownOption().addOption(no).addOption(po).addOption(ao).addOption(so).addOption(mo).addOption(co).addOption(io).addOption(uo).action(oo);var Te=require("@commander-js/extra-typings");var Eo=p(require("chalk"));var di=a.extend("cli");async function fo(e){await L(async t=>{Yt(qt(t));let r=v();di("Config: %o",{...r.values,recordKey:r.values?.recordKey?"*****":void 0}),await We()},e)}var ui=a.extend("cli");async function Co(e){await L(async t=>{Jt(Wt(t));let r=v();ui("Config: %o",{...r.values,recordKey:r.values?.recordKey?"*****":void 0}),await Qe()},e)}var W="cache",li=e=>`
29
30
 
30
- ${fo.default.bold("Examples")}
31
+ ${Eo.default.bold("Examples")}
31
32
 
32
33
  Save files to the cache under a specific ID:
33
- ${E(`${e} ${Z} set --key <record-key> --id <id> --paths <path-1,path-2,...path-n>`)}
34
+ ${R(`${e} ${W} set --key <record-key> --id <id> --path <path-1,path-2,...path-n>`)}
34
35
 
35
36
  Retrieve files from the cache saved under a specific ID:
36
- ${E(`${e} ${Z} get --key <record-key> --id <id>`)}
37
+ ${R(`${e} ${W} get --key <record-key> --id <id>`)}
37
38
 
38
39
  Store the last run data in the cache:
39
- ${E(`${e} ${Z} set --key <record-key> --preset last-failed-sharding`)}
40
+ ${R(`${e} ${W} set --key <record-key> --preset last-run`)}
40
41
 
41
42
  Retrieve the last run data from the cache:
42
- ${E(`${e} ${Z} get --key <record-key> --preset last-failed-sharding`)}
43
+ ${R(`${e} ${W} get --key <record-key> --preset last-run`)}
43
44
 
44
45
  Retrieve the last run data from the cache and save it to a custom directory:
45
- ${E(`${e} ${Z} get --key <record-key> --preset last-failed-sharding --outputDir <outputDir>`)}
46
+ ${R(`${e} ${W} get --key <record-key> --preset last-run --output-dir <outputDir>`)}
46
47
 
47
- `,go=e=>new ye.Command().command(Z).description(`Cache data to Currents ${mi(e)}`).showHelpAfterError("(add --help for additional information)").allowUnknownOption().addCommand(di()).addCommand(ui()),di=()=>new ye.Command().name("set").allowUnknownOption().addOption(He).addOption(Ke).addOption($e).addOption(er).addOption(rr).addOption(je).addOption(Ve).action(lo),ui=()=>new ye.Command().name("get").allowUnknownOption().addOption(He).addOption(Ke).addOption($e).addOption(tr).addOption(Ve.conflicts("output-dir")).addOption(or).addOption(je).action(uo);var wo=require("@commander-js/extra-typings"),So=c(require("chalk"));var U=require("@commander-js/extra-typings");var Co=new U.Option("--ci-build-id <id>","the unique identifier for the recorded build (run)").env(R(h,"ciBuildId")),Eo=new U.Option("-k, --key <record-key>","your secret Record Key obtained from Currents").env(R(h,"recordKey")),ho=new U.Option("-p, --project-id <project>","the project ID for results reporting obtained from Currents").env(R(h,"projectId")),Ro=new U.Option("-t, --tag <tag>","comma-separated tag(s) for recorded runs in Currents").argParser(q),_o=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),Io=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),To=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(h,"machineId")),Oo=new U.Option("--report-dir <string>","explicit path to the report directory").env(R(h,"reportDir")),yo=new U.Option("--debug","enable debug logs").env(R(h,"debug")).default(!1);var Ao=c(require("fs"));var Po=require("tmp-promise"),bo=async()=>{let{path:e}=await(0,Po.file)();return e};var at=s.extend("cli"),Pe=class{constructor(t){this.configFilePath=null;this.cliOptions=t,at("CLI options: %o",this.cliOptions),this.parsedConfig=vr(this.cliOptions),at("Parsed config from CLI options: %o",this.parsedConfig)}async getConfigFilePath(){if(this.configFilePath)return this.configFilePath;let t=await bo();return Ao.default.writeFileSync(t,JSON.stringify(this.parsedConfig)),at("CLI options temp file path: %s",t),this.configFilePath=t,t}};async function Uo(e){await M(async t=>{let r=new Pe(t);Nr(r.parsedConfig);let o=Ee();k("Currents config: %o",{...o,recordKey:o?.recordKey?"*****":void 0}),await it()},e)}var te="upload",li=e=>`
48
+ `,Ro=e=>new Te.Command().command(W).description(`Cache data to Currents ${li(e)}`).showHelpAfterError("(add --help for additional information)").allowUnknownOption().addCommand(gi()).addCommand(fi()),gi=()=>new Te.Command().name("set").allowUnknownOption().addOption(Ge).addOption(Fe).addOption(He).addOption(Xt).addOption(ke).addOption(er).addOption(je).addOption(Ke).action(Co),fi=()=>new Te.Command().name("get").allowUnknownOption().addOption(Ge).addOption(Fe).addOption(He).addOption(Zt).addOption(tr).addOption(ke).addOption(je).addOption(Ke).action(fo);var Do=require("@commander-js/extra-typings"),No=p(require("chalk"));var A=require("@commander-js/extra-typings");var ho=new A.Option("--ci-build-id <id>","the unique identifier for the recorded build (run)").env(I(h,"ciBuildId")),Io=new A.Option("-k, --key <record-key>","your secret Record Key obtained from Currents").env(I(h,"recordKey")),_o=new A.Option("-p, --project-id <project>","the project ID for results reporting obtained from Currents").env(I(h,"projectId")),To=new A.Option("-t, --tag <tag>","comma-separated tag(s) for recorded runs in Currents").argParser($),Oo=new A.Option("--remove-title-tags","remove tags from test names in Currents, e.g. `Test name @smoke` becomes `Test name` in the dashboard").default(!1),yo=new A.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),Po=new A.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(I(h,"machineId")),bo=new A.Option("--report-dir <string>","explicit path to the report directory").env(I(h,"reportDir")),Ao=new A.Option("--debug","enable debug logs").env(I(h,"debug")).default(!1);var wo=p(require("fs"));var xo=require("tmp-promise"),Uo=async()=>{let{path:e}=await(0,xo.file)();return e};var ot=a.extend("cli"),Oe=class{constructor(t){this.configFilePath=null;this.cliOptions=t,ot("CLI options: %o",this.cliOptions),this.parsedConfig=Mr(this.cliOptions),ot("Parsed config from CLI options: %o",this.parsedConfig)}async getConfigFilePath(){if(this.configFilePath)return this.configFilePath;let t=await Uo();return wo.default.writeFileSync(t,JSON.stringify(this.parsedConfig)),ot("CLI options temp file path: %s",t),this.configFilePath=t,t}};async function So(e){await L(async t=>{let r=new Oe(t);Br(r.parsedConfig);let o=fe();G("Currents config: %o",{...o,recordKey:o?.recordKey?"*****":void 0}),await tt()},e)}var X="upload",Ci=e=>`
48
49
 
49
- ${So.default.bold("Examples")}
50
+ ${No.default.bold("Examples")}
50
51
 
51
52
  Upload test results to Currents:
52
- ${E(`${e} ${te} --key <record-key> --project-id <id> --ci-build-id <build-id>`)}
53
+ ${R(`${e} ${X} --key <record-key> --project-id <id> --ci-build-id <build-id>`)}
53
54
 
54
55
  Upload test results to Currents, add tags "tagA", "tagB" to the recorded run:
55
- ${E(`${e} ${te} --key <record-key> --project-id <id> --ci-build-id <build-id> --tag tagA --tag tagB`)}
56
+ ${R(`${e} ${X} --key <record-key> --project-id <id> --ci-build-id <build-id> --tag tagA --tag tagB`)}
56
57
 
57
58
  Provide a custom path to the reports directory:
58
- ${E(`${e} ${te} --key <record-key> --project-id <id> --ci-build-id <build-id> --report-dir <report-dir>`)}
59
+ ${R(`${e} ${X} --key <record-key> --project-id <id> --ci-build-id <build-id> --report-dir <report-dir>`)}
59
60
 
60
- `,Do=e=>new wo.Command().name(te).command(te).showHelpAfterError("(add --help for additional information)").allowUnknownOption().description(`Upload test results generated by Currents reporters to https://currents.dev
61
- ${li(e)}`).addOption(Co).addOption(Eo).addOption(ho).addOption(Ro).addOption(_o).addOption(Io).addOption(To).addOption(yo).addOption(Oo).action(r=>Uo(r));var fi=`
61
+ `,vo=e=>new Do.Command().name(X).command(X).showHelpAfterError("(add --help for additional information)").allowUnknownOption().description(`Upload test results generated by Currents reporters to https://currents.dev
62
+ ${Ci(e)}`).addOption(ho).addOption(Io).addOption(_o).addOption(To).addOption(Oo).addOption(yo).addOption(Po).addOption(Ao).addOption(bo).action(r=>So(r));var Ei=`
62
63
  ----------------------------------------------------
63
64
  \u{1F4D6} Documentation: https://docs.currents.dev
64
65
  \u{1F919} Support: support@currents.dev
65
66
  ----------------------------------------------------
66
- `,be="currents",No=()=>new xo.Command(be).version(re).description(`Currents CLI ${fi}`).addCommand(Do(be),{isDefault:!0}).addCommand(go(be)).addCommand(mo(be));import("dotenv/config");function gi(){No().parse()}gi();
67
+ `,ye="currents",Bo=()=>new Lo.Command(ye).version(Z).description(`Currents CLI ${Ei}`).addCommand(vo(ye),{isDefault:!0}).addCommand(Ro(ye)).addCommand(go(ye));import("dotenv/config");function Ri(){Bo().parse()}Ri();
67
68
  /*! For license information please see index.js.LEGAL.txt */
68
69
  //# sourceMappingURL=index.js.map
package/dist/index.d.ts CHANGED
@@ -1,9 +1,9 @@
1
1
  declare function handleCurrentsReport(): Promise<void>;
2
2
 
3
- type TestCaseStatus = "passed" | "failed" | "pending";
4
- type TestRunnerStatus = "passed" | "failed" | "skipped";
5
- type ExpectedStatus = "passed" | "skipped";
6
- type JestTestCaseStatus = "pending" | "todo" | "failed" | "passed";
3
+ type TestCaseStatus = 'passed' | 'failed' | 'pending';
4
+ type TestRunnerStatus = 'passed' | 'failed' | 'skipped';
5
+ type ExpectedStatus = 'passed' | 'skipped';
6
+ type JestTestCaseStatus = 'pending' | 'todo' | 'failed' | 'passed';
7
7
  type InstanceReportStats = {
8
8
  suites: number;
9
9
  tests: number;
package/dist/index.js CHANGED
@@ -1,12 +1,12 @@
1
- "use strict";var Tt=Object.create;var D=Object.defineProperty;var ht=Object.getOwnPropertyDescriptor;var Ot=Object.getOwnPropertyNames;var Pt=Object.getPrototypeOf,Ut=Object.prototype.hasOwnProperty;var ae=(e,t)=>{for(var r in t)D(e,r,{get:t[r],enumerable:!0})},ce=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Ot(t))!Ut.call(e,o)&&o!==r&&D(e,o,{get:()=>t[o],enumerable:!(n=ht(t,o))||n.enumerable});return e};var u=(e,t,r)=>(r=e!=null?Tt(Pt(e)):{},ce(t||!e||!e.__esModule?D(r,"default",{value:e,enumerable:!0}):r,e)),At=e=>ce(D({},"__esModule",{value:!0}),e);var Or={};ae(Or,{handleCurrentsReport:()=>ft});module.exports=At(Or);var Y=require("debug"),St=u(require("fs-extra")),i=(0,Y.debug)("currents"),Lt=null;function ue(){Y.debug.enable("currents,currents:*")}function me(e){Lt=e}var B={};ae(B,{getNanoid:()=>Nt,userFacingNanoid:()=>q});var $=require("nanoid"),pe="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",Nt=(e=16)=>(0,$.customAlphabet)(pe,e)(),q=(0,$.customAlphabet)(pe,12);var m=require("lodash");var y=i.extend("ci"),Dt=(e,...t)=>(0,m.chain)(t).compact().join(e).value(),Bt=(e,t)=>(0,m.set)(e,(0,m.camelCase)(t),process.env[t]),c=e=>(0,m.transform)(e,Bt,{}),yt=()=>process.env.TF_BUILD&&process.env.TF_BUILD_BUILDNUMBER,bt=()=>process.env.TF_BUILD&&process.env.AZURE_HTTP_USER_AGENT,Mt=()=>(0,m.some)(process.env,(e,t)=>/^CODEBUILD_/.test(t)),vt=()=>process.env.bamboo_buildNumber,xt=()=>process.env.CI_NAME&&process.env.CI_NAME==="codeship"&&process.env.CODESHIP,wt=()=>process.env.CI_NAME&&process.env.CI_NAME==="codeship"&&!process.env.CODESHIP,Ht=()=>(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),Gt=()=>process.env.GCP_PROJECT||process.env.GCLOUD_PROJECT||process.env.GOOGLE_CLOUD_PROJECT,kt=()=>process.env.JENKINS_URL||process.env.JENKINS_HOME||process.env.JENKINS_VERSION||process.env.HUDSON_URL||process.env.HUDSON_HOME,jt=()=>process.env.WERCKER||process.env.WERCKER_MAIN_PIPELINE_STARTED,Vt={appveyor:"APPVEYOR",azure:bt,awsCodeBuild:Mt,bamboo:vt,bitbucket:"BITBUCKET_BUILD_NUMBER",buildkite:"BUILDKITE",circle:"CIRCLECI",codeshipBasic:xt,codeshipPro:wt,concourse:Ht,codeFresh:"CF_BUILD_ID",drone:"DRONE",githubActions:"GITHUB_ACTIONS",gitlab:Ft,goCD:"GO_JOB_NAME",googleCloud:Gt,jenkins:kt,semaphore:"SEMAPHORE",shippable:"SHIPPABLE",teamcity:"TEAMCITY_VERSION",teamfoundation:yt,travis:"TRAVIS",wercker:jt,netlify:"NETLIFY",layerci:"LAYERCI"};function Kt(){let{env:e}=process;return(0,m.findKey)(Vt,t=>{if((0,m.isString)(t))return e[t];if((0,m.isFunction)(t))return t()})}var le=()=>({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_PULL_REQUEST","CIRCLE_REPOSITORY_URL","CI_PULL_REQUEST"]),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","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"])}),Jt=()=>{let{env:e}=process;return{appveyor:{sha:e.APPVEYOR_REPO_COMMIT,branch:e.APPVEYOR_PULL_REQUEST_HEAD_REPO_BRANCH||e.APPVEYOR_REPO_BRANCH,message:Dt(`
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=de();return t?(0,m.chain)(e()).get(t).value():{}};function Yt(){return(0,m.chain)(le()).omitBy(m.isNull).keys().value()}function $t(e){return e&&Yt().includes(e)}function de(){let e=Kt();return y("detected CI provider name: %s",e),e||null}function qt(){return Ee(le)}function ge(){return Ee(Jt)}function _e(e){let t=qt(),r=de(),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}:$t(t)?{source:"server",value:null}:{source:"random",value:`auto:${q()}`}}var Ie=require("@currents/commit-info"),fe=require("lodash");var b=require("lodash");var Q=i.extend("ci-git");function Re(e){Q("git commit existing info: %O",e);let t=ge();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 Wt=async()=>{let e=await(0,Ie.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,fe.memoize)(Wt);var Te=u(require("getos")),he=require("lodash"),I=require("os"),Oe=require("util"),zt=async()=>{if((0,I.platform)()==="linux")try{let e=await(0,Oe.promisify)(Te.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)()},Xt=async()=>{let e=await zt();return{osName:(0,I.platform)(),osVersion:e,osCpus:[],osMemory:{free:(0,I.freemem)(),total:(0,I.totalmem)()}}},Pe=(0,he.memoize)(Xt);var Ue={name:"@currents/cmd",version:"1.1.0-beta.9",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 Ae=Ue.version;var er=[];function W(e){er.push(e)}var R=u(require("chalk")),L=u(require("util"));var Se=[],Le=[];var Ne=(...e)=>{let t=L.default.format(...e);W(t),console.log(t)},tr=(...e)=>{let t=L.default.format(...e);W(t),console.error(t)},z=Ne,E=(...e)=>{let t=L.default.format(...e);return Le.push(t),i("WARNING: ",t),Ne(R.default.bgYellow.black(" WARNING "),t)};var d=(...e)=>{let t=L.default.format(...e);return Se.push(t),i("ERROR: ",t),tr(R.default.bgRed.white(" ERROR "),t)};var 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 X=u(require("fs-extra")),or=require("path");async function P(e){try{return await X.default.readJson(e)}catch(t){throw d("Error while reading JSON file: %s",e,t),d}}async function Z(e,t){try{return await X.default.writeFile(e,t,"utf8"),e}catch(r){throw d(`Error writing file at ${e}:`,r),r}}var Rt=require("lodash"),V=u(require("path")),It=u(require("semver"));var $e=u(require("lodash"));var we=u(require("axios")),He=u(require("axios-retry")),Fe=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",Be=()=>3e4;var te=require("axios"),re=u(require("pretty-ms"));var ye=i.extend("http"),x=e=>[3*1e3,15*1e3,30*1e3][e-1],be=e=>(ye("isRetriableError: %o",{message:e.message,code:"code"in e?e.code:void 0,status:"response"in e?e.response?.status:void 0,headers:"response"in e?e.response?.headers:void 0,data:"response"in e?e.response?.data:void 0,isAxiosError:(0,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),w=()=>3;function Me(e,t,r){ye("Network request '%s' failed: '%s'. Next attempt is in %s (%d/%d).",`${r.method?.toUpperCase()} ${r.url}`,t.message,(0,re.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,re.default)(x(e)),e,w())}var ve=i.extend("http");var oe={api:null,restApi:null};function nr(e){let t=we.default.create({baseURL:e==="api"?ee():De(),timeout:Be(),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?ve("network request retry: %o",xe({...o,isRetry:!0})):ve("network request: %o",xe(o)),r}),(0,He.default)(t,{retries:w(),retryCondition:be,retryDelay:x,shouldResetTimeout:!0,onRetry:Me}),t}function Ge(e){return oe[e]===null&&(oe[e]=nr(e)),oe[e]}function xe(e){return{method:e.method,baseUrl:ee(),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 Ve=require("axios"),Ke=u(require("lodash")),g=require("ts-pattern");function Je(e){(0,g.match)(e).when(Ve.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:ke.MISSING_SUITE,message:g.P.string,errors:g.P.array(g.P.string)},async r=>{let{message:n,errors:o}=r;M(1),d(...je(n,o))}).with({code:ke.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(...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 ke={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,`
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 hr={};ie(hr,{handleCurrentsReport:()=>It});module.exports=Ut(hr);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)),Ht=()=>process.env.GITLAB_CI||process.env.CI_SERVER_NAME&&/^GitLab/.test(process.env.CI_SERVER_NAME),Ft=()=>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:Ht,goCD:"GO_JOB_NAME",googleCloud:Ft,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_PULL_REQUEST","CIRCLE_REPOSITORY_URL","CI_PULL_REQUEST"]),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.1.1-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")),L=u(require("util"));var Ae=[],Se=[];var Le=(...e)=>{let t=L.default.format(...e);Q(t),console.log(t)},er=(...e)=>{let t=L.default.format(...e);Q(t),console.error(t)},W=Le,E=(...e)=>{let t=L.default.format(...e);return Se.push(t),i("WARNING: ",t),Le(R.default.bgYellow.black(" WARNING "),t)};var d=(...e)=>{let t=L.default.format(...e);return Ae.push(t),i("ERROR: ",t),er(R.default.bgRed.white(" ERROR "),t)};var M=(e=2)=>console.log(Array(e).fill("").join(`
3
+ `)),ro=R.default.cyan,oo=R.default.blueBright,no=R.default.red,so=R.default.yellow,io=R.default.green,ao=R.default.gray,co=R.default.white,uo=R.default.black,mo=R.default.magenta,v=R.default.dim,po=R.default.bold;var z=u(require("fs-extra")),rr=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")),He=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 or(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={...He.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 Fe(e){return re[e]===null&&(re[e]=or(e)),re[e]}function ve(e){return{method:e.method,baseUrl:Z(),url:e.url,data:e.isRetry?"<retry>":nr(e.data),headers:{...e.headers,"x-currents-key":"***"}}}function nr(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,sr).otherwise(()=>{E("Unexpected error while sending network request: %s",e)})}function sr(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=>{ir(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 ir(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,()=>{ar(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 ar(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,`
8
8
  ${(t??[]).map(r=>` - ${r}`).join(`
9
9
  `)}
10
- `]:["Unexpected network error"]}var Ye=i.extend("http");async function H(e,t,r=Ge){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 rn=i.extend("api");var We=require("util"),ze=require("zlib");var Qe=i.extend("api"),ur=(0,We.promisify)(ze.gzip);async function Xe(e){try{Qe("Run params: %o",e);let t=await mr(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 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 Ze(){return pr}var mt=u(require("fs-extra")),pt=require("jest-cli"),lt=u(require("tmp"));var ct=require("lodash");var et=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 tt(e){return(0,et.omit)(e,...lr)}function rt(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 st=u(require("fs")),it=require("jest-config"),ne=require("lodash"),se=u(require("path"));function F(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 ot=u(require("fs-extra")),Er=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(_=>typeof _!="string"?(0,ne.omit)(_,o):_)),a.rootDir&&Object.keys(a).length===1)return null;let p=se.default.resolve(r?se.default.dirname(r):process.cwd(),`.jest-scanner-${new Date().getTime()}.config.js`),l=`module.exports=${JSON.stringify(a,null,2)}`;return nt("configFileContent: %O",l),st.default.writeFileSync(p,l),await F(G,[200,200,200,200,200,1e3])(p),p}catch(t){return d("Failed to recreate the config file"),nt("error %o",t),null}}async function ut(e){let t="!!##ThisPatternWillNotMatchAnyTestName##!!",r=e.options,n=tt(r),o=rt(n),a=r.config,p=await at(a);return{cliArgs:[o,"--testNamePattern",t,"--reporters","@currents/cmd/discovery/jest","--shard=1/1",p?`--config=${p}`:"",...e.args].filter(_=>!(0,ct.isEmpty)(_)),configFilePath:p}}var dr=i.extend("jest-discovery");async function Et(e,t){console.time(v("@currents/jest:fullTestSuite-ready"));let{cliArgs:r,configFilePath:n}=await ut(t);try{let o=lt.default.fileSync({postfix:".json"});return dr("running scanner: %o",r),process.env.CURRENTS_DISCOVERY_PATH=o.name,await(0,pt.run)(r.concat(["--openHandlesTimeout=0"])),await F(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&&mt.default.unlinkSync(n)}}var A=class{constructor(t){this.config=t}async getFullTestSuite(){return[]}};var k=class extends A{constructor(t){super(t)}async getFullTestSuite(){return Et(this.config.frameworkConfig,this.config.cliArgs)}};function dt(e){switch(e.framework){case"jest":return new k(e);default:return new A(e)}}var S=u(require("fs-extra")),T=u(require("path"));async function gt(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 S.default.readdir(e),r=null;for(let n of t){let o=T.default.join(e,n),a=await S.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 S.default.pathExists(e)}catch{return d("Error checking if path exists:",d),!1}}async function _t(e){let t=T.default.join(e,"instances");return Rr(t)}async function Rr(e){let t=await S.default.readdir(e),r=[];for(let n of t){let o=T.default.join(e,n);(await S.default.stat(o)).isFile()&&r.push(o)}return r}async function ft(){let e=Ze();if(!e)throw new Error("Currents config is missing!");e.debug&&ue();let t=await gt(e);me(Tr(t.reportDir)),i("Reporter options: %o",t),z("Report directory: %s",t.reportDir);let r=await P(t.configFilePath);i("Report config: %o",r);let n=await _t(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 dt(r).getFullTestSuite(),hr(l))throw new Error("Failed to discover the full test suite!");await Z(p,JSON.stringify(l))}let _=l.length===1?l[0].name:null,K={currents:e},U={type:r.framework,version:r.frameworkVersion,clientVersion:Ae},ie=B.userFacingNanoid(),N=_e(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:ie,framework:U});i("Api response: %o",O),z("[%s] Run created: %s",J,O.runUrl);let Ct={response:O,isoDate:new Date().toISOString()};await Z(o,JSON.stringify(Ct)),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 Ce(),_=await Pe(),K={browserName:"node",browserVersion:It.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,Rt.mapValues)(N,(h,f)=>f==="recordKey"?"******":h)),Xe(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 Je=i.extend("http");async function H(e,t,r=Fe){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 tn=i.extend("api");var Qe=require("util"),We=require("zlib");var qe=i.extend("api"),cr=(0,Qe.promisify)(We.gzip);async function ze(e){try{qe("Run params: %o",e);let t=await ur(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 ur(e){try{return await cr(e)}catch(t){throw d("Failed to compress run payload:",t),t}}var dn=i.extend("api");var vn=i.extend("config");var mr=null;function Xe(){return mr}var ut=u(require("fs-extra")),mt=require("jest-cli"),pt=u(require("tmp"));var at=require("lodash");var Ze=require("lodash"),pr=["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,...pr)}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 F(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")),lr=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 F(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 Er=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 Er("running scanner: %o",r),process.env.CURRENTS_DISCOVERY_PATH=o.name,await(0,mt.run)(r.concat(["--openHandlesTimeout=0"])),await F(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 A=class{constructor(t){this.config=t}async getFullTestSuite(){return[]}};var k=class extends A{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 A(e)}}var S=u(require("fs-extra")),T=u(require("path"));async function dt(e){let t=await dr(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 dr(e){return e?(await j(e),e):gr((0,T.join)(process.cwd(),".currents"))}async function gr(e){let t=await S.default.readdir(e),r=null;for(let n of t){let o=T.default.join(e,n),a=await S.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 S.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 _r(t)}async function _r(e){let t=await S.default.readdir(e),r=[];for(let n of t){let o=T.default.join(e,n);(await S.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(Cr(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=Ir(t.reportDir),a=await j(o),p=fr(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(),Tr(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 Rr({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 Rr({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 Ir(e){return V.default.join(e,"upload.marker.json")}function fr(e){return V.default.join(e,"fullTestSuite.json")}function Cr(e){return V.default.join(e,`.debug-${new Date().toISOString()}.log`)}function Tr(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.1.0-beta.9",
3
+ "version": "1.1.1-beta.0",
4
4
  "main": "./dist/index.js",
5
5
  "author": "Currents Software Inc",
6
6
  "license": "GPL-3.0-or-later",