@currents/cmd 2.3.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -1
- package/dist/bin/index.js +41 -40
- package/dist/index.js +8 -9
- package/dist/services/upload/discovery/jest/reporter.js +1 -1
- package/dist/skills/currents-cli/SKILL.md +3 -2
- package/docs/ci-setup.md +2 -2
- package/package.json +14 -34
package/dist/index.js
CHANGED
|
@@ -1,13 +1,12 @@
|
|
|
1
|
-
"use strict";var Fr=Object.create;var V=Object.defineProperty;var Gr=Object.getOwnPropertyDescriptor;var kr=Object.getOwnPropertyNames;var jr=Object.getPrototypeOf,Hr=Object.prototype.hasOwnProperty;var Mt=(t,e)=>{for(var r in e)V(t,r,{get:e[r],enumerable:!0})},vt=(t,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of kr(e))!Hr.call(t,o)&&o!==r&&V(t,o,{get:()=>e[o],enumerable:!(n=Gr(e,o))||n.enumerable});return t};var l=(t,e,r)=>(r=t!=null?Fr(jr(t)):{},vt(e||!t||!t.__esModule?V(r,"default",{value:t,enumerable:!0}):r,t)),Kr=t=>vt(V({},"__esModule",{value:!0}),t);var xo={};Mt(xo,{handleCurrentsReport:()=>wr});module.exports=Kr(xo);var Ft=require("debug"),Jr=l(require("fs-extra")),c=(0,Ft.debug)("currents"),Yr=null;function Gt(t){Yr=t}var W={};Mt(W,{getNanoid:()=>$r,userFacingNanoid:()=>It});var gt=require("nanoid"),kt="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",$r=(t=16)=>(0,gt.customAlphabet)(kt,t)(),It=(0,gt.customAlphabet)(kt,12);var g=require("lodash");function jt(t){return t.replace(/^([a-z][a-z0-9+.-]*:\/\/)[^/?#\s]*@/i,"$1")}var q=c.extend("ci"),Vr=(t,e)=>(0,g.set)(t,(0,g.camelCase)(e),process.env[e]),_=t=>(0,g.transform)(t,Vr,{}),Wr=()=>process.env.TF_BUILD&&process.env.AZURE_HTTP_USER_AGENT,qr=()=>(0,g.some)(process.env,(t,e)=>/^CODEBUILD_/.test(e)),Qr=()=>process.env.bamboo_buildNumber,Xr=()=>(0,g.some)(process.env,(t,e)=>/^CONCOURSE_/.test(e)),zr=()=>process.env.GITLAB_CI||process.env.CI_SERVER_NAME&&/^GitLab/.test(process.env.CI_SERVER_NAME),Zr=()=>!!(process.env.BUILD_ID&&process.env.PROJECT_ID&&process.env.PROJECT_NUMBER||process.env.GCP_PROJECT||process.env.GCLOUD_PROJECT||process.env.GOOGLE_CLOUD_PROJECT),tn=()=>process.env.JENKINS_URL||process.env.JENKINS_HOME||process.env.JENKINS_VERSION||process.env.HUDSON_URL||process.env.HUDSON_HOME,en={appveyor:"APPVEYOR",azure:Wr,awsCodeBuild:qr,bamboo:Qr,bitbucket:"BITBUCKET_BUILD_NUMBER",buildkite:"BUILDKITE",circle:"CIRCLECI",concourse:Xr,codeFresh:"CF_BUILD_ID",drone:"DRONE",githubActions:"GITHUB_ACTIONS",gitlab:zr,goCD:"GO_JOB_NAME",jenkins:tn,googleCloud:Zr,semaphore:"SEMAPHORE",teamcity:"TEAMCITY_VERSION",travis:"TRAVIS",netlify:"NETLIFY"};function rn(){let{env:t}=process;return(0,g.findKey)(en,e=>{if((0,g.isString)(e))return t[e];if((0,g.isFunction)(e))return e()})}var Ht=()=>({appveyor:_(["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:_(["AGENT_BUILDDIRECTORY","AGENT_ID","AGENT_JOBNAME","AGENT_JOBSTATUS","AGENT_MACHINENAME","AGENT_NAME","AGENT_OS","AGENT_OSARCHITECTURE","BUILD_BUILDID","BUILD_BUILDNUMBER","BUILD_BUILDURI","BUILD_CONTAINERID","BUILD_CRONSCHEDULE_DISPLAYNAME","BUILD_DEFINITIONNAME","BUILD_DEFINITIONVERSION","BUILD_QUEUEDBY","BUILD_QUEUEDBYID","BUILD_REASON","BUILD_REPOSITORY_ID","BUILD_REPOSITORY_NAME","BUILD_REPOSITORY_PROVIDER","BUILD_REPOSITORY_URI","BUILD_REQUESTEDFOR","BUILD_REQUESTEDFOREMAIL","BUILD_REQUESTEDFORID","BUILD_SOURCEBRANCH","BUILD_SOURCEBRANCHNAME","BUILD_SOURCESDIRECTORY","BUILD_SOURCEVERSION","BUILD_SOURCEVERSIONAUTHOR","BUILD_SOURCEVERSIONMESSAGE","BUILD_STAGINGDIRECTORY","BUILD_TRIGGEREDBY_BUILDID","BUILD_TRIGGEREDBY_BUILDNUMBER","BUILD_TRIGGEREDBY_DEFINITIONID","BUILD_TRIGGEREDBY_DEFINITIONNAME","BUILD_TRIGGEREDBY_PROJECTID","COMMON_TESTRESULTSDIRECTORY","PIPELINE_WORKSPACE","SYSTEM_COLLECTIONID","SYSTEM_COLLECTIONURI","SYSTEM_DEFAULTWORKINGDIRECTORY","SYSTEM_DEFINITIONID","SYSTEM_HOSTTYPE","SYSTEM_JOBATTEMPT","SYSTEM_JOBDISPLAYNAME","SYSTEM_JOBID","SYSTEM_JOBNAME","SYSTEM_PHASEATTEMPT","SYSTEM_PHASEDISPLAYNAME","SYSTEM_PHASENAME","SYSTEM_PLANID","SYSTEM_PULLREQUEST_ISFORK","SYSTEM_PULLREQUEST_PULLREQUESTID","SYSTEM_PULLREQUEST_PULLREQUESTNUMBER","SYSTEM_PULLREQUEST_SOURCEREPOSITORYURI","SYSTEM_PULLREQUEST_SOURCEBRANCH","SYSTEM_PULLREQUEST_SOURCECOMMITID","SYSTEM_PULLREQUEST_TARGETBRANCH","SYSTEM_PULLREQUEST_TARGETBRANCHNAME","SYSTEM_STAGEATTEMPT","SYSTEM_STAGEDISPLAYNAME","SYSTEM_STAGENAME","SYSTEM_TEAMFOUNDATIONCOLLECTIONURI","SYSTEM_TEAMPROJECT","SYSTEM_TEAMPROJECTID","SYSTEM_TIMELINEID"]),awsCodeBuild:_(["AWS_DEFAULT_REGION","AWS_REGION","CODEBUILD_BATCH_BUILD_IDENTIFIER","CODEBUILD_BUILD_ARN","CODEBUILD_BUILD_ID","CODEBUILD_BUILD_IMAGE","CODEBUILD_BUILD_NUMBER","CODEBUILD_BUILD_SUCCEEDING","CODEBUILD_BUILD_URL","CODEBUILD_INITIATOR","CODEBUILD_PROJECT_ARN","CODEBUILD_PUBLIC_BUILD_URL","CODEBUILD_RESOLVED_SOURCE_VERSION","CODEBUILD_SOURCE_REPO_URL","CODEBUILD_SOURCE_VERSION","CODEBUILD_SRC_DIR","CODEBUILD_START_TIME","CODEBUILD_WEBHOOK_ACTOR_ACCOUNT_ID","CODEBUILD_WEBHOOK_BASE_REF","CODEBUILD_WEBHOOK_EVENT","CODEBUILD_WEBHOOK_HEAD_REF","CODEBUILD_WEBHOOK_MERGE_COMMIT","CODEBUILD_WEBHOOK_PREV_COMMIT","CODEBUILD_WEBHOOK_TRIGGER","CODEBUILD_WEBHOOK_LABEL","CODEBUILD_WEBHOOK_RUN_ID","CODEBUILD_WEBHOOK_JOB_ID","CODEBUILD_WEBHOOK_WORKFLOW_NAME","CODEBUILD_RUNNER_OWNER","CODEBUILD_RUNNER_REPO","CODEBUILD_RUNNER_REPO_DOMAIN","CODEBUILD_RUNNER_WITH_BUILDSPEC"]),bamboo:_(["bamboo_buildNumber","bamboo_buildResultsUrl","bamboo_planRepository_repositoryUrl","bamboo_buildKey"]),bitbucket:_(["CI","BITBUCKET_WORKSPACE","BITBUCKET_REPO_SLUG","BITBUCKET_REPO_UUID","BITBUCKET_REPO_FULL_NAME","BITBUCKET_REPO_IS_PRIVATE","BITBUCKET_REPO_OWNER","BITBUCKET_REPO_OWNER_UUID","BITBUCKET_PROJECT_KEY","BITBUCKET_PROJECT_UUID","BITBUCKET_BUILD_NUMBER","BITBUCKET_PIPELINE_UUID","BITBUCKET_STEP_UUID","BITBUCKET_STEP_RUN_NUMBER","BITBUCKET_STEP_TRIGGERER_UUID","BITBUCKET_PARALLEL_STEP","BITBUCKET_PARALLEL_STEP_COUNT","BITBUCKET_CLONE_DIR","BITBUCKET_COMMIT","BITBUCKET_BRANCH","BITBUCKET_TAG","BITBUCKET_BOOKMARK","BITBUCKET_GIT_HTTP_ORIGIN","BITBUCKET_GIT_SSH_ORIGIN","BITBUCKET_PR_ID","BITBUCKET_PR_DESTINATION_BRANCH","BITBUCKET_PR_DESTINATION_COMMIT","BITBUCKET_DEPLOYMENT_ENVIRONMENT","BITBUCKET_DEPLOYMENT_ENVIRONMENT_UUID","BITBUCKET_EXIT_CODE"]),buildkite:_(["BUILDKITE_ORGANIZATION_SLUG","BUILDKITE_PIPELINE_ID","BUILDKITE_PIPELINE_NAME","BUILDKITE_PIPELINE_SLUG","BUILDKITE_PIPELINE_DEFAULT_BRANCH","BUILDKITE_REPO","BUILDKITE_SOURCE","BUILDKITE_BRANCH","BUILDKITE_TAG","BUILDKITE_COMMIT","BUILDKITE_MESSAGE","BUILDKITE_BUILD_AUTHOR","BUILDKITE_BUILD_AUTHOR_EMAIL","BUILDKITE_JOB_ID","BUILDKITE_BUILD_ID","BUILDKITE_BUILD_URL","BUILDKITE_BUILD_NUMBER","BUILDKITE_LABEL","BUILDKITE_COMMAND","BUILDKITE_STEP_ID","BUILDKITE_STEP_KEY","BUILDKITE_PARALLEL_JOB","BUILDKITE_PARALLEL_JOB_COUNT","BUILDKITE_RETRY_COUNT","BUILDKITE_COMPUTE_TYPE","BUILDKITE_CLUSTER_NAME","BUILDKITE_PULL_REQUEST","BUILDKITE_PULL_REQUEST_REPO","BUILDKITE_PULL_REQUEST_BASE_BRANCH","BUILDKITE_PULL_REQUEST_DRAFT","BUILDKITE_PULL_REQUEST_LABELS","BUILDKITE_MERGE_QUEUE_BASE_BRANCH","BUILDKITE_MERGE_QUEUE_BASE_COMMIT","BUILDKITE_REBUILT_FROM_BUILD_ID","BUILDKITE_REBUILT_FROM_BUILD_NUMBER","BUILDKITE_TRIGGERED_FROM_BUILD_ID","BUILDKITE_TRIGGERED_FROM_BUILD_NUMBER","BUILDKITE_TRIGGERED_FROM_BUILD_PIPELINE_SLUG"]),circle:_(["CI","CIRCLECI","CIRCLE_BRANCH","CIRCLE_BUILD_NUM","CIRCLE_BUILD_URL","CIRCLE_PREVIOUS_BUILD_NUM","CIRCLE_JOB","CIRCLE_WORKFLOW_ID","CIRCLE_WORKFLOW_JOB_ID","CIRCLE_WORKFLOW_WORKSPACE_ID","CIRCLE_PIPELINE_ID","CIRCLE_ORGANIZATION_ID","CIRCLE_PROJECT_ID","CIRCLE_PROJECT_REPONAME","CIRCLE_PROJECT_USERNAME","CIRCLE_REPOSITORY_URL","CIRCLE_WORKING_DIRECTORY","CIRCLE_SHA1","CIRCLE_TAG","CIRCLE_USERNAME","CIRCLE_NODE_INDEX","CIRCLE_NODE_TOTAL","CIRCLE_PR_NUMBER","CIRCLE_PR_REPONAME","CIRCLE_PR_USERNAME","CIRCLE_PULL_REQUEST","CIRCLE_PULL_REQUESTS","CI_PULL_REQUEST"]),concourse:_(["BUILD_ID","BUILD_NAME","BUILD_JOB_NAME","BUILD_PIPELINE_NAME","BUILD_TEAM_NAME","ATC_EXTERNAL_URL"]),codeFresh:_(["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:_(["DRONE_BUILD_LINK","DRONE_BUILD_NUMBER","DRONE_PULL_REQUEST"]),githubActions:_(["CI","GITHUB_ACTIONS","GITHUB_WORKFLOW","GITHUB_WORKFLOW_REF","GITHUB_WORKFLOW_SHA","GITHUB_ACTION","GITHUB_ACTION_PATH","GITHUB_ACTION_REPOSITORY","GITHUB_JOB","GITHUB_EVENT_NAME","GITHUB_EVENT_PATH","GITHUB_RUN_ID","GITHUB_RUN_NUMBER","GITHUB_RUN_ATTEMPT","GITHUB_REPOSITORY","GITHUB_REPOSITORY_ID","GITHUB_REPOSITORY_OWNER","GITHUB_REPOSITORY_OWNER_ID","GITHUB_REF","GITHUB_REF_NAME","GITHUB_REF_TYPE","GITHUB_REF_PROTECTED","GITHUB_BASE_REF","GITHUB_HEAD_REF","GITHUB_SHA","GITHUB_ACTOR","GITHUB_ACTOR_ID","GITHUB_TRIGGERING_ACTOR","GITHUB_SERVER_URL","GITHUB_API_URL","GITHUB_GRAPHQL_URL","GITHUB_WORKSPACE","GITHUB_RETENTION_DAYS","RUNNER_OS","RUNNER_ARCH","RUNNER_NAME","RUNNER_ENVIRONMENT","RUNNER_DEBUG"]),gitlab:_(["CI_PIPELINE_ID","CI_PIPELINE_URL","CI_BUILD_ID","CI_JOB_ID","CI_JOB_URL","CI_JOB_NAME","CI_NODE_INDEX","CI_NODE_TOTAL","GITLAB_HOST","CI_PROJECT_ID","CI_PROJECT_URL","CI_REPOSITORY_URL","CI_ENVIRONMENT_URL","CI_DEFAULT_BRANCH","RUN_ATTEMPT","CI_MERGE_REQUEST_IID","CI_MERGE_REQUEST_PROJECT_URL","CI_MERGE_REQUEST_TITLE","CI_MERGE_REQUEST_SOURCE_BRANCH_NAME","CI_MERGE_REQUEST_TARGET_BRANCH_NAME","CI_OPEN_MERGE_REQUESTS"]),goCD:_(["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:_(["BUILD_ID","PROJECT_ID","REPO_NAME","BRANCH_NAME","TAG_NAME","COMMIT_SHA","SHORT_SHA"]),jenkins:_(["BRANCH_NAME","BUILD_DISPLAY_NAME","BUILD_ID","BUILD_NUMBER","BUILD_TAG","BUILD_URL","CHANGE_AUTHOR","CHANGE_AUTHOR_DISPLAY_NAME","CHANGE_AUTHOR_EMAIL","CHANGE_BRANCH","CHANGE_FORK","CHANGE_ID","CHANGE_TARGET","CHANGE_TITLE","CHANGE_URL","CI","EXECUTOR_NUMBER","JAVA_HOME","JENKINS_HOME","JENKINS_URL","JOB_BASE_NAME","JOB_NAME","JOB_URL","NODE_LABELS","NODE_NAME","RUN_ARTIFACTS_DISPLAY_URL","RUN_CHANGES_DISPLAY_URL","TAG_NAME","WORKSPACE","WORKSPACE_TMP","GIT_AUTHOR_EMAIL","GIT_AUTHOR_NAME","GIT_BRANCH","GIT_COMMIT","GIT_COMMITTER_EMAIL","GIT_COMMITTER_NAME","GIT_LOCAL_BRANCH","GIT_PREVIOUS_COMMIT","GIT_PREVIOUS_SUCCESSFUL_COMMIT","GIT_URL","ghprbActualCommit","ghprbGhRepository","ghprbPullId","ghprbPullLink","ghprbSourceBranch","ghprbTargetBranch","ghprbTriggerAuthorLogin"]),semaphore:_(["SEMAPHORE_BRANCH_ID","SEMAPHORE_BUILD_NUMBER","SEMAPHORE_CURRENT_JOB","SEMAPHORE_CURRENT_THREAD","SEMAPHORE_EXECUTABLE_UUID","SEMAPHORE_GIT_BRANCH","SEMAPHORE_GIT_DIR","SEMAPHORE_GIT_REF","SEMAPHORE_GIT_REF_TYPE","SEMAPHORE_GIT_REPO_SLUG","SEMAPHORE_GIT_SHA","SEMAPHORE_GIT_URL","SEMAPHORE_JOB_COUNT","SEMAPHORE_JOB_ID","SEMAPHORE_JOB_NAME","SEMAPHORE_JOB_UUID","SEMAPHORE_PIPELINE_ID","SEMAPHORE_PLATFORM","SEMAPHORE_PROJECT_DIR","SEMAPHORE_PROJECT_HASH_ID","SEMAPHORE_PROJECT_ID","SEMAPHORE_PROJECT_NAME","SEMAPHORE_PROJECT_UUID","SEMAPHORE_REPO_SLUG","SEMAPHORE_TRIGGER_SOURCE","SEMAPHORE_WORKFLOW_ID","PULL_REQUEST_NUMBER"]),teamcity:null,travis:_(["TRAVIS_JOB_ID","TRAVIS_BUILD_ID","TRAVIS_BUILD_WEB_URL","TRAVIS_REPO_SLUG","TRAVIS_JOB_NUMBER","TRAVIS_EVENT_TYPE","TRAVIS_COMMIT_RANGE","TRAVIS_BUILD_NUMBER","TRAVIS_PULL_REQUEST","TRAVIS_PULL_REQUEST_BRANCH","TRAVIS_PULL_REQUEST_SHA"]),netlify:_(["BUILD_ID","CONTEXT","URL","DEPLOY_URL","DEPLOY_PRIME_URL","DEPLOY_ID"])}),nn=t=>{let e=Kt();return e?(0,g.chain)(t()).get(e).value():{}};function on(){return(0,g.chain)(Ht()).omitBy(g.isNull).keys().value()}function sn(t){return t&&on().includes(t)}function Kt(){let t=rn();return q("detected CI provider name: %s",t),t||null}function an(){let t=nn(Ht);return(0,g.mapValues)(t,e=>(0,g.isString)(e)?jt(e):e)}function Jt(t){let e=an(),r=Kt(),n=cn(t,r);return q("detected CI provider: %s",r),q("detected CI params: %O",e),q("detected CI build ID: %o",n),{params:e,provider:r,ciBuildId:n}}function cn(t,e){return t?{source:"user",value:t}:sn(e)?{source:"server",value:null}:{source:"random",value:`auto:${It()}`}}var Yt=require("@currents/commit-info"),$t=require("lodash");var pn=c.extend("git"),un=async()=>{let t=await(0,Yt.commitInfo)();return pn("commit: %O",t),{branch:t.branch,remoteOrigin:t.remote,authorEmail:t.email,authorName:t.author,message:t.message,sha:t.sha,ghaEventData:t.ghaEventData??null}},Tt=(0,$t.memoize)(un);var Vt=l(require("getos")),Wt=require("lodash"),y=require("os"),qt=require("util"),ln=async()=>{if((0,y.platform)()==="linux")try{let t=await(0,qt.promisify)(Vt.default)();return"dist"in t&&"release"in t?[t.dist,t.release].join(" - "):(0,y.release)()}catch{return(0,y.release)()}return(0,y.release)()},mn=async()=>{let t=await ln();return{osName:(0,y.platform)(),osVersion:t,osCpus:[],osMemory:{free:(0,y.freemem)(),total:(0,y.totalmem)()}}},Qt=(0,Wt.memoize)(mn);var Xt={name:"@currents/cmd",version:"2.3.0",main:"./dist/index.js",author:{name:"Currents Software Inc",email:"hello@currents.dev"},license:"MIT",repository:{type:"git",url:"https://github.com/currents-dev/currents-reporter"},description:"Currents CLI tools",engines:{node:">=20"},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":"^30.4.1","@jest/types":"^30.4.1","@release-it/conventional-changelog":"^12.0.0","release-it":"^21.0.2","@types/archiver":"^6.0.3","@types/async-retry":"^1.4.9","@types/debug":"^4.1.12","@types/fs-extra":"^11.0.4","@types/getos":"^3.0.4","@types/lodash":"^4.17.16","@types/node":"^25.5.0","@types/proxy-from-env":"^1.0.4","@types/semver":"^7.5.8","@types/tmp":"^0.2.6","@types/unzipper":"^0.10.11","@types/uuid":"^10.0.0","@types/xml2js":"^0.4.14","@types/xxhashjs":"^0.2.4",jest:"^30.4.2","jest-cli":"^30.4.2","jest-config":"^30.4.2",rimraf:"^6.0.1",tsup:"^8.3.5",typescript:"^5.9.3",vitest:"^4.1.11"},dependencies:{"@commander-js/extra-typings":"^14.0.0","@currents/commit-info":"2.0.0","@currents/rules":"^0.1.0",archiver:"^7.0.1","async-retry":"^1.3.3",axios:"1.20.0","axios-retry":"4.5.0",chalk:"^4.1.2",commander:"^14.0.0",debug:"^4.4.0",dotenv:"^17.4.2",execa:"^9.5.1","fs-extra":"^11.3.4",getos:"^3.2.1",globby:"^11.1.0","https-proxy-agent":"^7.0.4",lodash:"^4.18.1",nanoid:"^3.3.8","pretty-ms":"^7.0.1","proxy-from-env":"^1.1.0",semver:"^7.8.5","source-map-support":"^0.5.21",tmp:"^0.2.7","tmp-promise":"^3.0.3","ts-pattern":"^5.8.0",unzipper:"^0.12.3",uuid:"11.1.1",xml2js:"^0.6.2",xxhashjs:"^0.2.2"},bin:{currents:"./dist/bin/index.js","currents-cli":"./dist/bin/index.js"},files:["dist","docs","!**/*.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:{name:"conventionalcommits"},header:"# Changelog",ignoreVersion:!0,infile:"./CHANGELOG.md"}},git:{commitMessage:"chore: release ${npm.name} v${version}",tagName:"${npm.name}-v${version}"}}};var Q=Xt.version;var Rt=l(require("lodash")),dn=["apiKey","recordKey","key"];function zt(t,e){return Rt.default.isPlainObject(t)?Rt.default.mapValues(t,(r,n)=>e.includes(n)&&r!==void 0?"*****":zt(r,e)):t}function N(t){return zt(t,dn)}var En=[];function _t(t){En.push(t)}var U=l(require("chalk")),F=l(require("util"));var Zt=[],te=[];var ee=(...t)=>{let e=F.default.format(...t);_t(e),console.log(e)},gn=(...t)=>{let e=F.default.format(...t);_t(e),console.error(e)},G=ee,d=(...t)=>{let e=F.default.format(...t);return te.push(e),c("WARNING: ",e),ee(U.default.bgYellow.black(" WARNING "),e)};var R=(...t)=>{let e=F.default.format(...In(t));return Zt.push(e),c("ERROR: ",F.default.format(...t)),gn(U.default.bgRed.white(" ERROR "),e)};var In=t=>t.map(e=>e instanceof Error?e.message:e),X=(t=2)=>console.log(Array(t).fill("").join(`
|
|
2
|
-
`)),ls=U.default.cyan,ms=U.default.blueBright,fs=U.default.red,ds=U.default.yellow,Es=U.default.green,gs=U.default.gray,Is=U.default.white,Ts=U.default.black,Rs=U.default.magenta,k=U.default.dim,_s=U.default.bold;var j=l(require("fs-extra")),Ct=require("path"),Rn=require("uuid");async function M(t){try{return await j.default.readJson(t)}catch(e){throw R("Error while reading JSON file: %s",t,e),R}}async function ht(t,e){try{return await j.default.writeFile(t,e,"utf8"),t}catch(r){throw R(`Error writing file at ${t}:`,r),r}}async function re(t){try{return await j.default.ensureDir(t),c("Folder created",t),t}catch(e){throw R(`Failed to create folder at ${t}:`,e),e}}async function ne(t,e){try{return await j.default.ensureDir((0,Ct.dirname)(e)),await j.default.copy(t,e),c("File copied from %s to %s",t,e),e}catch(r){throw R(`Failed to copy file from ${t} to ${e}:`,r),r}}var oe=l(require("crypto"));function se(t){return oe.createHash("sha256").update(t).digest("base64").slice(0,8).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}var Pr=l(require("axios")),bt=l(require("fs-extra")),ft=l(require("path")),Br=l(require("semver"));var Ae=l(require("lodash"));var Ee=l(require("axios")),ge=l(require("axios-retry")),yt=l(require("lodash"));var ie=()=>process.env.CURRENTS_API_URL??"https://cy.currents.dev",ae=()=>process.env.CURRENTS_REST_API_URL??"https://api.currents.dev",ce=()=>3e4;var z=require("axios"),At=l(require("pretty-ms"));var ue=c.extend("http"),pe=[3*1e3,15*1e3,30*1e3],le=60*1e3;function Ut(t,e=Date.now()){let r=t?.response?.headers?.["retry-after"];if(r==null||r==="")return;let n=Number(r);if(Number.isFinite(n))return Math.max(0,n*1e3);let o=Date.parse(String(r));return Number.isNaN(o)?void 0:Math.max(0,o-e)}var Z=(t,e)=>{let r=pe[Math.min(t,pe.length)-1],n=Ut(e);return n===void 0?r:Math.min(Math.max(n,r),le)},Dt=t=>(ue("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,z.isAxiosError)(t)}),"code"in t&&t.code&&["ECONNABORTED","ECONNREFUSED","ECONNRESET","ETIMEDOUT","ENETRESET"].includes(t.code)?!0:(0,z.isAxiosError)(t)?[408,429,502,503,504].includes(t.response?.status??0):!1),_n=["get","head","options","put","delete"],me=t=>{if(!(0,z.isAxiosError)(t))return!1;let e=t.response?.status;if(e===429){let r=Ut(t);return r===void 0||r<=le}return _n.includes(t.config?.method?.toLowerCase()??"get")?Dt(t):e===408||t.code==="ECONNREFUSED"||t.code==="ENOTFOUND"},tt=()=>3;function fe(t,e,r){ue("Network request '%s' failed: '%s'. Next attempt is in %s (%d/%d).",`${r.method?.toUpperCase()} ${r.url}`,e.message,(0,At.default)(Z(t,e)??0),t,tt()),d("Network request '%s' failed: '%s'. Next attempt is in %s (%d/%d).",`${r.method?.toUpperCase()} ${r.url}`,e.message,(0,At.default)(Z(t,e)??0),t,tt())}var St=c.extend("http");var Ot={api:null,restApi:null};function Cn(t){let e=t==="api"?ie():ae();St("client base url: %s",e);let r=Ee.default.create({baseURL:e,timeout:ce(),transitional:{clarifyTimeoutError:!0}});return r.interceptors.request.use(n=>{let o=n["axios-retry"]?.retryCount??0;n.headers.set({"x-cmd-version":Q}),n.headers.get("Content-Type")||n.headers.set("Content-Type","application/json");let s={...yt.default.pick(n,"method","url","headers"),baseURL:e,data:Buffer.isBuffer(n.data)?"buffer":n.data,params:n.params};return o?St("network request retry: %o",de({...s,baseURL:e,isRetry:!0})):St("network request: %o",de(s)),n}),(0,ge.default)(r,{retries:tt(),retryCondition:t==="restApi"?me:Dt,retryDelay:(n,o)=>Z(n,o),shouldResetTimeout:!0,onRetry:fe}),r}function et(t){return Ot[t]===null&&(Ot[t]=Cn(t)),Ot[t]}function de(t){return{method:t.method,baseURL:t.baseURL,url:t.url,data:t.isRetry?"<retry>":hn(t.data),params:t.isRetry?"<retry>":t.params,headers:{...t.headers,Authorization:"Bearer ***","x-currents-key":"***"}}}function hn(t){if(t?.results?.raw)return N({...t,results:{...t.results,raw:"***"}});if(typeof t=="string")try{return N(JSON.parse(t))}catch{return t}return yt.default.isPlainObject(t)?N(t):t}var Re=require("axios"),_e=l(require("lodash")),A=require("ts-pattern");function Ce(t){(0,A.match)(t).when(Re.isAxiosError,An).otherwise(()=>{d("Unexpected error while sending network request: %s",t)})}function An(t){return(0,A.match)(t).with({code:"ECONNABORTED"},()=>{d("Network connection aborted")}).with({code:"ECONNREFUSED"},()=>{d("Network connection aborted")}).with({code:"ECONNRESET"},()=>{d("Network connection reset")}).with({code:"ETIMEDOUT"},()=>{d("Network connection timeout")}).with({response:A.P.not(A.P.nullish)},e=>{Un(e,{status:e.response.status,data:e.response.data})}).otherwise(e=>{d(`[currents] Unexpected network error: %s
|
|
3
|
-
%O`,t.message,{method:
|
|
4
|
-
%o`,r)
|
|
5
|
-
%O`,t.message,{method:t.
|
|
6
|
-
%O`,t.message,{method:t.response?.config.method,url:t.response?.config.url,status:t.response?.status})})}var Ie={RUN_CANCELLED:"RUN_CANCELLED",RUN_EXPIRED:"RUN_EXPIRED",MISSING_SUITE:"MISSING_SUITE"};function Te(t,e){return _e.default.isString(t)?e?.length===0?[t]:[t,`
|
|
1
|
+
"use strict";var hn=Object.create;var et=Object.defineProperty;var Cn=Object.getOwnPropertyDescriptor;var Sn=Object.getOwnPropertyNames;var An=Object.getPrototypeOf,yn=Object.prototype.hasOwnProperty;var Qt=(t,e)=>{for(var r in e)et(t,r,{get:e[r],enumerable:!0})},zt=(t,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of Sn(e))!yn.call(t,o)&&o!==r&&et(t,o,{get:()=>e[o],enumerable:!(n=Cn(e,o))||n.enumerable});return t};var m=(t,e,r)=>(r=t!=null?hn(An(t)):{},zt(e||!t||!t.__esModule?et(r,"default",{value:t,enumerable:!0}):r,t)),Un=t=>zt(et({},"__esModule",{value:!0}),t);var zs={};Qt(zs,{handleCurrentsReport:()=>Tn});module.exports=Un(zs);var Xt=require("debug"),On=m(require("fs")),p=(0,Xt.debug)("currents"),Dn=null;function Zt(t){Dn=t}var rt={};Qt(rt,{getNanoid:()=>re,userFacingNanoid:()=>Ut});var ee=require("crypto"),te="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",re=(t=16)=>Array.from({length:t},()=>te[(0,ee.randomInt)(te.length)]).join(""),Ut=()=>re(12);var E=require("lodash");function Ot(t){return t.replace(/^([a-z][a-z0-9+.-]*:\/\/)[^/?#\s]*@/i,"$1")}function Dt(t){return Ot(t).replace(/[?#].*$/,"")}var nt=p.extend("ci"),xn=(t,e)=>(0,E.set)(t,(0,E.camelCase)(e),process.env[e]),_=t=>(0,E.transform)(t,xn,{}),Nn=()=>process.env.TF_BUILD&&process.env.AZURE_HTTP_USER_AGENT,Ln=()=>(0,E.some)(process.env,(t,e)=>/^CODEBUILD_/.test(e)),Pn=()=>process.env.bamboo_buildNumber,Bn=()=>(0,E.some)(process.env,(t,e)=>/^CONCOURSE_/.test(e)),wn=()=>process.env.GITLAB_CI||process.env.CI_SERVER_NAME&&/^GitLab/.test(process.env.CI_SERVER_NAME),bn=()=>!!(process.env.BUILD_ID&&process.env.PROJECT_ID&&process.env.PROJECT_NUMBER||process.env.GCP_PROJECT||process.env.GCLOUD_PROJECT||process.env.GOOGLE_CLOUD_PROJECT),Mn=()=>process.env.JENKINS_URL||process.env.JENKINS_HOME||process.env.JENKINS_VERSION||process.env.HUDSON_URL||process.env.HUDSON_HOME,vn={appveyor:"APPVEYOR",azure:Nn,awsCodeBuild:Ln,bamboo:Pn,bitbucket:"BITBUCKET_BUILD_NUMBER",buildkite:"BUILDKITE",circle:"CIRCLECI",concourse:Bn,codeFresh:"CF_BUILD_ID",drone:"DRONE",githubActions:"GITHUB_ACTIONS",gitlab:wn,goCD:"GO_JOB_NAME",jenkins:Mn,googleCloud:bn,semaphore:"SEMAPHORE",teamcity:"TEAMCITY_VERSION",travis:"TRAVIS",netlify:"NETLIFY"};function Fn(){let{env:t}=process;return(0,E.findKey)(vn,e=>{if((0,E.isString)(e))return t[e];if((0,E.isFunction)(e))return e()})}var ne=()=>({appveyor:_(["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:_(["AGENT_BUILDDIRECTORY","AGENT_ID","AGENT_JOBNAME","AGENT_JOBSTATUS","AGENT_MACHINENAME","AGENT_NAME","AGENT_OS","AGENT_OSARCHITECTURE","BUILD_BUILDID","BUILD_BUILDNUMBER","BUILD_BUILDURI","BUILD_CONTAINERID","BUILD_CRONSCHEDULE_DISPLAYNAME","BUILD_DEFINITIONNAME","BUILD_DEFINITIONVERSION","BUILD_QUEUEDBY","BUILD_QUEUEDBYID","BUILD_REASON","BUILD_REPOSITORY_ID","BUILD_REPOSITORY_NAME","BUILD_REPOSITORY_PROVIDER","BUILD_REPOSITORY_URI","BUILD_REQUESTEDFOR","BUILD_REQUESTEDFOREMAIL","BUILD_REQUESTEDFORID","BUILD_SOURCEBRANCH","BUILD_SOURCEBRANCHNAME","BUILD_SOURCESDIRECTORY","BUILD_SOURCEVERSION","BUILD_SOURCEVERSIONAUTHOR","BUILD_SOURCEVERSIONMESSAGE","BUILD_STAGINGDIRECTORY","BUILD_TRIGGEREDBY_BUILDID","BUILD_TRIGGEREDBY_BUILDNUMBER","BUILD_TRIGGEREDBY_DEFINITIONID","BUILD_TRIGGEREDBY_DEFINITIONNAME","BUILD_TRIGGEREDBY_PROJECTID","COMMON_TESTRESULTSDIRECTORY","PIPELINE_WORKSPACE","SYSTEM_COLLECTIONID","SYSTEM_COLLECTIONURI","SYSTEM_DEFAULTWORKINGDIRECTORY","SYSTEM_DEFINITIONID","SYSTEM_HOSTTYPE","SYSTEM_JOBATTEMPT","SYSTEM_JOBDISPLAYNAME","SYSTEM_JOBID","SYSTEM_JOBNAME","SYSTEM_PHASEATTEMPT","SYSTEM_PHASEDISPLAYNAME","SYSTEM_PHASENAME","SYSTEM_PLANID","SYSTEM_PULLREQUEST_ISFORK","SYSTEM_PULLREQUEST_PULLREQUESTID","SYSTEM_PULLREQUEST_PULLREQUESTNUMBER","SYSTEM_PULLREQUEST_SOURCEREPOSITORYURI","SYSTEM_PULLREQUEST_SOURCEBRANCH","SYSTEM_PULLREQUEST_SOURCECOMMITID","SYSTEM_PULLREQUEST_TARGETBRANCH","SYSTEM_PULLREQUEST_TARGETBRANCHNAME","SYSTEM_STAGEATTEMPT","SYSTEM_STAGEDISPLAYNAME","SYSTEM_STAGENAME","SYSTEM_TEAMFOUNDATIONCOLLECTIONURI","SYSTEM_TEAMPROJECT","SYSTEM_TEAMPROJECTID","SYSTEM_TIMELINEID"]),awsCodeBuild:_(["AWS_DEFAULT_REGION","AWS_REGION","CODEBUILD_BATCH_BUILD_IDENTIFIER","CODEBUILD_BUILD_ARN","CODEBUILD_BUILD_ID","CODEBUILD_BUILD_IMAGE","CODEBUILD_BUILD_NUMBER","CODEBUILD_BUILD_SUCCEEDING","CODEBUILD_BUILD_URL","CODEBUILD_INITIATOR","CODEBUILD_PROJECT_ARN","CODEBUILD_PUBLIC_BUILD_URL","CODEBUILD_RESOLVED_SOURCE_VERSION","CODEBUILD_SOURCE_REPO_URL","CODEBUILD_SOURCE_VERSION","CODEBUILD_SRC_DIR","CODEBUILD_START_TIME","CODEBUILD_WEBHOOK_ACTOR_ACCOUNT_ID","CODEBUILD_WEBHOOK_BASE_REF","CODEBUILD_WEBHOOK_EVENT","CODEBUILD_WEBHOOK_HEAD_REF","CODEBUILD_WEBHOOK_MERGE_COMMIT","CODEBUILD_WEBHOOK_PREV_COMMIT","CODEBUILD_WEBHOOK_TRIGGER","CODEBUILD_WEBHOOK_LABEL","CODEBUILD_WEBHOOK_RUN_ID","CODEBUILD_WEBHOOK_JOB_ID","CODEBUILD_WEBHOOK_WORKFLOW_NAME","CODEBUILD_RUNNER_OWNER","CODEBUILD_RUNNER_REPO","CODEBUILD_RUNNER_REPO_DOMAIN","CODEBUILD_RUNNER_WITH_BUILDSPEC"]),bamboo:_(["bamboo_buildNumber","bamboo_buildResultsUrl","bamboo_planRepository_repositoryUrl","bamboo_buildKey"]),bitbucket:_(["CI","BITBUCKET_WORKSPACE","BITBUCKET_REPO_SLUG","BITBUCKET_REPO_UUID","BITBUCKET_REPO_FULL_NAME","BITBUCKET_REPO_IS_PRIVATE","BITBUCKET_REPO_OWNER","BITBUCKET_REPO_OWNER_UUID","BITBUCKET_PROJECT_KEY","BITBUCKET_PROJECT_UUID","BITBUCKET_BUILD_NUMBER","BITBUCKET_PIPELINE_UUID","BITBUCKET_STEP_UUID","BITBUCKET_STEP_RUN_NUMBER","BITBUCKET_STEP_TRIGGERER_UUID","BITBUCKET_PARALLEL_STEP","BITBUCKET_PARALLEL_STEP_COUNT","BITBUCKET_CLONE_DIR","BITBUCKET_COMMIT","BITBUCKET_BRANCH","BITBUCKET_TAG","BITBUCKET_BOOKMARK","BITBUCKET_GIT_HTTP_ORIGIN","BITBUCKET_GIT_SSH_ORIGIN","BITBUCKET_PR_ID","BITBUCKET_PR_DESTINATION_BRANCH","BITBUCKET_PR_DESTINATION_COMMIT","BITBUCKET_DEPLOYMENT_ENVIRONMENT","BITBUCKET_DEPLOYMENT_ENVIRONMENT_UUID","BITBUCKET_EXIT_CODE"]),buildkite:_(["BUILDKITE_ORGANIZATION_SLUG","BUILDKITE_PIPELINE_ID","BUILDKITE_PIPELINE_NAME","BUILDKITE_PIPELINE_SLUG","BUILDKITE_PIPELINE_DEFAULT_BRANCH","BUILDKITE_REPO","BUILDKITE_SOURCE","BUILDKITE_BRANCH","BUILDKITE_TAG","BUILDKITE_COMMIT","BUILDKITE_MESSAGE","BUILDKITE_BUILD_AUTHOR","BUILDKITE_BUILD_AUTHOR_EMAIL","BUILDKITE_JOB_ID","BUILDKITE_BUILD_ID","BUILDKITE_BUILD_URL","BUILDKITE_BUILD_NUMBER","BUILDKITE_LABEL","BUILDKITE_COMMAND","BUILDKITE_STEP_ID","BUILDKITE_STEP_KEY","BUILDKITE_PARALLEL_JOB","BUILDKITE_PARALLEL_JOB_COUNT","BUILDKITE_RETRY_COUNT","BUILDKITE_COMPUTE_TYPE","BUILDKITE_CLUSTER_NAME","BUILDKITE_PULL_REQUEST","BUILDKITE_PULL_REQUEST_REPO","BUILDKITE_PULL_REQUEST_BASE_BRANCH","BUILDKITE_PULL_REQUEST_DRAFT","BUILDKITE_PULL_REQUEST_LABELS","BUILDKITE_MERGE_QUEUE_BASE_BRANCH","BUILDKITE_MERGE_QUEUE_BASE_COMMIT","BUILDKITE_REBUILT_FROM_BUILD_ID","BUILDKITE_REBUILT_FROM_BUILD_NUMBER","BUILDKITE_TRIGGERED_FROM_BUILD_ID","BUILDKITE_TRIGGERED_FROM_BUILD_NUMBER","BUILDKITE_TRIGGERED_FROM_BUILD_PIPELINE_SLUG"]),circle:_(["CI","CIRCLECI","CIRCLE_BRANCH","CIRCLE_BUILD_NUM","CIRCLE_BUILD_URL","CIRCLE_PREVIOUS_BUILD_NUM","CIRCLE_JOB","CIRCLE_WORKFLOW_ID","CIRCLE_WORKFLOW_JOB_ID","CIRCLE_WORKFLOW_WORKSPACE_ID","CIRCLE_PIPELINE_ID","CIRCLE_ORGANIZATION_ID","CIRCLE_PROJECT_ID","CIRCLE_PROJECT_REPONAME","CIRCLE_PROJECT_USERNAME","CIRCLE_REPOSITORY_URL","CIRCLE_WORKING_DIRECTORY","CIRCLE_SHA1","CIRCLE_TAG","CIRCLE_USERNAME","CIRCLE_NODE_INDEX","CIRCLE_NODE_TOTAL","CIRCLE_PR_NUMBER","CIRCLE_PR_REPONAME","CIRCLE_PR_USERNAME","CIRCLE_PULL_REQUEST","CIRCLE_PULL_REQUESTS","CI_PULL_REQUEST"]),concourse:_(["BUILD_ID","BUILD_NAME","BUILD_JOB_NAME","BUILD_PIPELINE_NAME","BUILD_TEAM_NAME","ATC_EXTERNAL_URL"]),codeFresh:_(["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:_(["DRONE_BUILD_LINK","DRONE_BUILD_NUMBER","DRONE_PULL_REQUEST"]),githubActions:_(["CI","GITHUB_ACTIONS","GITHUB_WORKFLOW","GITHUB_WORKFLOW_REF","GITHUB_WORKFLOW_SHA","GITHUB_ACTION","GITHUB_ACTION_PATH","GITHUB_ACTION_REPOSITORY","GITHUB_JOB","GITHUB_EVENT_NAME","GITHUB_EVENT_PATH","GITHUB_RUN_ID","GITHUB_RUN_NUMBER","GITHUB_RUN_ATTEMPT","GITHUB_REPOSITORY","GITHUB_REPOSITORY_ID","GITHUB_REPOSITORY_OWNER","GITHUB_REPOSITORY_OWNER_ID","GITHUB_REF","GITHUB_REF_NAME","GITHUB_REF_TYPE","GITHUB_REF_PROTECTED","GITHUB_BASE_REF","GITHUB_HEAD_REF","GITHUB_SHA","GITHUB_ACTOR","GITHUB_ACTOR_ID","GITHUB_TRIGGERING_ACTOR","GITHUB_SERVER_URL","GITHUB_API_URL","GITHUB_GRAPHQL_URL","GITHUB_WORKSPACE","GITHUB_RETENTION_DAYS","RUNNER_OS","RUNNER_ARCH","RUNNER_NAME","RUNNER_ENVIRONMENT","RUNNER_DEBUG"]),gitlab:_(["CI_PIPELINE_ID","CI_PIPELINE_URL","CI_BUILD_ID","CI_JOB_ID","CI_JOB_URL","CI_JOB_NAME","CI_NODE_INDEX","CI_NODE_TOTAL","GITLAB_HOST","CI_PROJECT_ID","CI_PROJECT_URL","CI_REPOSITORY_URL","CI_ENVIRONMENT_URL","CI_DEFAULT_BRANCH","RUN_ATTEMPT","CI_MERGE_REQUEST_IID","CI_MERGE_REQUEST_PROJECT_URL","CI_MERGE_REQUEST_TITLE","CI_MERGE_REQUEST_SOURCE_BRANCH_NAME","CI_MERGE_REQUEST_TARGET_BRANCH_NAME","CI_OPEN_MERGE_REQUESTS"]),goCD:_(["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:_(["BUILD_ID","PROJECT_ID","REPO_NAME","BRANCH_NAME","TAG_NAME","COMMIT_SHA","SHORT_SHA"]),jenkins:_(["BRANCH_NAME","BUILD_DISPLAY_NAME","BUILD_ID","BUILD_NUMBER","BUILD_TAG","BUILD_URL","CHANGE_AUTHOR","CHANGE_AUTHOR_DISPLAY_NAME","CHANGE_AUTHOR_EMAIL","CHANGE_BRANCH","CHANGE_FORK","CHANGE_ID","CHANGE_TARGET","CHANGE_TITLE","CHANGE_URL","CI","EXECUTOR_NUMBER","JAVA_HOME","JENKINS_HOME","JENKINS_URL","JOB_BASE_NAME","JOB_NAME","JOB_URL","NODE_LABELS","NODE_NAME","RUN_ARTIFACTS_DISPLAY_URL","RUN_CHANGES_DISPLAY_URL","TAG_NAME","WORKSPACE","WORKSPACE_TMP","GIT_AUTHOR_EMAIL","GIT_AUTHOR_NAME","GIT_BRANCH","GIT_COMMIT","GIT_COMMITTER_EMAIL","GIT_COMMITTER_NAME","GIT_LOCAL_BRANCH","GIT_PREVIOUS_COMMIT","GIT_PREVIOUS_SUCCESSFUL_COMMIT","GIT_URL","ghprbActualCommit","ghprbGhRepository","ghprbPullId","ghprbPullLink","ghprbSourceBranch","ghprbTargetBranch","ghprbTriggerAuthorLogin"]),semaphore:_(["SEMAPHORE_BRANCH_ID","SEMAPHORE_BUILD_NUMBER","SEMAPHORE_CURRENT_JOB","SEMAPHORE_CURRENT_THREAD","SEMAPHORE_EXECUTABLE_UUID","SEMAPHORE_GIT_BRANCH","SEMAPHORE_GIT_DIR","SEMAPHORE_GIT_REF","SEMAPHORE_GIT_REF_TYPE","SEMAPHORE_GIT_REPO_SLUG","SEMAPHORE_GIT_SHA","SEMAPHORE_GIT_URL","SEMAPHORE_JOB_COUNT","SEMAPHORE_JOB_ID","SEMAPHORE_JOB_NAME","SEMAPHORE_JOB_UUID","SEMAPHORE_PIPELINE_ID","SEMAPHORE_PLATFORM","SEMAPHORE_PROJECT_DIR","SEMAPHORE_PROJECT_HASH_ID","SEMAPHORE_PROJECT_ID","SEMAPHORE_PROJECT_NAME","SEMAPHORE_PROJECT_UUID","SEMAPHORE_REPO_SLUG","SEMAPHORE_TRIGGER_SOURCE","SEMAPHORE_WORKFLOW_ID","PULL_REQUEST_NUMBER"]),teamcity:null,travis:_(["TRAVIS_JOB_ID","TRAVIS_BUILD_ID","TRAVIS_BUILD_WEB_URL","TRAVIS_REPO_SLUG","TRAVIS_JOB_NUMBER","TRAVIS_EVENT_TYPE","TRAVIS_COMMIT_RANGE","TRAVIS_BUILD_NUMBER","TRAVIS_PULL_REQUEST","TRAVIS_PULL_REQUEST_BRANCH","TRAVIS_PULL_REQUEST_SHA"]),netlify:_(["BUILD_ID","CONTEXT","URL","DEPLOY_URL","DEPLOY_PRIME_URL","DEPLOY_ID"])}),Hn=t=>{let e=oe();return e?(0,E.chain)(t()).get(e).value():{}};function kn(){return(0,E.chain)(ne()).omitBy(E.isNull).keys().value()}function Gn(t){return t&&kn().includes(t)}function oe(){let t=Fn();return nt("detected CI provider name: %s",t),t||null}function jn(){let t=Hn(ne);return(0,E.mapValues)(t,e=>(0,E.isString)(e)?Ot(e):e)}function se(t){let e=jn(),r=oe(),n=Kn(t,r);return nt("detected CI provider: %s",r),nt("detected CI params: %O",e),nt("detected CI build ID: %o",n),{params:e,provider:r,ciBuildId:n}}function Kn(t,e){return t?{source:"user",value:t}:Gn(e)?{source:"server",value:null}:{source:"random",value:`auto:${Ut()}`}}var ie=require("@currents/commit-info"),ae=require("lodash");var $n=p.extend("git"),Jn=async()=>{let t=await(0,ie.commitInfo)();return $n("commit: %O",t),{branch:t.branch,remoteOrigin:t.remote,authorEmail:t.email,authorName:t.author,message:t.message,sha:t.sha,ghaEventData:t.ghaEventData??null}},xt=(0,ae.memoize)(Jn);var le=require("child_process"),Lt=m(require("fs/promises")),fe=require("lodash"),D=require("os"),de=m(require("path")),Yn=[["/etc/fedora-release",["Fedora"]],["/etc/redhat-release",["RHEL","RHAS","Red Hat Linux","Scientific Linux","ScientificSL","ScientificCERNSLC","ScientificFermiLTS","ScientificSLF","CentOS"]],["/etc/redhat_version",["RHEL","RHAS","Red Hat Linux","Scientific Linux","ScientificSL","ScientificCERNSLC","ScientificFermiLTS","ScientificSLF"]],["/etc/SuSE-release",["SUSE Linux"]],["/etc/lsb-release",["Ubuntu","Chakra","IYCC","Linux Mint","elementary OS","Arch Linux","Manjaro Linux","KDE neon","Zorin"]],["/etc/debian_version",["Debian"]],["/etc/debian_release",["Debian"]],["/etc/arch-release",["Arch Linux"]],["/etc/NIXOS",["NixOS"]],["/etc/annvix-release",["Annvix"]],["/etc/arklinux-release",["Arklinux"]],["/etc/aurox-release",["Aurox Linux"]],["/etc/blackcat-release",["BlackCat"]],["/etc/cobalt-release",["Cobalt"]],["/etc/conectiva-release",["Conectiva"]],["/etc/eos-version",["FreeEOS"]],["/etc/gentoo-release",["Gentoo Linux"]],["/etc/hlfs-release",["HLFS"]],["/etc/hlfs_version",["HFLS"]],["/etc/immunix-release",["Immunix"]],["/knoppix_version",["Knoppix"]],["/etc/lfs-release",["Linux-From-Scratch"]],["/etc/lfs_version",["Linux-From-Scratch"]],["/etc/linuxppc-release",["Linux-PPC"]],["/etc/mageia-release",["Mageia"]],["/etc/mandriva-release",["Mandriva Linux","Mandrake Linux"]],["/etc/mandakelinux-release",["Mandriva Linux","Mandrake Linux"]],["/etc/mandrake-release",["Mandrake","Mandriva Linux","Mandrake Linux"]],["/etc/mklinux-release",["MkLinux"]],["/etc/nld-release",["Novell Linux Desktop"]],["/etc/pld-release",["PLD Linux"]],["/etc/rubix-version",["Rubix"]],["/etc/slackware-version",["Slackware"]],["/etc/slackware-release",["Slackware"]],["/etc/e-smith-release",["SME Server"]],["/etc/release",["Solaris SPARC"]],["/etc/sun-release",["Sun JDS"]],["/etc/novell-release",["SUSE Linux"]],["/etc/sles-release",["SUSE Linux ES9"]],["/etc/synoinfo.conf",["Synology"]],["/etc/tinysofa-release",["Tiny Sofa"]],["/etc/trustix-release",["Trustix"]],["/etc/trustix-version",["Trustix"]],["/etc/turbolinux-release",["TurboLinux"]],["/etc/ultrapenguin-release",["UltraPenguin"]],["/etc/UnitedLinux-release",["UnitedLinux"]],["/etc/va-release",["VA-Linux/RH-VALE"]],["/etc/yellowdog-release",["Yellow Dog"]],["/etc/alpine-release",["Alpine Linux"]],["/etc/system-release",["Amazon Linux"]],["/etc/os-release",["Raspbian"]]],G=/distrib_release=(.*)/,ce=/release ([^ ]+)/,ue=/(.*)/,Vn={alpine:ue,amazon:/release (.*)/,arch:G,centos:ce,debian:ue,fedora:/release (..)/,kde:G,manjaro:G,mint:G,raspbian:/VERSION_ID="(.*)"/,red:ce,suse:/VERSION = (.*)\n/,ubuntu:G,zorin:G};function pe(t){return t.split(" ").map(e=>e.toLowerCase()).find(e=>e!=="linux")}function Nt(t,e){let r=Vn[t];return r?e.match(r)?.[1]:void 0}function qn(){return new Promise((t,e)=>(0,le.execFile)("lsb_release",["-a"],(r,n)=>r?e(r):t(n)))}async function Wn(t){try{return(await qn()).match(/Release:\t(.*)/)?.[1]}catch{return Nt("debian",t)}}async function Qn(t){for(let[e,r]of Yn){let n=de.default.join(t,e);if((await Lt.default.stat(n).catch(()=>null))?.isFile())return{filePath:n,candidates:r}}return null}async function zn(t="/"){let e=await Qn(t);if(!e)return;let r=await Lt.default.readFile(e.filePath,"utf8"),[n]=e.candidates,o;if(e.candidates.length===1){let s=pe(n);o=s==="debian"?await Wn(r):Nt(s,r)}else{let s=r.toLowerCase();for(let i of e.candidates){let a=pe(i);s.includes(a)&&(n=i,o=Nt(a,s)??o)}}return o===void 0?void 0:`${n} - ${o}`}var Xn=async()=>{if((0,D.platform)()==="linux")try{return await zn()??(0,D.release)()}catch{return(0,D.release)()}return(0,D.release)()},Zn=async()=>{let t=await Xn();return{osName:(0,D.platform)(),osVersion:t,osCpus:[],osMemory:{free:(0,D.freemem)(),total:(0,D.totalmem)()}}},me=(0,fe.memoize)(Zn);var ge={name:"@currents/cmd",version:"3.0.0",main:"./dist/index.js",author:{name:"Currents Software Inc",email:"hello@currents.dev"},license:"MIT",repository:{type:"git",url:"https://github.com/currents-dev/currents-reporter"},description:"Currents CLI tools",engines:{node:">=22.13"},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":"^30.5.2","@jest/types":"^30.4.1","@release-it/conventional-changelog":"^12.0.0","release-it":"^21.0.2","@types/debug":"^4.1.12","@types/fs-extra":"^11.0.4","@types/lodash":"^4.17.16","@types/node":"^25.5.0","@types/semver":"^7.5.8","@types/xml2js":"^0.4.14","@types/yauzl":"3.4.0","@types/yazl":"3.3.1","fs-extra":"^11.3.4",jest:"^30.4.2","jest-cli":"^30.4.2","jest-config":"^30.4.2",rimraf:"^6.0.1",tsup:"^8.3.5",typescript:"^5.9.3",vitest:"^4.1.11"},dependencies:{"@commander-js/extra-typings":"^14.0.0","@currents/commit-info":"3.0.0","@currents/rules":"0.1.0",commander:"^14.0.0",debug:"^4.4.0",dotenv:"17.4.2",lodash:"^4.18.1","proxy-from-env":"2.1.0",semver:"^7.8.5",tinyglobby:"^0.2.17",undici:"7.30.1",xml2js:"^0.6.2",yauzl:"3.4.0",yazl:"3.3.1"},bin:{currents:"./dist/bin/index.js","currents-cli":"./dist/bin/index.js"},files:["dist","docs","!**/*.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:{name:"conventionalcommits"},header:"# Changelog",ignoreVersion:!0,infile:"./CHANGELOG.md"}},git:{commitMessage:"chore: release ${npm.name} v${version}",tagName:"${npm.name}-v${version}"}}};var ot=ge.version;var Pt=m(require("lodash")),eo=["apiKey","recordKey","key"];function Ee(t,e){return Pt.default.isPlainObject(t)?Pt.default.mapValues(t,(r,n)=>e.includes(n)&&r!==void 0?"*****":Ee(r,e)):t}function x(t){return Ee(t,eo)}var ro=[];function Bt(t){ro.push(t)}var w=m(require("util"));var Te=[],Ie=[];var S=(...t)=>(...e)=>{let r=e.join(" ");return r?t.reduceRight((n,o)=>(0,w.styleText)(o,n),r):""},Re=(...t)=>{let e=w.default.format(...t);Bt(e),console.log(e)},no=(...t)=>{let e=w.default.format(...t);Bt(e),console.error(e)},j=Re,g=(...t)=>{let e=w.default.format(...t);return Ie.push(e),p("WARNING: ",e),Re(S("bgYellow","black")(" WARNING "),e)};var R=(...t)=>{let e=w.default.format(...oo(t));return Te.push(e),p("ERROR: ",w.default.format(...t)),no(S("bgRed","white")(" ERROR "),e)};var oo=t=>t.map(e=>e instanceof Error?e.message:e),st=(t=2)=>console.log(Array(t).fill("").join(`
|
|
2
|
+
`)),Ni=S("cyan"),Li=S("blueBright"),Pi=S("red"),Bi=S("yellow"),wi=S("green"),bi=S("gray"),Mi=S("white"),vi=S("black"),Fi=S("magenta"),K=S("dim"),Hi=S("bold");var _e=require("crypto"),io=require("fs"),b=m(require("fs/promises")),he=require("os"),at=require("path");function it(t){let e=0,r=[];return async n=>{e<t?e++:await new Promise(o=>r.push(o));try{return await n()}finally{let o=r.shift();o?o():e--}}}var Qi=it(32);async function W(t){let e=await b.default.readFile(t,"utf8");try{return JSON.parse(e.replace(/^\uFEFF/,""))}catch(r){throw r.message=`${t}: ${r.message}`,r}}function L(t){return b.default.access(t).then(()=>!0,()=>!1)}async function F(t){try{return await W(t)}catch(e){throw R("Error while reading JSON file: %s",t,e),R}}async function wt(t,e){try{return await b.default.writeFile(t,e,"utf8"),t}catch(r){throw R(`Error writing file at ${t}:`,r),r}}async function Ce(t=""){let e=(0,at.join)((0,he.tmpdir)(),`currents-${(0,_e.randomUUID)()}${t}`);return await b.default.writeFile(e,"",{flag:"wx",mode:384}),e}async function Se(t){try{return await b.default.mkdir(t,{recursive:!0}),p("Folder created",t),t}catch(e){throw R(`Failed to create folder at ${t}:`,e),e}}async function Ae(t,e){try{return await b.default.mkdir((0,at.dirname)(e),{recursive:!0}),await b.default.cp(t,e,{recursive:!0,verbatimSymlinks:!0}),p("File copied from %s to %s",t,e),e}catch(r){throw R(`Failed to copy file from ${t} to ${e}:`,r),r}}var ye=m(require("crypto"));function Ue(t){return ye.createHash("sha256").update(t).digest("base64").slice(0,8).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}var gn=m(require("fs/promises")),St=m(require("path")),En=m(require("semver"));var rr=require("timers/promises"),$t=m(require("lodash"));var Oe=()=>process.env.CURRENTS_API_URL??"https://cy.currents.dev",De=()=>process.env.CURRENTS_REST_API_URL??"https://api.currents.dev",xe=()=>3e4;var Ye=require("http"),Ht=require("stream"),Q=require("util"),J=m(require("zlib")),Ve=require("undici");var $=require("undici");var ke=require("proxy-from-env");var ao=new Set(["localhost","0.0.0.0"]),Pe=t=>{let e=t.length;for(;e&&t.charCodeAt(e-1)===46;)e--;return e===t.length?t:t.slice(0,e)},Be=t=>{let e=t.split(".");return e.length!==4||e[0]!=="127"?!1:e.every(r=>/^\d+$/.test(r)&&Number(r)>=0&&Number(r)<=255)},bt=t=>{if(/^0[xX][0-9a-fA-F]+$/.test(t)){let e=parseInt(t.slice(2),16);return Number.isFinite(e)?e:null}if(t.length>1&&/^0[0-7]+$/.test(t)){let e=parseInt(t,8);return Number.isFinite(e)?e:null}if(t.length>1&&/^0[0-9]+$/.test(t))return null;if(/^[0-9]+$/.test(t)){let e=parseInt(t,10);return Number.isFinite(e)?e:null}return null},we=t=>{if(typeof t!="string"||!t||t.indexOf(":")!==-1)return t;let e=t;if(e.charAt(0)==="["&&e.charAt(e.length-1)==="]"&&(e=e.slice(1,-1)),e=Pe(e),!/^[0-9.xXa-fA-F]+$/.test(e))return t;let r=e.split(".");if(r.some(f=>f===""))return t;if(r.length===4){let f=r.map(bt);return f.some(d=>d===null||d<0||d>255)?t:f.join(".")}if(r.length>4||r.length===1)return t;let n=r.slice(0,-1),o=r[r.length-1],s=4-n.length,i=bt(o);if(i===null)return t;let a=(1<<8*s)-1;if(i<0||i>a)return t;let l=new Array(s).fill(0);for(let f=s-1,d=i;f>=0;f--,d>>=8)l[f]=d&255;let c=n.map(bt);return c.some(f=>f===null||f<0||f>255)?t:[...c,...l].join(".")},Mt=t=>/^0{1,4}$/.test(t),co=t=>{if(t==="::")return!0;let e=t.indexOf("::");if(e!==-1){if(e!==t.lastIndexOf("::"))return!1;let n=t.slice(0,e),o=t.slice(e+2),s=n?n.split(":"):[],i=o?o.split(":"):[];return s.length+i.length<8&&s.every(Mt)&&i.every(Mt)}let r=t.split(":");return r.length===8&&r.every(Mt)},uo=t=>{if(t==="::1")return!0;let e=t.match(/^::ffff:(\d+\.\d+\.\d+\.\d+)$/i);if(e)return Be(e[1]);let r=t.match(/^::ffff:([0-9a-f]{1,4}):([0-9a-f]{1,4})$/i);if(r){let o=parseInt(r[1],16);return o>=32512&&o<=32767}let n=t.split(":");if(n.length===8){for(let o=0;o<7;o++)if(!/^0+$/.test(n[o]))return!1;return/^0*1$/.test(n[7])}return!1},Ne=t=>t?ao.has(t)||Be(t)||co(t)?!0:uo(t):!1,po={http:80,https:443,ws:80,wss:443,ftp:21},lo=t=>{let e=t,r=0;if(e.charAt(0)==="["){let s=e.indexOf("]");if(s!==-1){let i=e.slice(1,s),a=e.slice(s+1);return a.charAt(0)===":"&&/^\d+$/.test(a.slice(1))&&(r=Number.parseInt(a.slice(1),10)),[i,r]}}let n=e.indexOf(":"),o=e.lastIndexOf(":");return n!==-1&&n===o&&/^\d+$/.test(e.slice(o+1))&&(r=Number.parseInt(e.slice(o+1),10),e=e.slice(0,o)),[e,r]},fo=/^(?:::|(?:0{1,4}:){1,4}:|(?:0{1,4}:){5})ffff:(\d+\.\d+\.\d+\.\d+)$/i,mo=/^(?:::|(?:0{1,4}:){1,4}:|(?:0{1,4}:){5})ffff:([0-9a-f]{1,4}):([0-9a-f]{1,4})$/i,be=t=>{if(typeof t!="string"||t.indexOf(":")===-1)return t;let e=t.match(fo);if(e)return e[1];let r=t.match(mo);if(r){let n=parseInt(r[1],16),o=parseInt(r[2],16);return`${n>>8}.${n&255}.${o>>8}.${o&255}`}return t},go=/^(?:0|[1-9]\d{0,2})$/,Me=t=>{let e=t.split(".");return e.length===4&&e.every(r=>go.test(r)&&Number(r)<=255)?e.map(Number):null},Eo=/^[0-9a-f]{1,4}$/i,To=t=>{let e=t.split("::");if(e.length>2)return null;let r=e[0]?e[0].split(":"):[];if(e.length===2){let n=e[1]?e[1].split(":"):[],o=8-r.length-n.length;if(o<1)return null;r.push(...new Array(o).fill("0"),...n)}return r.length!==8||r.some(n=>!Eo.test(n))?null:r.flatMap(n=>{let o=Number.parseInt(n,16);return[o>>8&255,o&255]})},ve=t=>typeof t!="string"||!t?null:t.indexOf(":")!==-1?To(t):Me(t),Le=t=>{if(!t)return t;t.charAt(0)==="["&&t.charAt(t.length-1)==="]"&&(t=t.slice(1,-1));let e=Pe(t),r=we(e);return r!==e?r:be(e)},Io=t=>{let e=t,r=e.charAt(0)==="[",n=e.charAt(e.length-1)==="]",o=e.includes("[")||e.includes("]");if(r||n){if(!r||!n||(e=e.slice(1,-1),e.indexOf(":")===-1||e.includes("[")||e.includes("]")))return null}else if(o)return null;if(!e||e.charAt(e.length-1)===".")return null;let s=e.indexOf(":")!==-1;if(s)try{e=new URL(`http://[${e}]/`).hostname.slice(1,-1)}catch{return null}else if(e=we(e),!Me(e))return null;return{normalized:be(e),wasIPv6:s}},Ro=/^(.+)\/(0|[1-9]\d{0,2})$/,_o=t=>{if(t.indexOf("/")===-1)return;let e=Ro.exec(t);if(!e)return null;let r=Number(e[2]),n=Io(e[1]);if(!n)return null;let{normalized:o,wasIPv6:s}=n;if(s&&o.indexOf(":")===-1){if(r<96)return null;r-=96}let i=ve(o);return!i||r>i.length*8?null:{bytes:i,prefix:r}},ho=(t,e,r)=>{let n=r>>3;for(let s=0;s<n;s++)if(t[s]!==e[s])return!1;let o=r&7;if(o){let s=255<<8-o&255;if((t[n]&s)!==(e[n]&s))return!1}return!0};function Fe(t,e){let r;try{r=new URL(t)}catch{return!1}let n=e.toLowerCase();if(!n)return!1;if(n==="*")return!0;let o=Number.parseInt(r.port,10)||po[r.protocol.split(":",1)[0]]||0,s=Le(r.hostname.toLowerCase()),i=ve(s);return n.split(/[\s,]+/).some(a=>{if(!a)return!1;if(a==="*")return!0;let l=_o(a);if(l!==void 0)return l!==null&&!!i&&i.length===l.bytes.length&&ho(i,l.bytes,l.prefix);let[c,f]=lo(a);return c=Le(c),!c||f&&f!==o?!1:(c.charAt(0)==="*"&&(c=c.slice(1)),c.charAt(0)==="."?s.endsWith(c):s===c||Ne(s)&&Ne(c))})}var Co=p.extend("http");function So(t){return process.env[t.toLowerCase()]||process.env[t.toUpperCase()]||""}function Ao(t){let e=(0,ke.getProxyForUrl)(t);return!e||Fe(t,So("no_proxy"))?"":e}var vt={headersTimeout:0,bodyTimeout:0},yo=new $.Agent({...vt,connect:{timeout:0}}),He=new Map;function Uo(t){let e=He.get(t);if(e)return e;let{username:r,password:n}=new URL(t);return e=new $.ProxyAgent({uri:t,token:r||n?`Basic ${Buffer.from(`${decodeURIComponent(r)}:${decodeURIComponent(n)}`).toString("base64")}`:void 0,proxyTunnel:!1,proxyTls:{timeout:0},...vt,factory:(o,s)=>new $.Pool(o,{...s,...vt})}),He.set(t,e),e}function Ge(t){let e=Ao(t);return e?(Co("Using HTTP proxy %s for %s",Dt(e),Dt(t)),Uo(e)):yo}var A=class extends Error{constructor(r,n,o,s){super(r);this.code=n;this.config=o;this.response=s;this.name="HttpError"}get status(){return this.response?.status}};function H(t){return t instanceof A}var Oo=21,Do=/^(?:(?:proxy-)?authorization|cookie)$/i;async function ct(t){let e={method:t.method.toLowerCase(),url:t.url,data:t.body},{res:r,method:n}=await xo(t,e),o=await bo(r,n,t.responseType??"json",e);if(o.status<200||o.status>=300)throw new A(`Request failed with status code ${o.status}`,o.status<500?"ERR_BAD_REQUEST":"ERR_BAD_RESPONSE",e,o);return o}async function xo(t,e){let r=t.timeout??0,n=new AbortController,o=No(t,n.signal,r),s,i=new Promise((a,l)=>{r<=0||(s=setTimeout(()=>{l(new A(`timeout of ${r}ms exceeded`,"ETIMEDOUT",e)),n.abort(),o.then(({res:c})=>c.body.destroy(),()=>{})},r))});try{return await Promise.race([o,i])}catch(a){throw a instanceof A?a:Mo(a,e)}finally{clearTimeout(s)}}async function No(t,e,r){let{url:n,body:o}=t,s=t.method.toUpperCase(),i=Lo(t.headers??{},o);for(let a=0;;a++){let l=await(0,Ve.request)(n,{method:s,headers:i,body:o,signal:e,bodyTimeout:r,dispatcher:Ge(n),reset:!1}),c=l.headers.location;if(l.statusCode<300||l.statusCode>=400||typeof c!="string"||o instanceof Ht.Readable)return{res:l,method:s};if(await l.body.dump(),a>=Oo)throw Object.assign(new Error("Maximum number of redirects exceeded"),{code:"ERR_FR_TOO_MANY_REDIRECTS"});((l.statusCode===301||l.statusCode===302)&&s==="POST"||l.statusCode===303&&!/^(?:GET|HEAD)$/.test(s))&&(s="GET",o=void 0,i=je(i,/^content-/i));let f=new URL(n),d=new URL(c,f);(d.protocol!==f.protocol&&d.protocol!=="https:"||d.host!==f.host&&!d.host.endsWith(`.${f.host}`))&&(i=je(i,Do)),n=d.href}}function Lo(t,e){let r={accept:"application/json, text/plain, */*","user-agent":"axios/1.20.0","accept-encoding":"gzip, compress, deflate, br"};e&&!(e instanceof Ht.Readable)&&(r["content-length"]=String(Buffer.byteLength(e)));for(let[n,o]of Object.entries(t))r[n.toLowerCase()]=o;return r}function je(t,e){return Object.fromEntries(Object.entries(t).filter(([r])=>!e.test(r)))}var Ke=(0,Q.promisify)(J.default.unzip),Po=(0,Q.promisify)(J.default.inflateRaw),Bo=(0,Q.promisify)(J.default.brotliDecompress),Ft=typeof J.default.zstdDecompress=="function"?(0,Q.promisify)(J.default.zstdDecompress):void 0,$e=t=>["gzip","x-gzip","compress","x-compress","deflate","br"].includes(t)||t==="zstd"&&Ft!==void 0;function wo(t,e){return e==="br"?Bo(t):e==="zstd"&&Ft?Ft(t):e==="deflate"?Ke(t).catch(()=>Po(t)):Ke(t)}async function bo(t,e,r,n){let o={...t.headers},s=String(o["content-encoding"]??"").toLowerCase();s&&$e(s)&&delete o["content-encoding"];let i={status:t.statusCode,statusText:t.statusText,headers:o};if(e==="HEAD"||t.statusCode===204||t.statusCode===304)return delete o["content-encoding"],await t.body.dump(),{...i,data:Je(Buffer.alloc(0),r)};let a;try{a=Buffer.from(await t.body.arrayBuffer())}catch{throw new A("stream has been aborted","ERR_BAD_RESPONSE",n,{...i,data:void 0})}if(s&&$e(s)&&a.length>0)try{a=await wo(a,s)}catch(l){let c=l;throw new A(c.message,c.code,n,{...i,data:void 0})}return{...i,data:Je(a,r)}}function Je(t,e){if(e==="buffer")return t;let r=t.toString("utf8").replace(/^\uFEFF/,"");if(e==="text"||!r)return r;try{return JSON.parse(r)}catch{return r}}function Mo(t,e){let r=t,n=vo(r);if(n)return new A(`Request failed with status code ${n}`,n<500?"ERR_BAD_REQUEST":"ERR_BAD_RESPONSE",e,{status:n,statusText:Ye.STATUS_CODES[n]??"",headers:{},data:""});if(r.code==="UND_ERR_SOCKET")return new A("socket hang up","ECONNRESET",e);let o=!r.message&&r.errors?r.errors.map(s=>s.message).join("; "):r.message;return new A(o,r.code,e)}function vo(t){let e=t.message?.match(/^Proxy response \((\d{3})\) !== 200 when HTTP Tunneling$/)??t.message?.match(/^Proxy Authentication Required \((407)\)$/);return e?Number(e[1]):void 0}var Qe=p.extend("http"),qe=[3*1e3,15*1e3,30*1e3],ze=60*1e3;function kt(t,e=Date.now()){let r=t?.response?.headers?.["retry-after"];if(r==null||r==="")return;let n=Number(r);if(Number.isFinite(n))return Math.max(0,n*1e3);let o=Date.parse(String(r));return Number.isNaN(o)?void 0:Math.max(0,o-e)}var ut=(t,e)=>{let r=qe[Math.min(t,qe.length)-1],n=kt(e);return n===void 0?r:Math.min(Math.max(n,r),ze)},Gt=t=>(Qe("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,isHttpError:H(t)}),"code"in t&&t.code&&["ECONNABORTED","ECONNREFUSED","ECONNRESET","ETIMEDOUT","ENETRESET"].includes(t.code)?!0:H(t)?[408,429,502,503,504].includes(t.response?.status??0):!1),Fo=["get","head","options","put","delete"],Xe=t=>{if(!H(t))return!1;let e=t.response?.status;if(e===429){let r=kt(t);return r===void 0||r<=ze}return Fo.includes(t.config?.method?.toLowerCase()??"get")?Gt(t):e===408||t.code==="ECONNREFUSED"||t.code==="ENOTFOUND"},pt=()=>3;function We(t){let e=[],r=Math.trunc(t/36e5),n=Math.trunc(t/6e4)%60;if(r&&e.push(`${r}h`),n&&e.push(`${n}m`),t<1e3){let o=t>=1?Math.round(t):Math.ceil(t);o&&e.push(`${o}ms`)}else{let o=Math.floor(t/1e3%60*10+1e-7)/10;o&&e.push(`${o}s`)}return e.join(" ")||"0ms"}function Ze(t,e,r){Qe("Network request '%s' failed: '%s'. Next attempt is in %s (%d/%d).",`${r.method?.toUpperCase()} ${r.url}`,e.message,We(ut(t,e)??0),t,pt()),g("Network request '%s' failed: '%s'. Next attempt is in %s (%d/%d).",`${r.method?.toUpperCase()} ${r.url}`,e.message,We(ut(t,e)??0),t,pt())}var Kt=p.extend("http");var jt={api:null,restApi:null};function Ho(t){let e=t==="api"?Oe():De();Kt("client base url: %s",e);let r=pt(),n=t==="restApi"?Xe:Gt;return{async request(o){let s={"content-type":"application/json",...$t.default.mapKeys(o.headers??{},(l,c)=>c.toLowerCase()),"x-cmd-version":ot},i=ko(o.data),a=Go(e,o.url,o.params);for(let l=0;;l++){Ko(e,o,s,l>0);try{return await ct({method:o.method,url:a,headers:s,body:i,timeout:xe(),responseType:o.responseType})}catch(c){if(c instanceof A&&(c.config.url=o.url),!(l<r&&n(c)))throw c;Ze(l+1,c,o),await(0,rr.setTimeout)(ut(l+1,c))}}}}}function lt(t){return jt[t]===null&&(jt[t]=Ho(t)),jt[t]}function ko(t){if(t!==void 0)return typeof t=="string"||Buffer.isBuffer(t)?t:JSON.stringify(t)}function Go(t,e,r){let n=new URL(`${t.replace(/\/?\/$/,"")}/${e.replace(/^\/+/,"")}`),o=r instanceof URLSearchParams?r.toString():r?jo(r):"";return o?`${n.origin}${n.pathname}${n.search}${n.search?"&":"?"}${o}`:n.href}function jo(t){let e=[];for(let[r,n]of Object.entries(t))if(n!=null)if(Array.isArray(n))for(let o of n)o!=null&&e.push([`${r.trim()}[]`,String(o)]);else e.push([r.trim(),String(n)]);return e.map(([r,n])=>`${tr(r)}=${tr(n)}`).join("&")}function tr(t){return encodeURIComponent(t).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+")}function Ko(t,e,r,n){let o={method:e.method.toLowerCase(),baseURL:t,url:e.url,headers:r,data:Buffer.isBuffer(e.data)?"buffer":e.data,params:e.params,isRetry:n};Kt(n?"network request retry: %o":"network request: %o",er(o))}function er(t){return{method:t.method,baseURL:t.baseURL,url:t.url,data:t.isRetry?"<retry>":$o(t.data),params:t.isRetry?"<retry>":t.params,headers:{...t.headers,authorization:"Bearer ***","x-currents-key":"***"}}}function $o(t){if(t?.results?.raw)return x({...t,results:{...t.results,raw:"***"}});if(typeof t=="string")try{return x(JSON.parse(t))}catch{return t}return $t.default.isPlainObject(t)?x(t):t}var Y=m(require("lodash"));function ir(t){if(!H(t)){g("Unexpected error while sending network request: %s",t);return}switch(t.code){case"ECONNABORTED":case"ECONNREFUSED":g("Network connection aborted");return;case"ECONNRESET":g("Network connection reset");return;case"ETIMEDOUT":g("Network connection timeout");return}if(t.response){Jo(t,t.response.status,t.response.data);return}g(`[currents] Unexpected network error: %s
|
|
3
|
+
%O`,t.message,{method:void 0,url:void 0,status:void 0,payload:void 0})}function Jo(t,e,r){let{method:n,url:o}=t.config;switch(e){case 401:g(`[currents] ${n} ${o} - 401 Unauthorized Request from cloud service`);return;case 400:g(`[currents] ${n} ${o} - 400 Bad Request from cloud service:
|
|
4
|
+
%o`,r);return;case 404:g(`[currents] ${n} ${o} - 404 Not Found from cloud service`);return;case 429:g(`[currents] ${n} ${o} - 429 Too Many Requests from cloud service`);return;case 422:Yo(t,r);return;default:ar(t)}}function ar(t){g(`[currents] Unexpected network response: %s
|
|
5
|
+
%O`,t.message,{method:t.config.method,url:t.config.url,status:t.response?.status})}var nr=t=>Array.isArray(t)&&t.every(Y.default.isString);function Yo(t,e){let{code:r,message:n,errors:o}=e??{};if(r===or.MISSING_SUITE&&Y.default.isString(n)&&nr(o)){st(1),R(...sr(n,o));return}if(r===or.RUN_EXPIRED&&Y.default.isString(n)){g(n);return}if(Y.default.isString(n)&&nr(o)){st(1),g(...sr(n,o)),st(1);return}ar(t)}var or={RUN_CANCELLED:"RUN_CANCELLED",RUN_EXPIRED:"RUN_EXPIRED",MISSING_SUITE:"MISSING_SUITE"};function sr(t,e){return Y.default.isString(t)?e?.length===0?[t]:[t,`
|
|
7
6
|
${(e??[]).map(r=>` - ${r}`).join(`
|
|
8
7
|
`)}
|
|
9
|
-
`]:["Unexpected network error"]}var he=c.extend("http");async function v(t,e,r=et){try{let n=await r(t).request(e);return he("network response: %o",{...Ae.default.omit(n,"request","config"),url:n.config.url,method:n.config.method}),n}catch(n){let o=n;throw he("network error: %o",{code:o.code,message:o.message,url:o.config?.url,method:o.config?.method,status:o.response?.status,headers:o.response?.headers,data:o.response?.data}),Ce(o),o}}var _i=c.extend("api");var Oi=c.extend("api");var De=require("util"),Se=require("zlib");var Ue=c.extend("api"),Sn=(0,De.promisify)(Se.gzip);async function Oe(t){try{Ue("Run params: %o",N(t));let e=await On(JSON.stringify(t));return v("api",{url:"v1/runs",method:"POST",headers:{"Content-Type":"application/json","Content-Encoding":"gzip"},data:e}).then(r=>r.data)}catch(e){throw Ue("Failed to create the run:",e),e}}async function On(t){try{return await Sn(t)}catch(e){throw R("Failed to compress run payload:",e),e}}var ji=c.extend("api");var yn=c.extend("api");async function Ne(t,e){try{return await v("api",{url:`rules/project/${encodeURIComponent(t)}`,method:"GET",headers:{"x-currents-key":e}}).then(r=>r.data.rules)}catch(r){throw yn("Failed to get the project actions:",r),r}}var Nn=require("axios");var sa=c.extend("api");var Nt={apiKey:{name:"API key",env:"CURRENTS_API_KEY",cli:"--api-key"},recordKey:{name:"Record key",env:"CURRENTS_RECORD_KEY",cli:"--key"},projectId:{name:"Project ID",env:"CURRENTS_PROJECT_ID",cli:"--project-id"},ciBuildId:{name:"CI build ID",env:"CURRENTS_CI_BUILD_ID",cli:"--ci-build-id"},machineId:{name:"Machine ID",env:"CURRENTS_MACHINE_ID",cli:"--machine-id"},tag:{name:"Tag",cli:"--tag"},debug:{name:"Debug",env:"CURRENTS_DEBUG",cli:"--debug"}};var{debug:xn,ciBuildId:Ln,recordKey:Pn,projectId:Bn,machineId:wn}=Nt,bn={debug:xn,ciBuildId:Ln,recordKey:Pn,projectId:Bn,machineId:wn,tag:{...Nt.tag,env:"CURRENTS_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"},environment:{name:"Environment",env:"CURRENTS_ENVIRONMENT",cli:"--environment"},failOnFailures:{name:"Fail on failures",env:"CURRENTS_FAIL_ON_FAILURES",cli:"--fail-on-failures"},reportDir:{name:"Report folder",env:"CURRENTS_REPORT_DIR",cli:"--report-dir"}};var Ba=c.extend("config");var Mn=null;function xe(){return Mn}var C=require("@currents/rules");var rt=c.extend("actions"),vn=512;async function Be(t,e){try{let r=await Ne(t,e);if(!Array.isArray(r))throw new Error("The project actions are not a list");return rt("Fetched %d project actions",r.length),r}catch(r){return d("Failed to fetch the project actions, uploading without them"),rt("Failed to fetch the project actions: %o",r),[]}}function we({actions:t,instances:e,fullTestSuite:r,gitInfo:n,runTags:o,disableTitleTags:s=!1,group:a}){let p={skipped:0,quarantined:0,tagged:0};if(t.length===0)return p;let m=new C.RulesEvalBase(t,rt);for(let u of e){let f=a??u.groupId;for(let E of u.results.tests){let I=s?[]:Fe(r,{groupId:f,spec:u.spec,testId:E.testId})?.test.tags??[],h=m.getMatchedRules(Fn({groupId:f,spec:u.spec,test:E,gitInfo:n,tags:[...I,...o]}));if(h.length===0)continue;rt("Test %s matched actions: %j",E.testId,h);let S=Gn(E,h);S.length>0&&(kn(r,{groupId:f,spec:u.spec,testId:E.testId,tags:S}),p.tagged++);let K=Le(h,C.ACTION_TYPE.SKIP),Y=Le(h,C.ACTION_TYPE.QUARANTINE);K?(Pe(E,K,C.ACTION_ANNOTATIONS.SKIP_POST),p.skipped++):Y&&E.state==="failed"&&(Pe(E,Y,C.ACTION_ANNOTATIONS.QUARANTINE_POST),p.quarantined++)}}return p}function be(t){t.skipped+t.quarantined+t.tagged!==0&&G("[currents] Actions: %d tests skipped, %d quarantined, %d tagged",t.skipped,t.quarantined,t.tagged)}function Fn({groupId:t,spec:e,test:r,gitInfo:n,tags:o}){return{title:r.title[r.title.length-1],titlePath:[e,...r.title],file:e,project:t,testId:r.testId,tag:Array.from(new Set([...r.tags??[],...o])),gitInfo:n&&{branch:n.branch,authorName:n.authorName,authorEmail:n.authorEmail,remoteOrigin:n.remoteOrigin,message:n.message},errors:r.attempts.flatMap(s=>s.errors).filter(s=>!!s.message).map(s=>({message:s.message}))}}function Le(t,e){return t.find(r=>r.action.some(n=>n.op===e))}function Gn(t,e){let r=[];for(let n of e)for(let o of n.action){if(o.op!==C.ACTION_TYPE.TAG)continue;let s=(0,C.normalizeTagMatcherValue)(o.details?.tags??[]);s.length!==0&&(Me(t,C.ACTION_ANNOTATIONS.TAG,ve({action:n,type:C.ACTION_TYPE.TAG,testId:t.testId,extraDetails:{tags:s}})),r.push(...(0,C.normalizeTagMatcherValue)(s,{removeAtPrefix:!0})))}return r.length>0&&(t.tags=Array.from(new Set([...t.tags??[],...r]))),r}function Pe(t,e,r){let n=t.state;Me(t,r,ve({action:e,type:r===C.ACTION_ANNOTATIONS.SKIP_POST?C.ACTION_TYPE.SKIP:C.ACTION_TYPE.QUARANTINE,testId:t.testId,extraDetails:{status:n}})),t.state="pending"}function Me(t,e,r){t.annotations=[...t.annotations??[],{type:e,description:JSON.stringify(r),source:"test"}]}function ve({action:t,type:e,testId:r,extraDetails:n}){return{rule:{v:t.v,id:t._id,name:t.name.slice(0,vn),type:e,extraDetails:n,appliedAt:Date.now()},testInfo:{testId:r,status:n.status}}}function Fe(t,{groupId:e,spec:r,testId:n}){let o=t.find(a=>a.name===e),s=o?.tests.find(a=>a.spec===r&&a.testId===n);return o&&s?{project:o,test:s}:null}function kn(t,{groupId:e,spec:r,testId:n,tags:o}){let s=Fe(t,{groupId:e,spec:r,testId:n});if(!s)return;let{project:a,test:p}=s;p.tags=Array.from(new Set([...p.tags,...o])),a.tags=Array.from(new Set([...a.tags,...o]))}var Lt=l(require("fs-extra")),L=require("path");var jn=l(require("path")),Ge={".png":{type:"screenshot",contentType:"image/png"},".jpg":{type:"screenshot",contentType:"image/jpeg"},".jpeg":{type:"screenshot",contentType:"image/jpeg"},".webp":{type:"screenshot",contentType:"image/webp"},".gif":{type:"screenshot",contentType:"image/gif"},".mp4":{type:"video",contentType:"video/mp4"},".webm":{type:"video",contentType:"video/webm"},".svg":{type:"attachment",contentType:"image/svg+xml"},".log":{type:"attachment",contentType:"text/plain"},".txt":{type:"attachment",contentType:"text/plain"},".yml":{type:"attachment",contentType:"text/plain"},".yaml":{type:"attachment",contentType:"text/plain"},".md":{type:"attachment",contentType:"text/markdown"},".html":{type:"attachment",contentType:"text/html"},".csv":{type:"attachment",contentType:"text/csv"},".json":{type:"attachment",contentType:"application/json"},".pdf":{type:"attachment",contentType:"application/pdf"},".gz":{type:"attachment",contentType:"application/gzip"},".viewhierarchy":{type:"attachment",contentType:"application/xml"}};var ke=l(require("fs-extra")),je=require("path"),xt=c.extend("detox"),Hn="detox.json";function He(t){return[...t].sort((e,r)=>(e.session??0)-(r.session??0)||e.invocations-r.invocations)}async function Ke(t){let e=(0,je.join)(t,Hn);try{let r=await ke.default.readJson(e);if(typeof r?.artifactsRootDir!="string"||!Array.isArray(r?.tests)){xt("Unexpected Detox manifest contents at %s",e);return}return xt("Detox manifest: %o",r),r}catch{xt("No Detox manifest at %s",e);return}}var nt=require("path"),Kn=c.extend("detox"),Je=255,Jn=/[/\\?<>:*|"$\u0000-\u001f]/g,Ye=4;function $e(t){return Yn(t)??$n(t)}function Yn({rootDir:t,fullName:e,status:r,invocations:n}){try{let o=require.resolve("detox/src/artifacts/utils/ArtifactPathBuilder",{paths:[process.cwd()]}),s=require(o),a=new s({rootDir:t});return(0,nt.dirname)(a.buildPathForTestArtifact("test.mp4",{fullName:e,status:r,invocations:n}))}catch(o){Kn("Detox path builder is not available: %o",o);return}}function $n({rootDir:t,fullName:e,status:r,invocations:n}){let o=Wn(r),s=n>1?` (${n})`:"",a=e.slice(-Je+o.length+s.length),p=`${o}${a}${s}`.replace(Jn,"_");return(0,nt.join)(t,Vn(p,Je))}function Vn(t,e){let r=Buffer.from(t,"utf8");return r.length<=e?t:r.subarray(0,e).toString("utf8").replace(/\uFFFD$/,"")}function Wn(t){switch(t){case"passed":return"\u2713 ";case"failed":return"\u2717 ";default:return""}}var We=l(require("fs-extra")),qe=require("path"),Ve=c.extend("detox"),ot="detox.trace.json",qn="ws-client-invocation";async function Qe(t){let e=(0,qe.join)(t,ot),r=new Map,n;try{n=await We.default.readJson(e)}catch{return Ve("No Detox trace at %s",e),r}if(!Array.isArray(n))return Ve("Unexpected Detox trace contents at %s",e),r;let o=Qn(n);return zn(n).forEach(({pid:a,ts:p,step:m})=>{o.filter(f=>f.pid===a&&p>=f.startTs&&p<=f.endTs).sort((f,E)=>f.startTs-E.startTs).pop()?.steps.push(m)}),o.forEach(({fullName:a,invocations:p,steps:m})=>{let u=r.get(a)??[];u.push({fullName:a,invocations:p,steps:m.sort((f,E)=>+new Date(f.startTime)-+new Date(E.startTime))}),r.set(a,u)}),r}function Qn(t){let e=new Map,r=[];t.forEach(o=>{let s=`${o.pid}:${o.tid}`,a=e.get(s)??[];if(e.set(s,a),o.ph==="B"){a.push(Xn(o));return}if(o.ph==="E"){let p=a.pop();p&&r.push({...p,endTs:Number(o.ts)})}});let n=[...e.values()].flatMap(o=>o.filter(s=>s!==void 0));return[...r,...n]}function Xn(t){let e=t.args?.fullName;if(!(t.args?.context!=="test"||typeof e!="string"))return{fullName:e,invocations:Number(t.args?.invocations??1),pid:Number(t.pid),startTs:Number(t.ts),endTs:Number.MAX_SAFE_INTEGER,steps:[]}}function zn(t){let e=new Map,r=[];return t.forEach(n=>{if(!n.cat?.includes(qn))return;let o=`${n.pid}:${n.tid}`,s=e.get(o)??[];if(n.ph==="B"){s.push({name:n.name??"action",cat:n.cat,ts:Number(n.ts)}),e.set(o,s);return}if(n.ph==="E"){let a=s.pop();if(!a)return;r.push({pid:Number(n.pid),ts:a.ts,step:{title:a.name,category:"detox",startTime:new Date(a.ts/1e3).toISOString(),duration:Math.round((Number(n.ts)-a.ts)/1e3),steps:[]}})}}),r}var J=c.extend("detox"),Xe="artifacts",Zn=[".mp4",".png",".jpg",".log",".txt",".json",".viewhierarchy"],to=t=>{let e=(0,L.extname)(t);return Zn.includes(e)?Ge[e]:void 0};async function ze({instances:t,reportDir:e,manifest:r}){let n=ro(r),o=await Qe(r.artifactsRootDir),s=await re((0,L.join)(e,Xe)),a={artifacts:0,steps:0};for(let p of t)for(let m of p.results.tests){let u=n.get(m.testId);if(!u){J("No Detox manifest entry for %s",m.testId);continue}await no({test:m,manifestTest:u,rootDir:r.artifactsRootDir,artifactsDir:s,traceSlices:o.get(u.fullName)??[],result:a})}return a.artifacts+=await eo({instances:t,rootDir:r.artifactsRootDir,artifactsDir:s}),a}async function eo({instances:t,rootDir:e,artifactsDir:r}){if(!await Lt.default.pathExists((0,L.join)(e,ot)))return 0;let[n]=await Ze(e,[ot],r),o=t.map(s=>s.results.tests[0]).filter(s=>s!==void 0);return o.forEach(s=>{s.artifacts=[...s.artifacts??[],n]}),o.length}function ro(t){let e=new Map;return t.tests.forEach(r=>{e.set(r.fullName,[...e.get(r.fullName)??[],r.testId])}),new Map(t.tests.filter(r=>{let n=e.get(r.fullName)?.length===1;return n||J("Ambiguous Detox test name, skipping: %s",r.fullName),n}).map(r=>[r.testId,r]))}async function no({test:t,manifestTest:e,rootDir:r,artifactsDir:n,traceSlices:o,result:s}){let a=[...t.attempts].sort((u,f)=>u.attempt-f.attempt),p=He(e.attempts),m=1;for(let[u,f]of p.entries()){let E=a[u];if(!E){J("No reported attempt %d of %s",u,e.fullName);continue}let I=await oo({fullName:e.fullName,status:f.status,rootDir:r,artifactsDir:n,fromInvocation:m});I&&(m=I.invocation+1,E.artifacts=[...E.artifacts??[],...I.artifacts],s.artifacts+=I.artifacts.length);let h=io(o,u,I?.invocation);h.length&&(E.steps=[...E.steps??[],...h],s.steps+=h.length)}}async function oo({fullName:t,status:e,rootDir:r,artifactsDir:n,fromInvocation:o}){for(let s=o;s<o+Ye;s++){let a=$e({rootDir:r,fullName:t,status:e,invocations:s}),p=await so(a);if(p)return{invocation:s,artifacts:await Ze(a,p,n)}}J("No Detox artifacts for %s [%s]",t,e)}async function so(t){try{return(await Lt.default.readdir(t)).sort()}catch{return}}async function Ze(t,e,r){let n=[];for(let o of e){let s=to(o);if(!s){J("Skipping unsupported Detox artifact %s",o);continue}let a=(0,L.join)(t,o),p=`${se(a)}${(0,L.extname)(o)}`;await ne(a,(0,L.join)(r,p)),n.push({...s,path:(0,L.join)(Xe,p),name:o})}return n}function io(t,e,r){return((r===void 0?void 0:t.find(s=>s.invocations===r))??[...t].sort((s,a)=>s.invocations-a.invocations)[e])?.steps??[]}var B=class{constructor(e){this.config=e}async getFullTestSuite(){return[]}};var co=l(require("crypto"));var tr=l(require("fs-extra")),ao=l(require("path"));async function st(t){let e=await tr.default.pathExists(t);if(!e)throw new Error("File does not exist");return e}function er(){return"root"}function rr(t){let e=(t.join(" ").match(/@(\S+)/g)??[]).filter(Boolean).map(r=>r);return Array.from(new Set([...e].map(r=>r.trim()).map(r=>r.replace("@",""))))}var po=/^[0-9a-f]{32}$/;function nr(t){let e=[];for(let r of t){let n=e.find(o=>o.name===r.groupId);n||(n={name:r.groupId,tags:[],tests:[]},e.push(n)),n.tests.push(...sr(r))}return e.length===1&&po.test(e[0].name)&&(e[0].name=er()),e}function or(t,e,r){let n=[];for(let{projectId:o,spec:s}of e){let a=r.find(m=>m.spec===s&&m.groupId===o)??(t.length===1?r.find(m=>m.spec===s):void 0);if(!a){n.push(s);continue}let p=t.length===1?t[0]:t.find(m=>m.name===o);p||(p={name:o,tags:[],tests:[]},t.push(p)),p.tests.push(...sr(a))}return n}function sr(t){return t.results.tests.map(e=>({spec:t.spec,testId:e.testId,title:e.title,tags:e.tags??rr(e.title)}))}var _r=l(require("fs-extra")),Cr=l(require("tmp"));var Tr=require("lodash");function ir(t){let e=[];for(let[r,n]of Object.entries(t))r==="_"||r==="$0"||r.includes("-")||(typeof n=="boolean"?n&&e.push(`--${r}`):Array.isArray(n)?n.forEach(o=>{e.push(`--${r}=${o}`)}):e.push(`--${r}=${n}`));return e.join(" ")}var ar=require("lodash"),uo=["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","testFailureExitCode","testNamePattern","verbose","waitNextEventLoopTurnForUnhandledRejectionEvents","watch","watchAll","watchPathIgnorePatterns","watchman"];function cr(t){return(0,ar.omit)(t,...uo)}var gr=l(require("fs")),pt=require("lodash"),Bt=l(require("path"));var Pt=l(require("fs")),it=require("module"),at=l(require("path")),pr=l(require("semver")),lo=">=29.5.0";function mo(){let t=(0,it.createRequire)(at.default.join(process.cwd(),"package.json"));if(fo(t)==="jest-cli")return t.resolve("jest-cli");try{return(0,it.createRequire)(t.resolve("jest")).resolve("jest-cli")}catch{}try{return t.resolve("jest-cli")}catch{throw new Error(`Jest discovery needs the "jest" package, and it is not installed in ${process.cwd()}. Run the command from the folder of the project that ran the tests, or install Jest 29.5 or later: npm install --save-dev jest`)}}function fo(t){for(let e of t.resolve.paths("jest")??[]){if(Pt.default.existsSync(at.default.join(e,"jest","package.json")))return"jest";if(Pt.default.existsSync(at.default.join(e,"jest-cli","package.json")))return"jest-cli"}return null}function ur(){let t=(0,it.createRequire)(mo()),{version:e}=t("jest-cli/package.json");if(!pr.default.satisfies(e,lo,{includePrerelease:!0}))throw new Error(`Jest discovery needs Jest 29.5 or later, and ${process.cwd()} has Jest ${e}. Update Jest: npm install --save-dev jest@latest`);return t}function lr(){return ur()("jest-cli")}function mr(){return ur()("jest-config")}function ct(t,e){return(...r)=>new Promise((n,o)=>{let s=0,a=()=>{s++;try{let p=t(...r);n(p)}catch(p){if(s>=e.length)o(p);else{let m=e[s-1];setTimeout(a,m)}}};a()})}var fr=c.extend("jest-discovery");function dr(t){return["testEnvironment","globalSetup","globalTeardown"].some(e=>String(t[e]??"").includes("detox"))}function Er(t){return{...(0,pt.omit)(t,["globalSetup","globalTeardown","testEnvironmentOptions"]),testEnvironment:"node"}}async function Ir(t,e){let r=e.detox;try{let{readInitialOptions:n}=mr(),{config:o,configPath:s}=await n(t);r||=[o,...o.projects??[]].some(I=>typeof I!="string"&&dr(I));let a=["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"],p=["collectCoverageFrom","coverageDirectory","coveragePathIgnorePatterns","detectLeaks","detectOpenHandles","errorOnDeprecated","forceCoverageMatch","openHandlesTimeout","runner","watchPathIgnorePatterns"],m=I=>e.detox||dr(I),u=(0,pt.omit)(o,a);if(m(u)&&(u=Er(u)),u.projects&&(u.projects=u.projects.map(I=>{if(typeof I=="string")return I;let h=(0,pt.omit)(I,p);return m(h)?Er(h):h})),u.rootDir&&Object.keys(u).length===1)return null;let f=Bt.default.resolve(s?Bt.default.dirname(s):process.cwd(),`.jest-scanner-${new Date().getTime()}.config.cjs`),E=`module.exports=${JSON.stringify(u,null,2)}`;return fr("configFileContent: %O",E),gr.default.writeFileSync(f,E),await ct(st,[200,200,200,200,200,1e3])(f),f}catch(n){if(fr("error %o",n),r)throw new Error(`Failed to recreate the Jest config for discovery: ${n.message}`);return R("Failed to recreate the config file"),null}}async function Rr(t,e){let r="!!##ThisPatternWillNotMatchAnyTestName##!!",n=t.options,o=cr(n),s=ir(o),a=n.config,p=await Ir(a,e);return{cliArgs:[s,"--testNamePattern",r,"--reporters",require.resolve("@currents/cmd/discovery/jest"),"--shard=1/1","--testFailureExitCode=0",p?`--config=${p}`:"",...t.args].filter(u=>!(0,Tr.isEmpty)(u)),configFilePath:p}}var Eo=c.extend("jest-discovery");async function hr(t,e){console.time(k("@currents/jest:fullTestSuite-ready"));let{run:r}=lr(),{cliArgs:n,configFilePath:o}=await Rr(t,e);try{let s=Cr.default.fileSync({postfix:".json"});return Eo("running scanner: %o",n),process.env.CURRENTS_DISCOVERY_PATH=s.name,await r(n.concat(["--openHandlesTimeout=0"])),await ct(st,Array.from({length:300},()=>100))(s.name),console.timeEnd(k("@currents/jest:fullTestSuite-ready")),await M(s.name)}catch(s){return R("Failed to obtain the jest full test suite:",s),{fullTestSuite:[],specsWithoutResults:[]}}finally{o&&_r.default.unlinkSync(o)}}var Ar=c.extend("jest-discovery"),ut=class extends B{constructor(r,n){super(r);this.instances=n}async getFullTestSuite(){if(!this.config.frameworkConfig?.shard)return Ar("Not a sharded run, listing the tests of the results"),nr(this.instances);let{fullTestSuite:r,specsWithoutResults:n}=await hr(this.config.cliArgs,{detox:this.config.frameworkConfig.originFramework==="detox"});if(n.length===0)return r;for(let{spec:s,message:a}of n)d("Discovery could not load %s: %s",s,go(a));let o=or(r,n,this.instances);return d("The tests of these files are listed from the results of the shard that ran them. Currents can show the run as finished before the other shards upload."),Ar("Files that did not run on this shard: %o",o),r.filter(s=>s.tests.length>0)}};function go(t){return t.split(`
|
|
10
|
-
`).map(e=>e.trim()).find(e=>e&&!e.startsWith("\u25CF"))??""}var
|
|
11
|
-
`))}async function
|
|
8
|
+
`]:["Unexpected network error"]}var cr=p.extend("http");async function k(t,e,r=lt){try{let n=await r(t).request(e);return cr("network response: %o",{...n,url:e.url,method:e.method.toLowerCase()}),n}catch(n){let o=n;throw cr("network error: %o",{code:o.code,message:o.message,url:o.config?.url,method:o.config?.method,status:o.response?.status,headers:o.response?.headers,data:o.response?.data}),ir(o),o}}var sc=p.extend("api");var fc=p.extend("api");var pr=require("util"),lr=require("zlib");var ur=p.extend("api"),Vo=(0,pr.promisify)(lr.gzip);async function fr(t){try{ur("Run params: %o",x(t));let e=await qo(JSON.stringify(t));return k("api",{url:"v1/runs",method:"POST",headers:{"Content-Type":"application/json","Content-Encoding":"gzip"},data:e}).then(r=>r.data)}catch(e){throw ur("Failed to create the run:",e),e}}async function qo(t){try{return await Vo(t)}catch(e){throw R("Failed to compress run payload:",e),e}}var Uc=p.extend("api");var Wo=p.extend("api");async function mr(t,e){try{return await k("api",{url:`rules/project/${encodeURIComponent(t)}`,method:"GET",headers:{"x-currents-key":e}}).then(r=>r.data.rules)}catch(r){throw Wo("Failed to get the project actions:",r),r}}var Yc=p.extend("api");var Jt={apiKey:{name:"API key",env:"CURRENTS_API_KEY",cli:"--api-key"},recordKey:{name:"Record key",env:"CURRENTS_RECORD_KEY",cli:"--key"},projectId:{name:"Project ID",env:"CURRENTS_PROJECT_ID",cli:"--project-id"},ciBuildId:{name:"CI build ID",env:"CURRENTS_CI_BUILD_ID",cli:"--ci-build-id"},machineId:{name:"Machine ID",env:"CURRENTS_MACHINE_ID",cli:"--machine-id"},tag:{name:"Tag",cli:"--tag"},debug:{name:"Debug",env:"CURRENTS_DEBUG",cli:"--debug"}};var{debug:Qo,ciBuildId:zo,recordKey:Xo,projectId:Zo,machineId:ts}=Jt,es={debug:Qo,ciBuildId:zo,recordKey:Xo,projectId:Zo,machineId:ts,tag:{...Jt.tag,env:"CURRENTS_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"},environment:{name:"Environment",env:"CURRENTS_ENVIRONMENT",cli:"--environment"},failOnFailures:{name:"Fail on failures",env:"CURRENTS_FAIL_ON_FAILURES",cli:"--fail-on-failures"},reportDir:{name:"Report folder",env:"CURRENTS_REPORT_DIR",cli:"--report-dir"}};var _u=p.extend("config");var rs=null;function gr(){return rs}var h=require("@currents/rules");var ft=p.extend("actions"),ns=512;async function Ir(t,e){try{let r=await mr(t,e);if(!Array.isArray(r))throw new Error("The project actions are not a list");return ft("Fetched %d project actions",r.length),r}catch(r){return g("Failed to fetch the project actions, uploading without them"),ft("Failed to fetch the project actions: %o",r),[]}}function Rr({actions:t,instances:e,fullTestSuite:r,gitInfo:n,runTags:o,disableTitleTags:s=!1,group:i}){let a={skipped:0,quarantined:0,tagged:0};if(t.length===0)return a;let l=new h.RulesEvalBase(t,ft);for(let c of e){let f=i??c.groupId;for(let d of c.results.tests){let T=s?[]:Sr(r,{groupId:f,spec:c.spec,testId:d.testId})?.test.tags??[],C=l.getMatchedRules(os({groupId:f,spec:c.spec,test:d,gitInfo:n,tags:[...T,...o]}));if(C.length===0)continue;ft("Test %s matched actions: %j",d.testId,C);let U=ss(d,C);U.length>0&&(is(r,{groupId:f,spec:c.spec,testId:d.testId,tags:U}),a.tagged++);let q=Er(C,h.ACTION_TYPE.SKIP),Z=Er(C,h.ACTION_TYPE.QUARANTINE);q?(Tr(d,q,h.ACTION_ANNOTATIONS.SKIP_POST),a.skipped++):Z&&d.state==="failed"&&(Tr(d,Z,h.ACTION_ANNOTATIONS.QUARANTINE_POST),a.quarantined++)}}return a}function _r(t){t.skipped+t.quarantined+t.tagged!==0&&j("[currents] Actions: %d tests skipped, %d quarantined, %d tagged",t.skipped,t.quarantined,t.tagged)}function os({groupId:t,spec:e,test:r,gitInfo:n,tags:o}){return{title:r.title[r.title.length-1],titlePath:[e,...r.title],file:e,project:t,testId:r.testId,tag:Array.from(new Set([...r.tags??[],...o])),gitInfo:n&&{branch:n.branch,authorName:n.authorName,authorEmail:n.authorEmail,remoteOrigin:n.remoteOrigin,message:n.message},errors:r.attempts.flatMap(s=>s.errors).filter(s=>!!s.message).map(s=>({message:s.message}))}}function Er(t,e){return t.find(r=>r.action.some(n=>n.op===e))}function ss(t,e){let r=[];for(let n of e)for(let o of n.action){if(o.op!==h.ACTION_TYPE.TAG)continue;let s=(0,h.normalizeTagMatcherValue)(o.details?.tags??[]);s.length!==0&&(hr(t,h.ACTION_ANNOTATIONS.TAG,Cr({action:n,type:h.ACTION_TYPE.TAG,testId:t.testId,extraDetails:{tags:s}})),r.push(...(0,h.normalizeTagMatcherValue)(s,{removeAtPrefix:!0})))}return r.length>0&&(t.tags=Array.from(new Set([...t.tags??[],...r]))),r}function Tr(t,e,r){let n=t.state;hr(t,r,Cr({action:e,type:r===h.ACTION_ANNOTATIONS.SKIP_POST?h.ACTION_TYPE.SKIP:h.ACTION_TYPE.QUARANTINE,testId:t.testId,extraDetails:{status:n}})),t.state="pending"}function hr(t,e,r){t.annotations=[...t.annotations??[],{type:e,description:JSON.stringify(r),source:"test"}]}function Cr({action:t,type:e,testId:r,extraDetails:n}){return{rule:{v:t.v,id:t._id,name:t.name.slice(0,ns),type:e,extraDetails:n,appliedAt:Date.now()},testInfo:{testId:r,status:n.status}}}function Sr(t,{groupId:e,spec:r,testId:n}){let o=t.find(i=>i.name===e),s=o?.tests.find(i=>i.spec===r&&i.testId===n);return o&&s?{project:o,test:s}:null}function is(t,{groupId:e,spec:r,testId:n,tags:o}){let s=Sr(t,{groupId:e,spec:r,testId:n});s&&(s.test.tags=Array.from(new Set([...s.test.tags,...o])))}var wr=m(require("fs/promises")),P=require("path");var as=m(require("path")),Ar={".png":{type:"screenshot",contentType:"image/png"},".jpg":{type:"screenshot",contentType:"image/jpeg"},".jpeg":{type:"screenshot",contentType:"image/jpeg"},".webp":{type:"screenshot",contentType:"image/webp"},".gif":{type:"screenshot",contentType:"image/gif"},".mp4":{type:"video",contentType:"video/mp4"},".webm":{type:"video",contentType:"video/webm"},".svg":{type:"attachment",contentType:"image/svg+xml"},".log":{type:"attachment",contentType:"text/plain"},".txt":{type:"attachment",contentType:"text/plain"},".yml":{type:"attachment",contentType:"text/plain"},".yaml":{type:"attachment",contentType:"text/plain"},".md":{type:"attachment",contentType:"text/markdown"},".html":{type:"attachment",contentType:"text/html"},".csv":{type:"attachment",contentType:"text/csv"},".json":{type:"attachment",contentType:"application/json"},".pdf":{type:"attachment",contentType:"application/pdf"},".gz":{type:"attachment",contentType:"application/gzip"},".viewhierarchy":{type:"attachment",contentType:"application/xml"}};var yr=require("path"),Yt=p.extend("detox"),cs="detox.json";function Ur(t){return[...t].sort((e,r)=>(e.session??0)-(r.session??0)||e.invocations-r.invocations)}async function Or(t){let e=(0,yr.join)(t,cs);try{let r=await W(e);if(typeof r?.artifactsRootDir!="string"||!Array.isArray(r?.tests)){Yt("Unexpected Detox manifest contents at %s",e);return}return Yt("Detox manifest: %o",r),r}catch{Yt("No Detox manifest at %s",e);return}}var dt=require("path"),us=p.extend("detox"),Dr=255,ps=/[/\\?<>:*|"$\u0000-\u001f]/g,xr=4;function Nr(t){return ls(t)??fs(t)}function ls({rootDir:t,fullName:e,status:r,invocations:n}){try{let o=require.resolve("detox/src/artifacts/utils/ArtifactPathBuilder",{paths:[process.cwd()]}),s=require(o),i=new s({rootDir:t});return(0,dt.dirname)(i.buildPathForTestArtifact("test.mp4",{fullName:e,status:r,invocations:n}))}catch(o){us("Detox path builder is not available: %o",o);return}}function fs({rootDir:t,fullName:e,status:r,invocations:n}){let o=ms(r),s=n>1?` (${n})`:"",i=e.slice(-Dr+o.length+s.length),a=`${o}${i}${s}`.replace(ps,"_");return(0,dt.join)(t,ds(a,Dr))}function ds(t,e){let r=Buffer.from(t,"utf8");return r.length<=e?t:r.subarray(0,e).toString("utf8").replace(/\uFFFD$/,"")}function ms(t){switch(t){case"passed":return"\u2713 ";case"failed":return"\u2717 ";default:return""}}var Pr=require("path"),Lr=p.extend("detox"),mt="detox.trace.json",gs="ws-client-invocation";async function Br(t){let e=(0,Pr.join)(t,mt),r=new Map,n;try{n=await W(e)}catch{return Lr("No Detox trace at %s",e),r}if(!Array.isArray(n))return Lr("Unexpected Detox trace contents at %s",e),r;let o=Es(n);return Is(n).forEach(({pid:i,ts:a,step:l})=>{o.filter(f=>f.pid===i&&a>=f.startTs&&a<=f.endTs).sort((f,d)=>f.startTs-d.startTs).pop()?.steps.push(l)}),o.forEach(({fullName:i,invocations:a,steps:l})=>{let c=r.get(i)??[];c.push({fullName:i,invocations:a,steps:l.sort((f,d)=>+new Date(f.startTime)-+new Date(d.startTime))}),r.set(i,c)}),r}function Es(t){let e=new Map,r=[];t.forEach(o=>{let s=`${o.pid}:${o.tid}`,i=e.get(s)??[];if(e.set(s,i),o.ph==="B"){i.push(Ts(o));return}if(o.ph==="E"){let a=i.pop();a&&r.push({...a,endTs:Number(o.ts)})}});let n=[...e.values()].flatMap(o=>o.filter(s=>s!==void 0));return[...r,...n]}function Ts(t){let e=t.args?.fullName;if(!(t.args?.context!=="test"||typeof e!="string"))return{fullName:e,invocations:Number(t.args?.invocations??1),pid:Number(t.pid),startTs:Number(t.ts),endTs:Number.MAX_SAFE_INTEGER,steps:[]}}function Is(t){let e=new Map,r=[];return t.forEach(n=>{if(!n.cat?.includes(gs))return;let o=`${n.pid}:${n.tid}`,s=e.get(o)??[];if(n.ph==="B"){s.push({name:n.name??"action",cat:n.cat,ts:Number(n.ts)}),e.set(o,s);return}if(n.ph==="E"){let i=s.pop();if(!i)return;r.push({pid:Number(n.pid),ts:i.ts,step:{title:i.name,category:"detox",startTime:new Date(i.ts/1e3).toISOString(),duration:Math.round((Number(n.ts)-i.ts)/1e3),steps:[]}})}}),r}var z=p.extend("detox"),br="artifacts",Rs=[".mp4",".png",".jpg",".log",".txt",".json",".viewhierarchy"],_s=t=>{let e=(0,P.extname)(t);return Rs.includes(e)?Ar[e]:void 0};async function Mr({instances:t,reportDir:e,manifest:r}){let n=Cs(r),o=await Br(r.artifactsRootDir),s=await Se((0,P.join)(e,br)),i={artifacts:0,steps:0};for(let a of t)for(let l of a.results.tests){let c=n.get(l.testId);if(!c){z("No Detox manifest entry for %s",l.testId);continue}await Ss({test:l,manifestTest:c,rootDir:r.artifactsRootDir,artifactsDir:s,traceSlices:o.get(c.fullName)??[],result:i})}return i.artifacts+=await hs({instances:t,rootDir:r.artifactsRootDir,artifactsDir:s}),i}async function hs({instances:t,rootDir:e,artifactsDir:r}){if(!await L((0,P.join)(e,mt)))return 0;let[n]=await vr(e,[mt],r),o=t.map(s=>s.results.tests[0]).filter(s=>s!==void 0);return o.forEach(s=>{s.artifacts=[...s.artifacts??[],n]}),o.length}function Cs(t){let e=new Map;return t.tests.forEach(r=>{e.set(r.fullName,[...e.get(r.fullName)??[],r.testId])}),new Map(t.tests.filter(r=>{let n=e.get(r.fullName)?.length===1;return n||z("Ambiguous Detox test name, skipping: %s",r.fullName),n}).map(r=>[r.testId,r]))}async function Ss({test:t,manifestTest:e,rootDir:r,artifactsDir:n,traceSlices:o,result:s}){let i=[...t.attempts].sort((c,f)=>c.attempt-f.attempt),a=Ur(e.attempts),l=1;for(let[c,f]of a.entries()){let d=i[c];if(!d){z("No reported attempt %d of %s",c,e.fullName);continue}let T=await As({fullName:e.fullName,status:f.status,rootDir:r,artifactsDir:n,fromInvocation:l});T&&(l=T.invocation+1,d.artifacts=[...d.artifacts??[],...T.artifacts],s.artifacts+=T.artifacts.length);let C=Us(o,c,T?.invocation);C.length&&(d.steps=[...d.steps??[],...C],s.steps+=C.length)}}async function As({fullName:t,status:e,rootDir:r,artifactsDir:n,fromInvocation:o}){for(let s=o;s<o+xr;s++){let i=Nr({rootDir:r,fullName:t,status:e,invocations:s}),a=await ys(i);if(a)return{invocation:s,artifacts:await vr(i,a,n)}}z("No Detox artifacts for %s [%s]",t,e)}async function ys(t){try{return(await wr.default.readdir(t)).sort()}catch{return}}async function vr(t,e,r){let n=[];for(let o of e){let s=_s(o);if(!s){z("Skipping unsupported Detox artifact %s",o);continue}let i=(0,P.join)(t,o),a=`${Ue(i)}${(0,P.extname)(o)}`;await Ae(i,(0,P.join)(r,a)),n.push({...s,path:(0,P.join)(br,a),name:o})}return n}function Us(t,e,r){return((r===void 0?void 0:t.find(s=>s.invocations===r))??[...t].sort((s,i)=>s.invocations-i.invocations)[e])?.steps??[]}var M=class{constructor(e){this.config=e}async getFullTestSuite(){return[]}};var Ds=m(require("crypto"));var Os=m(require("path"));async function gt(t){let e=await L(t);if(!e)throw new Error("File does not exist");return e}function Fr(){return"root"}function Hr(t){let e=(t.join(" ").match(/@(\S+)/g)??[]).filter(Boolean).map(r=>r);return Array.from(new Set([...e].map(r=>r.trim()).map(r=>r.replace("@",""))))}var xs=/^[0-9a-f]{32}$/;function kr(t){let e=[];for(let r of t){let n=e.find(o=>o.name===r.groupId);n||(n={name:r.groupId,tags:[],tests:[]},e.push(n)),n.tests.push(...jr(r))}return e.length===1&&xs.test(e[0].name)&&(e[0].name=Fr()),e}function Gr(t,e,r){let n=[];for(let{projectId:o,spec:s}of e){let i=r.find(l=>l.spec===s&&l.groupId===o)??(t.length===1?r.find(l=>l.spec===s):void 0);if(!i){n.push(s);continue}let a=t.length===1?t[0]:t.find(l=>l.name===o);a||(a={name:o,tags:[],tests:[]},t.push(a)),a.tests.push(...jr(i))}return n}function jr(t){return t.results.tests.map(e=>({spec:t.spec,testId:e.testId,title:e.title,tags:e.tags??Hr(e.title)}))}var nn=m(require("fs"));var en=require("lodash");function Kr(t){let e=[];for(let[r,n]of Object.entries(t))r==="_"||r==="$0"||r.includes("-")||(typeof n=="boolean"?n&&e.push(`--${r}`):Array.isArray(n)?n.forEach(o=>{e.push(`--${r}=${o}`)}):e.push(`--${r}=${n}`));return e.join(" ")}var $r=require("lodash"),Ns=["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","testFailureExitCode","testNamePattern","verbose","waitNextEventLoopTurnForUnhandledRejectionEvents","watch","watchAll","watchPathIgnorePatterns","watchman"];function Jr(t){return(0,$r.omit)(t,...Ns)}var Zr=m(require("fs")),Rt=require("lodash"),qt=m(require("path"));var Vt=m(require("fs")),Et=require("module"),Tt=m(require("path")),Yr=m(require("semver")),Ls=">=29.5.0";function Ps(){let t=(0,Et.createRequire)(Tt.default.join(process.cwd(),"package.json"));if(Bs(t)==="jest-cli")return t.resolve("jest-cli");try{return(0,Et.createRequire)(t.resolve("jest")).resolve("jest-cli")}catch{}try{return t.resolve("jest-cli")}catch{throw new Error(`Jest discovery needs the "jest" package, and it is not installed in ${process.cwd()}. Run the command from the folder of the project that ran the tests, or install Jest 29.5 or later: npm install --save-dev jest`)}}function Bs(t){for(let e of t.resolve.paths("jest")??[]){if(Vt.default.existsSync(Tt.default.join(e,"jest","package.json")))return"jest";if(Vt.default.existsSync(Tt.default.join(e,"jest-cli","package.json")))return"jest-cli"}return null}function Vr(){let t=(0,Et.createRequire)(Ps()),{version:e}=t("jest-cli/package.json");if(!Yr.default.satisfies(e,Ls,{includePrerelease:!0}))throw new Error(`Jest discovery needs Jest 29.5 or later, and ${process.cwd()} has Jest ${e}. Update Jest: npm install --save-dev jest@latest`);return t}function qr(){return Vr()("jest-cli")}function Wr(){return Vr()("jest-config")}function It(t,e){return(...r)=>new Promise((n,o)=>{let s=0,i=()=>{s++;try{let a=t(...r);n(a)}catch(a){if(s>=e.length)o(a);else{let l=e[s-1];setTimeout(i,l)}}};i()})}var Qr=p.extend("jest-discovery");function zr(t){return["testEnvironment","globalSetup","globalTeardown"].some(e=>String(t[e]??"").includes("detox"))}function Xr(t){return{...(0,Rt.omit)(t,["globalSetup","globalTeardown","testEnvironmentOptions"]),testEnvironment:"node"}}async function tn(t,e){let r=e.detox;try{let{readInitialOptions:n}=Wr(),{config:o,configPath:s}=await n(t);r||=[o,...o.projects??[]].some(T=>typeof T!="string"&&zr(T));let i=["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"],a=["collectCoverageFrom","coverageDirectory","coveragePathIgnorePatterns","detectLeaks","detectOpenHandles","errorOnDeprecated","forceCoverageMatch","openHandlesTimeout","runner","watchPathIgnorePatterns"],l=T=>e.detox||zr(T),c=(0,Rt.omit)(o,i);if(l(c)&&(c=Xr(c)),c.projects&&(c.projects=c.projects.map(T=>{if(typeof T=="string")return T;let C=(0,Rt.omit)(T,a);return l(C)?Xr(C):C})),c.rootDir&&Object.keys(c).length===1)return null;let f=qt.default.resolve(s?qt.default.dirname(s):process.cwd(),`.jest-scanner-${new Date().getTime()}.config.cjs`),d=`module.exports=${JSON.stringify(c,null,2)}`;return Qr("configFileContent: %O",d),Zr.default.writeFileSync(f,d),await It(gt,[200,200,200,200,200,1e3])(f),f}catch(n){if(Qr("error %o",n),r)throw new Error(`Failed to recreate the Jest config for discovery: ${n.message}`);return R("Failed to recreate the config file"),null}}async function rn(t,e){let r="!!##ThisPatternWillNotMatchAnyTestName##!!",n=t.options,o=Jr(n),s=Kr(o),i=n.config,a=await tn(i,e);return{cliArgs:[s,"--testNamePattern",r,"--reporters",require.resolve("@currents/cmd/discovery/jest"),"--shard=1/1","--testFailureExitCode=0",a?`--config=${a}`:"",...t.args].filter(c=>!(0,en.isEmpty)(c)),configFilePath:a}}var ws=p.extend("jest-discovery");async function on(t,e){console.time(K("@currents/jest:fullTestSuite-ready"));let{run:r}=qr(),{cliArgs:n,configFilePath:o}=await rn(t,e);try{let s=await Ce(".json");return ws("running scanner: %o",n),process.env.CURRENTS_DISCOVERY_PATH=s,await r(n.concat(["--openHandlesTimeout=0"])),await It(gt,Array.from({length:300},()=>100))(s),console.timeEnd(K("@currents/jest:fullTestSuite-ready")),await F(s)}catch(s){return R("Failed to obtain the jest full test suite:",s),{fullTestSuite:[],specsWithoutResults:[]}}finally{o&&nn.default.unlinkSync(o)}}var sn=p.extend("jest-discovery"),_t=class extends M{constructor(r,n){super(r);this.instances=n}async getFullTestSuite(){if(!this.config.frameworkConfig?.shard)return sn("Not a sharded run, listing the tests of the results"),kr(this.instances);let{fullTestSuite:r,specsWithoutResults:n}=await on(this.config.cliArgs,{detox:this.config.frameworkConfig.originFramework==="detox"});if(n.length===0)return r;for(let{spec:s,message:i}of n)g("Discovery could not load %s: %s",s,bs(i));let o=Gr(r,n,this.instances);return g("The tests of these files are listed from the results of the shard that ran them. Currents can show the run as finished before the other shards upload."),sn("Files that did not run on this shard: %o",o),r.filter(s=>s.tests.length>0)}};function bs(t){return t.split(`
|
|
9
|
+
`).map(e=>e.trim()).find(e=>e&&!e.startsWith("\u25CF"))??""}var cn=m(require("fs"));var an=m(require("path"));function ht(t){return an.default.join(t,"fullTestSuite.json")}var Ms=p.extend("junit-discovery");async function un(t){console.time(K("@currents/junit:fullTestSuite-ready"));try{Ms("running scanner: %o",t);let e=ht(t);process.env.CURRENTS_DISCOVERY_PATH=e;let r=cn.default.readFileSync(e,"utf-8");return JSON.parse(r)}catch(e){return R("Failed to obtain the junit full test suite:",e),[]}}var Ct=class extends M{constructor(e,r){super(e),this.reportDir=r}async getFullTestSuite(){return un(this.reportDir)}};function pn(t,e,r){switch(t.framework){case"jest":return new _t(t,r);case"junit":return new Ct(t,e);default:return new M(t)}}var X=m(require("fs/promises")),B=m(require("path"));async function ln(t){let e=await vs(t?.reportDir);return{reportDir:e,configFilePath:t?.configFilePath??B.default.join(e,"config.json")}}async function vs(t){if(t){if(!await L(t))throw new Error(`No reports found: the folder "${t}" does not exist.`);return t}let e=(0,B.join)(process.cwd(),".currents"),r=await L(e)?await Fs(e):null;if(!r)throw new Error(`No reports found: there is no report folder in "${e}". Run the tests with a Currents reporter first, or pass --report-dir with the folder of the reports.`);return r}async function Fs(t){let e=await X.default.readdir(t),r=null;for(let n of e){let o=B.default.join(t,n),s=await X.default.stat(o);s.isDirectory()&&(!r||s.birthtime>r.birthtime)&&(r={name:n,birthtime:s.birthtime})}return r?(0,B.resolve)(t,r.name):null}async function Wt(t){try{return await L(t)}catch{return R("Error checking if path exists:",R),!1}}async function fn(t){let e=B.default.join(t,"instances");return Hs(e)}async function Hs(t){let e=await X.default.readdir(t),r=[];for(let n of e){let o=B.default.join(t,n);(await X.default.stat(o)).isFile()&&r.push(o)}return r}var ks=t=>Buffer.byteLength(JSON.stringify(t),"utf8"),dn=(t,e=1048576)=>{let r=[],n=[],o=0;for(let s of t){let i=ks(s);o+i>e&&(r.push(n),n=[],o=0),n.push(s),o+=i}return n.length>0&&r.push(n),r};var Gs=3e4,js=it(64);async function Tn(){let t=gr();if(!t)throw new Error("Currents config is missing!");let e=await ln(t);Zt(Vs(e.reportDir)),p("Reporter options: %o",e),j("Report directory: %s",e.reportDir);let r=await F(e.configFilePath);p("Report config: %o",r);let n=await fn(e.reportDir);p("Found %d instance results in the reportDir: %s",n.length,e.reportDir);let o=Ys(e.reportDir),s=await Wt(o),i=ht(e.reportDir),a=null;if(s){let I=await F(o);g("Marker file detected. The report was already uploaded: %o",{runUrl:I.response.runUrl,isoDate:I.isoDate})}let l=[];for(let I of n)l.push(await F(I));if(a=await qs(i),a)p("Full test suite file detected: %s",i);else{let N=await pn(r,e.reportDir,l).getFullTestSuite();if(!In(N)||Rn(N))throw new Error("Failed to discover the full test suite!");a=N,await wt(i,JSON.stringify(a))}t.environment&&(a=a.map(I=>({...I,environment:I.environment??t.environment})));let c=a.length===1?a[0].name:null,f={currents:t},d={type:r.framework,version:r.frameworkVersion,clientVersion:ot,frameworkConfig:{originFramework:r.frameworkConfig?.originFramework,originFrameworkVersion:r.frameworkConfig?.originFrameworkVersion}},T=rt.userFacingNanoid(),C=se(t.ciBuildId),U={};for(let I of l)U[I.groupId]||(U[I.groupId]=[]),U[I.groupId].push(I);let q=await Or(e.reportDir);if(q){let I=await Mr({instances:Object.values(U).flat(),reportDir:e.reportDir,manifest:q});j("[currents] Attached %d Detox artifacts and %d steps",I.artifacts,I.steps)}let Z=await Ir(t.projectId,t.recordKey);_r(Rr({actions:Z,instances:Object.values(U).flat(),fullTestSuite:a,gitInfo:await xt(),runTags:t.tag??[],disableTitleTags:t.disableTitleTags,group:c}));let tt=new Map;Object.values(U).forEach(I=>{I.forEach(N=>{N.artifacts?.forEach(O=>{O&&tt.set(O.path,O.contentType)}),N.results.tests.forEach(O=>{O.artifacts?.forEach(y=>{y&&tt.set(y.path,y.contentType)}),O.attempts.forEach(y=>{y.artifacts?.forEach(v=>{v&&tt.set(v.path,v.contentType)})})})})});for await(let I of Object.keys(U)){let N=U[I],O=I;c&&(p("Default group found: %s, overwriting the group in the results",c),O=c,N=N.map(y=>({...y,groupId:c})));try{let y=dn(N),v=await mn({ci:C,group:O,instances:[],fullTestSuite:a,config:f,machineId:T,framework:d});for(let At=0;At<y.length;At++){let yt=await mn({ci:C,group:O,instances:y[At],fullTestSuite:[],config:f,machineId:T,framework:d});yt.artifactUploadUrls&&yt.artifactUploadUrls.length>0&&await Ws(yt.artifactUploadUrls,e.reportDir,tt)}p("Api response: %o",v),j("[%s] Run created: %s",O,v.runUrl);let _n={response:v,isoDate:new Date().toISOString()};await wt(o,JSON.stringify(_n)),p("Marker file %s: %s",s?"overwritten":"created",o)}catch(y){throw p("Failed to upload the results to the dashboard"),y}}t.failOnFailures&&$s(l)}var Ks=10;function $s(t){let e=t.flatMap(o=>o.results.tests.filter(s=>s.state==="failed").map(s=>`${o.spec}: ${Js(s.title,o.spec)}`));if(e.length===0)return;let r=e.slice(0,Ks),n=e.length-r.length;throw new Error([`${e.length} ${e.length===1?"test":"tests"} failed (--fail-on-failures):`,...r.map(o=>` - ${o}`),...n>0?[` and ${n} more`]:[]].join(`
|
|
10
|
+
`))}function Js(t,e){return(t[0]===e?t.slice(1):t).join(" > ")}async function mn({ci:t,group:e,instances:r,fullTestSuite:n,config:o,machineId:s,framework:i}){let a=await xt(),l=await me(),c={browserName:"node",browserVersion:En.default.coerce(process.version)?.version},{currents:f}=o,T={platform:{...c,...l},ci:t,commit:a,group:e,fullTestSuite:n,config:o,projectId:f.projectId,recordKey:f.recordKey,ciBuildId:t.ciBuildId.value??void 0,tags:f.tag??[],machineId:f.machineId??s,framework:i,instances:r,previousCiBuildId:process.env.CURRENTS_PREVIOUS_CI_BUILD_ID};return p("Creating run: %o",x(T)),fr(T)}function Ys(t){return St.default.join(t,"upload.marker.json")}function Vs(t){return St.default.join(t,`.debug-${new Date().toISOString()}.log`)}async function qs(t){if(!await Wt(t))return null;try{let e=await F(t);return!In(e)||Rn(e)?(g("Ignoring %s, it is not a list of projects and tests",t),null):e}catch(e){return g("Ignoring %s, it is not valid JSON: %s",t,e),null}}function In(t){return Array.isArray(t)&&t.every(e=>typeof e?.name=="string"&&Array.isArray(e.tests)&&e.tests.every(r=>typeof r?.spec=="string"&&typeof r.testId=="string"&&Array.isArray(r.title)&&r.title.every(n=>typeof n=="string")))}function Rn(t){return t.length===0||t.some(e=>e.tests.length===0)}async function Ws(t,e,r){p("Uploading %d artifacts",t.length),await Promise.all(t.map(n=>{let o=St.default.join(e,n.path),s=r.get(n.path)||"application/octet-stream";return js(()=>Qs(o,s,n.uploadUrl))}))}var Qs=async(t,e,r)=>{try{if(!await L(t)){g("Artifact file not found: %s",t);return}let n=await gn.default.readFile(t);await ct({method:"PUT",url:r,body:n,headers:{"Content-Type":e},timeout:Gs})}catch(n){p("Failed to upload artifact %s: %o",t,n)}};0&&(module.exports={handleCurrentsReport});
|
|
12
11
|
/*! For license information please see index.js.LEGAL.txt */
|
|
13
12
|
//# sourceMappingURL=index.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var C=Object.create;var c=Object.defineProperty;var N=Object.getOwnPropertyDescriptor;var A=Object.getOwnPropertyNames;var D=Object.getPrototypeOf,$=Object.prototype.hasOwnProperty;var O=(t,e)=>{for(var r in e)c(t,r,{get:e[r],enumerable:!0})},y=(t,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of A(e))!$.call(t,o)&&o!==r&&c(t,o,{get:()=>e[o],enumerable:!(n=N(e,o))||n.enumerable});return t};var a=(t,e,r)=>(r=t!=null?C(D(t)):{},y(e||!t||!t.__esModule?c(r,"default",{value:t,enumerable:!0}):r,t)),W=t=>y(c({},"__esModule",{value:!0}),t);var U={};O(U,{default:()=>m});module.exports=W(U);var h=require("debug"),_=a(require("fs")),l=(0,h.debug)("currents");var j=a(require("fs/promises"));var F=a(require("crypto"));var d=a(require("util"));var s=(...t)=>(...e)=>{let r=e.join(" ");return r?t.reduceRight((n,o)=>(0,d.styleText)(o,n),r):""};var nt=s("cyan"),st=s("blueBright"),it=s("red"),at=s("yellow"),ct=s("green"),lt=s("gray"),ut=s("white"),pt=s("black"),mt=s("magenta"),x=s("dim"),gt=s("bold");var P=require("crypto"),J=require("fs"),L=a(require("fs/promises")),M=require("os"),b=require("path");function R(t){let e=0,r=[];return async n=>{e<t?e++:await new Promise(o=>r.push(o));try{return await n()}finally{let o=r.shift();o?o():e--}}}var kt=R(32);var u=a(require("path"));function S(t,e){return H(u.default.relative(e,t))}function H(t){return t.split(u.default.sep).join(u.default.posix.sep)}function v(){return"root"}function k(t){return t.context.config.displayName?.name??t.context.config.id}function w(t){return[...t.ancestorTitles,t.title]}function T(t){return S(t.path,t.context.config.rootDir)}function E(t,e){let r=w(e),n=T(t),o=r.join(" ")+n;return F.default.createHash("sha256").update(o).digest("hex").substring(0,16)}function I(t){let e=(t.join(" ").match(/@(\S+)/g)??[]).filter(Boolean).map(r=>r);return Array.from(new Set([...e].map(r=>r.trim()).map(r=>r.replace("@",""))))}var p=l.extend("jest-discovery"),m=class{constructor(){this.specsWithoutResults=[];this.fullTestSuite={}}onRunStart(e){p("onRunStart, results: %O",e),console.time(x("@currents/jest-discovery"))}onTestFileResult(e,r){let n=k(e);this.fullTestSuite[n]||(this.fullTestSuite[n]={name:n,tags:[],tests:[]});let o=T(e);p("onTestFileResult [%s][%s]",n,o),r.testResults.length===0?(p("Failed to obtain spec results, error:",o,r.failureMessage),this.specsWithoutResults.push({projectId:n,spec:o,message:r.failureMessage??""})):this.fullTestSuite[n].tests.push(...r.testResults.map(g=>{let f=w(g);return{spec:o,tags:I(f),testId:E(e,g),title:f}}))}async onRunComplete(e,r){let n=process.env.CURRENTS_DISCOVERY_PATH;if(!n)throw new Error("CURRENTS_DISCOVERY_PATH is not set");let o={fullTestSuite:this.getFullTestSuite(e),specsWithoutResults:this.specsWithoutResults};p("onRunComplete %s, %o",n,o),await j.default.writeFile(n,JSON.stringify(o),"utf8"),console.timeEnd(x("@currents/jest-discovery"))}getFullTestSuite(e){let r=Object.values(this.fullTestSuite),n=r.length===1,o=r.length>0&&e.size>0&&[...e][0].config.id===r[0].name;return n&&o&&(r[0].name=v()),r}};
|
|
2
2
|
//# sourceMappingURL=reporter.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: currents-cli
|
|
3
|
-
description: Run the Currents CLI (the `currents` command of the npm package @currents/cmd). Use when asked to upload test results to Currents, convert JUnit or other test reports to the Currents format, attach files or logs to a CI run, cancel a Currents run when CI is cancelled, record a browser session and share it as evidence, cache the last run so a CI rerun runs only the failed tests, or call a Currents REST API route from the command line. Also use when adding these steps to GitHub Actions or GitLab CI.
|
|
3
|
+
description: Run the Currents CLI (the `currents` command of the npm package @currents/cmd). Use when asked to upload test results to Currents, convert JUnit or other test reports to the Currents format, attach files or logs to a CI run, cancel a Currents run when CI is cancelled, share a public link to a CI run or to one of its failing tests, record a browser session and share it as evidence, cache the last run so a CI rerun runs only the failed tests, or call a Currents REST API route from the command line. Also use when adding these steps to GitHub Actions or GitLab CI.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Currents CLI
|
|
@@ -13,6 +13,7 @@ description: Run the Currents CLI (the `currents` command of the npm package @cu
|
|
|
13
13
|
- `currents run attach`: attach logs or other files to a run that CI recorded.
|
|
14
14
|
- `currents run cancel`: cancel a run when its CI workflow is cancelled.
|
|
15
15
|
- `currents run get`: get the data of a run.
|
|
16
|
+
- `currents run share`: print a public link to a run, or to one spec file or test of it, for a person or for an agent fixing the tests.
|
|
16
17
|
- `currents session start`, then `session attach` and `session share`: record a browser session and share a link to it.
|
|
17
18
|
- `currents cache set` and `cache get` with `--preset last-run`: rerun only the failed Playwright tests in a CI rerun. With `--id`: save files in one CI job and restore them in another.
|
|
18
19
|
- `currents api <path>`: call any other REST API route.
|
|
@@ -24,7 +25,7 @@ Before you use a command, run `currents <command> --help` for its options and ex
|
|
|
24
25
|
## Credentials
|
|
25
26
|
|
|
26
27
|
- Record key, in `CURRENTS_RECORD_KEY` or `--key`: `run upload`, `run cancel`, `cache`.
|
|
27
|
-
- API key, in `CURRENTS_API_KEY` or `--api-key`: `run get`, `api`.
|
|
28
|
+
- API key, in `CURRENTS_API_KEY` or `--api-key`: `run get`, `run share`, `api`.
|
|
28
29
|
- `run attach` and `session` take either key. The record key wins when both are set.
|
|
29
30
|
|
|
30
31
|
Both keys come from the Currents dashboard. Set them as environment variables or CI secrets, not as options.
|
package/docs/ci-setup.md
CHANGED
|
@@ -31,7 +31,7 @@ jobs:
|
|
|
31
31
|
- uses: actions/checkout@v4
|
|
32
32
|
- uses: actions/setup-node@v4
|
|
33
33
|
with:
|
|
34
|
-
node-version: 22 # the CLI needs Node
|
|
34
|
+
node-version: 22 # the CLI needs Node.js 22.13 or later
|
|
35
35
|
- run: npm ci
|
|
36
36
|
# Steps from the sections below go here.
|
|
37
37
|
```
|
|
@@ -108,7 +108,7 @@ Set `CURRENTS_RECORD_KEY` as a masked CI/CD variable in the project settings.
|
|
|
108
108
|
|
|
109
109
|
```yaml
|
|
110
110
|
test:
|
|
111
|
-
image: node:22 # the CLI needs Node
|
|
111
|
+
image: node:22 # the CLI needs Node.js 22.13 or later
|
|
112
112
|
variables:
|
|
113
113
|
CURRENTS_PROJECT_ID: <project-id>
|
|
114
114
|
CURRENTS_CI_BUILD_ID: $CI_PIPELINE_ID
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@currents/cmd",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.0.0",
|
|
4
4
|
"main": "./dist/index.js",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Currents Software Inc",
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
},
|
|
14
14
|
"description": "Currents CLI tools",
|
|
15
15
|
"engines": {
|
|
16
|
-
"node": ">=
|
|
16
|
+
"node": ">=22.13"
|
|
17
17
|
},
|
|
18
18
|
"scripts": {
|
|
19
19
|
"test": "vitest",
|
|
@@ -26,24 +26,19 @@
|
|
|
26
26
|
"publish:npm": "npm run rm && npm run build && ./publish.js"
|
|
27
27
|
},
|
|
28
28
|
"devDependencies": {
|
|
29
|
-
"@jest/reporters": "^30.
|
|
29
|
+
"@jest/reporters": "^30.5.2",
|
|
30
30
|
"@jest/types": "^30.4.1",
|
|
31
31
|
"@release-it/conventional-changelog": "^12.0.0",
|
|
32
32
|
"release-it": "^21.0.2",
|
|
33
|
-
"@types/archiver": "^6.0.3",
|
|
34
|
-
"@types/async-retry": "^1.4.9",
|
|
35
33
|
"@types/debug": "^4.1.12",
|
|
36
34
|
"@types/fs-extra": "^11.0.4",
|
|
37
|
-
"@types/getos": "^3.0.4",
|
|
38
35
|
"@types/lodash": "^4.17.16",
|
|
39
36
|
"@types/node": "^25.5.0",
|
|
40
|
-
"@types/proxy-from-env": "^1.0.4",
|
|
41
37
|
"@types/semver": "^7.5.8",
|
|
42
|
-
"@types/tmp": "^0.2.6",
|
|
43
|
-
"@types/unzipper": "^0.10.11",
|
|
44
|
-
"@types/uuid": "^10.0.0",
|
|
45
38
|
"@types/xml2js": "^0.4.14",
|
|
46
|
-
"@types/
|
|
39
|
+
"@types/yauzl": "3.4.0",
|
|
40
|
+
"@types/yazl": "3.3.1",
|
|
41
|
+
"fs-extra": "^11.3.4",
|
|
47
42
|
"jest": "^30.4.2",
|
|
48
43
|
"jest-cli": "^30.4.2",
|
|
49
44
|
"jest-config": "^30.4.2",
|
|
@@ -54,34 +49,19 @@
|
|
|
54
49
|
},
|
|
55
50
|
"dependencies": {
|
|
56
51
|
"@commander-js/extra-typings": "^14.0.0",
|
|
57
|
-
"@currents/commit-info": "
|
|
58
|
-
"@currents/rules": "
|
|
59
|
-
"archiver": "^7.0.1",
|
|
60
|
-
"async-retry": "^1.3.3",
|
|
61
|
-
"axios": "1.20.0",
|
|
62
|
-
"axios-retry": "4.5.0",
|
|
63
|
-
"chalk": "^4.1.2",
|
|
52
|
+
"@currents/commit-info": "3.0.0",
|
|
53
|
+
"@currents/rules": "0.1.0",
|
|
64
54
|
"commander": "^14.0.0",
|
|
65
55
|
"debug": "^4.4.0",
|
|
66
|
-
"dotenv": "
|
|
67
|
-
"execa": "^9.5.1",
|
|
68
|
-
"fs-extra": "^11.3.4",
|
|
69
|
-
"getos": "^3.2.1",
|
|
70
|
-
"globby": "^11.1.0",
|
|
71
|
-
"https-proxy-agent": "^7.0.4",
|
|
56
|
+
"dotenv": "17.4.2",
|
|
72
57
|
"lodash": "^4.18.1",
|
|
73
|
-
"
|
|
74
|
-
"pretty-ms": "^7.0.1",
|
|
75
|
-
"proxy-from-env": "^1.1.0",
|
|
58
|
+
"proxy-from-env": "2.1.0",
|
|
76
59
|
"semver": "^7.8.5",
|
|
77
|
-
"
|
|
78
|
-
"
|
|
79
|
-
"tmp-promise": "^3.0.3",
|
|
80
|
-
"ts-pattern": "^5.8.0",
|
|
81
|
-
"unzipper": "^0.12.3",
|
|
82
|
-
"uuid": "11.1.1",
|
|
60
|
+
"tinyglobby": "^0.2.17",
|
|
61
|
+
"undici": "7.30.1",
|
|
83
62
|
"xml2js": "^0.6.2",
|
|
84
|
-
"
|
|
63
|
+
"yauzl": "3.4.0",
|
|
64
|
+
"yazl": "3.3.1"
|
|
85
65
|
},
|
|
86
66
|
"bin": {
|
|
87
67
|
"currents": "./dist/bin/index.js",
|