@currents/cmd 2.2.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 +30 -2
- package/dist/bin/index.js +49 -45
- package/dist/index.js +8 -8
- package/dist/services/upload/discovery/jest/reporter.js +1 -1
- package/dist/skills/currents-cli/SKILL.md +3 -2
- package/docs/ci-setup.md +10 -3
- package/package.json +14 -33
package/dist/index.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
"use strict";var Or=Object.create;var K=Object.defineProperty;var Sr=Object.getOwnPropertyDescriptor;var yr=Object.getOwnPropertyNames;var Nr=Object.getPrototypeOf,xr=Object.prototype.hasOwnProperty;var Bt=(t,e)=>{for(var r in e)K(t,r,{get:e[r],enumerable:!0})},Pt=(t,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of yr(e))!xr.call(t,o)&&o!==r&&K(t,o,{get:()=>e[o],enumerable:!(n=Sr(e,o))||n.enumerable});return t};var u=(t,e,r)=>(r=t!=null?Or(Nr(t)):{},Pt(e||!t||!t.__esModule?K(r,"default",{value:t,enumerable:!0}):r,t)),Lr=t=>Pt(K({},"__esModule",{value:!0}),t);var uo={};Bt(uo,{handleCurrentsReport:()=>hr});module.exports=Lr(uo);var wt=require("debug"),Br=u(require("fs-extra")),a=(0,wt.debug)("currents"),Pr=null;function Mt(t){Pr=t}var J={};Bt(J,{getNanoid:()=>wr,userFacingNanoid:()=>Et});var lt=require("nanoid"),bt="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",wr=(t=16)=>(0,lt.customAlphabet)(bt,t)(),Et=(0,lt.customAlphabet)(bt,12);var d=require("lodash");function vt(t){return t.replace(/^([a-z][a-z0-9+.-]*:\/\/)[^/?#\s]*@/i,"$1")}var Y=a.extend("ci"),Mr=(t,e)=>(0,d.set)(t,(0,d.camelCase)(e),process.env[e]),_=t=>(0,d.transform)(t,Mr,{}),br=()=>process.env.TF_BUILD&&process.env.AZURE_HTTP_USER_AGENT,vr=()=>(0,d.some)(process.env,(t,e)=>/^CODEBUILD_/.test(e)),Fr=()=>process.env.bamboo_buildNumber,Gr=()=>(0,d.some)(process.env,(t,e)=>/^CONCOURSE_/.test(e)),kr=()=>process.env.GITLAB_CI||process.env.CI_SERVER_NAME&&/^GitLab/.test(process.env.CI_SERVER_NAME),Hr=()=>!!(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),jr=()=>process.env.JENKINS_URL||process.env.JENKINS_HOME||process.env.JENKINS_VERSION||process.env.HUDSON_URL||process.env.HUDSON_HOME,Kr={appveyor:"APPVEYOR",azure:br,awsCodeBuild:vr,bamboo:Fr,bitbucket:"BITBUCKET_BUILD_NUMBER",buildkite:"BUILDKITE",circle:"CIRCLECI",concourse:Gr,codeFresh:"CF_BUILD_ID",drone:"DRONE",githubActions:"GITHUB_ACTIONS",gitlab:kr,goCD:"GO_JOB_NAME",jenkins:jr,googleCloud:Hr,semaphore:"SEMAPHORE",teamcity:"TEAMCITY_VERSION",travis:"TRAVIS",netlify:"NETLIFY"};function Jr(){let{env:t}=process;return(0,d.findKey)(Kr,e=>{if((0,d.isString)(e))return t[e];if((0,d.isFunction)(e))return e()})}var Ft=()=>({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"])}),Yr=t=>{let e=Gt();return e?(0,d.chain)(t()).get(e).value():{}};function $r(){return(0,d.chain)(Ft()).omitBy(d.isNull).keys().value()}function Vr(t){return t&&$r().includes(t)}function Gt(){let t=Jr();return Y("detected CI provider name: %s",t),t||null}function Wr(){let t=Yr(Ft);return(0,d.mapValues)(t,e=>(0,d.isString)(e)?vt(e):e)}function kt(t){let e=Wr(),r=Gt(),n=qr(t,r);return Y("detected CI provider: %s",r),Y("detected CI params: %O",e),Y("detected CI build ID: %o",n),{params:e,provider:r,ciBuildId:n}}function qr(t,e){return t?{source:"user",value:t}:Vr(e)?{source:"server",value:null}:{source:"random",value:`auto:${Et()}`}}var Ht=require("@currents/commit-info"),jt=require("lodash");var Qr=a.extend("git"),Xr=async()=>{let t=await(0,Ht.commitInfo)();return Qr("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}},Kt=(0,jt.memoize)(Xr);var Jt=u(require("getos")),Yt=require("lodash"),A=require("os"),$t=require("util"),zr=async()=>{if((0,A.platform)()==="linux")try{let t=await(0,$t.promisify)(Jt.default)();return"dist"in t&&"release"in t?[t.dist,t.release].join(" - "):(0,A.release)()}catch{return(0,A.release)()}return(0,A.release)()},Zr=async()=>{let t=await zr();return{osName:(0,A.platform)(),osVersion:t,osCpus:[],osMemory:{free:(0,A.freemem)(),total:(0,A.totalmem)()}}},Vt=(0,Yt.memoize)(Zr);var Wt={name:"@currents/cmd",version:"2.2.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",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 $=Wt.version;var ft=u(require("lodash")),en=["apiKey","recordKey","key"];function qt(t,e){return ft.default.isPlainObject(t)?ft.default.mapValues(t,(r,n)=>e.includes(n)&&r!==void 0?"*****":qt(r,e)):t}function O(t){return qt(t,en)}var rn=[];function dt(t){rn.push(t)}var h=u(require("chalk")),b=u(require("util"));var Qt=[],Xt=[];var zt=(...t)=>{let e=b.default.format(...t);dt(e),console.log(e)},nn=(...t)=>{let e=b.default.format(...t);dt(e),console.error(e)},V=zt,E=(...t)=>{let e=b.default.format(...t);return Xt.push(e),a("WARNING: ",e),zt(h.default.bgYellow.black(" WARNING "),e)};var I=(...t)=>{let e=b.default.format(...on(t));return Qt.push(e),a("ERROR: ",b.default.format(...t)),nn(h.default.bgRed.white(" ERROR "),e)};var on=t=>t.map(e=>e instanceof Error?e.message:e),W=(t=2)=>console.log(Array(t).fill("").join(`
|
|
2
|
-
`)),$o=h.default.cyan,Vo=h.default.blueBright,Wo=h.default.red,qo=h.default.yellow,Qo=h.default.green,Xo=h.default.gray,zo=h.default.white,Zo=h.default.black,ts=h.default.magenta,v=h.default.dim,es=h.default.bold;var F=u(require("fs-extra")),gt=require("path"),an=require("uuid");async function M(t){try{return await F.default.readJson(t)}catch(e){throw I("Error while reading JSON file: %s",t,e),I}}async function It(t,e){try{return await F.default.writeFile(t,e,"utf8"),t}catch(r){throw I(`Error writing file at ${t}:`,r),r}}async function Zt(t){try{return await F.default.ensureDir(t),a("Folder created",t),t}catch(e){throw I(`Failed to create folder at ${t}:`,e),e}}async function te(t,e){try{return await F.default.ensureDir((0,gt.dirname)(e)),await F.default.copy(t,e),a("File copied from %s to %s",t,e),e}catch(r){throw I(`Failed to copy file from ${t} to ${e}:`,r),r}}var ee=u(require("crypto"));function re(t){return ee.createHash("sha256").update(t).digest("base64").slice(0,8).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}var Rr=u(require("axios")),xt=u(require("fs-extra")),pt=u(require("path")),Cr=u(require("semver"));var Re=u(require("lodash"));var le=u(require("axios")),Ee=u(require("axios-retry")),Ut=u(require("lodash"));var ne=()=>process.env.CURRENTS_API_URL??"https://cy.currents.dev",oe=()=>process.env.CURRENTS_REST_API_URL??"https://api.currents.dev",se=()=>3e4;var q=require("axios"),Tt=u(require("pretty-ms"));var ae=a.extend("http"),ie=[3*1e3,15*1e3,30*1e3],ce=60*1e3;function _t(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 Q=(t,e)=>{let r=ie[Math.min(t,ie.length)-1],n=_t(e);return n===void 0?r:Math.min(Math.max(n,r),ce)},Rt=t=>(ae("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,q.isAxiosError)(t)}),"code"in t&&t.code&&["ECONNABORTED","ECONNREFUSED","ECONNRESET","ETIMEDOUT","ENETRESET"].includes(t.code)?!0:(0,q.isAxiosError)(t)?[408,429,502,503,504].includes(t.response?.status??0):!1),cn=["get","head","options","put","delete"],pe=t=>{if(!(0,q.isAxiosError)(t))return!1;let e=t.response?.status;if(e===429){let r=_t(t);return r===void 0||r<=ce}return cn.includes(t.config?.method?.toLowerCase()??"get")?Rt(t):e===408||t.code==="ECONNREFUSED"||t.code==="ENOTFOUND"},X=()=>3;function ue(t,e,r){ae("Network request '%s' failed: '%s'. Next attempt is in %s (%d/%d).",`${r.method?.toUpperCase()} ${r.url}`,e.message,(0,Tt.default)(Q(t,e)??0),t,X()),E("Network request '%s' failed: '%s'. Next attempt is in %s (%d/%d).",`${r.method?.toUpperCase()} ${r.url}`,e.message,(0,Tt.default)(Q(t,e)??0),t,X())}var Ct=a.extend("http");var ht={api:null,restApi:null};function pn(t){let e=t==="api"?ne():oe();Ct("client base url: %s",e);let r=le.default.create({baseURL:e,timeout:se(),transitional:{clarifyTimeoutError:!0}});return r.interceptors.request.use(n=>{let o=n["axios-retry"]?.retryCount??0;n.headers.set({"x-cmd-version":$}),n.headers.get("Content-Type")||n.headers.set("Content-Type","application/json");let s={...Ut.default.pick(n,"method","url","headers"),baseURL:e,data:Buffer.isBuffer(n.data)?"buffer":n.data,params:n.params};return o?Ct("network request retry: %o",me({...s,baseURL:e,isRetry:!0})):Ct("network request: %o",me(s)),n}),(0,Ee.default)(r,{retries:X(),retryCondition:t==="restApi"?pe:Rt,retryDelay:(n,o)=>Q(n,o),shouldResetTimeout:!0,onRetry:ue}),r}function z(t){return ht[t]===null&&(ht[t]=pn(t)),ht[t]}function me(t){return{method:t.method,baseURL:t.baseURL,url:t.url,data:t.isRetry?"<retry>":un(t.data),params:t.isRetry?"<retry>":t.params,headers:{...t.headers,Authorization:"Bearer ***","x-currents-key":"***"}}}function un(t){if(t?.results?.raw)return O({...t,results:{...t.results,raw:"***"}});if(typeof t=="string")try{return O(JSON.parse(t))}catch{return t}return Ut.default.isPlainObject(t)?O(t):t}var ge=require("axios"),Ie=u(require("lodash")),C=require("ts-pattern");function Te(t){(0,C.match)(t).when(ge.isAxiosError,mn).otherwise(()=>{E("Unexpected error while sending network request: %s",t)})}function mn(t){return(0,C.match)(t).with({code:"ECONNABORTED"},()=>{E("Network connection aborted")}).with({code:"ECONNREFUSED"},()=>{E("Network connection aborted")}).with({code:"ECONNRESET"},()=>{E("Network connection reset")}).with({code:"ETIMEDOUT"},()=>{E("Network connection timeout")}).with({response:C.P.not(C.P.nullish)},e=>{ln(e,{status:e.response.status,data:e.response.data})}).otherwise(e=>{E(`[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 fe={RUN_CANCELLED:"RUN_CANCELLED",RUN_EXPIRED:"RUN_EXPIRED",MISSING_SUITE:"MISSING_SUITE"};function de(t,e){return Ie.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 _e=a.extend("http");async function G(t,e,r=z){try{let n=await r(t).request(e);return _e("network response: %o",{...Re.default.omit(n,"request","config"),url:n.config.url,method:n.config.method}),n}catch(n){let o=n;throw _e("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}),Te(o),o}}var ei=a.extend("api");var ci=a.extend("api");var he=require("util"),Ue=require("zlib");var Ce=a.extend("api"),fn=(0,he.promisify)(Ue.gzip);async function De(t){try{Ce("Run params: %o",O(t));let e=await dn(JSON.stringify(t));return G("api",{url:"v1/runs",method:"POST",headers:{"Content-Type":"application/json","Content-Encoding":"gzip"},data:e}).then(r=>r.data)}catch(e){throw Ce("Failed to create the run:",e),e}}async function dn(t){try{return await fn(t)}catch(e){throw I("Failed to compress run payload:",e),e}}var hi=a.extend("api");var gn=require("axios");var Li=a.extend("api");var Dt={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:In,ciBuildId:Tn,recordKey:_n,projectId:Rn,machineId:Cn}=Dt,hn={debug:In,ciBuildId:Tn,recordKey:_n,projectId:Rn,machineId:Cn,tag:{...Dt.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"},reportDir:{name:"Report folder",env:"CURRENTS_REPORT_DIR",cli:"--report-dir"}};var ca=a.extend("config");var Un=null;function Oe(){return Un}var Ot=u(require("fs-extra")),N=require("path");var Dn=u(require("path")),Se={".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 ye=u(require("fs-extra")),Ne=require("path"),At=a.extend("detox"),An="detox.json";function xe(t){return[...t].sort((e,r)=>(e.session??0)-(r.session??0)||e.invocations-r.invocations)}async function Le(t){let e=(0,Ne.join)(t,An);try{let r=await ye.default.readJson(e);if(typeof r?.artifactsRootDir!="string"||!Array.isArray(r?.tests)){At("Unexpected Detox manifest contents at %s",e);return}return At("Detox manifest: %o",r),r}catch{At("No Detox manifest at %s",e);return}}var Z=require("path"),On=a.extend("detox"),Be=255,Sn=/[/\\?<>:*|"$\u0000-\u001f]/g,Pe=4;function we(t){return yn(t)??Nn(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),c=new s({rootDir:t});return(0,Z.dirname)(c.buildPathForTestArtifact("test.mp4",{fullName:e,status:r,invocations:n}))}catch(o){On("Detox path builder is not available: %o",o);return}}function Nn({rootDir:t,fullName:e,status:r,invocations:n}){let o=Ln(r),s=n>1?` (${n})`:"",c=e.slice(-Be+o.length+s.length),p=`${o}${c}${s}`.replace(Sn,"_");return(0,Z.join)(t,xn(p,Be))}function xn(t,e){let r=Buffer.from(t,"utf8");return r.length<=e?t:r.subarray(0,e).toString("utf8").replace(/\uFFFD$/,"")}function Ln(t){switch(t){case"passed":return"\u2713 ";case"failed":return"\u2717 ";default:return""}}var be=u(require("fs-extra")),ve=require("path"),Me=a.extend("detox"),tt="detox.trace.json",Bn="ws-client-invocation";async function Fe(t){let e=(0,ve.join)(t,tt),r=new Map,n;try{n=await be.default.readJson(e)}catch{return Me("No Detox trace at %s",e),r}if(!Array.isArray(n))return Me("Unexpected Detox trace contents at %s",e),r;let o=Pn(n);return Mn(n).forEach(({pid:c,ts:p,step:l})=>{o.filter(f=>f.pid===c&&p>=f.startTs&&p<=f.endTs).sort((f,R)=>f.startTs-R.startTs).pop()?.steps.push(l)}),o.forEach(({fullName:c,invocations:p,steps:l})=>{let m=r.get(c)??[];m.push({fullName:c,invocations:p,steps:l.sort((f,R)=>+new Date(f.startTime)-+new Date(R.startTime))}),r.set(c,m)}),r}function Pn(t){let e=new Map,r=[];t.forEach(o=>{let s=`${o.pid}:${o.tid}`,c=e.get(s)??[];if(e.set(s,c),o.ph==="B"){c.push(wn(o));return}if(o.ph==="E"){let p=c.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 wn(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 Mn(t){let e=new Map,r=[];return t.forEach(n=>{if(!n.cat?.includes(Bn))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 c=s.pop();if(!c)return;r.push({pid:Number(n.pid),ts:c.ts,step:{title:c.name,category:"detox",startTime:new Date(c.ts/1e3).toISOString(),duration:Math.round((Number(n.ts)-c.ts)/1e3),steps:[]}})}}),r}var H=a.extend("detox"),Ge="artifacts",bn=[".mp4",".png",".jpg",".log",".txt",".json",".viewhierarchy"],vn=t=>{let e=(0,N.extname)(t);return bn.includes(e)?Se[e]:void 0};async function ke({instances:t,reportDir:e,manifest:r}){let n=Gn(r),o=await Fe(r.artifactsRootDir),s=await Zt((0,N.join)(e,Ge)),c={artifacts:0,steps:0};for(let p of t)for(let l of p.results.tests){let m=n.get(l.testId);if(!m){H("No Detox manifest entry for %s",l.testId);continue}await kn({test:l,manifestTest:m,rootDir:r.artifactsRootDir,artifactsDir:s,traceSlices:o.get(m.fullName)??[],result:c})}return c.artifacts+=await Fn({instances:t,rootDir:r.artifactsRootDir,artifactsDir:s}),c}async function Fn({instances:t,rootDir:e,artifactsDir:r}){if(!await Ot.default.pathExists((0,N.join)(e,tt)))return 0;let[n]=await He(e,[tt],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 Gn(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||H("Ambiguous Detox test name, skipping: %s",r.fullName),n}).map(r=>[r.testId,r]))}async function kn({test:t,manifestTest:e,rootDir:r,artifactsDir:n,traceSlices:o,result:s}){let c=[...t.attempts].sort((m,f)=>m.attempt-f.attempt),p=xe(e.attempts),l=1;for(let[m,f]of p.entries()){let R=c[m];if(!R){H("No reported attempt %d of %s",m,e.fullName);continue}let g=await Hn({fullName:e.fullName,status:f.status,rootDir:r,artifactsDir:n,fromInvocation:l});g&&(l=g.invocation+1,R.artifacts=[...R.artifacts??[],...g.artifacts],s.artifacts+=g.artifacts.length);let S=Kn(o,m,g?.invocation);S.length&&(R.steps=[...R.steps??[],...S],s.steps+=S.length)}}async function Hn({fullName:t,status:e,rootDir:r,artifactsDir:n,fromInvocation:o}){for(let s=o;s<o+Pe;s++){let c=we({rootDir:r,fullName:t,status:e,invocations:s}),p=await jn(c);if(p)return{invocation:s,artifacts:await He(c,p,n)}}H("No Detox artifacts for %s [%s]",t,e)}async function jn(t){try{return(await Ot.default.readdir(t)).sort()}catch{return}}async function He(t,e,r){let n=[];for(let o of e){let s=vn(o);if(!s){H("Skipping unsupported Detox artifact %s",o);continue}let c=(0,N.join)(t,o),p=`${re(c)}${(0,N.extname)(o)}`;await te(c,(0,N.join)(r,p)),n.push({...s,path:(0,N.join)(Ge,p),name:o})}return n}function Kn(t,e,r){return((r===void 0?void 0:t.find(s=>s.invocations===r))??[...t].sort((s,c)=>s.invocations-c.invocations)[e])?.steps??[]}var L=class{constructor(e){this.config=e}async getFullTestSuite(){return[]}};var Yn=u(require("crypto"));var je=u(require("fs-extra")),Jn=u(require("path"));async function et(t){let e=await je.default.pathExists(t);if(!e)throw new Error("File does not exist");return e}function Ke(){return"root"}function Je(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 $n=/^[0-9a-f]{32}$/;function Ye(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(...Ve(r))}return e.length===1&&$n.test(e[0].name)&&(e[0].name=Ke()),e}function $e(t,e,r){let n=[];for(let{projectId:o,spec:s}of e){let c=r.find(l=>l.spec===s&&l.groupId===o)??(t.length===1?r.find(l=>l.spec===s):void 0);if(!c){n.push(s);continue}let p=t.length===1?t[0]:t.find(l=>l.name===o);p||(p={name:o,tags:[],tests:[]},t.push(p)),p.tests.push(...Ve(c))}return n}function Ve(t){return t.results.tests.map(e=>({spec:t.spec,testId:e.testId,title:e.title,tags:e.tags??Je(e.title)}))}var cr=u(require("fs-extra")),pr=u(require("tmp"));var ir=require("lodash");function We(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 qe=require("lodash"),Vn=["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 Qe(t){return(0,qe.omit)(t,...Vn)}var or=u(require("fs")),st=require("lodash"),yt=u(require("path"));var St=u(require("fs")),rt=require("module"),nt=u(require("path")),Xe=u(require("semver")),Wn=">=29.5.0";function qn(){let t=(0,rt.createRequire)(nt.default.join(process.cwd(),"package.json"));if(Qn(t)==="jest-cli")return t.resolve("jest-cli");try{return(0,rt.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 Qn(t){for(let e of t.resolve.paths("jest")??[]){if(St.default.existsSync(nt.default.join(e,"jest","package.json")))return"jest";if(St.default.existsSync(nt.default.join(e,"jest-cli","package.json")))return"jest-cli"}return null}function ze(){let t=(0,rt.createRequire)(qn()),{version:e}=t("jest-cli/package.json");if(!Xe.default.satisfies(e,Wn,{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 Ze(){return ze()("jest-cli")}function tr(){return ze()("jest-config")}function ot(t,e){return(...r)=>new Promise((n,o)=>{let s=0,c=()=>{s++;try{let p=t(...r);n(p)}catch(p){if(s>=e.length)o(p);else{let l=e[s-1];setTimeout(c,l)}}};c()})}var er=a.extend("jest-discovery");function rr(t){return["testEnvironment","globalSetup","globalTeardown"].some(e=>String(t[e]??"").includes("detox"))}function nr(t){return{...(0,st.omit)(t,["globalSetup","globalTeardown","testEnvironmentOptions"]),testEnvironment:"node"}}async function sr(t,e){let r=e.detox;try{let{readInitialOptions:n}=tr(),{config:o,configPath:s}=await n(t);r||=[o,...o.projects??[]].some(g=>typeof g!="string"&&rr(g));let c=["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"],l=g=>e.detox||rr(g),m=(0,st.omit)(o,c);if(l(m)&&(m=nr(m)),m.projects&&(m.projects=m.projects.map(g=>{if(typeof g=="string")return g;let S=(0,st.omit)(g,p);return l(S)?nr(S):S})),m.rootDir&&Object.keys(m).length===1)return null;let f=yt.default.resolve(s?yt.default.dirname(s):process.cwd(),`.jest-scanner-${new Date().getTime()}.config.cjs`),R=`module.exports=${JSON.stringify(m,null,2)}`;return er("configFileContent: %O",R),or.default.writeFileSync(f,R),await ot(et,[200,200,200,200,200,1e3])(f),f}catch(n){if(er("error %o",n),r)throw new Error(`Failed to recreate the Jest config for discovery: ${n.message}`);return I("Failed to recreate the config file"),null}}async function ar(t,e){let r="!!##ThisPatternWillNotMatchAnyTestName##!!",n=t.options,o=Qe(n),s=We(o),c=n.config,p=await sr(c,e);return{cliArgs:[s,"--testNamePattern",r,"--reporters",require.resolve("@currents/cmd/discovery/jest"),"--shard=1/1","--testFailureExitCode=0",p?`--config=${p}`:"",...t.args].filter(m=>!(0,ir.isEmpty)(m)),configFilePath:p}}var Xn=a.extend("jest-discovery");async function ur(t,e){console.time(v("@currents/jest:fullTestSuite-ready"));let{run:r}=Ze(),{cliArgs:n,configFilePath:o}=await ar(t,e);try{let s=pr.default.fileSync({postfix:".json"});return Xn("running scanner: %o",n),process.env.CURRENTS_DISCOVERY_PATH=s.name,await r(n.concat(["--openHandlesTimeout=0"])),await ot(et,Array.from({length:300},()=>100))(s.name),console.timeEnd(v("@currents/jest:fullTestSuite-ready")),await M(s.name)}catch(s){return I("Failed to obtain the jest full test suite:",s),{fullTestSuite:[],specsWithoutResults:[]}}finally{o&&cr.default.unlinkSync(o)}}var mr=a.extend("jest-discovery"),it=class extends L{constructor(r,n){super(r);this.instances=n}async getFullTestSuite(){if(!this.config.frameworkConfig?.shard)return mr("Not a sharded run, listing the tests of the results"),Ye(this.instances);let{fullTestSuite:r,specsWithoutResults:n}=await ur(this.config.cliArgs,{detox:this.config.frameworkConfig.originFramework==="detox"});if(n.length===0)return r;for(let{spec:s,message:c}of n)E("Discovery could not load %s: %s",s,zn(c));let o=$e(r,n,this.instances);return E("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."),mr("Files that did not run on this shard: %o",o),r.filter(s=>s.tests.length>0)}};function zn(t){return t.split(`
|
|
10
|
-
`).map(e=>e.trim()).find(e=>e&&!e.startsWith("\u25CF"))??""}var
|
|
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});
|
|
11
11
|
/*! For license information please see index.js.LEGAL.txt */
|
|
12
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
|
```
|
|
@@ -53,7 +53,14 @@ For JUnit XML, `run upload` converts the reports first:
|
|
|
53
53
|
run: npx currents run upload --input-format junit --input-file "reports/*.xml" --framework postman
|
|
54
54
|
```
|
|
55
55
|
|
|
56
|
-
`--framework` takes `postman`, `node`, `vitest` or `wdio`. See `currents run upload --help`.
|
|
56
|
+
`--framework` takes `cypress`, `postman`, `node`, `vitest` or `wdio`. For Cypress run results saved by `after:run`, use `--input-format cypress-json --input-file results.json` without `--framework`: it uploads every attempt, screenshot and video. See `currents run upload --help`.
|
|
57
|
+
|
|
58
|
+
To let Currents actions quarantine tests, let the test step pass and fail the job from the upload. `--fail-on-failures` exits with 1 when a test failed that no action quarantined or skipped:
|
|
59
|
+
|
|
60
|
+
```yaml
|
|
61
|
+
- run: npx detox test || true
|
|
62
|
+
- run: npx currents run upload --fail-on-failures
|
|
63
|
+
```
|
|
57
64
|
|
|
58
65
|
### Attach files to the run
|
|
59
66
|
|
|
@@ -101,7 +108,7 @@ Set `CURRENTS_RECORD_KEY` as a masked CI/CD variable in the project settings.
|
|
|
101
108
|
|
|
102
109
|
```yaml
|
|
103
110
|
test:
|
|
104
|
-
image: node:22 # the CLI needs Node
|
|
111
|
+
image: node:22 # the CLI needs Node.js 22.13 or later
|
|
105
112
|
variables:
|
|
106
113
|
CURRENTS_PROJECT_ID: <project-id>
|
|
107
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,33 +49,19 @@
|
|
|
54
49
|
},
|
|
55
50
|
"dependencies": {
|
|
56
51
|
"@commander-js/extra-typings": "^14.0.0",
|
|
57
|
-
"@currents/commit-info": "
|
|
58
|
-
"
|
|
59
|
-
"async-retry": "^1.3.3",
|
|
60
|
-
"axios": "1.20.0",
|
|
61
|
-
"axios-retry": "4.5.0",
|
|
62
|
-
"chalk": "^4.1.2",
|
|
52
|
+
"@currents/commit-info": "3.0.0",
|
|
53
|
+
"@currents/rules": "0.1.0",
|
|
63
54
|
"commander": "^14.0.0",
|
|
64
55
|
"debug": "^4.4.0",
|
|
65
|
-
"dotenv": "
|
|
66
|
-
"execa": "^9.5.1",
|
|
67
|
-
"fs-extra": "^11.3.4",
|
|
68
|
-
"getos": "^3.2.1",
|
|
69
|
-
"globby": "^11.1.0",
|
|
70
|
-
"https-proxy-agent": "^7.0.4",
|
|
56
|
+
"dotenv": "17.4.2",
|
|
71
57
|
"lodash": "^4.18.1",
|
|
72
|
-
"
|
|
73
|
-
"pretty-ms": "^7.0.1",
|
|
74
|
-
"proxy-from-env": "^1.1.0",
|
|
58
|
+
"proxy-from-env": "2.1.0",
|
|
75
59
|
"semver": "^7.8.5",
|
|
76
|
-
"
|
|
77
|
-
"
|
|
78
|
-
"tmp-promise": "^3.0.3",
|
|
79
|
-
"ts-pattern": "^5.8.0",
|
|
80
|
-
"unzipper": "^0.12.3",
|
|
81
|
-
"uuid": "11.1.1",
|
|
60
|
+
"tinyglobby": "^0.2.17",
|
|
61
|
+
"undici": "7.30.1",
|
|
82
62
|
"xml2js": "^0.6.2",
|
|
83
|
-
"
|
|
63
|
+
"yauzl": "3.4.0",
|
|
64
|
+
"yazl": "3.3.1"
|
|
84
65
|
},
|
|
85
66
|
"bin": {
|
|
86
67
|
"currents": "./dist/bin/index.js",
|