├── .github ├── actionlint.yml ├── dependabot.yml └── workflows │ ├── draft-release.yml │ ├── integration.yml │ ├── publish.yml │ ├── release.yml │ └── unit.yml ├── .gitignore ├── .prettierrc.js ├── CHANGELOG.md ├── CODEOWNERS ├── LICENSE ├── README.md ├── action.yml ├── dist └── main │ ├── 101.index.js │ ├── 669.index.js │ ├── 816.index.js │ └── index.js ├── eslint.config.mjs ├── package-lock.json ├── package.json ├── src ├── client.ts ├── main.ts └── reference.ts ├── tests └── reference.test.ts └── tsconfig.json /.github/actionlint.yml: -------------------------------------------------------------------------------- 1 | paths: 2 | '**/*.yml': 3 | ignore: 4 | # https://github.com/rhysd/actionlint/issues/559 5 | - 'invalid runner name "node24"' 6 | 7 | '.github/workflows/integration.yml': 8 | ignore: 9 | - 'property ".+" is not defined in object type' 10 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: 'npm' 4 | directory: '/' 5 | rebase-strategy: 'disabled' 6 | schedule: 7 | interval: 'daily' 8 | commit-message: 9 | prefix: 'security: ' 10 | open-pull-requests-limit: 0 # only check security updates 11 | -------------------------------------------------------------------------------- /.github/workflows/draft-release.yml: -------------------------------------------------------------------------------- 1 | name: 'Draft release' 2 | 3 | on: 4 | workflow_dispatch: 5 | inputs: 6 | version_strategy: 7 | description: 'Version strategy: The strategy to used to update the version based on semantic versioning (more info at https://semver.org/).' 8 | required: true 9 | default: 'patch' 10 | type: 'choice' 11 | options: 12 | - 'major' 13 | - 'minor' 14 | - 'patch' 15 | 16 | jobs: 17 | draft-release: 18 | uses: 'google-github-actions/.github/.github/workflows/draft-release.yml@v3' # ratchet:exclude 19 | permissions: 20 | contents: 'read' 21 | pull-requests: 'write' 22 | with: 23 | version_strategy: '${{ github.event.inputs.version_strategy }}' 24 | secrets: 25 | ACTIONS_BOT_TOKEN: '${{ secrets.ACTIONS_BOT_TOKEN }}' 26 | -------------------------------------------------------------------------------- /.github/workflows/integration.yml: -------------------------------------------------------------------------------- 1 | name: 'Integration' 2 | 3 | on: 4 | push: 5 | branches: 6 | - 'main' 7 | - 'release/**/*' 8 | pull_request: 9 | branches: 10 | - 'main' 11 | - 'release/**/*' 12 | workflow_dispatch: 13 | 14 | concurrency: 15 | group: '${{ github.workflow }}-${{ github.head_ref || github.ref }}' 16 | cancel-in-progress: true 17 | 18 | permissions: 19 | contents: 'read' 20 | id-token: 'write' 21 | 22 | defaults: 23 | run: 24 | shell: 'bash' 25 | 26 | jobs: 27 | integration: 28 | runs-on: 'ubuntu-latest' 29 | 30 | steps: 31 | - uses: 'actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683' # ratchet:actions/checkout@v4 32 | 33 | - uses: 'actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020' # ratchet:actions/setup-node@v4 34 | with: 35 | node-version-file: 'package.json' 36 | 37 | - name: 'npm build' 38 | run: 'npm ci && npm run build' 39 | 40 | - uses: 'google-github-actions/auth@v3' # ratchet:exclude 41 | with: 42 | workload_identity_provider: '${{ vars.WIF_PROVIDER_NAME }}' 43 | service_account: '${{ vars.SERVICE_ACCOUNT_EMAIL }}' 44 | 45 | - id: 'secrets' 46 | name: 'secrets' 47 | uses: './' 48 | with: 49 | secrets: |- 50 | token:${{ vars.SECRET_NAME }} 51 | password:${{ vars.SECRET_VERSION_NAME }} 52 | regional:${{ vars.REGIONAL_SECRET_NAME }} 53 | 54 | - name: 'outputs' 55 | env: 56 | TOKEN: '${{ steps.secrets.outputs.token }}' 57 | PASSWORD: '${{ steps.secrets.outputs.password }}' 58 | REGIONAL: '${{ steps.secrets.outputs.regional }}' 59 | run: |- 60 | echo '${TOKEN}${PASSWORD}${REGIONAL}' 61 | 62 | - id: 'secrets-encoded' 63 | name: 'secrets-encoded' 64 | uses: './' 65 | with: 66 | encoding: 'hex' 67 | secrets: |- 68 | token:${{ vars.SECRET_NAME }} 69 | password:${{ vars.SECRET_VERSION_NAME }} 70 | regional:${{ vars.REGIONAL_SECRET_NAME }} 71 | 72 | - name: 'outputs-encoded' 73 | env: 74 | TOKEN: '${{ steps.secrets-encoded.outputs.token }}' 75 | PASSWORD: '${{ steps.secrets-encoded.outputs.password }}' 76 | REGIONAL: '${{ steps.secrets-encoded.outputs.regional }}' 77 | run: |- 78 | echo '${TOKEN}${PASSWORD}${REGIONAL}' 79 | -------------------------------------------------------------------------------- /.github/workflows/publish.yml: -------------------------------------------------------------------------------- 1 | name: 'Publish immutable action version' 2 | 3 | on: 4 | workflow_dispatch: 5 | release: 6 | types: 7 | - 'published' 8 | 9 | jobs: 10 | publish: 11 | runs-on: 'ubuntu-latest' 12 | permissions: 13 | contents: 'read' 14 | id-token: 'write' 15 | packages: 'write' 16 | 17 | steps: 18 | - name: 'Checkout' 19 | uses: 'actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683' # ratchet:actions/checkout@v4 20 | 21 | - name: 'Publish' 22 | id: 'publish' 23 | uses: 'actions/publish-immutable-action@4bc8754ffc40f27910afb20287dbbbb675a4e978' # ratchet:actions/publish-immutable-action@v0.0.4 24 | with: 25 | github-token: '${{ secrets.GITHUB_TOKEN }}' 26 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: 'Release' 2 | 3 | on: 4 | push: 5 | branches: 6 | - 'main' 7 | - 'release/**/*' 8 | 9 | jobs: 10 | release: 11 | uses: 'google-github-actions/.github/.github/workflows/release.yml@v3' # ratchet:exclude 12 | permissions: 13 | attestations: 'write' 14 | contents: 'write' 15 | packages: 'write' 16 | secrets: 17 | ACTIONS_BOT_TOKEN: '${{ secrets.ACTIONS_BOT_TOKEN }}' 18 | -------------------------------------------------------------------------------- /.github/workflows/unit.yml: -------------------------------------------------------------------------------- 1 | name: 'Unit' 2 | 3 | on: 4 | push: 5 | branches: 6 | - 'main' 7 | - 'release/**/*' 8 | pull_request: 9 | branches: 10 | - 'main' 11 | - 'release/**/*' 12 | workflow_dispatch: 13 | 14 | concurrency: 15 | group: '${{ github.workflow }}-${{ github.head_ref || github.ref }}' 16 | cancel-in-progress: true 17 | 18 | permissions: 19 | contents: 'read' 20 | statuses: 'write' 21 | 22 | defaults: 23 | run: 24 | shell: 'bash' 25 | 26 | jobs: 27 | unit: 28 | strategy: 29 | fail-fast: false 30 | matrix: 31 | os: 32 | - 'ubuntu-latest' 33 | - 'windows-latest' 34 | - 'macos-latest' 35 | runs-on: '${{ matrix.os }}' 36 | 37 | steps: 38 | - uses: 'actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683' # ratchet:actions/checkout@v4 39 | 40 | - uses: 'actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020' # ratchet:actions/setup-node@v4 41 | with: 42 | node-version-file: 'package.json' 43 | 44 | - name: 'npm build' 45 | run: 'npm ci && npm run build' 46 | 47 | - name: 'npm test' 48 | run: 'npm run test' 49 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | runner/ 3 | 4 | # Rest of the file pulled from https://github.com/github/gitignore/blob/main/Node.gitignore 5 | # Logs 6 | logs 7 | *.log 8 | npm-debug.log* 9 | yarn-debug.log* 10 | yarn-error.log* 11 | lerna-debug.log* 12 | 13 | # Diagnostic reports (https://nodejs.org/api/report.html) 14 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 15 | 16 | # Runtime data 17 | pids 18 | *.pid 19 | *.seed 20 | *.pid.lock 21 | 22 | # Directory for instrumented libs generated by jscoverage/JSCover 23 | lib-cov 24 | 25 | # Coverage directory used by tools like istanbul 26 | coverage 27 | *.lcov 28 | 29 | # TypeScript v1 declaration files 30 | typings/ 31 | 32 | # TypeScript cache 33 | *.tsbuildinfo 34 | 35 | # Optional npm cache directory 36 | .npm 37 | 38 | # Optional eslint cache 39 | .eslintcache 40 | 41 | # Optional REPL history 42 | .node_repl_history 43 | 44 | # Output of 'npm pack' 45 | *.tgz 46 | -------------------------------------------------------------------------------- /.prettierrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | arrowParens: 'always', 3 | bracketSpacing: true, 4 | endOfLine: 'auto', 5 | jsxSingleQuote: true, 6 | printWidth: 100, 7 | quoteProps: 'consistent', 8 | semi: true, 9 | singleQuote: true, 10 | tabWidth: 2, 11 | trailingComma: 'all', 12 | useTabs: false, 13 | }; 14 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | Changelogs for each release are located on the [releases page](https://github.com/google-github-actions/get-secretmanager-secrets/releases). 4 | 5 | -------------------------------------------------------------------------------- /CODEOWNERS: -------------------------------------------------------------------------------- 1 | * @google-github-actions/maintainers 2 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "{}" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright {yyyy} {name of copyright owner} 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # get-secretmanager-secrets 2 | 3 | This action fetches secrets from [Secret Manager][sm] and makes them available 4 | to later build steps via outputs. This is useful when you want Secret Manager to 5 | be the source of truth for secrets in your organization, but you need access to 6 | those secrets in build steps. 7 | 8 | Secrets that are successfully fetched are set as output variables and can be 9 | used in subsequent actions. After a secret is accessed, its value is added to 10 | the mask of the build to reduce the chance of it being printed or logged by 11 | later steps. 12 | 13 | **This is not an officially supported Google product, and it is not covered by a 14 | Google Cloud support contract. To report bugs or request features in a Google 15 | Cloud product, please contact [Google Cloud 16 | support](https://cloud.google.com/support).** 17 | 18 | 19 | ## Prerequisites 20 | 21 | - This action requires Google Cloud credentials that are authorized to access 22 | the secrets being requested. See [Authorization](#authorization) for more 23 | information. 24 | 25 | - This action runs using Node 20. If you are using self-hosted GitHub Actions 26 | runners, you must use a [runner 27 | version](https://github.com/actions/virtual-environments) that supports this 28 | version or newer. 29 | 30 | ## Usage 31 | 32 | ```yaml 33 | jobs: 34 | job_id: 35 | permissions: 36 | contents: 'read' 37 | id-token: 'write' 38 | 39 | steps: 40 | - id: 'auth' 41 | uses: 'google-github-actions/auth@v3' 42 | with: 43 | workload_identity_provider: 'projects/123456789/locations/global/workloadIdentityPools/my-pool/providers/my-provider' 44 | service_account: 'my-service-account@my-project.iam.gserviceaccount.com' 45 | 46 | - id: 'secrets' 47 | uses: 'google-github-actions/get-secretmanager-secrets@v3' 48 | with: 49 | secrets: |- 50 | token:my-project/docker-registry-token 51 | 52 | # Example of using the output 53 | - id: 'publish' 54 | uses: 'foo/bar@v1' 55 | env: 56 | TOKEN: '${{ steps.secrets.outputs.token }}' 57 | ``` 58 | 59 | 60 | ## Inputs 61 | 62 | 63 | 64 | - secrets: _(Required)_ List of secrets to access and inject into the environment. These are 65 | comma-separated or newline-separated `OUTPUTNAME:SECRET`. Output names or 66 | secret names that contain separators must be escaped with a backslash 67 | (e.g. `\,` or `\\n`) unless quoted. Any leading or trailing whitespace is 68 | trimmed unless values are quoted. 69 | 70 | ```yaml 71 | secrets: |- 72 | output1:my-project/my-secret1 73 | output2:my-project/my-secret2 74 | ``` 75 | 76 | Secrets can be referenced using the following formats: 77 | 78 | ```text 79 | # Long form 80 | projects//secrets//versions/ 81 | 82 | # Long form - "latest" version 83 | projects//secrets/ 84 | 85 | # Short form 86 | // 87 | 88 | # Short form - "latest" version 89 | / 90 | ``` 91 | 92 | - min_mask_length: _(Optional, default: `4`)_ Minimum line length for a secret to be masked. Extremely short secrets 93 | (e.g. `{` or `a`) can make GitHub Actions log output unreadable. This is 94 | especially important for multi-line secrets, since each line of the secret 95 | is masked independently. 96 | 97 | - export_to_environment: _(Optional)_ Make the fetched secrets additionally available as environment variables. 98 | 99 | - encoding: _(Optional, default: `utf8`)_ Encoding in which secrets will be exported into outputs (and environment 100 | variables if `export_to_environment` is true). For secrets that cannot be 101 | represented in text, such as encryption key bytes, choose an encoding that 102 | has a safe character such as `base64` or `hex`. For more information about 103 | available encoding types, please see the [Node.js Buffer and character 104 | encodings](https://nodejs.org/docs/latest/api/buffer.html#buffers-and-character-encodings). 105 | 106 | - universe: _(Optional, default: `googleapis.com`)_ The Google Cloud universe to use for constructing API endpoints. The 107 | default universe is "googleapis.com", which corresponds to 108 | https://cloud.google.com. Trusted Partner Cloud and Google Distributed 109 | Hosted Cloud should set this to their universe address. 110 | 111 | 112 | 113 | 114 | 115 | ## Outputs 116 | 117 | 118 | 119 | - secrets: Each secret is prefixed with an output name. The secret's resolved access 120 | value will be available at that output in future build steps. For example: 121 | 122 | ```yaml 123 | jobs: 124 | job_id: 125 | steps: 126 | - id: 'secrets' 127 | uses: 'google-github-actions/get-secretmanager-secrets@v3' 128 | with: 129 | secrets: |- 130 | token:my-project/docker-registry-token 131 | ``` 132 | 133 | will be available in future steps as the output: 134 | 135 | ```text 136 | steps.secrets.outputs.token 137 | ``` 138 | 139 | 140 | 141 | 142 | 143 | ## Authorization 144 | 145 | There are a few ways to authenticate this action. The caller must have 146 | permissions to access the secrets being requested. 147 | 148 | ### Via google-github-actions/auth 149 | 150 | Use [google-github-actions/auth](https://github.com/google-github-actions/auth) 151 | to authenticate the action. You can use [Workload Identity Federation][wif] or 152 | traditional [Service Account Key JSON][sa] authentication. 153 | 154 | ```yaml 155 | jobs: 156 | job_id: 157 | permissions: 158 | contents: 'read' 159 | id-token: 'write' 160 | 161 | steps: 162 | - uses: 'actions/checkout@v4' 163 | 164 | - id: 'auth' 165 | uses: 'google-github-actions/auth@v3' 166 | with: 167 | workload_identity_provider: 'projects/123456789/locations/global/workloadIdentityPools/my-pool/providers/my-provider' 168 | service_account: 'my-service-account@my-project.iam.gserviceaccount.com' 169 | 170 | - id: 'secrets' 171 | uses: 'google-github-actions/get-secretmanager-secrets@v3' 172 | ``` 173 | 174 | ### Via Application Default Credentials 175 | 176 | If you are hosting your own runners, **and** those runners are on Google Cloud, 177 | you can leverage the Application Default Credentials of the instance. This will 178 | authenticate requests as the service account attached to the instance. **This 179 | only works using a custom runner hosted on GCP.** 180 | 181 | ```yaml 182 | jobs: 183 | job_id: 184 | steps: 185 | - id: 'secrets' 186 | uses: 'google-github-actions/get-secretmanager-secrets@v3' 187 | ``` 188 | 189 | The action will automatically detect and use the Application Default 190 | Credentials. 191 | 192 | 193 | [sm]: https://cloud.google.com/secret-manager 194 | [wif]: https://cloud.google.com/iam/docs/workload-identity-federation 195 | [sa]: https://cloud.google.com/iam/docs/creating-managing-service-accounts 196 | [gh-runners]: https://help.github.com/en/actions/hosting-your-own-runners/about-self-hosted-runners 197 | [gh-secret]: https://help.github.com/en/actions/configuring-and-managing-workflows/creating-and-storing-encrypted-secrets 198 | [setup-gcloud]: https://github.com/google-github-actions/setup-gcloud 199 | -------------------------------------------------------------------------------- /action.yml: -------------------------------------------------------------------------------- 1 | # Copyright 2020 Google LLC 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # http://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | # See the License for the specific language governing permissions and 13 | # limitations under the License. 14 | 15 | name: 'Get Secret Manager secrets' 16 | author: 'Google LLC' 17 | description: |- 18 | Get secrets from Google Secret Manager and make their results available as 19 | output variables. 20 | 21 | inputs: 22 | secrets: 23 | description: |- 24 | List of secrets to access and inject into the environment. These are 25 | comma-separated or newline-separated `OUTPUTNAME:SECRET`. Output names or 26 | secret names that contain separators must be escaped with a backslash 27 | (e.g. `\,` or `\\n`) unless quoted. Any leading or trailing whitespace is 28 | trimmed unless values are quoted. 29 | 30 | ```yaml 31 | secrets: |- 32 | output1:my-project/my-secret1 33 | output2:my-project/my-secret2 34 | ``` 35 | 36 | Secrets can be referenced using the following formats: 37 | 38 | ```text 39 | # Long form 40 | projects//secrets//versions/ 41 | 42 | # Long form - "latest" version 43 | projects//secrets/ 44 | 45 | # Short form 46 | // 47 | 48 | # Short form - "latest" version 49 | / 50 | ``` 51 | required: true 52 | 53 | min_mask_length: 54 | description: |- 55 | Minimum line length for a secret to be masked. Extremely short secrets 56 | (e.g. `{` or `a`) can make GitHub Actions log output unreadable. This is 57 | especially important for multi-line secrets, since each line of the secret 58 | is masked independently. 59 | required: false 60 | default: '4' 61 | 62 | export_to_environment: 63 | description: |- 64 | Make the fetched secrets additionally available as environment variables. 65 | required: false 66 | default: false 67 | 68 | encoding: 69 | description: |- 70 | Encoding in which secrets will be exported into outputs (and environment 71 | variables if `export_to_environment` is true). For secrets that cannot be 72 | represented in text, such as encryption key bytes, choose an encoding that 73 | has a safe character such as `base64` or `hex`. For more information about 74 | available encoding types, please see the [Node.js Buffer and character 75 | encodings](https://nodejs.org/docs/latest/api/buffer.html#buffers-and-character-encodings). 76 | required: false 77 | default: 'utf8' 78 | 79 | universe: 80 | description: |- 81 | The Google Cloud universe to use for constructing API endpoints. The 82 | default universe is "googleapis.com", which corresponds to 83 | https://cloud.google.com. Trusted Partner Cloud and Google Distributed 84 | Hosted Cloud should set this to their universe address. 85 | required: false 86 | default: 'googleapis.com' 87 | 88 | outputs: 89 | secrets: 90 | description: |- 91 | Each secret is prefixed with an output name. The secret's resolved access 92 | value will be available at that output in future build steps. For example: 93 | 94 | ```yaml 95 | jobs: 96 | job_id: 97 | steps: 98 | - id: 'secrets' 99 | uses: 'google-github-actions/get-secretmanager-secrets@v3' 100 | with: 101 | secrets: |- 102 | token:my-project/docker-registry-token 103 | ``` 104 | 105 | will be available in future steps as the output: 106 | 107 | ```text 108 | steps.secrets.outputs.token 109 | ``` 110 | 111 | branding: 112 | icon: 'lock' 113 | color: 'blue' 114 | 115 | runs: 116 | using: 'node24' 117 | main: 'dist/main/index.js' 118 | -------------------------------------------------------------------------------- /dist/main/101.index.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | exports.id = 101; 3 | exports.ids = [101]; 4 | exports.modules = { 5 | 6 | /***/ 9101: 7 | /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { 8 | 9 | /* harmony export */ __webpack_require__.d(__webpack_exports__, { 10 | /* harmony export */ toFormData: () => (/* binding */ toFormData) 11 | /* harmony export */ }); 12 | /* harmony import */ var fetch_blob_from_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(995); 13 | /* harmony import */ var formdata_polyfill_esm_min_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(3018); 14 | 15 | 16 | 17 | let s = 0; 18 | const S = { 19 | START_BOUNDARY: s++, 20 | HEADER_FIELD_START: s++, 21 | HEADER_FIELD: s++, 22 | HEADER_VALUE_START: s++, 23 | HEADER_VALUE: s++, 24 | HEADER_VALUE_ALMOST_DONE: s++, 25 | HEADERS_ALMOST_DONE: s++, 26 | PART_DATA_START: s++, 27 | PART_DATA: s++, 28 | END: s++ 29 | }; 30 | 31 | let f = 1; 32 | const F = { 33 | PART_BOUNDARY: f, 34 | LAST_BOUNDARY: f *= 2 35 | }; 36 | 37 | const LF = 10; 38 | const CR = 13; 39 | const SPACE = 32; 40 | const HYPHEN = 45; 41 | const COLON = 58; 42 | const A = 97; 43 | const Z = 122; 44 | 45 | const lower = c => c | 0x20; 46 | 47 | const noop = () => {}; 48 | 49 | class MultipartParser { 50 | /** 51 | * @param {string} boundary 52 | */ 53 | constructor(boundary) { 54 | this.index = 0; 55 | this.flags = 0; 56 | 57 | this.onHeaderEnd = noop; 58 | this.onHeaderField = noop; 59 | this.onHeadersEnd = noop; 60 | this.onHeaderValue = noop; 61 | this.onPartBegin = noop; 62 | this.onPartData = noop; 63 | this.onPartEnd = noop; 64 | 65 | this.boundaryChars = {}; 66 | 67 | boundary = '\r\n--' + boundary; 68 | const ui8a = new Uint8Array(boundary.length); 69 | for (let i = 0; i < boundary.length; i++) { 70 | ui8a[i] = boundary.charCodeAt(i); 71 | this.boundaryChars[ui8a[i]] = true; 72 | } 73 | 74 | this.boundary = ui8a; 75 | this.lookbehind = new Uint8Array(this.boundary.length + 8); 76 | this.state = S.START_BOUNDARY; 77 | } 78 | 79 | /** 80 | * @param {Uint8Array} data 81 | */ 82 | write(data) { 83 | let i = 0; 84 | const length_ = data.length; 85 | let previousIndex = this.index; 86 | let {lookbehind, boundary, boundaryChars, index, state, flags} = this; 87 | const boundaryLength = this.boundary.length; 88 | const boundaryEnd = boundaryLength - 1; 89 | const bufferLength = data.length; 90 | let c; 91 | let cl; 92 | 93 | const mark = name => { 94 | this[name + 'Mark'] = i; 95 | }; 96 | 97 | const clear = name => { 98 | delete this[name + 'Mark']; 99 | }; 100 | 101 | const callback = (callbackSymbol, start, end, ui8a) => { 102 | if (start === undefined || start !== end) { 103 | this[callbackSymbol](ui8a && ui8a.subarray(start, end)); 104 | } 105 | }; 106 | 107 | const dataCallback = (name, clear) => { 108 | const markSymbol = name + 'Mark'; 109 | if (!(markSymbol in this)) { 110 | return; 111 | } 112 | 113 | if (clear) { 114 | callback(name, this[markSymbol], i, data); 115 | delete this[markSymbol]; 116 | } else { 117 | callback(name, this[markSymbol], data.length, data); 118 | this[markSymbol] = 0; 119 | } 120 | }; 121 | 122 | for (i = 0; i < length_; i++) { 123 | c = data[i]; 124 | 125 | switch (state) { 126 | case S.START_BOUNDARY: 127 | if (index === boundary.length - 2) { 128 | if (c === HYPHEN) { 129 | flags |= F.LAST_BOUNDARY; 130 | } else if (c !== CR) { 131 | return; 132 | } 133 | 134 | index++; 135 | break; 136 | } else if (index - 1 === boundary.length - 2) { 137 | if (flags & F.LAST_BOUNDARY && c === HYPHEN) { 138 | state = S.END; 139 | flags = 0; 140 | } else if (!(flags & F.LAST_BOUNDARY) && c === LF) { 141 | index = 0; 142 | callback('onPartBegin'); 143 | state = S.HEADER_FIELD_START; 144 | } else { 145 | return; 146 | } 147 | 148 | break; 149 | } 150 | 151 | if (c !== boundary[index + 2]) { 152 | index = -2; 153 | } 154 | 155 | if (c === boundary[index + 2]) { 156 | index++; 157 | } 158 | 159 | break; 160 | case S.HEADER_FIELD_START: 161 | state = S.HEADER_FIELD; 162 | mark('onHeaderField'); 163 | index = 0; 164 | // falls through 165 | case S.HEADER_FIELD: 166 | if (c === CR) { 167 | clear('onHeaderField'); 168 | state = S.HEADERS_ALMOST_DONE; 169 | break; 170 | } 171 | 172 | index++; 173 | if (c === HYPHEN) { 174 | break; 175 | } 176 | 177 | if (c === COLON) { 178 | if (index === 1) { 179 | // empty header field 180 | return; 181 | } 182 | 183 | dataCallback('onHeaderField', true); 184 | state = S.HEADER_VALUE_START; 185 | break; 186 | } 187 | 188 | cl = lower(c); 189 | if (cl < A || cl > Z) { 190 | return; 191 | } 192 | 193 | break; 194 | case S.HEADER_VALUE_START: 195 | if (c === SPACE) { 196 | break; 197 | } 198 | 199 | mark('onHeaderValue'); 200 | state = S.HEADER_VALUE; 201 | // falls through 202 | case S.HEADER_VALUE: 203 | if (c === CR) { 204 | dataCallback('onHeaderValue', true); 205 | callback('onHeaderEnd'); 206 | state = S.HEADER_VALUE_ALMOST_DONE; 207 | } 208 | 209 | break; 210 | case S.HEADER_VALUE_ALMOST_DONE: 211 | if (c !== LF) { 212 | return; 213 | } 214 | 215 | state = S.HEADER_FIELD_START; 216 | break; 217 | case S.HEADERS_ALMOST_DONE: 218 | if (c !== LF) { 219 | return; 220 | } 221 | 222 | callback('onHeadersEnd'); 223 | state = S.PART_DATA_START; 224 | break; 225 | case S.PART_DATA_START: 226 | state = S.PART_DATA; 227 | mark('onPartData'); 228 | // falls through 229 | case S.PART_DATA: 230 | previousIndex = index; 231 | 232 | if (index === 0) { 233 | // boyer-moore derrived algorithm to safely skip non-boundary data 234 | i += boundaryEnd; 235 | while (i < bufferLength && !(data[i] in boundaryChars)) { 236 | i += boundaryLength; 237 | } 238 | 239 | i -= boundaryEnd; 240 | c = data[i]; 241 | } 242 | 243 | if (index < boundary.length) { 244 | if (boundary[index] === c) { 245 | if (index === 0) { 246 | dataCallback('onPartData', true); 247 | } 248 | 249 | index++; 250 | } else { 251 | index = 0; 252 | } 253 | } else if (index === boundary.length) { 254 | index++; 255 | if (c === CR) { 256 | // CR = part boundary 257 | flags |= F.PART_BOUNDARY; 258 | } else if (c === HYPHEN) { 259 | // HYPHEN = end boundary 260 | flags |= F.LAST_BOUNDARY; 261 | } else { 262 | index = 0; 263 | } 264 | } else if (index - 1 === boundary.length) { 265 | if (flags & F.PART_BOUNDARY) { 266 | index = 0; 267 | if (c === LF) { 268 | // unset the PART_BOUNDARY flag 269 | flags &= ~F.PART_BOUNDARY; 270 | callback('onPartEnd'); 271 | callback('onPartBegin'); 272 | state = S.HEADER_FIELD_START; 273 | break; 274 | } 275 | } else if (flags & F.LAST_BOUNDARY) { 276 | if (c === HYPHEN) { 277 | callback('onPartEnd'); 278 | state = S.END; 279 | flags = 0; 280 | } else { 281 | index = 0; 282 | } 283 | } else { 284 | index = 0; 285 | } 286 | } 287 | 288 | if (index > 0) { 289 | // when matching a possible boundary, keep a lookbehind reference 290 | // in case it turns out to be a false lead 291 | lookbehind[index - 1] = c; 292 | } else if (previousIndex > 0) { 293 | // if our boundary turned out to be rubbish, the captured lookbehind 294 | // belongs to partData 295 | const _lookbehind = new Uint8Array(lookbehind.buffer, lookbehind.byteOffset, lookbehind.byteLength); 296 | callback('onPartData', 0, previousIndex, _lookbehind); 297 | previousIndex = 0; 298 | mark('onPartData'); 299 | 300 | // reconsider the current character even so it interrupted the sequence 301 | // it could be the beginning of a new sequence 302 | i--; 303 | } 304 | 305 | break; 306 | case S.END: 307 | break; 308 | default: 309 | throw new Error(`Unexpected state entered: ${state}`); 310 | } 311 | } 312 | 313 | dataCallback('onHeaderField'); 314 | dataCallback('onHeaderValue'); 315 | dataCallback('onPartData'); 316 | 317 | // Update properties for the next call 318 | this.index = index; 319 | this.state = state; 320 | this.flags = flags; 321 | } 322 | 323 | end() { 324 | if ((this.state === S.HEADER_FIELD_START && this.index === 0) || 325 | (this.state === S.PART_DATA && this.index === this.boundary.length)) { 326 | this.onPartEnd(); 327 | } else if (this.state !== S.END) { 328 | throw new Error('MultipartParser.end(): stream ended unexpectedly'); 329 | } 330 | } 331 | } 332 | 333 | function _fileName(headerValue) { 334 | // matches either a quoted-string or a token (RFC 2616 section 19.5.1) 335 | const m = headerValue.match(/\bfilename=("(.*?)"|([^()<>@,;:\\"/[\]?={}\s\t]+))($|;\s)/i); 336 | if (!m) { 337 | return; 338 | } 339 | 340 | const match = m[2] || m[3] || ''; 341 | let filename = match.slice(match.lastIndexOf('\\') + 1); 342 | filename = filename.replace(/%22/g, '"'); 343 | filename = filename.replace(/&#(\d{4});/g, (m, code) => { 344 | return String.fromCharCode(code); 345 | }); 346 | return filename; 347 | } 348 | 349 | async function toFormData(Body, ct) { 350 | if (!/multipart/i.test(ct)) { 351 | throw new TypeError('Failed to fetch'); 352 | } 353 | 354 | const m = ct.match(/boundary=(?:"([^"]+)"|([^;]+))/i); 355 | 356 | if (!m) { 357 | throw new TypeError('no or bad content-type header, no multipart boundary'); 358 | } 359 | 360 | const parser = new MultipartParser(m[1] || m[2]); 361 | 362 | let headerField; 363 | let headerValue; 364 | let entryValue; 365 | let entryName; 366 | let contentType; 367 | let filename; 368 | const entryChunks = []; 369 | const formData = new formdata_polyfill_esm_min_js__WEBPACK_IMPORTED_MODULE_1__/* .FormData */ .fS(); 370 | 371 | const onPartData = ui8a => { 372 | entryValue += decoder.decode(ui8a, {stream: true}); 373 | }; 374 | 375 | const appendToFile = ui8a => { 376 | entryChunks.push(ui8a); 377 | }; 378 | 379 | const appendFileToFormData = () => { 380 | const file = new fetch_blob_from_js__WEBPACK_IMPORTED_MODULE_0__/* .File */ .ZH(entryChunks, filename, {type: contentType}); 381 | formData.append(entryName, file); 382 | }; 383 | 384 | const appendEntryToFormData = () => { 385 | formData.append(entryName, entryValue); 386 | }; 387 | 388 | const decoder = new TextDecoder('utf-8'); 389 | decoder.decode(); 390 | 391 | parser.onPartBegin = function () { 392 | parser.onPartData = onPartData; 393 | parser.onPartEnd = appendEntryToFormData; 394 | 395 | headerField = ''; 396 | headerValue = ''; 397 | entryValue = ''; 398 | entryName = ''; 399 | contentType = ''; 400 | filename = null; 401 | entryChunks.length = 0; 402 | }; 403 | 404 | parser.onHeaderField = function (ui8a) { 405 | headerField += decoder.decode(ui8a, {stream: true}); 406 | }; 407 | 408 | parser.onHeaderValue = function (ui8a) { 409 | headerValue += decoder.decode(ui8a, {stream: true}); 410 | }; 411 | 412 | parser.onHeaderEnd = function () { 413 | headerValue += decoder.decode(); 414 | headerField = headerField.toLowerCase(); 415 | 416 | if (headerField === 'content-disposition') { 417 | // matches either a quoted-string or a token (RFC 2616 section 19.5.1) 418 | const m = headerValue.match(/\bname=("([^"]*)"|([^()<>@,;:\\"/[\]?={}\s\t]+))/i); 419 | 420 | if (m) { 421 | entryName = m[2] || m[3] || ''; 422 | } 423 | 424 | filename = _fileName(headerValue); 425 | 426 | if (filename) { 427 | parser.onPartData = appendToFile; 428 | parser.onPartEnd = appendFileToFormData; 429 | } 430 | } else if (headerField === 'content-type') { 431 | contentType = headerValue; 432 | } 433 | 434 | headerValue = ''; 435 | headerField = ''; 436 | }; 437 | 438 | for await (const chunk of Body) { 439 | parser.write(chunk); 440 | } 441 | 442 | parser.end(); 443 | 444 | return formData; 445 | } 446 | 447 | 448 | /***/ }) 449 | 450 | }; 451 | ; -------------------------------------------------------------------------------- /dist/main/669.index.js: -------------------------------------------------------------------------------- 1 | exports.id = 669; 2 | exports.ids = [669]; 3 | exports.modules = { 4 | 5 | /***/ 5183: 6 | /***/ (function(__unused_webpack_module, exports, __webpack_require__) { 7 | 8 | "use strict"; 9 | 10 | var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { 11 | if (k2 === undefined) k2 = k; 12 | var desc = Object.getOwnPropertyDescriptor(m, k); 13 | if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { 14 | desc = { enumerable: true, get: function() { return m[k]; } }; 15 | } 16 | Object.defineProperty(o, k2, desc); 17 | }) : (function(o, m, k, k2) { 18 | if (k2 === undefined) k2 = k; 19 | o[k2] = m[k]; 20 | })); 21 | var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { 22 | Object.defineProperty(o, "default", { enumerable: true, value: v }); 23 | }) : function(o, v) { 24 | o["default"] = v; 25 | }); 26 | var __importStar = (this && this.__importStar) || function (mod) { 27 | if (mod && mod.__esModule) return mod; 28 | var result = {}; 29 | if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); 30 | __setModuleDefault(result, mod); 31 | return result; 32 | }; 33 | Object.defineProperty(exports, "__esModule", ({ value: true })); 34 | exports.req = exports.json = exports.toBuffer = void 0; 35 | const http = __importStar(__webpack_require__(8611)); 36 | const https = __importStar(__webpack_require__(5692)); 37 | async function toBuffer(stream) { 38 | let length = 0; 39 | const chunks = []; 40 | for await (const chunk of stream) { 41 | length += chunk.length; 42 | chunks.push(chunk); 43 | } 44 | return Buffer.concat(chunks, length); 45 | } 46 | exports.toBuffer = toBuffer; 47 | // eslint-disable-next-line @typescript-eslint/no-explicit-any 48 | async function json(stream) { 49 | const buf = await toBuffer(stream); 50 | const str = buf.toString('utf8'); 51 | try { 52 | return JSON.parse(str); 53 | } 54 | catch (_err) { 55 | const err = _err; 56 | err.message += ` (input: ${str})`; 57 | throw err; 58 | } 59 | } 60 | exports.json = json; 61 | function req(url, opts = {}) { 62 | const href = typeof url === 'string' ? url : url.href; 63 | const req = (href.startsWith('https:') ? https : http).request(url, opts); 64 | const promise = new Promise((resolve, reject) => { 65 | req 66 | .once('response', resolve) 67 | .once('error', reject) 68 | .end(); 69 | }); 70 | req.then = promise.then.bind(promise); 71 | return req; 72 | } 73 | exports.req = req; 74 | //# sourceMappingURL=helpers.js.map 75 | 76 | /***/ }), 77 | 78 | /***/ 8894: 79 | /***/ (function(__unused_webpack_module, exports, __webpack_require__) { 80 | 81 | "use strict"; 82 | 83 | var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { 84 | if (k2 === undefined) k2 = k; 85 | var desc = Object.getOwnPropertyDescriptor(m, k); 86 | if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { 87 | desc = { enumerable: true, get: function() { return m[k]; } }; 88 | } 89 | Object.defineProperty(o, k2, desc); 90 | }) : (function(o, m, k, k2) { 91 | if (k2 === undefined) k2 = k; 92 | o[k2] = m[k]; 93 | })); 94 | var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { 95 | Object.defineProperty(o, "default", { enumerable: true, value: v }); 96 | }) : function(o, v) { 97 | o["default"] = v; 98 | }); 99 | var __importStar = (this && this.__importStar) || function (mod) { 100 | if (mod && mod.__esModule) return mod; 101 | var result = {}; 102 | if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); 103 | __setModuleDefault(result, mod); 104 | return result; 105 | }; 106 | var __exportStar = (this && this.__exportStar) || function(m, exports) { 107 | for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); 108 | }; 109 | Object.defineProperty(exports, "__esModule", ({ value: true })); 110 | exports.Agent = void 0; 111 | const net = __importStar(__webpack_require__(9278)); 112 | const http = __importStar(__webpack_require__(8611)); 113 | const https_1 = __webpack_require__(5692); 114 | __exportStar(__webpack_require__(5183), exports); 115 | const INTERNAL = Symbol('AgentBaseInternalState'); 116 | class Agent extends http.Agent { 117 | constructor(opts) { 118 | super(opts); 119 | this[INTERNAL] = {}; 120 | } 121 | /** 122 | * Determine whether this is an `http` or `https` request. 123 | */ 124 | isSecureEndpoint(options) { 125 | if (options) { 126 | // First check the `secureEndpoint` property explicitly, since this 127 | // means that a parent `Agent` is "passing through" to this instance. 128 | // eslint-disable-next-line @typescript-eslint/no-explicit-any 129 | if (typeof options.secureEndpoint === 'boolean') { 130 | return options.secureEndpoint; 131 | } 132 | // If no explicit `secure` endpoint, check if `protocol` property is 133 | // set. This will usually be the case since using a full string URL 134 | // or `URL` instance should be the most common usage. 135 | if (typeof options.protocol === 'string') { 136 | return options.protocol === 'https:'; 137 | } 138 | } 139 | // Finally, if no `protocol` property was set, then fall back to 140 | // checking the stack trace of the current call stack, and try to 141 | // detect the "https" module. 142 | const { stack } = new Error(); 143 | if (typeof stack !== 'string') 144 | return false; 145 | return stack 146 | .split('\n') 147 | .some((l) => l.indexOf('(https.js:') !== -1 || 148 | l.indexOf('node:https:') !== -1); 149 | } 150 | // In order to support async signatures in `connect()` and Node's native 151 | // connection pooling in `http.Agent`, the array of sockets for each origin 152 | // has to be updated synchronously. This is so the length of the array is 153 | // accurate when `addRequest()` is next called. We achieve this by creating a 154 | // fake socket and adding it to `sockets[origin]` and incrementing 155 | // `totalSocketCount`. 156 | incrementSockets(name) { 157 | // If `maxSockets` and `maxTotalSockets` are both Infinity then there is no 158 | // need to create a fake socket because Node.js native connection pooling 159 | // will never be invoked. 160 | if (this.maxSockets === Infinity && this.maxTotalSockets === Infinity) { 161 | return null; 162 | } 163 | // All instances of `sockets` are expected TypeScript errors. The 164 | // alternative is to add it as a private property of this class but that 165 | // will break TypeScript subclassing. 166 | if (!this.sockets[name]) { 167 | // @ts-expect-error `sockets` is readonly in `@types/node` 168 | this.sockets[name] = []; 169 | } 170 | const fakeSocket = new net.Socket({ writable: false }); 171 | this.sockets[name].push(fakeSocket); 172 | // @ts-expect-error `totalSocketCount` isn't defined in `@types/node` 173 | this.totalSocketCount++; 174 | return fakeSocket; 175 | } 176 | decrementSockets(name, socket) { 177 | if (!this.sockets[name] || socket === null) { 178 | return; 179 | } 180 | const sockets = this.sockets[name]; 181 | const index = sockets.indexOf(socket); 182 | if (index !== -1) { 183 | sockets.splice(index, 1); 184 | // @ts-expect-error `totalSocketCount` isn't defined in `@types/node` 185 | this.totalSocketCount--; 186 | if (sockets.length === 0) { 187 | // @ts-expect-error `sockets` is readonly in `@types/node` 188 | delete this.sockets[name]; 189 | } 190 | } 191 | } 192 | // In order to properly update the socket pool, we need to call `getName()` on 193 | // the core `https.Agent` if it is a secureEndpoint. 194 | getName(options) { 195 | const secureEndpoint = this.isSecureEndpoint(options); 196 | if (secureEndpoint) { 197 | // @ts-expect-error `getName()` isn't defined in `@types/node` 198 | return https_1.Agent.prototype.getName.call(this, options); 199 | } 200 | // @ts-expect-error `getName()` isn't defined in `@types/node` 201 | return super.getName(options); 202 | } 203 | createSocket(req, options, cb) { 204 | const connectOpts = { 205 | ...options, 206 | secureEndpoint: this.isSecureEndpoint(options), 207 | }; 208 | const name = this.getName(connectOpts); 209 | const fakeSocket = this.incrementSockets(name); 210 | Promise.resolve() 211 | .then(() => this.connect(req, connectOpts)) 212 | .then((socket) => { 213 | this.decrementSockets(name, fakeSocket); 214 | if (socket instanceof http.Agent) { 215 | try { 216 | // @ts-expect-error `addRequest()` isn't defined in `@types/node` 217 | return socket.addRequest(req, connectOpts); 218 | } 219 | catch (err) { 220 | return cb(err); 221 | } 222 | } 223 | this[INTERNAL].currentSocket = socket; 224 | // @ts-expect-error `createSocket()` isn't defined in `@types/node` 225 | super.createSocket(req, options, cb); 226 | }, (err) => { 227 | this.decrementSockets(name, fakeSocket); 228 | cb(err); 229 | }); 230 | } 231 | createConnection() { 232 | const socket = this[INTERNAL].currentSocket; 233 | this[INTERNAL].currentSocket = undefined; 234 | if (!socket) { 235 | throw new Error('No socket was returned in the `connect()` function'); 236 | } 237 | return socket; 238 | } 239 | get defaultPort() { 240 | return (this[INTERNAL].defaultPort ?? 241 | (this.protocol === 'https:' ? 443 : 80)); 242 | } 243 | set defaultPort(v) { 244 | if (this[INTERNAL]) { 245 | this[INTERNAL].defaultPort = v; 246 | } 247 | } 248 | get protocol() { 249 | return (this[INTERNAL].protocol ?? 250 | (this.isSecureEndpoint() ? 'https:' : 'http:')); 251 | } 252 | set protocol(v) { 253 | if (this[INTERNAL]) { 254 | this[INTERNAL].protocol = v; 255 | } 256 | } 257 | } 258 | exports.Agent = Agent; 259 | //# sourceMappingURL=index.js.map 260 | 261 | /***/ }), 262 | 263 | /***/ 6110: 264 | /***/ ((module, exports, __webpack_require__) => { 265 | 266 | /* eslint-env browser */ 267 | 268 | /** 269 | * This is the web browser implementation of `debug()`. 270 | */ 271 | 272 | exports.formatArgs = formatArgs; 273 | exports.save = save; 274 | exports.load = load; 275 | exports.useColors = useColors; 276 | exports.storage = localstorage(); 277 | exports.destroy = (() => { 278 | let warned = false; 279 | 280 | return () => { 281 | if (!warned) { 282 | warned = true; 283 | console.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.'); 284 | } 285 | }; 286 | })(); 287 | 288 | /** 289 | * Colors. 290 | */ 291 | 292 | exports.colors = [ 293 | '#0000CC', 294 | '#0000FF', 295 | '#0033CC', 296 | '#0033FF', 297 | '#0066CC', 298 | '#0066FF', 299 | '#0099CC', 300 | '#0099FF', 301 | '#00CC00', 302 | '#00CC33', 303 | '#00CC66', 304 | '#00CC99', 305 | '#00CCCC', 306 | '#00CCFF', 307 | '#3300CC', 308 | '#3300FF', 309 | '#3333CC', 310 | '#3333FF', 311 | '#3366CC', 312 | '#3366FF', 313 | '#3399CC', 314 | '#3399FF', 315 | '#33CC00', 316 | '#33CC33', 317 | '#33CC66', 318 | '#33CC99', 319 | '#33CCCC', 320 | '#33CCFF', 321 | '#6600CC', 322 | '#6600FF', 323 | '#6633CC', 324 | '#6633FF', 325 | '#66CC00', 326 | '#66CC33', 327 | '#9900CC', 328 | '#9900FF', 329 | '#9933CC', 330 | '#9933FF', 331 | '#99CC00', 332 | '#99CC33', 333 | '#CC0000', 334 | '#CC0033', 335 | '#CC0066', 336 | '#CC0099', 337 | '#CC00CC', 338 | '#CC00FF', 339 | '#CC3300', 340 | '#CC3333', 341 | '#CC3366', 342 | '#CC3399', 343 | '#CC33CC', 344 | '#CC33FF', 345 | '#CC6600', 346 | '#CC6633', 347 | '#CC9900', 348 | '#CC9933', 349 | '#CCCC00', 350 | '#CCCC33', 351 | '#FF0000', 352 | '#FF0033', 353 | '#FF0066', 354 | '#FF0099', 355 | '#FF00CC', 356 | '#FF00FF', 357 | '#FF3300', 358 | '#FF3333', 359 | '#FF3366', 360 | '#FF3399', 361 | '#FF33CC', 362 | '#FF33FF', 363 | '#FF6600', 364 | '#FF6633', 365 | '#FF9900', 366 | '#FF9933', 367 | '#FFCC00', 368 | '#FFCC33' 369 | ]; 370 | 371 | /** 372 | * Currently only WebKit-based Web Inspectors, Firefox >= v31, 373 | * and the Firebug extension (any Firefox version) are known 374 | * to support "%c" CSS customizations. 375 | * 376 | * TODO: add a `localStorage` variable to explicitly enable/disable colors 377 | */ 378 | 379 | // eslint-disable-next-line complexity 380 | function useColors() { 381 | // NB: In an Electron preload script, document will be defined but not fully 382 | // initialized. Since we know we're in Chrome, we'll just detect this case 383 | // explicitly 384 | if (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) { 385 | return true; 386 | } 387 | 388 | // Internet Explorer and Edge do not support colors. 389 | if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) { 390 | return false; 391 | } 392 | 393 | let m; 394 | 395 | // Is webkit? http://stackoverflow.com/a/16459606/376773 396 | // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632 397 | // eslint-disable-next-line no-return-assign 398 | return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) || 399 | // Is firebug? http://stackoverflow.com/a/398120/376773 400 | (typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) || 401 | // Is firefox >= v31? 402 | // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages 403 | (typeof navigator !== 'undefined' && navigator.userAgent && (m = navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)) && parseInt(m[1], 10) >= 31) || 404 | // Double check webkit in userAgent just in case we are in a worker 405 | (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)); 406 | } 407 | 408 | /** 409 | * Colorize log arguments if enabled. 410 | * 411 | * @api public 412 | */ 413 | 414 | function formatArgs(args) { 415 | args[0] = (this.useColors ? '%c' : '') + 416 | this.namespace + 417 | (this.useColors ? ' %c' : ' ') + 418 | args[0] + 419 | (this.useColors ? '%c ' : ' ') + 420 | '+' + module.exports.humanize(this.diff); 421 | 422 | if (!this.useColors) { 423 | return; 424 | } 425 | 426 | const c = 'color: ' + this.color; 427 | args.splice(1, 0, c, 'color: inherit'); 428 | 429 | // The final "%c" is somewhat tricky, because there could be other 430 | // arguments passed either before or after the %c, so we need to 431 | // figure out the correct index to insert the CSS into 432 | let index = 0; 433 | let lastC = 0; 434 | args[0].replace(/%[a-zA-Z%]/g, match => { 435 | if (match === '%%') { 436 | return; 437 | } 438 | index++; 439 | if (match === '%c') { 440 | // We only are interested in the *last* %c 441 | // (the user may have provided their own) 442 | lastC = index; 443 | } 444 | }); 445 | 446 | args.splice(lastC, 0, c); 447 | } 448 | 449 | /** 450 | * Invokes `console.debug()` when available. 451 | * No-op when `console.debug` is not a "function". 452 | * If `console.debug` is not available, falls back 453 | * to `console.log`. 454 | * 455 | * @api public 456 | */ 457 | exports.log = console.debug || console.log || (() => {}); 458 | 459 | /** 460 | * Save `namespaces`. 461 | * 462 | * @param {String} namespaces 463 | * @api private 464 | */ 465 | function save(namespaces) { 466 | try { 467 | if (namespaces) { 468 | exports.storage.setItem('debug', namespaces); 469 | } else { 470 | exports.storage.removeItem('debug'); 471 | } 472 | } catch (error) { 473 | // Swallow 474 | // XXX (@Qix-) should we be logging these? 475 | } 476 | } 477 | 478 | /** 479 | * Load `namespaces`. 480 | * 481 | * @return {String} returns the previously persisted debug modes 482 | * @api private 483 | */ 484 | function load() { 485 | let r; 486 | try { 487 | r = exports.storage.getItem('debug') || exports.storage.getItem('DEBUG') ; 488 | } catch (error) { 489 | // Swallow 490 | // XXX (@Qix-) should we be logging these? 491 | } 492 | 493 | // If debug isn't set in LS, and we're in Electron, try to load $DEBUG 494 | if (!r && typeof process !== 'undefined' && 'env' in process) { 495 | r = process.env.DEBUG; 496 | } 497 | 498 | return r; 499 | } 500 | 501 | /** 502 | * Localstorage attempts to return the localstorage. 503 | * 504 | * This is necessary because safari throws 505 | * when a user disables cookies/localstorage 506 | * and you attempt to access it. 507 | * 508 | * @return {LocalStorage} 509 | * @api private 510 | */ 511 | 512 | function localstorage() { 513 | try { 514 | // TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context 515 | // The Browser also has localStorage in the global context. 516 | return localStorage; 517 | } catch (error) { 518 | // Swallow 519 | // XXX (@Qix-) should we be logging these? 520 | } 521 | } 522 | 523 | module.exports = __webpack_require__(897)(exports); 524 | 525 | const {formatters} = module.exports; 526 | 527 | /** 528 | * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default. 529 | */ 530 | 531 | formatters.j = function (v) { 532 | try { 533 | return JSON.stringify(v); 534 | } catch (error) { 535 | return '[UnexpectedJSONParseError]: ' + error.message; 536 | } 537 | }; 538 | 539 | 540 | /***/ }), 541 | 542 | /***/ 897: 543 | /***/ ((module, __unused_webpack_exports, __webpack_require__) => { 544 | 545 | 546 | /** 547 | * This is the common logic for both the Node.js and web browser 548 | * implementations of `debug()`. 549 | */ 550 | 551 | function setup(env) { 552 | createDebug.debug = createDebug; 553 | createDebug.default = createDebug; 554 | createDebug.coerce = coerce; 555 | createDebug.disable = disable; 556 | createDebug.enable = enable; 557 | createDebug.enabled = enabled; 558 | createDebug.humanize = __webpack_require__(744); 559 | createDebug.destroy = destroy; 560 | 561 | Object.keys(env).forEach(key => { 562 | createDebug[key] = env[key]; 563 | }); 564 | 565 | /** 566 | * The currently active debug mode names, and names to skip. 567 | */ 568 | 569 | createDebug.names = []; 570 | createDebug.skips = []; 571 | 572 | /** 573 | * Map of special "%n" handling functions, for the debug "format" argument. 574 | * 575 | * Valid key names are a single, lower or upper-case letter, i.e. "n" and "N". 576 | */ 577 | createDebug.formatters = {}; 578 | 579 | /** 580 | * Selects a color for a debug namespace 581 | * @param {String} namespace The namespace string for the debug instance to be colored 582 | * @return {Number|String} An ANSI color code for the given namespace 583 | * @api private 584 | */ 585 | function selectColor(namespace) { 586 | let hash = 0; 587 | 588 | for (let i = 0; i < namespace.length; i++) { 589 | hash = ((hash << 5) - hash) + namespace.charCodeAt(i); 590 | hash |= 0; // Convert to 32bit integer 591 | } 592 | 593 | return createDebug.colors[Math.abs(hash) % createDebug.colors.length]; 594 | } 595 | createDebug.selectColor = selectColor; 596 | 597 | /** 598 | * Create a debugger with the given `namespace`. 599 | * 600 | * @param {String} namespace 601 | * @return {Function} 602 | * @api public 603 | */ 604 | function createDebug(namespace) { 605 | let prevTime; 606 | let enableOverride = null; 607 | let namespacesCache; 608 | let enabledCache; 609 | 610 | function debug(...args) { 611 | // Disabled? 612 | if (!debug.enabled) { 613 | return; 614 | } 615 | 616 | const self = debug; 617 | 618 | // Set `diff` timestamp 619 | const curr = Number(new Date()); 620 | const ms = curr - (prevTime || curr); 621 | self.diff = ms; 622 | self.prev = prevTime; 623 | self.curr = curr; 624 | prevTime = curr; 625 | 626 | args[0] = createDebug.coerce(args[0]); 627 | 628 | if (typeof args[0] !== 'string') { 629 | // Anything else let's inspect with %O 630 | args.unshift('%O'); 631 | } 632 | 633 | // Apply any `formatters` transformations 634 | let index = 0; 635 | args[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => { 636 | // If we encounter an escaped % then don't increase the array index 637 | if (match === '%%') { 638 | return '%'; 639 | } 640 | index++; 641 | const formatter = createDebug.formatters[format]; 642 | if (typeof formatter === 'function') { 643 | const val = args[index]; 644 | match = formatter.call(self, val); 645 | 646 | // Now we need to remove `args[index]` since it's inlined in the `format` 647 | args.splice(index, 1); 648 | index--; 649 | } 650 | return match; 651 | }); 652 | 653 | // Apply env-specific formatting (colors, etc.) 654 | createDebug.formatArgs.call(self, args); 655 | 656 | const logFn = self.log || createDebug.log; 657 | logFn.apply(self, args); 658 | } 659 | 660 | debug.namespace = namespace; 661 | debug.useColors = createDebug.useColors(); 662 | debug.color = createDebug.selectColor(namespace); 663 | debug.extend = extend; 664 | debug.destroy = createDebug.destroy; // XXX Temporary. Will be removed in the next major release. 665 | 666 | Object.defineProperty(debug, 'enabled', { 667 | enumerable: true, 668 | configurable: false, 669 | get: () => { 670 | if (enableOverride !== null) { 671 | return enableOverride; 672 | } 673 | if (namespacesCache !== createDebug.namespaces) { 674 | namespacesCache = createDebug.namespaces; 675 | enabledCache = createDebug.enabled(namespace); 676 | } 677 | 678 | return enabledCache; 679 | }, 680 | set: v => { 681 | enableOverride = v; 682 | } 683 | }); 684 | 685 | // Env-specific initialization logic for debug instances 686 | if (typeof createDebug.init === 'function') { 687 | createDebug.init(debug); 688 | } 689 | 690 | return debug; 691 | } 692 | 693 | function extend(namespace, delimiter) { 694 | const newDebug = createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace); 695 | newDebug.log = this.log; 696 | return newDebug; 697 | } 698 | 699 | /** 700 | * Enables a debug mode by namespaces. This can include modes 701 | * separated by a colon and wildcards. 702 | * 703 | * @param {String} namespaces 704 | * @api public 705 | */ 706 | function enable(namespaces) { 707 | createDebug.save(namespaces); 708 | createDebug.namespaces = namespaces; 709 | 710 | createDebug.names = []; 711 | createDebug.skips = []; 712 | 713 | const split = (typeof namespaces === 'string' ? namespaces : '') 714 | .trim() 715 | .replace(/\s+/g, ',') 716 | .split(',') 717 | .filter(Boolean); 718 | 719 | for (const ns of split) { 720 | if (ns[0] === '-') { 721 | createDebug.skips.push(ns.slice(1)); 722 | } else { 723 | createDebug.names.push(ns); 724 | } 725 | } 726 | } 727 | 728 | /** 729 | * Checks if the given string matches a namespace template, honoring 730 | * asterisks as wildcards. 731 | * 732 | * @param {String} search 733 | * @param {String} template 734 | * @return {Boolean} 735 | */ 736 | function matchesTemplate(search, template) { 737 | let searchIndex = 0; 738 | let templateIndex = 0; 739 | let starIndex = -1; 740 | let matchIndex = 0; 741 | 742 | while (searchIndex < search.length) { 743 | if (templateIndex < template.length && (template[templateIndex] === search[searchIndex] || template[templateIndex] === '*')) { 744 | // Match character or proceed with wildcard 745 | if (template[templateIndex] === '*') { 746 | starIndex = templateIndex; 747 | matchIndex = searchIndex; 748 | templateIndex++; // Skip the '*' 749 | } else { 750 | searchIndex++; 751 | templateIndex++; 752 | } 753 | } else if (starIndex !== -1) { // eslint-disable-line no-negated-condition 754 | // Backtrack to the last '*' and try to match more characters 755 | templateIndex = starIndex + 1; 756 | matchIndex++; 757 | searchIndex = matchIndex; 758 | } else { 759 | return false; // No match 760 | } 761 | } 762 | 763 | // Handle trailing '*' in template 764 | while (templateIndex < template.length && template[templateIndex] === '*') { 765 | templateIndex++; 766 | } 767 | 768 | return templateIndex === template.length; 769 | } 770 | 771 | /** 772 | * Disable debug output. 773 | * 774 | * @return {String} namespaces 775 | * @api public 776 | */ 777 | function disable() { 778 | const namespaces = [ 779 | ...createDebug.names, 780 | ...createDebug.skips.map(namespace => '-' + namespace) 781 | ].join(','); 782 | createDebug.enable(''); 783 | return namespaces; 784 | } 785 | 786 | /** 787 | * Returns true if the given mode name is enabled, false otherwise. 788 | * 789 | * @param {String} name 790 | * @return {Boolean} 791 | * @api public 792 | */ 793 | function enabled(name) { 794 | for (const skip of createDebug.skips) { 795 | if (matchesTemplate(name, skip)) { 796 | return false; 797 | } 798 | } 799 | 800 | for (const ns of createDebug.names) { 801 | if (matchesTemplate(name, ns)) { 802 | return true; 803 | } 804 | } 805 | 806 | return false; 807 | } 808 | 809 | /** 810 | * Coerce `val`. 811 | * 812 | * @param {Mixed} val 813 | * @return {Mixed} 814 | * @api private 815 | */ 816 | function coerce(val) { 817 | if (val instanceof Error) { 818 | return val.stack || val.message; 819 | } 820 | return val; 821 | } 822 | 823 | /** 824 | * XXX DO NOT USE. This is a temporary stub function. 825 | * XXX It WILL be removed in the next major release. 826 | */ 827 | function destroy() { 828 | console.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.'); 829 | } 830 | 831 | createDebug.enable(createDebug.load()); 832 | 833 | return createDebug; 834 | } 835 | 836 | module.exports = setup; 837 | 838 | 839 | /***/ }), 840 | 841 | /***/ 2830: 842 | /***/ ((module, __unused_webpack_exports, __webpack_require__) => { 843 | 844 | /** 845 | * Detect Electron renderer / nwjs process, which is node, but we should 846 | * treat as a browser. 847 | */ 848 | 849 | if (typeof process === 'undefined' || process.type === 'renderer' || process.browser === true || process.__nwjs) { 850 | module.exports = __webpack_require__(6110); 851 | } else { 852 | module.exports = __webpack_require__(5108); 853 | } 854 | 855 | 856 | /***/ }), 857 | 858 | /***/ 5108: 859 | /***/ ((module, exports, __webpack_require__) => { 860 | 861 | /** 862 | * Module dependencies. 863 | */ 864 | 865 | const tty = __webpack_require__(2018); 866 | const util = __webpack_require__(9023); 867 | 868 | /** 869 | * This is the Node.js implementation of `debug()`. 870 | */ 871 | 872 | exports.init = init; 873 | exports.log = log; 874 | exports.formatArgs = formatArgs; 875 | exports.save = save; 876 | exports.load = load; 877 | exports.useColors = useColors; 878 | exports.destroy = util.deprecate( 879 | () => {}, 880 | 'Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.' 881 | ); 882 | 883 | /** 884 | * Colors. 885 | */ 886 | 887 | exports.colors = [6, 2, 3, 4, 5, 1]; 888 | 889 | try { 890 | // Optional dependency (as in, doesn't need to be installed, NOT like optionalDependencies in package.json) 891 | // eslint-disable-next-line import/no-extraneous-dependencies 892 | const supportsColor = __webpack_require__(1450); 893 | 894 | if (supportsColor && (supportsColor.stderr || supportsColor).level >= 2) { 895 | exports.colors = [ 896 | 20, 897 | 21, 898 | 26, 899 | 27, 900 | 32, 901 | 33, 902 | 38, 903 | 39, 904 | 40, 905 | 41, 906 | 42, 907 | 43, 908 | 44, 909 | 45, 910 | 56, 911 | 57, 912 | 62, 913 | 63, 914 | 68, 915 | 69, 916 | 74, 917 | 75, 918 | 76, 919 | 77, 920 | 78, 921 | 79, 922 | 80, 923 | 81, 924 | 92, 925 | 93, 926 | 98, 927 | 99, 928 | 112, 929 | 113, 930 | 128, 931 | 129, 932 | 134, 933 | 135, 934 | 148, 935 | 149, 936 | 160, 937 | 161, 938 | 162, 939 | 163, 940 | 164, 941 | 165, 942 | 166, 943 | 167, 944 | 168, 945 | 169, 946 | 170, 947 | 171, 948 | 172, 949 | 173, 950 | 178, 951 | 179, 952 | 184, 953 | 185, 954 | 196, 955 | 197, 956 | 198, 957 | 199, 958 | 200, 959 | 201, 960 | 202, 961 | 203, 962 | 204, 963 | 205, 964 | 206, 965 | 207, 966 | 208, 967 | 209, 968 | 214, 969 | 215, 970 | 220, 971 | 221 972 | ]; 973 | } 974 | } catch (error) { 975 | // Swallow - we only care if `supports-color` is available; it doesn't have to be. 976 | } 977 | 978 | /** 979 | * Build up the default `inspectOpts` object from the environment variables. 980 | * 981 | * $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js 982 | */ 983 | 984 | exports.inspectOpts = Object.keys(process.env).filter(key => { 985 | return /^debug_/i.test(key); 986 | }).reduce((obj, key) => { 987 | // Camel-case 988 | const prop = key 989 | .substring(6) 990 | .toLowerCase() 991 | .replace(/_([a-z])/g, (_, k) => { 992 | return k.toUpperCase(); 993 | }); 994 | 995 | // Coerce string value into JS value 996 | let val = process.env[key]; 997 | if (/^(yes|on|true|enabled)$/i.test(val)) { 998 | val = true; 999 | } else if (/^(no|off|false|disabled)$/i.test(val)) { 1000 | val = false; 1001 | } else if (val === 'null') { 1002 | val = null; 1003 | } else { 1004 | val = Number(val); 1005 | } 1006 | 1007 | obj[prop] = val; 1008 | return obj; 1009 | }, {}); 1010 | 1011 | /** 1012 | * Is stdout a TTY? Colored output is enabled when `true`. 1013 | */ 1014 | 1015 | function useColors() { 1016 | return 'colors' in exports.inspectOpts ? 1017 | Boolean(exports.inspectOpts.colors) : 1018 | tty.isatty(process.stderr.fd); 1019 | } 1020 | 1021 | /** 1022 | * Adds ANSI color escape codes if enabled. 1023 | * 1024 | * @api public 1025 | */ 1026 | 1027 | function formatArgs(args) { 1028 | const {namespace: name, useColors} = this; 1029 | 1030 | if (useColors) { 1031 | const c = this.color; 1032 | const colorCode = '\u001B[3' + (c < 8 ? c : '8;5;' + c); 1033 | const prefix = ` ${colorCode};1m${name} \u001B[0m`; 1034 | 1035 | args[0] = prefix + args[0].split('\n').join('\n' + prefix); 1036 | args.push(colorCode + 'm+' + module.exports.humanize(this.diff) + '\u001B[0m'); 1037 | } else { 1038 | args[0] = getDate() + name + ' ' + args[0]; 1039 | } 1040 | } 1041 | 1042 | function getDate() { 1043 | if (exports.inspectOpts.hideDate) { 1044 | return ''; 1045 | } 1046 | return new Date().toISOString() + ' '; 1047 | } 1048 | 1049 | /** 1050 | * Invokes `util.formatWithOptions()` with the specified arguments and writes to stderr. 1051 | */ 1052 | 1053 | function log(...args) { 1054 | return process.stderr.write(util.formatWithOptions(exports.inspectOpts, ...args) + '\n'); 1055 | } 1056 | 1057 | /** 1058 | * Save `namespaces`. 1059 | * 1060 | * @param {String} namespaces 1061 | * @api private 1062 | */ 1063 | function save(namespaces) { 1064 | if (namespaces) { 1065 | process.env.DEBUG = namespaces; 1066 | } else { 1067 | // If you set a process.env field to null or undefined, it gets cast to the 1068 | // string 'null' or 'undefined'. Just delete instead. 1069 | delete process.env.DEBUG; 1070 | } 1071 | } 1072 | 1073 | /** 1074 | * Load `namespaces`. 1075 | * 1076 | * @return {String} returns the previously persisted debug modes 1077 | * @api private 1078 | */ 1079 | 1080 | function load() { 1081 | return process.env.DEBUG; 1082 | } 1083 | 1084 | /** 1085 | * Init logic for `debug` instances. 1086 | * 1087 | * Create a new `inspectOpts` object in case `useColors` is set 1088 | * differently for a particular `debug` instance. 1089 | */ 1090 | 1091 | function init(debug) { 1092 | debug.inspectOpts = {}; 1093 | 1094 | const keys = Object.keys(exports.inspectOpts); 1095 | for (let i = 0; i < keys.length; i++) { 1096 | debug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]]; 1097 | } 1098 | } 1099 | 1100 | module.exports = __webpack_require__(897)(exports); 1101 | 1102 | const {formatters} = module.exports; 1103 | 1104 | /** 1105 | * Map %o to `util.inspect()`, all on a single line. 1106 | */ 1107 | 1108 | formatters.o = function (v) { 1109 | this.inspectOpts.colors = this.useColors; 1110 | return util.inspect(v, this.inspectOpts) 1111 | .split('\n') 1112 | .map(str => str.trim()) 1113 | .join(' '); 1114 | }; 1115 | 1116 | /** 1117 | * Map %O to `util.inspect()`, allowing multiple lines if needed. 1118 | */ 1119 | 1120 | formatters.O = function (v) { 1121 | this.inspectOpts.colors = this.useColors; 1122 | return util.inspect(v, this.inspectOpts); 1123 | }; 1124 | 1125 | 1126 | /***/ }), 1127 | 1128 | /***/ 3813: 1129 | /***/ ((module) => { 1130 | 1131 | "use strict"; 1132 | 1133 | 1134 | module.exports = (flag, argv = process.argv) => { 1135 | const prefix = flag.startsWith('-') ? '' : (flag.length === 1 ? '-' : '--'); 1136 | const position = argv.indexOf(prefix + flag); 1137 | const terminatorPosition = argv.indexOf('--'); 1138 | return position !== -1 && (terminatorPosition === -1 || position < terminatorPosition); 1139 | }; 1140 | 1141 | 1142 | /***/ }), 1143 | 1144 | /***/ 3669: 1145 | /***/ (function(__unused_webpack_module, exports, __webpack_require__) { 1146 | 1147 | "use strict"; 1148 | 1149 | var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { 1150 | if (k2 === undefined) k2 = k; 1151 | var desc = Object.getOwnPropertyDescriptor(m, k); 1152 | if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { 1153 | desc = { enumerable: true, get: function() { return m[k]; } }; 1154 | } 1155 | Object.defineProperty(o, k2, desc); 1156 | }) : (function(o, m, k, k2) { 1157 | if (k2 === undefined) k2 = k; 1158 | o[k2] = m[k]; 1159 | })); 1160 | var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { 1161 | Object.defineProperty(o, "default", { enumerable: true, value: v }); 1162 | }) : function(o, v) { 1163 | o["default"] = v; 1164 | }); 1165 | var __importStar = (this && this.__importStar) || function (mod) { 1166 | if (mod && mod.__esModule) return mod; 1167 | var result = {}; 1168 | if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); 1169 | __setModuleDefault(result, mod); 1170 | return result; 1171 | }; 1172 | var __importDefault = (this && this.__importDefault) || function (mod) { 1173 | return (mod && mod.__esModule) ? mod : { "default": mod }; 1174 | }; 1175 | Object.defineProperty(exports, "__esModule", ({ value: true })); 1176 | exports.HttpsProxyAgent = void 0; 1177 | const net = __importStar(__webpack_require__(9278)); 1178 | const tls = __importStar(__webpack_require__(4756)); 1179 | const assert_1 = __importDefault(__webpack_require__(2613)); 1180 | const debug_1 = __importDefault(__webpack_require__(2830)); 1181 | const agent_base_1 = __webpack_require__(8894); 1182 | const url_1 = __webpack_require__(7016); 1183 | const parse_proxy_response_1 = __webpack_require__(7943); 1184 | const debug = (0, debug_1.default)('https-proxy-agent'); 1185 | const setServernameFromNonIpHost = (options) => { 1186 | if (options.servername === undefined && 1187 | options.host && 1188 | !net.isIP(options.host)) { 1189 | return { 1190 | ...options, 1191 | servername: options.host, 1192 | }; 1193 | } 1194 | return options; 1195 | }; 1196 | /** 1197 | * The `HttpsProxyAgent` implements an HTTP Agent subclass that connects to 1198 | * the specified "HTTP(s) proxy server" in order to proxy HTTPS requests. 1199 | * 1200 | * Outgoing HTTP requests are first tunneled through the proxy server using the 1201 | * `CONNECT` HTTP request method to establish a connection to the proxy server, 1202 | * and then the proxy server connects to the destination target and issues the 1203 | * HTTP request from the proxy server. 1204 | * 1205 | * `https:` requests have their socket connection upgraded to TLS once 1206 | * the connection to the proxy server has been established. 1207 | */ 1208 | class HttpsProxyAgent extends agent_base_1.Agent { 1209 | constructor(proxy, opts) { 1210 | super(opts); 1211 | this.options = { path: undefined }; 1212 | this.proxy = typeof proxy === 'string' ? new url_1.URL(proxy) : proxy; 1213 | this.proxyHeaders = opts?.headers ?? {}; 1214 | debug('Creating new HttpsProxyAgent instance: %o', this.proxy.href); 1215 | // Trim off the brackets from IPv6 addresses 1216 | const host = (this.proxy.hostname || this.proxy.host).replace(/^\[|\]$/g, ''); 1217 | const port = this.proxy.port 1218 | ? parseInt(this.proxy.port, 10) 1219 | : this.proxy.protocol === 'https:' 1220 | ? 443 1221 | : 80; 1222 | this.connectOpts = { 1223 | // Attempt to negotiate http/1.1 for proxy servers that support http/2 1224 | ALPNProtocols: ['http/1.1'], 1225 | ...(opts ? omit(opts, 'headers') : null), 1226 | host, 1227 | port, 1228 | }; 1229 | } 1230 | /** 1231 | * Called when the node-core HTTP client library is creating a 1232 | * new HTTP request. 1233 | */ 1234 | async connect(req, opts) { 1235 | const { proxy } = this; 1236 | if (!opts.host) { 1237 | throw new TypeError('No "host" provided'); 1238 | } 1239 | // Create a socket connection to the proxy server. 1240 | let socket; 1241 | if (proxy.protocol === 'https:') { 1242 | debug('Creating `tls.Socket`: %o', this.connectOpts); 1243 | socket = tls.connect(setServernameFromNonIpHost(this.connectOpts)); 1244 | } 1245 | else { 1246 | debug('Creating `net.Socket`: %o', this.connectOpts); 1247 | socket = net.connect(this.connectOpts); 1248 | } 1249 | const headers = typeof this.proxyHeaders === 'function' 1250 | ? this.proxyHeaders() 1251 | : { ...this.proxyHeaders }; 1252 | const host = net.isIPv6(opts.host) ? `[${opts.host}]` : opts.host; 1253 | let payload = `CONNECT ${host}:${opts.port} HTTP/1.1\r\n`; 1254 | // Inject the `Proxy-Authorization` header if necessary. 1255 | if (proxy.username || proxy.password) { 1256 | const auth = `${decodeURIComponent(proxy.username)}:${decodeURIComponent(proxy.password)}`; 1257 | headers['Proxy-Authorization'] = `Basic ${Buffer.from(auth).toString('base64')}`; 1258 | } 1259 | headers.Host = `${host}:${opts.port}`; 1260 | if (!headers['Proxy-Connection']) { 1261 | headers['Proxy-Connection'] = this.keepAlive 1262 | ? 'Keep-Alive' 1263 | : 'close'; 1264 | } 1265 | for (const name of Object.keys(headers)) { 1266 | payload += `${name}: ${headers[name]}\r\n`; 1267 | } 1268 | const proxyResponsePromise = (0, parse_proxy_response_1.parseProxyResponse)(socket); 1269 | socket.write(`${payload}\r\n`); 1270 | const { connect, buffered } = await proxyResponsePromise; 1271 | req.emit('proxyConnect', connect); 1272 | this.emit('proxyConnect', connect, req); 1273 | if (connect.statusCode === 200) { 1274 | req.once('socket', resume); 1275 | if (opts.secureEndpoint) { 1276 | // The proxy is connecting to a TLS server, so upgrade 1277 | // this socket connection to a TLS connection. 1278 | debug('Upgrading socket connection to TLS'); 1279 | return tls.connect({ 1280 | ...omit(setServernameFromNonIpHost(opts), 'host', 'path', 'port'), 1281 | socket, 1282 | }); 1283 | } 1284 | return socket; 1285 | } 1286 | // Some other status code that's not 200... need to re-play the HTTP 1287 | // header "data" events onto the socket once the HTTP machinery is 1288 | // attached so that the node core `http` can parse and handle the 1289 | // error status code. 1290 | // Close the original socket, and a new "fake" socket is returned 1291 | // instead, so that the proxy doesn't get the HTTP request 1292 | // written to it (which may contain `Authorization` headers or other 1293 | // sensitive data). 1294 | // 1295 | // See: https://hackerone.com/reports/541502 1296 | socket.destroy(); 1297 | const fakeSocket = new net.Socket({ writable: false }); 1298 | fakeSocket.readable = true; 1299 | // Need to wait for the "socket" event to re-play the "data" events. 1300 | req.once('socket', (s) => { 1301 | debug('Replaying proxy buffer for failed request'); 1302 | (0, assert_1.default)(s.listenerCount('data') > 0); 1303 | // Replay the "buffered" Buffer onto the fake `socket`, since at 1304 | // this point the HTTP module machinery has been hooked up for 1305 | // the user. 1306 | s.push(buffered); 1307 | s.push(null); 1308 | }); 1309 | return fakeSocket; 1310 | } 1311 | } 1312 | HttpsProxyAgent.protocols = ['http', 'https']; 1313 | exports.HttpsProxyAgent = HttpsProxyAgent; 1314 | function resume(socket) { 1315 | socket.resume(); 1316 | } 1317 | function omit(obj, ...keys) { 1318 | const ret = {}; 1319 | let key; 1320 | for (key in obj) { 1321 | if (!keys.includes(key)) { 1322 | ret[key] = obj[key]; 1323 | } 1324 | } 1325 | return ret; 1326 | } 1327 | //# sourceMappingURL=index.js.map 1328 | 1329 | /***/ }), 1330 | 1331 | /***/ 7943: 1332 | /***/ (function(__unused_webpack_module, exports, __webpack_require__) { 1333 | 1334 | "use strict"; 1335 | 1336 | var __importDefault = (this && this.__importDefault) || function (mod) { 1337 | return (mod && mod.__esModule) ? mod : { "default": mod }; 1338 | }; 1339 | Object.defineProperty(exports, "__esModule", ({ value: true })); 1340 | exports.parseProxyResponse = void 0; 1341 | const debug_1 = __importDefault(__webpack_require__(2830)); 1342 | const debug = (0, debug_1.default)('https-proxy-agent:parse-proxy-response'); 1343 | function parseProxyResponse(socket) { 1344 | return new Promise((resolve, reject) => { 1345 | // we need to buffer any HTTP traffic that happens with the proxy before we get 1346 | // the CONNECT response, so that if the response is anything other than an "200" 1347 | // response code, then we can re-play the "data" events on the socket once the 1348 | // HTTP parser is hooked up... 1349 | let buffersLength = 0; 1350 | const buffers = []; 1351 | function read() { 1352 | const b = socket.read(); 1353 | if (b) 1354 | ondata(b); 1355 | else 1356 | socket.once('readable', read); 1357 | } 1358 | function cleanup() { 1359 | socket.removeListener('end', onend); 1360 | socket.removeListener('error', onerror); 1361 | socket.removeListener('readable', read); 1362 | } 1363 | function onend() { 1364 | cleanup(); 1365 | debug('onend'); 1366 | reject(new Error('Proxy connection ended before receiving CONNECT response')); 1367 | } 1368 | function onerror(err) { 1369 | cleanup(); 1370 | debug('onerror %o', err); 1371 | reject(err); 1372 | } 1373 | function ondata(b) { 1374 | buffers.push(b); 1375 | buffersLength += b.length; 1376 | const buffered = Buffer.concat(buffers, buffersLength); 1377 | const endOfHeaders = buffered.indexOf('\r\n\r\n'); 1378 | if (endOfHeaders === -1) { 1379 | // keep buffering 1380 | debug('have not received end of HTTP headers yet...'); 1381 | read(); 1382 | return; 1383 | } 1384 | const headerParts = buffered 1385 | .slice(0, endOfHeaders) 1386 | .toString('ascii') 1387 | .split('\r\n'); 1388 | const firstLine = headerParts.shift(); 1389 | if (!firstLine) { 1390 | socket.destroy(); 1391 | return reject(new Error('No header received from proxy CONNECT response')); 1392 | } 1393 | const firstLineParts = firstLine.split(' '); 1394 | const statusCode = +firstLineParts[1]; 1395 | const statusText = firstLineParts.slice(2).join(' '); 1396 | const headers = {}; 1397 | for (const header of headerParts) { 1398 | if (!header) 1399 | continue; 1400 | const firstColon = header.indexOf(':'); 1401 | if (firstColon === -1) { 1402 | socket.destroy(); 1403 | return reject(new Error(`Invalid header from proxy CONNECT response: "${header}"`)); 1404 | } 1405 | const key = header.slice(0, firstColon).toLowerCase(); 1406 | const value = header.slice(firstColon + 1).trimStart(); 1407 | const current = headers[key]; 1408 | if (typeof current === 'string') { 1409 | headers[key] = [current, value]; 1410 | } 1411 | else if (Array.isArray(current)) { 1412 | current.push(value); 1413 | } 1414 | else { 1415 | headers[key] = value; 1416 | } 1417 | } 1418 | debug('got proxy server response: %o %o', firstLine, headers); 1419 | cleanup(); 1420 | resolve({ 1421 | connect: { 1422 | statusCode, 1423 | statusText, 1424 | headers, 1425 | }, 1426 | buffered, 1427 | }); 1428 | } 1429 | socket.on('error', onerror); 1430 | socket.on('end', onend); 1431 | read(); 1432 | }); 1433 | } 1434 | exports.parseProxyResponse = parseProxyResponse; 1435 | //# sourceMappingURL=parse-proxy-response.js.map 1436 | 1437 | /***/ }), 1438 | 1439 | /***/ 744: 1440 | /***/ ((module) => { 1441 | 1442 | /** 1443 | * Helpers. 1444 | */ 1445 | 1446 | var s = 1000; 1447 | var m = s * 60; 1448 | var h = m * 60; 1449 | var d = h * 24; 1450 | var w = d * 7; 1451 | var y = d * 365.25; 1452 | 1453 | /** 1454 | * Parse or format the given `val`. 1455 | * 1456 | * Options: 1457 | * 1458 | * - `long` verbose formatting [false] 1459 | * 1460 | * @param {String|Number} val 1461 | * @param {Object} [options] 1462 | * @throws {Error} throw an error if val is not a non-empty string or a number 1463 | * @return {String|Number} 1464 | * @api public 1465 | */ 1466 | 1467 | module.exports = function (val, options) { 1468 | options = options || {}; 1469 | var type = typeof val; 1470 | if (type === 'string' && val.length > 0) { 1471 | return parse(val); 1472 | } else if (type === 'number' && isFinite(val)) { 1473 | return options.long ? fmtLong(val) : fmtShort(val); 1474 | } 1475 | throw new Error( 1476 | 'val is not a non-empty string or a valid number. val=' + 1477 | JSON.stringify(val) 1478 | ); 1479 | }; 1480 | 1481 | /** 1482 | * Parse the given `str` and return milliseconds. 1483 | * 1484 | * @param {String} str 1485 | * @return {Number} 1486 | * @api private 1487 | */ 1488 | 1489 | function parse(str) { 1490 | str = String(str); 1491 | if (str.length > 100) { 1492 | return; 1493 | } 1494 | var match = /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec( 1495 | str 1496 | ); 1497 | if (!match) { 1498 | return; 1499 | } 1500 | var n = parseFloat(match[1]); 1501 | var type = (match[2] || 'ms').toLowerCase(); 1502 | switch (type) { 1503 | case 'years': 1504 | case 'year': 1505 | case 'yrs': 1506 | case 'yr': 1507 | case 'y': 1508 | return n * y; 1509 | case 'weeks': 1510 | case 'week': 1511 | case 'w': 1512 | return n * w; 1513 | case 'days': 1514 | case 'day': 1515 | case 'd': 1516 | return n * d; 1517 | case 'hours': 1518 | case 'hour': 1519 | case 'hrs': 1520 | case 'hr': 1521 | case 'h': 1522 | return n * h; 1523 | case 'minutes': 1524 | case 'minute': 1525 | case 'mins': 1526 | case 'min': 1527 | case 'm': 1528 | return n * m; 1529 | case 'seconds': 1530 | case 'second': 1531 | case 'secs': 1532 | case 'sec': 1533 | case 's': 1534 | return n * s; 1535 | case 'milliseconds': 1536 | case 'millisecond': 1537 | case 'msecs': 1538 | case 'msec': 1539 | case 'ms': 1540 | return n; 1541 | default: 1542 | return undefined; 1543 | } 1544 | } 1545 | 1546 | /** 1547 | * Short format for `ms`. 1548 | * 1549 | * @param {Number} ms 1550 | * @return {String} 1551 | * @api private 1552 | */ 1553 | 1554 | function fmtShort(ms) { 1555 | var msAbs = Math.abs(ms); 1556 | if (msAbs >= d) { 1557 | return Math.round(ms / d) + 'd'; 1558 | } 1559 | if (msAbs >= h) { 1560 | return Math.round(ms / h) + 'h'; 1561 | } 1562 | if (msAbs >= m) { 1563 | return Math.round(ms / m) + 'm'; 1564 | } 1565 | if (msAbs >= s) { 1566 | return Math.round(ms / s) + 's'; 1567 | } 1568 | return ms + 'ms'; 1569 | } 1570 | 1571 | /** 1572 | * Long format for `ms`. 1573 | * 1574 | * @param {Number} ms 1575 | * @return {String} 1576 | * @api private 1577 | */ 1578 | 1579 | function fmtLong(ms) { 1580 | var msAbs = Math.abs(ms); 1581 | if (msAbs >= d) { 1582 | return plural(ms, msAbs, d, 'day'); 1583 | } 1584 | if (msAbs >= h) { 1585 | return plural(ms, msAbs, h, 'hour'); 1586 | } 1587 | if (msAbs >= m) { 1588 | return plural(ms, msAbs, m, 'minute'); 1589 | } 1590 | if (msAbs >= s) { 1591 | return plural(ms, msAbs, s, 'second'); 1592 | } 1593 | return ms + ' ms'; 1594 | } 1595 | 1596 | /** 1597 | * Pluralization helper. 1598 | */ 1599 | 1600 | function plural(ms, msAbs, n, name) { 1601 | var isPlural = msAbs >= n * 1.5; 1602 | return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : ''); 1603 | } 1604 | 1605 | 1606 | /***/ }), 1607 | 1608 | /***/ 1450: 1609 | /***/ ((module, __unused_webpack_exports, __webpack_require__) => { 1610 | 1611 | "use strict"; 1612 | 1613 | const os = __webpack_require__(857); 1614 | const tty = __webpack_require__(2018); 1615 | const hasFlag = __webpack_require__(3813); 1616 | 1617 | const {env} = process; 1618 | 1619 | let forceColor; 1620 | if (hasFlag('no-color') || 1621 | hasFlag('no-colors') || 1622 | hasFlag('color=false') || 1623 | hasFlag('color=never')) { 1624 | forceColor = 0; 1625 | } else if (hasFlag('color') || 1626 | hasFlag('colors') || 1627 | hasFlag('color=true') || 1628 | hasFlag('color=always')) { 1629 | forceColor = 1; 1630 | } 1631 | 1632 | if ('FORCE_COLOR' in env) { 1633 | if (env.FORCE_COLOR === 'true') { 1634 | forceColor = 1; 1635 | } else if (env.FORCE_COLOR === 'false') { 1636 | forceColor = 0; 1637 | } else { 1638 | forceColor = env.FORCE_COLOR.length === 0 ? 1 : Math.min(parseInt(env.FORCE_COLOR, 10), 3); 1639 | } 1640 | } 1641 | 1642 | function translateLevel(level) { 1643 | if (level === 0) { 1644 | return false; 1645 | } 1646 | 1647 | return { 1648 | level, 1649 | hasBasic: true, 1650 | has256: level >= 2, 1651 | has16m: level >= 3 1652 | }; 1653 | } 1654 | 1655 | function supportsColor(haveStream, streamIsTTY) { 1656 | if (forceColor === 0) { 1657 | return 0; 1658 | } 1659 | 1660 | if (hasFlag('color=16m') || 1661 | hasFlag('color=full') || 1662 | hasFlag('color=truecolor')) { 1663 | return 3; 1664 | } 1665 | 1666 | if (hasFlag('color=256')) { 1667 | return 2; 1668 | } 1669 | 1670 | if (haveStream && !streamIsTTY && forceColor === undefined) { 1671 | return 0; 1672 | } 1673 | 1674 | const min = forceColor || 0; 1675 | 1676 | if (env.TERM === 'dumb') { 1677 | return min; 1678 | } 1679 | 1680 | if (process.platform === 'win32') { 1681 | // Windows 10 build 10586 is the first Windows release that supports 256 colors. 1682 | // Windows 10 build 14931 is the first release that supports 16m/TrueColor. 1683 | const osRelease = os.release().split('.'); 1684 | if ( 1685 | Number(osRelease[0]) >= 10 && 1686 | Number(osRelease[2]) >= 10586 1687 | ) { 1688 | return Number(osRelease[2]) >= 14931 ? 3 : 2; 1689 | } 1690 | 1691 | return 1; 1692 | } 1693 | 1694 | if ('CI' in env) { 1695 | if (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI', 'GITHUB_ACTIONS', 'BUILDKITE'].some(sign => sign in env) || env.CI_NAME === 'codeship') { 1696 | return 1; 1697 | } 1698 | 1699 | return min; 1700 | } 1701 | 1702 | if ('TEAMCITY_VERSION' in env) { 1703 | return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0; 1704 | } 1705 | 1706 | if (env.COLORTERM === 'truecolor') { 1707 | return 3; 1708 | } 1709 | 1710 | if ('TERM_PROGRAM' in env) { 1711 | const version = parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10); 1712 | 1713 | switch (env.TERM_PROGRAM) { 1714 | case 'iTerm.app': 1715 | return version >= 3 ? 3 : 2; 1716 | case 'Apple_Terminal': 1717 | return 2; 1718 | // No default 1719 | } 1720 | } 1721 | 1722 | if (/-256(color)?$/i.test(env.TERM)) { 1723 | return 2; 1724 | } 1725 | 1726 | if (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) { 1727 | return 1; 1728 | } 1729 | 1730 | if ('COLORTERM' in env) { 1731 | return 1; 1732 | } 1733 | 1734 | return min; 1735 | } 1736 | 1737 | function getSupportLevel(stream) { 1738 | const level = supportsColor(stream, stream && stream.isTTY); 1739 | return translateLevel(level); 1740 | } 1741 | 1742 | module.exports = { 1743 | supportsColor: getSupportLevel, 1744 | stdout: translateLevel(supportsColor(true, tty.isatty(1))), 1745 | stderr: translateLevel(supportsColor(true, tty.isatty(2))) 1746 | }; 1747 | 1748 | 1749 | /***/ }) 1750 | 1751 | }; 1752 | ; -------------------------------------------------------------------------------- /eslint.config.mjs: -------------------------------------------------------------------------------- 1 | import js from '@eslint/js'; 2 | import ts from 'typescript-eslint'; 3 | import tsParser from '@typescript-eslint/parser'; 4 | 5 | import prettierRecommended from 'eslint-plugin-prettier/recommended'; 6 | 7 | export default ts.config( 8 | js.configs.recommended, 9 | ts.configs.eslintRecommended, 10 | { 11 | files: ['**/*.ts', '**/*.tsx'], 12 | languageOptions: { 13 | parser: tsParser, 14 | }, 15 | }, 16 | { ignores: ['dist/', '**/*.js'] }, 17 | prettierRecommended, 18 | ); 19 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "get-secretmanager-secrets", 3 | "version": "3.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "get-secretmanager-secrets", 9 | "version": "3.0.0", 10 | "license": "Apache-2.0", 11 | "dependencies": { 12 | "@actions/core": "^1.11.1", 13 | "@actions/http-client": "^2.2.3", 14 | "@google-github-actions/actions-utils": "^1.0.1", 15 | "google-auth-library": "^10.1.0" 16 | }, 17 | "devDependencies": { 18 | "@eslint/eslintrc": "^3.3.1", 19 | "@eslint/js": "^9.31.0", 20 | "@types/node": "^24.0.14", 21 | "@typescript-eslint/eslint-plugin": "^8.37.0", 22 | "@typescript-eslint/parser": "^8.37.0", 23 | "@vercel/ncc": "^0.38.3", 24 | "eslint": "^9.31.0", 25 | "eslint-config-prettier": "^10.1.8", 26 | "eslint-plugin-prettier": "^5.5.3", 27 | "prettier": "^3.6.2", 28 | "ts-node": "^10.9.2", 29 | "typescript": "^5.8.3", 30 | "typescript-eslint": "^8.37.0" 31 | }, 32 | "engines": { 33 | "node": ">= 24.x", 34 | "npm": ">= 11.x" 35 | } 36 | }, 37 | "node_modules/@actions/core": { 38 | "version": "1.11.1", 39 | "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.11.1.tgz", 40 | "integrity": "sha512-hXJCSrkwfA46Vd9Z3q4cpEpHB1rL5NG04+/rbqW9d3+CSvtB1tYe8UTpAlixa1vj0m/ULglfEK2UKxMGxCxv5A==", 41 | "license": "MIT", 42 | "dependencies": { 43 | "@actions/exec": "^1.1.1", 44 | "@actions/http-client": "^2.0.1" 45 | } 46 | }, 47 | "node_modules/@actions/exec": { 48 | "version": "1.1.1", 49 | "resolved": "https://registry.npmjs.org/@actions/exec/-/exec-1.1.1.tgz", 50 | "integrity": "sha512-+sCcHHbVdk93a0XT19ECtO/gIXoxvdsgQLzb2fE2/5sIZmWQuluYyjPQtrtTHdU1YzTZ7bAPN4sITq2xi1679w==", 51 | "license": "MIT", 52 | "dependencies": { 53 | "@actions/io": "^1.0.1" 54 | } 55 | }, 56 | "node_modules/@actions/http-client": { 57 | "version": "2.2.3", 58 | "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.2.3.tgz", 59 | "integrity": "sha512-mx8hyJi/hjFvbPokCg4uRd4ZX78t+YyRPtnKWwIl+RzNaVuFpQHfmlGVfsKEJN8LwTCvL+DfVgAM04XaHkm6bA==", 60 | "license": "MIT", 61 | "dependencies": { 62 | "tunnel": "^0.0.6", 63 | "undici": "^5.25.4" 64 | } 65 | }, 66 | "node_modules/@actions/io": { 67 | "version": "1.1.3", 68 | "resolved": "https://registry.npmjs.org/@actions/io/-/io-1.1.3.tgz", 69 | "integrity": "sha512-wi9JjgKLYS7U/z8PPbco+PvTb/nRWjeoFlJ1Qer83k/3C5PHQi28hiVdeE2kHXmIL99mQFawx8qt/JPjZilJ8Q==", 70 | "license": "MIT" 71 | }, 72 | "node_modules/@cspotcode/source-map-support": { 73 | "version": "0.8.1", 74 | "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", 75 | "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", 76 | "dev": true, 77 | "license": "MIT", 78 | "dependencies": { 79 | "@jridgewell/trace-mapping": "0.3.9" 80 | }, 81 | "engines": { 82 | "node": ">=12" 83 | } 84 | }, 85 | "node_modules/@eslint-community/eslint-utils": { 86 | "version": "4.7.0", 87 | "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", 88 | "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", 89 | "dev": true, 90 | "license": "MIT", 91 | "dependencies": { 92 | "eslint-visitor-keys": "^3.4.3" 93 | }, 94 | "engines": { 95 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 96 | }, 97 | "funding": { 98 | "url": "https://opencollective.com/eslint" 99 | }, 100 | "peerDependencies": { 101 | "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" 102 | } 103 | }, 104 | "node_modules/@eslint-community/regexpp": { 105 | "version": "4.12.1", 106 | "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", 107 | "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", 108 | "dev": true, 109 | "license": "MIT", 110 | "engines": { 111 | "node": "^12.0.0 || ^14.0.0 || >=16.0.0" 112 | } 113 | }, 114 | "node_modules/@eslint/config-array": { 115 | "version": "0.21.0", 116 | "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", 117 | "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", 118 | "dev": true, 119 | "license": "Apache-2.0", 120 | "dependencies": { 121 | "@eslint/object-schema": "^2.1.6", 122 | "debug": "^4.3.1", 123 | "minimatch": "^3.1.2" 124 | }, 125 | "engines": { 126 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 127 | } 128 | }, 129 | "node_modules/@eslint/config-helpers": { 130 | "version": "0.3.1", 131 | "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.1.tgz", 132 | "integrity": "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==", 133 | "dev": true, 134 | "license": "Apache-2.0", 135 | "engines": { 136 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 137 | } 138 | }, 139 | "node_modules/@eslint/core": { 140 | "version": "0.15.2", 141 | "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz", 142 | "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==", 143 | "dev": true, 144 | "license": "Apache-2.0", 145 | "dependencies": { 146 | "@types/json-schema": "^7.0.15" 147 | }, 148 | "engines": { 149 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 150 | } 151 | }, 152 | "node_modules/@eslint/eslintrc": { 153 | "version": "3.3.1", 154 | "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", 155 | "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", 156 | "dev": true, 157 | "license": "MIT", 158 | "dependencies": { 159 | "ajv": "^6.12.4", 160 | "debug": "^4.3.2", 161 | "espree": "^10.0.1", 162 | "globals": "^14.0.0", 163 | "ignore": "^5.2.0", 164 | "import-fresh": "^3.2.1", 165 | "js-yaml": "^4.1.0", 166 | "minimatch": "^3.1.2", 167 | "strip-json-comments": "^3.1.1" 168 | }, 169 | "engines": { 170 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 171 | }, 172 | "funding": { 173 | "url": "https://opencollective.com/eslint" 174 | } 175 | }, 176 | "node_modules/@eslint/js": { 177 | "version": "9.34.0", 178 | "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.34.0.tgz", 179 | "integrity": "sha512-EoyvqQnBNsV1CWaEJ559rxXL4c8V92gxirbawSmVUOWXlsRxxQXl6LmCpdUblgxgSkDIqKnhzba2SjRTI/A5Rw==", 180 | "dev": true, 181 | "license": "MIT", 182 | "engines": { 183 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 184 | }, 185 | "funding": { 186 | "url": "https://eslint.org/donate" 187 | } 188 | }, 189 | "node_modules/@eslint/object-schema": { 190 | "version": "2.1.6", 191 | "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", 192 | "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", 193 | "dev": true, 194 | "license": "Apache-2.0", 195 | "engines": { 196 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 197 | } 198 | }, 199 | "node_modules/@eslint/plugin-kit": { 200 | "version": "0.3.5", 201 | "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz", 202 | "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==", 203 | "dev": true, 204 | "license": "Apache-2.0", 205 | "dependencies": { 206 | "@eslint/core": "^0.15.2", 207 | "levn": "^0.4.1" 208 | }, 209 | "engines": { 210 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 211 | } 212 | }, 213 | "node_modules/@fastify/busboy": { 214 | "version": "2.1.1", 215 | "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", 216 | "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", 217 | "license": "MIT", 218 | "engines": { 219 | "node": ">=14" 220 | } 221 | }, 222 | "node_modules/@google-github-actions/actions-utils": { 223 | "version": "1.0.1", 224 | "resolved": "https://registry.npmjs.org/@google-github-actions/actions-utils/-/actions-utils-1.0.1.tgz", 225 | "integrity": "sha512-dEvNcy63a6pkcMsRhWbfjNePsv4kR61O56mQ9rVXvRgjAvRkZTBiM1G7QSnHulMEjhLIlTEGlBIKEKIxCoonkQ==", 226 | "license": "Apache-2.0", 227 | "dependencies": { 228 | "yaml": "^2.8.1" 229 | }, 230 | "bin": { 231 | "actions-gen-readme": "bin/actions-gen-readme.mjs" 232 | }, 233 | "engines": { 234 | "node": ">= 24.x", 235 | "npm": ">= 11.x" 236 | } 237 | }, 238 | "node_modules/@humanfs/core": { 239 | "version": "0.19.1", 240 | "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", 241 | "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", 242 | "dev": true, 243 | "license": "Apache-2.0", 244 | "engines": { 245 | "node": ">=18.18.0" 246 | } 247 | }, 248 | "node_modules/@humanfs/node": { 249 | "version": "0.16.6", 250 | "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", 251 | "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", 252 | "dev": true, 253 | "license": "Apache-2.0", 254 | "dependencies": { 255 | "@humanfs/core": "^0.19.1", 256 | "@humanwhocodes/retry": "^0.3.0" 257 | }, 258 | "engines": { 259 | "node": ">=18.18.0" 260 | } 261 | }, 262 | "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { 263 | "version": "0.3.1", 264 | "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", 265 | "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", 266 | "dev": true, 267 | "license": "Apache-2.0", 268 | "engines": { 269 | "node": ">=18.18" 270 | }, 271 | "funding": { 272 | "type": "github", 273 | "url": "https://github.com/sponsors/nzakas" 274 | } 275 | }, 276 | "node_modules/@humanwhocodes/module-importer": { 277 | "version": "1.0.1", 278 | "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", 279 | "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", 280 | "dev": true, 281 | "license": "Apache-2.0", 282 | "engines": { 283 | "node": ">=12.22" 284 | }, 285 | "funding": { 286 | "type": "github", 287 | "url": "https://github.com/sponsors/nzakas" 288 | } 289 | }, 290 | "node_modules/@humanwhocodes/retry": { 291 | "version": "0.4.3", 292 | "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", 293 | "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", 294 | "dev": true, 295 | "license": "Apache-2.0", 296 | "engines": { 297 | "node": ">=18.18" 298 | }, 299 | "funding": { 300 | "type": "github", 301 | "url": "https://github.com/sponsors/nzakas" 302 | } 303 | }, 304 | "node_modules/@jridgewell/resolve-uri": { 305 | "version": "3.1.2", 306 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", 307 | "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", 308 | "dev": true, 309 | "license": "MIT", 310 | "engines": { 311 | "node": ">=6.0.0" 312 | } 313 | }, 314 | "node_modules/@jridgewell/sourcemap-codec": { 315 | "version": "1.5.5", 316 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", 317 | "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", 318 | "dev": true, 319 | "license": "MIT" 320 | }, 321 | "node_modules/@jridgewell/trace-mapping": { 322 | "version": "0.3.9", 323 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", 324 | "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", 325 | "dev": true, 326 | "license": "MIT", 327 | "dependencies": { 328 | "@jridgewell/resolve-uri": "^3.0.3", 329 | "@jridgewell/sourcemap-codec": "^1.4.10" 330 | } 331 | }, 332 | "node_modules/@nodelib/fs.scandir": { 333 | "version": "2.1.5", 334 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 335 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 336 | "dev": true, 337 | "license": "MIT", 338 | "dependencies": { 339 | "@nodelib/fs.stat": "2.0.5", 340 | "run-parallel": "^1.1.9" 341 | }, 342 | "engines": { 343 | "node": ">= 8" 344 | } 345 | }, 346 | "node_modules/@nodelib/fs.stat": { 347 | "version": "2.0.5", 348 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 349 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 350 | "dev": true, 351 | "license": "MIT", 352 | "engines": { 353 | "node": ">= 8" 354 | } 355 | }, 356 | "node_modules/@nodelib/fs.walk": { 357 | "version": "1.2.8", 358 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 359 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 360 | "dev": true, 361 | "license": "MIT", 362 | "dependencies": { 363 | "@nodelib/fs.scandir": "2.1.5", 364 | "fastq": "^1.6.0" 365 | }, 366 | "engines": { 367 | "node": ">= 8" 368 | } 369 | }, 370 | "node_modules/@pkgr/core": { 371 | "version": "0.2.9", 372 | "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", 373 | "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", 374 | "dev": true, 375 | "license": "MIT", 376 | "engines": { 377 | "node": "^12.20.0 || ^14.18.0 || >=16.0.0" 378 | }, 379 | "funding": { 380 | "url": "https://opencollective.com/pkgr" 381 | } 382 | }, 383 | "node_modules/@tsconfig/node10": { 384 | "version": "1.0.11", 385 | "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", 386 | "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", 387 | "dev": true, 388 | "license": "MIT" 389 | }, 390 | "node_modules/@tsconfig/node12": { 391 | "version": "1.0.11", 392 | "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", 393 | "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", 394 | "dev": true, 395 | "license": "MIT" 396 | }, 397 | "node_modules/@tsconfig/node14": { 398 | "version": "1.0.3", 399 | "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", 400 | "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", 401 | "dev": true, 402 | "license": "MIT" 403 | }, 404 | "node_modules/@tsconfig/node16": { 405 | "version": "1.0.4", 406 | "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", 407 | "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", 408 | "dev": true, 409 | "license": "MIT" 410 | }, 411 | "node_modules/@types/estree": { 412 | "version": "1.0.8", 413 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", 414 | "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", 415 | "dev": true, 416 | "license": "MIT" 417 | }, 418 | "node_modules/@types/json-schema": { 419 | "version": "7.0.15", 420 | "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", 421 | "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", 422 | "dev": true, 423 | "license": "MIT" 424 | }, 425 | "node_modules/@types/node": { 426 | "version": "24.3.0", 427 | "resolved": "https://registry.npmjs.org/@types/node/-/node-24.3.0.tgz", 428 | "integrity": "sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==", 429 | "dev": true, 430 | "license": "MIT", 431 | "dependencies": { 432 | "undici-types": "~7.10.0" 433 | } 434 | }, 435 | "node_modules/@typescript-eslint/eslint-plugin": { 436 | "version": "8.42.0", 437 | "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.42.0.tgz", 438 | "integrity": "sha512-Aq2dPqsQkxHOLfb2OPv43RnIvfj05nw8v/6n3B2NABIPpHnjQnaLo9QGMTvml+tv4korl/Cjfrb/BYhoL8UUTQ==", 439 | "dev": true, 440 | "license": "MIT", 441 | "dependencies": { 442 | "@eslint-community/regexpp": "^4.10.0", 443 | "@typescript-eslint/scope-manager": "8.42.0", 444 | "@typescript-eslint/type-utils": "8.42.0", 445 | "@typescript-eslint/utils": "8.42.0", 446 | "@typescript-eslint/visitor-keys": "8.42.0", 447 | "graphemer": "^1.4.0", 448 | "ignore": "^7.0.0", 449 | "natural-compare": "^1.4.0", 450 | "ts-api-utils": "^2.1.0" 451 | }, 452 | "engines": { 453 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 454 | }, 455 | "funding": { 456 | "type": "opencollective", 457 | "url": "https://opencollective.com/typescript-eslint" 458 | }, 459 | "peerDependencies": { 460 | "@typescript-eslint/parser": "^8.42.0", 461 | "eslint": "^8.57.0 || ^9.0.0", 462 | "typescript": ">=4.8.4 <6.0.0" 463 | } 464 | }, 465 | "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { 466 | "version": "7.0.5", 467 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", 468 | "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", 469 | "dev": true, 470 | "license": "MIT", 471 | "engines": { 472 | "node": ">= 4" 473 | } 474 | }, 475 | "node_modules/@typescript-eslint/parser": { 476 | "version": "8.42.0", 477 | "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.42.0.tgz", 478 | "integrity": "sha512-r1XG74QgShUgXph1BYseJ+KZd17bKQib/yF3SR+demvytiRXrwd12Blnz5eYGm8tXaeRdd4x88MlfwldHoudGg==", 479 | "dev": true, 480 | "license": "MIT", 481 | "dependencies": { 482 | "@typescript-eslint/scope-manager": "8.42.0", 483 | "@typescript-eslint/types": "8.42.0", 484 | "@typescript-eslint/typescript-estree": "8.42.0", 485 | "@typescript-eslint/visitor-keys": "8.42.0", 486 | "debug": "^4.3.4" 487 | }, 488 | "engines": { 489 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 490 | }, 491 | "funding": { 492 | "type": "opencollective", 493 | "url": "https://opencollective.com/typescript-eslint" 494 | }, 495 | "peerDependencies": { 496 | "eslint": "^8.57.0 || ^9.0.0", 497 | "typescript": ">=4.8.4 <6.0.0" 498 | } 499 | }, 500 | "node_modules/@typescript-eslint/project-service": { 501 | "version": "8.42.0", 502 | "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.42.0.tgz", 503 | "integrity": "sha512-vfVpLHAhbPjilrabtOSNcUDmBboQNrJUiNAGoImkZKnMjs2TIcWG33s4Ds0wY3/50aZmTMqJa6PiwkwezaAklg==", 504 | "dev": true, 505 | "license": "MIT", 506 | "dependencies": { 507 | "@typescript-eslint/tsconfig-utils": "^8.42.0", 508 | "@typescript-eslint/types": "^8.42.0", 509 | "debug": "^4.3.4" 510 | }, 511 | "engines": { 512 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 513 | }, 514 | "funding": { 515 | "type": "opencollective", 516 | "url": "https://opencollective.com/typescript-eslint" 517 | }, 518 | "peerDependencies": { 519 | "typescript": ">=4.8.4 <6.0.0" 520 | } 521 | }, 522 | "node_modules/@typescript-eslint/scope-manager": { 523 | "version": "8.42.0", 524 | "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.42.0.tgz", 525 | "integrity": "sha512-51+x9o78NBAVgQzOPd17DkNTnIzJ8T/O2dmMBLoK9qbY0Gm52XJcdJcCl18ExBMiHo6jPMErUQWUv5RLE51zJw==", 526 | "dev": true, 527 | "license": "MIT", 528 | "dependencies": { 529 | "@typescript-eslint/types": "8.42.0", 530 | "@typescript-eslint/visitor-keys": "8.42.0" 531 | }, 532 | "engines": { 533 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 534 | }, 535 | "funding": { 536 | "type": "opencollective", 537 | "url": "https://opencollective.com/typescript-eslint" 538 | } 539 | }, 540 | "node_modules/@typescript-eslint/tsconfig-utils": { 541 | "version": "8.42.0", 542 | "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.42.0.tgz", 543 | "integrity": "sha512-kHeFUOdwAJfUmYKjR3CLgZSglGHjbNTi1H8sTYRYV2xX6eNz4RyJ2LIgsDLKf8Yi0/GL1WZAC/DgZBeBft8QAQ==", 544 | "dev": true, 545 | "license": "MIT", 546 | "engines": { 547 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 548 | }, 549 | "funding": { 550 | "type": "opencollective", 551 | "url": "https://opencollective.com/typescript-eslint" 552 | }, 553 | "peerDependencies": { 554 | "typescript": ">=4.8.4 <6.0.0" 555 | } 556 | }, 557 | "node_modules/@typescript-eslint/type-utils": { 558 | "version": "8.42.0", 559 | "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.42.0.tgz", 560 | "integrity": "sha512-9KChw92sbPTYVFw3JLRH1ockhyR3zqqn9lQXol3/YbI6jVxzWoGcT3AsAW0mu1MY0gYtsXnUGV/AKpkAj5tVlQ==", 561 | "dev": true, 562 | "license": "MIT", 563 | "dependencies": { 564 | "@typescript-eslint/types": "8.42.0", 565 | "@typescript-eslint/typescript-estree": "8.42.0", 566 | "@typescript-eslint/utils": "8.42.0", 567 | "debug": "^4.3.4", 568 | "ts-api-utils": "^2.1.0" 569 | }, 570 | "engines": { 571 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 572 | }, 573 | "funding": { 574 | "type": "opencollective", 575 | "url": "https://opencollective.com/typescript-eslint" 576 | }, 577 | "peerDependencies": { 578 | "eslint": "^8.57.0 || ^9.0.0", 579 | "typescript": ">=4.8.4 <6.0.0" 580 | } 581 | }, 582 | "node_modules/@typescript-eslint/types": { 583 | "version": "8.42.0", 584 | "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.42.0.tgz", 585 | "integrity": "sha512-LdtAWMiFmbRLNP7JNeY0SqEtJvGMYSzfiWBSmx+VSZ1CH+1zyl8Mmw1TT39OrtsRvIYShjJWzTDMPWZJCpwBlw==", 586 | "dev": true, 587 | "license": "MIT", 588 | "engines": { 589 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 590 | }, 591 | "funding": { 592 | "type": "opencollective", 593 | "url": "https://opencollective.com/typescript-eslint" 594 | } 595 | }, 596 | "node_modules/@typescript-eslint/typescript-estree": { 597 | "version": "8.42.0", 598 | "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.42.0.tgz", 599 | "integrity": "sha512-ku/uYtT4QXY8sl9EDJETD27o3Ewdi72hcXg1ah/kkUgBvAYHLwj2ofswFFNXS+FL5G+AGkxBtvGt8pFBHKlHsQ==", 600 | "dev": true, 601 | "license": "MIT", 602 | "dependencies": { 603 | "@typescript-eslint/project-service": "8.42.0", 604 | "@typescript-eslint/tsconfig-utils": "8.42.0", 605 | "@typescript-eslint/types": "8.42.0", 606 | "@typescript-eslint/visitor-keys": "8.42.0", 607 | "debug": "^4.3.4", 608 | "fast-glob": "^3.3.2", 609 | "is-glob": "^4.0.3", 610 | "minimatch": "^9.0.4", 611 | "semver": "^7.6.0", 612 | "ts-api-utils": "^2.1.0" 613 | }, 614 | "engines": { 615 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 616 | }, 617 | "funding": { 618 | "type": "opencollective", 619 | "url": "https://opencollective.com/typescript-eslint" 620 | }, 621 | "peerDependencies": { 622 | "typescript": ">=4.8.4 <6.0.0" 623 | } 624 | }, 625 | "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { 626 | "version": "2.0.2", 627 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", 628 | "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", 629 | "dev": true, 630 | "license": "MIT", 631 | "dependencies": { 632 | "balanced-match": "^1.0.0" 633 | } 634 | }, 635 | "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { 636 | "version": "9.0.5", 637 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", 638 | "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", 639 | "dev": true, 640 | "license": "ISC", 641 | "dependencies": { 642 | "brace-expansion": "^2.0.1" 643 | }, 644 | "engines": { 645 | "node": ">=16 || 14 >=14.17" 646 | }, 647 | "funding": { 648 | "url": "https://github.com/sponsors/isaacs" 649 | } 650 | }, 651 | "node_modules/@typescript-eslint/utils": { 652 | "version": "8.42.0", 653 | "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.42.0.tgz", 654 | "integrity": "sha512-JnIzu7H3RH5BrKC4NoZqRfmjqCIS1u3hGZltDYJgkVdqAezl4L9d1ZLw+36huCujtSBSAirGINF/S4UxOcR+/g==", 655 | "dev": true, 656 | "license": "MIT", 657 | "dependencies": { 658 | "@eslint-community/eslint-utils": "^4.7.0", 659 | "@typescript-eslint/scope-manager": "8.42.0", 660 | "@typescript-eslint/types": "8.42.0", 661 | "@typescript-eslint/typescript-estree": "8.42.0" 662 | }, 663 | "engines": { 664 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 665 | }, 666 | "funding": { 667 | "type": "opencollective", 668 | "url": "https://opencollective.com/typescript-eslint" 669 | }, 670 | "peerDependencies": { 671 | "eslint": "^8.57.0 || ^9.0.0", 672 | "typescript": ">=4.8.4 <6.0.0" 673 | } 674 | }, 675 | "node_modules/@typescript-eslint/visitor-keys": { 676 | "version": "8.42.0", 677 | "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.42.0.tgz", 678 | "integrity": "sha512-3WbiuzoEowaEn8RSnhJBrxSwX8ULYE9CXaPepS2C2W3NSA5NNIvBaslpBSBElPq0UGr0xVJlXFWOAKIkyylydQ==", 679 | "dev": true, 680 | "license": "MIT", 681 | "dependencies": { 682 | "@typescript-eslint/types": "8.42.0", 683 | "eslint-visitor-keys": "^4.2.1" 684 | }, 685 | "engines": { 686 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 687 | }, 688 | "funding": { 689 | "type": "opencollective", 690 | "url": "https://opencollective.com/typescript-eslint" 691 | } 692 | }, 693 | "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { 694 | "version": "4.2.1", 695 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", 696 | "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", 697 | "dev": true, 698 | "license": "Apache-2.0", 699 | "engines": { 700 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 701 | }, 702 | "funding": { 703 | "url": "https://opencollective.com/eslint" 704 | } 705 | }, 706 | "node_modules/@vercel/ncc": { 707 | "version": "0.38.3", 708 | "resolved": "https://registry.npmjs.org/@vercel/ncc/-/ncc-0.38.3.tgz", 709 | "integrity": "sha512-rnK6hJBS6mwc+Bkab+PGPs9OiS0i/3kdTO+CkI8V0/VrW3vmz7O2Pxjw/owOlmo6PKEIxRSeZKv/kuL9itnpYA==", 710 | "dev": true, 711 | "license": "MIT", 712 | "bin": { 713 | "ncc": "dist/ncc/cli.js" 714 | } 715 | }, 716 | "node_modules/acorn": { 717 | "version": "8.15.0", 718 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", 719 | "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", 720 | "dev": true, 721 | "license": "MIT", 722 | "bin": { 723 | "acorn": "bin/acorn" 724 | }, 725 | "engines": { 726 | "node": ">=0.4.0" 727 | } 728 | }, 729 | "node_modules/acorn-jsx": { 730 | "version": "5.3.2", 731 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", 732 | "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", 733 | "dev": true, 734 | "license": "MIT", 735 | "peerDependencies": { 736 | "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" 737 | } 738 | }, 739 | "node_modules/acorn-walk": { 740 | "version": "8.3.4", 741 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", 742 | "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", 743 | "dev": true, 744 | "license": "MIT", 745 | "dependencies": { 746 | "acorn": "^8.11.0" 747 | }, 748 | "engines": { 749 | "node": ">=0.4.0" 750 | } 751 | }, 752 | "node_modules/agent-base": { 753 | "version": "7.1.4", 754 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", 755 | "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", 756 | "license": "MIT", 757 | "engines": { 758 | "node": ">= 14" 759 | } 760 | }, 761 | "node_modules/ajv": { 762 | "version": "6.12.6", 763 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 764 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 765 | "dev": true, 766 | "license": "MIT", 767 | "dependencies": { 768 | "fast-deep-equal": "^3.1.1", 769 | "fast-json-stable-stringify": "^2.0.0", 770 | "json-schema-traverse": "^0.4.1", 771 | "uri-js": "^4.2.2" 772 | }, 773 | "funding": { 774 | "type": "github", 775 | "url": "https://github.com/sponsors/epoberezkin" 776 | } 777 | }, 778 | "node_modules/ansi-styles": { 779 | "version": "4.3.0", 780 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 781 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 782 | "dev": true, 783 | "license": "MIT", 784 | "dependencies": { 785 | "color-convert": "^2.0.1" 786 | }, 787 | "engines": { 788 | "node": ">=8" 789 | }, 790 | "funding": { 791 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 792 | } 793 | }, 794 | "node_modules/arg": { 795 | "version": "4.1.3", 796 | "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", 797 | "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", 798 | "dev": true, 799 | "license": "MIT" 800 | }, 801 | "node_modules/argparse": { 802 | "version": "2.0.1", 803 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 804 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 805 | "dev": true, 806 | "license": "Python-2.0" 807 | }, 808 | "node_modules/balanced-match": { 809 | "version": "1.0.2", 810 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 811 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 812 | "dev": true, 813 | "license": "MIT" 814 | }, 815 | "node_modules/base64-js": { 816 | "version": "1.5.1", 817 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 818 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", 819 | "funding": [ 820 | { 821 | "type": "github", 822 | "url": "https://github.com/sponsors/feross" 823 | }, 824 | { 825 | "type": "patreon", 826 | "url": "https://www.patreon.com/feross" 827 | }, 828 | { 829 | "type": "consulting", 830 | "url": "https://feross.org/support" 831 | } 832 | ], 833 | "license": "MIT" 834 | }, 835 | "node_modules/bignumber.js": { 836 | "version": "9.3.1", 837 | "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", 838 | "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==", 839 | "license": "MIT", 840 | "engines": { 841 | "node": "*" 842 | } 843 | }, 844 | "node_modules/brace-expansion": { 845 | "version": "1.1.12", 846 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", 847 | "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", 848 | "dev": true, 849 | "license": "MIT", 850 | "dependencies": { 851 | "balanced-match": "^1.0.0", 852 | "concat-map": "0.0.1" 853 | } 854 | }, 855 | "node_modules/braces": { 856 | "version": "3.0.3", 857 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", 858 | "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", 859 | "dev": true, 860 | "license": "MIT", 861 | "dependencies": { 862 | "fill-range": "^7.1.1" 863 | }, 864 | "engines": { 865 | "node": ">=8" 866 | } 867 | }, 868 | "node_modules/buffer-equal-constant-time": { 869 | "version": "1.0.1", 870 | "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", 871 | "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", 872 | "license": "BSD-3-Clause" 873 | }, 874 | "node_modules/callsites": { 875 | "version": "3.1.0", 876 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 877 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 878 | "dev": true, 879 | "license": "MIT", 880 | "engines": { 881 | "node": ">=6" 882 | } 883 | }, 884 | "node_modules/chalk": { 885 | "version": "4.1.2", 886 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 887 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 888 | "dev": true, 889 | "license": "MIT", 890 | "dependencies": { 891 | "ansi-styles": "^4.1.0", 892 | "supports-color": "^7.1.0" 893 | }, 894 | "engines": { 895 | "node": ">=10" 896 | }, 897 | "funding": { 898 | "url": "https://github.com/chalk/chalk?sponsor=1" 899 | } 900 | }, 901 | "node_modules/color-convert": { 902 | "version": "2.0.1", 903 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 904 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 905 | "dev": true, 906 | "license": "MIT", 907 | "dependencies": { 908 | "color-name": "~1.1.4" 909 | }, 910 | "engines": { 911 | "node": ">=7.0.0" 912 | } 913 | }, 914 | "node_modules/color-name": { 915 | "version": "1.1.4", 916 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 917 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 918 | "dev": true, 919 | "license": "MIT" 920 | }, 921 | "node_modules/concat-map": { 922 | "version": "0.0.1", 923 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 924 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 925 | "dev": true, 926 | "license": "MIT" 927 | }, 928 | "node_modules/create-require": { 929 | "version": "1.1.1", 930 | "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", 931 | "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", 932 | "dev": true, 933 | "license": "MIT" 934 | }, 935 | "node_modules/cross-spawn": { 936 | "version": "7.0.6", 937 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", 938 | "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", 939 | "dev": true, 940 | "license": "MIT", 941 | "dependencies": { 942 | "path-key": "^3.1.0", 943 | "shebang-command": "^2.0.0", 944 | "which": "^2.0.1" 945 | }, 946 | "engines": { 947 | "node": ">= 8" 948 | } 949 | }, 950 | "node_modules/data-uri-to-buffer": { 951 | "version": "4.0.1", 952 | "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", 953 | "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", 954 | "license": "MIT", 955 | "engines": { 956 | "node": ">= 12" 957 | } 958 | }, 959 | "node_modules/debug": { 960 | "version": "4.4.1", 961 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", 962 | "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", 963 | "license": "MIT", 964 | "dependencies": { 965 | "ms": "^2.1.3" 966 | }, 967 | "engines": { 968 | "node": ">=6.0" 969 | }, 970 | "peerDependenciesMeta": { 971 | "supports-color": { 972 | "optional": true 973 | } 974 | } 975 | }, 976 | "node_modules/deep-is": { 977 | "version": "0.1.4", 978 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", 979 | "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", 980 | "dev": true, 981 | "license": "MIT" 982 | }, 983 | "node_modules/diff": { 984 | "version": "4.0.2", 985 | "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", 986 | "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", 987 | "dev": true, 988 | "license": "BSD-3-Clause", 989 | "engines": { 990 | "node": ">=0.3.1" 991 | } 992 | }, 993 | "node_modules/ecdsa-sig-formatter": { 994 | "version": "1.0.11", 995 | "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", 996 | "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", 997 | "license": "Apache-2.0", 998 | "dependencies": { 999 | "safe-buffer": "^5.0.1" 1000 | } 1001 | }, 1002 | "node_modules/escape-string-regexp": { 1003 | "version": "4.0.0", 1004 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 1005 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 1006 | "dev": true, 1007 | "license": "MIT", 1008 | "engines": { 1009 | "node": ">=10" 1010 | }, 1011 | "funding": { 1012 | "url": "https://github.com/sponsors/sindresorhus" 1013 | } 1014 | }, 1015 | "node_modules/eslint": { 1016 | "version": "9.34.0", 1017 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.34.0.tgz", 1018 | "integrity": "sha512-RNCHRX5EwdrESy3Jc9o8ie8Bog+PeYvvSR8sDGoZxNFTvZ4dlxUB3WzQ3bQMztFrSRODGrLLj8g6OFuGY/aiQg==", 1019 | "dev": true, 1020 | "license": "MIT", 1021 | "dependencies": { 1022 | "@eslint-community/eslint-utils": "^4.2.0", 1023 | "@eslint-community/regexpp": "^4.12.1", 1024 | "@eslint/config-array": "^0.21.0", 1025 | "@eslint/config-helpers": "^0.3.1", 1026 | "@eslint/core": "^0.15.2", 1027 | "@eslint/eslintrc": "^3.3.1", 1028 | "@eslint/js": "9.34.0", 1029 | "@eslint/plugin-kit": "^0.3.5", 1030 | "@humanfs/node": "^0.16.6", 1031 | "@humanwhocodes/module-importer": "^1.0.1", 1032 | "@humanwhocodes/retry": "^0.4.2", 1033 | "@types/estree": "^1.0.6", 1034 | "@types/json-schema": "^7.0.15", 1035 | "ajv": "^6.12.4", 1036 | "chalk": "^4.0.0", 1037 | "cross-spawn": "^7.0.6", 1038 | "debug": "^4.3.2", 1039 | "escape-string-regexp": "^4.0.0", 1040 | "eslint-scope": "^8.4.0", 1041 | "eslint-visitor-keys": "^4.2.1", 1042 | "espree": "^10.4.0", 1043 | "esquery": "^1.5.0", 1044 | "esutils": "^2.0.2", 1045 | "fast-deep-equal": "^3.1.3", 1046 | "file-entry-cache": "^8.0.0", 1047 | "find-up": "^5.0.0", 1048 | "glob-parent": "^6.0.2", 1049 | "ignore": "^5.2.0", 1050 | "imurmurhash": "^0.1.4", 1051 | "is-glob": "^4.0.0", 1052 | "json-stable-stringify-without-jsonify": "^1.0.1", 1053 | "lodash.merge": "^4.6.2", 1054 | "minimatch": "^3.1.2", 1055 | "natural-compare": "^1.4.0", 1056 | "optionator": "^0.9.3" 1057 | }, 1058 | "bin": { 1059 | "eslint": "bin/eslint.js" 1060 | }, 1061 | "engines": { 1062 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1063 | }, 1064 | "funding": { 1065 | "url": "https://eslint.org/donate" 1066 | }, 1067 | "peerDependencies": { 1068 | "jiti": "*" 1069 | }, 1070 | "peerDependenciesMeta": { 1071 | "jiti": { 1072 | "optional": true 1073 | } 1074 | } 1075 | }, 1076 | "node_modules/eslint-config-prettier": { 1077 | "version": "10.1.8", 1078 | "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", 1079 | "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", 1080 | "dev": true, 1081 | "license": "MIT", 1082 | "bin": { 1083 | "eslint-config-prettier": "bin/cli.js" 1084 | }, 1085 | "funding": { 1086 | "url": "https://opencollective.com/eslint-config-prettier" 1087 | }, 1088 | "peerDependencies": { 1089 | "eslint": ">=7.0.0" 1090 | } 1091 | }, 1092 | "node_modules/eslint-plugin-prettier": { 1093 | "version": "5.5.4", 1094 | "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.4.tgz", 1095 | "integrity": "sha512-swNtI95SToIz05YINMA6Ox5R057IMAmWZ26GqPxusAp1TZzj+IdY9tXNWWD3vkF/wEqydCONcwjTFpxybBqZsg==", 1096 | "dev": true, 1097 | "license": "MIT", 1098 | "dependencies": { 1099 | "prettier-linter-helpers": "^1.0.0", 1100 | "synckit": "^0.11.7" 1101 | }, 1102 | "engines": { 1103 | "node": "^14.18.0 || >=16.0.0" 1104 | }, 1105 | "funding": { 1106 | "url": "https://opencollective.com/eslint-plugin-prettier" 1107 | }, 1108 | "peerDependencies": { 1109 | "@types/eslint": ">=8.0.0", 1110 | "eslint": ">=8.0.0", 1111 | "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0", 1112 | "prettier": ">=3.0.0" 1113 | }, 1114 | "peerDependenciesMeta": { 1115 | "@types/eslint": { 1116 | "optional": true 1117 | }, 1118 | "eslint-config-prettier": { 1119 | "optional": true 1120 | } 1121 | } 1122 | }, 1123 | "node_modules/eslint-scope": { 1124 | "version": "8.4.0", 1125 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", 1126 | "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", 1127 | "dev": true, 1128 | "license": "BSD-2-Clause", 1129 | "dependencies": { 1130 | "esrecurse": "^4.3.0", 1131 | "estraverse": "^5.2.0" 1132 | }, 1133 | "engines": { 1134 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1135 | }, 1136 | "funding": { 1137 | "url": "https://opencollective.com/eslint" 1138 | } 1139 | }, 1140 | "node_modules/eslint-visitor-keys": { 1141 | "version": "3.4.3", 1142 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", 1143 | "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", 1144 | "dev": true, 1145 | "license": "Apache-2.0", 1146 | "engines": { 1147 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 1148 | }, 1149 | "funding": { 1150 | "url": "https://opencollective.com/eslint" 1151 | } 1152 | }, 1153 | "node_modules/eslint/node_modules/eslint-visitor-keys": { 1154 | "version": "4.2.1", 1155 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", 1156 | "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", 1157 | "dev": true, 1158 | "license": "Apache-2.0", 1159 | "engines": { 1160 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1161 | }, 1162 | "funding": { 1163 | "url": "https://opencollective.com/eslint" 1164 | } 1165 | }, 1166 | "node_modules/espree": { 1167 | "version": "10.4.0", 1168 | "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", 1169 | "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", 1170 | "dev": true, 1171 | "license": "BSD-2-Clause", 1172 | "dependencies": { 1173 | "acorn": "^8.15.0", 1174 | "acorn-jsx": "^5.3.2", 1175 | "eslint-visitor-keys": "^4.2.1" 1176 | }, 1177 | "engines": { 1178 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1179 | }, 1180 | "funding": { 1181 | "url": "https://opencollective.com/eslint" 1182 | } 1183 | }, 1184 | "node_modules/espree/node_modules/eslint-visitor-keys": { 1185 | "version": "4.2.1", 1186 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", 1187 | "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", 1188 | "dev": true, 1189 | "license": "Apache-2.0", 1190 | "engines": { 1191 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1192 | }, 1193 | "funding": { 1194 | "url": "https://opencollective.com/eslint" 1195 | } 1196 | }, 1197 | "node_modules/esquery": { 1198 | "version": "1.6.0", 1199 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", 1200 | "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", 1201 | "dev": true, 1202 | "license": "BSD-3-Clause", 1203 | "dependencies": { 1204 | "estraverse": "^5.1.0" 1205 | }, 1206 | "engines": { 1207 | "node": ">=0.10" 1208 | } 1209 | }, 1210 | "node_modules/esrecurse": { 1211 | "version": "4.3.0", 1212 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 1213 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 1214 | "dev": true, 1215 | "license": "BSD-2-Clause", 1216 | "dependencies": { 1217 | "estraverse": "^5.2.0" 1218 | }, 1219 | "engines": { 1220 | "node": ">=4.0" 1221 | } 1222 | }, 1223 | "node_modules/estraverse": { 1224 | "version": "5.3.0", 1225 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 1226 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 1227 | "dev": true, 1228 | "license": "BSD-2-Clause", 1229 | "engines": { 1230 | "node": ">=4.0" 1231 | } 1232 | }, 1233 | "node_modules/esutils": { 1234 | "version": "2.0.3", 1235 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 1236 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 1237 | "dev": true, 1238 | "license": "BSD-2-Clause", 1239 | "engines": { 1240 | "node": ">=0.10.0" 1241 | } 1242 | }, 1243 | "node_modules/extend": { 1244 | "version": "3.0.2", 1245 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 1246 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", 1247 | "license": "MIT" 1248 | }, 1249 | "node_modules/fast-deep-equal": { 1250 | "version": "3.1.3", 1251 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 1252 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 1253 | "dev": true, 1254 | "license": "MIT" 1255 | }, 1256 | "node_modules/fast-diff": { 1257 | "version": "1.3.0", 1258 | "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", 1259 | "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", 1260 | "dev": true, 1261 | "license": "Apache-2.0" 1262 | }, 1263 | "node_modules/fast-glob": { 1264 | "version": "3.3.3", 1265 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", 1266 | "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", 1267 | "dev": true, 1268 | "license": "MIT", 1269 | "dependencies": { 1270 | "@nodelib/fs.stat": "^2.0.2", 1271 | "@nodelib/fs.walk": "^1.2.3", 1272 | "glob-parent": "^5.1.2", 1273 | "merge2": "^1.3.0", 1274 | "micromatch": "^4.0.8" 1275 | }, 1276 | "engines": { 1277 | "node": ">=8.6.0" 1278 | } 1279 | }, 1280 | "node_modules/fast-glob/node_modules/glob-parent": { 1281 | "version": "5.1.2", 1282 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 1283 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 1284 | "dev": true, 1285 | "license": "ISC", 1286 | "dependencies": { 1287 | "is-glob": "^4.0.1" 1288 | }, 1289 | "engines": { 1290 | "node": ">= 6" 1291 | } 1292 | }, 1293 | "node_modules/fast-json-stable-stringify": { 1294 | "version": "2.1.0", 1295 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 1296 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 1297 | "dev": true, 1298 | "license": "MIT" 1299 | }, 1300 | "node_modules/fast-levenshtein": { 1301 | "version": "2.0.6", 1302 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 1303 | "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", 1304 | "dev": true, 1305 | "license": "MIT" 1306 | }, 1307 | "node_modules/fastq": { 1308 | "version": "1.19.1", 1309 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", 1310 | "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", 1311 | "dev": true, 1312 | "license": "ISC", 1313 | "dependencies": { 1314 | "reusify": "^1.0.4" 1315 | } 1316 | }, 1317 | "node_modules/fetch-blob": { 1318 | "version": "3.2.0", 1319 | "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", 1320 | "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", 1321 | "funding": [ 1322 | { 1323 | "type": "github", 1324 | "url": "https://github.com/sponsors/jimmywarting" 1325 | }, 1326 | { 1327 | "type": "paypal", 1328 | "url": "https://paypal.me/jimmywarting" 1329 | } 1330 | ], 1331 | "license": "MIT", 1332 | "dependencies": { 1333 | "node-domexception": "^1.0.0", 1334 | "web-streams-polyfill": "^3.0.3" 1335 | }, 1336 | "engines": { 1337 | "node": "^12.20 || >= 14.13" 1338 | } 1339 | }, 1340 | "node_modules/file-entry-cache": { 1341 | "version": "8.0.0", 1342 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", 1343 | "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", 1344 | "dev": true, 1345 | "license": "MIT", 1346 | "dependencies": { 1347 | "flat-cache": "^4.0.0" 1348 | }, 1349 | "engines": { 1350 | "node": ">=16.0.0" 1351 | } 1352 | }, 1353 | "node_modules/fill-range": { 1354 | "version": "7.1.1", 1355 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", 1356 | "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", 1357 | "dev": true, 1358 | "license": "MIT", 1359 | "dependencies": { 1360 | "to-regex-range": "^5.0.1" 1361 | }, 1362 | "engines": { 1363 | "node": ">=8" 1364 | } 1365 | }, 1366 | "node_modules/find-up": { 1367 | "version": "5.0.0", 1368 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 1369 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 1370 | "dev": true, 1371 | "license": "MIT", 1372 | "dependencies": { 1373 | "locate-path": "^6.0.0", 1374 | "path-exists": "^4.0.0" 1375 | }, 1376 | "engines": { 1377 | "node": ">=10" 1378 | }, 1379 | "funding": { 1380 | "url": "https://github.com/sponsors/sindresorhus" 1381 | } 1382 | }, 1383 | "node_modules/flat-cache": { 1384 | "version": "4.0.1", 1385 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", 1386 | "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", 1387 | "dev": true, 1388 | "license": "MIT", 1389 | "dependencies": { 1390 | "flatted": "^3.2.9", 1391 | "keyv": "^4.5.4" 1392 | }, 1393 | "engines": { 1394 | "node": ">=16" 1395 | } 1396 | }, 1397 | "node_modules/flatted": { 1398 | "version": "3.3.3", 1399 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", 1400 | "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", 1401 | "dev": true, 1402 | "license": "ISC" 1403 | }, 1404 | "node_modules/formdata-polyfill": { 1405 | "version": "4.0.10", 1406 | "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", 1407 | "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", 1408 | "license": "MIT", 1409 | "dependencies": { 1410 | "fetch-blob": "^3.1.2" 1411 | }, 1412 | "engines": { 1413 | "node": ">=12.20.0" 1414 | } 1415 | }, 1416 | "node_modules/gaxios": { 1417 | "version": "7.1.1", 1418 | "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.1.tgz", 1419 | "integrity": "sha512-Odju3uBUJyVCkW64nLD4wKLhbh93bh6vIg/ZIXkWiLPBrdgtc65+tls/qml+un3pr6JqYVFDZbbmLDQT68rTOQ==", 1420 | "license": "Apache-2.0", 1421 | "dependencies": { 1422 | "extend": "^3.0.2", 1423 | "https-proxy-agent": "^7.0.1", 1424 | "node-fetch": "^3.3.2" 1425 | }, 1426 | "engines": { 1427 | "node": ">=18" 1428 | } 1429 | }, 1430 | "node_modules/gcp-metadata": { 1431 | "version": "7.0.1", 1432 | "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-7.0.1.tgz", 1433 | "integrity": "sha512-UcO3kefx6dCcZkgcTGgVOTFb7b1LlQ02hY1omMjjrrBzkajRMCFgYOjs7J71WqnuG1k2b+9ppGL7FsOfhZMQKQ==", 1434 | "license": "Apache-2.0", 1435 | "dependencies": { 1436 | "gaxios": "^7.0.0", 1437 | "google-logging-utils": "^1.0.0", 1438 | "json-bigint": "^1.0.0" 1439 | }, 1440 | "engines": { 1441 | "node": ">=18" 1442 | } 1443 | }, 1444 | "node_modules/glob-parent": { 1445 | "version": "6.0.2", 1446 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 1447 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 1448 | "dev": true, 1449 | "license": "ISC", 1450 | "dependencies": { 1451 | "is-glob": "^4.0.3" 1452 | }, 1453 | "engines": { 1454 | "node": ">=10.13.0" 1455 | } 1456 | }, 1457 | "node_modules/globals": { 1458 | "version": "14.0.0", 1459 | "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", 1460 | "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", 1461 | "dev": true, 1462 | "license": "MIT", 1463 | "engines": { 1464 | "node": ">=18" 1465 | }, 1466 | "funding": { 1467 | "url": "https://github.com/sponsors/sindresorhus" 1468 | } 1469 | }, 1470 | "node_modules/google-auth-library": { 1471 | "version": "10.3.0", 1472 | "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-10.3.0.tgz", 1473 | "integrity": "sha512-ylSE3RlCRZfZB56PFJSfUCuiuPq83Fx8hqu1KPWGK8FVdSaxlp/qkeMMX/DT/18xkwXIHvXEXkZsljRwfrdEfQ==", 1474 | "license": "Apache-2.0", 1475 | "dependencies": { 1476 | "base64-js": "^1.3.0", 1477 | "ecdsa-sig-formatter": "^1.0.11", 1478 | "gaxios": "^7.0.0", 1479 | "gcp-metadata": "^7.0.0", 1480 | "google-logging-utils": "^1.0.0", 1481 | "gtoken": "^8.0.0", 1482 | "jws": "^4.0.0" 1483 | }, 1484 | "engines": { 1485 | "node": ">=18" 1486 | } 1487 | }, 1488 | "node_modules/google-logging-utils": { 1489 | "version": "1.1.1", 1490 | "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-1.1.1.tgz", 1491 | "integrity": "sha512-rcX58I7nqpu4mbKztFeOAObbomBbHU2oIb/d3tJfF3dizGSApqtSwYJigGCooHdnMyQBIw8BrWyK96w3YXgr6A==", 1492 | "license": "Apache-2.0", 1493 | "engines": { 1494 | "node": ">=14" 1495 | } 1496 | }, 1497 | "node_modules/graphemer": { 1498 | "version": "1.4.0", 1499 | "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", 1500 | "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", 1501 | "dev": true, 1502 | "license": "MIT" 1503 | }, 1504 | "node_modules/gtoken": { 1505 | "version": "8.0.0", 1506 | "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-8.0.0.tgz", 1507 | "integrity": "sha512-+CqsMbHPiSTdtSO14O51eMNlrp9N79gmeqmXeouJOhfucAedHw9noVe/n5uJk3tbKE6a+6ZCQg3RPhVhHByAIw==", 1508 | "license": "MIT", 1509 | "dependencies": { 1510 | "gaxios": "^7.0.0", 1511 | "jws": "^4.0.0" 1512 | }, 1513 | "engines": { 1514 | "node": ">=18" 1515 | } 1516 | }, 1517 | "node_modules/has-flag": { 1518 | "version": "4.0.0", 1519 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1520 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 1521 | "dev": true, 1522 | "license": "MIT", 1523 | "engines": { 1524 | "node": ">=8" 1525 | } 1526 | }, 1527 | "node_modules/https-proxy-agent": { 1528 | "version": "7.0.6", 1529 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", 1530 | "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", 1531 | "license": "MIT", 1532 | "dependencies": { 1533 | "agent-base": "^7.1.2", 1534 | "debug": "4" 1535 | }, 1536 | "engines": { 1537 | "node": ">= 14" 1538 | } 1539 | }, 1540 | "node_modules/ignore": { 1541 | "version": "5.3.2", 1542 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", 1543 | "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", 1544 | "dev": true, 1545 | "license": "MIT", 1546 | "engines": { 1547 | "node": ">= 4" 1548 | } 1549 | }, 1550 | "node_modules/import-fresh": { 1551 | "version": "3.3.1", 1552 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", 1553 | "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", 1554 | "dev": true, 1555 | "license": "MIT", 1556 | "dependencies": { 1557 | "parent-module": "^1.0.0", 1558 | "resolve-from": "^4.0.0" 1559 | }, 1560 | "engines": { 1561 | "node": ">=6" 1562 | }, 1563 | "funding": { 1564 | "url": "https://github.com/sponsors/sindresorhus" 1565 | } 1566 | }, 1567 | "node_modules/imurmurhash": { 1568 | "version": "0.1.4", 1569 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 1570 | "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", 1571 | "dev": true, 1572 | "license": "MIT", 1573 | "engines": { 1574 | "node": ">=0.8.19" 1575 | } 1576 | }, 1577 | "node_modules/is-extglob": { 1578 | "version": "2.1.1", 1579 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1580 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 1581 | "dev": true, 1582 | "license": "MIT", 1583 | "engines": { 1584 | "node": ">=0.10.0" 1585 | } 1586 | }, 1587 | "node_modules/is-glob": { 1588 | "version": "4.0.3", 1589 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 1590 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1591 | "dev": true, 1592 | "license": "MIT", 1593 | "dependencies": { 1594 | "is-extglob": "^2.1.1" 1595 | }, 1596 | "engines": { 1597 | "node": ">=0.10.0" 1598 | } 1599 | }, 1600 | "node_modules/is-number": { 1601 | "version": "7.0.0", 1602 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1603 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 1604 | "dev": true, 1605 | "license": "MIT", 1606 | "engines": { 1607 | "node": ">=0.12.0" 1608 | } 1609 | }, 1610 | "node_modules/isexe": { 1611 | "version": "2.0.0", 1612 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1613 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 1614 | "dev": true, 1615 | "license": "ISC" 1616 | }, 1617 | "node_modules/js-yaml": { 1618 | "version": "4.1.0", 1619 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 1620 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 1621 | "dev": true, 1622 | "license": "MIT", 1623 | "dependencies": { 1624 | "argparse": "^2.0.1" 1625 | }, 1626 | "bin": { 1627 | "js-yaml": "bin/js-yaml.js" 1628 | } 1629 | }, 1630 | "node_modules/json-bigint": { 1631 | "version": "1.0.0", 1632 | "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", 1633 | "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", 1634 | "license": "MIT", 1635 | "dependencies": { 1636 | "bignumber.js": "^9.0.0" 1637 | } 1638 | }, 1639 | "node_modules/json-buffer": { 1640 | "version": "3.0.1", 1641 | "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", 1642 | "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", 1643 | "dev": true, 1644 | "license": "MIT" 1645 | }, 1646 | "node_modules/json-schema-traverse": { 1647 | "version": "0.4.1", 1648 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 1649 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 1650 | "dev": true, 1651 | "license": "MIT" 1652 | }, 1653 | "node_modules/json-stable-stringify-without-jsonify": { 1654 | "version": "1.0.1", 1655 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 1656 | "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", 1657 | "dev": true, 1658 | "license": "MIT" 1659 | }, 1660 | "node_modules/jwa": { 1661 | "version": "2.0.1", 1662 | "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", 1663 | "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", 1664 | "license": "MIT", 1665 | "dependencies": { 1666 | "buffer-equal-constant-time": "^1.0.1", 1667 | "ecdsa-sig-formatter": "1.0.11", 1668 | "safe-buffer": "^5.0.1" 1669 | } 1670 | }, 1671 | "node_modules/jws": { 1672 | "version": "4.0.0", 1673 | "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", 1674 | "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", 1675 | "license": "MIT", 1676 | "dependencies": { 1677 | "jwa": "^2.0.0", 1678 | "safe-buffer": "^5.0.1" 1679 | } 1680 | }, 1681 | "node_modules/keyv": { 1682 | "version": "4.5.4", 1683 | "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", 1684 | "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", 1685 | "dev": true, 1686 | "license": "MIT", 1687 | "dependencies": { 1688 | "json-buffer": "3.0.1" 1689 | } 1690 | }, 1691 | "node_modules/levn": { 1692 | "version": "0.4.1", 1693 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", 1694 | "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", 1695 | "dev": true, 1696 | "license": "MIT", 1697 | "dependencies": { 1698 | "prelude-ls": "^1.2.1", 1699 | "type-check": "~0.4.0" 1700 | }, 1701 | "engines": { 1702 | "node": ">= 0.8.0" 1703 | } 1704 | }, 1705 | "node_modules/locate-path": { 1706 | "version": "6.0.0", 1707 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 1708 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 1709 | "dev": true, 1710 | "license": "MIT", 1711 | "dependencies": { 1712 | "p-locate": "^5.0.0" 1713 | }, 1714 | "engines": { 1715 | "node": ">=10" 1716 | }, 1717 | "funding": { 1718 | "url": "https://github.com/sponsors/sindresorhus" 1719 | } 1720 | }, 1721 | "node_modules/lodash.merge": { 1722 | "version": "4.6.2", 1723 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 1724 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", 1725 | "dev": true, 1726 | "license": "MIT" 1727 | }, 1728 | "node_modules/make-error": { 1729 | "version": "1.3.6", 1730 | "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", 1731 | "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", 1732 | "dev": true, 1733 | "license": "ISC" 1734 | }, 1735 | "node_modules/merge2": { 1736 | "version": "1.4.1", 1737 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 1738 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 1739 | "dev": true, 1740 | "license": "MIT", 1741 | "engines": { 1742 | "node": ">= 8" 1743 | } 1744 | }, 1745 | "node_modules/micromatch": { 1746 | "version": "4.0.8", 1747 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", 1748 | "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", 1749 | "dev": true, 1750 | "license": "MIT", 1751 | "dependencies": { 1752 | "braces": "^3.0.3", 1753 | "picomatch": "^2.3.1" 1754 | }, 1755 | "engines": { 1756 | "node": ">=8.6" 1757 | } 1758 | }, 1759 | "node_modules/minimatch": { 1760 | "version": "3.1.2", 1761 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1762 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1763 | "dev": true, 1764 | "license": "ISC", 1765 | "dependencies": { 1766 | "brace-expansion": "^1.1.7" 1767 | }, 1768 | "engines": { 1769 | "node": "*" 1770 | } 1771 | }, 1772 | "node_modules/ms": { 1773 | "version": "2.1.3", 1774 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1775 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 1776 | "license": "MIT" 1777 | }, 1778 | "node_modules/natural-compare": { 1779 | "version": "1.4.0", 1780 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 1781 | "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", 1782 | "dev": true, 1783 | "license": "MIT" 1784 | }, 1785 | "node_modules/node-domexception": { 1786 | "version": "1.0.0", 1787 | "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", 1788 | "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", 1789 | "deprecated": "Use your platform's native DOMException instead", 1790 | "funding": [ 1791 | { 1792 | "type": "github", 1793 | "url": "https://github.com/sponsors/jimmywarting" 1794 | }, 1795 | { 1796 | "type": "github", 1797 | "url": "https://paypal.me/jimmywarting" 1798 | } 1799 | ], 1800 | "license": "MIT", 1801 | "engines": { 1802 | "node": ">=10.5.0" 1803 | } 1804 | }, 1805 | "node_modules/node-fetch": { 1806 | "version": "3.3.2", 1807 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", 1808 | "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", 1809 | "license": "MIT", 1810 | "dependencies": { 1811 | "data-uri-to-buffer": "^4.0.0", 1812 | "fetch-blob": "^3.1.4", 1813 | "formdata-polyfill": "^4.0.10" 1814 | }, 1815 | "engines": { 1816 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 1817 | }, 1818 | "funding": { 1819 | "type": "opencollective", 1820 | "url": "https://opencollective.com/node-fetch" 1821 | } 1822 | }, 1823 | "node_modules/optionator": { 1824 | "version": "0.9.4", 1825 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", 1826 | "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", 1827 | "dev": true, 1828 | "license": "MIT", 1829 | "dependencies": { 1830 | "deep-is": "^0.1.3", 1831 | "fast-levenshtein": "^2.0.6", 1832 | "levn": "^0.4.1", 1833 | "prelude-ls": "^1.2.1", 1834 | "type-check": "^0.4.0", 1835 | "word-wrap": "^1.2.5" 1836 | }, 1837 | "engines": { 1838 | "node": ">= 0.8.0" 1839 | } 1840 | }, 1841 | "node_modules/p-limit": { 1842 | "version": "3.1.0", 1843 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 1844 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 1845 | "dev": true, 1846 | "license": "MIT", 1847 | "dependencies": { 1848 | "yocto-queue": "^0.1.0" 1849 | }, 1850 | "engines": { 1851 | "node": ">=10" 1852 | }, 1853 | "funding": { 1854 | "url": "https://github.com/sponsors/sindresorhus" 1855 | } 1856 | }, 1857 | "node_modules/p-locate": { 1858 | "version": "5.0.0", 1859 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 1860 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 1861 | "dev": true, 1862 | "license": "MIT", 1863 | "dependencies": { 1864 | "p-limit": "^3.0.2" 1865 | }, 1866 | "engines": { 1867 | "node": ">=10" 1868 | }, 1869 | "funding": { 1870 | "url": "https://github.com/sponsors/sindresorhus" 1871 | } 1872 | }, 1873 | "node_modules/parent-module": { 1874 | "version": "1.0.1", 1875 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 1876 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 1877 | "dev": true, 1878 | "license": "MIT", 1879 | "dependencies": { 1880 | "callsites": "^3.0.0" 1881 | }, 1882 | "engines": { 1883 | "node": ">=6" 1884 | } 1885 | }, 1886 | "node_modules/path-exists": { 1887 | "version": "4.0.0", 1888 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 1889 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 1890 | "dev": true, 1891 | "license": "MIT", 1892 | "engines": { 1893 | "node": ">=8" 1894 | } 1895 | }, 1896 | "node_modules/path-key": { 1897 | "version": "3.1.1", 1898 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 1899 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 1900 | "dev": true, 1901 | "license": "MIT", 1902 | "engines": { 1903 | "node": ">=8" 1904 | } 1905 | }, 1906 | "node_modules/picomatch": { 1907 | "version": "2.3.1", 1908 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 1909 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 1910 | "dev": true, 1911 | "license": "MIT", 1912 | "engines": { 1913 | "node": ">=8.6" 1914 | }, 1915 | "funding": { 1916 | "url": "https://github.com/sponsors/jonschlinkert" 1917 | } 1918 | }, 1919 | "node_modules/prelude-ls": { 1920 | "version": "1.2.1", 1921 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", 1922 | "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", 1923 | "dev": true, 1924 | "license": "MIT", 1925 | "engines": { 1926 | "node": ">= 0.8.0" 1927 | } 1928 | }, 1929 | "node_modules/prettier": { 1930 | "version": "3.6.2", 1931 | "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", 1932 | "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", 1933 | "dev": true, 1934 | "license": "MIT", 1935 | "bin": { 1936 | "prettier": "bin/prettier.cjs" 1937 | }, 1938 | "engines": { 1939 | "node": ">=14" 1940 | }, 1941 | "funding": { 1942 | "url": "https://github.com/prettier/prettier?sponsor=1" 1943 | } 1944 | }, 1945 | "node_modules/prettier-linter-helpers": { 1946 | "version": "1.0.0", 1947 | "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", 1948 | "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", 1949 | "dev": true, 1950 | "license": "MIT", 1951 | "dependencies": { 1952 | "fast-diff": "^1.1.2" 1953 | }, 1954 | "engines": { 1955 | "node": ">=6.0.0" 1956 | } 1957 | }, 1958 | "node_modules/punycode": { 1959 | "version": "2.3.1", 1960 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", 1961 | "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", 1962 | "dev": true, 1963 | "license": "MIT", 1964 | "engines": { 1965 | "node": ">=6" 1966 | } 1967 | }, 1968 | "node_modules/queue-microtask": { 1969 | "version": "1.2.3", 1970 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 1971 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 1972 | "dev": true, 1973 | "funding": [ 1974 | { 1975 | "type": "github", 1976 | "url": "https://github.com/sponsors/feross" 1977 | }, 1978 | { 1979 | "type": "patreon", 1980 | "url": "https://www.patreon.com/feross" 1981 | }, 1982 | { 1983 | "type": "consulting", 1984 | "url": "https://feross.org/support" 1985 | } 1986 | ], 1987 | "license": "MIT" 1988 | }, 1989 | "node_modules/resolve-from": { 1990 | "version": "4.0.0", 1991 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 1992 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 1993 | "dev": true, 1994 | "license": "MIT", 1995 | "engines": { 1996 | "node": ">=4" 1997 | } 1998 | }, 1999 | "node_modules/reusify": { 2000 | "version": "1.1.0", 2001 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", 2002 | "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", 2003 | "dev": true, 2004 | "license": "MIT", 2005 | "engines": { 2006 | "iojs": ">=1.0.0", 2007 | "node": ">=0.10.0" 2008 | } 2009 | }, 2010 | "node_modules/run-parallel": { 2011 | "version": "1.2.0", 2012 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 2013 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 2014 | "dev": true, 2015 | "funding": [ 2016 | { 2017 | "type": "github", 2018 | "url": "https://github.com/sponsors/feross" 2019 | }, 2020 | { 2021 | "type": "patreon", 2022 | "url": "https://www.patreon.com/feross" 2023 | }, 2024 | { 2025 | "type": "consulting", 2026 | "url": "https://feross.org/support" 2027 | } 2028 | ], 2029 | "license": "MIT", 2030 | "dependencies": { 2031 | "queue-microtask": "^1.2.2" 2032 | } 2033 | }, 2034 | "node_modules/safe-buffer": { 2035 | "version": "5.2.1", 2036 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 2037 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 2038 | "funding": [ 2039 | { 2040 | "type": "github", 2041 | "url": "https://github.com/sponsors/feross" 2042 | }, 2043 | { 2044 | "type": "patreon", 2045 | "url": "https://www.patreon.com/feross" 2046 | }, 2047 | { 2048 | "type": "consulting", 2049 | "url": "https://feross.org/support" 2050 | } 2051 | ], 2052 | "license": "MIT" 2053 | }, 2054 | "node_modules/semver": { 2055 | "version": "7.7.2", 2056 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", 2057 | "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", 2058 | "dev": true, 2059 | "license": "ISC", 2060 | "bin": { 2061 | "semver": "bin/semver.js" 2062 | }, 2063 | "engines": { 2064 | "node": ">=10" 2065 | } 2066 | }, 2067 | "node_modules/shebang-command": { 2068 | "version": "2.0.0", 2069 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 2070 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 2071 | "dev": true, 2072 | "license": "MIT", 2073 | "dependencies": { 2074 | "shebang-regex": "^3.0.0" 2075 | }, 2076 | "engines": { 2077 | "node": ">=8" 2078 | } 2079 | }, 2080 | "node_modules/shebang-regex": { 2081 | "version": "3.0.0", 2082 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 2083 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 2084 | "dev": true, 2085 | "license": "MIT", 2086 | "engines": { 2087 | "node": ">=8" 2088 | } 2089 | }, 2090 | "node_modules/strip-json-comments": { 2091 | "version": "3.1.1", 2092 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 2093 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 2094 | "dev": true, 2095 | "license": "MIT", 2096 | "engines": { 2097 | "node": ">=8" 2098 | }, 2099 | "funding": { 2100 | "url": "https://github.com/sponsors/sindresorhus" 2101 | } 2102 | }, 2103 | "node_modules/supports-color": { 2104 | "version": "7.2.0", 2105 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 2106 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 2107 | "dev": true, 2108 | "license": "MIT", 2109 | "dependencies": { 2110 | "has-flag": "^4.0.0" 2111 | }, 2112 | "engines": { 2113 | "node": ">=8" 2114 | } 2115 | }, 2116 | "node_modules/synckit": { 2117 | "version": "0.11.11", 2118 | "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.11.tgz", 2119 | "integrity": "sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==", 2120 | "dev": true, 2121 | "license": "MIT", 2122 | "dependencies": { 2123 | "@pkgr/core": "^0.2.9" 2124 | }, 2125 | "engines": { 2126 | "node": "^14.18.0 || >=16.0.0" 2127 | }, 2128 | "funding": { 2129 | "url": "https://opencollective.com/synckit" 2130 | } 2131 | }, 2132 | "node_modules/to-regex-range": { 2133 | "version": "5.0.1", 2134 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 2135 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 2136 | "dev": true, 2137 | "license": "MIT", 2138 | "dependencies": { 2139 | "is-number": "^7.0.0" 2140 | }, 2141 | "engines": { 2142 | "node": ">=8.0" 2143 | } 2144 | }, 2145 | "node_modules/ts-api-utils": { 2146 | "version": "2.1.0", 2147 | "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", 2148 | "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", 2149 | "dev": true, 2150 | "license": "MIT", 2151 | "engines": { 2152 | "node": ">=18.12" 2153 | }, 2154 | "peerDependencies": { 2155 | "typescript": ">=4.8.4" 2156 | } 2157 | }, 2158 | "node_modules/ts-node": { 2159 | "version": "10.9.2", 2160 | "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", 2161 | "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", 2162 | "dev": true, 2163 | "license": "MIT", 2164 | "dependencies": { 2165 | "@cspotcode/source-map-support": "^0.8.0", 2166 | "@tsconfig/node10": "^1.0.7", 2167 | "@tsconfig/node12": "^1.0.7", 2168 | "@tsconfig/node14": "^1.0.0", 2169 | "@tsconfig/node16": "^1.0.2", 2170 | "acorn": "^8.4.1", 2171 | "acorn-walk": "^8.1.1", 2172 | "arg": "^4.1.0", 2173 | "create-require": "^1.1.0", 2174 | "diff": "^4.0.1", 2175 | "make-error": "^1.1.1", 2176 | "v8-compile-cache-lib": "^3.0.1", 2177 | "yn": "3.1.1" 2178 | }, 2179 | "bin": { 2180 | "ts-node": "dist/bin.js", 2181 | "ts-node-cwd": "dist/bin-cwd.js", 2182 | "ts-node-esm": "dist/bin-esm.js", 2183 | "ts-node-script": "dist/bin-script.js", 2184 | "ts-node-transpile-only": "dist/bin-transpile.js", 2185 | "ts-script": "dist/bin-script-deprecated.js" 2186 | }, 2187 | "peerDependencies": { 2188 | "@swc/core": ">=1.2.50", 2189 | "@swc/wasm": ">=1.2.50", 2190 | "@types/node": "*", 2191 | "typescript": ">=2.7" 2192 | }, 2193 | "peerDependenciesMeta": { 2194 | "@swc/core": { 2195 | "optional": true 2196 | }, 2197 | "@swc/wasm": { 2198 | "optional": true 2199 | } 2200 | } 2201 | }, 2202 | "node_modules/tunnel": { 2203 | "version": "0.0.6", 2204 | "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", 2205 | "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", 2206 | "license": "MIT", 2207 | "engines": { 2208 | "node": ">=0.6.11 <=0.7.0 || >=0.7.3" 2209 | } 2210 | }, 2211 | "node_modules/type-check": { 2212 | "version": "0.4.0", 2213 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", 2214 | "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", 2215 | "dev": true, 2216 | "license": "MIT", 2217 | "dependencies": { 2218 | "prelude-ls": "^1.2.1" 2219 | }, 2220 | "engines": { 2221 | "node": ">= 0.8.0" 2222 | } 2223 | }, 2224 | "node_modules/typescript": { 2225 | "version": "5.9.2", 2226 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", 2227 | "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", 2228 | "dev": true, 2229 | "license": "Apache-2.0", 2230 | "bin": { 2231 | "tsc": "bin/tsc", 2232 | "tsserver": "bin/tsserver" 2233 | }, 2234 | "engines": { 2235 | "node": ">=14.17" 2236 | } 2237 | }, 2238 | "node_modules/typescript-eslint": { 2239 | "version": "8.42.0", 2240 | "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.42.0.tgz", 2241 | "integrity": "sha512-ozR/rQn+aQXQxh1YgbCzQWDFrsi9mcg+1PM3l/z5o1+20P7suOIaNg515bpr/OYt6FObz/NHcBstydDLHWeEKg==", 2242 | "dev": true, 2243 | "license": "MIT", 2244 | "dependencies": { 2245 | "@typescript-eslint/eslint-plugin": "8.42.0", 2246 | "@typescript-eslint/parser": "8.42.0", 2247 | "@typescript-eslint/typescript-estree": "8.42.0", 2248 | "@typescript-eslint/utils": "8.42.0" 2249 | }, 2250 | "engines": { 2251 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 2252 | }, 2253 | "funding": { 2254 | "type": "opencollective", 2255 | "url": "https://opencollective.com/typescript-eslint" 2256 | }, 2257 | "peerDependencies": { 2258 | "eslint": "^8.57.0 || ^9.0.0", 2259 | "typescript": ">=4.8.4 <6.0.0" 2260 | } 2261 | }, 2262 | "node_modules/undici": { 2263 | "version": "5.29.0", 2264 | "resolved": "https://registry.npmjs.org/undici/-/undici-5.29.0.tgz", 2265 | "integrity": "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==", 2266 | "license": "MIT", 2267 | "dependencies": { 2268 | "@fastify/busboy": "^2.0.0" 2269 | }, 2270 | "engines": { 2271 | "node": ">=14.0" 2272 | } 2273 | }, 2274 | "node_modules/undici-types": { 2275 | "version": "7.10.0", 2276 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.10.0.tgz", 2277 | "integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==", 2278 | "dev": true, 2279 | "license": "MIT" 2280 | }, 2281 | "node_modules/uri-js": { 2282 | "version": "4.4.1", 2283 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 2284 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 2285 | "dev": true, 2286 | "license": "BSD-2-Clause", 2287 | "dependencies": { 2288 | "punycode": "^2.1.0" 2289 | } 2290 | }, 2291 | "node_modules/v8-compile-cache-lib": { 2292 | "version": "3.0.1", 2293 | "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", 2294 | "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", 2295 | "dev": true, 2296 | "license": "MIT" 2297 | }, 2298 | "node_modules/web-streams-polyfill": { 2299 | "version": "3.3.3", 2300 | "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", 2301 | "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", 2302 | "license": "MIT", 2303 | "engines": { 2304 | "node": ">= 8" 2305 | } 2306 | }, 2307 | "node_modules/which": { 2308 | "version": "2.0.2", 2309 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 2310 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 2311 | "dev": true, 2312 | "license": "ISC", 2313 | "dependencies": { 2314 | "isexe": "^2.0.0" 2315 | }, 2316 | "bin": { 2317 | "node-which": "bin/node-which" 2318 | }, 2319 | "engines": { 2320 | "node": ">= 8" 2321 | } 2322 | }, 2323 | "node_modules/word-wrap": { 2324 | "version": "1.2.5", 2325 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", 2326 | "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", 2327 | "dev": true, 2328 | "license": "MIT", 2329 | "engines": { 2330 | "node": ">=0.10.0" 2331 | } 2332 | }, 2333 | "node_modules/yaml": { 2334 | "version": "2.8.1", 2335 | "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", 2336 | "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", 2337 | "license": "ISC", 2338 | "bin": { 2339 | "yaml": "bin.mjs" 2340 | }, 2341 | "engines": { 2342 | "node": ">= 14.6" 2343 | } 2344 | }, 2345 | "node_modules/yn": { 2346 | "version": "3.1.1", 2347 | "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", 2348 | "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", 2349 | "dev": true, 2350 | "license": "MIT", 2351 | "engines": { 2352 | "node": ">=6" 2353 | } 2354 | }, 2355 | "node_modules/yocto-queue": { 2356 | "version": "0.1.0", 2357 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 2358 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 2359 | "dev": true, 2360 | "license": "MIT", 2361 | "engines": { 2362 | "node": ">=10" 2363 | }, 2364 | "funding": { 2365 | "url": "https://github.com/sponsors/sindresorhus" 2366 | } 2367 | } 2368 | } 2369 | } 2370 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "get-secretmanager-secrets", 3 | "version": "3.0.0", 4 | "description": "Get Secret Manager secrets GitHub action", 5 | "main": "dist/index.js", 6 | "scripts": { 7 | "build": "rm -rf dist/ && ncc build -m src/main.ts -o dist/main", 8 | "docs": "./node_modules/.bin/actions-gen-readme", 9 | "lint": "eslint .", 10 | "format": "eslint . --fix", 11 | "test": "node --require ts-node/register --test-reporter spec --test tests/**/*.test.ts" 12 | }, 13 | "engines": { 14 | "node": ">= 24.x", 15 | "npm": ">= 11.x" 16 | }, 17 | "repository": { 18 | "type": "git", 19 | "url": "https://github.com/google-github-actions/get-secretmanager-secrets" 20 | }, 21 | "keywords": [ 22 | "actions", 23 | "google cloud", 24 | "secret manager", 25 | "setup" 26 | ], 27 | "author": "GoogleCloudPlatform", 28 | "license": "Apache-2.0", 29 | "dependencies": { 30 | "@actions/core": "^1.11.1", 31 | "@actions/http-client": "^2.2.3", 32 | "@google-github-actions/actions-utils": "^1.0.1", 33 | "google-auth-library": "^10.1.0" 34 | }, 35 | "devDependencies": { 36 | "@eslint/eslintrc": "^3.3.1", 37 | "@eslint/js": "^9.31.0", 38 | "@types/node": "^24.0.14", 39 | "@typescript-eslint/eslint-plugin": "^8.37.0", 40 | "@typescript-eslint/parser": "^8.37.0", 41 | "@vercel/ncc": "^0.38.3", 42 | "eslint": "^9.31.0", 43 | "eslint-config-prettier": "^10.1.8", 44 | "eslint-plugin-prettier": "^5.5.3", 45 | "prettier": "^3.6.2", 46 | "ts-node": "^10.9.2", 47 | "typescript": "^5.8.3", 48 | "typescript-eslint": "^8.37.0" 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /src/client.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2020 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | import { GoogleAuth } from 'google-auth-library'; 18 | import { errorMessage, expandUniverseEndpoints } from '@google-github-actions/actions-utils'; 19 | import { HttpClient } from '@actions/http-client'; 20 | 21 | import { Reference } from './reference'; 22 | 23 | // Do not listen to the linter - this can NOT be rewritten as an ES6 import statement. 24 | const { version: appVersion } = require('../package.json'); 25 | 26 | // userAgent is the user agent string. 27 | const userAgent = `google-github-actions:get-secretmanager-secrets/${appVersion}`; 28 | 29 | /** 30 | * Available options to create the client. 31 | * 32 | * @param endpoint GCP endpoint (useful for testing). 33 | */ 34 | type ClientOptions = { 35 | universe?: string; 36 | }; 37 | 38 | /** 39 | * AccessSecretVersionResponse is the response from the API for accessing a 40 | * secret version. 41 | */ 42 | type AccessSecretVersionResponse = { 43 | payload: { 44 | // data is base64 encoded data. 45 | data: string; 46 | }; 47 | }; 48 | 49 | /** 50 | * Wraps interactions with the Google Secret Manager API, handling credential 51 | * lookup and registration. 52 | * 53 | * @param opts list of ClientOptions 54 | * @returns Client 55 | */ 56 | export class Client { 57 | readonly _endpoints = { 58 | secretmanager: 'https://secretmanager.{universe}/v1', 59 | }; 60 | 61 | readonly auth: GoogleAuth; 62 | readonly client: HttpClient; 63 | 64 | constructor(opts?: ClientOptions) { 65 | this.auth = new GoogleAuth({ 66 | scopes: ['https://www.googleapis.com/auth/cloud-platform'], 67 | }); 68 | this.client = new HttpClient(userAgent, [], { 69 | allowRetries: true, 70 | maxRetries: 3, 71 | }); 72 | this._endpoints = expandUniverseEndpoints(this._endpoints, opts?.universe); 73 | } 74 | 75 | /** 76 | * Retrieves the secret by name. 77 | * 78 | * @param ref String of the full secret reference. 79 | * @returns string secret contents. 80 | */ 81 | async accessSecret(ref: Reference, encoding: BufferEncoding): Promise { 82 | const selfLink = ref.selfLink(); 83 | if (!selfLink) { 84 | throw new Error(`Secret ref "${selfLink}" is empty!`); 85 | } 86 | // Updating endpoint with location if available in reference 87 | const endpoint = ref.location 88 | ? this._endpoints.secretmanager.replace( 89 | 'https://secretmanager.', 90 | `https://secretmanager.${ref.location}.rep.`, 91 | ) 92 | : this._endpoints.secretmanager; 93 | 94 | try { 95 | const token = await this.auth.getAccessToken(); 96 | const response = await this.client.get(`${endpoint}/${selfLink}:access`, { 97 | 'Authorization': `Bearer ${token}`, 98 | 'User-Agent': userAgent, 99 | }); 100 | 101 | const body = await response.readBody(); 102 | const statusCode = response.message.statusCode || 500; 103 | if (statusCode >= 400) { 104 | throw new Error(`(${statusCode}) ${body}`); 105 | } 106 | 107 | const parsed: AccessSecretVersionResponse = JSON.parse(body); 108 | const b64data = parsed.payload.data; 109 | if (!b64data) { 110 | throw new Error(`Secret "${selfLink}" returned no data!`); 111 | } 112 | 113 | let str = b64data.replace(/-/g, '+').replace(/_/g, '/'); 114 | while (str.length % 4) str += '='; 115 | return Buffer.from(str, 'base64').toString(encoding); 116 | } catch (err) { 117 | const msg = errorMessage(err); 118 | throw new Error(`Failed to access secret "${selfLink}": ${msg}`); 119 | } 120 | } 121 | } 122 | -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2020 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | import { exportVariable, getInput, setFailed, setOutput, setSecret } from '@actions/core'; 18 | import { errorMessage, parseBoolean } from '@google-github-actions/actions-utils'; 19 | 20 | import { Client } from './client'; 21 | import { parseSecretsRefs } from './reference'; 22 | 23 | /** 24 | * Executes the main action. It includes the main business logic and is the 25 | * primary entry point. It is documented inline. 26 | */ 27 | async function run(): Promise { 28 | try { 29 | const universe = getInput('universe'); 30 | const secretsInput = getInput('secrets', { required: true }); 31 | const minMaskLength = parseInt(getInput('min_mask_length')); 32 | const exportEnvironment = parseBoolean(getInput('export_to_environment')); 33 | const encoding = (getInput('encoding') || 'utf8') as BufferEncoding; 34 | 35 | // Create an API client. 36 | const client = new Client({ 37 | universe: universe, 38 | }); 39 | 40 | // Parse all the provided secrets into references. 41 | const secretsRefs = parseSecretsRefs(secretsInput); 42 | 43 | // Access and export each secret. 44 | for (const ref of secretsRefs) { 45 | const value = await client.accessSecret(ref, encoding); 46 | 47 | // Split multiline secrets by line break and mask each line. 48 | // Read more here: https://github.com/actions/runner/issues/161 49 | value.split(/\r\n|\r|\n/g).forEach((line) => { 50 | // Only mask sufficiently long values. There's a risk in masking 51 | // extremely short values in that it will make output completely 52 | // unreadable. 53 | if (line && line.length >= minMaskLength) { 54 | setSecret(line); 55 | } 56 | }); 57 | 58 | setOutput(ref.output, value); 59 | 60 | if (exportEnvironment) { 61 | exportVariable(ref.output, value); 62 | } 63 | } 64 | } catch (err) { 65 | const msg = errorMessage(err); 66 | setFailed(`google-github-actions/get-secretmanager-secrets failed with: ${msg}`); 67 | } 68 | } 69 | 70 | if (require.main === module) { 71 | run(); 72 | } 73 | -------------------------------------------------------------------------------- /src/reference.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2020 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | import { parseCSV } from '@google-github-actions/actions-utils'; 18 | 19 | /** 20 | * Parses a string of the format `outout:secret`. For example: 21 | * 22 | * output:project/secret/version 23 | * 24 | * @param s String reference to parse 25 | * @param location String location/region of secret 26 | * @returns Reference 27 | */ 28 | export class Reference { 29 | // output is the name of the output variable. 30 | readonly output: string; 31 | 32 | // project, name, and version are the secret ref 33 | readonly project: string; 34 | readonly name: string; 35 | readonly version: string; 36 | readonly location?: string; 37 | 38 | constructor(s: string) { 39 | const sParts = s.split(':'); 40 | if (sParts.length < 2) { 41 | throw new TypeError(`Invalid reference "${s}" - missing destination`); 42 | } 43 | 44 | this.output = sParts[0].trim(); 45 | 46 | // Trim each piece and remove empty entries 47 | const refParts = 48 | sParts 49 | ?.slice(1) 50 | ?.at(0) 51 | ?.split('/') 52 | ?.map((p) => (p || '').trim()) 53 | ?.filter((p) => p !== '') || []; 54 | 55 | switch (refParts.length) { 56 | // projects/

/locations//secrets//versions/ 57 | case 8: { 58 | this.project = refParts[1]; 59 | this.location = refParts[3]; 60 | this.name = refParts[5]; 61 | this.version = refParts[7]; 62 | break; 63 | } 64 | // projects/

/secrets//versions/ OR projects/

/locations//secerts/ 65 | case 6: { 66 | if (refParts[2] === 'secrets') { 67 | this.project = refParts[1]; 68 | this.name = refParts[3]; 69 | this.version = refParts[5]; 70 | break; 71 | } else if (refParts[2] === 'locations') { 72 | this.project = refParts[1]; 73 | this.location = refParts[3]; 74 | this.name = refParts[5]; 75 | this.version = 'latest'; 76 | break; 77 | } else { 78 | throw new TypeError(`Invalid reference "${s}" - unknown format`); 79 | } 80 | } 81 | // projects/

/secrets/ OR

/// 82 | case 4: { 83 | if (refParts[0] === 'projects') { 84 | this.project = refParts[1]; 85 | this.name = refParts[3]; 86 | this.version = 'latest'; 87 | break; 88 | } else { 89 | this.project = refParts[0]; 90 | this.location = refParts[1]; 91 | this.name = refParts[2]; 92 | this.version = refParts[3]; 93 | break; 94 | } 95 | } 96 | //

// 97 | case 3: { 98 | this.project = refParts[0]; 99 | this.name = refParts[1]; 100 | this.version = refParts[2]; 101 | break; 102 | } 103 | //

/ 104 | case 2: { 105 | this.project = refParts[0]; 106 | this.name = refParts[1]; 107 | this.version = 'latest'; 108 | break; 109 | } 110 | default: { 111 | throw new TypeError(`Invalid reference "${s}" - unknown format`); 112 | } 113 | } 114 | } 115 | 116 | /** 117 | * Returns the full GCP self link. For regional secrets, this will include the 118 | * location path. 119 | * 120 | * @returns String self link. 121 | */ 122 | public selfLink(): string { 123 | if (this.location) { 124 | return `projects/${this.project}/locations/${this.location}/secrets/${this.name}/versions/${this.version}`; 125 | } 126 | return `projects/${this.project}/secrets/${this.name}/versions/${this.version}`; 127 | } 128 | } 129 | 130 | /** 131 | * Accepts the actions list of secrets and parses them as References. 132 | * 133 | * @param input List of secrets, from the actions input, can be 134 | * comma-delimited or newline, whitespace around secret entires is removed. 135 | * @param location String value of secret location/region 136 | * @returns Array of References for each secret, in the same order they were 137 | * given. 138 | */ 139 | export function parseSecretsRefs(input: string): Reference[] { 140 | const secrets: Reference[] = []; 141 | for (const line of input.split(/\r|\n/)) { 142 | const pieces = parseCSV(line); 143 | for (const piece of pieces) { 144 | secrets.push(new Reference(piece)); 145 | } 146 | } 147 | return secrets; 148 | } 149 | -------------------------------------------------------------------------------- /tests/reference.test.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2020 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | import { test } from 'node:test'; 18 | import assert from 'node:assert'; 19 | 20 | import { Reference, parseSecretsRefs } from '../src/reference'; 21 | 22 | test('Reference', { concurrency: true }, async (suite) => { 23 | const cases = [ 24 | { 25 | input: 'out:projects/my-project/secrets/my-secret/versions/123', 26 | expected: 'projects/my-project/secrets/my-secret/versions/123', 27 | }, 28 | { 29 | input: 'out:projects/my-project/secrets/my-secret', 30 | expected: 'projects/my-project/secrets/my-secret/versions/latest', 31 | }, 32 | { 33 | input: 'out:projects/my-project/locations/my-location/secrets/my-secret', 34 | expected: 'projects/my-project/locations/my-location/secrets/my-secret/versions/latest', 35 | }, 36 | { 37 | input: 'out:my-project/my-secret/123', 38 | expected: 'projects/my-project/secrets/my-secret/versions/123', 39 | }, 40 | { 41 | input: 'out:my-project/my-secret', 42 | expected: 'projects/my-project/secrets/my-secret/versions/latest', 43 | }, 44 | { 45 | input: 'out: my-project/my-secret', 46 | expected: 'projects/my-project/secrets/my-secret/versions/latest', 47 | }, 48 | { 49 | input: 'out : projects/ my-project/ secrets/ my-secret', 50 | expected: 'projects/my-project/secrets/my-secret/versions/latest', 51 | }, 52 | { 53 | input: '', 54 | error: 'TypeError', 55 | }, 56 | { 57 | input: 'projects/my-project/secrets/my-secret/versions/123', 58 | error: 'TypeError', 59 | }, 60 | { 61 | input: 'out:projects/my-project/pandas/my-location/secrets/my-secret', 62 | error: 'TypeErorr', 63 | }, 64 | ]; 65 | 66 | for await (const tc of cases) { 67 | if (tc.expected) { 68 | await suite.test(`parses "${tc.input}"`, async () => { 69 | const actual = new Reference(tc.input); 70 | assert.deepStrictEqual(actual.selfLink(), tc.expected); 71 | }); 72 | } else if (tc.error) { 73 | await suite.test(`errors on "${tc.input}"`, async () => { 74 | await assert.rejects(async () => { 75 | new Reference(tc.input); 76 | }, tc.error); 77 | }); 78 | } 79 | } 80 | }); 81 | 82 | test('#parseSecretsRefs', { concurrency: true }, async (suite) => { 83 | const cases = [ 84 | { 85 | name: 'empty string', 86 | input: '', 87 | location: '', 88 | expected: [], 89 | }, 90 | { 91 | name: 'multi value commas', 92 | input: 'output1:project/secret, output2:project/secret', 93 | location: '', 94 | expected: [new Reference('output1:project/secret'), new Reference('output2:project/secret')], 95 | }, 96 | { 97 | name: 'multi value newlines', 98 | input: 'output1:project/secret\noutput2:project/secret', 99 | location: '', 100 | expected: [new Reference('output1:project/secret'), new Reference('output2:project/secret')], 101 | }, 102 | { 103 | name: 'multi value carriage', 104 | input: 'output1:project/secret\routput2:project/secret', 105 | location: '', 106 | expected: [new Reference('output1:project/secret'), new Reference('output2:project/secret')], 107 | }, 108 | { 109 | name: 'multi value carriage newline', 110 | input: 'output1:project/secret\r\noutput2:project/secret', 111 | location: '', 112 | expected: [new Reference('output1:project/secret'), new Reference('output2:project/secret')], 113 | }, 114 | { 115 | name: 'multi value empty lines', 116 | input: 'output1:project/secret\n\n\noutput2:project/secret', 117 | location: '', 118 | expected: [new Reference('output1:project/secret'), new Reference('output2:project/secret')], 119 | }, 120 | { 121 | name: 'multi value commas', 122 | input: 'output1:project/secret\noutput2:project/secret,output3:project/secret', 123 | location: '', 124 | expected: [ 125 | new Reference('output1:project/secret'), 126 | new Reference('output2:project/secret'), 127 | new Reference('output3:project/secret'), 128 | ], 129 | }, 130 | { 131 | name: 'invalid input', 132 | input: 'not/valid', 133 | location: '', 134 | error: 'Invalid reference', 135 | }, 136 | ]; 137 | 138 | for await (const tc of cases) { 139 | await suite.test(tc.name, async () => { 140 | if (tc.expected) { 141 | const actual = parseSecretsRefs(tc.input); 142 | assert.deepStrictEqual(actual, tc.expected); 143 | } else if (tc.error) { 144 | await assert.rejects(async () => { 145 | parseSecretsRefs(tc.input); 146 | }, tc.error); 147 | } 148 | }); 149 | } 150 | }); 151 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2020 Google LLC 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | { 17 | "compilerOptions": { 18 | "alwaysStrict": true, 19 | "esModuleInterop": true, 20 | "lib": ["es2022"], 21 | "module": "commonjs", 22 | "noImplicitAny": true, 23 | "outDir": "./dist", 24 | "rootDir": "./src", 25 | "strict": true, 26 | "target": "es2022", 27 | }, 28 | "exclude": ["dist/", "node_modules/", "tests/"], 29 | } 30 | --------------------------------------------------------------------------------