├── .github ├── 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 ├── bin └── runTests.sh ├── dist └── index.js ├── eslint.config.mjs ├── package-lock.json ├── package.json ├── src ├── client.ts ├── main.ts └── reference.ts ├── tests └── reference.test.ts └── tsconfig.json /.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 | with: 20 | version_strategy: '${{ github.event.inputs.version_strategy }}' 21 | secrets: 22 | ACTIONS_BOT_TOKEN: '${{ secrets.ACTIONS_BOT_TOKEN }}' 23 | -------------------------------------------------------------------------------- /.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 | jobs: 19 | integration: 20 | permissions: 21 | contents: 'read' 22 | id-token: 'write' 23 | runs-on: 'ubuntu-latest' 24 | 25 | steps: 26 | - uses: 'actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683' # ratchet:actions/checkout@v4 27 | 28 | - uses: 'actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a' # ratchet:actions/setup-node@v4 29 | with: 30 | node-version: '20.x' 31 | 32 | - name: 'npm build' 33 | run: 'npm ci && npm run build' 34 | 35 | - uses: 'google-github-actions/auth@v2' # ratchet:exclude 36 | with: 37 | workload_identity_provider: '${{ vars.WIF_PROVIDER_NAME }}' 38 | service_account: '${{ vars.SERVICE_ACCOUNT_EMAIL }}' 39 | 40 | - id: 'secrets' 41 | name: 'secrets' 42 | uses: './' 43 | with: 44 | secrets: |- 45 | token:${{ vars.SECRET_NAME }} 46 | password:${{ vars.SECRET_VERSION_NAME }} 47 | regional:${{ vars.REGIONAL_SECRET_NAME }} 48 | 49 | - name: 'outputs' 50 | run: echo '${{ steps.secrets.outputs.token }}${{ steps.secrets.outputs.password }}${{ steps.secrets.outputs.regional }}' 51 | 52 | - id: 'secrets-encoded' 53 | name: 'secrets-encoded' 54 | uses: './' 55 | with: 56 | encoding: 'hex' 57 | secrets: |- 58 | token:${{ vars.SECRET_NAME }} 59 | password:${{ vars.SECRET_VERSION_NAME }} 60 | regional:${{ vars.REGIONAL_SECRET_NAME }} 61 | 62 | - name: 'outputs-encoded' 63 | run: echo '${{ steps.secrets-encoded.outputs.token }}${{ steps.secrets-encoded.outputs.password }}${{ steps.secrets-encoded.outputs.regional }}' 64 | -------------------------------------------------------------------------------- /.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 | secrets: 13 | ACTIONS_BOT_TOKEN: '${{ secrets.ACTIONS_BOT_TOKEN }}' 14 | -------------------------------------------------------------------------------- /.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 | jobs: 19 | unit: 20 | strategy: 21 | fail-fast: false 22 | matrix: 23 | os: 24 | - 'ubuntu-latest' 25 | - 'windows-latest' 26 | - 'macos-latest' 27 | runs-on: '${{ matrix.os }}' 28 | 29 | steps: 30 | - uses: 'actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683' # ratchet:actions/checkout@v4 31 | 32 | - uses: 'actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a' # ratchet:actions/setup-node@v4 33 | with: 34 | node-version: '20.x' 35 | 36 | - name: 'npm build' 37 | run: 'npm ci && npm run build' 38 | 39 | - name: 'npm lint' 40 | # There's no need to run the linter for each operating system, since it 41 | # will find the same thing 3x and clog up the PR review. 42 | if: ${{ matrix.os == 'ubuntu-latest' }} 43 | run: 'npm run lint' 44 | 45 | - name: 'npm test' 46 | run: 'npm run test' 47 | -------------------------------------------------------------------------------- /.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@v2' 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@v2' 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@v2' 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@v2' 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@v2' 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@v2' 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@v2' 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: 'node20' 117 | main: 'dist/index.js' 118 | -------------------------------------------------------------------------------- /bin/runTests.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | set -eEuo pipefail 3 | 4 | # 5 | # As of Node 20, the --test parameter does not support globbing, and it does not 6 | # support variable Windows paths. We also cannot invoke the test runner 7 | # directly, because while it has an API, there's no way to force it to transpile 8 | # the Typescript into JavaScript before passing it to the runner. 9 | # 10 | # So we're left with this solution, which shells out to Node to list all files 11 | # that end in *.test.ts (excluding node_modules/), and then execs out to that 12 | # process. We have to exec so the stderr/stdout and exit code is appropriately 13 | # fed to the caller. 14 | # 15 | 16 | FILES="$(node -e "process.stdout.write(require('node:fs').readdirSync('./', { recursive: true }).filter((e) => {return e.endsWith('.test.ts') && !e.startsWith('node_modules');}).sort().join(' '));")" 17 | 18 | set -x 19 | exec node --require ts-node/register --test-reporter spec --test ${FILES} 20 | -------------------------------------------------------------------------------- /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": "2.2.3", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "get-secretmanager-secrets", 9 | "version": "2.2.3", 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": "^0.8.6", 15 | "google-auth-library": "^9.15.1", 16 | "npm-check-updates": "^17.1.14" 17 | }, 18 | "devDependencies": { 19 | "@eslint/eslintrc": "^3.2.0", 20 | "@eslint/js": "^9.19.0", 21 | "@types/node": "^22.13.0", 22 | "@typescript-eslint/eslint-plugin": "^8.22.0", 23 | "@typescript-eslint/parser": "^8.22.0", 24 | "@vercel/ncc": "^0.38.3", 25 | "eslint": "^9.19.0", 26 | "eslint-config-prettier": "^10.0.1", 27 | "eslint-plugin-prettier": "^5.2.3", 28 | "prettier": "^3.4.2", 29 | "ts-node": "^10.9.2", 30 | "typescript": "^5.7.3", 31 | "typescript-eslint": "^8.22.0" 32 | } 33 | }, 34 | "node_modules/@actions/core": { 35 | "version": "1.11.1", 36 | "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.11.1.tgz", 37 | "integrity": "sha512-hXJCSrkwfA46Vd9Z3q4cpEpHB1rL5NG04+/rbqW9d3+CSvtB1tYe8UTpAlixa1vj0m/ULglfEK2UKxMGxCxv5A==", 38 | "license": "MIT", 39 | "dependencies": { 40 | "@actions/exec": "^1.1.1", 41 | "@actions/http-client": "^2.0.1" 42 | } 43 | }, 44 | "node_modules/@actions/exec": { 45 | "version": "1.1.1", 46 | "resolved": "https://registry.npmjs.org/@actions/exec/-/exec-1.1.1.tgz", 47 | "integrity": "sha512-+sCcHHbVdk93a0XT19ECtO/gIXoxvdsgQLzb2fE2/5sIZmWQuluYyjPQtrtTHdU1YzTZ7bAPN4sITq2xi1679w==", 48 | "license": "MIT", 49 | "dependencies": { 50 | "@actions/io": "^1.0.1" 51 | } 52 | }, 53 | "node_modules/@actions/http-client": { 54 | "version": "2.2.3", 55 | "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.2.3.tgz", 56 | "integrity": "sha512-mx8hyJi/hjFvbPokCg4uRd4ZX78t+YyRPtnKWwIl+RzNaVuFpQHfmlGVfsKEJN8LwTCvL+DfVgAM04XaHkm6bA==", 57 | "license": "MIT", 58 | "dependencies": { 59 | "tunnel": "^0.0.6", 60 | "undici": "^5.25.4" 61 | } 62 | }, 63 | "node_modules/@actions/io": { 64 | "version": "1.1.3", 65 | "resolved": "https://registry.npmjs.org/@actions/io/-/io-1.1.3.tgz", 66 | "integrity": "sha512-wi9JjgKLYS7U/z8PPbco+PvTb/nRWjeoFlJ1Qer83k/3C5PHQi28hiVdeE2kHXmIL99mQFawx8qt/JPjZilJ8Q==", 67 | "license": "MIT" 68 | }, 69 | "node_modules/@cspotcode/source-map-support": { 70 | "version": "0.8.1", 71 | "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", 72 | "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", 73 | "dev": true, 74 | "license": "MIT", 75 | "dependencies": { 76 | "@jridgewell/trace-mapping": "0.3.9" 77 | }, 78 | "engines": { 79 | "node": ">=12" 80 | } 81 | }, 82 | "node_modules/@eslint-community/eslint-utils": { 83 | "version": "4.4.1", 84 | "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", 85 | "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", 86 | "dev": true, 87 | "license": "MIT", 88 | "dependencies": { 89 | "eslint-visitor-keys": "^3.4.3" 90 | }, 91 | "engines": { 92 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 93 | }, 94 | "funding": { 95 | "url": "https://opencollective.com/eslint" 96 | }, 97 | "peerDependencies": { 98 | "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" 99 | } 100 | }, 101 | "node_modules/@eslint-community/regexpp": { 102 | "version": "4.12.1", 103 | "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", 104 | "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", 105 | "dev": true, 106 | "license": "MIT", 107 | "engines": { 108 | "node": "^12.0.0 || ^14.0.0 || >=16.0.0" 109 | } 110 | }, 111 | "node_modules/@eslint/config-array": { 112 | "version": "0.19.2", 113 | "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.2.tgz", 114 | "integrity": "sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==", 115 | "dev": true, 116 | "license": "Apache-2.0", 117 | "dependencies": { 118 | "@eslint/object-schema": "^2.1.6", 119 | "debug": "^4.3.1", 120 | "minimatch": "^3.1.2" 121 | }, 122 | "engines": { 123 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 124 | } 125 | }, 126 | "node_modules/@eslint/core": { 127 | "version": "0.10.0", 128 | "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.10.0.tgz", 129 | "integrity": "sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==", 130 | "dev": true, 131 | "license": "Apache-2.0", 132 | "dependencies": { 133 | "@types/json-schema": "^7.0.15" 134 | }, 135 | "engines": { 136 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 137 | } 138 | }, 139 | "node_modules/@eslint/eslintrc": { 140 | "version": "3.2.0", 141 | "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz", 142 | "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==", 143 | "dev": true, 144 | "license": "MIT", 145 | "dependencies": { 146 | "ajv": "^6.12.4", 147 | "debug": "^4.3.2", 148 | "espree": "^10.0.1", 149 | "globals": "^14.0.0", 150 | "ignore": "^5.2.0", 151 | "import-fresh": "^3.2.1", 152 | "js-yaml": "^4.1.0", 153 | "minimatch": "^3.1.2", 154 | "strip-json-comments": "^3.1.1" 155 | }, 156 | "engines": { 157 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 158 | }, 159 | "funding": { 160 | "url": "https://opencollective.com/eslint" 161 | } 162 | }, 163 | "node_modules/@eslint/js": { 164 | "version": "9.19.0", 165 | "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.19.0.tgz", 166 | "integrity": "sha512-rbq9/g38qjfqFLOVPvwjIvFFdNziEC5S65jmjPw5r6A//QH+W91akh9irMwjDN8zKUTak6W9EsAv4m/7Wnw0UQ==", 167 | "dev": true, 168 | "license": "MIT", 169 | "engines": { 170 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 171 | } 172 | }, 173 | "node_modules/@eslint/object-schema": { 174 | "version": "2.1.6", 175 | "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", 176 | "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", 177 | "dev": true, 178 | "license": "Apache-2.0", 179 | "engines": { 180 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 181 | } 182 | }, 183 | "node_modules/@eslint/plugin-kit": { 184 | "version": "0.2.5", 185 | "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.5.tgz", 186 | "integrity": "sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A==", 187 | "dev": true, 188 | "license": "Apache-2.0", 189 | "dependencies": { 190 | "@eslint/core": "^0.10.0", 191 | "levn": "^0.4.1" 192 | }, 193 | "engines": { 194 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 195 | } 196 | }, 197 | "node_modules/@fastify/busboy": { 198 | "version": "2.1.1", 199 | "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", 200 | "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", 201 | "license": "MIT", 202 | "engines": { 203 | "node": ">=14" 204 | } 205 | }, 206 | "node_modules/@google-github-actions/actions-utils": { 207 | "version": "0.8.6", 208 | "resolved": "https://registry.npmjs.org/@google-github-actions/actions-utils/-/actions-utils-0.8.6.tgz", 209 | "integrity": "sha512-X/iZ7dycTHjKWk20RUJOxK0G0YHS44N8NN22SwQ01CNUWn3knbkg/VFfmlYidIG2vcWxIK+xMCkQxbNVVbdt4A==", 210 | "license": "Apache-2.0", 211 | "dependencies": { 212 | "yaml": "^2.7.0" 213 | }, 214 | "bin": { 215 | "actions-gen-readme": "bin/actions-gen-readme.mjs" 216 | } 217 | }, 218 | "node_modules/@humanfs/core": { 219 | "version": "0.19.1", 220 | "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", 221 | "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", 222 | "dev": true, 223 | "license": "Apache-2.0", 224 | "engines": { 225 | "node": ">=18.18.0" 226 | } 227 | }, 228 | "node_modules/@humanfs/node": { 229 | "version": "0.16.6", 230 | "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", 231 | "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", 232 | "dev": true, 233 | "license": "Apache-2.0", 234 | "dependencies": { 235 | "@humanfs/core": "^0.19.1", 236 | "@humanwhocodes/retry": "^0.3.0" 237 | }, 238 | "engines": { 239 | "node": ">=18.18.0" 240 | } 241 | }, 242 | "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { 243 | "version": "0.3.1", 244 | "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", 245 | "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", 246 | "dev": true, 247 | "license": "Apache-2.0", 248 | "engines": { 249 | "node": ">=18.18" 250 | }, 251 | "funding": { 252 | "type": "github", 253 | "url": "https://github.com/sponsors/nzakas" 254 | } 255 | }, 256 | "node_modules/@humanwhocodes/module-importer": { 257 | "version": "1.0.1", 258 | "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", 259 | "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", 260 | "dev": true, 261 | "license": "Apache-2.0", 262 | "engines": { 263 | "node": ">=12.22" 264 | }, 265 | "funding": { 266 | "type": "github", 267 | "url": "https://github.com/sponsors/nzakas" 268 | } 269 | }, 270 | "node_modules/@humanwhocodes/retry": { 271 | "version": "0.4.1", 272 | "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz", 273 | "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==", 274 | "dev": true, 275 | "license": "Apache-2.0", 276 | "engines": { 277 | "node": ">=18.18" 278 | }, 279 | "funding": { 280 | "type": "github", 281 | "url": "https://github.com/sponsors/nzakas" 282 | } 283 | }, 284 | "node_modules/@jridgewell/resolve-uri": { 285 | "version": "3.1.2", 286 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", 287 | "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", 288 | "dev": true, 289 | "license": "MIT", 290 | "engines": { 291 | "node": ">=6.0.0" 292 | } 293 | }, 294 | "node_modules/@jridgewell/sourcemap-codec": { 295 | "version": "1.5.0", 296 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", 297 | "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", 298 | "dev": true, 299 | "license": "MIT" 300 | }, 301 | "node_modules/@jridgewell/trace-mapping": { 302 | "version": "0.3.9", 303 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", 304 | "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", 305 | "dev": true, 306 | "license": "MIT", 307 | "dependencies": { 308 | "@jridgewell/resolve-uri": "^3.0.3", 309 | "@jridgewell/sourcemap-codec": "^1.4.10" 310 | } 311 | }, 312 | "node_modules/@nodelib/fs.scandir": { 313 | "version": "2.1.5", 314 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 315 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 316 | "dev": true, 317 | "license": "MIT", 318 | "dependencies": { 319 | "@nodelib/fs.stat": "2.0.5", 320 | "run-parallel": "^1.1.9" 321 | }, 322 | "engines": { 323 | "node": ">= 8" 324 | } 325 | }, 326 | "node_modules/@nodelib/fs.stat": { 327 | "version": "2.0.5", 328 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 329 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 330 | "dev": true, 331 | "license": "MIT", 332 | "engines": { 333 | "node": ">= 8" 334 | } 335 | }, 336 | "node_modules/@nodelib/fs.walk": { 337 | "version": "1.2.8", 338 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 339 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 340 | "dev": true, 341 | "license": "MIT", 342 | "dependencies": { 343 | "@nodelib/fs.scandir": "2.1.5", 344 | "fastq": "^1.6.0" 345 | }, 346 | "engines": { 347 | "node": ">= 8" 348 | } 349 | }, 350 | "node_modules/@pkgr/core": { 351 | "version": "0.1.1", 352 | "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", 353 | "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", 354 | "dev": true, 355 | "license": "MIT", 356 | "engines": { 357 | "node": "^12.20.0 || ^14.18.0 || >=16.0.0" 358 | }, 359 | "funding": { 360 | "url": "https://opencollective.com/unts" 361 | } 362 | }, 363 | "node_modules/@tsconfig/node10": { 364 | "version": "1.0.11", 365 | "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", 366 | "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", 367 | "dev": true, 368 | "license": "MIT" 369 | }, 370 | "node_modules/@tsconfig/node12": { 371 | "version": "1.0.11", 372 | "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", 373 | "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", 374 | "dev": true, 375 | "license": "MIT" 376 | }, 377 | "node_modules/@tsconfig/node14": { 378 | "version": "1.0.3", 379 | "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", 380 | "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", 381 | "dev": true, 382 | "license": "MIT" 383 | }, 384 | "node_modules/@tsconfig/node16": { 385 | "version": "1.0.4", 386 | "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", 387 | "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", 388 | "dev": true, 389 | "license": "MIT" 390 | }, 391 | "node_modules/@types/estree": { 392 | "version": "1.0.6", 393 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", 394 | "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", 395 | "dev": true, 396 | "license": "MIT" 397 | }, 398 | "node_modules/@types/json-schema": { 399 | "version": "7.0.15", 400 | "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", 401 | "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", 402 | "dev": true, 403 | "license": "MIT" 404 | }, 405 | "node_modules/@types/node": { 406 | "version": "22.13.0", 407 | "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.0.tgz", 408 | "integrity": "sha512-ClIbNe36lawluuvq3+YYhnIN2CELi+6q8NpnM7PYp4hBn/TatfboPgVSm2rwKRfnV2M+Ty9GWDFI64KEe+kysA==", 409 | "dev": true, 410 | "license": "MIT", 411 | "dependencies": { 412 | "undici-types": "~6.20.0" 413 | } 414 | }, 415 | "node_modules/@typescript-eslint/eslint-plugin": { 416 | "version": "8.22.0", 417 | "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.22.0.tgz", 418 | "integrity": "sha512-4Uta6REnz/xEJMvwf72wdUnC3rr4jAQf5jnTkeRQ9b6soxLxhDEbS/pfMPoJLDfFPNVRdryqWUIV/2GZzDJFZw==", 419 | "dev": true, 420 | "license": "MIT", 421 | "dependencies": { 422 | "@eslint-community/regexpp": "^4.10.0", 423 | "@typescript-eslint/scope-manager": "8.22.0", 424 | "@typescript-eslint/type-utils": "8.22.0", 425 | "@typescript-eslint/utils": "8.22.0", 426 | "@typescript-eslint/visitor-keys": "8.22.0", 427 | "graphemer": "^1.4.0", 428 | "ignore": "^5.3.1", 429 | "natural-compare": "^1.4.0", 430 | "ts-api-utils": "^2.0.0" 431 | }, 432 | "engines": { 433 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 434 | }, 435 | "funding": { 436 | "type": "opencollective", 437 | "url": "https://opencollective.com/typescript-eslint" 438 | }, 439 | "peerDependencies": { 440 | "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", 441 | "eslint": "^8.57.0 || ^9.0.0", 442 | "typescript": ">=4.8.4 <5.8.0" 443 | } 444 | }, 445 | "node_modules/@typescript-eslint/parser": { 446 | "version": "8.22.0", 447 | "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.22.0.tgz", 448 | "integrity": "sha512-MqtmbdNEdoNxTPzpWiWnqNac54h8JDAmkWtJExBVVnSrSmi9z+sZUt0LfKqk9rjqmKOIeRhO4fHHJ1nQIjduIQ==", 449 | "dev": true, 450 | "license": "MIT", 451 | "dependencies": { 452 | "@typescript-eslint/scope-manager": "8.22.0", 453 | "@typescript-eslint/types": "8.22.0", 454 | "@typescript-eslint/typescript-estree": "8.22.0", 455 | "@typescript-eslint/visitor-keys": "8.22.0", 456 | "debug": "^4.3.4" 457 | }, 458 | "engines": { 459 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 460 | }, 461 | "funding": { 462 | "type": "opencollective", 463 | "url": "https://opencollective.com/typescript-eslint" 464 | }, 465 | "peerDependencies": { 466 | "eslint": "^8.57.0 || ^9.0.0", 467 | "typescript": ">=4.8.4 <5.8.0" 468 | } 469 | }, 470 | "node_modules/@typescript-eslint/scope-manager": { 471 | "version": "8.22.0", 472 | "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.22.0.tgz", 473 | "integrity": "sha512-/lwVV0UYgkj7wPSw0o8URy6YI64QmcOdwHuGuxWIYznO6d45ER0wXUbksr9pYdViAofpUCNJx/tAzNukgvaaiQ==", 474 | "dev": true, 475 | "license": "MIT", 476 | "dependencies": { 477 | "@typescript-eslint/types": "8.22.0", 478 | "@typescript-eslint/visitor-keys": "8.22.0" 479 | }, 480 | "engines": { 481 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 482 | }, 483 | "funding": { 484 | "type": "opencollective", 485 | "url": "https://opencollective.com/typescript-eslint" 486 | } 487 | }, 488 | "node_modules/@typescript-eslint/type-utils": { 489 | "version": "8.22.0", 490 | "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.22.0.tgz", 491 | "integrity": "sha512-NzE3aB62fDEaGjaAYZE4LH7I1MUwHooQ98Byq0G0y3kkibPJQIXVUspzlFOmOfHhiDLwKzMlWxaNv+/qcZurJA==", 492 | "dev": true, 493 | "license": "MIT", 494 | "dependencies": { 495 | "@typescript-eslint/typescript-estree": "8.22.0", 496 | "@typescript-eslint/utils": "8.22.0", 497 | "debug": "^4.3.4", 498 | "ts-api-utils": "^2.0.0" 499 | }, 500 | "engines": { 501 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 502 | }, 503 | "funding": { 504 | "type": "opencollective", 505 | "url": "https://opencollective.com/typescript-eslint" 506 | }, 507 | "peerDependencies": { 508 | "eslint": "^8.57.0 || ^9.0.0", 509 | "typescript": ">=4.8.4 <5.8.0" 510 | } 511 | }, 512 | "node_modules/@typescript-eslint/types": { 513 | "version": "8.22.0", 514 | "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.22.0.tgz", 515 | "integrity": "sha512-0S4M4baNzp612zwpD4YOieP3VowOARgK2EkN/GBn95hpyF8E2fbMT55sRHWBq+Huaqk3b3XK+rxxlM8sPgGM6A==", 516 | "dev": true, 517 | "license": "MIT", 518 | "engines": { 519 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 520 | }, 521 | "funding": { 522 | "type": "opencollective", 523 | "url": "https://opencollective.com/typescript-eslint" 524 | } 525 | }, 526 | "node_modules/@typescript-eslint/typescript-estree": { 527 | "version": "8.22.0", 528 | "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.22.0.tgz", 529 | "integrity": "sha512-SJX99NAS2ugGOzpyhMza/tX+zDwjvwAtQFLsBo3GQxiGcvaKlqGBkmZ+Y1IdiSi9h4Q0Lr5ey+Cp9CGWNY/F/w==", 530 | "dev": true, 531 | "license": "MIT", 532 | "dependencies": { 533 | "@typescript-eslint/types": "8.22.0", 534 | "@typescript-eslint/visitor-keys": "8.22.0", 535 | "debug": "^4.3.4", 536 | "fast-glob": "^3.3.2", 537 | "is-glob": "^4.0.3", 538 | "minimatch": "^9.0.4", 539 | "semver": "^7.6.0", 540 | "ts-api-utils": "^2.0.0" 541 | }, 542 | "engines": { 543 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 544 | }, 545 | "funding": { 546 | "type": "opencollective", 547 | "url": "https://opencollective.com/typescript-eslint" 548 | }, 549 | "peerDependencies": { 550 | "typescript": ">=4.8.4 <5.8.0" 551 | } 552 | }, 553 | "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { 554 | "version": "2.0.1", 555 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 556 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 557 | "dev": true, 558 | "license": "MIT", 559 | "dependencies": { 560 | "balanced-match": "^1.0.0" 561 | } 562 | }, 563 | "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { 564 | "version": "9.0.5", 565 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", 566 | "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", 567 | "dev": true, 568 | "license": "ISC", 569 | "dependencies": { 570 | "brace-expansion": "^2.0.1" 571 | }, 572 | "engines": { 573 | "node": ">=16 || 14 >=14.17" 574 | }, 575 | "funding": { 576 | "url": "https://github.com/sponsors/isaacs" 577 | } 578 | }, 579 | "node_modules/@typescript-eslint/utils": { 580 | "version": "8.22.0", 581 | "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.22.0.tgz", 582 | "integrity": "sha512-T8oc1MbF8L+Bk2msAvCUzjxVB2Z2f+vXYfcucE2wOmYs7ZUwco5Ep0fYZw8quNwOiw9K8GYVL+Kgc2pETNTLOg==", 583 | "dev": true, 584 | "license": "MIT", 585 | "dependencies": { 586 | "@eslint-community/eslint-utils": "^4.4.0", 587 | "@typescript-eslint/scope-manager": "8.22.0", 588 | "@typescript-eslint/types": "8.22.0", 589 | "@typescript-eslint/typescript-estree": "8.22.0" 590 | }, 591 | "engines": { 592 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 593 | }, 594 | "funding": { 595 | "type": "opencollective", 596 | "url": "https://opencollective.com/typescript-eslint" 597 | }, 598 | "peerDependencies": { 599 | "eslint": "^8.57.0 || ^9.0.0", 600 | "typescript": ">=4.8.4 <5.8.0" 601 | } 602 | }, 603 | "node_modules/@typescript-eslint/visitor-keys": { 604 | "version": "8.22.0", 605 | "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.22.0.tgz", 606 | "integrity": "sha512-AWpYAXnUgvLNabGTy3uBylkgZoosva/miNd1I8Bz3SjotmQPbVqhO4Cczo8AsZ44XVErEBPr/CRSgaj8sG7g0w==", 607 | "dev": true, 608 | "license": "MIT", 609 | "dependencies": { 610 | "@typescript-eslint/types": "8.22.0", 611 | "eslint-visitor-keys": "^4.2.0" 612 | }, 613 | "engines": { 614 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 615 | }, 616 | "funding": { 617 | "type": "opencollective", 618 | "url": "https://opencollective.com/typescript-eslint" 619 | } 620 | }, 621 | "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { 622 | "version": "4.2.0", 623 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", 624 | "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", 625 | "dev": true, 626 | "license": "Apache-2.0", 627 | "engines": { 628 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 629 | }, 630 | "funding": { 631 | "url": "https://opencollective.com/eslint" 632 | } 633 | }, 634 | "node_modules/@vercel/ncc": { 635 | "version": "0.38.3", 636 | "resolved": "https://registry.npmjs.org/@vercel/ncc/-/ncc-0.38.3.tgz", 637 | "integrity": "sha512-rnK6hJBS6mwc+Bkab+PGPs9OiS0i/3kdTO+CkI8V0/VrW3vmz7O2Pxjw/owOlmo6PKEIxRSeZKv/kuL9itnpYA==", 638 | "dev": true, 639 | "license": "MIT", 640 | "bin": { 641 | "ncc": "dist/ncc/cli.js" 642 | } 643 | }, 644 | "node_modules/acorn": { 645 | "version": "8.14.0", 646 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", 647 | "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", 648 | "dev": true, 649 | "license": "MIT", 650 | "bin": { 651 | "acorn": "bin/acorn" 652 | }, 653 | "engines": { 654 | "node": ">=0.4.0" 655 | } 656 | }, 657 | "node_modules/acorn-jsx": { 658 | "version": "5.3.2", 659 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", 660 | "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", 661 | "dev": true, 662 | "license": "MIT", 663 | "peerDependencies": { 664 | "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" 665 | } 666 | }, 667 | "node_modules/acorn-walk": { 668 | "version": "8.3.4", 669 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", 670 | "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", 671 | "dev": true, 672 | "license": "MIT", 673 | "dependencies": { 674 | "acorn": "^8.11.0" 675 | }, 676 | "engines": { 677 | "node": ">=0.4.0" 678 | } 679 | }, 680 | "node_modules/agent-base": { 681 | "version": "7.1.3", 682 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", 683 | "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", 684 | "license": "MIT", 685 | "engines": { 686 | "node": ">= 14" 687 | } 688 | }, 689 | "node_modules/ajv": { 690 | "version": "6.12.6", 691 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 692 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 693 | "dev": true, 694 | "license": "MIT", 695 | "dependencies": { 696 | "fast-deep-equal": "^3.1.1", 697 | "fast-json-stable-stringify": "^2.0.0", 698 | "json-schema-traverse": "^0.4.1", 699 | "uri-js": "^4.2.2" 700 | }, 701 | "funding": { 702 | "type": "github", 703 | "url": "https://github.com/sponsors/epoberezkin" 704 | } 705 | }, 706 | "node_modules/ansi-styles": { 707 | "version": "4.3.0", 708 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 709 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 710 | "dev": true, 711 | "license": "MIT", 712 | "dependencies": { 713 | "color-convert": "^2.0.1" 714 | }, 715 | "engines": { 716 | "node": ">=8" 717 | }, 718 | "funding": { 719 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 720 | } 721 | }, 722 | "node_modules/arg": { 723 | "version": "4.1.3", 724 | "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", 725 | "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", 726 | "dev": true, 727 | "license": "MIT" 728 | }, 729 | "node_modules/argparse": { 730 | "version": "2.0.1", 731 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 732 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 733 | "dev": true, 734 | "license": "Python-2.0" 735 | }, 736 | "node_modules/balanced-match": { 737 | "version": "1.0.2", 738 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 739 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 740 | "dev": true, 741 | "license": "MIT" 742 | }, 743 | "node_modules/base64-js": { 744 | "version": "1.5.1", 745 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 746 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", 747 | "funding": [ 748 | { 749 | "type": "github", 750 | "url": "https://github.com/sponsors/feross" 751 | }, 752 | { 753 | "type": "patreon", 754 | "url": "https://www.patreon.com/feross" 755 | }, 756 | { 757 | "type": "consulting", 758 | "url": "https://feross.org/support" 759 | } 760 | ], 761 | "license": "MIT" 762 | }, 763 | "node_modules/bignumber.js": { 764 | "version": "9.1.2", 765 | "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", 766 | "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", 767 | "license": "MIT", 768 | "engines": { 769 | "node": "*" 770 | } 771 | }, 772 | "node_modules/brace-expansion": { 773 | "version": "1.1.11", 774 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 775 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 776 | "dev": true, 777 | "license": "MIT", 778 | "dependencies": { 779 | "balanced-match": "^1.0.0", 780 | "concat-map": "0.0.1" 781 | } 782 | }, 783 | "node_modules/braces": { 784 | "version": "3.0.3", 785 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", 786 | "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", 787 | "dev": true, 788 | "license": "MIT", 789 | "dependencies": { 790 | "fill-range": "^7.1.1" 791 | }, 792 | "engines": { 793 | "node": ">=8" 794 | } 795 | }, 796 | "node_modules/buffer-equal-constant-time": { 797 | "version": "1.0.1", 798 | "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", 799 | "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", 800 | "license": "BSD-3-Clause" 801 | }, 802 | "node_modules/callsites": { 803 | "version": "3.1.0", 804 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 805 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 806 | "dev": true, 807 | "license": "MIT", 808 | "engines": { 809 | "node": ">=6" 810 | } 811 | }, 812 | "node_modules/chalk": { 813 | "version": "4.1.2", 814 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 815 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 816 | "dev": true, 817 | "license": "MIT", 818 | "dependencies": { 819 | "ansi-styles": "^4.1.0", 820 | "supports-color": "^7.1.0" 821 | }, 822 | "engines": { 823 | "node": ">=10" 824 | }, 825 | "funding": { 826 | "url": "https://github.com/chalk/chalk?sponsor=1" 827 | } 828 | }, 829 | "node_modules/color-convert": { 830 | "version": "2.0.1", 831 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 832 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 833 | "dev": true, 834 | "license": "MIT", 835 | "dependencies": { 836 | "color-name": "~1.1.4" 837 | }, 838 | "engines": { 839 | "node": ">=7.0.0" 840 | } 841 | }, 842 | "node_modules/color-name": { 843 | "version": "1.1.4", 844 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 845 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 846 | "dev": true, 847 | "license": "MIT" 848 | }, 849 | "node_modules/concat-map": { 850 | "version": "0.0.1", 851 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 852 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 853 | "dev": true, 854 | "license": "MIT" 855 | }, 856 | "node_modules/create-require": { 857 | "version": "1.1.1", 858 | "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", 859 | "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", 860 | "dev": true, 861 | "license": "MIT" 862 | }, 863 | "node_modules/cross-spawn": { 864 | "version": "7.0.6", 865 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", 866 | "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", 867 | "dev": true, 868 | "license": "MIT", 869 | "dependencies": { 870 | "path-key": "^3.1.0", 871 | "shebang-command": "^2.0.0", 872 | "which": "^2.0.1" 873 | }, 874 | "engines": { 875 | "node": ">= 8" 876 | } 877 | }, 878 | "node_modules/debug": { 879 | "version": "4.4.0", 880 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", 881 | "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", 882 | "license": "MIT", 883 | "dependencies": { 884 | "ms": "^2.1.3" 885 | }, 886 | "engines": { 887 | "node": ">=6.0" 888 | }, 889 | "peerDependenciesMeta": { 890 | "supports-color": { 891 | "optional": true 892 | } 893 | } 894 | }, 895 | "node_modules/deep-is": { 896 | "version": "0.1.4", 897 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", 898 | "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", 899 | "dev": true, 900 | "license": "MIT" 901 | }, 902 | "node_modules/diff": { 903 | "version": "4.0.2", 904 | "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", 905 | "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", 906 | "dev": true, 907 | "license": "BSD-3-Clause", 908 | "engines": { 909 | "node": ">=0.3.1" 910 | } 911 | }, 912 | "node_modules/ecdsa-sig-formatter": { 913 | "version": "1.0.11", 914 | "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", 915 | "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", 916 | "license": "Apache-2.0", 917 | "dependencies": { 918 | "safe-buffer": "^5.0.1" 919 | } 920 | }, 921 | "node_modules/escape-string-regexp": { 922 | "version": "4.0.0", 923 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 924 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 925 | "dev": true, 926 | "license": "MIT", 927 | "engines": { 928 | "node": ">=10" 929 | }, 930 | "funding": { 931 | "url": "https://github.com/sponsors/sindresorhus" 932 | } 933 | }, 934 | "node_modules/eslint": { 935 | "version": "9.19.0", 936 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.19.0.tgz", 937 | "integrity": "sha512-ug92j0LepKlbbEv6hD911THhoRHmbdXt2gX+VDABAW/Ir7D3nqKdv5Pf5vtlyY6HQMTEP2skXY43ueqTCWssEA==", 938 | "dev": true, 939 | "license": "MIT", 940 | "dependencies": { 941 | "@eslint-community/eslint-utils": "^4.2.0", 942 | "@eslint-community/regexpp": "^4.12.1", 943 | "@eslint/config-array": "^0.19.0", 944 | "@eslint/core": "^0.10.0", 945 | "@eslint/eslintrc": "^3.2.0", 946 | "@eslint/js": "9.19.0", 947 | "@eslint/plugin-kit": "^0.2.5", 948 | "@humanfs/node": "^0.16.6", 949 | "@humanwhocodes/module-importer": "^1.0.1", 950 | "@humanwhocodes/retry": "^0.4.1", 951 | "@types/estree": "^1.0.6", 952 | "@types/json-schema": "^7.0.15", 953 | "ajv": "^6.12.4", 954 | "chalk": "^4.0.0", 955 | "cross-spawn": "^7.0.6", 956 | "debug": "^4.3.2", 957 | "escape-string-regexp": "^4.0.0", 958 | "eslint-scope": "^8.2.0", 959 | "eslint-visitor-keys": "^4.2.0", 960 | "espree": "^10.3.0", 961 | "esquery": "^1.5.0", 962 | "esutils": "^2.0.2", 963 | "fast-deep-equal": "^3.1.3", 964 | "file-entry-cache": "^8.0.0", 965 | "find-up": "^5.0.0", 966 | "glob-parent": "^6.0.2", 967 | "ignore": "^5.2.0", 968 | "imurmurhash": "^0.1.4", 969 | "is-glob": "^4.0.0", 970 | "json-stable-stringify-without-jsonify": "^1.0.1", 971 | "lodash.merge": "^4.6.2", 972 | "minimatch": "^3.1.2", 973 | "natural-compare": "^1.4.0", 974 | "optionator": "^0.9.3" 975 | }, 976 | "bin": { 977 | "eslint": "bin/eslint.js" 978 | }, 979 | "engines": { 980 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 981 | }, 982 | "funding": { 983 | "url": "https://eslint.org/donate" 984 | }, 985 | "peerDependencies": { 986 | "jiti": "*" 987 | }, 988 | "peerDependenciesMeta": { 989 | "jiti": { 990 | "optional": true 991 | } 992 | } 993 | }, 994 | "node_modules/eslint-config-prettier": { 995 | "version": "10.0.1", 996 | "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.0.1.tgz", 997 | "integrity": "sha512-lZBts941cyJyeaooiKxAtzoPHTN+GbQTJFAIdQbRhA4/8whaAraEh47Whw/ZFfrjNSnlAxqfm9i0XVAEkULjCw==", 998 | "dev": true, 999 | "license": "MIT", 1000 | "bin": { 1001 | "eslint-config-prettier": "build/bin/cli.js" 1002 | }, 1003 | "peerDependencies": { 1004 | "eslint": ">=7.0.0" 1005 | } 1006 | }, 1007 | "node_modules/eslint-plugin-prettier": { 1008 | "version": "5.2.3", 1009 | "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.3.tgz", 1010 | "integrity": "sha512-qJ+y0FfCp/mQYQ/vWQ3s7eUlFEL4PyKfAJxsnYTJ4YT73nsJBWqmEpFryxV9OeUiqmsTsYJ5Y+KDNaeP31wrRw==", 1011 | "dev": true, 1012 | "license": "MIT", 1013 | "dependencies": { 1014 | "prettier-linter-helpers": "^1.0.0", 1015 | "synckit": "^0.9.1" 1016 | }, 1017 | "engines": { 1018 | "node": "^14.18.0 || >=16.0.0" 1019 | }, 1020 | "funding": { 1021 | "url": "https://opencollective.com/eslint-plugin-prettier" 1022 | }, 1023 | "peerDependencies": { 1024 | "@types/eslint": ">=8.0.0", 1025 | "eslint": ">=8.0.0", 1026 | "eslint-config-prettier": "*", 1027 | "prettier": ">=3.0.0" 1028 | }, 1029 | "peerDependenciesMeta": { 1030 | "@types/eslint": { 1031 | "optional": true 1032 | }, 1033 | "eslint-config-prettier": { 1034 | "optional": true 1035 | } 1036 | } 1037 | }, 1038 | "node_modules/eslint-scope": { 1039 | "version": "8.2.0", 1040 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", 1041 | "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", 1042 | "dev": true, 1043 | "license": "BSD-2-Clause", 1044 | "dependencies": { 1045 | "esrecurse": "^4.3.0", 1046 | "estraverse": "^5.2.0" 1047 | }, 1048 | "engines": { 1049 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1050 | }, 1051 | "funding": { 1052 | "url": "https://opencollective.com/eslint" 1053 | } 1054 | }, 1055 | "node_modules/eslint-visitor-keys": { 1056 | "version": "3.4.3", 1057 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", 1058 | "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", 1059 | "dev": true, 1060 | "license": "Apache-2.0", 1061 | "engines": { 1062 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 1063 | }, 1064 | "funding": { 1065 | "url": "https://opencollective.com/eslint" 1066 | } 1067 | }, 1068 | "node_modules/eslint/node_modules/eslint-visitor-keys": { 1069 | "version": "4.2.0", 1070 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", 1071 | "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", 1072 | "dev": true, 1073 | "license": "Apache-2.0", 1074 | "engines": { 1075 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1076 | }, 1077 | "funding": { 1078 | "url": "https://opencollective.com/eslint" 1079 | } 1080 | }, 1081 | "node_modules/espree": { 1082 | "version": "10.3.0", 1083 | "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", 1084 | "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", 1085 | "dev": true, 1086 | "license": "BSD-2-Clause", 1087 | "dependencies": { 1088 | "acorn": "^8.14.0", 1089 | "acorn-jsx": "^5.3.2", 1090 | "eslint-visitor-keys": "^4.2.0" 1091 | }, 1092 | "engines": { 1093 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1094 | }, 1095 | "funding": { 1096 | "url": "https://opencollective.com/eslint" 1097 | } 1098 | }, 1099 | "node_modules/espree/node_modules/eslint-visitor-keys": { 1100 | "version": "4.2.0", 1101 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", 1102 | "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", 1103 | "dev": true, 1104 | "license": "Apache-2.0", 1105 | "engines": { 1106 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1107 | }, 1108 | "funding": { 1109 | "url": "https://opencollective.com/eslint" 1110 | } 1111 | }, 1112 | "node_modules/esquery": { 1113 | "version": "1.6.0", 1114 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", 1115 | "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", 1116 | "dev": true, 1117 | "license": "BSD-3-Clause", 1118 | "dependencies": { 1119 | "estraverse": "^5.1.0" 1120 | }, 1121 | "engines": { 1122 | "node": ">=0.10" 1123 | } 1124 | }, 1125 | "node_modules/esrecurse": { 1126 | "version": "4.3.0", 1127 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 1128 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 1129 | "dev": true, 1130 | "license": "BSD-2-Clause", 1131 | "dependencies": { 1132 | "estraverse": "^5.2.0" 1133 | }, 1134 | "engines": { 1135 | "node": ">=4.0" 1136 | } 1137 | }, 1138 | "node_modules/estraverse": { 1139 | "version": "5.3.0", 1140 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 1141 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 1142 | "dev": true, 1143 | "license": "BSD-2-Clause", 1144 | "engines": { 1145 | "node": ">=4.0" 1146 | } 1147 | }, 1148 | "node_modules/esutils": { 1149 | "version": "2.0.3", 1150 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 1151 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 1152 | "dev": true, 1153 | "license": "BSD-2-Clause", 1154 | "engines": { 1155 | "node": ">=0.10.0" 1156 | } 1157 | }, 1158 | "node_modules/extend": { 1159 | "version": "3.0.2", 1160 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 1161 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", 1162 | "license": "MIT" 1163 | }, 1164 | "node_modules/fast-deep-equal": { 1165 | "version": "3.1.3", 1166 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 1167 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 1168 | "dev": true, 1169 | "license": "MIT" 1170 | }, 1171 | "node_modules/fast-diff": { 1172 | "version": "1.3.0", 1173 | "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", 1174 | "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", 1175 | "dev": true, 1176 | "license": "Apache-2.0" 1177 | }, 1178 | "node_modules/fast-glob": { 1179 | "version": "3.3.3", 1180 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", 1181 | "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", 1182 | "dev": true, 1183 | "license": "MIT", 1184 | "dependencies": { 1185 | "@nodelib/fs.stat": "^2.0.2", 1186 | "@nodelib/fs.walk": "^1.2.3", 1187 | "glob-parent": "^5.1.2", 1188 | "merge2": "^1.3.0", 1189 | "micromatch": "^4.0.8" 1190 | }, 1191 | "engines": { 1192 | "node": ">=8.6.0" 1193 | } 1194 | }, 1195 | "node_modules/fast-glob/node_modules/glob-parent": { 1196 | "version": "5.1.2", 1197 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 1198 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 1199 | "dev": true, 1200 | "license": "ISC", 1201 | "dependencies": { 1202 | "is-glob": "^4.0.1" 1203 | }, 1204 | "engines": { 1205 | "node": ">= 6" 1206 | } 1207 | }, 1208 | "node_modules/fast-json-stable-stringify": { 1209 | "version": "2.1.0", 1210 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 1211 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 1212 | "dev": true, 1213 | "license": "MIT" 1214 | }, 1215 | "node_modules/fast-levenshtein": { 1216 | "version": "2.0.6", 1217 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 1218 | "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", 1219 | "dev": true, 1220 | "license": "MIT" 1221 | }, 1222 | "node_modules/fastq": { 1223 | "version": "1.19.0", 1224 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.0.tgz", 1225 | "integrity": "sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==", 1226 | "dev": true, 1227 | "license": "ISC", 1228 | "dependencies": { 1229 | "reusify": "^1.0.4" 1230 | } 1231 | }, 1232 | "node_modules/file-entry-cache": { 1233 | "version": "8.0.0", 1234 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", 1235 | "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", 1236 | "dev": true, 1237 | "license": "MIT", 1238 | "dependencies": { 1239 | "flat-cache": "^4.0.0" 1240 | }, 1241 | "engines": { 1242 | "node": ">=16.0.0" 1243 | } 1244 | }, 1245 | "node_modules/fill-range": { 1246 | "version": "7.1.1", 1247 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", 1248 | "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", 1249 | "dev": true, 1250 | "license": "MIT", 1251 | "dependencies": { 1252 | "to-regex-range": "^5.0.1" 1253 | }, 1254 | "engines": { 1255 | "node": ">=8" 1256 | } 1257 | }, 1258 | "node_modules/find-up": { 1259 | "version": "5.0.0", 1260 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 1261 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 1262 | "dev": true, 1263 | "license": "MIT", 1264 | "dependencies": { 1265 | "locate-path": "^6.0.0", 1266 | "path-exists": "^4.0.0" 1267 | }, 1268 | "engines": { 1269 | "node": ">=10" 1270 | }, 1271 | "funding": { 1272 | "url": "https://github.com/sponsors/sindresorhus" 1273 | } 1274 | }, 1275 | "node_modules/flat-cache": { 1276 | "version": "4.0.1", 1277 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", 1278 | "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", 1279 | "dev": true, 1280 | "license": "MIT", 1281 | "dependencies": { 1282 | "flatted": "^3.2.9", 1283 | "keyv": "^4.5.4" 1284 | }, 1285 | "engines": { 1286 | "node": ">=16" 1287 | } 1288 | }, 1289 | "node_modules/flatted": { 1290 | "version": "3.3.2", 1291 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", 1292 | "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", 1293 | "dev": true, 1294 | "license": "ISC" 1295 | }, 1296 | "node_modules/gaxios": { 1297 | "version": "6.7.1", 1298 | "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.7.1.tgz", 1299 | "integrity": "sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==", 1300 | "license": "Apache-2.0", 1301 | "dependencies": { 1302 | "extend": "^3.0.2", 1303 | "https-proxy-agent": "^7.0.1", 1304 | "is-stream": "^2.0.0", 1305 | "node-fetch": "^2.6.9", 1306 | "uuid": "^9.0.1" 1307 | }, 1308 | "engines": { 1309 | "node": ">=14" 1310 | } 1311 | }, 1312 | "node_modules/gcp-metadata": { 1313 | "version": "6.1.1", 1314 | "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.1.tgz", 1315 | "integrity": "sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==", 1316 | "license": "Apache-2.0", 1317 | "dependencies": { 1318 | "gaxios": "^6.1.1", 1319 | "google-logging-utils": "^0.0.2", 1320 | "json-bigint": "^1.0.0" 1321 | }, 1322 | "engines": { 1323 | "node": ">=14" 1324 | } 1325 | }, 1326 | "node_modules/glob-parent": { 1327 | "version": "6.0.2", 1328 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 1329 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 1330 | "dev": true, 1331 | "license": "ISC", 1332 | "dependencies": { 1333 | "is-glob": "^4.0.3" 1334 | }, 1335 | "engines": { 1336 | "node": ">=10.13.0" 1337 | } 1338 | }, 1339 | "node_modules/globals": { 1340 | "version": "14.0.0", 1341 | "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", 1342 | "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", 1343 | "dev": true, 1344 | "license": "MIT", 1345 | "engines": { 1346 | "node": ">=18" 1347 | }, 1348 | "funding": { 1349 | "url": "https://github.com/sponsors/sindresorhus" 1350 | } 1351 | }, 1352 | "node_modules/google-auth-library": { 1353 | "version": "9.15.1", 1354 | "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.15.1.tgz", 1355 | "integrity": "sha512-Jb6Z0+nvECVz+2lzSMt9u98UsoakXxA2HGHMCxh+so3n90XgYWkq5dur19JAJV7ONiJY22yBTyJB1TSkvPq9Ng==", 1356 | "license": "Apache-2.0", 1357 | "dependencies": { 1358 | "base64-js": "^1.3.0", 1359 | "ecdsa-sig-formatter": "^1.0.11", 1360 | "gaxios": "^6.1.1", 1361 | "gcp-metadata": "^6.1.0", 1362 | "gtoken": "^7.0.0", 1363 | "jws": "^4.0.0" 1364 | }, 1365 | "engines": { 1366 | "node": ">=14" 1367 | } 1368 | }, 1369 | "node_modules/google-logging-utils": { 1370 | "version": "0.0.2", 1371 | "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-0.0.2.tgz", 1372 | "integrity": "sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==", 1373 | "license": "Apache-2.0", 1374 | "engines": { 1375 | "node": ">=14" 1376 | } 1377 | }, 1378 | "node_modules/graphemer": { 1379 | "version": "1.4.0", 1380 | "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", 1381 | "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", 1382 | "dev": true, 1383 | "license": "MIT" 1384 | }, 1385 | "node_modules/gtoken": { 1386 | "version": "7.1.0", 1387 | "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-7.1.0.tgz", 1388 | "integrity": "sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==", 1389 | "license": "MIT", 1390 | "dependencies": { 1391 | "gaxios": "^6.0.0", 1392 | "jws": "^4.0.0" 1393 | }, 1394 | "engines": { 1395 | "node": ">=14.0.0" 1396 | } 1397 | }, 1398 | "node_modules/has-flag": { 1399 | "version": "4.0.0", 1400 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1401 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 1402 | "dev": true, 1403 | "license": "MIT", 1404 | "engines": { 1405 | "node": ">=8" 1406 | } 1407 | }, 1408 | "node_modules/https-proxy-agent": { 1409 | "version": "7.0.6", 1410 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", 1411 | "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", 1412 | "license": "MIT", 1413 | "dependencies": { 1414 | "agent-base": "^7.1.2", 1415 | "debug": "4" 1416 | }, 1417 | "engines": { 1418 | "node": ">= 14" 1419 | } 1420 | }, 1421 | "node_modules/ignore": { 1422 | "version": "5.3.2", 1423 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", 1424 | "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", 1425 | "dev": true, 1426 | "license": "MIT", 1427 | "engines": { 1428 | "node": ">= 4" 1429 | } 1430 | }, 1431 | "node_modules/import-fresh": { 1432 | "version": "3.3.0", 1433 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 1434 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 1435 | "dev": true, 1436 | "license": "MIT", 1437 | "dependencies": { 1438 | "parent-module": "^1.0.0", 1439 | "resolve-from": "^4.0.0" 1440 | }, 1441 | "engines": { 1442 | "node": ">=6" 1443 | }, 1444 | "funding": { 1445 | "url": "https://github.com/sponsors/sindresorhus" 1446 | } 1447 | }, 1448 | "node_modules/imurmurhash": { 1449 | "version": "0.1.4", 1450 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 1451 | "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", 1452 | "dev": true, 1453 | "license": "MIT", 1454 | "engines": { 1455 | "node": ">=0.8.19" 1456 | } 1457 | }, 1458 | "node_modules/is-extglob": { 1459 | "version": "2.1.1", 1460 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1461 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 1462 | "dev": true, 1463 | "license": "MIT", 1464 | "engines": { 1465 | "node": ">=0.10.0" 1466 | } 1467 | }, 1468 | "node_modules/is-glob": { 1469 | "version": "4.0.3", 1470 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 1471 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1472 | "dev": true, 1473 | "license": "MIT", 1474 | "dependencies": { 1475 | "is-extglob": "^2.1.1" 1476 | }, 1477 | "engines": { 1478 | "node": ">=0.10.0" 1479 | } 1480 | }, 1481 | "node_modules/is-number": { 1482 | "version": "7.0.0", 1483 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1484 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 1485 | "dev": true, 1486 | "license": "MIT", 1487 | "engines": { 1488 | "node": ">=0.12.0" 1489 | } 1490 | }, 1491 | "node_modules/is-stream": { 1492 | "version": "2.0.1", 1493 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", 1494 | "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", 1495 | "license": "MIT", 1496 | "engines": { 1497 | "node": ">=8" 1498 | }, 1499 | "funding": { 1500 | "url": "https://github.com/sponsors/sindresorhus" 1501 | } 1502 | }, 1503 | "node_modules/isexe": { 1504 | "version": "2.0.0", 1505 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1506 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 1507 | "dev": true, 1508 | "license": "ISC" 1509 | }, 1510 | "node_modules/js-yaml": { 1511 | "version": "4.1.0", 1512 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 1513 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 1514 | "dev": true, 1515 | "license": "MIT", 1516 | "dependencies": { 1517 | "argparse": "^2.0.1" 1518 | }, 1519 | "bin": { 1520 | "js-yaml": "bin/js-yaml.js" 1521 | } 1522 | }, 1523 | "node_modules/json-bigint": { 1524 | "version": "1.0.0", 1525 | "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", 1526 | "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", 1527 | "license": "MIT", 1528 | "dependencies": { 1529 | "bignumber.js": "^9.0.0" 1530 | } 1531 | }, 1532 | "node_modules/json-buffer": { 1533 | "version": "3.0.1", 1534 | "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", 1535 | "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", 1536 | "dev": true, 1537 | "license": "MIT" 1538 | }, 1539 | "node_modules/json-schema-traverse": { 1540 | "version": "0.4.1", 1541 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 1542 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 1543 | "dev": true, 1544 | "license": "MIT" 1545 | }, 1546 | "node_modules/json-stable-stringify-without-jsonify": { 1547 | "version": "1.0.1", 1548 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 1549 | "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", 1550 | "dev": true, 1551 | "license": "MIT" 1552 | }, 1553 | "node_modules/jwa": { 1554 | "version": "2.0.0", 1555 | "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", 1556 | "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", 1557 | "license": "MIT", 1558 | "dependencies": { 1559 | "buffer-equal-constant-time": "1.0.1", 1560 | "ecdsa-sig-formatter": "1.0.11", 1561 | "safe-buffer": "^5.0.1" 1562 | } 1563 | }, 1564 | "node_modules/jws": { 1565 | "version": "4.0.0", 1566 | "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", 1567 | "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", 1568 | "license": "MIT", 1569 | "dependencies": { 1570 | "jwa": "^2.0.0", 1571 | "safe-buffer": "^5.0.1" 1572 | } 1573 | }, 1574 | "node_modules/keyv": { 1575 | "version": "4.5.4", 1576 | "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", 1577 | "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", 1578 | "dev": true, 1579 | "license": "MIT", 1580 | "dependencies": { 1581 | "json-buffer": "3.0.1" 1582 | } 1583 | }, 1584 | "node_modules/levn": { 1585 | "version": "0.4.1", 1586 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", 1587 | "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", 1588 | "dev": true, 1589 | "license": "MIT", 1590 | "dependencies": { 1591 | "prelude-ls": "^1.2.1", 1592 | "type-check": "~0.4.0" 1593 | }, 1594 | "engines": { 1595 | "node": ">= 0.8.0" 1596 | } 1597 | }, 1598 | "node_modules/locate-path": { 1599 | "version": "6.0.0", 1600 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 1601 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 1602 | "dev": true, 1603 | "license": "MIT", 1604 | "dependencies": { 1605 | "p-locate": "^5.0.0" 1606 | }, 1607 | "engines": { 1608 | "node": ">=10" 1609 | }, 1610 | "funding": { 1611 | "url": "https://github.com/sponsors/sindresorhus" 1612 | } 1613 | }, 1614 | "node_modules/lodash.merge": { 1615 | "version": "4.6.2", 1616 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 1617 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", 1618 | "dev": true, 1619 | "license": "MIT" 1620 | }, 1621 | "node_modules/make-error": { 1622 | "version": "1.3.6", 1623 | "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", 1624 | "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", 1625 | "dev": true, 1626 | "license": "ISC" 1627 | }, 1628 | "node_modules/merge2": { 1629 | "version": "1.4.1", 1630 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 1631 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 1632 | "dev": true, 1633 | "license": "MIT", 1634 | "engines": { 1635 | "node": ">= 8" 1636 | } 1637 | }, 1638 | "node_modules/micromatch": { 1639 | "version": "4.0.8", 1640 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", 1641 | "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", 1642 | "dev": true, 1643 | "license": "MIT", 1644 | "dependencies": { 1645 | "braces": "^3.0.3", 1646 | "picomatch": "^2.3.1" 1647 | }, 1648 | "engines": { 1649 | "node": ">=8.6" 1650 | } 1651 | }, 1652 | "node_modules/minimatch": { 1653 | "version": "3.1.2", 1654 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1655 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1656 | "dev": true, 1657 | "license": "ISC", 1658 | "dependencies": { 1659 | "brace-expansion": "^1.1.7" 1660 | }, 1661 | "engines": { 1662 | "node": "*" 1663 | } 1664 | }, 1665 | "node_modules/ms": { 1666 | "version": "2.1.3", 1667 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1668 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 1669 | "license": "MIT" 1670 | }, 1671 | "node_modules/natural-compare": { 1672 | "version": "1.4.0", 1673 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 1674 | "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", 1675 | "dev": true, 1676 | "license": "MIT" 1677 | }, 1678 | "node_modules/node-fetch": { 1679 | "version": "2.7.0", 1680 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", 1681 | "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", 1682 | "license": "MIT", 1683 | "dependencies": { 1684 | "whatwg-url": "^5.0.0" 1685 | }, 1686 | "engines": { 1687 | "node": "4.x || >=6.0.0" 1688 | }, 1689 | "peerDependencies": { 1690 | "encoding": "^0.1.0" 1691 | }, 1692 | "peerDependenciesMeta": { 1693 | "encoding": { 1694 | "optional": true 1695 | } 1696 | } 1697 | }, 1698 | "node_modules/npm-check-updates": { 1699 | "version": "17.1.14", 1700 | "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-17.1.14.tgz", 1701 | "integrity": "sha512-dr4bXIxETubLI1tFGeock5hN8yVjahvaVpx+lPO4/O2md3zJuxB7FgH3MIoTvQSCgsgkIRpe0skti01IEAA5tA==", 1702 | "license": "Apache-2.0", 1703 | "bin": { 1704 | "ncu": "build/cli.js", 1705 | "npm-check-updates": "build/cli.js" 1706 | }, 1707 | "engines": { 1708 | "node": "^18.18.0 || >=20.0.0", 1709 | "npm": ">=8.12.1" 1710 | } 1711 | }, 1712 | "node_modules/optionator": { 1713 | "version": "0.9.4", 1714 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", 1715 | "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", 1716 | "dev": true, 1717 | "license": "MIT", 1718 | "dependencies": { 1719 | "deep-is": "^0.1.3", 1720 | "fast-levenshtein": "^2.0.6", 1721 | "levn": "^0.4.1", 1722 | "prelude-ls": "^1.2.1", 1723 | "type-check": "^0.4.0", 1724 | "word-wrap": "^1.2.5" 1725 | }, 1726 | "engines": { 1727 | "node": ">= 0.8.0" 1728 | } 1729 | }, 1730 | "node_modules/p-limit": { 1731 | "version": "3.1.0", 1732 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 1733 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 1734 | "dev": true, 1735 | "license": "MIT", 1736 | "dependencies": { 1737 | "yocto-queue": "^0.1.0" 1738 | }, 1739 | "engines": { 1740 | "node": ">=10" 1741 | }, 1742 | "funding": { 1743 | "url": "https://github.com/sponsors/sindresorhus" 1744 | } 1745 | }, 1746 | "node_modules/p-locate": { 1747 | "version": "5.0.0", 1748 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 1749 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 1750 | "dev": true, 1751 | "license": "MIT", 1752 | "dependencies": { 1753 | "p-limit": "^3.0.2" 1754 | }, 1755 | "engines": { 1756 | "node": ">=10" 1757 | }, 1758 | "funding": { 1759 | "url": "https://github.com/sponsors/sindresorhus" 1760 | } 1761 | }, 1762 | "node_modules/parent-module": { 1763 | "version": "1.0.1", 1764 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 1765 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 1766 | "dev": true, 1767 | "license": "MIT", 1768 | "dependencies": { 1769 | "callsites": "^3.0.0" 1770 | }, 1771 | "engines": { 1772 | "node": ">=6" 1773 | } 1774 | }, 1775 | "node_modules/path-exists": { 1776 | "version": "4.0.0", 1777 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 1778 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 1779 | "dev": true, 1780 | "license": "MIT", 1781 | "engines": { 1782 | "node": ">=8" 1783 | } 1784 | }, 1785 | "node_modules/path-key": { 1786 | "version": "3.1.1", 1787 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 1788 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 1789 | "dev": true, 1790 | "license": "MIT", 1791 | "engines": { 1792 | "node": ">=8" 1793 | } 1794 | }, 1795 | "node_modules/picomatch": { 1796 | "version": "2.3.1", 1797 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 1798 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 1799 | "dev": true, 1800 | "license": "MIT", 1801 | "engines": { 1802 | "node": ">=8.6" 1803 | }, 1804 | "funding": { 1805 | "url": "https://github.com/sponsors/jonschlinkert" 1806 | } 1807 | }, 1808 | "node_modules/prelude-ls": { 1809 | "version": "1.2.1", 1810 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", 1811 | "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", 1812 | "dev": true, 1813 | "license": "MIT", 1814 | "engines": { 1815 | "node": ">= 0.8.0" 1816 | } 1817 | }, 1818 | "node_modules/prettier": { 1819 | "version": "3.4.2", 1820 | "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.2.tgz", 1821 | "integrity": "sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==", 1822 | "dev": true, 1823 | "license": "MIT", 1824 | "bin": { 1825 | "prettier": "bin/prettier.cjs" 1826 | }, 1827 | "engines": { 1828 | "node": ">=14" 1829 | }, 1830 | "funding": { 1831 | "url": "https://github.com/prettier/prettier?sponsor=1" 1832 | } 1833 | }, 1834 | "node_modules/prettier-linter-helpers": { 1835 | "version": "1.0.0", 1836 | "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", 1837 | "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", 1838 | "dev": true, 1839 | "license": "MIT", 1840 | "dependencies": { 1841 | "fast-diff": "^1.1.2" 1842 | }, 1843 | "engines": { 1844 | "node": ">=6.0.0" 1845 | } 1846 | }, 1847 | "node_modules/punycode": { 1848 | "version": "2.3.1", 1849 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", 1850 | "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", 1851 | "dev": true, 1852 | "license": "MIT", 1853 | "engines": { 1854 | "node": ">=6" 1855 | } 1856 | }, 1857 | "node_modules/queue-microtask": { 1858 | "version": "1.2.3", 1859 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 1860 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 1861 | "dev": true, 1862 | "funding": [ 1863 | { 1864 | "type": "github", 1865 | "url": "https://github.com/sponsors/feross" 1866 | }, 1867 | { 1868 | "type": "patreon", 1869 | "url": "https://www.patreon.com/feross" 1870 | }, 1871 | { 1872 | "type": "consulting", 1873 | "url": "https://feross.org/support" 1874 | } 1875 | ], 1876 | "license": "MIT" 1877 | }, 1878 | "node_modules/resolve-from": { 1879 | "version": "4.0.0", 1880 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 1881 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 1882 | "dev": true, 1883 | "license": "MIT", 1884 | "engines": { 1885 | "node": ">=4" 1886 | } 1887 | }, 1888 | "node_modules/reusify": { 1889 | "version": "1.0.4", 1890 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 1891 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 1892 | "dev": true, 1893 | "license": "MIT", 1894 | "engines": { 1895 | "iojs": ">=1.0.0", 1896 | "node": ">=0.10.0" 1897 | } 1898 | }, 1899 | "node_modules/run-parallel": { 1900 | "version": "1.2.0", 1901 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 1902 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 1903 | "dev": true, 1904 | "funding": [ 1905 | { 1906 | "type": "github", 1907 | "url": "https://github.com/sponsors/feross" 1908 | }, 1909 | { 1910 | "type": "patreon", 1911 | "url": "https://www.patreon.com/feross" 1912 | }, 1913 | { 1914 | "type": "consulting", 1915 | "url": "https://feross.org/support" 1916 | } 1917 | ], 1918 | "license": "MIT", 1919 | "dependencies": { 1920 | "queue-microtask": "^1.2.2" 1921 | } 1922 | }, 1923 | "node_modules/safe-buffer": { 1924 | "version": "5.2.1", 1925 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1926 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 1927 | "funding": [ 1928 | { 1929 | "type": "github", 1930 | "url": "https://github.com/sponsors/feross" 1931 | }, 1932 | { 1933 | "type": "patreon", 1934 | "url": "https://www.patreon.com/feross" 1935 | }, 1936 | { 1937 | "type": "consulting", 1938 | "url": "https://feross.org/support" 1939 | } 1940 | ], 1941 | "license": "MIT" 1942 | }, 1943 | "node_modules/semver": { 1944 | "version": "7.7.0", 1945 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.0.tgz", 1946 | "integrity": "sha512-DrfFnPzblFmNrIZzg5RzHegbiRWg7KMR7btwi2yjHwx06zsUbO5g613sVwEV7FTwmzJu+Io0lJe2GJ3LxqpvBQ==", 1947 | "dev": true, 1948 | "license": "ISC", 1949 | "bin": { 1950 | "semver": "bin/semver.js" 1951 | }, 1952 | "engines": { 1953 | "node": ">=10" 1954 | } 1955 | }, 1956 | "node_modules/shebang-command": { 1957 | "version": "2.0.0", 1958 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 1959 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 1960 | "dev": true, 1961 | "license": "MIT", 1962 | "dependencies": { 1963 | "shebang-regex": "^3.0.0" 1964 | }, 1965 | "engines": { 1966 | "node": ">=8" 1967 | } 1968 | }, 1969 | "node_modules/shebang-regex": { 1970 | "version": "3.0.0", 1971 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 1972 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 1973 | "dev": true, 1974 | "license": "MIT", 1975 | "engines": { 1976 | "node": ">=8" 1977 | } 1978 | }, 1979 | "node_modules/strip-json-comments": { 1980 | "version": "3.1.1", 1981 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 1982 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 1983 | "dev": true, 1984 | "license": "MIT", 1985 | "engines": { 1986 | "node": ">=8" 1987 | }, 1988 | "funding": { 1989 | "url": "https://github.com/sponsors/sindresorhus" 1990 | } 1991 | }, 1992 | "node_modules/supports-color": { 1993 | "version": "7.2.0", 1994 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 1995 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 1996 | "dev": true, 1997 | "license": "MIT", 1998 | "dependencies": { 1999 | "has-flag": "^4.0.0" 2000 | }, 2001 | "engines": { 2002 | "node": ">=8" 2003 | } 2004 | }, 2005 | "node_modules/synckit": { 2006 | "version": "0.9.2", 2007 | "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.2.tgz", 2008 | "integrity": "sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==", 2009 | "dev": true, 2010 | "license": "MIT", 2011 | "dependencies": { 2012 | "@pkgr/core": "^0.1.0", 2013 | "tslib": "^2.6.2" 2014 | }, 2015 | "engines": { 2016 | "node": "^14.18.0 || >=16.0.0" 2017 | }, 2018 | "funding": { 2019 | "url": "https://opencollective.com/unts" 2020 | } 2021 | }, 2022 | "node_modules/to-regex-range": { 2023 | "version": "5.0.1", 2024 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 2025 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 2026 | "dev": true, 2027 | "license": "MIT", 2028 | "dependencies": { 2029 | "is-number": "^7.0.0" 2030 | }, 2031 | "engines": { 2032 | "node": ">=8.0" 2033 | } 2034 | }, 2035 | "node_modules/tr46": { 2036 | "version": "0.0.3", 2037 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", 2038 | "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", 2039 | "license": "MIT" 2040 | }, 2041 | "node_modules/ts-api-utils": { 2042 | "version": "2.0.0", 2043 | "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.0.0.tgz", 2044 | "integrity": "sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ==", 2045 | "dev": true, 2046 | "license": "MIT", 2047 | "engines": { 2048 | "node": ">=18.12" 2049 | }, 2050 | "peerDependencies": { 2051 | "typescript": ">=4.8.4" 2052 | } 2053 | }, 2054 | "node_modules/ts-node": { 2055 | "version": "10.9.2", 2056 | "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", 2057 | "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", 2058 | "dev": true, 2059 | "license": "MIT", 2060 | "dependencies": { 2061 | "@cspotcode/source-map-support": "^0.8.0", 2062 | "@tsconfig/node10": "^1.0.7", 2063 | "@tsconfig/node12": "^1.0.7", 2064 | "@tsconfig/node14": "^1.0.0", 2065 | "@tsconfig/node16": "^1.0.2", 2066 | "acorn": "^8.4.1", 2067 | "acorn-walk": "^8.1.1", 2068 | "arg": "^4.1.0", 2069 | "create-require": "^1.1.0", 2070 | "diff": "^4.0.1", 2071 | "make-error": "^1.1.1", 2072 | "v8-compile-cache-lib": "^3.0.1", 2073 | "yn": "3.1.1" 2074 | }, 2075 | "bin": { 2076 | "ts-node": "dist/bin.js", 2077 | "ts-node-cwd": "dist/bin-cwd.js", 2078 | "ts-node-esm": "dist/bin-esm.js", 2079 | "ts-node-script": "dist/bin-script.js", 2080 | "ts-node-transpile-only": "dist/bin-transpile.js", 2081 | "ts-script": "dist/bin-script-deprecated.js" 2082 | }, 2083 | "peerDependencies": { 2084 | "@swc/core": ">=1.2.50", 2085 | "@swc/wasm": ">=1.2.50", 2086 | "@types/node": "*", 2087 | "typescript": ">=2.7" 2088 | }, 2089 | "peerDependenciesMeta": { 2090 | "@swc/core": { 2091 | "optional": true 2092 | }, 2093 | "@swc/wasm": { 2094 | "optional": true 2095 | } 2096 | } 2097 | }, 2098 | "node_modules/tslib": { 2099 | "version": "2.8.1", 2100 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", 2101 | "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", 2102 | "dev": true, 2103 | "license": "0BSD" 2104 | }, 2105 | "node_modules/tunnel": { 2106 | "version": "0.0.6", 2107 | "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", 2108 | "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", 2109 | "license": "MIT", 2110 | "engines": { 2111 | "node": ">=0.6.11 <=0.7.0 || >=0.7.3" 2112 | } 2113 | }, 2114 | "node_modules/type-check": { 2115 | "version": "0.4.0", 2116 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", 2117 | "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", 2118 | "dev": true, 2119 | "license": "MIT", 2120 | "dependencies": { 2121 | "prelude-ls": "^1.2.1" 2122 | }, 2123 | "engines": { 2124 | "node": ">= 0.8.0" 2125 | } 2126 | }, 2127 | "node_modules/typescript": { 2128 | "version": "5.7.3", 2129 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", 2130 | "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", 2131 | "dev": true, 2132 | "license": "Apache-2.0", 2133 | "bin": { 2134 | "tsc": "bin/tsc", 2135 | "tsserver": "bin/tsserver" 2136 | }, 2137 | "engines": { 2138 | "node": ">=14.17" 2139 | } 2140 | }, 2141 | "node_modules/typescript-eslint": { 2142 | "version": "8.22.0", 2143 | "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.22.0.tgz", 2144 | "integrity": "sha512-Y2rj210FW1Wb6TWXzQc5+P+EWI9/zdS57hLEc0gnyuvdzWo8+Y8brKlbj0muejonhMI/xAZCnZZwjbIfv1CkOw==", 2145 | "dev": true, 2146 | "license": "MIT", 2147 | "dependencies": { 2148 | "@typescript-eslint/eslint-plugin": "8.22.0", 2149 | "@typescript-eslint/parser": "8.22.0", 2150 | "@typescript-eslint/utils": "8.22.0" 2151 | }, 2152 | "engines": { 2153 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 2154 | }, 2155 | "funding": { 2156 | "type": "opencollective", 2157 | "url": "https://opencollective.com/typescript-eslint" 2158 | }, 2159 | "peerDependencies": { 2160 | "eslint": "^8.57.0 || ^9.0.0", 2161 | "typescript": ">=4.8.4 <5.8.0" 2162 | } 2163 | }, 2164 | "node_modules/undici": { 2165 | "version": "5.29.0", 2166 | "resolved": "https://registry.npmjs.org/undici/-/undici-5.29.0.tgz", 2167 | "integrity": "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==", 2168 | "license": "MIT", 2169 | "dependencies": { 2170 | "@fastify/busboy": "^2.0.0" 2171 | }, 2172 | "engines": { 2173 | "node": ">=14.0" 2174 | } 2175 | }, 2176 | "node_modules/undici-types": { 2177 | "version": "6.20.0", 2178 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", 2179 | "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", 2180 | "dev": true, 2181 | "license": "MIT" 2182 | }, 2183 | "node_modules/uri-js": { 2184 | "version": "4.4.1", 2185 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 2186 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 2187 | "dev": true, 2188 | "license": "BSD-2-Clause", 2189 | "dependencies": { 2190 | "punycode": "^2.1.0" 2191 | } 2192 | }, 2193 | "node_modules/uuid": { 2194 | "version": "9.0.1", 2195 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", 2196 | "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", 2197 | "funding": [ 2198 | "https://github.com/sponsors/broofa", 2199 | "https://github.com/sponsors/ctavan" 2200 | ], 2201 | "license": "MIT", 2202 | "bin": { 2203 | "uuid": "dist/bin/uuid" 2204 | } 2205 | }, 2206 | "node_modules/v8-compile-cache-lib": { 2207 | "version": "3.0.1", 2208 | "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", 2209 | "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", 2210 | "dev": true, 2211 | "license": "MIT" 2212 | }, 2213 | "node_modules/webidl-conversions": { 2214 | "version": "3.0.1", 2215 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", 2216 | "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", 2217 | "license": "BSD-2-Clause" 2218 | }, 2219 | "node_modules/whatwg-url": { 2220 | "version": "5.0.0", 2221 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", 2222 | "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", 2223 | "license": "MIT", 2224 | "dependencies": { 2225 | "tr46": "~0.0.3", 2226 | "webidl-conversions": "^3.0.0" 2227 | } 2228 | }, 2229 | "node_modules/which": { 2230 | "version": "2.0.2", 2231 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 2232 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 2233 | "dev": true, 2234 | "license": "ISC", 2235 | "dependencies": { 2236 | "isexe": "^2.0.0" 2237 | }, 2238 | "bin": { 2239 | "node-which": "bin/node-which" 2240 | }, 2241 | "engines": { 2242 | "node": ">= 8" 2243 | } 2244 | }, 2245 | "node_modules/word-wrap": { 2246 | "version": "1.2.5", 2247 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", 2248 | "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", 2249 | "dev": true, 2250 | "license": "MIT", 2251 | "engines": { 2252 | "node": ">=0.10.0" 2253 | } 2254 | }, 2255 | "node_modules/yaml": { 2256 | "version": "2.7.0", 2257 | "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz", 2258 | "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==", 2259 | "license": "ISC", 2260 | "bin": { 2261 | "yaml": "bin.mjs" 2262 | }, 2263 | "engines": { 2264 | "node": ">= 14" 2265 | } 2266 | }, 2267 | "node_modules/yn": { 2268 | "version": "3.1.1", 2269 | "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", 2270 | "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", 2271 | "dev": true, 2272 | "license": "MIT", 2273 | "engines": { 2274 | "node": ">=6" 2275 | } 2276 | }, 2277 | "node_modules/yocto-queue": { 2278 | "version": "0.1.0", 2279 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 2280 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 2281 | "dev": true, 2282 | "license": "MIT", 2283 | "engines": { 2284 | "node": ">=10" 2285 | }, 2286 | "funding": { 2287 | "url": "https://github.com/sponsors/sindresorhus" 2288 | } 2289 | } 2290 | } 2291 | } 2292 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "get-secretmanager-secrets", 3 | "version": "2.2.3", 4 | "description": "Get Secret Manager secrets GitHub action", 5 | "main": "dist/index.js", 6 | "scripts": { 7 | "build": "ncc build -m src/main.ts", 8 | "docs": "./node_modules/.bin/actions-gen-readme", 9 | "lint": "eslint .", 10 | "format": "eslint . --fix", 11 | "test": "bash ./bin/runTests.sh" 12 | }, 13 | "repository": { 14 | "type": "git", 15 | "url": "https://github.com/google-github-actions/get-secretmanager-secrets" 16 | }, 17 | "keywords": [ 18 | "actions", 19 | "google cloud", 20 | "secret manager", 21 | "setup" 22 | ], 23 | "author": "GoogleCloudPlatform", 24 | "license": "Apache-2.0", 25 | "dependencies": { 26 | "@actions/core": "^1.11.1", 27 | "@actions/http-client": "^2.2.3", 28 | "@google-github-actions/actions-utils": "^0.8.6", 29 | "google-auth-library": "^9.15.1", 30 | "npm-check-updates": "^17.1.14" 31 | }, 32 | "devDependencies": { 33 | "@eslint/eslintrc": "^3.2.0", 34 | "@eslint/js": "^9.19.0", 35 | "@types/node": "^22.13.0", 36 | "@typescript-eslint/eslint-plugin": "^8.22.0", 37 | "@typescript-eslint/parser": "^8.22.0", 38 | "@vercel/ncc": "^0.38.3", 39 | "eslint": "^9.19.0", 40 | "eslint-config-prettier": "^10.0.1", 41 | "eslint-plugin-prettier": "^5.2.3", 42 | "prettier": "^3.4.2", 43 | "ts-node": "^10.9.2", 44 | "typescript": "^5.7.3", 45 | "typescript-eslint": "^8.22.0" 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /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 | "target": "es6", 19 | "module": "commonjs", 20 | "lib": [ 21 | "es6" 22 | ], 23 | "outDir": "./dist", 24 | "rootDir": "./src", 25 | "strict": true, 26 | "noImplicitAny": true, 27 | "esModuleInterop": true 28 | }, 29 | "exclude": ["node_modules", "**/*.test.ts"] 30 | } 31 | --------------------------------------------------------------------------------