@currents/cmd 1.6.0 → 1.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/bin/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #! /usr/bin/env node
2
- "use strict";var $n=Object.create;var je=Object.defineProperty;var Vn=Object.getOwnPropertyDescriptor;var Jn=Object.getOwnPropertyNames;var qn=Object.getPrototypeOf,Yn=Object.prototype.hasOwnProperty;var Wn=(e,t)=>{for(var r in t)je(e,r,{get:t[r],enumerable:!0})},Qn=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Jn(t))!Yn.call(e,n)&&n!==r&&je(e,n,{get:()=>t[n],enumerable:!(o=Vn(t,n))||o.enumerable});return e};var p=(e,t,r)=>(r=e!=null?$n(qn(e)):{},Qn(t||!e||!e.__esModule?je(r,"default",{value:e,enumerable:!0}):r,e));var Bf=require("source-map-support/register");var Hn=require("@commander-js/extra-typings");var xt={name:"@currents/cmd",version:"1.6.0",main:"./dist/index.js",author:"Currents Software Inc",license:"MIT",description:"Currents CLI tools",scripts:{test:"vitest",rm:"rimraf dist",lint:'TIMING=1 eslint "**/*.ts*"',types:"tsc --noEmit",build:"tsup-node --minify --dts",dev:"tsup-node --watch --dts",release:"release-it","publish:npm":"npm run rm && npm run build && ./publish.js"},devDependencies:{"@jest/reporters":"^29.7.0","@jest/types":"^29.6.3","@release-it/conventional-changelog":"^7.0.2","@types/archiver":"^6.0.3","@types/async-retry":"^1.4.9","@types/debug":"^4.1.12","@types/fs-extra":"^11.0.4","@types/getos":"^3.0.4","@types/lodash":"^4.17.13","@types/node":"^20.14.2","@types/proxy-from-env":"^1.0.4","@types/semver":"^7.5.8","@types/tmp":"^0.2.6","@types/unzipper":"^0.10.10","@types/uuid":"^9.0.8","@types/xml2js":"^0.4.14",jest:"^29.7.0",rimraf:"^5.0.7",tsup:"^8.1.0",typescript:"^5.7.2",vitest:"^2.1.4"},dependencies:{"@commander-js/extra-typings":"^12.1.0","@currents/commit-info":"1.0.1-beta.0",archiver:"^7.0.1","async-retry":"^1.3.3",axios:"^1.7.2","axios-retry":"^4.5.0",chalk:"^4.1.2",commander:"^11.1.0",debug:"^4.3.5",dotenv:"^16.4.5",execa:"^9.5.1","fs-extra":"^11.2.0",getos:"^3.2.1",glob:"^11.0.0","https-proxy-agent":"^7.0.4","jest-cli":"^29.7.0","jest-config":"^29.7.0",lodash:"^4.17.21",nanoid:"^3.3.4","pretty-ms":"^7.0.1","proxy-from-env":"^1.1.0",semver:"^7.6.0","source-map-support":"^0.5.21",tmp:"^0.2.3","tmp-promise":"^3.0.3","ts-pattern":"^5.5.0",unzipper:"^0.12.3",uuid:"^11.0.3",xml2js:"^0.6.2"},bin:{currents:"./dist/bin/index.js","currents-cli":"./dist/bin/index.js"},files:["dist","!**/*.map","!**/*/*.map"],keywords:["cloud test dashboard","test reporter","test results","currents","currents dashboard","ci"],exports:{".":{import:"./dist/index.js",require:"./dist/index.js",types:"./dist/index.d.ts"},"./discovery/jest":{import:"./dist/services/upload/discovery/jest/reporter.js",require:"./dist/services/upload/discovery/jest/reporter.js",types:"./dist/services/upload/discovery/jest/reporter.d.ts"},"./package.json":"./package.json"},"release-it":{npm:{publish:!1},github:{release:!0,releaseName:"${npm.name} v${version}"},plugins:{"@release-it/conventional-changelog":{preset:"angular",header:"# Changelog",ignoreVersion:!0,infile:"./CHANGELOG.md"}},git:{commitMessage:"chore: release ${npm.name} v${version}",tagName:"${npm.name}-v${version}"}}};var ce=xt.version;var Tt=require("@commander-js/extra-typings");var Xn=[];function Ke(e){Xn.push(e)}var T=p(require("chalk")),N=p(require("util"));var $e=require("debug"),Zn=p(require("fs-extra")),s=(0,$e.debug)("currents"),ei=null;function bt(){$e.debug.enable("currents,currents:*")}function At(e){ei=e}var St=[],Ut=[];var me=(...e)=>{let t=N.default.format(...e);Ke(t),console.log(t)},ti=(...e)=>{let t=N.default.format(...e);Ke(t),console.error(t)},w=me,C=(...e)=>{let t=N.default.format(...e);return Ut.push(t),s("WARNING: ",t),me(T.default.bgYellow.black(" WARNING "),t)},$=(...e)=>{let t=N.default.format(...vt(e));return s("WARNING: ",N.default.format(...e)),me(T.default.bgYellow.black(" WARNING "),t)},pe=(...e)=>me(T.default.green.bold(N.default.format(...e))),f=(...e)=>{let t=N.default.format(...vt(e));return St.push(t),s("ERROR: ",N.default.format(...e)),ti(T.default.bgRed.white(" ERROR "),t)};var vt=e=>e.map(t=>t instanceof Error?t.message:t),ue=(e=2)=>console.log(Array(e).fill("").join(`
2
+ "use strict";var $n=Object.create;var je=Object.defineProperty;var Vn=Object.getOwnPropertyDescriptor;var Jn=Object.getOwnPropertyNames;var qn=Object.getPrototypeOf,Yn=Object.prototype.hasOwnProperty;var Wn=(e,t)=>{for(var r in t)je(e,r,{get:t[r],enumerable:!0})},Qn=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Jn(t))!Yn.call(e,n)&&n!==r&&je(e,n,{get:()=>t[n],enumerable:!(o=Vn(t,n))||o.enumerable});return e};var p=(e,t,r)=>(r=e!=null?$n(qn(e)):{},Qn(t||!e||!e.__esModule?je(r,"default",{value:e,enumerable:!0}):r,e));var Bf=require("source-map-support/register");var Hn=require("@commander-js/extra-typings");var xt={name:"@currents/cmd",version:"1.6.1",main:"./dist/index.js",author:"Currents Software Inc",license:"MIT",description:"Currents CLI tools",scripts:{test:"vitest",rm:"rimraf dist",lint:'TIMING=1 eslint "**/*.ts*"',types:"tsc --noEmit",build:"tsup-node --minify --dts",dev:"tsup-node --watch --dts",release:"release-it","publish:npm":"npm run rm && npm run build && ./publish.js"},devDependencies:{"@jest/reporters":"^29.7.0","@jest/types":"^29.6.3","@release-it/conventional-changelog":"^7.0.2","@types/archiver":"^6.0.3","@types/async-retry":"^1.4.9","@types/debug":"^4.1.12","@types/fs-extra":"^11.0.4","@types/getos":"^3.0.4","@types/lodash":"^4.17.13","@types/node":"^20.14.2","@types/proxy-from-env":"^1.0.4","@types/semver":"^7.5.8","@types/tmp":"^0.2.6","@types/unzipper":"^0.10.10","@types/uuid":"^9.0.8","@types/xml2js":"^0.4.14",jest:"^29.7.0",rimraf:"^5.0.7",tsup:"^8.1.0",typescript:"^5.7.2",vitest:"^2.1.4"},dependencies:{"@commander-js/extra-typings":"^12.1.0","@currents/commit-info":"1.0.1-beta.0",archiver:"^7.0.1","async-retry":"^1.3.3",axios:"^1.7.2","axios-retry":"^4.5.0",chalk:"^4.1.2",commander:"^11.1.0",debug:"^4.3.5",dotenv:"^16.4.5",execa:"^9.5.1","fs-extra":"^11.2.0",getos:"^3.2.1",glob:"^11.0.0","https-proxy-agent":"^7.0.4","jest-cli":"^29.7.0","jest-config":"^29.7.0",lodash:"^4.17.21",nanoid:"^3.3.4","pretty-ms":"^7.0.1","proxy-from-env":"^1.1.0",semver:"^7.6.0","source-map-support":"^0.5.21",tmp:"^0.2.3","tmp-promise":"^3.0.3","ts-pattern":"^5.5.0",unzipper:"^0.12.3",uuid:"^11.0.3",xml2js:"^0.6.2"},bin:{currents:"./dist/bin/index.js","currents-cli":"./dist/bin/index.js"},files:["dist","!**/*.map","!**/*/*.map"],keywords:["cloud test dashboard","test reporter","test results","currents","currents dashboard","ci"],exports:{".":{import:"./dist/index.js",require:"./dist/index.js",types:"./dist/index.d.ts"},"./discovery/jest":{import:"./dist/services/upload/discovery/jest/reporter.js",require:"./dist/services/upload/discovery/jest/reporter.js",types:"./dist/services/upload/discovery/jest/reporter.d.ts"},"./package.json":"./package.json"},"release-it":{npm:{publish:!1},github:{release:!0,releaseName:"${npm.name} v${version}"},plugins:{"@release-it/conventional-changelog":{preset:"angular",header:"# Changelog",ignoreVersion:!0,infile:"./CHANGELOG.md"}},git:{commitMessage:"chore: release ${npm.name} v${version}",tagName:"${npm.name}-v${version}"}}};var ce=xt.version;var Tt=require("@commander-js/extra-typings");var Xn=[];function Ke(e){Xn.push(e)}var T=p(require("chalk")),N=p(require("util"));var $e=require("debug"),Zn=p(require("fs-extra")),s=(0,$e.debug)("currents"),ei=null;function bt(){$e.debug.enable("currents,currents:*")}function At(e){ei=e}var St=[],Ut=[];var me=(...e)=>{let t=N.default.format(...e);Ke(t),console.log(t)},ti=(...e)=>{let t=N.default.format(...e);Ke(t),console.error(t)},w=me,C=(...e)=>{let t=N.default.format(...e);return Ut.push(t),s("WARNING: ",t),me(T.default.bgYellow.black(" WARNING "),t)},$=(...e)=>{let t=N.default.format(...vt(e));return s("WARNING: ",N.default.format(...e)),me(T.default.bgYellow.black(" WARNING "),t)},pe=(...e)=>me(T.default.green.bold(N.default.format(...e))),f=(...e)=>{let t=N.default.format(...vt(e));return St.push(t),s("ERROR: ",N.default.format(...e)),ti(T.default.bgRed.white(" ERROR "),t)};var vt=e=>e.map(t=>t instanceof Error?t.message:t),ue=(e=2)=>console.log(Array(e).fill("").join(`
3
3
  `)),ma=T.default.cyan,pa=T.default.blueBright,ua=T.default.red,da=T.default.yellow,la=T.default.green,fa=T.default.gray,ga=T.default.white,Ca=T.default.black,ha=T.default.magenta,l=T.default.dim,Ea=T.default.bold;var qo=p(require("chalk"));var de=class extends Error{};function Dt(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 oi(e,t){return e[t].cli}function ni(e,t){return e[t].name}function L(e,t,r,o){let n={...Dt(o),...Dt(r())};return t.forEach(a=>{if(!n[a])throw f(`${ni(e,a)} is required for Currents Reporter. Use the following methods to set the value:
4
4
  - as environment variable: ${l(I(e,a))}
5
5
  - as CLI flag of the command: ${l(oi(e,a))}`),new de("Missing required config variable")}),n}var ii={apiKey:{name:"Api Key",env:"CURRENTS_API_KEY",cli:"--api-key"},debug:{name:"Debug",env:"CURRENTS_DEBUG",cli:"--debug"}},si={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"}},M={...ii,...si};function Nt(){return{apiKey:process.env[M.apiKey.env],debug:!!process.env[M.debug.env]}}var ai=s.extend("config"),ci=["apiKey","projectId"],Ve=null;function Lt(e){Ve=L(M,ci,Nt,e),ai("Resolved config: %o",Ve)}function le(){return Ve}var W=p(require("fs-extra")),fe=require("path"),Mt=require("uuid");async function V(e){try{return await W.default.readJson(e)}catch(t){throw f("Error while reading JSON file: %s",e,t),f}}async function b(e,t){try{return await W.default.writeFile(e,t,"utf8"),e}catch(r){throw f(`Error writing file at ${e}:`,r),r}}async function Bt(e,t){if(t){await W.default.ensureDir(e);return}let r=(0,fe.dirname)(e);await W.default.ensureDir(r)}function mi(){let e=new Date().toISOString().replace(/[:.]/g,"-"),t=(0,Mt.v4)();return`${e}-${t}`}async function Ft(e,t){let r=mi(),o=(0,fe.join)(e,t,r);return ge(o)}async function ge(e){try{return await W.default.ensureDir(e),s("Folder created",e),e}catch(t){throw f(`Failed to create folder at ${e}:`,t),t}}var kt=p(require("crypto"));function Ce(e){return kt.createHash("sha256").update(e).digest("base64").slice(0,8).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}var he={};Wn(he,{getNanoid:()=>pi,userFacingNanoid:()=>qe});var Je=require("nanoid"),Gt="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",pi=(e=16)=>(0,Je.customAlphabet)(Gt,e)(),qe=(0,Je.customAlphabet)(Gt,12);var fr=require("fs/promises");var nr=p(require("lodash"));var Yt=p(require("axios")),Wt=p(require("axios-retry")),Qt=p(require("lodash"));var Ye=()=>process.env.CURRENTS_API_URL??"https://cy.currents.dev",Ht=()=>process.env.CURRENTS_REST_API_URL??"https://api.currents.dev",jt=()=>3e4;var We=require("axios"),Qe=p(require("pretty-ms"));var Kt=s.extend("http"),Ee=e=>[3*1e3,15*1e3,30*1e3][e-1],$t=e=>(Kt("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,We.isAxiosError)(e)}),"code"in e&&e.code&&["ECONNABORTED","ECONNREFUSED","ECONNRESET","ETIMEDOUT","ENETRESET"].includes(e.code)?!0:(0,We.isAxiosError)(e)?[429,502,503,504].includes(e.response?.status??0):!1),Re=()=>3;function Vt(e,t,r){Kt("Network request '%s' failed: '%s'. Next attempt is in %s (%d/%d).",`${r.method?.toUpperCase()} ${r.url}`,t.message,(0,Qe.default)(Ee(e)),e,Re()),C("Network request '%s' failed: '%s'. Next attempt is in %s (%d/%d).",`${r.method?.toUpperCase()} ${r.url}`,t.message,(0,Qe.default)(Ee(e)),e,Re())}var Jt=s.extend("http");var ze={api:null,restApi:null};function ui(e){let t=Yt.default.create({baseURL:e==="api"?Ye():Ht(),timeout:jt(),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={...Qt.default.pick(r,"method","url","headers"),data:Buffer.isBuffer(r.data)?"buffer":r.data};return o?Jt("network request retry: %o",qt({...n,isRetry:!0})):Jt("network request: %o",qt(n)),r}),(0,Wt.default)(t,{retries:Re(),retryCondition:$t,retryDelay:Ee,shouldResetTimeout:!0,onRetry:Vt}),t}function zt(e){return ze[e]===null&&(ze[e]=ui(e)),ze[e]}function qt(e){return{method:e.method,baseUrl:Ye(),url:e.url,data:e.isRetry?"<retry>":di(e.data),headers:{...e.headers,"x-currents-key":"***"}}}function di(e){return e?.results?.raw?{...e,results:{...e.results,raw:"***"}}:e}var er=require("axios"),tr=p(require("lodash")),y=require("ts-pattern");function rr(e){(0,y.match)(e).when(er.isAxiosError,li).otherwise(()=>{C("Unexpected error while sending network request: %s",e)})}function li(e){return(0,y.match)(e).with({code:"ECONNABORTED"},()=>{C("Network connection aborted")}).with({code:"ECONNREFUSED"},()=>{C("Network connection aborted")}).with({code:"ECONNRESET"},()=>{C("Network connection reset")}).with({code:"ETIMEDOUT"},()=>{C("Network connection timeout")}).with({response:y.P.not(y.P.nullish)},t=>{fi(t,{status:t.response.status,data:t.response.data})}).otherwise(t=>{C(`[currents] Unexpected network error: %s
@@ -14,7 +14,7 @@ ${(t??[]).map(r=>` - ${r}`).join(`
14
14
  EXTRA_PWCP_FLAGS="${d}"
15
15
  RUN_ATTEMPT="${c}"
16
16
  `)}async function qi(e,t){let{matrixIndex:r,matrixTotal:o}=e,n=t.params,a=X(n.githubRunAttempt,1),c=a>1?"--last-failed":"",u="";o>1&&(u=a>1?"--shard=1/1":`--shard=${r}/${o}`);let m=[c,u].filter(Boolean).join(" "),d=e.presetOutput??oe;await b(d,m),s('Dumped PW config: "%s" for GHA to %s',m,d)}async function qr(e,t,r=null){let o=t.params,n=r?.ci.params,a=n?.circleWorkflowId,c=n?.circleWorkflowWorkspaceId,u=X(o.circleNodeIndex,0),m=X(o.circleNodeTotal,1),d=c==o.circleWorkflowWorkspaceId&&a!==o.circleWorkflowId,g=d?"--last-failed":"",h="";m>1&&(h=d?"--shard=1/1":`--shard=${u+1}/${m}`);let O=[g,h].filter(Boolean).join(" "),x=e.presetOutput??oe;await b(x,O),s('Dumped PW config: "%s" for Circle to %s',O,x)}var X=(e,t)=>{let r=ut.default.toNumber(e);return ut.default.isNaN(r)?t:r};async function lt(){let e=H();if(e.type!=="GET_COMMAND_CONFIG"||!e.values)throw new Error("Config is missing!");let{recordKey:t,id:r,preset:o,matrixIndex:n,matrixTotal:a,continue:c}=e.values,u=e.values.outputDir,m=z();o==="last-run"&&await $r(e.values,m);let d=await ar({recordKey:t,ci:m,id:r,config:{matrixIndex:n,matrixTotal:a}});try{let g=await Yi({readUrl:d.readUrl,outputDir:u}),h=await Qi(d.metaReadUrl);o==="last-run"&&await Vr(e.values,m,h),w(l("- restoring cache to"),g),pe("Cache restored. Cache ID: %s",d.cacheId)}catch(g){if((0,Yr.isAxiosError)(g)&&(g.response?.status===403||g.response?.status===404)){let h=`Cache with ID "${d.cacheId}" not found`;if(c){$(h);return}throw new Error(h)}throw g}}async function Yi({readUrl:e,outputDir:t}){let r=await mt(e),o=Wi(t);return await Br(r,o),s("Cache downloaded"),o}function Wi(e){let t=e??process.cwd();return dt.default.isAbsolute(t)?t:dt.default.resolve(process.cwd(),t)}async function Qi(e){let t=await mt(e),r=JSON.parse(t.toString("utf-8"));return s("Meta file: %O",r),r}var Wr=require("lodash");function Qr({config:e,cacheId:t,orgId:r,path:o,ci:n}){let a={id:t,orgId:r,config:(0,Wr.omit)(e,"recordKey"),path:o,ci:n,createdAt:new Date().toISOString()};return Buffer.from(JSON.stringify(a))}function zr(e,t){e instanceof Error?$("%s. %s.",t,e.message):$("%s. %s.",t,"Unknown error")}var q=p(require("path")),ft=require("glob");var Xr=async e=>{let t=q.default.resolve(e??"./test-results"),r=[q.default.resolve(t,"**/.last-run.json"),q.default.resolve(t,".last-run.json")];return(0,ft.glob)(r)},Zr=async(e=[])=>{let t=zi(e),r=[];return t.length>0&&r.push(...await(0,ft.glob)(e)),r};function zi(e){let t=process.cwd();return e.filter(r=>{let o=q.default.resolve(r),n=q.default.relative(t,o);return r.startsWith("..")||q.default.isAbsolute(n)?(zr(null,`Invalid path: "${r}". Path traversal detected. The path was skipped.`),!1):!0})}async function gt(){let e=H();if(e.type!=="SET_COMMAND_CONFIG"||!e.values)throw new Error("Config is missing!");let{recordKey:t,id:r,preset:o,pwOutputDir:n,matrixIndex:a,matrixTotal:c,continue:u}=e.values,m=await Zr(e.values.path),d=e.values.path||[],g=z();if(o==="last-run"&&(d.push(n),m.push(...await Xr(n))),m.length===0){let O=`No files available to upload: ${d.filter(Boolean).join(",")}`;if(!u)throw new Error(O);$(O)}let h=await sr({recordKey:t,ci:g,id:r,config:{matrixIndex:a,matrixTotal:c}});s("Cache upload url created",{result:h}),m.length>0&&(await Xi({archive:await Mr(m),cacheId:h.cacheId,uploadUrl:h.uploadUrl}),w(m.map(O=>`${l("- uploading")} ${O}`).join(`
17
- `))),await Zi({meta:Qr({cacheId:h.cacheId,config:e.values,ci:g,orgId:h.orgId,path:m}),cacheId:h.cacheId,uploadUrl:h.metaUploadUrl}),pe("Cache uploaded. Cache ID: %s",h.cacheId)}async function Xi({archive:e,cacheId:t,uploadUrl:r}){try{let o="application/zip";await ct({buffer:e,contentType:o,name:t,uploadUrl:r},o,pt(t)),s("Cache archive uploaded",{cacheId:t})}catch(o){throw s("Failed to upload cache archive",o),o}}async function Zi({meta:e,cacheId:t,uploadUrl:r}){try{let o=`${t}_meta`,n="application/json";await ct({buffer:e,contentType:n,name:o,uploadUrl:r},n,pt(o)),s("Cache meta uploaded",{cacheId:t})}catch(o){throw s("Failed to upload cache meta",o),o}}var to=require("@currents/commit-info"),ro=require("lodash");var we=require("lodash");var Ct=s.extend("ci-git");function eo(e){Ct("git commit existing info: %O",e);let t=vr();Ct("commit info from provider environment variables: %O",t);let r=(0,we.transform)(e,(o,n,a)=>{let c=n||(t?t[a]:null);return o[a]=(0,we.defaultTo)(c,null)});return Ct("combined git and environment variables from provider: %O",r),r}var es=async()=>{let e=await(0,to.commitInfo)();return eo({branch:e.branch,remoteOrigin:e.remote,authorEmail:e.email,authorName:e.author,message:e.message,sha:e.sha,ghaEventData:e.ghaEventData})},oo=(0,ro.memoize)(es);var no=p(require("getos")),io=require("lodash"),A=require("os"),so=require("util"),ts=async()=>{if((0,A.platform)()==="linux")try{let e=await(0,so.promisify)(no.default)();return"dist"in e&&"release"in e?[e.dist,e.release].join(" - "):(0,A.release)()}catch{return(0,A.release)()}return(0,A.release)()},rs=async()=>{let e=await ts();return{osName:(0,A.platform)(),osVersion:e,osCpus:[],osMemory:{free:(0,A.freemem)(),total:(0,A.totalmem)()}}},ao=(0,io.memoize)(rs);var Mo=require("lodash"),Ne=p(require("path")),Bo=p(require("semver"));var _={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 co(){return{projectId:process.env[_.projectId.env],recordKey:process.env[_.recordKey.env],ciBuildId:process.env[_.ciBuildId.env],tag:process.env[_.tag.env]?process.env[_.tag.env]?.split(",").map(e=>e.trim()):void 0,disableTitleTags:!!process.env[_.disableTitleTags.env],removeTitleTags:!!process.env[_.removeTitleTags.env],debug:!!process.env[_.debug.env],machineId:process.env[_.machineId.env]}}var os=s.extend("config"),ns=["projectId","recordKey"],ht=null;function mo(e){ht=L(_,ns,co,e),os("Resolved Currents config: %o",ht)}function xe(){return ht}function po(e){return{ciBuildId:e.ciBuildId,projectId:e.projectId,recordKey:e.key,tag:e.tag,removeTitleTags:e.removeTitleTags,disableTitleTags:e.disableTitleTags,debug:e.debug,machineId:e.machineId,reportDir:e.reportDir}}var j=class{constructor(t){this.config=t}async getFullTestSuite(){return[]}};var To=p(require("fs-extra")),Oo=require("jest-cli"),yo=p(require("tmp"));var Io=require("lodash");function uo(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 lo=require("lodash"),is=["bail","clearCache","collectCoverage","collectCoverageFrom","color","colors","config","coverage","coverageDirectory","coveragePathIgnorePatterns","coverageProvider","coverageReporters","coverageThreshold","debug","detectLeaks","detectOpenHandles","errorOnDeprecated","expand","forceExit","json","listTests","logHeapUsage","noStackTrace","notify","notifyMode","openHandlesTimeout","outputFile","reporters","runner","shard","showConfig","showSeed","silent","testNamePattern","verbose","waitNextEventLoopTurnForUnhandledRejectionEvents","watch","watchAll","watchPathIgnorePatterns","watchman"];function fo(e){return(0,lo.omit)(e,...is)}var ho=p(require("fs")),Eo=require("jest-config"),Et=require("lodash"),Rt=p(require("path"));function be(e,t){return(...r)=>new Promise((o,n)=>{let a=0,c=()=>{a++;try{let u=e(...r);o(u)}catch(u){if(a>=t.length)n(u);else{let m=t[a-1];setTimeout(c,m)}}};c()})}var go=p(require("fs-extra")),ss=p(require("path"));async function Ae(e){let t=await go.default.pathExists(e);if(!t)throw new Error("File does not exist");return t}var Co=s.extend("jest-discovery");async function Ro(e){try{let{config:t,configPath:r}=await(0,Eo.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,Et.omit)(t,o);if(a.projects&&(a.projects=a.projects.map(m=>typeof m!="string"?(0,Et.omit)(m,n):m)),a.rootDir&&Object.keys(a).length===1)return null;let c=Rt.default.resolve(r?Rt.default.dirname(r):process.cwd(),`.jest-scanner-${new Date().getTime()}.config.js`),u=`module.exports=${JSON.stringify(a,null,2)}`;return Co("configFileContent: %O",u),ho.default.writeFileSync(c,u),await be(Ae,[200,200,200,200,200,1e3])(c),c}catch(t){return f("Failed to recreate the config file"),Co("error %o",t),null}}async function _o(e){let t="!!##ThisPatternWillNotMatchAnyTestName##!!",r=e.options,o=fo(r),n=uo(o),a=r.config,c=await Ro(a);return{cliArgs:[n,"--testNamePattern",t,"--reporters","@currents/cmd/discovery/jest","--shard=1/1",c?`--config=${c}`:"",...e.args].filter(m=>!(0,Io.isEmpty)(m)),configFilePath:c}}var as=s.extend("jest-discovery");async function Po(e,t){console.time(l("@currents/jest:fullTestSuite-ready"));let{cliArgs:r,configFilePath:o}=await _o(t);try{let n=yo.default.fileSync({postfix:".json"});return as("running scanner: %o",r),process.env.CURRENTS_DISCOVERY_PATH=n.name,await(0,Oo.run)(r.concat(["--openHandlesTimeout=0"])),await be(Ae,Array.from({length:300},()=>100))(n.name),console.timeEnd(l("@currents/jest:fullTestSuite-ready")),await V(n.name)}catch(n){return f("Failed to obtain the jest full test suite:",n),[]}finally{o&&To.default.unlinkSync(o)}}var Se=class extends j{constructor(t){super(t)}async getFullTestSuite(){return Po(this.config.frameworkConfig,this.config.cliArgs)}};var Ao=p(require("fs-extra"));var So=require("path"),Uo=require("xml2js");var xo=p(require("crypto"));function bo(e,t,r){let o=Y(e.failure),n=o.length>0;return{_t:cs(t?.timestamp??""),testId:It(ne(e.name,t.name).join(", "),Z(t)),title:ne(e.name,t.name),state:n?"failed":"passed",isFlaky:ps(),expectedStatus:n?"skipped":"passed",timeout:us(),location:ds(t?.file??""),retries:ls(o),attempts:fs(e,o,t.timestamp??"",r)}}function It(e,t){let r=`${e}${t}`;return xo.default.createHash("sha256").update(r).digest("hex").substring(0,16)}function cs(e){return ms(e)?new Date(e).getTime():0}function ms(e){let t=new Date(e);return!isNaN(t.getTime())}function ne(e,t){return[t,e].filter(Boolean)}function ps(){return!1}function us(){return 0}function ds(e){return{column:1,file:e,line:1}}function ls(e){let t=0;return e.forEach(r=>{typeof r!="string"&&t++}),t}function fs(e,t,r,o){let n=Ue(e.time);return t.length===0?[{_s:"passed",attempt:0,workerIndex:1,parallelIndex:1,startTime:r,steps:[],duration:n,status:"passed",stdout:wo(e?.["system-out"]),stderr:[],errors:[],error:void 0}]:t.reduce((a,c,u)=>{if(c!=="true"&&c!=="false"){let m=Cs(c);a.push({_s:"failed",attempt:u,workerIndex:1,parallelIndex:1,startTime:hs(o,r),steps:[],duration:n,status:"passed",stdout:wo(e?.["system-out"]),stderr:gs(e?.["system-err"]),errors:m,error:m?m[0]:void 0})}return a},[])}function wo(e){return e?[e]:[]}function gs(e){return e?[e]:[]}function Cs(e){return e==="true"||e==="false"?[]:[typeof e=="string"?{message:e}:{message:e.message,stack:e._,value:e.type}]}function hs(e,t){let r=new Date(t).getTime()+e;return new Date(r).toISOString()}function Z(e){return e.file??e.name??"No spec"}function Y(e){return e?Array.isArray(e)?e:[e]:[]}function Es(e){return Math.round(e*1e3)}function Ue(e){return Es(parseFloat(e??"0"))}var Rs=s.extend("junit-discovery");async function vo(e){console.time(l("@currents/junit:fullTestSuite-ready"));try{Rs("running scanner: %o",e);let t=(0,So.join)(e,"currents.results.xml");process.env.CURRENTS_DISCOVERY_PATH=t;let r=Ao.default.readFileSync(t,"utf-8"),o=await(0,Uo.parseStringPromise)(r,{explicitArray:!1,mergeAttrs:!0});return Is(o)}catch(t){return f("Failed to obtain the junit full test suite:",t),[]}}function Is(e){let t=[],r=Y(e.testsuites?.testsuite),o={name:e.testsuites?.name??"No name",tags:[],tests:[]};return r?.forEach(n=>{Y(n?.testcase)?.forEach(c=>{let u={title:ne(c.name,n.name),spec:Z(n),tags:[],testId:It(ne(c.name,n.name).join(", "),Z(n))};o.tests.push(u)})}),t.push(o),t}var ve=class extends j{constructor(t,r){super(t),this.reportDir=r}async getFullTestSuite(){return vo(this.reportDir)}};function Do(e,t){switch(e.framework){case"jest":return new Se(e);case"junit":return new ve(e,t);default:return new j(e)}}var ee=p(require("fs-extra")),B=p(require("path"));async function No(e){let t=await _s(e?.reportDir);if(!t)throw new Error("Failed to find the report dir");return{reportDir:t,configFilePath:e?.configFilePath??B.default.join(t,"config.json")}}async function _s(e){return e?(await De(e),e):Ts((0,B.join)(process.cwd(),".currents"))}async function Ts(e){let t=await ee.default.readdir(e),r=null;for(let o of t){let n=B.default.join(e,o),a=await ee.default.stat(n);a.isDirectory()&&(!r||a.birthtime>r.birthtime)&&(r={name:o,birthtime:a.birthtime})}return r?(0,B.resolve)(e,r.name):null}async function De(e){try{return await ee.default.pathExists(e)}catch{return f("Error checking if path exists:",f),!1}}async function Lo(e){let t=B.default.join(e,"instances");return Os(t)}async function Os(e){let t=await ee.default.readdir(e),r=[];for(let o of t){let n=B.default.join(e,o);(await ee.default.stat(n)).isFile()&&r.push(n)}return r}async function _t(){let e=xe();if(!e)throw new Error("Currents config is missing!");let t=await No(e);At(xs(t.reportDir)),s("Reporter options: %o",t),w("Report directory: %s",t.reportDir);let r=await V(t.configFilePath);s("Report config: %o",r);let o=await Lo(t.reportDir);s("Found %d instance results in the reportDir: %s",o.length,t.reportDir);let n=Ps(t.reportDir),a=await De(n),c=ws(t.reportDir),u=null;if(a){let S=await V(n);C("Marker file detected. The report was already uploaded: %o",{runUrl:S.response.runUrl,isoDate:S.isoDate}),await De(c)&&(u=await V(c),s("Full test suite file detected: %s",c))}if(u)s("The discovery stage was skipped");else{if(u=await Do(r,t.reportDir).getFullTestSuite(),bs(u))throw new Error("Failed to discover the full test suite!");await b(c,JSON.stringify(u))}let m=u.length===1?u[0].name:null,d={currents:e},g={type:r.framework,version:r.frameworkVersion,clientVersion:ce,frameworkConfig:{originFramework:r.frameworkConfig?.originFramework,originFrameworkVersion:r.frameworkConfig?.originFrameworkVersion}},h=he.userFacingNanoid(),O=z(e.ciBuildId),x={};for await(let S of o){let D=await V(S);x[D.groupId]||(x[D.groupId]=[]),x[D.groupId].push(D)}for await(let S of Object.keys(x)){let D=x[S],He=S;m&&(s("Default group found: %s, overwriting the group in the results",m),He=m,D=D.map(K=>({...K,groupId:m})));try{let K=await ys({ci:O,group:He,instances:D,fullTestSuite:u,config:d,machineId:h,framework:g});s("Api response: %o",K),w("[%s] Run created: %s",He,K.runUrl);let Kn={response:K,isoDate:new Date().toISOString()};await b(n,JSON.stringify(Kn)),s("Marker file %s: %s",a?"overwritten":"created",n)}catch(K){throw s("Failed to upload the results to the dashboard"),K}}}async function ys({ci:e,group:t,instances:r,fullTestSuite:o,config:n,machineId:a,framework:c}){let u=await oo(),m=await ao(),d={browserName:"node",browserVersion:Bo.default.coerce(process.version)?.version},{currents:g}=n,O={platform:{...d,...m},ci:e,commit:u,group:t,fullTestSuite:o,config:n,projectId:g.projectId,recordKey:g.recordKey,ciBuildId:e.ciBuildId.value??void 0,tags:g.tag??[],machineId:g.machineId??a,framework:c,instances:r,previousCiBuildId:process.env.CURRENTS_PREVIOUS_CI_BUILD_ID};return s("Creating run: %o",(0,Mo.mapValues)(O,(x,S)=>S==="recordKey"?"******":x)),ur(O)}function Ps(e){return Ne.default.join(e,"upload.marker.json")}function ws(e){return Ne.default.join(e,"fullTestSuite.json")}function xs(e){return Ne.default.join(e,`.debug-${new Date().toISOString()}.log`)}function bs(e){return e.length===0||e.some(t=>t.tests.length===0)}var As=s.extend("cli");async function Fo(e){await U(async t=>{Lt(t);let r=le();As("Config: %o",r),await Xe()},e)}var F=require("@commander-js/extra-typings");var ko=new F.Option("--api-key <api-key>","API key from Currents dashboard for authentication").env(I(M,"apiKey")),Go=new F.Option("-o, --output <path>","Path to the file where output will be written").env(I(M,"output")),Ho=new F.Option("--ci-build-id <id>","Unique identifier for the run"),jo=new F.Option("-p, --project-id <project>","Project ID from Currents associated with the run").env(I(M,"projectId")),Ko=new F.Option("-t, --tag <tag>","Comma-separated list of tags for the run").argParser(Q),$o=new F.Option("--debug","Enable debug logging").env(I(M,"debug")).default(!1),Vo=new F.Option("-b, --branch <branch>","Branch name for the recorded run"),Jo=new F.Option("--pw-last-run",'Generate output formatted for Playwright ".last-run.json"');var Le="api",Ss=e=>`
17
+ `))),await Zi({meta:Qr({cacheId:h.cacheId,config:e.values,ci:g,orgId:h.orgId,path:m}),cacheId:h.cacheId,uploadUrl:h.metaUploadUrl}),pe("Cache uploaded. Cache ID: %s",h.cacheId)}async function Xi({archive:e,cacheId:t,uploadUrl:r}){try{let o="application/zip";await ct({buffer:e,contentType:o,name:t,uploadUrl:r},o,pt(t)),s("Cache archive uploaded",{cacheId:t})}catch(o){throw s("Failed to upload cache archive",o),o}}async function Zi({meta:e,cacheId:t,uploadUrl:r}){try{let o=`${t}_meta`,n="application/json";await ct({buffer:e,contentType:n,name:o,uploadUrl:r},n,pt(o)),s("Cache meta uploaded",{cacheId:t})}catch(o){throw s("Failed to upload cache meta",o),o}}var to=require("@currents/commit-info"),ro=require("lodash");var we=require("lodash");var Ct=s.extend("ci-git");function eo(e){Ct("git commit existing info: %O",e);let t=vr();Ct("commit info from provider environment variables: %O",t);let r=(0,we.transform)(e,(o,n,a)=>{let c=n||(t?t[a]:null);return o[a]=(0,we.defaultTo)(c,null)});return Ct("combined git and environment variables from provider: %O",r),r}var es=async()=>{let e=await(0,to.commitInfo)();return eo({branch:e.branch,remoteOrigin:e.remote,authorEmail:e.email,authorName:e.author,message:e.message,sha:e.sha,ghaEventData:e.ghaEventData})},oo=(0,ro.memoize)(es);var no=p(require("getos")),io=require("lodash"),A=require("os"),so=require("util"),ts=async()=>{if((0,A.platform)()==="linux")try{let e=await(0,so.promisify)(no.default)();return"dist"in e&&"release"in e?[e.dist,e.release].join(" - "):(0,A.release)()}catch{return(0,A.release)()}return(0,A.release)()},rs=async()=>{let e=await ts();return{osName:(0,A.platform)(),osVersion:e,osCpus:[],osMemory:{free:(0,A.freemem)(),total:(0,A.totalmem)()}}},ao=(0,io.memoize)(rs);var Mo=require("lodash"),Ne=p(require("path")),Bo=p(require("semver"));var _={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 co(){return{projectId:process.env[_.projectId.env],recordKey:process.env[_.recordKey.env],ciBuildId:process.env[_.ciBuildId.env],tag:process.env[_.tag.env]?process.env[_.tag.env]?.split(",").map(e=>e.trim()):void 0,disableTitleTags:process.env[_.disableTitleTags.env],removeTitleTags:process.env[_.removeTitleTags.env],debug:process.env[_.debug.env],machineId:process.env[_.machineId.env]}}var os=s.extend("config"),ns=["projectId","recordKey"],ht=null;function mo(e){ht=L(_,ns,co,e),os("Resolved Currents config: %o",ht)}function xe(){return ht}function po(e){return{ciBuildId:e.ciBuildId,projectId:e.projectId,recordKey:e.key,tag:e.tag,removeTitleTags:e.removeTitleTags,disableTitleTags:e.disableTitleTags,debug:e.debug,machineId:e.machineId,reportDir:e.reportDir}}var j=class{constructor(t){this.config=t}async getFullTestSuite(){return[]}};var To=p(require("fs-extra")),Oo=require("jest-cli"),yo=p(require("tmp"));var Io=require("lodash");function uo(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 lo=require("lodash"),is=["bail","clearCache","collectCoverage","collectCoverageFrom","color","colors","config","coverage","coverageDirectory","coveragePathIgnorePatterns","coverageProvider","coverageReporters","coverageThreshold","debug","detectLeaks","detectOpenHandles","errorOnDeprecated","expand","forceExit","json","listTests","logHeapUsage","noStackTrace","notify","notifyMode","openHandlesTimeout","outputFile","reporters","runner","shard","showConfig","showSeed","silent","testNamePattern","verbose","waitNextEventLoopTurnForUnhandledRejectionEvents","watch","watchAll","watchPathIgnorePatterns","watchman"];function fo(e){return(0,lo.omit)(e,...is)}var ho=p(require("fs")),Eo=require("jest-config"),Et=require("lodash"),Rt=p(require("path"));function be(e,t){return(...r)=>new Promise((o,n)=>{let a=0,c=()=>{a++;try{let u=e(...r);o(u)}catch(u){if(a>=t.length)n(u);else{let m=t[a-1];setTimeout(c,m)}}};c()})}var go=p(require("fs-extra")),ss=p(require("path"));async function Ae(e){let t=await go.default.pathExists(e);if(!t)throw new Error("File does not exist");return t}var Co=s.extend("jest-discovery");async function Ro(e){try{let{config:t,configPath:r}=await(0,Eo.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,Et.omit)(t,o);if(a.projects&&(a.projects=a.projects.map(m=>typeof m!="string"?(0,Et.omit)(m,n):m)),a.rootDir&&Object.keys(a).length===1)return null;let c=Rt.default.resolve(r?Rt.default.dirname(r):process.cwd(),`.jest-scanner-${new Date().getTime()}.config.js`),u=`module.exports=${JSON.stringify(a,null,2)}`;return Co("configFileContent: %O",u),ho.default.writeFileSync(c,u),await be(Ae,[200,200,200,200,200,1e3])(c),c}catch(t){return f("Failed to recreate the config file"),Co("error %o",t),null}}async function _o(e){let t="!!##ThisPatternWillNotMatchAnyTestName##!!",r=e.options,o=fo(r),n=uo(o),a=r.config,c=await Ro(a);return{cliArgs:[n,"--testNamePattern",t,"--reporters","@currents/cmd/discovery/jest","--shard=1/1",c?`--config=${c}`:"",...e.args].filter(m=>!(0,Io.isEmpty)(m)),configFilePath:c}}var as=s.extend("jest-discovery");async function Po(e,t){console.time(l("@currents/jest:fullTestSuite-ready"));let{cliArgs:r,configFilePath:o}=await _o(t);try{let n=yo.default.fileSync({postfix:".json"});return as("running scanner: %o",r),process.env.CURRENTS_DISCOVERY_PATH=n.name,await(0,Oo.run)(r.concat(["--openHandlesTimeout=0"])),await be(Ae,Array.from({length:300},()=>100))(n.name),console.timeEnd(l("@currents/jest:fullTestSuite-ready")),await V(n.name)}catch(n){return f("Failed to obtain the jest full test suite:",n),[]}finally{o&&To.default.unlinkSync(o)}}var Se=class extends j{constructor(t){super(t)}async getFullTestSuite(){return Po(this.config.frameworkConfig,this.config.cliArgs)}};var Ao=p(require("fs-extra"));var So=require("path"),Uo=require("xml2js");var xo=p(require("crypto"));function bo(e,t,r){let o=Y(e.failure),n=o.length>0;return{_t:cs(t?.timestamp??""),testId:It(ne(e.name,t.name).join(", "),Z(t)),title:ne(e.name,t.name),state:n?"failed":"passed",isFlaky:ps(),expectedStatus:n?"skipped":"passed",timeout:us(),location:ds(t?.file??""),retries:ls(o),attempts:fs(e,o,t.timestamp??"",r)}}function It(e,t){let r=`${e}${t}`;return xo.default.createHash("sha256").update(r).digest("hex").substring(0,16)}function cs(e){return ms(e)?new Date(e).getTime():0}function ms(e){let t=new Date(e);return!isNaN(t.getTime())}function ne(e,t){return[t,e].filter(Boolean)}function ps(){return!1}function us(){return 0}function ds(e){return{column:1,file:e,line:1}}function ls(e){let t=0;return e.forEach(r=>{typeof r!="string"&&t++}),t}function fs(e,t,r,o){let n=Ue(e.time);return t.length===0?[{_s:"passed",attempt:0,workerIndex:1,parallelIndex:1,startTime:r,steps:[],duration:n,status:"passed",stdout:wo(e?.["system-out"]),stderr:[],errors:[],error:void 0}]:t.reduce((a,c,u)=>{if(c!=="true"&&c!=="false"){let m=Cs(c);a.push({_s:"failed",attempt:u,workerIndex:1,parallelIndex:1,startTime:hs(o,r),steps:[],duration:n,status:"passed",stdout:wo(e?.["system-out"]),stderr:gs(e?.["system-err"]),errors:m,error:m?m[0]:void 0})}return a},[])}function wo(e){return e?[e]:[]}function gs(e){return e?[e]:[]}function Cs(e){return e==="true"||e==="false"?[]:[typeof e=="string"?{message:e}:{message:e.message,stack:e._,value:e.type}]}function hs(e,t){let r=new Date(t).getTime()+e;return new Date(r).toISOString()}function Z(e){return e.file??e.name??"No spec"}function Y(e){return e?Array.isArray(e)?e:[e]:[]}function Es(e){return Math.round(e*1e3)}function Ue(e){return Es(parseFloat(e??"0"))}var Rs=s.extend("junit-discovery");async function vo(e){console.time(l("@currents/junit:fullTestSuite-ready"));try{Rs("running scanner: %o",e);let t=(0,So.join)(e,"currents.results.xml");process.env.CURRENTS_DISCOVERY_PATH=t;let r=Ao.default.readFileSync(t,"utf-8"),o=await(0,Uo.parseStringPromise)(r,{explicitArray:!1,mergeAttrs:!0});return Is(o)}catch(t){return f("Failed to obtain the junit full test suite:",t),[]}}function Is(e){let t=[],r=Y(e.testsuites?.testsuite),o={name:e.testsuites?.name??"No name",tags:[],tests:[]};return r?.forEach(n=>{Y(n?.testcase)?.forEach(c=>{let u={title:ne(c.name,n.name),spec:Z(n),tags:[],testId:It(ne(c.name,n.name).join(", "),Z(n))};o.tests.push(u)})}),t.push(o),t}var ve=class extends j{constructor(t,r){super(t),this.reportDir=r}async getFullTestSuite(){return vo(this.reportDir)}};function Do(e,t){switch(e.framework){case"jest":return new Se(e);case"junit":return new ve(e,t);default:return new j(e)}}var ee=p(require("fs-extra")),B=p(require("path"));async function No(e){let t=await _s(e?.reportDir);if(!t)throw new Error("Failed to find the report dir");return{reportDir:t,configFilePath:e?.configFilePath??B.default.join(t,"config.json")}}async function _s(e){return e?(await De(e),e):Ts((0,B.join)(process.cwd(),".currents"))}async function Ts(e){let t=await ee.default.readdir(e),r=null;for(let o of t){let n=B.default.join(e,o),a=await ee.default.stat(n);a.isDirectory()&&(!r||a.birthtime>r.birthtime)&&(r={name:o,birthtime:a.birthtime})}return r?(0,B.resolve)(e,r.name):null}async function De(e){try{return await ee.default.pathExists(e)}catch{return f("Error checking if path exists:",f),!1}}async function Lo(e){let t=B.default.join(e,"instances");return Os(t)}async function Os(e){let t=await ee.default.readdir(e),r=[];for(let o of t){let n=B.default.join(e,o);(await ee.default.stat(n)).isFile()&&r.push(n)}return r}async function _t(){let e=xe();if(!e)throw new Error("Currents config is missing!");let t=await No(e);At(xs(t.reportDir)),s("Reporter options: %o",t),w("Report directory: %s",t.reportDir);let r=await V(t.configFilePath);s("Report config: %o",r);let o=await Lo(t.reportDir);s("Found %d instance results in the reportDir: %s",o.length,t.reportDir);let n=Ps(t.reportDir),a=await De(n),c=ws(t.reportDir),u=null;if(a){let S=await V(n);C("Marker file detected. The report was already uploaded: %o",{runUrl:S.response.runUrl,isoDate:S.isoDate}),await De(c)&&(u=await V(c),s("Full test suite file detected: %s",c))}if(u)s("The discovery stage was skipped");else{if(u=await Do(r,t.reportDir).getFullTestSuite(),bs(u))throw new Error("Failed to discover the full test suite!");await b(c,JSON.stringify(u))}let m=u.length===1?u[0].name:null,d={currents:e},g={type:r.framework,version:r.frameworkVersion,clientVersion:ce,frameworkConfig:{originFramework:r.frameworkConfig?.originFramework,originFrameworkVersion:r.frameworkConfig?.originFrameworkVersion}},h=he.userFacingNanoid(),O=z(e.ciBuildId),x={};for await(let S of o){let D=await V(S);x[D.groupId]||(x[D.groupId]=[]),x[D.groupId].push(D)}for await(let S of Object.keys(x)){let D=x[S],He=S;m&&(s("Default group found: %s, overwriting the group in the results",m),He=m,D=D.map(K=>({...K,groupId:m})));try{let K=await ys({ci:O,group:He,instances:D,fullTestSuite:u,config:d,machineId:h,framework:g});s("Api response: %o",K),w("[%s] Run created: %s",He,K.runUrl);let Kn={response:K,isoDate:new Date().toISOString()};await b(n,JSON.stringify(Kn)),s("Marker file %s: %s",a?"overwritten":"created",n)}catch(K){throw s("Failed to upload the results to the dashboard"),K}}}async function ys({ci:e,group:t,instances:r,fullTestSuite:o,config:n,machineId:a,framework:c}){let u=await oo(),m=await ao(),d={browserName:"node",browserVersion:Bo.default.coerce(process.version)?.version},{currents:g}=n,O={platform:{...d,...m},ci:e,commit:u,group:t,fullTestSuite:o,config:n,projectId:g.projectId,recordKey:g.recordKey,ciBuildId:e.ciBuildId.value??void 0,tags:g.tag??[],machineId:g.machineId??a,framework:c,instances:r,previousCiBuildId:process.env.CURRENTS_PREVIOUS_CI_BUILD_ID};return s("Creating run: %o",(0,Mo.mapValues)(O,(x,S)=>S==="recordKey"?"******":x)),ur(O)}function Ps(e){return Ne.default.join(e,"upload.marker.json")}function ws(e){return Ne.default.join(e,"fullTestSuite.json")}function xs(e){return Ne.default.join(e,`.debug-${new Date().toISOString()}.log`)}function bs(e){return e.length===0||e.some(t=>t.tests.length===0)}var As=s.extend("cli");async function Fo(e){await U(async t=>{Lt(t);let r=le();As("Config: %o",r),await Xe()},e)}var F=require("@commander-js/extra-typings");var ko=new F.Option("--api-key <api-key>","API key from Currents dashboard for authentication").env(I(M,"apiKey")),Go=new F.Option("-o, --output <path>","Path to the file where output will be written").env(I(M,"output")),Ho=new F.Option("--ci-build-id <id>","Unique identifier for the run"),jo=new F.Option("-p, --project-id <project>","Project ID from Currents associated with the run").env(I(M,"projectId")),Ko=new F.Option("-t, --tag <tag>","Comma-separated list of tags for the run").argParser(Q),$o=new F.Option("--debug","Enable debug logging").env(I(M,"debug")).default(!1),Vo=new F.Option("-b, --branch <branch>","Branch name for the recorded run"),Jo=new F.Option("--pw-last-run",'Generate output formatted for Playwright ".last-run.json"');var Le="api",Ss=e=>`
18
18
 
19
19
  ${qo.default.bold("Examples")}
20
20
 
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  "use strict";var yt=Object.create;var y=Object.defineProperty;var Bt=Object.getOwnPropertyDescriptor;var bt=Object.getOwnPropertyNames;var xt=Object.getPrototypeOf,vt=Object.prototype.hasOwnProperty;var me=(e,t)=>{for(var r in t)y(e,r,{get:t[r],enumerable:!0})},pe=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of bt(t))!vt.call(e,o)&&o!==r&&y(e,o,{get:()=>t[o],enumerable:!(n=Bt(t,o))||n.enumerable});return e};var c=(e,t,r)=>(r=e!=null?yt(xt(e)):{},pe(t||!e||!e.__esModule?y(r,"default",{value:e,enumerable:!0}):r,e)),Mt=e=>pe(y({},"__esModule",{value:!0}),e);var wr={};me(wr,{handleCurrentsReport:()=>Nt});module.exports=Mt(wr);var le=require("debug"),wt=c(require("fs-extra")),i=(0,le.debug)("currents"),Ft=null;function ge(e){Ft=e}var B={};me(B,{getNanoid:()=>Ht,userFacingNanoid:()=>q});var Y=require("nanoid"),de="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",Ht=(e=16)=>(0,Y.customAlphabet)(de,e)(),q=(0,Y.customAlphabet)(de,12);var p=require("lodash");var b=i.extend("ci"),kt=(e,...t)=>(0,p.chain)(t).compact().join(e).value(),Gt=(e,t)=>(0,p.set)(e,(0,p.camelCase)(t),process.env[t]),u=e=>(0,p.transform)(e,Gt,{}),jt=()=>process.env.TF_BUILD&&process.env.TF_BUILD_BUILDNUMBER,Vt=()=>process.env.TF_BUILD&&process.env.AZURE_HTTP_USER_AGENT,Kt=()=>(0,p.some)(process.env,(e,t)=>/^CODEBUILD_/.test(t)),Jt=()=>process.env.bamboo_buildNumber,$t=()=>process.env.CI_NAME&&process.env.CI_NAME==="codeship"&&process.env.CODESHIP,Yt=()=>process.env.CI_NAME&&process.env.CI_NAME==="codeship"&&!process.env.CODESHIP,qt=()=>(0,p.some)(process.env,(e,t)=>/^CONCOURSE_/.test(t)),Qt=()=>process.env.GITLAB_CI||process.env.CI_SERVER_NAME&&/^GitLab/.test(process.env.CI_SERVER_NAME),Wt=()=>process.env.GCP_PROJECT||process.env.GCLOUD_PROJECT||process.env.GOOGLE_CLOUD_PROJECT,zt=()=>process.env.JENKINS_URL||process.env.JENKINS_HOME||process.env.JENKINS_VERSION||process.env.HUDSON_URL||process.env.HUDSON_HOME,Xt=()=>process.env.WERCKER||process.env.WERCKER_MAIN_PIPELINE_STARTED,Zt={appveyor:"APPVEYOR",azure:Vt,awsCodeBuild:Kt,bamboo:Jt,bitbucket:"BITBUCKET_BUILD_NUMBER",buildkite:"BUILDKITE",circle:"CIRCLECI",codeshipBasic:$t,codeshipPro:Yt,concourse:qt,codeFresh:"CF_BUILD_ID",drone:"DRONE",githubActions:"GITHUB_ACTIONS",gitlab:Qt,goCD:"GO_JOB_NAME",googleCloud:Wt,jenkins:zt,semaphore:"SEMAPHORE",shippable:"SHIPPABLE",teamcity:"TEAMCITY_VERSION",teamfoundation:jt,travis:"TRAVIS",wercker:Xt,netlify:"NETLIFY",layerci:"LAYERCI"};function er(){let{env:e}=process;return(0,p.findKey)(Zt,t=>{if((0,p.isString)(t))return e[t];if((0,p.isFunction)(t))return t()})}var Ee=()=>({appveyor:u(["APPVEYOR_JOB_ID","APPVEYOR_ACCOUNT_NAME","APPVEYOR_PROJECT_SLUG","APPVEYOR_BUILD_NUMBER","APPVEYOR_BUILD_VERSION","APPVEYOR_PULL_REQUEST_NUMBER","APPVEYOR_PULL_REQUEST_HEAD_REPO_BRANCH"]),azure:u(["BUILD_BUILDID","BUILD_BUILDNUMBER","BUILD_CONTAINERID","BUILD_REPOSITORY_URI","SYSTEM_TEAMPROJECT","SYSTEM_COLLECTIONURI"]),awsCodeBuild:u(["CODEBUILD_BUILD_ID","CODEBUILD_BUILD_NUMBER","CODEBUILD_RESOLVED_SOURCE_VERSION","CODEBUILD_SOURCE_REPO_URL","CODEBUILD_SOURCE_VERSION"]),bamboo:u(["bamboo_buildNumber","bamboo_buildResultsUrl","bamboo_planRepository_repositoryUrl","bamboo_buildKey"]),bitbucket:u(["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:u(["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:u(["CIRCLE_JOB","CIRCLE_BUILD_NUM","CIRCLE_BUILD_URL","CIRCLE_PR_NUMBER","CIRCLE_PR_REPONAME","CIRCLE_PR_USERNAME","CIRCLE_COMPARE_URL","CIRCLE_WORKFLOW_ID","CIRCLE_WORKFLOW_WORKSPACE_ID","CIRCLE_PULL_REQUEST","CIRCLE_REPOSITORY_URL","CI_PULL_REQUEST","CIRCLE_NODE_INDEX","CIRCLE_NODE_TOTAL"]),codeshipBasic:u(["CI_BUILD_ID","CI_REPO_NAME","CI_BUILD_URL","CI_PROJECT_ID","CI_BUILD_NUMBER","CI_PULL_REQUEST"]),codeshipPro:u(["CI_BUILD_ID","CI_REPO_NAME","CI_PROJECT_ID"]),concourse:u(["BUILD_ID","BUILD_NAME","BUILD_JOB_NAME","BUILD_PIPELINE_NAME","BUILD_TEAM_NAME","ATC_EXTERNAL_URL"]),codeFresh:u(["CF_BUILD_ID","CF_BUILD_URL","CF_CURRENT_ATTEMPT","CF_STEP_NAME","CF_PIPELINE_NAME","CF_PIPELINE_TRIGGER_ID","CF_PULL_REQUEST_ID","CF_PULL_REQUEST_IS_FORK","CF_PULL_REQUEST_NUMBER","CF_PULL_REQUEST_TARGET"]),drone:u(["DRONE_JOB_NUMBER","DRONE_BUILD_LINK","DRONE_BUILD_NUMBER","DRONE_PULL_REQUEST"]),githubActions:u(["GITHUB_WORKFLOW","GITHUB_ACTION","GITHUB_EVENT_NAME","GITHUB_RUN_ID","GITHUB_RUN_ATTEMPT","GITHUB_REPOSITORY"]),gitlab:u(["CI_PIPELINE_ID","CI_PIPELINE_URL","CI_BUILD_ID","CI_JOB_ID","CI_JOB_URL","CI_JOB_NAME","CI_NODE_INDEX","CI_NODE_TOTAL","GITLAB_HOST","CI_PROJECT_ID","CI_PROJECT_URL","CI_REPOSITORY_URL","CI_ENVIRONMENT_URL","CI_DEFAULT_BRANCH","RUN_ATTEMPT"]),goCD:u(["GO_SERVER_URL","GO_ENVIRONMENT_NAME","GO_PIPELINE_NAME","GO_PIPELINE_COUNTER","GO_PIPELINE_LABEL","GO_STAGE_NAME","GO_STAGE_COUNTER","GO_JOB_NAME","GO_TRIGGER_USER","GO_REVISION","GO_TO_REVISION","GO_FROM_REVISION","GO_MATERIAL_HAS_CHANGED"]),googleCloud:u(["BUILD_ID","PROJECT_ID","REPO_NAME","BRANCH_NAME","TAG_NAME","COMMIT_SHA","SHORT_SHA"]),jenkins:u(["BUILD_ID","BUILD_URL","BUILD_NUMBER","ghprbPullId"]),semaphore:u(["SEMAPHORE_BRANCH_ID","SEMAPHORE_BUILD_NUMBER","SEMAPHORE_CURRENT_JOB","SEMAPHORE_CURRENT_THREAD","SEMAPHORE_EXECUTABLE_UUID","SEMAPHORE_GIT_BRANCH","SEMAPHORE_GIT_DIR","SEMAPHORE_GIT_REF","SEMAPHORE_GIT_REF_TYPE","SEMAPHORE_GIT_REPO_SLUG","SEMAPHORE_GIT_SHA","SEMAPHORE_GIT_URL","SEMAPHORE_JOB_COUNT","SEMAPHORE_JOB_ID","SEMAPHORE_JOB_NAME","SEMAPHORE_JOB_UUID","SEMAPHORE_PIPELINE_ID","SEMAPHORE_PLATFORM","SEMAPHORE_PROJECT_DIR","SEMAPHORE_PROJECT_HASH_ID","SEMAPHORE_PROJECT_ID","SEMAPHORE_PROJECT_NAME","SEMAPHORE_PROJECT_UUID","SEMAPHORE_REPO_SLUG","SEMAPHORE_TRIGGER_SOURCE","SEMAPHORE_WORKFLOW_ID","PULL_REQUEST_NUMBER"]),shippable:u(["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:u(["BUILD_BUILDID","BUILD_BUILDNUMBER","BUILD_CONTAINERID"]),travis:u(["TRAVIS_JOB_ID","TRAVIS_BUILD_ID","TRAVIS_BUILD_WEB_URL","TRAVIS_REPO_SLUG","TRAVIS_JOB_NUMBER","TRAVIS_EVENT_TYPE","TRAVIS_COMMIT_RANGE","TRAVIS_BUILD_NUMBER","TRAVIS_PULL_REQUEST","TRAVIS_PULL_REQUEST_BRANCH","TRAVIS_PULL_REQUEST_SHA"]),wercker:null,netlify:u(["BUILD_ID","CONTEXT","URL","DEPLOY_URL","DEPLOY_PRIME_URL","DEPLOY_ID"]),layerci:u(["LAYERCI_JOB_ID","LAYERCI_RUNNER_ID","RETRY_INDEX","LAYERCI_PULL_REQUEST","LAYERCI_REPO_NAME","LAYERCI_REPO_OWNER","LAYERCI_BRANCH","GIT_TAG"])}),tr=()=>{let{env:e}=process;return{appveyor:{sha:e.APPVEYOR_REPO_COMMIT,branch:e.APPVEYOR_PULL_REQUEST_HEAD_REPO_BRANCH||e.APPVEYOR_REPO_BRANCH,message:kt(`
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}}},fe=e=>{let t=_e();return t?(0,p.chain)(e()).get(t).value():{}};function rr(){return(0,p.chain)(Ee()).omitBy(p.isNull).keys().value()}function or(e){return e&&rr().includes(e)}function _e(){let e=er();return b("detected CI provider name: %s",e),e||null}function nr(){return fe(Ee)}function Re(){return fe(tr)}function Ie(e){let t=nr(),r=_e(),n=sr(e,r);return b("detected CI provider: %s",r),b("detected CI params: %O",t),b("detected CI build ID: %o",n),{params:t,provider:r,ciBuildId:n}}function sr(e,t){return e?{source:"user",value:e}:or(t)?{source:"server",value:null}:{source:"random",value:`auto:${q()}`}}var Ce=require("@currents/commit-info"),he=require("lodash");var x=require("lodash");var Q=i.extend("ci-git");function Te(e){Q("git commit existing info: %O",e);let t=Re();Q("commit info from provider environment variables: %O",t);let r=(0,x.transform)(e,(n,o,a)=>{let m=o||(t?t[a]:null);return n[a]=(0,x.defaultTo)(m,null)});return Q("combined git and environment variables from provider: %O",r),r}var ir=async()=>{let e=await(0,Ce.commitInfo)();return Te({branch:e.branch,remoteOrigin:e.remote,authorEmail:e.email,authorName:e.author,message:e.message,sha:e.sha,ghaEventData:e.ghaEventData})},Oe=(0,he.memoize)(ir);var Se=c(require("getos")),Pe=require("lodash"),R=require("os"),Ue=require("util"),ar=async()=>{if((0,R.platform)()==="linux")try{let e=await(0,Ue.promisify)(Se.default)();return"dist"in e&&"release"in e?[e.dist,e.release].join(" - "):(0,R.release)()}catch{return(0,R.release)()}return(0,R.release)()},cr=async()=>{let e=await ar();return{osName:(0,R.platform)(),osVersion:e,osCpus:[],osMemory:{free:(0,R.freemem)(),total:(0,R.totalmem)()}}},Ae=(0,Pe.memoize)(cr);var De={name:"@currents/cmd",version:"1.6.0",main:"./dist/index.js",author:"Currents Software Inc",license:"MIT",description:"Currents CLI tools",scripts:{test:"vitest",rm:"rimraf dist",lint:'TIMING=1 eslint "**/*.ts*"',types:"tsc --noEmit",build:"tsup-node --minify --dts",dev:"tsup-node --watch --dts",release:"release-it","publish:npm":"npm run rm && npm run build && ./publish.js"},devDependencies:{"@jest/reporters":"^29.7.0","@jest/types":"^29.6.3","@release-it/conventional-changelog":"^7.0.2","@types/archiver":"^6.0.3","@types/async-retry":"^1.4.9","@types/debug":"^4.1.12","@types/fs-extra":"^11.0.4","@types/getos":"^3.0.4","@types/lodash":"^4.17.13","@types/node":"^20.14.2","@types/proxy-from-env":"^1.0.4","@types/semver":"^7.5.8","@types/tmp":"^0.2.6","@types/unzipper":"^0.10.10","@types/uuid":"^9.0.8","@types/xml2js":"^0.4.14",jest:"^29.7.0",rimraf:"^5.0.7",tsup:"^8.1.0",typescript:"^5.7.2",vitest:"^2.1.4"},dependencies:{"@commander-js/extra-typings":"^12.1.0","@currents/commit-info":"1.0.1-beta.0",archiver:"^7.0.1","async-retry":"^1.3.3",axios:"^1.7.2","axios-retry":"^4.5.0",chalk:"^4.1.2",commander:"^11.1.0",debug:"^4.3.5",dotenv:"^16.4.5",execa:"^9.5.1","fs-extra":"^11.2.0",getos:"^3.2.1",glob:"^11.0.0","https-proxy-agent":"^7.0.4","jest-cli":"^29.7.0","jest-config":"^29.7.0",lodash:"^4.17.21",nanoid:"^3.3.4","pretty-ms":"^7.0.1","proxy-from-env":"^1.1.0",semver:"^7.6.0","source-map-support":"^0.5.21",tmp:"^0.2.3","tmp-promise":"^3.0.3","ts-pattern":"^5.5.0",unzipper:"^0.12.3",uuid:"^11.0.3",xml2js:"^0.6.2"},bin:{currents:"./dist/bin/index.js","currents-cli":"./dist/bin/index.js"},files:["dist","!**/*.map","!**/*/*.map"],keywords:["cloud test dashboard","test reporter","test results","currents","currents dashboard","ci"],exports:{".":{import:"./dist/index.js",require:"./dist/index.js",types:"./dist/index.d.ts"},"./discovery/jest":{import:"./dist/services/upload/discovery/jest/reporter.js",require:"./dist/services/upload/discovery/jest/reporter.js",types:"./dist/services/upload/discovery/jest/reporter.d.ts"},"./package.json":"./package.json"},"release-it":{npm:{publish:!1},github:{release:!0,releaseName:"${npm.name} v${version}"},plugins:{"@release-it/conventional-changelog":{preset:"angular",header:"# Changelog",ignoreVersion:!0,infile:"./CHANGELOG.md"}},git:{commitMessage:"chore: release ${npm.name} v${version}",tagName:"${npm.name}-v${version}"}}};var Ne=De.version;var mr=[];function W(e){mr.push(e)}var _=c(require("chalk")),A=c(require("util"));var Le=[],ye=[];var Be=(...e)=>{let t=A.default.format(...e);W(t),console.log(t)},pr=(...e)=>{let t=A.default.format(...e);W(t),console.error(t)},z=Be,g=(...e)=>{let t=A.default.format(...e);return ye.push(t),i("WARNING: ",t),Be(_.default.bgYellow.black(" WARNING "),t)};var d=(...e)=>{let t=A.default.format(...lr(e));return Le.push(t),i("ERROR: ",A.default.format(...e)),pr(_.default.bgRed.white(" ERROR "),t)};var lr=e=>e.map(t=>t instanceof Error?t.message:t),v=(e=2)=>console.log(Array(e).fill("").join(`
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}}},fe=e=>{let t=_e();return t?(0,p.chain)(e()).get(t).value():{}};function rr(){return(0,p.chain)(Ee()).omitBy(p.isNull).keys().value()}function or(e){return e&&rr().includes(e)}function _e(){let e=er();return b("detected CI provider name: %s",e),e||null}function nr(){return fe(Ee)}function Re(){return fe(tr)}function Ie(e){let t=nr(),r=_e(),n=sr(e,r);return b("detected CI provider: %s",r),b("detected CI params: %O",t),b("detected CI build ID: %o",n),{params:t,provider:r,ciBuildId:n}}function sr(e,t){return e?{source:"user",value:e}:or(t)?{source:"server",value:null}:{source:"random",value:`auto:${q()}`}}var Ce=require("@currents/commit-info"),he=require("lodash");var x=require("lodash");var Q=i.extend("ci-git");function Te(e){Q("git commit existing info: %O",e);let t=Re();Q("commit info from provider environment variables: %O",t);let r=(0,x.transform)(e,(n,o,a)=>{let m=o||(t?t[a]:null);return n[a]=(0,x.defaultTo)(m,null)});return Q("combined git and environment variables from provider: %O",r),r}var ir=async()=>{let e=await(0,Ce.commitInfo)();return Te({branch:e.branch,remoteOrigin:e.remote,authorEmail:e.email,authorName:e.author,message:e.message,sha:e.sha,ghaEventData:e.ghaEventData})},Oe=(0,he.memoize)(ir);var Se=c(require("getos")),Pe=require("lodash"),R=require("os"),Ue=require("util"),ar=async()=>{if((0,R.platform)()==="linux")try{let e=await(0,Ue.promisify)(Se.default)();return"dist"in e&&"release"in e?[e.dist,e.release].join(" - "):(0,R.release)()}catch{return(0,R.release)()}return(0,R.release)()},cr=async()=>{let e=await ar();return{osName:(0,R.platform)(),osVersion:e,osCpus:[],osMemory:{free:(0,R.freemem)(),total:(0,R.totalmem)()}}},Ae=(0,Pe.memoize)(cr);var De={name:"@currents/cmd",version:"1.6.1",main:"./dist/index.js",author:"Currents Software Inc",license:"MIT",description:"Currents CLI tools",scripts:{test:"vitest",rm:"rimraf dist",lint:'TIMING=1 eslint "**/*.ts*"',types:"tsc --noEmit",build:"tsup-node --minify --dts",dev:"tsup-node --watch --dts",release:"release-it","publish:npm":"npm run rm && npm run build && ./publish.js"},devDependencies:{"@jest/reporters":"^29.7.0","@jest/types":"^29.6.3","@release-it/conventional-changelog":"^7.0.2","@types/archiver":"^6.0.3","@types/async-retry":"^1.4.9","@types/debug":"^4.1.12","@types/fs-extra":"^11.0.4","@types/getos":"^3.0.4","@types/lodash":"^4.17.13","@types/node":"^20.14.2","@types/proxy-from-env":"^1.0.4","@types/semver":"^7.5.8","@types/tmp":"^0.2.6","@types/unzipper":"^0.10.10","@types/uuid":"^9.0.8","@types/xml2js":"^0.4.14",jest:"^29.7.0",rimraf:"^5.0.7",tsup:"^8.1.0",typescript:"^5.7.2",vitest:"^2.1.4"},dependencies:{"@commander-js/extra-typings":"^12.1.0","@currents/commit-info":"1.0.1-beta.0",archiver:"^7.0.1","async-retry":"^1.3.3",axios:"^1.7.2","axios-retry":"^4.5.0",chalk:"^4.1.2",commander:"^11.1.0",debug:"^4.3.5",dotenv:"^16.4.5",execa:"^9.5.1","fs-extra":"^11.2.0",getos:"^3.2.1",glob:"^11.0.0","https-proxy-agent":"^7.0.4","jest-cli":"^29.7.0","jest-config":"^29.7.0",lodash:"^4.17.21",nanoid:"^3.3.4","pretty-ms":"^7.0.1","proxy-from-env":"^1.1.0",semver:"^7.6.0","source-map-support":"^0.5.21",tmp:"^0.2.3","tmp-promise":"^3.0.3","ts-pattern":"^5.5.0",unzipper:"^0.12.3",uuid:"^11.0.3",xml2js:"^0.6.2"},bin:{currents:"./dist/bin/index.js","currents-cli":"./dist/bin/index.js"},files:["dist","!**/*.map","!**/*/*.map"],keywords:["cloud test dashboard","test reporter","test results","currents","currents dashboard","ci"],exports:{".":{import:"./dist/index.js",require:"./dist/index.js",types:"./dist/index.d.ts"},"./discovery/jest":{import:"./dist/services/upload/discovery/jest/reporter.js",require:"./dist/services/upload/discovery/jest/reporter.js",types:"./dist/services/upload/discovery/jest/reporter.d.ts"},"./package.json":"./package.json"},"release-it":{npm:{publish:!1},github:{release:!0,releaseName:"${npm.name} v${version}"},plugins:{"@release-it/conventional-changelog":{preset:"angular",header:"# Changelog",ignoreVersion:!0,infile:"./CHANGELOG.md"}},git:{commitMessage:"chore: release ${npm.name} v${version}",tagName:"${npm.name}-v${version}"}}};var Ne=De.version;var mr=[];function W(e){mr.push(e)}var _=c(require("chalk")),A=c(require("util"));var Le=[],ye=[];var Be=(...e)=>{let t=A.default.format(...e);W(t),console.log(t)},pr=(...e)=>{let t=A.default.format(...e);W(t),console.error(t)},z=Be,g=(...e)=>{let t=A.default.format(...e);return ye.push(t),i("WARNING: ",t),Be(_.default.bgYellow.black(" WARNING "),t)};var d=(...e)=>{let t=A.default.format(...lr(e));return Le.push(t),i("ERROR: ",A.default.format(...e)),pr(_.default.bgRed.white(" ERROR "),t)};var lr=e=>e.map(t=>t instanceof Error?t.message:t),v=(e=2)=>console.log(Array(e).fill("").join(`
3
3
  `)),Ro=_.default.cyan,Io=_.default.blueBright,To=_.default.red,Co=_.default.yellow,ho=_.default.green,Oo=_.default.gray,So=_.default.white,Po=_.default.black,Uo=_.default.magenta,D=_.default.dim,Ao=_.default.bold;var X=c(require("fs-extra")),be=require("path"),dr=require("uuid");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 Er=c(require("crypto"));var At=require("lodash"),K=c(require("path")),Dt=c(require("semver"));var ze=c(require("lodash"));var Ge=c(require("axios")),je=c(require("axios-retry")),Ve=c(require("lodash"));var ee=()=>process.env.CURRENTS_API_URL??"https://cy.currents.dev",xe=()=>process.env.CURRENTS_REST_API_URL??"https://api.currents.dev",ve=()=>3e4;var te=require("axios"),re=c(require("pretty-ms"));var Me=i.extend("http"),M=e=>[3*1e3,15*1e3,30*1e3][e-1],we=e=>(Me("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 Fe(e,t,r){Me("Network request '%s' failed: '%s'. Next attempt is in %s (%d/%d).",`${r.method?.toUpperCase()} ${r.url}`,t.message,(0,re.default)(M(e)),e,w()),g("Network request '%s' failed: '%s'. Next attempt is in %s (%d/%d).",`${r.method?.toUpperCase()} ${r.url}`,t.message,(0,re.default)(M(e)),e,w())}var He=i.extend("http");var oe={api:null,restApi:null};function fr(e){let t=Ge.default.create({baseURL:e==="api"?ee():xe(),timeout:ve(),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={...Ve.default.pick(r,"method","url","headers"),data:Buffer.isBuffer(r.data)?"buffer":r.data};return n?He("network request retry: %o",ke({...o,isRetry:!0})):He("network request: %o",ke(o)),r}),(0,je.default)(t,{retries:w(),retryCondition:we,retryDelay:M,shouldResetTimeout:!0,onRetry:Fe}),t}function Ke(e){return oe[e]===null&&(oe[e]=fr(e)),oe[e]}function ke(e){return{method:e.method,baseUrl:ee(),url:e.url,data:e.isRetry?"<retry>":_r(e.data),headers:{...e.headers,"x-currents-key":"***"}}}function _r(e){return e?.results?.raw?{...e,results:{...e.results,raw:"***"}}:e}var Ye=require("axios"),qe=c(require("lodash")),E=require("ts-pattern");function Qe(e){(0,E.match)(e).when(Ye.isAxiosError,Rr).otherwise(()=>{g("Unexpected error while sending network request: %s",e)})}function Rr(e){return(0,E.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:E.P.not(E.P.nullish)},t=>{Ir(t,{status:t.response.status,data:t.response.data})}).otherwise(t=>{g(`[currents] Unexpected network error: %s
4
4
  %O`,e.message,{method:e.response?.config.method,url:e.response?.config.url,status:e.response?.status,payload:e.response?.config.data})})}function Ir(e,{status:t,data:r}){(0,E.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:
5
5
  %o`,r)}).with(429,()=>{g(`[currents] ${e.response?.config.method} ${e.response?.config.url} - 429 Too Many Requests from cloud service`)}).with(422,()=>{Tr(e,r)}).otherwise(()=>{g(`[currents] Unexpected network response: %s
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@currents/cmd",
3
- "version": "1.6.0",
3
+ "version": "1.6.1",
4
4
  "main": "./dist/index.js",
5
5
  "author": "Currents Software Inc",
6
6
  "license": "MIT",