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