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