Repository: codecov/uploader
Pull request #1071 (2023-05-30 16:21:37)

Release 0.5.1
## What's Changed
* chore(release): 0.5.0 by @thomasrockhu-codecov in https://github.com/codecov/uploader/pull/1026
* fix(deps): update dependency yargs to v17.7.2 by @renovate in https://github.com/codecov/uploader/pull/1038
* chore(deps): update dependency prettier to v2.8.8 by @renovate in https://github.com/codecov/uploader/pull/1035
* chore(deps): update dependency eslint to v8.39.0 by @renovate in https://github.com/codecov/uploader/pull/1032
* chore(deps): update google/cloud-sdk:427.0.0-slim docker digest to 7375fea by @renovate in https://github.com/codecov/uploader/pull/1028
* fix(deps): update dependency undici to v5.22.0 by @renovate in https://github.com/codecov/uploader/pull/1031
* chore(deps): update dependency @types/node to v18.16.3 by @renovate in https://github.com/codecov/uploader/pull/1030
* chore(deps): update github/codeql-action digest to f3feb00 by @renovate in https://github.com/codecov/uploader/pull/1029
* chore(deps): update google/cloud-sdk docker tag to v429 by @renovate in https://github.com/codecov/uploader/pull/1039
* chore(deps): update typescript-eslint monorepo to v5.59.1 by @renovate in https://github.com/codecov/uploader/pull/1027
* chore(deps): update google/cloud-sdk:429.0.0-slim docker digest to ccdbd43 by @renovate in https://github.com/codecov/uploader/pull/1040
* chore(deps): update dependency lint-staged to v13.2.2 by @renovate in https://github.com/codecov/uploader/pull/1036
* chore: update HELPFILE by @kleisauke in https://github.com/codecov/uploader/pull/1037
* chore(deps): update google/cloud-sdk:429.0.0-slim docker digest to 60aa639 by @renovate in https://github.com/codecov/uploader/pull/1041
* chore(deps): update typescript-eslint monorepo to v5.59.2 by @renovate in https://github.com/codecov/uploader/pull/1042
* chore(deps): update github/codeql-action digest to 29b1f65 by @renovate in https://github.com/codecov/uploader/pull/1043
* chore(deps): update google/cloud-sdk:429.0.0-slim docker digest to 1fdc2e3 by @renovate in https://github.com/codecov/uploader/pull/1044
* chore(deps): update commitlint monorepo to v17.6.3 by @renovate in https://github.com/codecov/uploader/pull/1046
* chore(deps): update dependency @types/node to v18.16.4 by @renovate in https://github.com/codecov/uploader/pull/1047
* chore(deps): update dependency eslint to v8.40.0 by @renovate in https://github.com/codecov/uploader/pull/1049
* chore(deps): update google/cloud-sdk:429.0.0-slim docker digest to fab782b by @renovate in https://github.com/codecov/uploader/pull/1045
* chore(deps): update dependency @types/node to v18.16.5 by @renovate in https://github.com/codecov/uploader/pull/1048
* chore(deps): update google/cloud-sdk docker tag to v430 by @renovate in https://github.com/codecov/uploader/pull/1052
* chore(deps): update alpine docker tag to v3.18.0 by @renovate in https://github.com/codecov/uploader/pull/1053
* chore(deps): update dependency @types/validator to v13.7.16 by @renovate in https://github.com/codecov/uploader/pull/1051
* chore(deps): update google/cloud-sdk:430.0.0-slim docker digest to 418e684 by @renovate in https://github.com/codecov/uploader/pull/1055
* chore(deps): update typescript-eslint monorepo to v5.59.5 by @renovate in https://github.com/codecov/uploader/pull/1056
* chore(deps): update dependency @types/node to v18.16.9 by @renovate in https://github.com/codecov/uploader/pull/1057
* fix(deps): update dependency undici to v5.22.1 by @renovate in https://github.com/codecov/uploader/pull/1059
* chore(deps): update google/cloud-sdk:430.0.0-slim docker digest to 96a831d by @renovate in https://github.com/codecov/uploader/pull/1060
* feature: support basic authentication when using a proxy by @drazisil-codecov in https://github.com/codecov/uploader/pull/1069

## New Contributors
* @kleisauke made their first contribution in https://github.com/codecov/uploader/pull/1037

**Full Changelog**: https://github.com/codecov/uploader/compare/v0.5.0...v0.5.1


Patch:
diff --git a/.circleci/config.yml b/.circleci/config.yml
index 3c0201f..4ec6b99 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -66,7 +66,7 @@ jobs:
 
   build-alpine:
     docker:
-      - image: alpine:3.17.3@sha256:124c7d2707904eea7431fffe91522a01e5a861a624ee31d03372cc1d138a3126
+      - image: alpine:3.18.0@sha256:02bb6f428431fbc2809c5d1b41eab5a68350194fb508869a33cb1af4444c9b11
 
     working_directory: ~/repo
 
@@ -119,7 +119,7 @@ jobs:
 
   test-alpine:
     docker:
-      - image: alpine:3.17.3@sha256:124c7d2707904eea7431fffe91522a01e5a861a624ee31d03372cc1d138a3126
+      - image: alpine:3.18.0@sha256:02bb6f428431fbc2809c5d1b41eab5a68350194fb508869a33cb1af4444c9b11
     steps:
       - run:
           name: Install git
@@ -153,7 +153,7 @@ jobs:
 
   test-alpine-proxy:
     docker:
-      - image: alpine:3.17.3@sha256:124c7d2707904eea7431fffe91522a01e5a861a624ee31d03372cc1d138a3126
+      - image: alpine:3.18.0@sha256:02bb6f428431fbc2809c5d1b41eab5a68350194fb508869a33cb1af4444c9b11
     steps:
       - run:
           name: Install git
@@ -185,7 +185,7 @@ jobs:
 
   test-alpine-without-git:
     docker:
-      - image: alpine:3.17.3@sha256:124c7d2707904eea7431fffe91522a01e5a861a624ee31d03372cc1d138a3126
+      - image: alpine:3.18.0@sha256:02bb6f428431fbc2809c5d1b41eab5a68350194fb508869a33cb1af4444c9b11
     steps:
       - run:
           name: Install git
@@ -530,7 +530,7 @@ jobs:
             - release_tag
   release:
     docker:
-      - image: google/cloud-sdk:427.0.0-slim@sha256:89a970c20d9ee9545284198f570abae9c86c52d356f9d7205824de76f2938639
+      - image: google/cloud-sdk:430.0.0-slim@sha256:96a831dff775f0e90ddb424d68314e0069fe68d03d52a4ca6bbe58fef4c1952d
     steps:
       - attach_workspace:
           at: .
diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml
index bb142a5..fa8d171 100644
--- a/.github/workflows/codeql-analysis.yml
+++ b/.github/workflows/codeql-analysis.yml
@@ -42,7 +42,7 @@ jobs:
 
     # Initializes the CodeQL tools for scanning.
     - name: Initialize CodeQL
-      uses: github/codeql-action/init@7df0ce34898d659f95c0c4a09eaa8d4e32ee64db # v2
+      uses: github/codeql-action/init@29b1f65c5e92e24fe6b6647da1eaabe529cec70f # v2
       with:
         languages: ${{ matrix.language }}
         # If you wish to specify custom queries, you can do so here or in a config file.
@@ -53,7 +53,7 @@ jobs:
     # Autobuild attempts to build any compiled languages  (C/C++, C#, or Java).
     # If this step fails, then you should remove it and run the build manually (see below)
     - name: Autobuild
-      uses: github/codeql-action/autobuild@7df0ce34898d659f95c0c4a09eaa8d4e32ee64db # v2
+      uses: github/codeql-action/autobuild@29b1f65c5e92e24fe6b6647da1eaabe529cec70f # v2
 
     # ℹ️ Command-line programs to run using the OS shell.
     # 📚 https://git.io/JvXDl
@@ -67,4 +67,4 @@ jobs:
     #   make release
 
     - name: Perform CodeQL Analysis
-      uses: github/codeql-action/analyze@7df0ce34898d659f95c0c4a09eaa8d4e32ee64db # v2
+      uses: github/codeql-action/analyze@29b1f65c5e92e24fe6b6647da1eaabe529cec70f # v2
diff --git a/CHANGELOG.md b/CHANGELOG.md
index b263749..99ae0fd 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,33 @@
 
 All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
 
+### [0.5.1](https://github.com/codecov/uploader/compare/v0.3.3...v0.5.1) (2023-05-30)
+
+
+### Features
+
+* add full report ([#983](https://github.com/codecov/uploader/issues/983)) ([416c243](https://github.com/codecov/uploader/commit/416c2437c938464feda4b62f5bf5582824b27014))
+* support cobertura reports generated by Microsoft.CodeCoverage ([da21e14](https://github.com/codecov/uploader/commit/da21e147f25c95d57f130bb396fe8f26d89f6f97)), closes [#917](https://github.com/codecov/uploader/issues/917)
+
+
+### Bug Fixes
+
+* add pointer to docs ([#1007](https://github.com/codecov/uploader/issues/1007)) ([f4c98c6](https://github.com/codecov/uploader/commit/f4c98c6e0c26a39710e49f020773d93782faa716))
+* add swift coverage conversions ([1f27f2d](https://github.com/codecov/uploader/commit/1f27f2d3306fa5e4349ae5d2da16649d5eac8026))
+* **deps:** update dependency undici to v5.19.1 [security] ([b275e4b](https://github.com/codecov/uploader/commit/b275e4b832163ee6c464c9f530b89825b19aa218))
+* **deps:** update dependency undici to v5.20.0 ([846313b](https://github.com/codecov/uploader/commit/846313b8ce9bdd96b7f9323d77421e70acd1f411))
+* **deps:** update dependency undici to v5.21.0 ([#985](https://github.com/codecov/uploader/issues/985)) ([d2446d0](https://github.com/codecov/uploader/commit/d2446d01c7eb61fe2cb44d8bc1817a7cb9daed4a))
+* **deps:** update dependency undici to v5.21.2 ([#1016](https://github.com/codecov/uploader/issues/1016)) ([b4bcf02](https://github.com/codecov/uploader/commit/b4bcf021f02d9c03a241013f4e16945a8d9cf699))
+* **deps:** update dependency undici to v5.22.0 ([#1031](https://github.com/codecov/uploader/issues/1031)) ([c76f80d](https://github.com/codecov/uploader/commit/c76f80d11cbc462580bbcf9e0796b46489392b94))
+* **deps:** update dependency undici to v5.22.1 ([#1059](https://github.com/codecov/uploader/issues/1059)) ([554e7a7](https://github.com/codecov/uploader/commit/554e7a77aef79253143e53b72da7c098033b0484))
+* **deps:** update dependency validator to v13.9.0 ([62490d6](https://github.com/codecov/uploader/commit/62490d6195a9e71763e146625a4a77ac2e41efe6))
+* **deps:** update dependency yargs to v17.7.1 ([902d291](https://github.com/codecov/uploader/commit/902d2919f6d29afcb282af9ee4b8b1f65a61825a))
+* **deps:** update dependency yargs to v17.7.2 ([#1038](https://github.com/codecov/uploader/issues/1038)) ([a7e9e3e](https://github.com/codecov/uploader/commit/a7e9e3e212284979e837f77122f9f32b53b0e3f4))
+* **files:** exclude .go and .marker files ([#935](https://github.com/codecov/uploader/issues/935)) ([43924aa](https://github.com/codecov/uploader/commit/43924aa254b87f62bf07feba47d8c17a766a6d21))
+* move checkSlug fn to validate ([#990](https://github.com/codecov/uploader/issues/990)) ([c468bfd](https://github.com/codecov/uploader/commit/c468bfd51b271413f6e9cb736b9c4fa8bdd6b0a9))
+* refactor spawnsize ([#999](https://github.com/codecov/uploader/issues/999)) ([bf1cfb9](https://github.com/codecov/uploader/commit/bf1cfb9be6e2b1cca73878b7f42ea8878911bc3b))
+* remove colons from file name ([f816650](https://github.com/codecov/uploader/commit/f816650892a7a570fa58dbdd64da743145813da2))
+
 ### [0.5.0](https://github.com/codecov/uploader/compare/v0.4.1...v0.5.0) (2023-04-20)
 
 
diff --git a/HELPFILE b/HELPFILE
index 797660e..1cb6ac1 100644
--- a/HELPFILE
+++ b/HELPFILE
@@ -1,44 +1,81 @@
+Usage: codecov <command> [options]
+
 Options:
-  -b, --build       Specify the build number manually
-  -B, --branch      Specify the branch manually
-  -e, --env         Specify environment variables to be included with this build.
-                    Also accepting environment variables: CODECOV_ENV=VAR,VAR2
-  -C, --sha         Specify the commit SHA manually
-  -f, --file        Target file(s) to upload
-  -F, --flags       Flag the upload to group coverage metrics         [default: ""]
-  -n, --name        Custom defined name of the upload. Visible in Codecov UI
-                                                                      [default: ""]
-  -N, --parent      The commit SHA of the parent for which you are uploading
-                    coverage. If not present, the parent will be determined using
-                    the API of your repository provider. When using the repository
-                    provider's API, the parent is determined via finding the
-                    closest ancestor to the commit.
-  -P, --pr          Specify the pull request number manually
-  -s, --dir         Directory to search for coverage reports.
-                    Already searches project root and current working directory
-  -t, --token       Codecov upload token                              [default: ""]
-  -T, --tag         Specify the git tag                               [default: ""]
-  -v, --verbose     Run with verbose logging                              [boolean]
-  -R, --rootDir     Specify the project root directory when not in a git repo
-  -Z, --nonZero     Should errors exit with a non-zero (default: false)
-                                                         [boolean] [default: false]
-  -d, --dryRun      Don't upload files to Codecov                         [boolean]
-  -r, --slug        Specify the slug manually
-  -u, --url         Change the upload host (Enterprise use)
-                                           [string] [default: "https://codecov.io"]
-  -c, --clean       Move discovered coverage reports to the trash
-                                                         [boolean] [default: false]
-  -X, --feature     Toggle functionalities.
-                     Separate multiple ones by comma: -X network,search
-                     -X network       Disable uploading the file network
-                     -X search        Disable searching for coverage files
-                                                                          [string]
-  -Q, --source      Used internally by Codecov, this argument helps track wrappers
-                    of the uploader (e.g. GitHub Action, CircleCI Orb)
-                                                             [string] [default: ""]
-      --gcov        Run with gcov support                [boolean] [default: false]
-      --gcovIgnore  Paths to ignore during gcov gathering                  [string]
-      --gcovInclude Paths to include during gcov gathering                 [string]
-      --gcovArgs    Extra arguments to pass to gcov                        [string]
-  --version         Show version number                                   [boolean]
-  -h, --help        Show help                                             [boolean]
+  -B, --branch                  Specify the branch manually             [string]
+  -b, --build                   Specify the build number manually       [number]
+  -c, --clean                   Move discovered coverage reports to the trash
+                                                      [boolean] [default: false]
+  -C, --sha                     Specify the commit SHA manually         [string]
+      --changelog, --CL         Display a link for the current changelog
+                                                      [boolean] [default: false]
+  -d, --dryRun                  Don't upload files to Codecov
+                                                      [boolean] [default: false]
+  -e, --env                     Specify environment variables to be included
+                                with this build.
+                                Also accepting environment variables:
+                                CODECOV_ENV=VAR,VAR2
+  -f, --file                    Target file(s) to upload                [string]
+      --fullReport, --full      Specify the path to a previously uploaded
+                                Codecov report                          [string]
+  -F, --flags                   Flag the upload to group coverage metrics
+                                                          [string] [default: ""]
+  -g, --gcov                    Run with gcov support [boolean] [default: false]
+      --gcovArgs, --ga          Extra arguments to pass to gcov         [string]
+      --gcovIgnore, --gi        Paths to ignore during gcov gathering   [string]
+      --gcovInclude, --gI       Paths to include during gcov gathering  [string]
+      --gcovExecutable, --gx    gcov executable to run. Defaults to 'gcov'
+                                                                        [string]
+  -i, --networkFilter           Specify a filter on the files listed in the
+                                network section of the Codecov report. Useful
+                                for upload-specific path fixing         [string]
+  -k, --networkPrefix           Specify a prefix on files listed in the network
+                                section of the Codecov report. Useful to help
+                                resolve path fixing                     [string]
+  -n, --name                    Custom defined name of the upload. Visible in
+                                Codecov UI                [string] [default: ""]
+  -N, --parent                  The commit SHA of the parent for which you are
+                                uploading coverage. If not present, the parent
+                                will be determined using the API of your
+                                repository provider. When using the repository
+                                provider's API, the parent is determined via
+                                finding the closest ancestor to the commit.
+                                                                        [string]
+  -P, --pr                      Specify the pull request number manually[number]
+  -Q, --source                  Used internally by Codecov, this argument helps
+                                track
+                                wrappers of the uploader (e.g. GitHub Action,
+                                CircleCI Orb)             [string] [default: ""]
+  -R, --rootDir                 Specify the project root directory when not in a
+                                git repo
+  -r, --slug                    Specify the slug manually [string] [default: ""]
+  -s, --dir                     Directory to search for coverage reports.
+                                Already searches project root and current
+                                working directory                       [string]
+  -T, --tag                     Specify the git tag       [string] [default: ""]
+  -t, --token                   Codecov upload token      [string] [default: ""]
+  -U, --upstream                The upstream http proxy server to connect
+                                through                   [string] [default: ""]
+  -u, --url                     Change the upload host (Enterprise use)
+                                        [string] [default: "https://codecov.io"]
+  -v, --verbose                 Run with verbose logging               [boolean]
+  -X, --feature                 Toggle functionalities. Separate multiple ones
+                                by comma: -X network,search
+                                -X fixes         Enable file fixes to ignore
+                                common lines from coverage (e.g. blank lines or
+                                empty brackets)
+                                -X network       Disable uploading the file
+                                network
+                                -X search        Disable searching for coverage
+                                files                                   [string]
+      --xcode, --xc, --xc       Deprecating, please use xs] Run with xcode 
+                                support               [boolean] [default: false]
+      --xcodeArchivePath, --xp  [Deprecating, please use xs] Specify the xcode
+                                archive path. Likely specified as the
+                                -resultBundlePath and should end in .xcresult
+                                                                        [string]
+      --swift, --xs             Run with swift support[boolean] [default: false]
+      --swiftProject, --xsp     Specify the swift project [string] [default: ""]
+  -Z, --nonZero                 Should errors exit with a non-zero (default:
+                                false)                [boolean] [default: false]
+      --version                 Show version number                    [boolean]
+  -h, --help                    Show help                              [boolean]
diff --git a/jest.config.js b/jest.config.js
index 304f1c1..2d334fa 100644
--- a/jest.config.js
+++ b/jest.config.js
@@ -11,4 +11,5 @@ module.exports = {
   setupFilesAfterEnv: ['<rootDir>/test/test_helpers.ts'],
   reporters: ['jest-spec-reporter'],
   testPathIgnorePatterns: ['<rootDir>/dist/'],
+  modulePathIgnorePatterns: ['<rootDir>/dist'],
 }
diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json
index 948640d..7fbcaca 100644
--- a/npm-shrinkwrap.json
+++ b/npm-shrinkwrap.json
@@ -1,45 +1,45 @@
 {
   "name": "@codecov/uploader",
-  "version": "0.5.0",
+  "version": "0.5.1",
   "lockfileVersion": 2,
   "requires": true,
   "packages": {
     "": {
       "name": "@codecov/uploader",
-      "version": "0.5.0",
+      "version": "0.5.1",
       "license": "ISC",
       "dependencies": {
         "fast-glob": "3.2.12",
         "js-yaml": "4.1.0",
         "snake-case": "3.0.4",
-        "undici": "5.21.2",
+        "undici": "5.22.1",
         "validator": "13.9.0",
-        "yargs": "17.7.1"
+        "yargs": "17.7.2"
       },
       "bin": {
         "codecov": "dist/bin/codecov.js"
       },
       "devDependencies": {
-        "@commitlint/cli": "17.6.1",
-        "@commitlint/config-conventional": "17.6.1",
+        "@commitlint/cli": "17.6.3",
+        "@commitlint/config-conventional": "17.6.3",
         "@types/jest": "27.5.2",
         "@types/js-yaml": "4.0.5",
         "@types/micromatch": "4.0.2",
         "@types/mock-fs": "4.13.1",
-        "@types/node": "18.15.11",
-        "@types/validator": "13.7.15",
+        "@types/node": "18.16.9",
+        "@types/validator": "13.7.16",
         "@types/yargs": "17.0.24",
-        "@typescript-eslint/eslint-plugin": "5.58.0",
-        "@typescript-eslint/parser": "5.58.0",
-        "eslint": "8.38.0",
+        "@typescript-eslint/eslint-plugin": "5.59.5",
+        "@typescript-eslint/parser": "5.59.5",
+        "eslint": "8.40.0",
         "eslint-config-prettier": "8.8.0",
         "husky": "8.0.1",
         "jest": "27.5.1",
         "jest-spec-reporter": "1.0.19",
-        "lint-staged": "13.2.1",
+        "lint-staged": "13.2.2",
         "mock-fs": "5.2.0",
         "pkg": "5.6.0",
-        "prettier": "2.8.7",
+        "prettier": "2.8.8",
         "standard-version": "9.5.0",
         "testdouble": "3.16.6",
         "testdouble-jest": "2.0.0",
@@ -635,13 +635,13 @@
       "dev": true
     },
     "node_modules/@commitlint/cli": {
-      "version": "17.6.1",
-      "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-17.6.1.tgz",
-      "integrity": "sha512-kCnDD9LE2ySiTnj/VPaxy4/oRayRcdv4aCuVxtoum8SxIU7OADHc0nJPQfheE8bHcs3zZdWzDMWltRosuT13bg==",
+      "version": "17.6.3",
+      "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-17.6.3.tgz",
+      "integrity": "sha512-ItSz2fd4F+CujgIbQOfNNerDF1eFlsBGEfp9QcCb1kxTYMuKTYZzA6Nu1YRRrIaaWwe2E7awUGpIMrPoZkOG3A==",
       "dev": true,
       "dependencies": {
         "@commitlint/format": "^17.4.4",
-        "@commitlint/lint": "^17.6.1",
+        "@commitlint/lint": "^17.6.3",
         "@commitlint/load": "^17.5.0",
         "@commitlint/read": "^17.5.1",
         "@commitlint/types": "^17.4.4",
@@ -659,9 +659,9 @@
       }
     },
     "node_modules/@commitlint/config-conventional": {
-      "version": "17.6.1",
-      "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-17.6.1.tgz",
-      "integrity": "sha512-ng/ybaSLuTCH9F+7uavSOnEQ9EFMl7lHEjfAEgRh1hwmEe8SpLKpQeMo2aT1IWvHaGMuTb+gjfbzoRf2IR23NQ==",
+      "version": "17.6.3",
+      "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-17.6.3.tgz",
+      "integrity": "sha512-bLyHEjjRWqlLQWIgYFHmUPbEFMOOLXeF3QbUinDIJev/u9e769tkoTH9YPknEywiuIrAgZaVo+OfzAIsJP0fsw==",
       "dev": true,
       "dependencies": {
         "conventional-changelog-conventionalcommits": "^5.0.0"
@@ -759,25 +759,25 @@
       }
     },
     "node_modules/@commitlint/is-ignored": {
-      "version": "17.4.4",
-      "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-17.4.4.tgz",
-      "integrity": "sha512-Y3eo1SFJ2JQDik4rWkBC4tlRIxlXEFrRWxcyrzb1PUT2k3kZ/XGNuCDfk/u0bU2/yS0tOA/mTjFsV+C4qyACHw==",
+      "version": "17.6.3",
+      "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-17.6.3.tgz",
+      "integrity": "sha512-LQbNdnPbxrpbcrVKR5yf51SvquqktpyZJwqXx3lUMF6+nT9PHB8xn3wLy8pi2EQv5Zwba484JnUwDE1ygVYNQA==",
       "dev": true,
       "dependencies": {
         "@commitlint/types": "^17.4.4",
-        "semver": "7.3.8"
+        "semver": "7.5.0"
       },
       "engines": {
         "node": ">=v14"
       }
     },
     "node_modules/@commitlint/lint": {
-      "version": "17.6.1",
-      "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-17.6.1.tgz",
-      "integrity": "sha512-VARJ9kxH64isgwVnC+ABPafCYzqxpsWJIpDaTuI0gh8aX4GQ0i7cn9tvxtFNfJj4ER2BAJeWJ0vURdNYjK2RQQ==",
+      "version": "17.6.3",
+      "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-17.6.3.tgz",
+      "integrity": "sha512-fBlXwt6SHJFgm3Tz+luuo3DkydAx9HNC5y4eBqcKuDuMVqHd2ugMNr+bQtx6riv9mXFiPoKp7nE4Xn/ls3iVDA==",
       "dev": true,
       "dependencies": {
-        "@commitlint/is-ignored": "^17.4.4",
+        "@commitlint/is-ignored": "^17.6.3",
         "@commitlint/parse": "^17.4.4",
         "@commitlint/rules": "^17.6.1",
         "@commitlint/types": "^17.4.4"
@@ -953,14 +953,14 @@
       }
     },
     "node_modules/@eslint/eslintrc": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz",
-      "integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==",
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz",
+      "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==",
       "dev": true,
       "dependencies": {
         "ajv": "^6.12.4",
         "debug": "^4.3.2",
-        "espree": "^9.5.1",
+        "espree": "^9.5.2",
         "globals": "^13.19.0",
         "ignore": "^5.2.0",
         "import-fresh": "^3.2.1",
@@ -976,9 +976,9 @@
       }
     },
     "node_modules/@eslint/js": {
-      "version": "8.38.0",
-      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.38.0.tgz",
-      "integrity": "sha512-IoD2MfUnOV58ghIHCiil01PcohxjbYR/qCxsoC+xNgUwh1EY8jOOrYmu3d3a71+tJJ23uscEV4X2HJWMsPJu4g==",
+      "version": "8.40.0",
+      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.40.0.tgz",
+      "integrity": "sha512-ElyB54bJIhXQYVKjDSvCkPO1iU1tSAeVQJbllWJq1XQSmmA4dgFk8CbiBGpiOPxleE48vDogxCtmMYku4HSVLA==",
       "dev": true,
       "engines": {
         "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
@@ -1609,9 +1609,9 @@
       }
     },
     "node_modules/@types/node": {
-      "version": "18.15.11",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.11.tgz",
-      "integrity": "sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==",
+      "version": "18.16.9",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.9.tgz",
+      "integrity": "sha512-IeB32oIV4oGArLrd7znD2rkHQ6EDCM+2Sr76dJnrHwv9OHBTTM6nuDLK9bmikXzPa0ZlWMWtRGo/Uw4mrzQedA==",
       "dev": true
     },
     "node_modules/@types/normalize-package-data": {
@@ -1627,9 +1627,9 @@
       "dev": true
     },
     "node_modules/@types/semver": {
-      "version": "7.3.13",
-      "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz",
-      "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==",
+      "version": "7.5.0",
+      "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz",
+      "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==",
       "dev": true
     },
     "node_modules/@types/stack-utils": {
@@ -1639,9 +1639,9 @@
       "dev": true
     },
     "node_modules/@types/validator": {
-      "version": "13.7.15",
-      "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.7.15.tgz",
-      "integrity": "sha512-yeinDVQunb03AEP8luErFcyf/7Lf7AzKCD0NXfgVoGCCQDNpZET8Jgq74oBgqKld3hafLbfzt/3inUdQvaFeXQ==",
+      "version": "13.7.16",
+      "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.7.16.tgz",
+      "integrity": "sha512-VyKmLktUHYLbrSbsRi241MSUlGYomQgK/tfCNpej3Gt5qDOM10AZ3nU2aR2s5JritClXuOBu4K7MkywVW/Y6Ow==",
       "dev": true
     },
     "node_modules/@types/yargs": {
@@ -1660,15 +1660,15 @@
       "dev": true
     },
     "node_modules/@typescript-eslint/eslint-plugin": {
-      "version": "5.58.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.58.0.tgz",
-      "integrity": "sha512-vxHvLhH0qgBd3/tW6/VccptSfc8FxPQIkmNTVLWcCOVqSBvqpnKkBTYrhcGlXfSnd78azwe+PsjYFj0X34/njA==",
+      "version": "5.59.5",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.5.tgz",
+      "integrity": "sha512-feA9xbVRWJZor+AnLNAr7A8JRWeZqHUf4T9tlP+TN04b05pFVhO5eN7/O93Y/1OUlLMHKbnJisgDURs/qvtqdg==",
       "dev": true,
       "dependencies": {
         "@eslint-community/regexpp": "^4.4.0",
-        "@typescript-eslint/scope-manager": "5.58.0",
-        "@typescript-eslint/type-utils": "5.58.0",
-        "@typescript-eslint/utils": "5.58.0",
+        "@typescript-eslint/scope-manager": "5.59.5",
+        "@typescript-eslint/type-utils": "5.59.5",
+        "@typescript-eslint/utils": "5.59.5",
         "debug": "^4.3.4",
         "grapheme-splitter": "^1.0.4",
         "ignore": "^5.2.0",
@@ -1694,14 +1694,14 @@
       }
     },
     "node_modules/@typescript-eslint/parser": {
-      "version": "5.58.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.58.0.tgz",
-      "integrity": "sha512-ixaM3gRtlfrKzP8N6lRhBbjTow1t6ztfBvQNGuRM8qH1bjFFXIJ35XY+FC0RRBKn3C6cT+7VW1y8tNm7DwPHDQ==",
+      "version": "5.59.5",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.5.tgz",
+      "integrity": "sha512-NJXQC4MRnF9N9yWqQE2/KLRSOLvrrlZb48NGVfBa+RuPMN6B7ZcK5jZOvhuygv4D64fRKnZI4L4p8+M+rfeQuw==",
       "dev": true,
       "dependencies": {
-        "@typescript-eslint/scope-manager": "5.58.0",
-        "@typescript-eslint/types": "5.58.0",
-        "@typescript-eslint/typescript-estree": "5.58.0",
+        "@typescript-eslint/scope-manager": "5.59.5",
+        "@typescript-eslint/types": "5.59.5",
+        "@typescript-eslint/typescript-estree": "5.59.5",
         "debug": "^4.3.4"
       },
       "engines": {
@@ -1721,13 +1721,13 @@
       }
     },
     "node_modules/@typescript-eslint/scope-manager": {
-      "version": "5.58.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.58.0.tgz",
-      "integrity": "sha512-b+w8ypN5CFvrXWQb9Ow9T4/6LC2MikNf1viLkYTiTbkQl46CnR69w7lajz1icW0TBsYmlpg+mRzFJ4LEJ8X9NA==",
+      "version": "5.59.5",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.5.tgz",
+      "integrity": "sha512-jVecWwnkX6ZgutF+DovbBJirZcAxgxC0EOHYt/niMROf8p4PwxxG32Qdhj/iIQQIuOflLjNkxoXyArkcIP7C3A==",
       "dev": true,
       "dependencies": {
-        "@typescript-eslint/types": "5.58.0",
-        "@typescript-eslint/visitor-keys": "5.58.0"
+        "@typescript-eslint/types": "5.59.5",
+        "@typescript-eslint/visitor-keys": "5.59.5"
       },
       "engines": {
         "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
@@ -1738,13 +1738,13 @@
       }
     },
     "node_modules/@typescript-eslint/type-utils": {
-      "version": "5.58.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.58.0.tgz",
-      "integrity": "sha512-FF5vP/SKAFJ+LmR9PENql7fQVVgGDOS+dq3j+cKl9iW/9VuZC/8CFmzIP0DLKXfWKpRHawJiG70rVH+xZZbp8w==",
+      "version": "5.59.5",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.5.tgz",
+      "integrity": "sha512-4eyhS7oGym67/pSxA2mmNq7X164oqDYNnZCUayBwJZIRVvKpBCMBzFnFxjeoDeShjtO6RQBHBuwybuX3POnDqg==",
       "dev": true,
       "dependencies": {
-        "@typescript-eslint/typescript-estree": "5.58.0",
-        "@typescript-eslint/utils": "5.58.0",
+        "@typescript-eslint/typescript-estree": "5.59.5",
+        "@typescript-eslint/utils": "5.59.5",
         "debug": "^4.3.4",
         "tsutils": "^3.21.0"
       },
@@ -1765,9 +1765,9 @@
       }
     },
     "node_modules/@typescript-eslint/types": {
-      "version": "5.58.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.58.0.tgz",
-      "integrity": "sha512-JYV4eITHPzVQMnHZcYJXl2ZloC7thuUHrcUmxtzvItyKPvQ50kb9QXBkgNAt90OYMqwaodQh2kHutWZl1fc+1g==",
+      "version": "5.59.5",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.5.tgz",
+      "integrity": "sha512-xkfRPHbqSH4Ggx4eHRIO/eGL8XL4Ysb4woL8c87YuAo8Md7AUjyWKa9YMwTL519SyDPrfEgKdewjkxNCVeJW7w==",
       "dev": true,
       "engines": {
         "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
@@ -1778,13 +1778,13 @@
       }
     },
     "node_modules/@typescript-eslint/typescript-estree": {
-      "version": "5.58.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.58.0.tgz",
-      "integrity": "sha512-cRACvGTodA+UxnYM2uwA2KCwRL7VAzo45syNysqlMyNyjw0Z35Icc9ihPJZjIYuA5bXJYiJ2YGUB59BqlOZT1Q==",
+      "version": "5.59.5",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.5.tgz",
+      "integrity": "sha512-+XXdLN2CZLZcD/mO7mQtJMvCkzRfmODbeSKuMY/yXbGkzvA9rJyDY5qDYNoiz2kP/dmyAxXquL2BvLQLJFPQIg==",
       "dev": true,
       "dependencies": {
-        "@typescript-eslint/types": "5.58.0",
-        "@typescript-eslint/visitor-keys": "5.58.0",
+        "@typescript-eslint/types": "5.59.5",
+        "@typescript-eslint/visitor-keys": "5.59.5",
         "debug": "^4.3.4",
         "globby": "^11.1.0",
         "is-glob": "^4.0.3",
@@ -1805,17 +1805,17 @@
       }
     },
     "node_modules/@typescript-eslint/utils": {
-      "version": "5.58.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.58.0.tgz",
-      "integrity": "sha512-gAmLOTFXMXOC+zP1fsqm3VceKSBQJNzV385Ok3+yzlavNHZoedajjS4UyS21gabJYcobuigQPs/z71A9MdJFqQ==",
+      "version": "5.59.5",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.5.tgz",
+      "integrity": "sha512-sCEHOiw+RbyTii9c3/qN74hYDPNORb8yWCoPLmB7BIflhplJ65u2PBpdRla12e3SSTJ2erRkPjz7ngLHhUegxA==",
       "dev": true,
       "dependencies": {
         "@eslint-community/eslint-utils": "^4.2.0",
         "@types/json-schema": "^7.0.9",
         "@types/semver": "^7.3.12",
-        "@typescript-eslint/scope-manager": "5.58.0",
-        "@typescript-eslint/types": "5.58.0",
-        "@typescript-eslint/typescript-estree": "5.58.0",
+        "@typescript-eslint/scope-manager": "5.59.5",
+        "@typescript-eslint/types": "5.59.5",
+        "@typescript-eslint/typescript-estree": "5.59.5",
         "eslint-scope": "^5.1.1",
         "semver": "^7.3.7"
       },
@@ -1831,12 +1831,12 @@
       }
     },
     "node_modules/@typescript-eslint/visitor-keys": {
-      "version": "5.58.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.58.0.tgz",
-      "integrity": "sha512-/fBraTlPj0jwdyTwLyrRTxv/3lnU2H96pNTVM6z3esTWLtA5MZ9ghSMJ7Rb+TtUAdtEw9EyJzJ0EydIMKxQ9gA==",
+      "version": "5.59.5",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.5.tgz",
+      "integrity": "sha512-qL+Oz+dbeBRTeyJTIy0eniD3uvqU7x+y1QceBismZ41hd4aBSRh8UAw4pZP0+XzLuPZmx4raNMq/I+59W2lXKA==",
       "dev": true,
       "dependencies": {
-        "@typescript-eslint/types": "5.58.0",
+        "@typescript-eslint/types": "5.59.5",
         "eslint-visitor-keys": "^3.3.0"
       },
       "engines": {
@@ -2380,9 +2380,9 @@
       }
     },
     "node_modules/caniuse-lite": {
-      "version": "1.0.30001370",
-      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001370.tgz",
-      "integrity": "sha512-3PDmaP56wz/qz7G508xzjx8C+MC2qEm4SYhSEzC9IBROo+dGXFWRuaXkWti0A9tuI00g+toiriVqxtWMgl350g==",
+      "version": "1.0.30001489",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001489.tgz",
+      "integrity": "sha512-x1mgZEXK8jHIfAxm+xgdpHpk50IN3z3q3zP261/WS+uvePxW8izXuCu6AHz0lkuYTlATDehiZ/tNyYBdSQsOUQ==",
       "dev": true,
       "funding": [
         {
@@ -2392,6 +2392,10 @@
         {
           "type": "tidelift",
           "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
         }
       ]
     },
@@ -3612,15 +3616,15 @@
       }
     },
     "node_modules/eslint": {
-      "version": "8.38.0",
-      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.38.0.tgz",
-      "integrity": "sha512-pIdsD2jwlUGf/U38Jv97t8lq6HpaU/G9NKbYmpWpZGw3LdTNhZLbJePqxOXGB5+JEKfOPU/XLxYxFh03nr1KTg==",
+      "version": "8.40.0",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.40.0.tgz",
+      "integrity": "sha512-bvR+TsP9EHL3TqNtj9sCNJVAFK3fBN8Q7g5waghxyRsPLIMwL73XSKnZFK0hk/O2ANC+iAoq6PWMQ+IfBAJIiQ==",
       "dev": true,
       "dependencies": {
         "@eslint-community/eslint-utils": "^4.2.0",
         "@eslint-community/regexpp": "^4.4.0",
-        "@eslint/eslintrc": "^2.0.2",
-        "@eslint/js": "8.38.0",
+        "@eslint/eslintrc": "^2.0.3",
+        "@eslint/js": "8.40.0",
         "@humanwhocodes/config-array": "^0.11.8",
         "@humanwhocodes/module-importer": "^1.0.1",
         "@nodelib/fs.walk": "^1.2.8",
@@ -3630,9 +3634,9 @@
         "debug": "^4.3.2",
         "doctrine": "^3.0.0",
         "escape-string-regexp": "^4.0.0",
-        "eslint-scope": "^7.1.1",
-        "eslint-visitor-keys": "^3.4.0",
-        "espree": "^9.5.1",
+        "eslint-scope": "^7.2.0",
+        "eslint-visitor-keys": "^3.4.1",
+        "espree": "^9.5.2",
         "esquery": "^1.4.2",
         "esutils": "^2.0.2",
         "fast-deep-equal": "^3.1.3",
@@ -3694,9 +3698,9 @@
       }
     },
     "node_modules/eslint-visitor-keys": {
-      "version": "3.4.0",
-      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz",
-      "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==",
+      "version": "3.4.1",
+      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz",
+      "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==",
       "dev": true,
       "engines": {
         "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
@@ -3731,14 +3735,14 @@
       }
     },
     "node_modules/espree": {
-      "version": "9.5.1",
-      "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz",
-      "integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==",
+      "version": "9.5.2",
+      "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz",
+      "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==",
       "dev": true,
       "dependencies": {
         "acorn": "^8.8.0",
         "acorn-jsx": "^5.3.2",
-        "eslint-visitor-keys": "^3.4.0"
+        "eslint-visitor-keys": "^3.4.1"
       },
       "engines": {
         "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
@@ -5837,9 +5841,9 @@
       "dev": true
     },
     "node_modules/lint-staged": {
-      "version": "13.2.1",
-      "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.2.1.tgz",
-      "integrity": "sha512-8gfzinVXoPfga5Dz/ZOn8I2GOhf81Wvs+KwbEXQn/oWZAvCVS2PivrXfVbFJc93zD16uC0neS47RXHIjXKYZQw==",
+      "version": "13.2.2",
+      "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.2.2.tgz",
+      "integrity": "sha512-71gSwXKy649VrSU09s10uAT0rWCcY3aewhMaHyl2N84oBk4Xs9HgxvUp3AYu+bNsK4NrOYYxvSgg7FyGJ+jGcA==",
       "dev": true,
       "dependencies": {
         "chalk": "5.2.0",
@@ -5854,7 +5858,7 @@
         "object-inspect": "^1.12.3",
         "pidtree": "^0.6.0",
         "string-argv": "^0.3.1",
-        "yaml": "^2.2.1"
+        "yaml": "^2.2.2"
       },
       "bin": {
         "lint-staged": "bin/lint-staged.js"
@@ -7256,9 +7260,9 @@
       }
     },
     "node_modules/prettier": {
-      "version": "2.8.7",
-      "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz",
-      "integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==",
+      "version": "2.8.8",
+      "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz",
+      "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==",
       "dev": true,
       "bin": {
         "prettier": "bin-prettier.js"
@@ -7763,9 +7767,9 @@
       }
     },
     "node_modules/semver": {
-      "version": "7.3.8",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
-      "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
+      "version": "7.5.0",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz",
+      "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==",
       "dev": true,
       "dependencies": {
         "lru-cache": "^6.0.0"
@@ -8786,14 +8790,14 @@
       }
     },
     "node_modules/undici": {
-      "version": "5.21.2",
-      "resolved": "https://registry.npmjs.org/undici/-/undici-5.21.2.tgz",
-      "integrity": "sha512-f6pTQ9RF4DQtwoWSaC42P/NKlUjvezVvd9r155ohqkwFNRyBKM3f3pcty3ouusefNRyM25XhIQEbeQ46sZDJfQ==",
+      "version": "5.22.1",
+      "resolved": "https://registry.npmjs.org/undici/-/undici-5.22.1.tgz",
+      "integrity": "sha512-Ji2IJhFXZY0x/0tVBXeQwgPlLWw13GVzpsWPQ3rV50IFMMof2I55PZZxtm4P6iNq+L5znYN9nSTAq0ZyE6lSJw==",
       "dependencies": {
         "busboy": "^1.6.0"
       },
       "engines": {
-        "node": ">=12.18"
+        "node": ">=14.0"
       }
     },
     "node_modules/universalify": {
@@ -9120,18 +9124,18 @@
       "dev": true
     },
     "node_modules/yaml": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.1.tgz",
-      "integrity": "sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw==",
+      "version": "2.2.2",
+      "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.2.tgz",
+      "integrity": "sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==",
       "dev": true,
       "engines": {
         "node": ">= 14"
       }
     },
     "node_modules/yargs": {
-      "version": "17.7.1",
-      "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz",
-      "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==",
+      "version": "17.7.2",
+      "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
+      "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
       "dependencies": {
         "cliui": "^8.0.1",
         "escalade": "^3.1.1",
@@ -9671,13 +9675,13 @@
       "dev": true
     },
     "@commitlint/cli": {
-      "version": "17.6.1",
-      "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-17.6.1.tgz",
-      "integrity": "sha512-kCnDD9LE2ySiTnj/VPaxy4/oRayRcdv4aCuVxtoum8SxIU7OADHc0nJPQfheE8bHcs3zZdWzDMWltRosuT13bg==",
+      "version": "17.6.3",
+      "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-17.6.3.tgz",
+      "integrity": "sha512-ItSz2fd4F+CujgIbQOfNNerDF1eFlsBGEfp9QcCb1kxTYMuKTYZzA6Nu1YRRrIaaWwe2E7awUGpIMrPoZkOG3A==",
       "dev": true,
       "requires": {
         "@commitlint/format": "^17.4.4",
-        "@commitlint/lint": "^17.6.1",
+        "@commitlint/lint": "^17.6.3",
         "@commitlint/load": "^17.5.0",
         "@commitlint/read": "^17.5.1",
         "@commitlint/types": "^17.4.4",
@@ -9689,9 +9693,9 @@
       }
     },
     "@commitlint/config-conventional": {
-      "version": "17.6.1",
-      "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-17.6.1.tgz",
-      "integrity": "sha512-ng/ybaSLuTCH9F+7uavSOnEQ9EFMl7lHEjfAEgRh1hwmEe8SpLKpQeMo2aT1IWvHaGMuTb+gjfbzoRf2IR23NQ==",
+      "version": "17.6.3",
+      "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-17.6.3.tgz",
+      "integrity": "sha512-bLyHEjjRWqlLQWIgYFHmUPbEFMOOLXeF3QbUinDIJev/u9e769tkoTH9YPknEywiuIrAgZaVo+OfzAIsJP0fsw==",
       "dev": true,
       "requires": {
         "conventional-changelog-conventionalcommits": "^5.0.0"
@@ -9771,22 +9775,22 @@
       }
     },
     "@commitlint/is-ignored": {
-      "version": "17.4.4",
-      "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-17.4.4.tgz",
-      "integrity": "sha512-Y3eo1SFJ2JQDik4rWkBC4tlRIxlXEFrRWxcyrzb1PUT2k3kZ/XGNuCDfk/u0bU2/yS0tOA/mTjFsV+C4qyACHw==",
+      "version": "17.6.3",
+      "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-17.6.3.tgz",
+      "integrity": "sha512-LQbNdnPbxrpbcrVKR5yf51SvquqktpyZJwqXx3lUMF6+nT9PHB8xn3wLy8pi2EQv5Zwba484JnUwDE1ygVYNQA==",
       "dev": true,
       "requires": {
         "@commitlint/types": "^17.4.4",
-        "semver": "7.3.8"
+        "semver": "7.5.0"
       }
     },
     "@commitlint/lint": {
-      "version": "17.6.1",
-      "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-17.6.1.tgz",
-      "integrity": "sha512-VARJ9kxH64isgwVnC+ABPafCYzqxpsWJIpDaTuI0gh8aX4GQ0i7cn9tvxtFNfJj4ER2BAJeWJ0vURdNYjK2RQQ==",
+      "version": "17.6.3",
+      "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-17.6.3.tgz",
+      "integrity": "sha512-fBlXwt6SHJFgm3Tz+luuo3DkydAx9HNC5y4eBqcKuDuMVqHd2ugMNr+bQtx6riv9mXFiPoKp7nE4Xn/ls3iVDA==",
       "dev": true,
       "requires": {
-        "@commitlint/is-ignored": "^17.4.4",
+        "@commitlint/is-ignored": "^17.6.3",
         "@commitlint/parse": "^17.4.4",
         "@commitlint/rules": "^17.6.1",
         "@commitlint/types": "^17.4.4"
@@ -9920,14 +9924,14 @@
       "dev": true
     },
     "@eslint/eslintrc": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz",
-      "integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==",
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz",
+      "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==",
       "dev": true,
       "requires": {
         "ajv": "^6.12.4",
         "debug": "^4.3.2",
-        "espree": "^9.5.1",
+        "espree": "^9.5.2",
         "globals": "^13.19.0",
         "ignore": "^5.2.0",
         "import-fresh": "^3.2.1",
@@ -9937,9 +9941,9 @@
       }
     },
     "@eslint/js": {
-      "version": "8.38.0",
-      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.38.0.tgz",
-      "integrity": "sha512-IoD2MfUnOV58ghIHCiil01PcohxjbYR/qCxsoC+xNgUwh1EY8jOOrYmu3d3a71+tJJ23uscEV4X2HJWMsPJu4g==",
+      "version": "8.40.0",
+      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.40.0.tgz",
+      "integrity": "sha512-ElyB54bJIhXQYVKjDSvCkPO1iU1tSAeVQJbllWJq1XQSmmA4dgFk8CbiBGpiOPxleE48vDogxCtmMYku4HSVLA==",
       "dev": true
     },
     "@humanwhocodes/config-array": {
@@ -10470,9 +10474,9 @@
       }
     },
     "@types/node": {
-      "version": "18.15.11",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.11.tgz",
-      "integrity": "sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==",
+      "version": "18.16.9",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.9.tgz",
+      "integrity": "sha512-IeB32oIV4oGArLrd7znD2rkHQ6EDCM+2Sr76dJnrHwv9OHBTTM6nuDLK9bmikXzPa0ZlWMWtRGo/Uw4mrzQedA==",
       "dev": true
     },
     "@types/normalize-package-data": {
@@ -10488,9 +10492,9 @@
       "dev": true
     },
     "@types/semver": {
-      "version": "7.3.13",
-      "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz",
-      "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==",
+      "version": "7.5.0",
+      "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz",
+      "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==",
       "dev": true
     },
     "@types/stack-utils": {
@@ -10500,9 +10504,9 @@
       "dev": true
     },
     "@types/validator": {
-      "version": "13.7.15",
-      "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.7.15.tgz",
-      "integrity": "sha512-yeinDVQunb03AEP8luErFcyf/7Lf7AzKCD0NXfgVoGCCQDNpZET8Jgq74oBgqKld3hafLbfzt/3inUdQvaFeXQ==",
+      "version": "13.7.16",
+      "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.7.16.tgz",
+      "integrity": "sha512-VyKmLktUHYLbrSbsRi241MSUlGYomQgK/tfCNpej3Gt5qDOM10AZ3nU2aR2s5JritClXuOBu4K7MkywVW/Y6Ow==",
       "dev": true
     },
     "@types/yargs": {
@@ -10521,15 +10525,15 @@
       "dev": true
     },
     "@typescript-eslint/eslint-plugin": {
-      "version": "5.58.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.58.0.tgz",
-      "integrity": "sha512-vxHvLhH0qgBd3/tW6/VccptSfc8FxPQIkmNTVLWcCOVqSBvqpnKkBTYrhcGlXfSnd78azwe+PsjYFj0X34/njA==",
+      "version": "5.59.5",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.5.tgz",
+      "integrity": "sha512-feA9xbVRWJZor+AnLNAr7A8JRWeZqHUf4T9tlP+TN04b05pFVhO5eN7/O93Y/1OUlLMHKbnJisgDURs/qvtqdg==",
       "dev": true,
       "requires": {
         "@eslint-community/regexpp": "^4.4.0",
-        "@typescript-eslint/scope-manager": "5.58.0",
-        "@typescript-eslint/type-utils": "5.58.0",
-        "@typescript-eslint/utils": "5.58.0",
+        "@typescript-eslint/scope-manager": "5.59.5",
+        "@typescript-eslint/type-utils": "5.59.5",
+        "@typescript-eslint/utils": "5.59.5",
         "debug": "^4.3.4",
         "grapheme-splitter": "^1.0.4",
         "ignore": "^5.2.0",
@@ -10539,53 +10543,53 @@
       }
     },
     "@typescript-eslint/parser": {
-      "version": "5.58.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.58.0.tgz",
-      "integrity": "sha512-ixaM3gRtlfrKzP8N6lRhBbjTow1t6ztfBvQNGuRM8qH1bjFFXIJ35XY+FC0RRBKn3C6cT+7VW1y8tNm7DwPHDQ==",
+      "version": "5.59.5",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.5.tgz",
+      "integrity": "sha512-NJXQC4MRnF9N9yWqQE2/KLRSOLvrrlZb48NGVfBa+RuPMN6B7ZcK5jZOvhuygv4D64fRKnZI4L4p8+M+rfeQuw==",
       "dev": true,
       "requires": {
-        "@typescript-eslint/scope-manager": "5.58.0",
-        "@typescript-eslint/types": "5.58.0",
-        "@typescript-eslint/typescript-estree": "5.58.0",
+        "@typescript-eslint/scope-manager": "5.59.5",
+        "@typescript-eslint/types": "5.59.5",
+        "@typescript-eslint/typescript-estree": "5.59.5",
         "debug": "^4.3.4"
       }
     },
     "@typescript-eslint/scope-manager": {
-      "version": "5.58.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.58.0.tgz",
-      "integrity": "sha512-b+w8ypN5CFvrXWQb9Ow9T4/6LC2MikNf1viLkYTiTbkQl46CnR69w7lajz1icW0TBsYmlpg+mRzFJ4LEJ8X9NA==",
+      "version": "5.59.5",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.5.tgz",
+      "integrity": "sha512-jVecWwnkX6ZgutF+DovbBJirZcAxgxC0EOHYt/niMROf8p4PwxxG32Qdhj/iIQQIuOflLjNkxoXyArkcIP7C3A==",
       "dev": true,
       "requires": {
-        "@typescript-eslint/types": "5.58.0",
-        "@typescript-eslint/visitor-keys": "5.58.0"
+        "@typescript-eslint/types": "5.59.5",
+        "@typescript-eslint/visitor-keys": "5.59.5"
       }
     },
     "@typescript-eslint/type-utils": {
-      "version": "5.58.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.58.0.tgz",
-      "integrity": "sha512-FF5vP/SKAFJ+LmR9PENql7fQVVgGDOS+dq3j+cKl9iW/9VuZC/8CFmzIP0DLKXfWKpRHawJiG70rVH+xZZbp8w==",
+      "version": "5.59.5",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.5.tgz",
+      "integrity": "sha512-4eyhS7oGym67/pSxA2mmNq7X164oqDYNnZCUayBwJZIRVvKpBCMBzFnFxjeoDeShjtO6RQBHBuwybuX3POnDqg==",
       "dev": true,
       "requires": {
-        "@typescript-eslint/typescript-estree": "5.58.0",
-        "@typescript-eslint/utils": "5.58.0",
+        "@typescript-eslint/typescript-estree": "5.59.5",
+        "@typescript-eslint/utils": "5.59.5",
         "debug": "^4.3.4",
         "tsutils": "^3.21.0"
       }
     },
     "@typescript-eslint/types": {
-      "version": "5.58.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.58.0.tgz",
-      "integrity": "sha512-JYV4eITHPzVQMnHZcYJXl2ZloC7thuUHrcUmxtzvItyKPvQ50kb9QXBkgNAt90OYMqwaodQh2kHutWZl1fc+1g==",
+      "version": "5.59.5",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.5.tgz",
+      "integrity": "sha512-xkfRPHbqSH4Ggx4eHRIO/eGL8XL4Ysb4woL8c87YuAo8Md7AUjyWKa9YMwTL519SyDPrfEgKdewjkxNCVeJW7w==",
       "dev": true
     },
     "@typescript-eslint/typescript-estree": {
-      "version": "5.58.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.58.0.tgz",
-      "integrity": "sha512-cRACvGTodA+UxnYM2uwA2KCwRL7VAzo45syNysqlMyNyjw0Z35Icc9ihPJZjIYuA5bXJYiJ2YGUB59BqlOZT1Q==",
+      "version": "5.59.5",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.5.tgz",
+      "integrity": "sha512-+XXdLN2CZLZcD/mO7mQtJMvCkzRfmODbeSKuMY/yXbGkzvA9rJyDY5qDYNoiz2kP/dmyAxXquL2BvLQLJFPQIg==",
       "dev": true,
       "requires": {
-        "@typescript-eslint/types": "5.58.0",
-        "@typescript-eslint/visitor-keys": "5.58.0",
+        "@typescript-eslint/types": "5.59.5",
+        "@typescript-eslint/visitor-keys": "5.59.5",
         "debug": "^4.3.4",
         "globby": "^11.1.0",
         "is-glob": "^4.0.3",
@@ -10594,28 +10598,28 @@
       }
     },
     "@typescript-eslint/utils": {
-      "version": "5.58.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.58.0.tgz",
-      "integrity": "sha512-gAmLOTFXMXOC+zP1fsqm3VceKSBQJNzV385Ok3+yzlavNHZoedajjS4UyS21gabJYcobuigQPs/z71A9MdJFqQ==",
+      "version": "5.59.5",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.5.tgz",
+      "integrity": "sha512-sCEHOiw+RbyTii9c3/qN74hYDPNORb8yWCoPLmB7BIflhplJ65u2PBpdRla12e3SSTJ2erRkPjz7ngLHhUegxA==",
       "dev": true,
       "requires": {
         "@eslint-community/eslint-utils": "^4.2.0",
         "@types/json-schema": "^7.0.9",
         "@types/semver": "^7.3.12",
-        "@typescript-eslint/scope-manager": "5.58.0",
-        "@typescript-eslint/types": "5.58.0",
-        "@typescript-eslint/typescript-estree": "5.58.0",
+        "@typescript-eslint/scope-manager": "5.59.5",
+        "@typescript-eslint/types": "5.59.5",
+        "@typescript-eslint/typescript-estree": "5.59.5",
         "eslint-scope": "^5.1.1",
         "semver": "^7.3.7"
       }
     },
     "@typescript-eslint/visitor-keys": {
-      "version": "5.58.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.58.0.tgz",
-      "integrity": "sha512-/fBraTlPj0jwdyTwLyrRTxv/3lnU2H96pNTVM6z3esTWLtA5MZ9ghSMJ7Rb+TtUAdtEw9EyJzJ0EydIMKxQ9gA==",
+      "version": "5.59.5",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.5.tgz",
+      "integrity": "sha512-qL+Oz+dbeBRTeyJTIy0eniD3uvqU7x+y1QceBismZ41hd4aBSRh8UAw4pZP0+XzLuPZmx4raNMq/I+59W2lXKA==",
       "dev": true,
       "requires": {
-        "@typescript-eslint/types": "5.58.0",
+        "@typescript-eslint/types": "5.59.5",
         "eslint-visitor-keys": "^3.3.0"
       }
     },
@@ -11012,9 +11016,9 @@
       }
     },
     "caniuse-lite": {
-      "version": "1.0.30001370",
-      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001370.tgz",
-      "integrity": "sha512-3PDmaP56wz/qz7G508xzjx8C+MC2qEm4SYhSEzC9IBROo+dGXFWRuaXkWti0A9tuI00g+toiriVqxtWMgl350g==",
+      "version": "1.0.30001489",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001489.tgz",
+      "integrity": "sha512-x1mgZEXK8jHIfAxm+xgdpHpk50IN3z3q3zP261/WS+uvePxW8izXuCu6AHz0lkuYTlATDehiZ/tNyYBdSQsOUQ==",
       "dev": true
     },
     "chalk": {
@@ -11960,15 +11964,15 @@
       }
     },
     "eslint": {
-      "version": "8.38.0",
-      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.38.0.tgz",
-      "integrity": "sha512-pIdsD2jwlUGf/U38Jv97t8lq6HpaU/G9NKbYmpWpZGw3LdTNhZLbJePqxOXGB5+JEKfOPU/XLxYxFh03nr1KTg==",
+      "version": "8.40.0",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.40.0.tgz",
+      "integrity": "sha512-bvR+TsP9EHL3TqNtj9sCNJVAFK3fBN8Q7g5waghxyRsPLIMwL73XSKnZFK0hk/O2ANC+iAoq6PWMQ+IfBAJIiQ==",
       "dev": true,
       "requires": {
         "@eslint-community/eslint-utils": "^4.2.0",
         "@eslint-community/regexpp": "^4.4.0",
-        "@eslint/eslintrc": "^2.0.2",
-        "@eslint/js": "8.38.0",
+        "@eslint/eslintrc": "^2.0.3",
+        "@eslint/js": "8.40.0",
         "@humanwhocodes/config-array": "^0.11.8",
         "@humanwhocodes/module-importer": "^1.0.1",
         "@nodelib/fs.walk": "^1.2.8",
@@ -11978,9 +11982,9 @@
         "debug": "^4.3.2",
         "doctrine": "^3.0.0",
         "escape-string-regexp": "^4.0.0",
-        "eslint-scope": "^7.1.1",
-        "eslint-visitor-keys": "^3.4.0",
-        "espree": "^9.5.1",
+        "eslint-scope": "^7.2.0",
+        "eslint-visitor-keys": "^3.4.1",
+        "espree": "^9.5.2",
         "esquery": "^1.4.2",
         "esutils": "^2.0.2",
         "fast-deep-equal": "^3.1.3",
@@ -12043,20 +12047,20 @@
       }
     },
     "eslint-visitor-keys": {
-      "version": "3.4.0",
-      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz",
-      "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==",
+      "version": "3.4.1",
+      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz",
+      "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==",
       "dev": true
     },
     "espree": {
-      "version": "9.5.1",
-      "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz",
-      "integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==",
+      "version": "9.5.2",
+      "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz",
+      "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==",
       "dev": true,
       "requires": {
         "acorn": "^8.8.0",
         "acorn-jsx": "^5.3.2",
-        "eslint-visitor-keys": "^3.4.0"
+        "eslint-visitor-keys": "^3.4.1"
       }
     },
     "esprima": {
@@ -13652,9 +13656,9 @@
       "dev": true
     },
     "lint-staged": {
-      "version": "13.2.1",
-      "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.2.1.tgz",
-      "integrity": "sha512-8gfzinVXoPfga5Dz/ZOn8I2GOhf81Wvs+KwbEXQn/oWZAvCVS2PivrXfVbFJc93zD16uC0neS47RXHIjXKYZQw==",
+      "version": "13.2.2",
+      "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.2.2.tgz",
+      "integrity": "sha512-71gSwXKy649VrSU09s10uAT0rWCcY3aewhMaHyl2N84oBk4Xs9HgxvUp3AYu+bNsK4NrOYYxvSgg7FyGJ+jGcA==",
       "dev": true,
       "requires": {
         "chalk": "5.2.0",
@@ -13669,7 +13673,7 @@
         "object-inspect": "^1.12.3",
         "pidtree": "^0.6.0",
         "string-argv": "^0.3.1",
-        "yaml": "^2.2.1"
+        "yaml": "^2.2.2"
       },
       "dependencies": {
         "chalk": {
@@ -14715,9 +14719,9 @@
       "dev": true
     },
     "prettier": {
-      "version": "2.8.7",
-      "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz",
-      "integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==",
+      "version": "2.8.8",
+      "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz",
+      "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==",
       "dev": true
     },
     "pretty-format": {
@@ -15082,9 +15086,9 @@
       }
     },
     "semver": {
-      "version": "7.3.8",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
-      "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
+      "version": "7.5.0",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz",
+      "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==",
       "dev": true,
       "requires": {
         "lru-cache": "^6.0.0"
@@ -15851,9 +15855,9 @@
       "optional": true
     },
     "undici": {
-      "version": "5.21.2",
-      "resolved": "https://registry.npmjs.org/undici/-/undici-5.21.2.tgz",
-      "integrity": "sha512-f6pTQ9RF4DQtwoWSaC42P/NKlUjvezVvd9r155ohqkwFNRyBKM3f3pcty3ouusefNRyM25XhIQEbeQ46sZDJfQ==",
+      "version": "5.22.1",
+      "resolved": "https://registry.npmjs.org/undici/-/undici-5.22.1.tgz",
+      "integrity": "sha512-Ji2IJhFXZY0x/0tVBXeQwgPlLWw13GVzpsWPQ3rV50IFMMof2I55PZZxtm4P6iNq+L5znYN9nSTAq0ZyE6lSJw==",
       "requires": {
         "busboy": "^1.6.0"
       }
@@ -16120,15 +16124,15 @@
       "dev": true
     },
     "yaml": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.1.tgz",
-      "integrity": "sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw==",
+      "version": "2.2.2",
+      "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.2.tgz",
+      "integrity": "sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==",
       "dev": true
     },
     "yargs": {
-      "version": "17.7.1",
-      "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz",
-      "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==",
+      "version": "17.7.2",
+      "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
+      "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
       "requires": {
         "cliui": "^8.0.1",
         "escalade": "^3.1.1",
diff --git a/package.json b/package.json
index 92a2eb6..5b98db8 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@codecov/uploader",
-  "version": "0.5.0",
+  "version": "0.5.1",
   "description": "Codecov Report Uploader",
   "private": true,
   "bin": {
@@ -8,7 +8,7 @@
   },
   "scripts": {
     "lint": "eslint \"src/**/*.ts\"",
-    "test": "npm run lint && npm run build && jest --runInBand",
+    "test": "npm run lint && npm run build && npx browserslist@latest --update-db && jest --runInBand",
     "test:e2e": "jest test/e2e/output.test.ts",
     "build:clean": "rm -rf dist",
     "build": "tsc  --build",
@@ -37,31 +37,31 @@
     "fast-glob": "3.2.12",
     "js-yaml": "4.1.0",
     "snake-case": "3.0.4",
-    "undici": "5.21.2",
+    "undici": "5.22.1",
     "validator": "13.9.0",
-    "yargs": "17.7.1"
+    "yargs": "17.7.2"
   },
   "devDependencies": {
-    "@commitlint/cli": "17.6.1",
-    "@commitlint/config-conventional": "17.6.1",
+    "@commitlint/cli": "17.6.3",
+    "@commitlint/config-conventional": "17.6.3",
     "@types/jest": "27.5.2",
     "@types/js-yaml": "4.0.5",
     "@types/micromatch": "4.0.2",
     "@types/mock-fs": "4.13.1",
-    "@types/node": "18.15.11",
-    "@types/validator": "13.7.15",
+    "@types/node": "18.16.9",
+    "@types/validator": "13.7.16",
     "@types/yargs": "17.0.24",
-    "@typescript-eslint/eslint-plugin": "5.58.0",
-    "@typescript-eslint/parser": "5.58.0",
-    "eslint": "8.38.0",
+    "@typescript-eslint/eslint-plugin": "5.59.5",
+    "@typescript-eslint/parser": "5.59.5",
+    "eslint": "8.40.0",
     "eslint-config-prettier": "8.8.0",
     "husky": "8.0.1",
     "jest": "27.5.1",
     "jest-spec-reporter": "1.0.19",
-    "lint-staged": "13.2.1",
+    "lint-staged": "13.2.2",
     "mock-fs": "5.2.0",
     "pkg": "5.6.0",
-    "prettier": "2.8.7",
+    "prettier": "2.8.8",
     "standard-version": "9.5.0",
     "testdouble": "3.16.6",
     "testdouble-jest": "2.0.0",
diff --git a/src/ci_providers/provider_appveyorci.ts b/src/ci_providers/provider_appveyorci.ts
index 3654484..3d70d48 100644
--- a/src/ci_providers/provider_appveyorci.ts
+++ b/src/ci_providers/provider_appveyorci.ts
@@ -8,12 +8,12 @@ export function detect(envs: UploaderEnvs): boolean {
 }
 
 function _getBuild(inputs: UploaderInputs) {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   return args.build || envs.APPVEYOR_JOB_ID || ''
 }
 
 function _getBuildURL(inputs: UploaderInputs) {
-  const { environment: envs } = inputs
+  const { envs } = inputs
   if (
     envs.APPVEYOR_URL &&
     envs.APPVEYOR_REPO_NAME &&
@@ -28,7 +28,7 @@ function _getBuildURL(inputs: UploaderInputs) {
 }
 
 function _getBranch(inputs: UploaderInputs) {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   return args.branch || envs.APPVEYOR_REPO_BRANCH || ''
 }
 
@@ -44,7 +44,7 @@ function _getJob(envs: UploaderEnvs) {
 }
 
 function _getPR(inputs: UploaderInputs): string {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   return args.pr || envs.APPVEYOR_PULL_REQUEST_NUMBER || ''
 }
 
@@ -57,12 +57,12 @@ export function getServiceName(): string {
 }
 
 function _getSHA(inputs: UploaderInputs) {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   return args.sha || envs.APPVEYOR_PULL_REQUEST_HEAD_COMMIT || envs.APPVEYOR_REPO_COMMIT || ''
 }
 
 function _getSlug(inputs: UploaderInputs) {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   if (args.slug !== '') return args.slug
   return envs.APPVEYOR_REPO_NAME || ''
 }
@@ -73,7 +73,7 @@ export async function getServiceParams(inputs: UploaderInputs): Promise<IService
     build: _getBuild(inputs),
     buildURL: _getBuildURL(inputs),
     commit: _getSHA(inputs),
-    job: _getJob(inputs.environment),
+    job: _getJob(inputs.envs),
     pr: _getPR(inputs),
     service: _getService(),
     slug: _getSlug(inputs),
diff --git a/src/ci_providers/provider_azurepipelines.ts b/src/ci_providers/provider_azurepipelines.ts
index bb32c31..2bd6dce 100644
--- a/src/ci_providers/provider_azurepipelines.ts
+++ b/src/ci_providers/provider_azurepipelines.ts
@@ -8,12 +8,12 @@ export function detect(envs: UploaderEnvs): boolean {
 }
 
 function _getBuild(inputs: UploaderInputs): string {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   return args.build || envs.BUILD_BUILDNUMBER || ''
 }
 
 function _getBuildURL(inputs: UploaderInputs): string {
-  const { environment: envs } = inputs
+  const { envs } = inputs
   if (envs.SYSTEM_TEAMPROJECT && envs.BUILD_BUILDID) {
     return (
       `${envs.SYSTEM_TEAMFOUNDATIONSERVERURI}${envs.SYSTEM_TEAMPROJECT}/_build/results?buildId=${envs.BUILD_BUILDID}`
@@ -23,7 +23,7 @@ function _getBuildURL(inputs: UploaderInputs): string {
 }
 
 function _getBranch(inputs: UploaderInputs): string {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   let branch = ''
   if (envs.BUILD_SOURCEBRANCH) {
     branch = envs.BUILD_SOURCEBRANCH.toString().replace('refs/heads/', '')
@@ -36,7 +36,7 @@ function _getJob(envs: UploaderEnvs): string {
 }
 
 function _getPR(inputs: UploaderInputs): string {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   return (
     args.pr ||
     envs.SYSTEM_PULLREQUEST_PULLREQUESTNUMBER ||
@@ -54,7 +54,7 @@ export function getServiceName(): string {
 }
 
 function _getSHA(inputs: UploaderInputs): string {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   let commit = envs.BUILD_SOURCEVERSION || ''
 
   if (_getPR(inputs)) {
@@ -74,17 +74,17 @@ function _getSHA(inputs: UploaderInputs): string {
 }
 
 function _getProject(inputs: UploaderInputs): string {
-  const { environment: envs } = inputs
+  const { envs } = inputs
   return envs.SYSTEM_TEAMPROJECT || ''
 }
 
 function _getServerURI(inputs: UploaderInputs): string {
-  const { environment: envs } = inputs
+  const { envs } = inputs
   return envs.SYSTEM_TEAMFOUNDATIONSERVERURI || ''
 }
 
 function _getSlug(inputs: UploaderInputs): string {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   if (args.slug !== '') return args.slug
   return envs.BUILD_REPOSITORY_NAME || parseSlugFromRemoteAddr('') || ''
 }
@@ -100,7 +100,7 @@ export async function getServiceParams(inputs: UploaderInputs): Promise<IService
     build: _getBuild(inputs),
     buildURL: _getBuildURL(inputs),
     commit: _getSHA(inputs),
-    job: _getJob(inputs.environment),
+    job: _getJob(inputs.envs),
     pr: _getPR(inputs),
     project: _getProject(inputs),
     server_uri: _getServerURI(inputs),
diff --git a/src/ci_providers/provider_bitbucket.ts b/src/ci_providers/provider_bitbucket.ts
index 3944f92..bd2a43f 100644
--- a/src/ci_providers/provider_bitbucket.ts
+++ b/src/ci_providers/provider_bitbucket.ts
@@ -7,7 +7,7 @@ export function detect(envs: UploaderEnvs): boolean {
 }
 
 function _getBuild(inputs: UploaderInputs): string {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   return args.build || envs.BITBUCKET_BUILD_NUMBER || ''
 }
 
@@ -17,7 +17,7 @@ function _getBuildURL(): string {
 }
 
 function _getBranch(inputs: UploaderInputs): string {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   return args.branch || envs.BITBUCKET_BRANCH || ''
 }
 
@@ -26,7 +26,7 @@ function _getJob(envs: UploaderEnvs): string {
 }
 
 function _getPR(inputs: UploaderInputs): string {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   return args.pr || envs.BITBUCKET_PR_ID || ''
 }
 
@@ -39,7 +39,7 @@ export function getServiceName(): string {
 }
 
 function _getSHA(inputs: UploaderInputs): string {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   let commit = envs.BITBUCKET_COMMIT || ''
 
   if (commit && validateSHA(commit, 12)) {
@@ -50,7 +50,7 @@ function _getSHA(inputs: UploaderInputs): string {
 }
 
 function _getSlug(inputs: UploaderInputs): string {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   if (args.slug !== '') return args.slug
   return envs.BITBUCKET_REPO_FULL_NAME || ''
 }
@@ -61,7 +61,7 @@ export async function getServiceParams(inputs: UploaderInputs): Promise<IService
     build: _getBuild(inputs),
     buildURL: _getBuildURL(),
     commit: _getSHA(inputs),
-    job: _getJob(inputs.environment),
+    job: _getJob(inputs.envs),
     pr: _getPR(inputs),
     service: _getService(),
     slug: _getSlug(inputs),
diff --git a/src/ci_providers/provider_bitrise.ts b/src/ci_providers/provider_bitrise.ts
index e9b4764..9c3ff5b 100644
--- a/src/ci_providers/provider_bitrise.ts
+++ b/src/ci_providers/provider_bitrise.ts
@@ -7,17 +7,17 @@ export function detect(envs: UploaderEnvs): boolean {
 }
 
 function _getBuild(inputs: UploaderInputs): string {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   return args.build || envs.BITRISE_BUILD_NUMBER || ''
 }
 
 function _getBuildURL(inputs: UploaderInputs): string {
-  const { environment: envs } = inputs
+  const { envs } = inputs
   return envs.BITRISE_BUILD_URL || ''
 }
 
 function _getBranch(inputs: UploaderInputs): string {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   return args.branch || envs.BITRISE_GIT_BRANCH || ''
 }
 
@@ -26,7 +26,7 @@ function _getJob() {
 }
 
 function _getPR(inputs: UploaderInputs): string {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   return args.pr || envs.BITRISE_PULL_REQUEST || ''
 }
 
@@ -39,7 +39,7 @@ export function getServiceName(): string {
 }
 
 function _getSHA(inputs: UploaderInputs): string {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   return args.sha || envs.GIT_CLONE_COMMIT_HASH || ''
 }
 
diff --git a/src/ci_providers/provider_buildkite.ts b/src/ci_providers/provider_buildkite.ts
index 97999e0..d74016d 100644
--- a/src/ci_providers/provider_buildkite.ts
+++ b/src/ci_providers/provider_buildkite.ts
@@ -18,7 +18,7 @@ export function detect(envs: UploaderEnvs): boolean {
  * @returns {string}
  */
 function _getBuild(inputs: UploaderInputs): string {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   return args.build || envs.BUILDKITE_BUILD_NUMBER || ''
 }
 
@@ -29,7 +29,7 @@ function _getBuild(inputs: UploaderInputs): string {
  * @returns {string}
  */
 function _getBuildURL(inputs: UploaderInputs): string {
-  return inputs.environment.BUILDKITE_BUILD_URL || ''
+  return inputs.envs.BUILDKITE_BUILD_URL || ''
 }
 
 /**
@@ -39,7 +39,7 @@ function _getBuildURL(inputs: UploaderInputs): string {
  * @returns {string}
  */
 function _getBranch(inputs: UploaderInputs): string {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   return args.branch || envs.BUILDKITE_BRANCH || ''
 }
 
@@ -88,7 +88,7 @@ export function getServiceName(): string {
  * @returns {string}
  */
 function _getSHA(inputs: UploaderInputs): string {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   if (Boolean(args.sha) || Boolean(envs.BUILDKITE_COMMIT)) {
     return args.sha || envs.BUILDKITE_COMMIT || ''
   }
@@ -101,7 +101,7 @@ function _getSHA(inputs: UploaderInputs): string {
  * @returns {string}
  */
 function _getSlug(inputs: UploaderInputs): string {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   return setSlug(args.slug, envs.BUILDKITE_ORGANIZATION_SLUG, envs.BUILDKITE_PIPELINE_SLUG)
 }
 /**
@@ -116,7 +116,7 @@ export async function getServiceParams(inputs: UploaderInputs): Promise<IService
     build: _getBuild(inputs),
     buildURL: _getBuildURL(inputs),
     commit: _getSHA(inputs),
-    job: _getJob(inputs.environment),
+    job: _getJob(inputs.envs),
     pr: _getPR(inputs),
     service: _getService(),
     slug: _getSlug(inputs),
diff --git a/src/ci_providers/provider_circleci.ts b/src/ci_providers/provider_circleci.ts
index 07f8037..a6738cf 100644
--- a/src/ci_providers/provider_circleci.ts
+++ b/src/ci_providers/provider_circleci.ts
@@ -7,7 +7,7 @@ export function detect(envs: UploaderEnvs): boolean {
 }
 
 function _getBuildURL(inputs: UploaderInputs): string {
-  return inputs.environment['CIRCLE_BUILD_URL'] ?? ''
+  return inputs.envs['CIRCLE_BUILD_URL'] ?? ''
 }
 
 // This is the value that gets passed to the Codecov uploader
@@ -21,17 +21,17 @@ export function getServiceName(): string {
 }
 
 function _getBranch(inputs: UploaderInputs): string {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   return args.branch || envs.CIRCLE_BRANCH || ''
 }
 
 function _getSHA(inputs: UploaderInputs): string {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   return args.sha || envs.CIRCLE_SHA1 || ''
 }
 
 function _getSlug(inputs: UploaderInputs): string {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
 
   const slug = setSlug(
     args.slug,
@@ -49,12 +49,12 @@ function _getSlug(inputs: UploaderInputs): string {
 }
 
 function _getBuild(inputs: UploaderInputs): string {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   return args.build || envs.CIRCLE_BUILD_NUM || ''
 }
 
 function _getPR(inputs: UploaderInputs): string {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   return args.pr || envs.CIRCLE_PR_NUMBER || ''
 }
 
@@ -68,7 +68,7 @@ export async function getServiceParams(inputs: UploaderInputs): Promise<IService
     build: _getBuild(inputs),
     buildURL: _getBuildURL(inputs),
     commit: _getSHA(inputs),
-    job: _getJob(inputs.environment),
+    job: _getJob(inputs.envs),
     pr: _getPR(inputs),
     service: _getService(),
     slug: _getSlug(inputs),
diff --git a/src/ci_providers/provider_cirrus.ts b/src/ci_providers/provider_cirrus.ts
index 3c87db8..e90e469 100644
--- a/src/ci_providers/provider_cirrus.ts
+++ b/src/ci_providers/provider_cirrus.ts
@@ -9,7 +9,7 @@ export function detect(envs: UploaderEnvs): boolean {
 }
 
 function _getBuild(inputs: UploaderInputs): string {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   return args.build || envs.CIRRUS_BUILD_ID || ''
 }
 
@@ -18,7 +18,7 @@ function _getBuildURL(): string {
 }
 
 function _getBranch(inputs: UploaderInputs): string {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   return args.branch || envs.CIRRUS_BRANCH || ''
 }
 
@@ -27,7 +27,7 @@ function _getJob(envs: UploaderEnvs): string {
 }
 
 function _getPR(inputs: UploaderInputs): string {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   return args.pr || envs.CIRRUS_PR || ''
 }
 
@@ -40,12 +40,12 @@ export function getServiceName(): string {
 }
 
 function _getSHA(inputs: UploaderInputs): string {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   return args.sha || envs.CIRRUS_CHANGE_IN_REPO || ''
 }
 
 function _getSlug(inputs: UploaderInputs): string {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   return setSlug(args.slug, envs.CIRRUS_REPO_OWNER, envs.CIRRUS_REPO_NAME)
 }
 
@@ -55,7 +55,7 @@ export async function getServiceParams(inputs: UploaderInputs): Promise<IService
     build: _getBuild(inputs),
     buildURL: _getBuildURL(),
     commit: _getSHA(inputs),
-    job: _getJob(inputs.environment),
+    job: _getJob(inputs.envs),
     pr: _getPR(inputs),
     service: _getService(),
     slug: _getSlug(inputs),
diff --git a/src/ci_providers/provider_codebuild.ts b/src/ci_providers/provider_codebuild.ts
index f12cd6c..424e612 100644
--- a/src/ci_providers/provider_codebuild.ts
+++ b/src/ci_providers/provider_codebuild.ts
@@ -5,7 +5,7 @@ export function detect(envs: UploaderEnvs): boolean {
 }
 
 function _getBuild(inputs: UploaderInputs): string {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   return args.build || envs.CODEBUILD_BUILD_ID || ''
 }
 
@@ -14,7 +14,7 @@ function _getBuildURL(): string {
 }
 
 function _getBranch(inputs: UploaderInputs): string {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   return (
     args.branch ||
     (envs.CODEBUILD_WEBHOOK_HEAD_REF
@@ -28,7 +28,7 @@ function _getJob(envs: UploaderEnvs): string {
 }
 
 function _getPR(inputs: UploaderInputs): string {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   return (
     args.pr ||
     (envs.CODEBUILD_SOURCE_VERSION &&
@@ -47,12 +47,12 @@ export function getServiceName(): string {
 }
 
 function _getSHA(inputs: UploaderInputs): string {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   return args.sha || envs.CODEBUILD_RESOLVED_SOURCE_VERSION || ''
 }
 
 function _getSlug(inputs: UploaderInputs): string {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   if (args.slug !== '') return args.slug
   return (
     (envs.CODEBUILD_SOURCE_REPO_URL
@@ -69,7 +69,7 @@ export async function getServiceParams(inputs: UploaderInputs): Promise<IService
     build: _getBuild(inputs),
     buildURL: _getBuildURL(),
     commit: _getSHA(inputs),
-    job: _getJob(inputs.environment),
+    job: _getJob(inputs.envs),
     pr: _getPR(inputs),
     service: _getService(),
     slug: _getSlug(inputs),
diff --git a/src/ci_providers/provider_drone.ts b/src/ci_providers/provider_drone.ts
index 945cd8d..d936482 100644
--- a/src/ci_providers/provider_drone.ts
+++ b/src/ci_providers/provider_drone.ts
@@ -8,17 +8,17 @@ export function detect(envs: UploaderEnvs): boolean {
 }
 
 function _getBuild(inputs: UploaderInputs): string {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   return args.build || envs.DRONE_BUILD_NUMBER || ''
 }
 
 function _getBuildURL(inputs: UploaderInputs): string {
-  const { environment: envs } = inputs
+  const { envs } = inputs
   return envs.DRONE_BUILD_LINK || envs.DRONE_BUILD_URL || envs.CI_BUILD_URL || ''
 }
 
 function _getBranch(inputs: UploaderInputs): string {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   return args.branch || envs.DRONE_BRANCH || ''
 }
 
@@ -27,7 +27,7 @@ function _getJob(): string {
 }
 
 function _getPR(inputs: UploaderInputs): string {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   return args.pr || envs.DRONE_PULL_REQUEST || ''
 }
 
@@ -40,12 +40,12 @@ export function getServiceName(): string {
 }
 
 function _getSHA(inputs: UploaderInputs): string {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   return args.sha || envs.DRONE_COMMIT_SHA || ''
 }
 
 function _getSlug(inputs: UploaderInputs): string {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   if (args.slug !== '') return args.slug
   return envs.DRONE_REPO || ''
 }
diff --git a/src/ci_providers/provider_githubactions.ts b/src/ci_providers/provider_githubactions.ts
index 8a9b238..ddf7871 100644
--- a/src/ci_providers/provider_githubactions.ts
+++ b/src/ci_providers/provider_githubactions.ts
@@ -13,7 +13,7 @@ export function detect(envs: UploaderEnvs): boolean {
 }
 
 function _getBuild(inputs: UploaderInputs): string {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   return args.build || envs.GITHUB_RUN_ID || ''
 }
 
@@ -29,7 +29,7 @@ async function _getJobURL(inputs: UploaderInputs): Promise<string> {
   }
 
   const data = await res.body.json()
-  const { environment: envs } = inputs
+  const { envs } = inputs
   for (const job of data.jobs) {
     if (job.name == envs.GITHUB_JOB) {
       return job.html_url
@@ -39,7 +39,7 @@ async function _getJobURL(inputs: UploaderInputs): Promise<string> {
 }
 
 async function _getBuildURL(inputs: UploaderInputs): Promise<string> {
-  const { environment: envs } = inputs
+  const { envs } = inputs
 
   const url = await _getJobURL(inputs)
   if (url !== '') {
@@ -53,7 +53,7 @@ async function _getBuildURL(inputs: UploaderInputs): Promise<string> {
 }
 
 function _getBranch(inputs: UploaderInputs): string {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   const branchRegex = /refs\/heads\/(.*)/
   const branchMatches = branchRegex.exec(envs.GITHUB_REF || '')
   let branch
@@ -72,7 +72,7 @@ function _getJob(envs: UploaderEnvs): string {
 }
 
 function _getPR(inputs: UploaderInputs): string {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   let match
   if (envs.GITHUB_HEAD_REF && envs.GITHUB_HEAD_REF !== '') {
     const prRegex = /refs\/pull\/([0-9]+)\/merge/
@@ -93,7 +93,7 @@ export function getServiceName(): string {
 }
 
 function _getSHA(inputs: UploaderInputs): string {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   if (args.sha) return args.sha
 
   const pr = _getPR(inputs)
@@ -120,7 +120,7 @@ function _getSHA(inputs: UploaderInputs): string {
 }
 
 function _getSlug(inputs: UploaderInputs): string {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   if (args.slug !== '') return args.slug
   return envs.GITHUB_REPOSITORY || ''
 }
@@ -131,7 +131,7 @@ export async function getServiceParams(inputs: UploaderInputs): Promise<IService
     build: _getBuild(inputs),
     buildURL: await _getBuildURL(inputs),
     commit: _getSHA(inputs),
-    job: _getJob(inputs.environment),
+    job: _getJob(inputs.envs),
     pr: _getPR(inputs),
     service: _getService(),
     slug: _getSlug(inputs),
diff --git a/src/ci_providers/provider_gitlabci.ts b/src/ci_providers/provider_gitlabci.ts
index 0ad2bd8..0ee8203 100644
--- a/src/ci_providers/provider_gitlabci.ts
+++ b/src/ci_providers/provider_gitlabci.ts
@@ -7,7 +7,7 @@ export function detect(envs: UploaderEnvs): boolean {
 }
 
 function _getBuild(inputs: UploaderInputs): string {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   return args.build || envs.CI_BUILD_ID || envs.CI_JOB_ID || ''
 }
 
@@ -16,7 +16,7 @@ function _getBuildURL(): string {
 }
 
 function _getBranch(inputs: UploaderInputs): string {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   return args.branch || envs.CI_BUILD_REF_NAME || envs.CI_COMMIT_REF_NAME || ''
 }
 
@@ -38,12 +38,12 @@ export function getServiceName(): string {
 }
 
 function _getSHA(inputs: UploaderInputs): string {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   return args.sha || envs.CI_MERGE_REQUEST_SOURCE_BRANCH_SHA || envs.CI_BUILD_REF || envs.CI_COMMIT_SHA || ''
 }
 
 function _getSlug(inputs: UploaderInputs): string {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   if (args.slug !== '') return args.slug
   const remoteAddr = envs.CI_BUILD_REPO || envs.CI_REPOSITORY_URL || ''
   return (
diff --git a/src/ci_providers/provider_herokuci.ts b/src/ci_providers/provider_herokuci.ts
index c377a0e..3fb7953 100644
--- a/src/ci_providers/provider_herokuci.ts
+++ b/src/ci_providers/provider_herokuci.ts
@@ -6,7 +6,7 @@ export function detect(envs: UploaderEnvs): boolean {
 }
 
 function _getBuild(inputs: UploaderInputs): string {
-  const { args, environment: envs} = inputs
+  const { args, envs} = inputs
   return args.build || envs.HEROKU_TEST_RUN_ID || ''
 }
 
@@ -15,7 +15,7 @@ function _getBuildURL(): string {
 }
 
 function _getBranch(inputs: UploaderInputs): string {
-  const { args, environment: envs} = inputs
+  const { args, envs} = inputs
   return args.branch || envs.HEROKU_TEST_RUN_BRANCH || ''
 }
 
@@ -37,7 +37,7 @@ export function getServiceName(): string {
 }
 
 function _getSHA(inputs: UploaderInputs): string {
-  const { args, environment: envs} = inputs
+  const { args, envs} = inputs
   return args.sha || envs.HEROKU_TEST_RUN_COMMIT_VERSION || ''
 }
 
diff --git a/src/ci_providers/provider_jenkinsci.ts b/src/ci_providers/provider_jenkinsci.ts
index d8ea5c0..4f4d442 100644
--- a/src/ci_providers/provider_jenkinsci.ts
+++ b/src/ci_providers/provider_jenkinsci.ts
@@ -6,17 +6,17 @@ export function detect(envs: UploaderEnvs): boolean {
 }
 
 function _getBuild(inputs: UploaderInputs): string {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   return args.build || envs.BUILD_NUMBER || ''
 }
 
 function _getBuildURL(inputs: UploaderInputs): string {
-  const { environment: envs } = inputs
+  const { envs } = inputs
   return envs.BUILD_URL ? (envs.BUILD_URL) : ''
 }
 
 function _getBranch(inputs: UploaderInputs): string {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   return (
     args.branch ||
     envs.ghprbSourceBranch ||
@@ -32,7 +32,7 @@ function _getJob() {
 }
 
 function _getPR(inputs: UploaderInputs): string {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   return args.pr || envs.ghprbPullId || envs.CHANGE_ID || ''
 }
 
@@ -45,7 +45,7 @@ export function getServiceName(): string {
 }
 
 function _getSHA(inputs: UploaderInputs): string {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   // Note that the value of GIT_COMMIT may not be accurate if Jenkins
   // is merging `master` in to the working branch first. In these cases
   // there is no envvar representing the actual submitted commit
diff --git a/src/ci_providers/provider_local.ts b/src/ci_providers/provider_local.ts
index 458ce46..17d9982 100644
--- a/src/ci_providers/provider_local.ts
+++ b/src/ci_providers/provider_local.ts
@@ -17,7 +17,7 @@ function _getBuildURL(): string {
 }
 
 function _getBranch(inputs: UploaderInputs): string {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   const branch = args.branch || envs.GIT_BRANCH || envs.BRANCH_NAME || ''
   if (branch !== '') {
     return branch
@@ -52,7 +52,7 @@ export function getServiceName(): string {
 }
 
 function _getSHA(inputs: UploaderInputs) {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   const sha = args.sha || envs.GIT_COMMIT || ''
   if (sha !== '') {
     return sha
diff --git a/src/ci_providers/provider_teamcity.ts b/src/ci_providers/provider_teamcity.ts
index cd4f3e3..d84fce1 100644
--- a/src/ci_providers/provider_teamcity.ts
+++ b/src/ci_providers/provider_teamcity.ts
@@ -20,12 +20,12 @@ export function getServiceName(): string {
 }
 
 function _getBranch(inputs: UploaderInputs): string {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   return args.branch || envs.BRANCH_NAME || ''
 }
 
 function _getSHA(inputs: UploaderInputs): string {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   return args.sha || envs.BUILD_VCS_NUMBER || ''
 }
 
@@ -36,7 +36,7 @@ function _getSlug(inputs: UploaderInputs): string {
 }
 
 function _getBuild(inputs: UploaderInputs): string {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   return args.build || envs.BUILD_NUMBER || ''
 }
 
diff --git a/src/ci_providers/provider_template.ts b/src/ci_providers/provider_template.ts
index 1ab2e9b..2a8f641 100644
--- a/src/ci_providers/provider_template.ts
+++ b/src/ci_providers/provider_template.ts
@@ -137,7 +137,7 @@ export async function getServiceParams(inputs: UploaderInputs): Promise<IService
     build: _getBuild(inputs),
     buildURL: _getBuildURL(inputs),
     commit: _getSHA(inputs),
-    job: _getJob(inputs.environment),
+    job: _getJob(inputs.envs),
     pr: _getPR(inputs),
     service: _getService(),
     slug: _getSlug(inputs),
diff --git a/src/ci_providers/provider_travisci.ts b/src/ci_providers/provider_travisci.ts
index fa588bb..8125bc5 100644
--- a/src/ci_providers/provider_travisci.ts
+++ b/src/ci_providers/provider_travisci.ts
@@ -5,7 +5,7 @@ export function detect(envs: UploaderEnvs): boolean {
 }
 
 function _getBuild(inputs: UploaderInputs): string {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   return args.build || envs.TRAVIS_JOB_NUMBER || ''
 }
 
@@ -14,7 +14,7 @@ function _getBuildURL(): string {
 }
 
 function _getBranch(inputs: UploaderInputs): string {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
 
   let branch = ''
   if (envs.TRAVIS_BRANCH !== envs.TRAVIS_TAG) {
@@ -28,7 +28,7 @@ function _getJob(envs: UploaderEnvs): string {
 }
 
 function _getPR(inputs: UploaderInputs): string {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   return args.pr || envs.TRAVIS_PULL_REQUEST || ''
 }
 
@@ -41,12 +41,12 @@ export function getServiceName(): string {
 }
 
 function _getSHA(inputs: UploaderInputs): string {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   return args.sha || envs.TRAVIS_PULL_REQUEST_SHA || envs.TRAVIS_COMMIT || ''
 }
 
 function _getSlug(inputs: UploaderInputs): string {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   if (args.slug !== '') return args.slug
   return envs.TRAVIS_REPO_SLUG || ''
 }
@@ -57,7 +57,7 @@ export async function getServiceParams(inputs: UploaderInputs): Promise<IService
     build: _getBuild(inputs),
     buildURL: _getBuildURL(),
     commit: _getSHA(inputs),
-    job: _getJob(inputs.environment),
+    job: _getJob(inputs.envs),
     pr: _getPR(inputs),
     service: _getService(),
     slug: _getSlug(inputs),
diff --git a/src/ci_providers/provider_wercker.ts b/src/ci_providers/provider_wercker.ts
index 07f1d1c..0525df3 100644
--- a/src/ci_providers/provider_wercker.ts
+++ b/src/ci_providers/provider_wercker.ts
@@ -6,17 +6,17 @@ export function detect(envs: UploaderEnvs): boolean {
 }
 
 function _getBuild(inputs: UploaderInputs): string {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   return args.build || envs.WERCKER_MAIN_PIPELINE_STARTED || ''
 }
 
 function _getBuildURL(inputs: UploaderInputs): string {
-  const { environment: envs } = inputs
+  const { envs } = inputs
   return envs.WERCKER_BUILD_URL || ''
 }
 
 function _getBranch(inputs: UploaderInputs): string {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
 
   return args.branch || envs.WERCKER_GIT_BRANCH || ''
 }
@@ -39,12 +39,12 @@ export function getServiceName(): string {
 }
 
 function _getSHA(inputs: UploaderInputs): string {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   return args.sha || envs.WERCKER_GIT_COMMIT || ''
 }
 
 function _getSlug(inputs: UploaderInputs): string {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   return setSlug(args.slug, envs.WERCKER_GIT_OWNER, envs.WERCKER_GIT_REPOSITORY)
 }
 
diff --git a/src/ci_providers/provider_woodpecker.ts b/src/ci_providers/provider_woodpecker.ts
index 4953a0e..3a53ede 100644
--- a/src/ci_providers/provider_woodpecker.ts
+++ b/src/ci_providers/provider_woodpecker.ts
@@ -8,27 +8,27 @@ export function detect(envs: UploaderEnvs): boolean {
 }
 
 function _getBuild(inputs: UploaderInputs): string {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   return args.build || envs.CI_BUILD_NUMBER || ''
 }
 
 function _getBuildURL(inputs: UploaderInputs): string {
-  const { environment: envs } = inputs
+  const { envs } = inputs
   return envs.CI_BUILD_LINK || ''
 }
 
 function _getBranch(inputs: UploaderInputs): string {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   return args.branch || envs.CI_COMMIT_SOURCE_BRANCH || envs.CI_COMMIT_BRANCH || ''
 }
 
 function _getJob(inputs: UploaderInputs): string {
-  const { environment: envs } = inputs
+  const { envs } = inputs
   return envs.CI_JOB_NUMBER || ''
 }
 
 function _getPR(inputs: UploaderInputs): string {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   return args.pr || envs.CI_COMMIT_PULL_REQUEST || ''
 }
 
@@ -41,17 +41,17 @@ export function getServiceName(): string {
 }
 
 function _getSHA(inputs: UploaderInputs): string {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   return args.sha || envs.CI_COMMIT_SHA || ''
 }
 
 function _getTag(inputs: UploaderInputs): string {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   return args.tag || envs.CI_COMMIT_TAG || ''
 }
 
 function _getSlug(inputs: UploaderInputs): string {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   if (args.slug !== '') return args.slug
   return envs.CI_REPO || ''
 }
diff --git a/src/helpers/provider.ts b/src/helpers/provider.ts
index bae5a90..c19dbc0 100644
--- a/src/helpers/provider.ts
+++ b/src/helpers/provider.ts
@@ -40,11 +40,11 @@ export async function detectProvider(
 
 export async function walkProviders(inputs: UploaderInputs): Promise<IServiceParams> {
   for (const provider of providers) {
-    if (provider.detect(inputs.environment)) {
+    if (provider.detect(inputs.envs)) {
       info(`Detected ${provider.getServiceName()} as the CI provider.`)
       UploadLogger.verbose('-> Using the following env variables:')
       for (const envVarName of provider.getEnvVarNames()) {
-        UploadLogger.verbose(`     ${envVarName}: ${inputs.environment[envVarName]}`)
+        UploadLogger.verbose(`     ${envVarName}: ${inputs.envs[envVarName]}`)
       }
       return await provider.getServiceParams(inputs)
     }
diff --git a/src/helpers/proxy.ts b/src/helpers/proxy.ts
new file mode 100644
index 0000000..c184bac
--- /dev/null
+++ b/src/helpers/proxy.ts
@@ -0,0 +1,18 @@
+import { ProxyAgent } from 'undici';
+import { UploaderArgs, UploaderEnvs } from '../types.js';
+import { IncomingHttpHeaders } from 'undici/types/header.js';
+
+export function addProxyIfNeeded(envs: UploaderEnvs, args: UploaderArgs): ProxyAgent | undefined {
+  return args.upstream ? new ProxyAgent({ uri: args.upstream }) : undefined;
+}
+
+export function addProxyHeaders(envs: UploaderEnvs, initialHeaders: IncomingHttpHeaders): IncomingHttpHeaders {
+  let headers: IncomingHttpHeaders
+  if (envs['PROXY_BASIC_USER'] && envs['PROXY_BASIC_PASS']) {
+    const authString = Buffer.from(`${envs['PROXY_BASIC_USER']}:${envs['PROXY_BASIC_PASS']}`).toString("base64")
+    headers = { ...initialHeaders, Authorization: `Basic ${authString}` }
+  } else {
+    headers = initialHeaders
+  }
+  return headers
+}
diff --git a/src/helpers/token.ts b/src/helpers/token.ts
index 238c681..b58139e 100644
--- a/src/helpers/token.ts
+++ b/src/helpers/token.ts
@@ -13,7 +13,7 @@ import { validateToken } from './validate'
  * @returns string
  */
 export function getToken(inputs: UploaderInputs, projectRoot: string): string {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   const options = [
     [args.token, 'arguments'],
     [envs.CODECOV_TOKEN, 'environment variables'],
diff --git a/src/helpers/web.ts b/src/helpers/web.ts
index ea2366f..b1397db 100644
--- a/src/helpers/web.ts
+++ b/src/helpers/web.ts
@@ -1,7 +1,6 @@
 import dns from 'node:dns'
 import { snakeCase } from 'snake-case'
 import {
-  ProxyAgent,
   request,
   setGlobalDispatcher,
 } from 'undici'
@@ -13,9 +12,12 @@ import {
   PostResults,
   PutResults,
   UploaderArgs,
+  UploaderEnvs,
   UploaderInputs,
 } from '../types'
 import { info } from './logger'
+import { addProxyHeaders, addProxyIfNeeded } from './proxy'
+import { IncomingHttpHeaders } from 'undici/types/header.js'
 
 /**
  *
@@ -28,7 +30,7 @@ export function populateBuildParams(
   inputs: UploaderInputs,
   serviceParams: Partial<IServiceParams>,
 ): Partial<IServiceParams> {
-  const { args, environment: envs } = inputs
+  const { args, envs } = inputs
   serviceParams.name = args.name || envs.CODECOV_NAME || ''
   serviceParams.tag = args.tag || ''
 
@@ -54,6 +56,7 @@ export function getPackage(source: string): string {
 export async function uploadToCodecovPUT(
   putAndResultUrlPair: PostResults,
   uploadFile: string | Buffer,
+  envs: UploaderEnvs,
   args: UploaderArgs
 ): Promise<PutResults> {
   info('Uploading...')
@@ -61,6 +64,7 @@ export async function uploadToCodecovPUT(
   const requestHeaders = generateRequestHeadersPUT(
     putAndResultUrlPair.putURL,
     uploadFile,
+    envs,
     args,
   )
   if (requestHeaders.agent) {
@@ -84,6 +88,7 @@ export async function uploadToCodecovPOST(
   token: string,
   query: string,
   source: string,
+  envs: UploaderEnvs,
   args: UploaderArgs,
 ): Promise<string> {
   const requestHeaders = generateRequestHeadersPOST(
@@ -91,6 +96,7 @@ export async function uploadToCodecovPOST(
     token,
     query,
     source,
+    envs,
     args,
   )
   if (requestHeaders.agent) {
@@ -162,20 +168,25 @@ export function generateRequestHeadersPOST(
   token: string,
   query: string,
   source: string,
+  envs: UploaderEnvs,
   args: UploaderArgs,
 ): IRequestHeaders {
   const url = new URL(`upload/v4?package=${getPackage(
     source,
   )}&token=${token}&${query}`, postURL)
 
+  const initialHeaders = {
+    'X-Upload-Token': token,
+    'X-Reduced-Redundancy': 'false',
+  }
+
+  const headers: IncomingHttpHeaders = addProxyHeaders(envs, initialHeaders)
+
   return {
-    agent: args.upstream ? new ProxyAgent(args.upstream) : undefined,
+    agent: addProxyIfNeeded(envs, args),
     url: url,
     options: {
-      headers: {
-        'X-Upload-Token': token,
-        'X-Reduced-Redundancy': 'false',
-      },
+      headers,
       method: 'POST',
       origin: postURL,
       path: `${url.pathname}${url.search}`,
@@ -183,20 +194,27 @@ export function generateRequestHeadersPOST(
   }
 }
 
+
+
 export function generateRequestHeadersPUT(
   uploadURL: URL,
   uploadFile: string | Buffer,
+  envs: UploaderEnvs,
   args: UploaderArgs,
 ): IRequestHeaders {
+  const initialHeaders = {
+    'Content-Type': 'text/plain',
+    'Content-Encoding': 'gzip',
+  }
+  
+  const headers = addProxyHeaders(envs, initialHeaders)
+
   return {
-    agent: args.upstream ? new ProxyAgent(args.upstream) : undefined,
+    agent: addProxyIfNeeded(envs, args),
     url: uploadURL,
     options: {
       body: uploadFile,
-      headers: {
-        'Content-Type': 'text/plain',
-        'Content-Encoding': 'gzip',
-      },
+      headers,
       method: 'PUT',
       origin: uploadURL,
       path: `${uploadURL.pathname}${uploadURL.search}`,
diff --git a/src/index.ts b/src/index.ts
index 256c6aa..b5eefe2 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -113,7 +113,7 @@ export async function main(
   // TODO: clean and sanitize envs and args
   const envs = process.env
   // args
-  const inputs: UploaderInputs = { args, environment: envs }
+  const inputs: UploaderInputs = { args, envs }
 
   let uploadHost: string
   if (args.url) {
@@ -418,6 +418,7 @@ export async function main(
       token,
       query,
       args.source || '',
+      envs,
       args,
     )
 
@@ -428,6 +429,7 @@ export async function main(
     const statusAndResultPair = await webHelpers.uploadToCodecovPUT(
       postResults,
       gzippedFile,
+      envs,
       args,
     )
     info(JSON.stringify(statusAndResultPair))
diff --git a/src/types.ts b/src/types.ts
index eaac7ee..9b3ff9b 100644
--- a/src/types.ts
+++ b/src/types.ts
@@ -41,7 +41,7 @@ export interface UploaderArgs {
 export type UploaderEnvs = NodeJS.Dict<string>
 
 export interface UploaderInputs {
-  environment: UploaderEnvs
+  envs: UploaderEnvs
   args: UploaderArgs
 }
 


Test patch:
diff --git a/test/helpers/provider.test.ts b/test/helpers/provider.test.ts
index 678b7d2..e2dad8c 100644
--- a/test/helpers/provider.test.ts
+++ b/test/helpers/provider.test.ts
@@ -16,7 +16,7 @@ describe('detectProvider()', () => {
         sha: '1234566',
         slug: 'fakeOrg/fakeRepo',
       }},
-      environment: {},
+      envs: {},
     }
     const expectedOutput: Partial<IServiceParams> = {
       commit: '1234566',
@@ -30,7 +30,7 @@ describe('detectProvider()', () => {
       args: {...createEmptyArgs(), ...{
         sha: '1234566',
       }},
-      environment: {},
+      envs: {},
     }
     const expectedOutput: Partial<IServiceParams> = {
       commit: '1234566',
@@ -46,7 +46,7 @@ describe('detectProvider()', () => {
     })
     const inputs: UploaderInputs = {
       args: {...createEmptyArgs()},
-      environment: {},
+      envs: {},
     }
     await expect(detectProvider(inputs)).rejects.toThrowError(/Unable to detect SHA and slug, please specify them manually/)
   })
@@ -64,7 +64,7 @@ describe('walkProviders()', () => {
     })
     const inputs: UploaderInputs = {
       args: {...createEmptyArgs()},
-      environment: {},
+      envs: {},
     }
     await expect(walkProviders(inputs)).rejects.toThrow(/Unable to detect provider./)
   })
@@ -72,7 +72,7 @@ describe('walkProviders()', () => {
   it('will return serviceParams if able to detect', async () => {
     const inputs: UploaderInputs = {
       args: {...createEmptyArgs()},
-      environment: {
+      envs: {
         CI: 'true',
         CIRCLECI: 'true',
       },
diff --git a/test/helpers/token.test.ts b/test/helpers/token.test.ts
index 2451d24..891869e 100644
--- a/test/helpers/token.test.ts
+++ b/test/helpers/token.test.ts
@@ -45,7 +45,7 @@ describe('Get tokens', () => {
     it('Returns from args', () => {
       const inputs: UploaderInputs = {
         args: { ...createEmptyArgs(), ...{ token: 'argtoken' } },
-        environment: { CODECOV_TOKEN: 'envtoken' },
+        envs: { CODECOV_TOKEN: 'envtoken' },
       }
       expect(tokenHelpers.getToken(inputs, fixturesDir)).toBe('argtoken')
     })
@@ -53,7 +53,7 @@ describe('Get tokens', () => {
     it('Returns from env', () => {
       const inputs: UploaderInputs = {
         args: {...createEmptyArgs(),},
-        environment: { CODECOV_TOKEN: 'envtoken' },
+        envs: { CODECOV_TOKEN: 'envtoken' },
       }
       expect(tokenHelpers.getToken(inputs, fixturesDir)).toBe('envtoken')
     })
@@ -61,7 +61,7 @@ describe('Get tokens', () => {
     it('Returns from env', () => {
       const inputs: UploaderInputs = {
         args: {...createEmptyArgs(),},
-        environment: {},
+        envs: {},
       }
       expect(tokenHelpers.getToken(inputs, fixturesDir)).toBe('faketoken')
     })
@@ -69,7 +69,7 @@ describe('Get tokens', () => {
     it('Returns from no source', () => {
       const inputs: UploaderInputs = {
         args: {...createEmptyArgs(), },
-        environment: {},
+        envs: {},
       }
       expect(tokenHelpers.getToken(inputs, '.')).toBe('')
     })
@@ -81,7 +81,7 @@ describe('Get tokens', () => {
         url: 'dummy.local',
         token: 'goodToken',
       }},
-      environment: {
+      envs: {
         CODECOV_TOKEN: 'badToken',
       },
     }
@@ -93,7 +93,7 @@ describe('Get tokens', () => {
       args: {...createEmptyArgs(), ...{
         url: 'dummy.local',
       }},
-      environment: {
+      envs: {
         CODECOV_TOKEN: 'goodT----oken',
       },
     }
@@ -105,7 +105,7 @@ describe('Get tokens', () => {
       args: {...createEmptyArgs(), ...{
         url: DEFAULT_UPLOAD_HOST,
       }},
-      environment: {
+      envs: {
         CODECOV_TOKEN: 'bad------Token',
       },
     }
diff --git a/test/helpers/web.test.ts b/test/helpers/web.test.ts
index 6932245..86b9a49 100644
--- a/test/helpers/web.test.ts
+++ b/test/helpers/web.test.ts
@@ -17,7 +17,7 @@ import {
   uploadToCodecovPOST,
   uploadToCodecovPUT,
 } from '../../src/helpers/web'
-import { IServiceParams, PostResults, UploaderArgs } from '../../src/types'
+import { IServiceParams, PostResults, UploaderArgs, UploaderEnvs } from '../../src/types.js'
 import { createEmptyArgs } from '../test_helpers'
 
 describe('Web Helpers', () => {
@@ -46,6 +46,12 @@ describe('Web Helpers', () => {
   })
 
   it('Can POST to the uploader endpoint (HTTP)', async () => {
+    const envs: UploaderEnvs = {}
+    const args: UploaderArgs = {
+      flags: '',
+      slug: '',
+      upstream: '',
+    }
     uploadURL = 'http://codecov.io'
     mockClient = mockAgent.get(uploadURL)
     mockClient.intercept({
@@ -58,11 +64,8 @@ describe('Web Helpers', () => {
       token,
       query,
       source,
-      {
-        flags: '',
-        slug: '',
-        upstream: '',
-      },
+      envs,
+      args,
     )
     try {
       expect(response).toBe('testPOSTHTTP')
@@ -73,6 +76,12 @@ describe('Web Helpers', () => {
   })
 
   it('Can POST to the uploader endpoint (HTTPS)', async () => {
+    const envs: UploaderEnvs = {}
+    const args: UploaderArgs = {
+      flags: '',
+      slug: '',
+      upstream: '',
+    }
     jest.spyOn(console, 'log').mockImplementation(() => void {})
     uploadURL = 'https://codecov.io'
     mockClient = mockAgent.get(uploadURL)
@@ -86,16 +95,19 @@ describe('Web Helpers', () => {
       token,
       query,
       source,
-      {
-        flags: '',
-        slug: '',
-        upstream: '',
-      },
+      envs,
+      args,
     )
     expect(response).toBe('testPOSTHTTPS')
   })
 
   it('Can PUT to the storage endpoint', async () => {
+    const envs: UploaderEnvs = {}
+    const args: UploaderArgs = {
+      flags: '',
+      slug: '',
+      upstream: '',
+    }
     jest.spyOn(console, 'log').mockImplementation(() => void {})
     const postResults: PostResults = {
       putURL: new URL('https://codecov.io'),
@@ -108,11 +120,7 @@ describe('Web Helpers', () => {
       path: '/',
     }).reply(200, postResults.resultURL.href)
 
-    const response = await uploadToCodecovPUT(postResults, uploadFile, {
-      flags: '',
-      slug: '',
-      upstream: '',
-    })
+    const response = await uploadToCodecovPUT(postResults, uploadFile, envs, args)
     expect(response.resultURL.href).toStrictEqual('https://results.codecov.io/')
   })
 
@@ -155,13 +163,15 @@ describe('Web Helpers', () => {
   }) */
 
   it('can populateBuildParams() from args', () => {
+    const envs: UploaderEnvs = {}
+    const args: UploaderArgs = {
+      ...createEmptyArgs(),
+      ...{ flags: 'testFlag', tag: 'testTag' },
+    }
     const result = populateBuildParams(
       {
-        args: {
-          ...createEmptyArgs(),
-          ...{ flags: 'testFlag', tag: 'testTag' },
-        },
-        environment: {},
+        envs,
+        args,
       },
       {
         name: '',
@@ -181,8 +191,10 @@ describe('Web Helpers', () => {
   })
 
   it('can populateBuildParams() from args with multiple flags as string', () => {
+    const envs: UploaderEnvs = {}
     const result = populateBuildParams(
       {
+        envs,
         args: {
           ...createEmptyArgs(),
           ...{
@@ -190,7 +202,6 @@ describe('Web Helpers', () => {
             tag: 'testTag',
           },
         },
-        environment: {},
       },
       {
         name: '',
@@ -210,8 +221,10 @@ describe('Web Helpers', () => {
   })
 
   it('can populateBuildParams() from args with multiple flags as list', () => {
+    const envs: UploaderEnvs = {}
     const result = populateBuildParams(
       {
+        envs,
         args: {
           ...createEmptyArgs(),
           ...{
@@ -219,7 +232,6 @@ describe('Web Helpers', () => {
             tag: 'testTag',
           },
         },
-        environment: {},
       },
       {
         name: '',
@@ -291,6 +303,7 @@ describe('displayChangelog()', () => {
 })
 
 describe('generateRequestHeadersPOST()', () => {
+  const envs: UploaderEnvs = {}
   const args: UploaderArgs = { ...createEmptyArgs() }
 
   it('should return return the correct url when args.upstream is not set', () => {
@@ -300,6 +313,7 @@ describe('generateRequestHeadersPOST()', () => {
       '134',
       'slug=testOrg/testUploader',
       'G',
+      envs,
       args,
     )
 
@@ -313,12 +327,14 @@ describe('generateRequestHeadersPOST()', () => {
   })
 
   it('should return return the correct url when args.upstream is set', () => {
+    const envs: UploaderEnvs = {}
     args.upstream = 'http://proxy.local'
     const requestHeaders = generateRequestHeadersPOST(
       new URL('https:localhost.local'),
       '134',
       'slug=testOrg/testUploader',
       'G',
+      envs,
       args,
     )
 
@@ -336,6 +352,7 @@ describe('generateRequestHeadersPOST()', () => {
 })
 
 describe('generateRequestHeadersPUT()', () => {
+  const envs: UploaderEnvs = {}
   const args: UploaderArgs = { ...createEmptyArgs() }
 
   it('should return return the correct url when args.upstream is not set', () => {
@@ -343,6 +360,7 @@ describe('generateRequestHeadersPUT()', () => {
     const requestHeaders = generateRequestHeadersPUT(
       new URL('https://localhost.local'),
       "I'm a coverage report!",
+      envs,
       args,
     )
 
@@ -352,10 +370,12 @@ describe('generateRequestHeadersPUT()', () => {
   })
 
   it('should return return the correct url when args.upstream is set', () => {
+    const envs: UploaderEnvs = {}
     args.upstream = 'http://proxy.local'
     const requestHeaders = generateRequestHeadersPUT(
       new URL('https://localhost.local'),
       "I'm a coverage report!",
+      envs,
       args,
     )
 
@@ -366,3 +386,4 @@ describe('generateRequestHeadersPUT()', () => {
     )
   })
 })
+
diff --git a/test/index.test.ts b/test/index.test.ts
index 4815e15..85f4539 100644
--- a/test/index.test.ts
+++ b/test/index.test.ts
@@ -14,7 +14,7 @@ import { version } from '../package.json'
 import { UploadLogger } from '../src/helpers/logger'
 import * as providerHelpers from '../src/helpers/provider'
 import * as webHelpers from '../src/helpers/web'
-import { IServiceParams } from '../src/types'
+import { IServiceParams, UploaderArgs, } from '../src/types'
 
 // Backup the env
 const realEnv = { ...process.env }
@@ -78,7 +78,7 @@ describe('Uploader Core', () => {
       upstream: '',
       url: 'https://codecov.io',
     }
-    const inputs = { args, environment: process.env }
+    const inputs = { args, envs: process.env }
     const serviceParams = await providerHelpers.detectProvider(inputs, args.token != '')
     const buildParams = webHelpers.populateBuildParams(inputs, serviceParams)
     const query = webHelpers.generateQuery(buildParams)
@@ -196,7 +196,7 @@ describe('Uploader Core', () => {
         slug: '',
         upstream: ''
       }
-      const inputs = { args, environment: process.env }
+      const inputs = { args, envs: process.env }
       const serviceParams = await providerHelpers.detectProvider(inputs, args.token != '')
       const buildParams = webHelpers.populateBuildParams(inputs, serviceParams)
       const query = webHelpers.generateQuery(buildParams)
@@ -225,7 +225,7 @@ describe('Uploader Core', () => {
     process.env.CIRCLECI = 'true'
 
     const parent = '2x4bqz123abc'
-    const args = {
+    const args: UploaderArgs = {
       token: 'abcdefg',
       url: 'https://codecov.io',
       parent,
@@ -233,7 +233,7 @@ describe('Uploader Core', () => {
       slug: '',
       upstream: ''
     }
-    const inputs = { args, environment: process.env }
+    const inputs = { args, envs: process.env }
     const serviceParams = await providerHelpers.detectProvider(inputs, args.token != '')
     const buildParams = webHelpers.populateBuildParams(inputs, serviceParams)
     const query = webHelpers.generateQuery(buildParams)
diff --git a/test/providers/index.test.ts b/test/providers/index.test.ts
index b2d4c7a..8965b98 100644
--- a/test/providers/index.test.ts
+++ b/test/providers/index.test.ts
@@ -28,6 +28,7 @@ describe('CI Providers', () => {
 
     describe(`${provider.getServiceName()} can return a ISeviceParams object that`, () => {
       const inputs: UploaderInputs = {
+        envs: {},
         args: {
           ...createEmptyArgs(),
           ...{
@@ -35,7 +36,6 @@ describe('CI Providers', () => {
             slug: 'testOrg/testRepo',
           },
         },
-        environment: {},
       }
 
       it('has a sha', async () => {
diff --git a/test/providers/provider_appveyorci.test.ts b/test/providers/provider_appveyorci.test.ts
index dd088ee..ac583b8 100644
--- a/test/providers/provider_appveyorci.test.ts
+++ b/test/providers/provider_appveyorci.test.ts
@@ -13,38 +13,38 @@ describe('AppveyorCI Params', () => {
     it('does not run without AppveyorCI env variable', () => {
       const inputs: UploaderInputs = {
         args: { ...createEmptyArgs() },
-        environment: {},
+        envs: {},
       }
-      let detected = providerAppveyorci.detect(inputs.environment)
+      let detected = providerAppveyorci.detect(inputs.envs)
       expect(detected).toBeFalsy()
 
-      inputs.environment.CI = 'true'
-      detected = providerAppveyorci.detect(inputs.environment)
+      inputs.envs.CI = 'true'
+      detected = providerAppveyorci.detect(inputs.envs)
       expect(detected).toBeFalsy()
 
-      inputs.environment.CI = 'True'
-      detected = providerAppveyorci.detect(inputs.environment)
+      inputs.envs.CI = 'True'
+      detected = providerAppveyorci.detect(inputs.envs)
       expect(detected).toBeFalsy()
 
-      inputs.environment.CI = 'false'
-      inputs.environment.APPVEYOR = 'true'
-      detected = providerAppveyorci.detect(inputs.environment)
+      inputs.envs.CI = 'false'
+      inputs.envs.APPVEYOR = 'true'
+      detected = providerAppveyorci.detect(inputs.envs)
       expect(detected).toBeFalsy()
 
-      inputs.environment.APPVEYOR = 'True'
-      detected = providerAppveyorci.detect(inputs.environment)
+      inputs.envs.APPVEYOR = 'True'
+      detected = providerAppveyorci.detect(inputs.envs)
       expect(detected).toBeFalsy()
     })
 
     it('does run with AppveyorCI env variable', () => {
       const inputs: UploaderInputs = {
         args: { ...createEmptyArgs() },
-        environment: {
+        envs: {
           CI: 'true',
           APPVEYOR: 'true',
         },
       }
-      const detected = providerAppveyorci.detect(inputs.environment)
+      const detected = providerAppveyorci.detect(inputs.envs)
       expect(detected).toBeTruthy()
     })
   })
@@ -52,7 +52,7 @@ describe('AppveyorCI Params', () => {
   it('gets correct params on push', async () => {
     const inputs: UploaderInputs = {
       args: { ...createEmptyArgs() },
-      environment: {
+      envs: {
         APPVEYOR: 'true',
         APPVEYOR_ACCOUNT_NAME: 'testOrg',
         APPVEYOR_BUILD_ID: '2',
@@ -83,7 +83,7 @@ describe('AppveyorCI Params', () => {
   it('gets correct params for PRs', async () => {
     const inputs: UploaderInputs = {
       args: { ...createEmptyArgs() },
-      environment: {
+      envs: {
         APPVEYOR: 'true',
         APPVEYOR_ACCOUNT_NAME: 'testOrg',
         APPVEYOR_BUILD_ID: '2',
@@ -125,7 +125,7 @@ describe('AppveyorCI Params', () => {
           slug: 'testOrg/testRepo',
         },
       },
-      environment: {
+      envs: {
         APPVEYOR: 'true',
         CI: 'true',
       },
diff --git a/test/providers/provider_azurepipelines.test.ts b/test/providers/provider_azurepipelines.test.ts
index 8d57a6d..5bcea6f 100644
--- a/test/providers/provider_azurepipelines.test.ts
+++ b/test/providers/provider_azurepipelines.test.ts
@@ -15,20 +15,20 @@ describe('Azure Pipelines CI Params', () => {
     it('does not run without AzurePipelines env variable', () => {
       const inputs: UploaderInputs = {
         args: { ...createEmptyArgs() },
-        environment: {},
+        envs: {},
       }
-      const detected = providerAzurepipelines.detect(inputs.environment)
+      const detected = providerAzurepipelines.detect(inputs.envs)
       expect(detected).toBeFalsy()
     })
 
     it('does run with AzurePipelines env variable', () => {
       const inputs: UploaderInputs = {
         args: { ...createEmptyArgs() },
-        environment: {
+        envs: {
           SYSTEM_TEAMFOUNDATIONSERVERURI: 'true',
         },
       }
-      const detected = providerAzurepipelines.detect(inputs.environment)
+      const detected = providerAzurepipelines.detect(inputs.envs)
       expect(detected).toBeTruthy()
     })
   })
@@ -36,7 +36,7 @@ describe('Azure Pipelines CI Params', () => {
   it('gets empty string if environment variable is undefined', async () => {
     const inputs: UploaderInputs = {
       args: { ...createEmptyArgs() },
-      environment: {
+      envs: {
         SYSTEM_TEAMFOUNDATIONSERVERURI: 'https://example.azure.com',
       },
     }
@@ -64,7 +64,7 @@ describe('Azure Pipelines CI Params', () => {
   it('gets correct params on pr number', async () => {
     const inputs: UploaderInputs = {
       args: { ...createEmptyArgs() },
-      environment: {
+      envs: {
         BUILD_BUILDNUMBER: '1',
         BUILD_BUILDID: '2',
         BUILD_REPOSITORY_NAME: 'testOrg/testRepo',
@@ -101,7 +101,7 @@ describe('Azure Pipelines CI Params', () => {
   it('gets correct params on pr id', async () => {
     const inputs: UploaderInputs = {
       args: { ...createEmptyArgs() },
-      environment: {
+      envs: {
         BUILD_BUILDNUMBER: '1',
         BUILD_BUILDID: '2',
         BUILD_REPOSITORY_NAME: 'testOrg/testRepo',
@@ -138,7 +138,7 @@ describe('Azure Pipelines CI Params', () => {
   it('gets correct slug by remote address', async () => {
     const inputs: UploaderInputs = {
       args: { ...createEmptyArgs() },
-      environment: {
+      envs: {
         BUILD_BUILDNUMBER: '1',
         BUILD_BUILDID: '2',
         BUILD_SOURCEBRANCH: 'refs/heads/main',
@@ -172,7 +172,7 @@ describe('Azure Pipelines CI Params', () => {
   it('gets correct params on merge', async() => {
     const inputs: UploaderInputs = {
       args: { ...createEmptyArgs() },
-      environment: {
+      envs: {
         BUILD_BUILDNUMBER: '1',
         BUILD_BUILDID: '2',
         BUILD_REPOSITORY_NAME: 'testOrg/testRepo',
@@ -218,7 +218,7 @@ describe('Azure Pipelines CI Params', () => {
           slug: 'testOrg/otherTestRepo',
         },
       },
-      environment: {
+      envs: {
         SYSTEM_TEAMFOUNDATIONSERVERURI: 'https://example.azure.com',
         BUILD_REPOSITORY_NAME: 'testOrg/testRepo',
       },
diff --git a/test/providers/provider_bitbucket.test.ts b/test/providers/provider_bitbucket.test.ts
index 8e19d7a..cbcecd7 100644
--- a/test/providers/provider_bitbucket.test.ts
+++ b/test/providers/provider_bitbucket.test.ts
@@ -14,25 +14,25 @@ describe('Bitbucket Params', () => {
     it('does not run without Bitbucket env variable', () => {
       const inputs: UploaderInputs = {
         args: {...createEmptyArgs(), },
-        environment: {},
+        envs: {},
       }
-      let detected = providerBitbucket.detect(inputs.environment)
+      let detected = providerBitbucket.detect(inputs.envs)
       expect(detected).toBeFalsy()
 
-      inputs.environment['CI'] = 'true'
-      detected = providerBitbucket.detect(inputs.environment)
+      inputs.envs['CI'] = 'true'
+      detected = providerBitbucket.detect(inputs.envs)
       expect(detected).toBeFalsy()
     })
 
     it('does not run without Bitbucket env variable', () => {
       const inputs: UploaderInputs = {
         args: {...createEmptyArgs(), },
-        environment: {
+        envs: {
           BITBUCKET_BUILD_NUMBER: '1',
           CI: 'true',
         },
       }
-      const detected = providerBitbucket.detect(inputs.environment)
+      const detected = providerBitbucket.detect(inputs.envs)
       expect(detected).toBeTruthy()
     })
   })
@@ -40,7 +40,7 @@ describe('Bitbucket Params', () => {
   it('gets the correct params on no env variables', async () => {
     const inputs: UploaderInputs = {
       args: {...createEmptyArgs(), },
-      environment: {
+      envs: {
         BITBUCKET_BUILD_NUMBER: '1',
         CI: 'true',
       },
@@ -62,7 +62,7 @@ describe('Bitbucket Params', () => {
   it('gets the correct params on pr', async () => {
     const inputs: UploaderInputs = {
       args: {...createEmptyArgs(), },
-      environment: {
+      envs: {
         BITBUCKET_BRANCH: 'main',
         BITBUCKET_BUILD_NUMBER: '1',
         BITBUCKET_COMMIT: 'testingsha',
@@ -88,7 +88,7 @@ describe('Bitbucket Params', () => {
   it('gets the correct params on push', async () => {
     const inputs: UploaderInputs = {
       args: {...createEmptyArgs(), },
-      environment: {
+      envs: {
         BITBUCKET_BRANCH: 'main',
         BITBUCKET_BUILD_NUMBER: '1',
         BITBUCKET_COMMIT: 'testingsha',
@@ -113,7 +113,7 @@ describe('Bitbucket Params', () => {
   it('gets the correct params with short SHA', async () => {
     const inputs: UploaderInputs = {
       args: {...createEmptyArgs(), },
-      environment: {
+      envs: {
         BITBUCKET_BRANCH: 'main',
         BITBUCKET_BUILD_NUMBER: '1',
         BITBUCKET_COMMIT: 'testingsha12',
@@ -150,7 +150,7 @@ describe('Bitbucket Params', () => {
         slug: 'overwriteOwner/overwriteRepo',
 
       }},
-      environment: {
+      envs: {
         BITBUCKET_BRANCH: 'main',
         BITBUCKET_BUILD_NUMBER: '1',
         BITBUCKET_COMMIT: 'testingsha',
diff --git a/test/providers/provider_bitrise.test.ts b/test/providers/provider_bitrise.test.ts
index b94448f..d8f8727 100644
--- a/test/providers/provider_bitrise.test.ts
+++ b/test/providers/provider_bitrise.test.ts
@@ -15,32 +15,32 @@ describe('Bitrise Params', () => {
     it('does not run without Bitrise env variable', () => {
       const inputs: UploaderInputs = {
         args: { ...createEmptyArgs() },
-        environment: {},
+        envs: {},
       }
-      const detected = providerBitrise.detect(inputs.environment)
+      const detected = providerBitrise.detect(inputs.envs)
       expect(detected).toBeFalsy()
     })
 
     it('does not run with only CI env variable', () => {
       const inputs: UploaderInputs= {
         args: { ...createEmptyArgs() },
-        environment: {
+        envs: {
           CI: 'true',
         },
       }
-      const detected = providerBitrise.detect(inputs.environment)
+      const detected = providerBitrise.detect(inputs.envs)
       expect(detected).toBeFalsy()
     })
 
     it('runs with Bitrise env variables', () => {
       const inputs: UploaderInputs= {
         args: { ...createEmptyArgs() },
-        environment: {
+        envs: {
           BITRISE_IO: 'true',
           CI: 'true',
         },
       }
-      const detected = providerBitrise.detect(inputs.environment)
+      const detected = providerBitrise.detect(inputs.envs)
       expect(detected).toBeTruthy()
     })
   })
@@ -49,7 +49,7 @@ describe('Bitrise Params', () => {
   it('gets the correct params on no env variables', async () => {
     const inputs: UploaderInputs = {
       args: { ...createEmptyArgs() },
-      environment: {
+      envs: {
         BITRISE_IO: 'true',
         CI: 'true',
       },
@@ -77,7 +77,7 @@ describe('Bitrise Params', () => {
   it('gets the correct params on push', async () => {
     const inputs: UploaderInputs = {
       args: { ...createEmptyArgs() },
-      environment: {
+      envs: {
         BITRISE_BUILD_NUMBER: '2',
         BITRISE_BUILD_URL: 'https://bitrise.com/testOrg/testRepo/2',
         BITRISE_GIT_BRANCH: 'main',
@@ -107,7 +107,7 @@ describe('Bitrise Params', () => {
   it('gets the correct params on pr', async () => {
     const inputs: UploaderInputs = {
       args: { ...createEmptyArgs() },
-      environment: {
+      envs: {
         BITRISE_BUILD_NUMBER: '2',
         BITRISE_BUILD_URL: 'https://bitrise.com/testOrg/testRepo/2',
         BITRISE_GIT_BRANCH: 'main',
@@ -148,7 +148,7 @@ describe('Bitrise Params', () => {
           slug: 'neworg/newRepo',
         },
       },
-      environment: {
+      envs: {
         BITRISE_BUILD_NUMBER: '2',
         BITRISE_BUILD_URL: 'https://bitrise.com/testOrg/testRepo/2',
         BITRISE_GIT_BRANCH: 'main',
diff --git a/test/providers/provider_buildkite.test.ts b/test/providers/provider_buildkite.test.ts
index 07b447e..297fade 100644
--- a/test/providers/provider_buildkite.test.ts
+++ b/test/providers/provider_buildkite.test.ts
@@ -12,20 +12,20 @@ describe('Buildkite Params', () => {
     it('does not run without Buildkite env variable', () => {
       const inputs: UploaderInputs = {
         args: { ...createEmptyArgs() },
-        environment: {},
+        envs: {},
       }
-      const detected = providerBuildkite.detect(inputs.environment)
+      const detected = providerBuildkite.detect(inputs.envs)
       expect(detected).toBeFalsy()
     })
 
     it('does not run without Buildkite env variable', () => {
       const inputs: UploaderInputs = {
         args: { ...createEmptyArgs() },
-        environment: {
+        envs: {
           BUILDKITE: 'true',
         },
       }
-      const detected = providerBuildkite.detect(inputs.environment)
+      const detected = providerBuildkite.detect(inputs.envs)
       expect(detected).toBeTruthy()
     })
   })
@@ -33,7 +33,7 @@ describe('Buildkite Params', () => {
   it('gets correct params on push', async () => {
     const inputs: UploaderInputs = {
       args: { ...createEmptyArgs() },
-      environment: {
+      envs: {
         BUILDKITE: 'true',
         BUILDKITE_BUILD_NUMBER: '1',
         BUILDKITE_JOB_ID: '3',
@@ -71,7 +71,7 @@ describe('Buildkite Params', () => {
           slug: 'testOrg/testRepo',
         },
       },
-      environment: {
+      envs: {
         BUILDKITE: 'true',
         CI: 'true',
       },
diff --git a/test/providers/provider_circleci.test.ts b/test/providers/provider_circleci.test.ts
index d61bdea..f803b04 100644
--- a/test/providers/provider_circleci.test.ts
+++ b/test/providers/provider_circleci.test.ts
@@ -13,21 +13,21 @@ describe('CircleCI Params', () => {
     it('does not run without CircleCI env variable', () => {
       const inputs: UploaderInputs = {
         args: {...createEmptyArgs(), },
-        environment: {},
+        envs: {},
       }
-      const detected = providerCircleci.detect(inputs.environment)
+      const detected = providerCircleci.detect(inputs.envs)
       expect(detected).toBeFalsy()
     })
 
     it('does run with CircleCI env variable', () => {
       const inputs: UploaderInputs = {
         args: {...createEmptyArgs(), },
-        environment: {
+        envs: {
           CI: 'true',
           CIRCLECI: 'true',
         },
       }
-      const detected = providerCircleci.detect(inputs.environment)
+      const detected = providerCircleci.detect(inputs.envs)
       expect(detected).toBeTruthy()
     })
   })
@@ -35,7 +35,7 @@ describe('CircleCI Params', () => {
   it('gets correct params', async () => {
     const inputs: UploaderInputs = {
       args: {...createEmptyArgs(), },
-      environment: {
+      envs: {
         CI: 'true',
         CIRCLECI: 'true',
         CIRCLE_BRANCH: 'master',
@@ -65,7 +65,7 @@ describe('CircleCI Params', () => {
   it('gets correct slug when empty reponame', async () => {
     const inputs: UploaderInputs = {
       args: {...createEmptyArgs(), },
-      environment: {
+      envs: {
         CI: 'true',
         CIRCLECI: 'true',
         CIRCLE_BRANCH: 'master',
diff --git a/test/providers/provider_cirrus.test.ts b/test/providers/provider_cirrus.test.ts
index bc85562..8dc23a7 100644
--- a/test/providers/provider_cirrus.test.ts
+++ b/test/providers/provider_cirrus.test.ts
@@ -13,21 +13,21 @@ describe('Cirrus Params', () => {
     it('does not run without Cirrus env variable', () => {
       const inputs: UploaderInputs = {
         args: { ...createEmptyArgs() },
-        environment: {},
+        envs: {},
       }
-      const detected = providerCirrus.detect(inputs.environment)
+      const detected = providerCirrus.detect(inputs.envs)
       expect(detected).toBeFalsy()
     })
 
     it('does run with Cirrus env variable', () => {
       const inputs: UploaderInputs = {
         args: { ...createEmptyArgs() },
-        environment: {
+        envs: {
           CI: 'true',
           CIRRUS_CI: 'true',
         },
       }
-      const detected = providerCirrus.detect(inputs.environment)
+      const detected = providerCirrus.detect(inputs.envs)
       expect(detected).toBeTruthy()
     })
   })
@@ -35,7 +35,7 @@ describe('Cirrus Params', () => {
   it('gets correct params', async () => {
     const inputs: UploaderInputs = {
       args: { ...createEmptyArgs() },
-      environment: {
+      envs: {
         CI: 'true',
         CIRRUS_CI: 'true',
         CIRRUS_BRANCH: 'master',
@@ -72,7 +72,7 @@ describe('Cirrus Params', () => {
           slug: 'testOrg/testRepo',
         },
       },
-      environment: {
+      envs: {
         CI: 'true',
         CIRRUS_CI: 'true',
         CIRRUS_BRANCH: 'master',
diff --git a/test/providers/provider_codebuild.test.ts b/test/providers/provider_codebuild.test.ts
index a15c65d..2708898 100644
--- a/test/providers/provider_codebuild.test.ts
+++ b/test/providers/provider_codebuild.test.ts
@@ -13,21 +13,21 @@ describe('CodeBuild Params', () => {
     it('does not run without CodeBuild env variable', () => {
       const inputs: UploaderInputs = {
         args: { ...createEmptyArgs() },
-        environment: {},
+        envs: {},
       }
-      const detected = providerCodeBuild.detect(inputs.environment)
+      const detected = providerCodeBuild.detect(inputs.envs)
       expect(detected).toBeFalsy()
     })
 
     it('does run with CodeBuild env variable', () => {
       const inputs: UploaderInputs = {
         args: { ...createEmptyArgs() },
-        environment: {
+        envs: {
           CI: 'true',
           CODEBUILD_CI: 'true',
         },
       }
-      const detected = providerCodeBuild.detect(inputs.environment)
+      const detected = providerCodeBuild.detect(inputs.envs)
       expect(detected).toBeTruthy()
     })
   })
@@ -36,7 +36,7 @@ describe('CodeBuild Params', () => {
     it('gets correct params', async () => {
       const inputs: UploaderInputs = {
         args: { ...createEmptyArgs() },
-        environment: {
+        envs: {
           CI: 'true',
           CODEBUILD_CI: 'true',
           CODEBUILD_WEBHOOK_HEAD_REF: 'refs/heads/master',
@@ -72,7 +72,7 @@ describe('CodeBuild Params', () => {
             slug: 'testOrg/testRepo',
           },
         },
-        environment: {
+        envs: {
           CI: 'true',
           CODEBUILD_CI: 'true',
           CODEBUILD_WEBHOOK_HEAD_REF: 'refs/heads/master',
diff --git a/test/providers/provider_drone.test.ts b/test/providers/provider_drone.test.ts
index f242fc7..be95afb 100644
--- a/test/providers/provider_drone.test.ts
+++ b/test/providers/provider_drone.test.ts
@@ -13,21 +13,21 @@ describe('Drone Params', () => {
     it('does not run without Drone env variable', () => {
       const inputs: UploaderInputs = {
         args: { ...createEmptyArgs() },
-        environment: {},
+        envs: {},
       }
-      const detected = providerDrone.detect(inputs.environment)
+      const detected = providerDrone.detect(inputs.envs)
       expect(detected).toBeFalsy()
     })
 
     it('does run with Drone env variable', () => {
       const inputs: UploaderInputs = {
         args: { ...createEmptyArgs() },
-        environment: {
+        envs: {
           CI: 'true',
           DRONE: 'true',
         },
       }
-      const detected = providerDrone.detect(inputs.environment)
+      const detected = providerDrone.detect(inputs.envs)
       expect(detected).toBeTruthy()
     })
   })
@@ -35,7 +35,7 @@ describe('Drone Params', () => {
   it('gets correct params', async () => {
     const inputs: UploaderInputs = {
       args: { ...createEmptyArgs() },
-      environment: {
+      envs: {
         CI: 'true',
         DRONE: 'true',
         DRONE_BRANCH: 'master',
@@ -63,7 +63,7 @@ describe('Drone Params', () => {
   it('gets correct params for DRONE_BUILD_URL', async () => {
     const inputs: UploaderInputs = {
       args: { ...createEmptyArgs() },
-      environment: {
+      envs: {
         CI: 'true',
         DRONE: 'true',
         DRONE_BRANCH: 'master',
diff --git a/test/providers/provider_githubactions.test.ts b/test/providers/provider_githubactions.test.ts
index 114afe1..9128fad 100644
--- a/test/providers/provider_githubactions.test.ts
+++ b/test/providers/provider_githubactions.test.ts
@@ -16,7 +16,7 @@ describe('GitHub Actions Params', () => {
     it('does not run without GitHub Actions env variable', () => {
       const inputs: UploaderInputs = {
         args: { ...createEmptyArgs() },
-        environment: {
+        envs: {
           GITHUB_REF: 'refs/heads/master',
           GITHUB_REPOSITORY: 'testOrg/testRepo',
           GITHUB_RUN_ID: '2',
@@ -24,18 +24,18 @@ describe('GitHub Actions Params', () => {
           GITHUB_WORKFLOW: 'testWorkflow',
         },
       }
-      const detected = providerGitHubactions.detect(inputs.environment)
+      const detected = providerGitHubactions.detect(inputs.envs)
       expect(detected).toBeFalsy()
     })
 
     it('does not run with only the GitHub Actions env variable', () => {
       const inputs: UploaderInputs = {
         args: { ...createEmptyArgs() },
-        environment: {
+        envs: {
           GITHUB_ACTIONS: 'true',
         },
       }
-      const detected = providerGitHubactions.detect(inputs.environment)
+      const detected = providerGitHubactions.detect(inputs.envs)
       expect(detected).toBeTruthy()
     })
   })
@@ -43,7 +43,7 @@ describe('GitHub Actions Params', () => {
   it('gets correct params for a push event', async () => {
     const inputs: UploaderInputs = {
       args: { ...createEmptyArgs() },
-      environment: {
+      envs: {
         GITHUB_ACTIONS: 'true',
         GITHUB_REF: 'refs/heads/master',
         GITHUB_REPOSITORY: 'testOrg/testRepo',
@@ -70,7 +70,7 @@ describe('GitHub Actions Params', () => {
   it('gets correct params for a PR', async () => {
     const inputs: UploaderInputs = {
       args: { ...createEmptyArgs() },
-      environment: {
+      envs: {
         GITHUB_ACTIONS: 'true',
         GITHUB_HEAD_REF: 'branch',
         GITHUB_REF: 'refs/pull/1/merge',
@@ -105,7 +105,7 @@ describe('GitHub Actions Params', () => {
   it('gets correct buildURL for a PR', async () => {
     const inputs: UploaderInputs = {
       args: { ...createEmptyArgs() },
-      environment: {
+      envs: {
         GITHUB_ACTIONS: 'true',
         GITHUB_HEAD_REF: 'branch',
         GITHUB_JOB: 'testJob',
@@ -173,7 +173,7 @@ describe('GitHub Actions Params', () => {
   it('gets correct buildURL by default for a PR', async () => {
     const inputs: UploaderInputs = {
       args: { ...createEmptyArgs() },
-      environment: {
+      envs: {
         GITHUB_ACTIONS: 'true',
         GITHUB_HEAD_REF: 'branch',
         GITHUB_JOB: 'testJob',
@@ -239,7 +239,7 @@ describe('GitHub Actions Params', () => {
   it('gets correct params for a merge', async () => {
     const inputs: UploaderInputs = {
       args: { ...createEmptyArgs() },
-      environment: {
+      envs: {
         GITHUB_ACTIONS: 'true',
         GITHUB_HEAD_REF: 'branch',
         GITHUB_REF: 'refs/pull/1/merge',
@@ -284,7 +284,7 @@ describe('GitHub Actions Params', () => {
           slug: 'testOrg/testRepo',
         },
       },
-      environment: {
+      envs: {
         GITHUB_ACTIONS: 'true',
         GITHUB_SERVER_URL: 'https://github.com',
       },
@@ -311,7 +311,7 @@ describe('GitHub Actions Params', () => {
   it('gets an improper merge commit message', async () => {
     const inputs: UploaderInputs = {
       args: { ...createEmptyArgs() },
-      environment: {
+      envs: {
         GITHUB_ACTIONS: 'true',
         GITHUB_HEAD_REF: 'branch',
         GITHUB_REF: 'refs/pull/1/merge',
diff --git a/test/providers/provider_gitlabci.test.ts b/test/providers/provider_gitlabci.test.ts
index c189996..9823d94 100644
--- a/test/providers/provider_gitlabci.test.ts
+++ b/test/providers/provider_gitlabci.test.ts
@@ -15,20 +15,20 @@ describe('GitLabCI Params', () => {
     it('does not run without GitLabCI env variable', () => {
       const inputs: UploaderInputs = {
         args: { ...createEmptyArgs() },
-        environment: {},
+        envs: {},
       }
-      const detected = providerGitLabci.detect(inputs.environment)
+      const detected = providerGitLabci.detect(inputs.envs)
       expect(detected).toBeFalsy()
     })
 
     it('does run with GitLabCI env variable', () => {
       const inputs: UploaderInputs = {
         args: { ...createEmptyArgs() },
-        environment: {
+        envs: {
           GITLAB_CI: 'true',
         },
       }
-      const detected = providerGitLabci.detect(inputs.environment)
+      const detected = providerGitLabci.detect(inputs.envs)
       expect(detected).toBeTruthy()
     })
   })
@@ -36,7 +36,7 @@ describe('GitLabCI Params', () => {
   it('gets correct empty params', async () => {
     const inputs: UploaderInputs = {
       args: { ...createEmptyArgs() },
-      environment: {
+      envs: {
         GITLAB_CI: 'true',
       },
     }
@@ -61,7 +61,7 @@ describe('GitLabCI Params', () => {
   it('gets correct initial params', async () => {
     const inputs: UploaderInputs = {
       args: { ...createEmptyArgs() },
-      environment: {
+      envs: {
         CI_BUILD_ID: '1',
         CI_BUILD_REF: 'testingsha',
         CI_BUILD_REF_NAME: 'main',
@@ -89,7 +89,7 @@ describe('GitLabCI Params', () => {
   it('gets correct second params', async () => {
     const inputs: UploaderInputs = {
       args: { ...createEmptyArgs() },
-      environment: {
+      envs: {
         CI_COMMIT_REF_NAME: 'master',
         CI_COMMIT_SHA: 'testsha',
         CI_JOB_ID: '2',
@@ -114,26 +114,26 @@ describe('GitLabCI Params', () => {
   describe('getSlug()', () => {
     const inputs: UploaderInputs = {
       args: { ...createEmptyArgs() },
-      environment: {
+      envs: {
         GITLAB_CI: 'true',
       },
     }
 
     it('can get the slug from http', async () => {
-      inputs.environment.CI_BUILD_REPO =
+      inputs.envs.CI_BUILD_REPO =
         'https://gitlab.com/testOrg/testRepo.git'
       const params = await providerGitLabci.getServiceParams(inputs)
       expect(params.slug).toBe('testOrg/testRepo')
     })
 
     it('can get the slug from git url', async () => {
-      inputs.environment.CI_BUILD_REPO = 'git@gitlab.com:testOrg/testRepo.git'
+      inputs.envs.CI_BUILD_REPO = 'git@gitlab.com:testOrg/testRepo.git'
       const params = await providerGitLabci.getServiceParams(inputs)
       expect(params.slug).toBe('testOrg/testRepo')
     })
 
     it('can get the slug from git config', async () => {
-      inputs.environment.CI_BUILD_REPO = ''
+      inputs.envs.CI_BUILD_REPO = ''
       const spawnSync = td.replace(childProcess, 'spawnSync')
       td.when(
         spawnSync('git', ['config', '--get', 'remote.origin.url'], { maxBuffer: SPAWNPROCESSBUFFERSIZE }),
@@ -144,7 +144,7 @@ describe('GitLabCI Params', () => {
     })
 
     it('can get the slug from git config as /', async () => {
-      inputs.environment.CI_BUILD_REPO = ''
+      inputs.envs.CI_BUILD_REPO = ''
       const spawnSync = td.replace(childProcess, 'spawnSync')
       td.when(
         spawnSync('git', ['config', '--get', 'remote.origin.url'], { maxBuffer: SPAWNPROCESSBUFFERSIZE }),
@@ -155,7 +155,7 @@ describe('GitLabCI Params', () => {
     })
 
     it('can handle no remote origin url', async () => {
-      inputs.environment.CI_BUILD_REPO = ''
+      inputs.envs.CI_BUILD_REPO = ''
       const spawnSync = td.replace(childProcess, 'spawnSync')
       td.when(
         spawnSync('git', ['config', '--get', 'remote.origin.url'], { maxBuffer: SPAWNPROCESSBUFFERSIZE }),
@@ -178,7 +178,7 @@ describe('GitLabCI Params', () => {
           slug: 'testOrg/testRepo',
         },
       },
-      environment: {
+      envs: {
         GITLAB_CI: 'true',
       },
     }
diff --git a/test/providers/provider_herokuci.test.ts b/test/providers/provider_herokuci.test.ts
index 2269906..30c1626 100644
--- a/test/providers/provider_herokuci.test.ts
+++ b/test/providers/provider_herokuci.test.ts
@@ -15,21 +15,21 @@ describe('HerokuCI Params', () => {
     it('does not run without HerokuCI env variable', () => {
       const inputs: UploaderInputs = {
         args: { ...createEmptyArgs() },
-        environment: {},
+        envs: {},
       }
-      const detected = providerHerokuci.detect(inputs.environment)
+      const detected = providerHerokuci.detect(inputs.envs)
       expect(detected).toBeFalsy()
     })
 
     it('does run with Herokuci env variable', () => {
       const inputs: UploaderInputs = {
         args: { ...createEmptyArgs() },
-        environment: {
+        envs: {
           CI: 'true',
           HEROKU_TEST_RUN_BRANCH: 'test',
         },
       }
-      const detected = providerHerokuci.detect(inputs.environment)
+      const detected = providerHerokuci.detect(inputs.envs)
       expect(detected).toBeTruthy()
     })
   })
@@ -38,7 +38,7 @@ describe('HerokuCI Params', () => {
   it('gets the correct params on no env variables', async () => {
     const inputs: UploaderInputs = {
       args: { ...createEmptyArgs() },
-      environment: {},
+      envs: {},
     }
     const expected: IServiceParams = {
       branch: '',
@@ -62,7 +62,7 @@ describe('HerokuCI Params', () => {
   it('gets the correct params on push', async () => {
     const inputs: UploaderInputs = {
       args: { tag: '', url: '', source: '', flags: '', slug: '', upstream: '' },
-      environment: {
+      envs: {
         CI: 'true',
         HEROKU_TEST_RUN_BRANCH: 'testBranch',
         HEROKU_TEST_RUN_COMMIT_VERSION: 'testSha',
@@ -100,7 +100,7 @@ describe('HerokuCI Params', () => {
           slug: 'testOrg/testRepo',
         },
       },
-      environment: {},
+      envs: {},
     }
     const expected: IServiceParams = {
       branch: 'branch',
diff --git a/test/providers/provider_jenkinsci.test.ts b/test/providers/provider_jenkinsci.test.ts
index f3cf870..be656bc 100644
--- a/test/providers/provider_jenkinsci.test.ts
+++ b/test/providers/provider_jenkinsci.test.ts
@@ -15,24 +15,24 @@ describe('Jenkins CI Params', () => {
     it('does not run without JenkinsCI env variable', () => {
       const inputs: UploaderInputs = {
         args: { ...createEmptyArgs() },
-        environment: {},
+        envs: {},
       }
-      let detected = providerJenkinsci.detect(inputs.environment)
+      let detected = providerJenkinsci.detect(inputs.envs)
       expect(detected).toBeFalsy()
 
-      inputs.environment.JENKINS_URL = ''
-      detected = providerJenkinsci.detect(inputs.environment)
+      inputs.envs.JENKINS_URL = ''
+      detected = providerJenkinsci.detect(inputs.envs)
       expect(detected).toBeFalsy()
     })
 
     it('does run with JenkinsCI env variable', () => {
       const inputs: UploaderInputs = {
         args: { ...createEmptyArgs() },
-        environment: {
+        envs: {
           JENKINS_URL: 'https://example.jenkins.com',
         },
       }
-      const detected = providerJenkinsci.detect(inputs.environment)
+      const detected = providerJenkinsci.detect(inputs.envs)
       expect(detected).toBeTruthy()
     })
   })
@@ -40,7 +40,7 @@ describe('Jenkins CI Params', () => {
   it('gets correct params on push', async () => {
     const inputs: UploaderInputs = {
       args: { ...createEmptyArgs() },
-      environment: {
+      envs: {
         BUILD_NUMBER: '1',
         BUILD_URL: 'https://example.jenkins.com',
         CHANGE_ID: '2',
@@ -70,7 +70,7 @@ describe('Jenkins CI Params', () => {
   it('can get the slug from git config', async () => {
     const inputs: UploaderInputs = {
       args: { ...createEmptyArgs() },
-      environment: {
+      envs: {
         BUILD_NUMBER: '1',
         BUILD_URL: 'https://example.jenkins.com',
         CHANGE_ID: '2',
@@ -100,7 +100,7 @@ describe('Jenkins CI Params', () => {
           slug: 'testOrg/testRepo',
         },
       },
-      environment: {
+      envs: {
         JENKINS_URL: 'https://example.com',
       },
     }
diff --git a/test/providers/provider_local.test.ts b/test/providers/provider_local.test.ts
index 7b8e096..251dc80 100644
--- a/test/providers/provider_local.test.ts
+++ b/test/providers/provider_local.test.ts
@@ -38,7 +38,7 @@ describe('Local Params', () => {
           slug: 'owner/repo',
         },
       },
-      environment: {},
+      envs: {},
     }
     const expected: IServiceParams = {
       branch: 'main',
@@ -63,7 +63,7 @@ describe('Local Params', () => {
           slug: 'owner/repo',
         },
       },
-      environment: {
+      envs: {
         GIT_COMMIT: 'testingsha',
         GIT_BRANCH: 'main'
       },
@@ -85,7 +85,7 @@ describe('Local Params', () => {
   it('returns errors on git command failures', async () => {
     const inputs: UploaderInputs = {
       args: { ...createEmptyArgs() },
-      environment: {},
+      envs: {},
     }
     const spawnSync = td.replace(childProcess, 'spawnSync')
     await expect(providerLocal.getServiceParams(inputs)).rejects.toThrow()
@@ -106,7 +106,7 @@ describe('Local Params', () => {
   describe('getSlug()', () => {
     const inputs: UploaderInputs = {
       args: { ...createEmptyArgs() },
-      environment: {},
+      envs: {},
     }
 
     it('can get the slug from a git url', async () => {
diff --git a/test/providers/provider_teamcity.test.ts b/test/providers/provider_teamcity.test.ts
index 932ba11..eb65266 100644
--- a/test/providers/provider_teamcity.test.ts
+++ b/test/providers/provider_teamcity.test.ts
@@ -15,21 +15,21 @@ describe('TeamCity Params', () => {
     it('does not run without TeamCity env variable', () => {
       const inputs: UploaderInputs = {
         args: { ...createEmptyArgs() },
-        environment: {},
+        envs: {},
       }
-      const detected = providerTeamCity.detect(inputs.environment)
+      const detected = providerTeamCity.detect(inputs.envs)
       expect(detected).toBeFalsy()
     })
 
     it('does run with TeamCity env variable', () => {
       const inputs: UploaderInputs = {
         args: { ...createEmptyArgs() },
-        environment: {
+        envs: {
           CI: 'true',
           TEAMCITY_VERSION: 'true',
         },
       }
-      const detected = providerTeamCity.detect(inputs.environment)
+      const detected = providerTeamCity.detect(inputs.envs)
       expect(detected).toBeTruthy()
     })
   })
@@ -37,7 +37,7 @@ describe('TeamCity Params', () => {
   it('gets correct params', async () => {
     const inputs: UploaderInputs = {
       args: { ...createEmptyArgs() },
-      environment: {
+      envs: {
         CI: 'true',
         TEAMCITY_VERSION: 'true',
         BRANCH_NAME: 'main',
@@ -66,7 +66,7 @@ describe('TeamCity Params', () => {
   it('gets correct params and remote slug', async () => {
     const inputs: UploaderInputs = {
       args: { ...createEmptyArgs() },
-      environment: {
+      envs: {
         CI: 'true',
         TEAMCITY_VERSION: 'true',
         BRANCH_NAME: 'main',
@@ -104,7 +104,7 @@ describe('TeamCity Params', () => {
           slug: 'testOrg/testRepo',
         },
       },
-      environment: {
+      envs: {
         CI: 'true',
         TEAMCITY_VERSION: 'true',
         BRANCH_NAME: 'main',
diff --git a/test/providers/provider_template.test.ts b/test/providers/provider_template.test.ts
index 51024b1..1596266 100644
--- a/test/providers/provider_template.test.ts
+++ b/test/providers/provider_template.test.ts
@@ -17,7 +17,7 @@ describe('<Ci> Params', () => {
     it('does not run without <Ci> env variable', () => {
       const inputs: UploaderInputs = {
         args: { ...createEmptyArgs() },
-        environment: {},
+        envs: {},
       }
       /*
       const detected = provider<Ci>.detect(inputs.envs)
@@ -28,7 +28,7 @@ describe('<Ci> Params', () => {
     it('does not run without <Ci> env variable', () => {
       const inputs: UploaderInputs = {
         args: { ...createEmptyArgs() },
-        environment: {},
+        envs: {},
       }
       /*
       const detected = provider<Ci>.detect(inputs.envs)
@@ -41,7 +41,7 @@ describe('<Ci> Params', () => {
   it('gets the correct params on no env variables', async () => {
     const inputs: UploaderInputs = {
       args: { ...createEmptyArgs() },
-      environment: {},
+      envs: {},
     }
     const expected: IServiceParams = {
       branch: '',
@@ -63,7 +63,7 @@ describe('<Ci> Params', () => {
   it('gets the correct params on push', async () => {
     const inputs: UploaderInputs = {
       args: { ...createEmptyArgs() },
-      environment: {},
+      envs: {},
     }
     const expected: IServiceParams = {
       branch: '',
@@ -85,7 +85,7 @@ describe('<Ci> Params', () => {
   it('gets the correct params on pr', async () => {
     const inputs: UploaderInputs = {
       args: { ...createEmptyArgs() },
-      environment: {},
+      envs: {},
     }
     const expected: IServiceParams = {
       branch: '',
@@ -107,7 +107,7 @@ describe('<Ci> Params', () => {
   it('gets the correct params on overrides', async () => {
     const inputs: UploaderInputs = {
       args: { ...createEmptyArgs() },
-      environment: {},
+      envs: {},
     }
     const expected: IServiceParams = {
       branch: '',
diff --git a/test/providers/provider_travisci.test.ts b/test/providers/provider_travisci.test.ts
index 30d1599..243fcbe 100644
--- a/test/providers/provider_travisci.test.ts
+++ b/test/providers/provider_travisci.test.ts
@@ -13,33 +13,33 @@ describe('TravisCI Params', () => {
     it('does not run with Shipable env variable', () => {
       const inputs: UploaderInputs = {
         args: { ...createEmptyArgs() },
-        environment: {},
+        envs: {},
       }
-      let detected = providerTravisci.detect(inputs.environment)
+      let detected = providerTravisci.detect(inputs.envs)
       expect(detected).toBeFalsy()
 
-      inputs.environment.CI = 'true'
-      detected = providerTravisci.detect(inputs.environment)
+      inputs.envs.CI = 'true'
+      detected = providerTravisci.detect(inputs.envs)
       expect(detected).toBeFalsy()
 
-      inputs.environment.TRAVIS = 'true'
-      detected = providerTravisci.detect(inputs.environment)
+      inputs.envs.TRAVIS = 'true'
+      detected = providerTravisci.detect(inputs.envs)
       expect(detected).toBeTruthy()
 
-      inputs.environment.SHIPPABLE = 'true'
-      detected = providerTravisci.detect(inputs.environment)
+      inputs.envs.SHIPPABLE = 'true'
+      detected = providerTravisci.detect(inputs.envs)
       expect(detected).toBeFalsy()
     })
 
     it('does run with TravisCI env variable', () => {
       const inputs: UploaderInputs = {
         args: { ...createEmptyArgs() },
-        environment: {
+        envs: {
           CI: 'true',
           TRAVIS: 'true',
         },
       }
-      const detected = providerTravisci.detect(inputs.environment)
+      const detected = providerTravisci.detect(inputs.envs)
       expect(detected).toBeTruthy()
     })
   })
@@ -47,7 +47,7 @@ describe('TravisCI Params', () => {
   it('gets correct params on push', async () => {
     const inputs: UploaderInputs = {
       args: { ...createEmptyArgs() },
-      environment: {
+      envs: {
         CI: 'true',
         TRAVIS: 'true',
         TRAVIS_JOB_NUMBER: '1',
@@ -76,7 +76,7 @@ describe('TravisCI Params', () => {
   it('gets correct params on PR', async () => {
     const inputs: UploaderInputs = {
       args: { ...createEmptyArgs() },
-      environment: {
+      envs: {
         CI: 'true',
         TRAVIS: 'true',
         TRAVIS_BRANCH: 'branch',
@@ -107,7 +107,7 @@ describe('TravisCI Params', () => {
   it('gets correct params on PR with no pull request branch', async () => {
     const inputs: UploaderInputs = {
       args: { ...createEmptyArgs() },
-      environment: {
+      envs: {
         CI: 'true',
         TRAVIS: 'true',
         TRAVIS_BRANCH: 'branch',
@@ -146,7 +146,7 @@ describe('TravisCI Params', () => {
           slug: 'testOrg/testRepo',
         },
       },
-      environment: {
+      envs: {
         CI: 'true',
         TRAVIS: 'true',
       },
diff --git a/test/providers/provider_wercker.test.ts b/test/providers/provider_wercker.test.ts
index 8ddcaa1..2d73379 100644
--- a/test/providers/provider_wercker.test.ts
+++ b/test/providers/provider_wercker.test.ts
@@ -13,21 +13,21 @@ describe('Wercker CI Params', () => {
     it('does not run without Wercker CI env variable', () => {
       const inputs: UploaderInputs = {
         args: { ...createEmptyArgs() },
-        environment: {},
+        envs: {},
       }
-      const detected = providerWercker.detect(inputs.environment)
+      const detected = providerWercker.detect(inputs.envs)
       expect(detected).toBeFalsy()
     })
 
     it('does run with Wercker CI env variable', () => {
       const inputs: UploaderInputs = {
         args: { ...createEmptyArgs() },
-        environment: {
+        envs: {
           CI: 'true',
           WERCKER_MAIN_PIPELINE_STARTED: 'true',
         },
       }
-      const detected = providerWercker.detect(inputs.environment)
+      const detected = providerWercker.detect(inputs.envs)
       expect(detected).toBeTruthy()
     })
   })
@@ -35,7 +35,7 @@ describe('Wercker CI Params', () => {
   it('gets correct params on push', async () => {
     const inputs: UploaderInputs = {
       args: { ...createEmptyArgs() },
-      environment: {
+      envs: {
         CI: 'true',
         WERCKER_MAIN_PIPELINE_STARTED: '1',
         WERCKER_GIT_BRANCH: 'main',
@@ -71,7 +71,7 @@ describe('Wercker CI Params', () => {
           slug: 'testOrg/testRepo',
         },
       },
-      environment: {
+      envs: {
         CI: 'true',
         WERCKER_MAIN_PIPELINE_STARTED: '1',
         WERCKER_GIT_BRANCH: 'main',
diff --git a/test/providers/provider_woodpecker.test.ts b/test/providers/provider_woodpecker.test.ts
index a73cfcf..c2a5111 100644
--- a/test/providers/provider_woodpecker.test.ts
+++ b/test/providers/provider_woodpecker.test.ts
@@ -13,20 +13,20 @@ describe('Woodpecker Params', () => {
     it('does not run without Woodpecker env variable', () => {
       const inputs: UploaderInputs = {
         args: { ...createEmptyArgs() },
-        environment: {},
+        envs: {},
       }
-      const detected = providerWoodpecker.detect(inputs.environment)
+      const detected = providerWoodpecker.detect(inputs.envs)
       expect(detected).toBeFalsy()
     })
 
     it('does run with Woodpecker env variable', () => {
       const inputs: UploaderInputs = {
         args: { ...createEmptyArgs() },
-        environment: {
+        envs: {
           CI: 'woodpecker',
         },
       }
-      const detected = providerWoodpecker.detect(inputs.environment)
+      const detected = providerWoodpecker.detect(inputs.envs)
       expect(detected).toBeTruthy()
     })
   })
@@ -34,7 +34,7 @@ describe('Woodpecker Params', () => {
   it('gets correct params', async () => {
     const inputs: UploaderInputs = {
       args: { ...createEmptyArgs() },
-      environment: {
+      envs: {
         CI: 'woodpecker',
         CI_COMMIT_BRANCH: 'master',
         CI_COMMIT_SHA: 'testingsha',
@@ -61,7 +61,7 @@ describe('Woodpecker Params', () => {
   it('gets correct params for pull request', async () => {
     const inputs: UploaderInputs = {
       args: { ...createEmptyArgs() },
-      environment: {
+      envs: {
         CI: 'woodpecker',
         CI_COMMIT_BRANCH: 'master',
         CI_COMMIT_SOURCE_BRANCH: 'new-feature',
diff --git a/test/proxy.test.ts b/test/proxy.test.ts
new file mode 100644
index 0000000..0edca79
--- /dev/null
+++ b/test/proxy.test.ts
@@ -0,0 +1,62 @@
+import { IncomingHttpHeaders } from "undici/types/header.js"
+import { addProxyHeaders } from "../src/helpers/proxy"
+import { UploaderEnvs } from "../src/types"
+
+describe('addProxyHeaders', () => {
+    it('should not return an Authorization header if PROXY_BASIC_USER and PROXY_BASIC_PASS are not set', () => {
+      // arrange
+      const envs: UploaderEnvs = {}
+      const headers: IncomingHttpHeaders = {}
+  
+      // act
+      const headersResult = addProxyHeaders(envs, headers)
+  
+      // assert
+      expect(headersResult['Authorization']).not.toBeDefined()
+    })
+  
+    it('should not return an Authorization header if only PROXY_BASIC_USER is set', () => {
+      // arrange
+      const envs: UploaderEnvs = {
+        PROXY_BASIC_USER: "testUser"
+      }
+      const headers: IncomingHttpHeaders = {}
+  
+      // act
+      const headersResult = addProxyHeaders(envs, headers)
+  
+      // assert
+      expect(headersResult['Authorization']).not.toBeDefined()
+    })
+  
+    it('should not return an Authorization header if only PROXY_BASIC_PASS is set', () => {
+      // arrange
+      const envs: UploaderEnvs = {
+        PROXY_BASIC_PASS: "testPass"
+      }
+      const headers: IncomingHttpHeaders = {}
+  
+      // act
+      const headersResult = addProxyHeaders(envs, headers)
+  
+      // assert
+      expect(headersResult['Authorization']).not.toBeDefined()
+    })
+  
+    it('should return an Authorization header if both PROXY_BASIC_PASS is set', () => {
+      // arrange
+      const envs: UploaderEnvs = {
+        PROXY_BASIC_USER: "testUser",
+        PROXY_BASIC_PASS: "testPass"
+      }
+      const headers: IncomingHttpHeaders = {}
+      const authString = `Basic ${Buffer.from(`${envs.PROXY_BASIC_USER}:${envs.PROXY_BASIC_PASS}`).toString("base64")}`
+  
+      // act
+      const headersResult = addProxyHeaders(envs, headers)
+  
+      // assert
+      expect(headersResult['Authorization']).toEqual(authString)
+    })
+  })
+  
\ No newline at end of file