├── .gitattributes ├── .github ├── renovate.json5 └── workflows │ ├── e2e-docker.yaml │ ├── e2e-kaniko.yaml │ ├── release.yaml │ ├── reusable--docker-build.yaml │ └── ts.yaml ├── .gitignore ├── .prettierignore ├── .prettierrc.json ├── LICENSE ├── README.md ├── action.yaml ├── eslint.config.js ├── package.json ├── pnpm-lock.yaml ├── src ├── main.ts └── run.ts ├── tests ├── fixtures │ └── Dockerfile └── run.test.ts ├── tsconfig.json └── vitest.config.ts /.gitattributes: -------------------------------------------------------------------------------- 1 | dist/** -diff linguist-generated=true -------------------------------------------------------------------------------- /.github/renovate.json5: -------------------------------------------------------------------------------- 1 | { 2 | "extends": [ 3 | "github>int128/renovate-base", 4 | "github>int128/typescript-action-renovate-config", 5 | "helpers:pinGitHubActionDigests", 6 | ] 7 | } 8 | -------------------------------------------------------------------------------- /.github/workflows/e2e-docker.yaml: -------------------------------------------------------------------------------- 1 | name: e2e-docker 2 | 3 | on: 4 | pull_request: 5 | paths: 6 | - src/** 7 | - tests/** 8 | - '*.json' 9 | - '*.yaml' 10 | - .github/workflows/e2e-docker.yaml 11 | push: 12 | branches: 13 | - main 14 | tags: 15 | - v* 16 | paths: 17 | - src/** 18 | - tests/** 19 | - '*.json' 20 | - '*.yaml' 21 | - .github/workflows/e2e-docker.yaml 22 | 23 | jobs: 24 | build-linux-amd64: 25 | uses: ./.github/workflows/reusable--docker-build.yaml 26 | with: 27 | images: ghcr.io/${{ github.repository }}/e2e 28 | cache-image: ghcr.io/${{ github.repository }}/e2e/cache 29 | context: tests/fixtures 30 | platforms: linux/amd64 31 | 32 | build-linux-arm64: 33 | uses: ./.github/workflows/reusable--docker-build.yaml 34 | with: 35 | images: ghcr.io/${{ github.repository }}/e2e 36 | cache-image: ghcr.io/${{ github.repository }}/e2e/cache 37 | context: tests/fixtures 38 | platforms: linux/arm64 39 | 40 | build: 41 | needs: 42 | - build-linux-amd64 43 | - build-linux-arm64 44 | runs-on: ubuntu-latest 45 | timeout-minutes: 10 46 | outputs: 47 | image-uri: ghcr.io/${{ github.repository }}/e2e@${{ steps.build.outputs.digest }} 48 | steps: 49 | # build the action 50 | - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 51 | - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 52 | with: 53 | node-version: 20 54 | - run: npm install -g pnpm@latest-10 55 | - run: pnpm i 56 | - run: pnpm build 57 | 58 | # run the action 59 | - uses: docker/setup-buildx-action@b5ca514318bd6ebac0fb2aedd5d36ec1b5c232a2 # v3.10.0 60 | - uses: docker/metadata-action@902fa8ec7d6ecbf8d84d538b9b233a880e428804 # v5.7.0 61 | id: metadata 62 | with: 63 | images: ghcr.io/${{ github.repository }}/e2e 64 | - name: docker-manifest-create-action (dry-run) 65 | uses: ./ 66 | with: 67 | push: false 68 | index-annotations: ${{ steps.metadata.outputs.labels }} 69 | sources: | 70 | ${{ needs.build-linux-amd64.outputs.image-uri }} 71 | ${{ needs.build-linux-arm64.outputs.image-uri }} 72 | 73 | - uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3.4.0 74 | with: 75 | registry: ghcr.io 76 | username: ${{ github.actor }} 77 | password: ${{ secrets.GITHUB_TOKEN }} 78 | - name: docker-manifest-create-action 79 | id: build 80 | uses: ./ 81 | with: 82 | index-annotations: ${{ steps.metadata.outputs.labels }} 83 | tags: ${{ steps.metadata.outputs.tags }} 84 | sources: | 85 | ${{ needs.build-linux-amd64.outputs.image-uri }} 86 | ${{ needs.build-linux-arm64.outputs.image-uri }} 87 | 88 | test-image: 89 | needs: build 90 | runs-on: ubuntu-latest 91 | timeout-minutes: 10 92 | steps: 93 | - uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3.4.0 94 | with: 95 | registry: ghcr.io 96 | username: ${{ github.actor }} 97 | password: ${{ secrets.GITHUB_TOKEN }} 98 | - run: docker run --rm '${{ needs.build.outputs.image-uri }}' 99 | -------------------------------------------------------------------------------- /.github/workflows/e2e-kaniko.yaml: -------------------------------------------------------------------------------- 1 | name: e2e-kaniko 2 | 3 | on: 4 | pull_request: 5 | paths: 6 | - src/** 7 | - tests/** 8 | - '*.json' 9 | - '*.yaml' 10 | - .github/workflows/e2e-kaniko.yaml 11 | push: 12 | branches: 13 | - main 14 | tags: 15 | - v* 16 | paths: 17 | - src/** 18 | - tests/** 19 | - '*.json' 20 | - '*.yaml' 21 | - .github/workflows/e2e-kaniko.yaml 22 | 23 | jobs: 24 | build-linux-amd64: 25 | runs-on: ubuntu-latest 26 | timeout-minutes: 10 27 | outputs: 28 | image-uri: ghcr.io/${{ github.repository }}/e2e@${{ steps.build.outputs.digest }} 29 | steps: 30 | - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 31 | - uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3.4.0 32 | with: 33 | registry: ghcr.io 34 | username: ${{ github.actor }} 35 | password: ${{ secrets.GITHUB_TOKEN }} 36 | - uses: docker/metadata-action@902fa8ec7d6ecbf8d84d538b9b233a880e428804 # v5.7.0 37 | id: metadata 38 | with: 39 | images: ghcr.io/${{ github.repository }}/e2e 40 | # avoid overwriting the latest tag because metadata-action does not add a suffix to it 41 | flavor: latest=false,suffix=-kaniko-amd64 42 | - uses: int128/kaniko-action@c865fbdd16c152dd2d003d74af68cd9dd7aa94cf # v1.50.0 43 | id: build 44 | with: 45 | push: true 46 | context: tests/fixtures 47 | tags: ${{ steps.metadata.outputs.tags }} 48 | labels: ${{ steps.metadata.outputs.labels }} 49 | 50 | build: 51 | needs: 52 | - build-linux-amd64 53 | runs-on: ubuntu-latest 54 | timeout-minutes: 10 55 | outputs: 56 | image-uri: ghcr.io/${{ github.repository }}/e2e@${{ steps.build.outputs.digest }} 57 | steps: 58 | # build the action 59 | - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 60 | - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 61 | with: 62 | node-version: 20 63 | - run: npm install -g pnpm@latest-10 64 | - run: pnpm i 65 | - run: pnpm build 66 | 67 | # run the action 68 | - uses: docker/setup-buildx-action@b5ca514318bd6ebac0fb2aedd5d36ec1b5c232a2 # v3.10.0 69 | - uses: docker/metadata-action@902fa8ec7d6ecbf8d84d538b9b233a880e428804 # v5.7.0 70 | id: metadata 71 | with: 72 | images: ghcr.io/${{ github.repository }}/e2e 73 | flavor: latest=false,suffix=-kaniko 74 | - name: docker-manifest-create-action (dry-run) 75 | uses: ./ 76 | with: 77 | push: false 78 | index-annotations: ${{ steps.metadata.outputs.labels }} 79 | sources: | 80 | ${{ needs.build-linux-amd64.outputs.image-uri }} 81 | 82 | - uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3.4.0 83 | with: 84 | registry: ghcr.io 85 | username: ${{ github.actor }} 86 | password: ${{ secrets.GITHUB_TOKEN }} 87 | - name: docker-manifest-create-action@v2 88 | id: build 89 | uses: ./ 90 | with: 91 | index-annotations: ${{ steps.metadata.outputs.labels }} 92 | tags: ${{ steps.metadata.outputs.tags }} 93 | sources: | 94 | ${{ needs.build-linux-amd64.outputs.image-uri }} 95 | 96 | test-image: 97 | needs: build 98 | runs-on: ubuntu-latest 99 | timeout-minutes: 10 100 | steps: 101 | - uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3.4.0 102 | with: 103 | registry: ghcr.io 104 | username: ${{ github.actor }} 105 | password: ${{ secrets.GITHUB_TOKEN }} 106 | - run: docker run --rm '${{ needs.build.outputs.image-uri }}' 107 | -------------------------------------------------------------------------------- /.github/workflows/release.yaml: -------------------------------------------------------------------------------- 1 | name: release 2 | 3 | on: 4 | pull_request: 5 | paths: 6 | - .github/workflows/release.yaml 7 | push: 8 | branches: 9 | - main 10 | tags: 11 | - v* 12 | 13 | jobs: 14 | tag: 15 | runs-on: ubuntu-latest 16 | timeout-minutes: 10 17 | steps: 18 | - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 19 | - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 20 | with: 21 | node-version: 20 22 | - run: npm install -g pnpm@latest-10 23 | - run: pnpm i 24 | - run: pnpm build 25 | - uses: int128/release-typescript-action@4b93cf2f4b55fbce962db4c9acb89760c4a699d9 # v1.36.0 26 | with: 27 | major-version: 2 28 | -------------------------------------------------------------------------------- /.github/workflows/reusable--docker-build.yaml: -------------------------------------------------------------------------------- 1 | name: docker-build 2 | 3 | on: 4 | workflow_call: 5 | inputs: 6 | images: 7 | description: Passed to docker/metadata-action 8 | type: string 9 | required: true 10 | cache-image: 11 | description: Passed to int128/docker-build-cache-config-action 12 | type: string 13 | required: true 14 | context: 15 | description: Passed to docker/build-push-action 16 | type: string 17 | required: true 18 | platforms: 19 | description: Passed to docker/build-push-action 20 | type: string 21 | required: true 22 | outputs: 23 | image-uri: 24 | description: Image URI 25 | value: ${{ jobs.build.outputs.image-uri }} 26 | 27 | jobs: 28 | build: 29 | runs-on: ubuntu-latest 30 | timeout-minutes: 10 31 | outputs: 32 | image-uri: ghcr.io/${{ github.repository }}/e2e@${{ steps.build.outputs.digest }} 33 | steps: 34 | - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 35 | - uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3.4.0 36 | with: 37 | registry: ghcr.io 38 | username: ${{ github.actor }} 39 | password: ${{ secrets.GITHUB_TOKEN }} 40 | - uses: docker/metadata-action@902fa8ec7d6ecbf8d84d538b9b233a880e428804 # v5.7.0 41 | id: metadata 42 | with: 43 | images: ${{ inputs.images }} 44 | # avoid overwriting the latest tag because metadata-action does not add a suffix to it 45 | flavor: latest=false,suffix=-amd64 46 | - uses: int128/docker-build-cache-config-action@0b4582921757b6145fd7fab8156c725b28e1c2b8 # v1.31.0 47 | id: cache 48 | with: 49 | image: ${{ inputs.cache-image }} 50 | - uses: docker/setup-buildx-action@b5ca514318bd6ebac0fb2aedd5d36ec1b5c232a2 # v3.10.0 51 | - uses: docker/build-push-action@5cd11c3a4ced054e52742c5fd54dca954e0edd85 # v6.7.0 52 | id: build 53 | with: 54 | push: true 55 | context: ${{ inputs.context }} 56 | tags: ${{ steps.metadata.outputs.tags }} 57 | labels: ${{ steps.metadata.outputs.labels }} 58 | cache-from: ${{ steps.cache.outputs.cache-from }} 59 | cache-to: ${{ steps.cache.outputs.cache-to }} 60 | platforms: ${{ inputs.platforms }} 61 | -------------------------------------------------------------------------------- /.github/workflows/ts.yaml: -------------------------------------------------------------------------------- 1 | name: ts 2 | 3 | on: 4 | pull_request: 5 | paths: 6 | - src/** 7 | - tests/** 8 | - '*.json' 9 | - '*.yaml' 10 | - .github/workflows/ts.yaml 11 | push: 12 | branches: 13 | - main 14 | paths: 15 | - src/** 16 | - tests/** 17 | - '*.json' 18 | - '*.yaml' 19 | - .github/workflows/ts.yaml 20 | 21 | jobs: 22 | test: 23 | runs-on: ubuntu-latest 24 | timeout-minutes: 10 25 | steps: 26 | - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 27 | - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 28 | with: 29 | node-version: 20 30 | - run: npm install -g pnpm@latest-10 31 | - run: pnpm i 32 | - run: pnpm test 33 | - run: pnpm build 34 | 35 | generate: 36 | runs-on: ubuntu-latest 37 | timeout-minutes: 10 38 | steps: 39 | - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 40 | - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 41 | with: 42 | node-version: 20 43 | - run: npm install -g pnpm@latest-10 44 | - run: pnpm i 45 | - run: pnpm lint --fix 46 | - run: pnpm format 47 | - uses: int128/update-generated-files-action@f6dc44e35ce252932e9018f1c38d1e2a4ff80e14 # v2.60.0 48 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Dependency directory 2 | node_modules 3 | 4 | # Rest pulled from https://github.com/github/gitignore/blob/master/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 | # nyc test coverage 30 | .nyc_output 31 | 32 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 33 | .grunt 34 | 35 | # Bower dependency directory (https://bower.io/) 36 | bower_components 37 | 38 | # node-waf configuration 39 | .lock-wscript 40 | 41 | # Compiled binary addons (https://nodejs.org/api/addons.html) 42 | build/Release 43 | 44 | # Dependency directories 45 | jspm_packages/ 46 | 47 | # TypeScript v1 declaration files 48 | typings/ 49 | 50 | # TypeScript cache 51 | *.tsbuildinfo 52 | 53 | # Optional npm cache directory 54 | .npm 55 | 56 | # Optional eslint cache 57 | .eslintcache 58 | 59 | # Optional REPL history 60 | .node_repl_history 61 | 62 | # Output of 'npm pack' 63 | *.tgz 64 | 65 | # Yarn Integrity file 66 | .yarn-integrity 67 | 68 | # dotenv environment variables file 69 | .env 70 | .env.test 71 | 72 | # parcel-bundler cache (https://parceljs.org/) 73 | .cache 74 | 75 | # next.js build output 76 | .next 77 | 78 | # nuxt.js build output 79 | .nuxt 80 | 81 | # vuepress build output 82 | .vuepress/dist 83 | 84 | # Serverless directories 85 | .serverless/ 86 | 87 | # FuseBox cache 88 | .fusebox/ 89 | 90 | # DynamoDB Local files 91 | .dynamodb/ 92 | 93 | # OS metadata 94 | .DS_Store 95 | Thumbs.db 96 | 97 | # Ignore built ts files 98 | lib/ 99 | 100 | # Only release tag contains dist directory 101 | /dist 102 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | dist/ 2 | lib/ 3 | node_modules/ -------------------------------------------------------------------------------- /.prettierrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "printWidth": 120, 3 | "semi": false, 4 | "singleQuote": true 5 | } 6 | -------------------------------------------------------------------------------- /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 | # docker-manifest-create-action [![ts](https://github.com/int128/docker-manifest-create-action/actions/workflows/ts.yaml/badge.svg)](https://github.com/int128/docker-manifest-create-action/actions/workflows/ts.yaml) 2 | 3 | This is an action to create a multi-architectures container image in GitHub Actions. 4 | It is interoperable with [docker/metadata-action](https://github.com/docker/metadata-action). 5 | 6 | ## Migration from V1 to V2 7 | 8 | This action no longer supports the `suffixes` input. 9 | You need to set an image URI with a digest or tag. 10 | If you use docker/build-push-action, you can construct an image URI from the outputs as follows: 11 | 12 | ```yaml 13 | - uses: docker/build-push-action@v5 14 | id: build-amd64 15 | with: # ...omit... 16 | - uses: docker/build-push-action@v5 17 | id: build-arm64 18 | with: # ...omit... 19 | 20 | - uses: int128/docker-manifest-create-action@v2 21 | with: 22 | tags: ghcr.io/${{ github.repository }}:main 23 | sources: | 24 | ghcr.io/${{ github.repository }}@${{ steps.build-amd64.outputs.digest }} 25 | ghcr.io/${{ github.repository }}@${{ steps.build-arm64.outputs.digest }} 26 | ``` 27 | 28 | ## Getting Started 29 | 30 | When we build a multi-architectures image using [docker/build-push-action](https://github.com/docker/build-push-action), it takes a long time to build all platforms in a single job. 31 | It would be nice to build images in parallel and finally create a multi-architectures image from them. 32 | 33 | ```mermaid 34 | graph LR 35 | m[Image REGISTRY/REPOSITORY:TAG] 36 | amd64[Image REGISTRY/REPOSITORY:TAG-linux-amd64] --> m 37 | arm64[Image REGISTRY/REPOSITORY:TAG-linux-arm64] --> m 38 | ppc64le[Image REGISTRY/REPOSITORY:TAG-linux-ppc64le] --> m 39 | ``` 40 | 41 | We can create a multi-architectures image by the below commands. 42 | 43 | ```sh 44 | # push a manifest of multi-architecture image 45 | docker buildx imagetools create -t REGISTRY/REPOSITORY:TAG \ 46 | REGISTRY/REPOSITORY:TAG-linux-amd64 \ 47 | REGISTRY/REPOSITORY:TAG-linux-arm64 \ 48 | REGISTRY/REPOSITORY:TAG-linux-ppc64le 49 | 50 | # verify the manifest 51 | docker buildx imagetools inspect REGISTRY/REPOSITORY:TAG 52 | ``` 53 | 54 | This action runs the above commands for each tag. 55 | 56 | ```yaml 57 | - uses: int128/docker-manifest-create-action@v2 58 | with: 59 | tags: | 60 | REGISTRY/REPOSITORY:TAG 61 | sources: | 62 | REGISTRY/REPOSITORY:TAG-linux-amd64 63 | REGISTRY/REPOSITORY:TAG-linux-arm64 64 | REGISTRY/REPOSITORY:TAG-linux-ppc64le 65 | ``` 66 | 67 | See also the following docs: 68 | 69 | - [`docker buildx imagetools create`](https://docs.docker.com/engine/reference/commandline/buildx_imagetools_create/) 70 | - [Create and push a manifest list](https://docs.docker.com/engine/reference/commandline/manifest/#create-and-push-a-manifest-list) (Docker) 71 | - [Pushing a multi-architecture image](https://docs.aws.amazon.com/AmazonECR/latest/userguide/docker-push-multi-architecture-image.html) (Amazon ECR) 72 | 73 | ## Examples 74 | 75 | ### Basic usage 76 | 77 | Here is an example workflow to build a multi-architectures image for `linux/amd64` and `linux/arm64`. 78 | 79 | ```yaml 80 | jobs: 81 | build-linux-amd64: 82 | uses: ./.github/workflows/reusable--docker-build.yaml 83 | with: 84 | images: ghcr.io/${{ github.repository }} 85 | platforms: linux/amd64 86 | 87 | build-linux-arm64: 88 | uses: ./.github/workflows/reusable--docker-build.yaml 89 | with: 90 | images: ghcr.io/${{ github.repository }} 91 | platforms: linux/arm64 92 | 93 | build: 94 | needs: 95 | - build-linux-amd64 96 | - build-linux-arm64 97 | runs-on: ubuntu-latest 98 | timeout-minutes: 10 99 | outputs: 100 | image-uri: ghcr.io/${{ github.repository }}@${{ steps.build.outputs.digest }} 101 | steps: 102 | - uses: docker/login-action@v3 103 | with: 104 | registry: ghcr.io 105 | username: ${{ github.actor }} 106 | password: ${{ secrets.GITHUB_TOKEN }} 107 | - uses: docker/metadata-action@v5 108 | id: metadata 109 | with: 110 | images: ghcr.io/${{ github.repository }} 111 | - uses: int128/docker-manifest-create-action@v2 112 | id: build 113 | with: 114 | index-annotations: ${{ steps.metadata.outputs.labels }} 115 | tags: ${{ steps.metadata.outputs.tags }} 116 | sources: | 117 | ghcr.io/${{ github.repository }}@${{ needs.build-linux-amd64.outputs.digest }} 118 | ghcr.io/${{ github.repository }}@${{ needs.build-linux-arm64.outputs.digest }} 119 | ``` 120 | 121 | Here is the diagram of this workflow. 122 | 123 | ```mermaid 124 | graph TB 125 | subgraph Workflow 126 | build-linux-amd64 --> build 127 | build-linux-arm64 --> build 128 | end 129 | ``` 130 | 131 | For details, see the following workflows: 132 | 133 | - [`.github/workflows/e2e-docker.yaml`](.github/workflows/e2e-docker.yaml) 134 | - [`.github/workflows/reusable--docker-build.yaml`](.github/workflows/reusable--docker-build.yaml) 135 | - [`.github/workflows/e2e-kaniko.yaml`](.github/workflows/e2e-kaniko.yaml) 136 | 137 | ### Native build on the self-hosted runners 138 | 139 | If you are using the self-hosted runners, you can build an image faster. 140 | For example, you can natively build an `arm64` image on AWS Graviton 2. 141 | 142 | Here is an example workflow. 143 | 144 | ```yaml 145 | jobs: 146 | build-linux-amd64: 147 | uses: ./.github/workflows/reusable--docker-build.yaml 148 | with: 149 | runs-on: self-hosted-amd64 150 | 151 | build-linux-arm64: 152 | uses: ./.github/workflows/reusable--docker-build.yaml 153 | with: 154 | runs-on: self-hosted-arm64 155 | 156 | build: 157 | needs: 158 | - build-linux-amd64 159 | - build-linux-arm64 160 | runs-on: ubuntu-latest 161 | timeout-minutes: 10 162 | permissions: 163 | contents: read 164 | id-token: write 165 | outputs: 166 | image-uri: ${{ steps.ecr.outputs.registry }}/${{ github.repository }}@${{ steps.build.outputs.digest }} 167 | steps: 168 | - uses: aws-actions/configure-aws-credentials@v3 169 | with: 170 | role-to-assume: arn:aws:iam::ACCOUNT:role/ROLE 171 | - uses: aws-actions/amazon-ecr-login@v3 172 | id: ecr 173 | - uses: docker/metadata-action@v5 174 | id: metadata 175 | with: 176 | images: ${{ steps.ecr.outputs.registry }}/${{ github.repository }} 177 | - uses: int128/docker-manifest-create-action@v2 178 | id: build 179 | with: 180 | index-annotations: ${{ steps.metadata.outputs.labels }} 181 | tags: ${{ steps.metadata.outputs.tags }} 182 | sources: | 183 | ${{ steps.ecr.outputs.registry }}/${{ github.repository }}@${{ needs.build-linux-amd64.outputs.digest }} 184 | ${{ steps.ecr.outputs.registry }}/${{ github.repository }}@${{ needs.build-linux-arm64.outputs.digest }} 185 | ``` 186 | 187 | ## Specification 188 | 189 | This action requires Docker Buildx. 190 | 191 | ### Inputs 192 | 193 | | Name | Default | Description | 194 | | ------------------- | ---------------------------- | ------------------------------------------------------ | 195 | | `push` | `true` | Push the manifest to the registry | 196 | | `index-annotations` | - | Add annotations to the image index (multi-line string) | 197 | | `tags` | (required if `push` is true) | Tags of the destination images (multi-line string) | 198 | | `sources` | (required) | Image URIs of the sources (multi-line string) | 199 | 200 | If `push` is false, this action runs `docker buildx imagetools create --dry-run`. 201 | 202 | If `index-annotations` is set, this action adds `--annotation`. 203 | See https://docs.docker.com/engine/reference/commandline/buildx_imagetools_create/#annotation for details. 204 | 205 | ### Outputs 206 | 207 | | Name | Description | 208 | | -------- | ------------------------------ | 209 | | `digest` | Digest of the created manifest | 210 | -------------------------------------------------------------------------------- /action.yaml: -------------------------------------------------------------------------------- 1 | name: docker-manifest-create-action 2 | description: Create a multi-architecture Docker image in GitHub Actions 3 | 4 | inputs: 5 | push: 6 | description: Push the manifest to the registry 7 | required: false 8 | default: 'true' 9 | index-annotations: 10 | description: Add annotations to the image index (multi-line string) 11 | required: false 12 | tags: 13 | description: Tags of the destination images (multi-line string) 14 | required: false 15 | sources: 16 | description: Image URIs of the sources (multi-line string) 17 | required: true 18 | 19 | outputs: 20 | digest: 21 | description: Digest of the created manifest 22 | 23 | runs: 24 | using: 'node20' 25 | main: 'dist/index.js' 26 | -------------------------------------------------------------------------------- /eslint.config.js: -------------------------------------------------------------------------------- 1 | // @ts-check 2 | 3 | import eslint from '@eslint/js' 4 | import vitest from '@vitest/eslint-plugin' 5 | import tseslint from 'typescript-eslint' 6 | 7 | export default tseslint.config( 8 | { 9 | ignores: ['.git/', 'node_modules/', 'dist/', '*.config.*'], 10 | }, 11 | eslint.configs.recommended, 12 | ...tseslint.configs.recommendedTypeChecked, 13 | vitest.configs.recommended, 14 | { 15 | languageOptions: { 16 | parserOptions: { 17 | project: true, 18 | }, 19 | }, 20 | }, 21 | ) 22 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "scripts": { 4 | "format": "prettier --write **/*.ts", 5 | "lint": "eslint .", 6 | "build": "ncc build --source-map --license licenses.txt src/main.ts", 7 | "test": "vitest" 8 | }, 9 | "type": "module", 10 | "dependencies": { 11 | "@actions/core": "1.11.1", 12 | "@actions/exec": "1.1.1" 13 | }, 14 | "devDependencies": { 15 | "@eslint/js": "9.28.0", 16 | "@tsconfig/node20": "20.1.5", 17 | "@types/node": "20.19.0", 18 | "@vercel/ncc": "0.38.3", 19 | "@vitest/eslint-plugin": "1.2.1", 20 | "eslint": "9.28.0", 21 | "pnpm": "10.12.1", 22 | "prettier": "3.5.3", 23 | "typescript": "5.8.3", 24 | "typescript-eslint": "8.33.1", 25 | "vitest": "3.2.3" 26 | }, 27 | "packageManager": "pnpm@10.12.1" 28 | } 29 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | dependencies: 11 | '@actions/core': 12 | specifier: 1.11.1 13 | version: 1.11.1 14 | '@actions/exec': 15 | specifier: 1.1.1 16 | version: 1.1.1 17 | devDependencies: 18 | '@eslint/js': 19 | specifier: 9.28.0 20 | version: 9.28.0 21 | '@tsconfig/node20': 22 | specifier: 20.1.5 23 | version: 20.1.5 24 | '@types/node': 25 | specifier: 20.19.0 26 | version: 20.19.0 27 | '@vercel/ncc': 28 | specifier: 0.38.3 29 | version: 0.38.3 30 | '@vitest/eslint-plugin': 31 | specifier: 1.2.1 32 | version: 1.2.1(eslint@9.28.0)(typescript@5.8.3)(vitest@3.2.3(@types/node@20.19.0)) 33 | eslint: 34 | specifier: 9.28.0 35 | version: 9.28.0 36 | pnpm: 37 | specifier: 10.12.1 38 | version: 10.12.1 39 | prettier: 40 | specifier: 3.5.3 41 | version: 3.5.3 42 | typescript: 43 | specifier: 5.8.3 44 | version: 5.8.3 45 | typescript-eslint: 46 | specifier: 8.33.1 47 | version: 8.33.1(eslint@9.28.0)(typescript@5.8.3) 48 | vitest: 49 | specifier: 3.2.3 50 | version: 3.2.3(@types/node@20.19.0) 51 | 52 | packages: 53 | 54 | '@aashutoshrathi/word-wrap@1.2.6': 55 | resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} 56 | engines: {node: '>=0.10.0'} 57 | 58 | '@actions/core@1.11.1': 59 | resolution: {integrity: sha512-hXJCSrkwfA46Vd9Z3q4cpEpHB1rL5NG04+/rbqW9d3+CSvtB1tYe8UTpAlixa1vj0m/ULglfEK2UKxMGxCxv5A==} 60 | 61 | '@actions/exec@1.1.1': 62 | resolution: {integrity: sha512-+sCcHHbVdk93a0XT19ECtO/gIXoxvdsgQLzb2fE2/5sIZmWQuluYyjPQtrtTHdU1YzTZ7bAPN4sITq2xi1679w==} 63 | 64 | '@actions/http-client@2.2.0': 65 | resolution: {integrity: sha512-q+epW0trjVUUHboliPb4UF9g2msf+w61b32tAkFEwL/IwP0DQWgbCMM0Hbe3e3WXSKz5VcUXbzJQgy8Hkra/Lg==} 66 | 67 | '@actions/io@1.1.3': 68 | resolution: {integrity: sha512-wi9JjgKLYS7U/z8PPbco+PvTb/nRWjeoFlJ1Qer83k/3C5PHQi28hiVdeE2kHXmIL99mQFawx8qt/JPjZilJ8Q==} 69 | 70 | '@esbuild/aix-ppc64@0.25.5': 71 | resolution: {integrity: sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==} 72 | engines: {node: '>=18'} 73 | cpu: [ppc64] 74 | os: [aix] 75 | 76 | '@esbuild/android-arm64@0.25.5': 77 | resolution: {integrity: sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==} 78 | engines: {node: '>=18'} 79 | cpu: [arm64] 80 | os: [android] 81 | 82 | '@esbuild/android-arm@0.25.5': 83 | resolution: {integrity: sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==} 84 | engines: {node: '>=18'} 85 | cpu: [arm] 86 | os: [android] 87 | 88 | '@esbuild/android-x64@0.25.5': 89 | resolution: {integrity: sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==} 90 | engines: {node: '>=18'} 91 | cpu: [x64] 92 | os: [android] 93 | 94 | '@esbuild/darwin-arm64@0.25.5': 95 | resolution: {integrity: sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==} 96 | engines: {node: '>=18'} 97 | cpu: [arm64] 98 | os: [darwin] 99 | 100 | '@esbuild/darwin-x64@0.25.5': 101 | resolution: {integrity: sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==} 102 | engines: {node: '>=18'} 103 | cpu: [x64] 104 | os: [darwin] 105 | 106 | '@esbuild/freebsd-arm64@0.25.5': 107 | resolution: {integrity: sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==} 108 | engines: {node: '>=18'} 109 | cpu: [arm64] 110 | os: [freebsd] 111 | 112 | '@esbuild/freebsd-x64@0.25.5': 113 | resolution: {integrity: sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==} 114 | engines: {node: '>=18'} 115 | cpu: [x64] 116 | os: [freebsd] 117 | 118 | '@esbuild/linux-arm64@0.25.5': 119 | resolution: {integrity: sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==} 120 | engines: {node: '>=18'} 121 | cpu: [arm64] 122 | os: [linux] 123 | 124 | '@esbuild/linux-arm@0.25.5': 125 | resolution: {integrity: sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==} 126 | engines: {node: '>=18'} 127 | cpu: [arm] 128 | os: [linux] 129 | 130 | '@esbuild/linux-ia32@0.25.5': 131 | resolution: {integrity: sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==} 132 | engines: {node: '>=18'} 133 | cpu: [ia32] 134 | os: [linux] 135 | 136 | '@esbuild/linux-loong64@0.25.5': 137 | resolution: {integrity: sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==} 138 | engines: {node: '>=18'} 139 | cpu: [loong64] 140 | os: [linux] 141 | 142 | '@esbuild/linux-mips64el@0.25.5': 143 | resolution: {integrity: sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==} 144 | engines: {node: '>=18'} 145 | cpu: [mips64el] 146 | os: [linux] 147 | 148 | '@esbuild/linux-ppc64@0.25.5': 149 | resolution: {integrity: sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==} 150 | engines: {node: '>=18'} 151 | cpu: [ppc64] 152 | os: [linux] 153 | 154 | '@esbuild/linux-riscv64@0.25.5': 155 | resolution: {integrity: sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==} 156 | engines: {node: '>=18'} 157 | cpu: [riscv64] 158 | os: [linux] 159 | 160 | '@esbuild/linux-s390x@0.25.5': 161 | resolution: {integrity: sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==} 162 | engines: {node: '>=18'} 163 | cpu: [s390x] 164 | os: [linux] 165 | 166 | '@esbuild/linux-x64@0.25.5': 167 | resolution: {integrity: sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==} 168 | engines: {node: '>=18'} 169 | cpu: [x64] 170 | os: [linux] 171 | 172 | '@esbuild/netbsd-arm64@0.25.5': 173 | resolution: {integrity: sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==} 174 | engines: {node: '>=18'} 175 | cpu: [arm64] 176 | os: [netbsd] 177 | 178 | '@esbuild/netbsd-x64@0.25.5': 179 | resolution: {integrity: sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==} 180 | engines: {node: '>=18'} 181 | cpu: [x64] 182 | os: [netbsd] 183 | 184 | '@esbuild/openbsd-arm64@0.25.5': 185 | resolution: {integrity: sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==} 186 | engines: {node: '>=18'} 187 | cpu: [arm64] 188 | os: [openbsd] 189 | 190 | '@esbuild/openbsd-x64@0.25.5': 191 | resolution: {integrity: sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==} 192 | engines: {node: '>=18'} 193 | cpu: [x64] 194 | os: [openbsd] 195 | 196 | '@esbuild/sunos-x64@0.25.5': 197 | resolution: {integrity: sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==} 198 | engines: {node: '>=18'} 199 | cpu: [x64] 200 | os: [sunos] 201 | 202 | '@esbuild/win32-arm64@0.25.5': 203 | resolution: {integrity: sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==} 204 | engines: {node: '>=18'} 205 | cpu: [arm64] 206 | os: [win32] 207 | 208 | '@esbuild/win32-ia32@0.25.5': 209 | resolution: {integrity: sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==} 210 | engines: {node: '>=18'} 211 | cpu: [ia32] 212 | os: [win32] 213 | 214 | '@esbuild/win32-x64@0.25.5': 215 | resolution: {integrity: sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==} 216 | engines: {node: '>=18'} 217 | cpu: [x64] 218 | os: [win32] 219 | 220 | '@eslint-community/eslint-utils@4.7.0': 221 | resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} 222 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 223 | peerDependencies: 224 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 225 | 226 | '@eslint-community/regexpp@4.12.1': 227 | resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} 228 | engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 229 | 230 | '@eslint/config-array@0.20.0': 231 | resolution: {integrity: sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==} 232 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 233 | 234 | '@eslint/config-helpers@0.2.1': 235 | resolution: {integrity: sha512-RI17tsD2frtDu/3dmI7QRrD4bedNKPM08ziRYaC5AhkGrzIAJelm9kJU1TznK+apx6V+cqRz8tfpEeG3oIyjxw==} 236 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 237 | 238 | '@eslint/core@0.14.0': 239 | resolution: {integrity: sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==} 240 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 241 | 242 | '@eslint/eslintrc@3.3.1': 243 | resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} 244 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 245 | 246 | '@eslint/js@9.28.0': 247 | resolution: {integrity: sha512-fnqSjGWd/CoIp4EXIxWVK/sHA6DOHN4+8Ix2cX5ycOY7LG0UY8nHCU5pIp2eaE1Mc7Qd8kHspYNzYXT2ojPLzg==} 248 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 249 | 250 | '@eslint/object-schema@2.1.6': 251 | resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} 252 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 253 | 254 | '@eslint/plugin-kit@0.3.1': 255 | resolution: {integrity: sha512-0J+zgWxHN+xXONWIyPWKFMgVuJoZuGiIFu8yxk7RJjxkzpGmyja5wRFqZIVtjDVOQpV+Rw0iOAjYPE2eQyjr0w==} 256 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 257 | 258 | '@fastify/busboy@2.1.1': 259 | resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} 260 | engines: {node: '>=14'} 261 | 262 | '@humanfs/core@0.19.1': 263 | resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} 264 | engines: {node: '>=18.18.0'} 265 | 266 | '@humanfs/node@0.16.6': 267 | resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} 268 | engines: {node: '>=18.18.0'} 269 | 270 | '@humanwhocodes/module-importer@1.0.1': 271 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 272 | engines: {node: '>=12.22'} 273 | 274 | '@humanwhocodes/retry@0.3.1': 275 | resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} 276 | engines: {node: '>=18.18'} 277 | 278 | '@humanwhocodes/retry@0.4.2': 279 | resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==} 280 | engines: {node: '>=18.18'} 281 | 282 | '@jridgewell/sourcemap-codec@1.5.0': 283 | resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} 284 | 285 | '@nodelib/fs.scandir@2.1.5': 286 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 287 | engines: {node: '>= 8'} 288 | 289 | '@nodelib/fs.stat@2.0.5': 290 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 291 | engines: {node: '>= 8'} 292 | 293 | '@nodelib/fs.walk@1.2.8': 294 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 295 | engines: {node: '>= 8'} 296 | 297 | '@rollup/rollup-android-arm-eabi@4.42.0': 298 | resolution: {integrity: sha512-gldmAyS9hpj+H6LpRNlcjQWbuKUtb94lodB9uCz71Jm+7BxK1VIOo7y62tZZwxhA7j1ylv/yQz080L5WkS+LoQ==} 299 | cpu: [arm] 300 | os: [android] 301 | 302 | '@rollup/rollup-android-arm64@4.42.0': 303 | resolution: {integrity: sha512-bpRipfTgmGFdCZDFLRvIkSNO1/3RGS74aWkJJTFJBH7h3MRV4UijkaEUeOMbi9wxtxYmtAbVcnMtHTPBhLEkaw==} 304 | cpu: [arm64] 305 | os: [android] 306 | 307 | '@rollup/rollup-darwin-arm64@4.42.0': 308 | resolution: {integrity: sha512-JxHtA081izPBVCHLKnl6GEA0w3920mlJPLh89NojpU2GsBSB6ypu4erFg/Wx1qbpUbepn0jY4dVWMGZM8gplgA==} 309 | cpu: [arm64] 310 | os: [darwin] 311 | 312 | '@rollup/rollup-darwin-x64@4.42.0': 313 | resolution: {integrity: sha512-rv5UZaWVIJTDMyQ3dCEK+m0SAn6G7H3PRc2AZmExvbDvtaDc+qXkei0knQWcI3+c9tEs7iL/4I4pTQoPbNL2SA==} 314 | cpu: [x64] 315 | os: [darwin] 316 | 317 | '@rollup/rollup-freebsd-arm64@4.42.0': 318 | resolution: {integrity: sha512-fJcN4uSGPWdpVmvLuMtALUFwCHgb2XiQjuECkHT3lWLZhSQ3MBQ9pq+WoWeJq2PrNxr9rPM1Qx+IjyGj8/c6zQ==} 319 | cpu: [arm64] 320 | os: [freebsd] 321 | 322 | '@rollup/rollup-freebsd-x64@4.42.0': 323 | resolution: {integrity: sha512-CziHfyzpp8hJpCVE/ZdTizw58gr+m7Y2Xq5VOuCSrZR++th2xWAz4Nqk52MoIIrV3JHtVBhbBsJcAxs6NammOQ==} 324 | cpu: [x64] 325 | os: [freebsd] 326 | 327 | '@rollup/rollup-linux-arm-gnueabihf@4.42.0': 328 | resolution: {integrity: sha512-UsQD5fyLWm2Fe5CDM7VPYAo+UC7+2Px4Y+N3AcPh/LdZu23YcuGPegQly++XEVaC8XUTFVPscl5y5Cl1twEI4A==} 329 | cpu: [arm] 330 | os: [linux] 331 | 332 | '@rollup/rollup-linux-arm-musleabihf@4.42.0': 333 | resolution: {integrity: sha512-/i8NIrlgc/+4n1lnoWl1zgH7Uo0XK5xK3EDqVTf38KvyYgCU/Rm04+o1VvvzJZnVS5/cWSd07owkzcVasgfIkQ==} 334 | cpu: [arm] 335 | os: [linux] 336 | 337 | '@rollup/rollup-linux-arm64-gnu@4.42.0': 338 | resolution: {integrity: sha512-eoujJFOvoIBjZEi9hJnXAbWg+Vo1Ov8n/0IKZZcPZ7JhBzxh2A+2NFyeMZIRkY9iwBvSjloKgcvnjTbGKHE44Q==} 339 | cpu: [arm64] 340 | os: [linux] 341 | 342 | '@rollup/rollup-linux-arm64-musl@4.42.0': 343 | resolution: {integrity: sha512-/3NrcOWFSR7RQUQIuZQChLND36aTU9IYE4j+TB40VU78S+RA0IiqHR30oSh6P1S9f9/wVOenHQnacs/Byb824g==} 344 | cpu: [arm64] 345 | os: [linux] 346 | 347 | '@rollup/rollup-linux-loongarch64-gnu@4.42.0': 348 | resolution: {integrity: sha512-O8AplvIeavK5ABmZlKBq9/STdZlnQo7Sle0LLhVA7QT+CiGpNVe197/t8Aph9bhJqbDVGCHpY2i7QyfEDDStDg==} 349 | cpu: [loong64] 350 | os: [linux] 351 | 352 | '@rollup/rollup-linux-powerpc64le-gnu@4.42.0': 353 | resolution: {integrity: sha512-6Qb66tbKVN7VyQrekhEzbHRxXXFFD8QKiFAwX5v9Xt6FiJ3BnCVBuyBxa2fkFGqxOCSGGYNejxd8ht+q5SnmtA==} 354 | cpu: [ppc64] 355 | os: [linux] 356 | 357 | '@rollup/rollup-linux-riscv64-gnu@4.42.0': 358 | resolution: {integrity: sha512-KQETDSEBamQFvg/d8jajtRwLNBlGc3aKpaGiP/LvEbnmVUKlFta1vqJqTrvPtsYsfbE/DLg5CC9zyXRX3fnBiA==} 359 | cpu: [riscv64] 360 | os: [linux] 361 | 362 | '@rollup/rollup-linux-riscv64-musl@4.42.0': 363 | resolution: {integrity: sha512-qMvnyjcU37sCo/tuC+JqeDKSuukGAd+pVlRl/oyDbkvPJ3awk6G6ua7tyum02O3lI+fio+eM5wsVd66X0jQtxw==} 364 | cpu: [riscv64] 365 | os: [linux] 366 | 367 | '@rollup/rollup-linux-s390x-gnu@4.42.0': 368 | resolution: {integrity: sha512-I2Y1ZUgTgU2RLddUHXTIgyrdOwljjkmcZ/VilvaEumtS3Fkuhbw4p4hgHc39Ypwvo2o7sBFNl2MquNvGCa55Iw==} 369 | cpu: [s390x] 370 | os: [linux] 371 | 372 | '@rollup/rollup-linux-x64-gnu@4.42.0': 373 | resolution: {integrity: sha512-Gfm6cV6mj3hCUY8TqWa63DB8Mx3NADoFwiJrMpoZ1uESbK8FQV3LXkhfry+8bOniq9pqY1OdsjFWNsSbfjPugw==} 374 | cpu: [x64] 375 | os: [linux] 376 | 377 | '@rollup/rollup-linux-x64-musl@4.42.0': 378 | resolution: {integrity: sha512-g86PF8YZ9GRqkdi0VoGlcDUb4rYtQKyTD1IVtxxN4Hpe7YqLBShA7oHMKU6oKTCi3uxwW4VkIGnOaH/El8de3w==} 379 | cpu: [x64] 380 | os: [linux] 381 | 382 | '@rollup/rollup-win32-arm64-msvc@4.42.0': 383 | resolution: {integrity: sha512-+axkdyDGSp6hjyzQ5m1pgcvQScfHnMCcsXkx8pTgy/6qBmWVhtRVlgxjWwDp67wEXXUr0x+vD6tp5W4x6V7u1A==} 384 | cpu: [arm64] 385 | os: [win32] 386 | 387 | '@rollup/rollup-win32-ia32-msvc@4.42.0': 388 | resolution: {integrity: sha512-F+5J9pelstXKwRSDq92J0TEBXn2nfUrQGg+HK1+Tk7VOL09e0gBqUHugZv7SW4MGrYj41oNCUe3IKCDGVlis2g==} 389 | cpu: [ia32] 390 | os: [win32] 391 | 392 | '@rollup/rollup-win32-x64-msvc@4.42.0': 393 | resolution: {integrity: sha512-LpHiJRwkaVz/LqjHjK8LCi8osq7elmpwujwbXKNW88bM8eeGxavJIKKjkjpMHAh/2xfnrt1ZSnhTv41WYUHYmA==} 394 | cpu: [x64] 395 | os: [win32] 396 | 397 | '@tsconfig/node20@20.1.5': 398 | resolution: {integrity: sha512-Vm8e3WxDTqMGPU4GATF9keQAIy1Drd7bPwlgzKJnZtoOsTm1tduUTbDjg0W5qERvGuxPI2h9RbMufH0YdfBylA==} 399 | 400 | '@types/chai@5.2.2': 401 | resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} 402 | 403 | '@types/deep-eql@4.0.2': 404 | resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} 405 | 406 | '@types/estree@1.0.6': 407 | resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} 408 | 409 | '@types/estree@1.0.7': 410 | resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} 411 | 412 | '@types/json-schema@7.0.15': 413 | resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} 414 | 415 | '@types/node@20.19.0': 416 | resolution: {integrity: sha512-hfrc+1tud1xcdVTABC2JiomZJEklMcXYNTVtZLAeqTVWD+qL5jkHKT+1lOtqDdGxt+mB53DTtiz673vfjU8D1Q==} 417 | 418 | '@typescript-eslint/eslint-plugin@8.33.1': 419 | resolution: {integrity: sha512-TDCXj+YxLgtvxvFlAvpoRv9MAncDLBV2oT9Bd7YBGC/b/sEURoOYuIwLI99rjWOfY3QtDzO+mk0n4AmdFExW8A==} 420 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 421 | peerDependencies: 422 | '@typescript-eslint/parser': ^8.33.1 423 | eslint: ^8.57.0 || ^9.0.0 424 | typescript: '>=4.8.4 <5.9.0' 425 | 426 | '@typescript-eslint/parser@8.33.1': 427 | resolution: {integrity: sha512-qwxv6dq682yVvgKKp2qWwLgRbscDAYktPptK4JPojCwwi3R9cwrvIxS4lvBpzmcqzR4bdn54Z0IG1uHFskW4dA==} 428 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 429 | peerDependencies: 430 | eslint: ^8.57.0 || ^9.0.0 431 | typescript: '>=4.8.4 <5.9.0' 432 | 433 | '@typescript-eslint/project-service@8.33.1': 434 | resolution: {integrity: sha512-DZR0efeNklDIHHGRpMpR5gJITQpu6tLr9lDJnKdONTC7vvzOlLAG/wcfxcdxEWrbiZApcoBCzXqU/Z458Za5Iw==} 435 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 436 | peerDependencies: 437 | typescript: '>=4.8.4 <5.9.0' 438 | 439 | '@typescript-eslint/scope-manager@8.33.1': 440 | resolution: {integrity: sha512-dM4UBtgmzHR9bS0Rv09JST0RcHYearoEoo3pG5B6GoTR9XcyeqX87FEhPo+5kTvVfKCvfHaHrcgeJQc6mrDKrA==} 441 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 442 | 443 | '@typescript-eslint/tsconfig-utils@8.33.1': 444 | resolution: {integrity: sha512-STAQsGYbHCF0/e+ShUQ4EatXQ7ceh3fBCXkNU7/MZVKulrlq1usH7t2FhxvCpuCi5O5oi1vmVaAjrGeL71OK1g==} 445 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 446 | peerDependencies: 447 | typescript: '>=4.8.4 <5.9.0' 448 | 449 | '@typescript-eslint/type-utils@8.33.1': 450 | resolution: {integrity: sha512-1cG37d9xOkhlykom55WVwG2QRNC7YXlxMaMzqw2uPeJixBFfKWZgaP/hjAObqMN/u3fr5BrTwTnc31/L9jQ2ww==} 451 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 452 | peerDependencies: 453 | eslint: ^8.57.0 || ^9.0.0 454 | typescript: '>=4.8.4 <5.9.0' 455 | 456 | '@typescript-eslint/types@8.33.1': 457 | resolution: {integrity: sha512-xid1WfizGhy/TKMTwhtVOgalHwPtV8T32MS9MaH50Cwvz6x6YqRIPdD2WvW0XaqOzTV9p5xdLY0h/ZusU5Lokg==} 458 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 459 | 460 | '@typescript-eslint/typescript-estree@8.33.1': 461 | resolution: {integrity: sha512-+s9LYcT8LWjdYWu7IWs7FvUxpQ/DGkdjZeE/GGulHvv8rvYwQvVaUZ6DE+j5x/prADUgSbbCWZ2nPI3usuVeOA==} 462 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 463 | peerDependencies: 464 | typescript: '>=4.8.4 <5.9.0' 465 | 466 | '@typescript-eslint/utils@8.33.1': 467 | resolution: {integrity: sha512-52HaBiEQUaRYqAXpfzWSR2U3gxk92Kw006+xZpElaPMg3C4PgM+A5LqwoQI1f9E5aZ/qlxAZxzm42WX+vn92SQ==} 468 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 469 | peerDependencies: 470 | eslint: ^8.57.0 || ^9.0.0 471 | typescript: '>=4.8.4 <5.9.0' 472 | 473 | '@typescript-eslint/visitor-keys@8.33.1': 474 | resolution: {integrity: sha512-3i8NrFcZeeDHJ+7ZUuDkGT+UHq+XoFGsymNK2jZCOHcfEzRQ0BdpRtdpSx/Iyf3MHLWIcLS0COuOPibKQboIiQ==} 475 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 476 | 477 | '@vercel/ncc@0.38.3': 478 | resolution: {integrity: sha512-rnK6hJBS6mwc+Bkab+PGPs9OiS0i/3kdTO+CkI8V0/VrW3vmz7O2Pxjw/owOlmo6PKEIxRSeZKv/kuL9itnpYA==} 479 | hasBin: true 480 | 481 | '@vitest/eslint-plugin@1.2.1': 482 | resolution: {integrity: sha512-JQr1jdVcrsoS7Sdzn83h9sq4DvREf9Q/onTZbJCqTVlv/76qb+TZrLv/9VhjnjSMHweQH5FdpMDeCR6aDe2fgw==} 483 | peerDependencies: 484 | eslint: '>= 8.57.0' 485 | typescript: '>= 5.0.0' 486 | vitest: '*' 487 | peerDependenciesMeta: 488 | typescript: 489 | optional: true 490 | vitest: 491 | optional: true 492 | 493 | '@vitest/expect@3.2.3': 494 | resolution: {integrity: sha512-W2RH2TPWVHA1o7UmaFKISPvdicFJH+mjykctJFoAkUw+SPTJTGjUNdKscFBrqM7IPnCVu6zihtKYa7TkZS1dkQ==} 495 | 496 | '@vitest/mocker@3.2.3': 497 | resolution: {integrity: sha512-cP6fIun+Zx8he4rbWvi+Oya6goKQDZK+Yq4hhlggwQBbrlOQ4qtZ+G4nxB6ZnzI9lyIb+JnvyiJnPC2AGbKSPA==} 498 | peerDependencies: 499 | msw: ^2.4.9 500 | vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 501 | peerDependenciesMeta: 502 | msw: 503 | optional: true 504 | vite: 505 | optional: true 506 | 507 | '@vitest/pretty-format@3.2.3': 508 | resolution: {integrity: sha512-yFglXGkr9hW/yEXngO+IKMhP0jxyFw2/qys/CK4fFUZnSltD+MU7dVYGrH8rvPcK/O6feXQA+EU33gjaBBbAng==} 509 | 510 | '@vitest/runner@3.2.3': 511 | resolution: {integrity: sha512-83HWYisT3IpMaU9LN+VN+/nLHVBCSIUKJzGxC5RWUOsK1h3USg7ojL+UXQR3b4o4UBIWCYdD2fxuzM7PQQ1u8w==} 512 | 513 | '@vitest/snapshot@3.2.3': 514 | resolution: {integrity: sha512-9gIVWx2+tysDqUmmM1L0hwadyumqssOL1r8KJipwLx5JVYyxvVRfxvMq7DaWbZZsCqZnu/dZedaZQh4iYTtneA==} 515 | 516 | '@vitest/spy@3.2.3': 517 | resolution: {integrity: sha512-JHu9Wl+7bf6FEejTCREy+DmgWe+rQKbK+y32C/k5f4TBIAlijhJbRBIRIOCEpVevgRsCQR2iHRUH2/qKVM/plw==} 518 | 519 | '@vitest/utils@3.2.3': 520 | resolution: {integrity: sha512-4zFBCU5Pf+4Z6v+rwnZ1HU1yzOKKvDkMXZrymE2PBlbjKJRlrOxbvpfPSvJTGRIwGoahaOGvp+kbCoxifhzJ1Q==} 521 | 522 | acorn-jsx@5.3.2: 523 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 524 | peerDependencies: 525 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 526 | 527 | acorn@8.14.0: 528 | resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} 529 | engines: {node: '>=0.4.0'} 530 | hasBin: true 531 | 532 | ajv@6.12.6: 533 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 534 | 535 | ansi-styles@4.3.0: 536 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 537 | engines: {node: '>=8'} 538 | 539 | argparse@2.0.1: 540 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 541 | 542 | assertion-error@2.0.1: 543 | resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} 544 | engines: {node: '>=12'} 545 | 546 | balanced-match@1.0.2: 547 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 548 | 549 | brace-expansion@1.1.11: 550 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 551 | 552 | brace-expansion@2.0.1: 553 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 554 | 555 | braces@3.0.2: 556 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 557 | engines: {node: '>=8'} 558 | 559 | cac@6.7.14: 560 | resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} 561 | engines: {node: '>=8'} 562 | 563 | callsites@3.1.0: 564 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 565 | engines: {node: '>=6'} 566 | 567 | chai@5.2.0: 568 | resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==} 569 | engines: {node: '>=12'} 570 | 571 | chalk@4.1.2: 572 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 573 | engines: {node: '>=10'} 574 | 575 | check-error@2.1.1: 576 | resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} 577 | engines: {node: '>= 16'} 578 | 579 | color-convert@2.0.1: 580 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 581 | engines: {node: '>=7.0.0'} 582 | 583 | color-name@1.1.4: 584 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 585 | 586 | concat-map@0.0.1: 587 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 588 | 589 | cross-spawn@7.0.6: 590 | resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} 591 | engines: {node: '>= 8'} 592 | 593 | debug@4.4.0: 594 | resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} 595 | engines: {node: '>=6.0'} 596 | peerDependencies: 597 | supports-color: '*' 598 | peerDependenciesMeta: 599 | supports-color: 600 | optional: true 601 | 602 | debug@4.4.1: 603 | resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} 604 | engines: {node: '>=6.0'} 605 | peerDependencies: 606 | supports-color: '*' 607 | peerDependenciesMeta: 608 | supports-color: 609 | optional: true 610 | 611 | deep-eql@5.0.2: 612 | resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} 613 | engines: {node: '>=6'} 614 | 615 | deep-is@0.1.4: 616 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 617 | 618 | es-module-lexer@1.7.0: 619 | resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} 620 | 621 | esbuild@0.25.5: 622 | resolution: {integrity: sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==} 623 | engines: {node: '>=18'} 624 | hasBin: true 625 | 626 | escape-string-regexp@4.0.0: 627 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 628 | engines: {node: '>=10'} 629 | 630 | eslint-scope@8.3.0: 631 | resolution: {integrity: sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==} 632 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 633 | 634 | eslint-visitor-keys@3.4.3: 635 | resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} 636 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 637 | 638 | eslint-visitor-keys@4.2.0: 639 | resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} 640 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 641 | 642 | eslint@9.28.0: 643 | resolution: {integrity: sha512-ocgh41VhRlf9+fVpe7QKzwLj9c92fDiqOj8Y3Sd4/ZmVA4Btx4PlUYPq4pp9JDyupkf1upbEXecxL2mwNV7jPQ==} 644 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 645 | hasBin: true 646 | peerDependencies: 647 | jiti: '*' 648 | peerDependenciesMeta: 649 | jiti: 650 | optional: true 651 | 652 | espree@10.3.0: 653 | resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} 654 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 655 | 656 | esquery@1.5.0: 657 | resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} 658 | engines: {node: '>=0.10'} 659 | 660 | esrecurse@4.3.0: 661 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 662 | engines: {node: '>=4.0'} 663 | 664 | estraverse@5.3.0: 665 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 666 | engines: {node: '>=4.0'} 667 | 668 | estree-walker@3.0.3: 669 | resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} 670 | 671 | esutils@2.0.3: 672 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 673 | engines: {node: '>=0.10.0'} 674 | 675 | expect-type@1.2.1: 676 | resolution: {integrity: sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==} 677 | engines: {node: '>=12.0.0'} 678 | 679 | fast-deep-equal@3.1.3: 680 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 681 | 682 | fast-glob@3.3.2: 683 | resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} 684 | engines: {node: '>=8.6.0'} 685 | 686 | fast-json-stable-stringify@2.1.0: 687 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 688 | 689 | fast-levenshtein@2.0.6: 690 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 691 | 692 | fastq@1.17.1: 693 | resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} 694 | 695 | fdir@6.4.5: 696 | resolution: {integrity: sha512-4BG7puHpVsIYxZUbiUE3RqGloLaSSwzYie5jvasC4LWuBWzZawynvYouhjbQKw2JuIGYdm0DzIxl8iVidKlUEw==} 697 | peerDependencies: 698 | picomatch: ^3 || ^4 699 | peerDependenciesMeta: 700 | picomatch: 701 | optional: true 702 | 703 | file-entry-cache@8.0.0: 704 | resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} 705 | engines: {node: '>=16.0.0'} 706 | 707 | fill-range@7.0.1: 708 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 709 | engines: {node: '>=8'} 710 | 711 | find-up@5.0.0: 712 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 713 | engines: {node: '>=10'} 714 | 715 | flat-cache@4.0.1: 716 | resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} 717 | engines: {node: '>=16'} 718 | 719 | flatted@3.3.1: 720 | resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} 721 | 722 | fsevents@2.3.3: 723 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 724 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 725 | os: [darwin] 726 | 727 | glob-parent@5.1.2: 728 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 729 | engines: {node: '>= 6'} 730 | 731 | glob-parent@6.0.2: 732 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 733 | engines: {node: '>=10.13.0'} 734 | 735 | globals@14.0.0: 736 | resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} 737 | engines: {node: '>=18'} 738 | 739 | graphemer@1.4.0: 740 | resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} 741 | 742 | has-flag@4.0.0: 743 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 744 | engines: {node: '>=8'} 745 | 746 | ignore@5.3.1: 747 | resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} 748 | engines: {node: '>= 4'} 749 | 750 | ignore@7.0.4: 751 | resolution: {integrity: sha512-gJzzk+PQNznz8ysRrC0aOkBNVRBDtE1n53IqyqEf3PXrYwomFs5q4pGMizBMJF+ykh03insJ27hB8gSrD2Hn8A==} 752 | engines: {node: '>= 4'} 753 | 754 | import-fresh@3.3.0: 755 | resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} 756 | engines: {node: '>=6'} 757 | 758 | imurmurhash@0.1.4: 759 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 760 | engines: {node: '>=0.8.19'} 761 | 762 | is-extglob@2.1.1: 763 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 764 | engines: {node: '>=0.10.0'} 765 | 766 | is-glob@4.0.3: 767 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 768 | engines: {node: '>=0.10.0'} 769 | 770 | is-number@7.0.0: 771 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 772 | engines: {node: '>=0.12.0'} 773 | 774 | isexe@2.0.0: 775 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 776 | 777 | js-tokens@9.0.1: 778 | resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} 779 | 780 | js-yaml@4.1.0: 781 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 782 | hasBin: true 783 | 784 | json-buffer@3.0.1: 785 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 786 | 787 | json-schema-traverse@0.4.1: 788 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 789 | 790 | json-stable-stringify-without-jsonify@1.0.1: 791 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 792 | 793 | keyv@4.5.4: 794 | resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} 795 | 796 | levn@0.4.1: 797 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 798 | engines: {node: '>= 0.8.0'} 799 | 800 | locate-path@6.0.0: 801 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 802 | engines: {node: '>=10'} 803 | 804 | lodash.merge@4.6.2: 805 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 806 | 807 | loupe@3.1.3: 808 | resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} 809 | 810 | magic-string@0.30.17: 811 | resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} 812 | 813 | merge2@1.4.1: 814 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 815 | engines: {node: '>= 8'} 816 | 817 | micromatch@4.0.5: 818 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} 819 | engines: {node: '>=8.6'} 820 | 821 | minimatch@3.1.2: 822 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 823 | 824 | minimatch@9.0.4: 825 | resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} 826 | engines: {node: '>=16 || 14 >=14.17'} 827 | 828 | ms@2.1.3: 829 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 830 | 831 | nanoid@3.3.11: 832 | resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} 833 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 834 | hasBin: true 835 | 836 | natural-compare@1.4.0: 837 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 838 | 839 | optionator@0.9.3: 840 | resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} 841 | engines: {node: '>= 0.8.0'} 842 | 843 | p-limit@3.1.0: 844 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 845 | engines: {node: '>=10'} 846 | 847 | p-locate@5.0.0: 848 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 849 | engines: {node: '>=10'} 850 | 851 | parent-module@1.0.1: 852 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 853 | engines: {node: '>=6'} 854 | 855 | path-exists@4.0.0: 856 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 857 | engines: {node: '>=8'} 858 | 859 | path-key@3.1.1: 860 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 861 | engines: {node: '>=8'} 862 | 863 | pathe@2.0.3: 864 | resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} 865 | 866 | pathval@2.0.0: 867 | resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} 868 | engines: {node: '>= 14.16'} 869 | 870 | picocolors@1.1.1: 871 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 872 | 873 | picomatch@2.3.1: 874 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 875 | engines: {node: '>=8.6'} 876 | 877 | picomatch@4.0.2: 878 | resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} 879 | engines: {node: '>=12'} 880 | 881 | pnpm@10.12.1: 882 | resolution: {integrity: sha512-8N2oWA8O6UgcXHmh2Se5Fk8sR46QmSrSaLuyRlpzaYQ5HWMz0sMnkTV4soBK8zR0ylVLopwEqLEwYKcXZ1rjrA==} 883 | engines: {node: '>=18.12'} 884 | hasBin: true 885 | 886 | postcss@8.5.4: 887 | resolution: {integrity: sha512-QSa9EBe+uwlGTFmHsPKokv3B/oEMQZxfqW0QqNCyhpa6mB1afzulwn8hihglqAb2pOw+BJgNlmXQ8la2VeHB7w==} 888 | engines: {node: ^10 || ^12 || >=14} 889 | 890 | prelude-ls@1.2.1: 891 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 892 | engines: {node: '>= 0.8.0'} 893 | 894 | prettier@3.5.3: 895 | resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} 896 | engines: {node: '>=14'} 897 | hasBin: true 898 | 899 | punycode@2.3.1: 900 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 901 | engines: {node: '>=6'} 902 | 903 | queue-microtask@1.2.3: 904 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 905 | 906 | resolve-from@4.0.0: 907 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 908 | engines: {node: '>=4'} 909 | 910 | reusify@1.0.4: 911 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 912 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 913 | 914 | rollup@4.42.0: 915 | resolution: {integrity: sha512-LW+Vse3BJPyGJGAJt1j8pWDKPd73QM8cRXYK1IxOBgL2AGLu7Xd2YOW0M2sLUBCkF5MshXXtMApyEAEzMVMsnw==} 916 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 917 | hasBin: true 918 | 919 | run-parallel@1.2.0: 920 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 921 | 922 | semver@7.7.2: 923 | resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} 924 | engines: {node: '>=10'} 925 | hasBin: true 926 | 927 | shebang-command@2.0.0: 928 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 929 | engines: {node: '>=8'} 930 | 931 | shebang-regex@3.0.0: 932 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 933 | engines: {node: '>=8'} 934 | 935 | siginfo@2.0.0: 936 | resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} 937 | 938 | source-map-js@1.2.1: 939 | resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 940 | engines: {node: '>=0.10.0'} 941 | 942 | stackback@0.0.2: 943 | resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} 944 | 945 | std-env@3.9.0: 946 | resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} 947 | 948 | strip-json-comments@3.1.1: 949 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 950 | engines: {node: '>=8'} 951 | 952 | strip-literal@3.0.0: 953 | resolution: {integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==} 954 | 955 | supports-color@7.2.0: 956 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 957 | engines: {node: '>=8'} 958 | 959 | tinybench@2.9.0: 960 | resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} 961 | 962 | tinyexec@0.3.2: 963 | resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} 964 | 965 | tinyglobby@0.2.14: 966 | resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} 967 | engines: {node: '>=12.0.0'} 968 | 969 | tinypool@1.1.0: 970 | resolution: {integrity: sha512-7CotroY9a8DKsKprEy/a14aCCm8jYVmR7aFy4fpkZM8sdpNJbKkixuNjgM50yCmip2ezc8z4N7k3oe2+rfRJCQ==} 971 | engines: {node: ^18.0.0 || >=20.0.0} 972 | 973 | tinyrainbow@2.0.0: 974 | resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} 975 | engines: {node: '>=14.0.0'} 976 | 977 | tinyspy@4.0.3: 978 | resolution: {integrity: sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==} 979 | engines: {node: '>=14.0.0'} 980 | 981 | to-regex-range@5.0.1: 982 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 983 | engines: {node: '>=8.0'} 984 | 985 | ts-api-utils@2.1.0: 986 | resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} 987 | engines: {node: '>=18.12'} 988 | peerDependencies: 989 | typescript: '>=4.8.4' 990 | 991 | tunnel@0.0.6: 992 | resolution: {integrity: sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==} 993 | engines: {node: '>=0.6.11 <=0.7.0 || >=0.7.3'} 994 | 995 | type-check@0.4.0: 996 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 997 | engines: {node: '>= 0.8.0'} 998 | 999 | typescript-eslint@8.33.1: 1000 | resolution: {integrity: sha512-AgRnV4sKkWOiZ0Kjbnf5ytTJXMUZQ0qhSVdQtDNYLPLnjsATEYhaO94GlRQwi4t4gO8FfjM6NnikHeKjUm8D7A==} 1001 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1002 | peerDependencies: 1003 | eslint: ^8.57.0 || ^9.0.0 1004 | typescript: '>=4.8.4 <5.9.0' 1005 | 1006 | typescript@5.8.3: 1007 | resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} 1008 | engines: {node: '>=14.17'} 1009 | hasBin: true 1010 | 1011 | undici-types@6.21.0: 1012 | resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} 1013 | 1014 | undici@5.28.3: 1015 | resolution: {integrity: sha512-3ItfzbrhDlINjaP0duwnNsKpDQk3acHI3gVJ1z4fmwMK31k5G9OVIAMLSIaP6w4FaGkaAkN6zaQO9LUvZ1t7VA==} 1016 | engines: {node: '>=14.0'} 1017 | 1018 | uri-js@4.4.1: 1019 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 1020 | 1021 | vite-node@3.2.3: 1022 | resolution: {integrity: sha512-gc8aAifGuDIpZHrPjuHyP4dpQmYXqWw7D1GmDnWeNWP654UEXzVfQ5IHPSK5HaHkwB/+p1atpYpSdw/2kOv8iQ==} 1023 | engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 1024 | hasBin: true 1025 | 1026 | vite@6.3.5: 1027 | resolution: {integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==} 1028 | engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 1029 | hasBin: true 1030 | peerDependencies: 1031 | '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 1032 | jiti: '>=1.21.0' 1033 | less: '*' 1034 | lightningcss: ^1.21.0 1035 | sass: '*' 1036 | sass-embedded: '*' 1037 | stylus: '*' 1038 | sugarss: '*' 1039 | terser: ^5.16.0 1040 | tsx: ^4.8.1 1041 | yaml: ^2.4.2 1042 | peerDependenciesMeta: 1043 | '@types/node': 1044 | optional: true 1045 | jiti: 1046 | optional: true 1047 | less: 1048 | optional: true 1049 | lightningcss: 1050 | optional: true 1051 | sass: 1052 | optional: true 1053 | sass-embedded: 1054 | optional: true 1055 | stylus: 1056 | optional: true 1057 | sugarss: 1058 | optional: true 1059 | terser: 1060 | optional: true 1061 | tsx: 1062 | optional: true 1063 | yaml: 1064 | optional: true 1065 | 1066 | vitest@3.2.3: 1067 | resolution: {integrity: sha512-E6U2ZFXe3N/t4f5BwUaVCKRLHqUpk1CBWeMh78UT4VaTPH/2dyvH6ALl29JTovEPu9dVKr/K/J4PkXgrMbw4Ww==} 1068 | engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 1069 | hasBin: true 1070 | peerDependencies: 1071 | '@edge-runtime/vm': '*' 1072 | '@types/debug': ^4.1.12 1073 | '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 1074 | '@vitest/browser': 3.2.3 1075 | '@vitest/ui': 3.2.3 1076 | happy-dom: '*' 1077 | jsdom: '*' 1078 | peerDependenciesMeta: 1079 | '@edge-runtime/vm': 1080 | optional: true 1081 | '@types/debug': 1082 | optional: true 1083 | '@types/node': 1084 | optional: true 1085 | '@vitest/browser': 1086 | optional: true 1087 | '@vitest/ui': 1088 | optional: true 1089 | happy-dom: 1090 | optional: true 1091 | jsdom: 1092 | optional: true 1093 | 1094 | which@2.0.2: 1095 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1096 | engines: {node: '>= 8'} 1097 | hasBin: true 1098 | 1099 | why-is-node-running@2.3.0: 1100 | resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} 1101 | engines: {node: '>=8'} 1102 | hasBin: true 1103 | 1104 | yocto-queue@0.1.0: 1105 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 1106 | engines: {node: '>=10'} 1107 | 1108 | snapshots: 1109 | 1110 | '@aashutoshrathi/word-wrap@1.2.6': {} 1111 | 1112 | '@actions/core@1.11.1': 1113 | dependencies: 1114 | '@actions/exec': 1.1.1 1115 | '@actions/http-client': 2.2.0 1116 | 1117 | '@actions/exec@1.1.1': 1118 | dependencies: 1119 | '@actions/io': 1.1.3 1120 | 1121 | '@actions/http-client@2.2.0': 1122 | dependencies: 1123 | tunnel: 0.0.6 1124 | undici: 5.28.3 1125 | 1126 | '@actions/io@1.1.3': {} 1127 | 1128 | '@esbuild/aix-ppc64@0.25.5': 1129 | optional: true 1130 | 1131 | '@esbuild/android-arm64@0.25.5': 1132 | optional: true 1133 | 1134 | '@esbuild/android-arm@0.25.5': 1135 | optional: true 1136 | 1137 | '@esbuild/android-x64@0.25.5': 1138 | optional: true 1139 | 1140 | '@esbuild/darwin-arm64@0.25.5': 1141 | optional: true 1142 | 1143 | '@esbuild/darwin-x64@0.25.5': 1144 | optional: true 1145 | 1146 | '@esbuild/freebsd-arm64@0.25.5': 1147 | optional: true 1148 | 1149 | '@esbuild/freebsd-x64@0.25.5': 1150 | optional: true 1151 | 1152 | '@esbuild/linux-arm64@0.25.5': 1153 | optional: true 1154 | 1155 | '@esbuild/linux-arm@0.25.5': 1156 | optional: true 1157 | 1158 | '@esbuild/linux-ia32@0.25.5': 1159 | optional: true 1160 | 1161 | '@esbuild/linux-loong64@0.25.5': 1162 | optional: true 1163 | 1164 | '@esbuild/linux-mips64el@0.25.5': 1165 | optional: true 1166 | 1167 | '@esbuild/linux-ppc64@0.25.5': 1168 | optional: true 1169 | 1170 | '@esbuild/linux-riscv64@0.25.5': 1171 | optional: true 1172 | 1173 | '@esbuild/linux-s390x@0.25.5': 1174 | optional: true 1175 | 1176 | '@esbuild/linux-x64@0.25.5': 1177 | optional: true 1178 | 1179 | '@esbuild/netbsd-arm64@0.25.5': 1180 | optional: true 1181 | 1182 | '@esbuild/netbsd-x64@0.25.5': 1183 | optional: true 1184 | 1185 | '@esbuild/openbsd-arm64@0.25.5': 1186 | optional: true 1187 | 1188 | '@esbuild/openbsd-x64@0.25.5': 1189 | optional: true 1190 | 1191 | '@esbuild/sunos-x64@0.25.5': 1192 | optional: true 1193 | 1194 | '@esbuild/win32-arm64@0.25.5': 1195 | optional: true 1196 | 1197 | '@esbuild/win32-ia32@0.25.5': 1198 | optional: true 1199 | 1200 | '@esbuild/win32-x64@0.25.5': 1201 | optional: true 1202 | 1203 | '@eslint-community/eslint-utils@4.7.0(eslint@9.28.0)': 1204 | dependencies: 1205 | eslint: 9.28.0 1206 | eslint-visitor-keys: 3.4.3 1207 | 1208 | '@eslint-community/regexpp@4.12.1': {} 1209 | 1210 | '@eslint/config-array@0.20.0': 1211 | dependencies: 1212 | '@eslint/object-schema': 2.1.6 1213 | debug: 4.4.0 1214 | minimatch: 3.1.2 1215 | transitivePeerDependencies: 1216 | - supports-color 1217 | 1218 | '@eslint/config-helpers@0.2.1': {} 1219 | 1220 | '@eslint/core@0.14.0': 1221 | dependencies: 1222 | '@types/json-schema': 7.0.15 1223 | 1224 | '@eslint/eslintrc@3.3.1': 1225 | dependencies: 1226 | ajv: 6.12.6 1227 | debug: 4.4.0 1228 | espree: 10.3.0 1229 | globals: 14.0.0 1230 | ignore: 5.3.1 1231 | import-fresh: 3.3.0 1232 | js-yaml: 4.1.0 1233 | minimatch: 3.1.2 1234 | strip-json-comments: 3.1.1 1235 | transitivePeerDependencies: 1236 | - supports-color 1237 | 1238 | '@eslint/js@9.28.0': {} 1239 | 1240 | '@eslint/object-schema@2.1.6': {} 1241 | 1242 | '@eslint/plugin-kit@0.3.1': 1243 | dependencies: 1244 | '@eslint/core': 0.14.0 1245 | levn: 0.4.1 1246 | 1247 | '@fastify/busboy@2.1.1': {} 1248 | 1249 | '@humanfs/core@0.19.1': {} 1250 | 1251 | '@humanfs/node@0.16.6': 1252 | dependencies: 1253 | '@humanfs/core': 0.19.1 1254 | '@humanwhocodes/retry': 0.3.1 1255 | 1256 | '@humanwhocodes/module-importer@1.0.1': {} 1257 | 1258 | '@humanwhocodes/retry@0.3.1': {} 1259 | 1260 | '@humanwhocodes/retry@0.4.2': {} 1261 | 1262 | '@jridgewell/sourcemap-codec@1.5.0': {} 1263 | 1264 | '@nodelib/fs.scandir@2.1.5': 1265 | dependencies: 1266 | '@nodelib/fs.stat': 2.0.5 1267 | run-parallel: 1.2.0 1268 | 1269 | '@nodelib/fs.stat@2.0.5': {} 1270 | 1271 | '@nodelib/fs.walk@1.2.8': 1272 | dependencies: 1273 | '@nodelib/fs.scandir': 2.1.5 1274 | fastq: 1.17.1 1275 | 1276 | '@rollup/rollup-android-arm-eabi@4.42.0': 1277 | optional: true 1278 | 1279 | '@rollup/rollup-android-arm64@4.42.0': 1280 | optional: true 1281 | 1282 | '@rollup/rollup-darwin-arm64@4.42.0': 1283 | optional: true 1284 | 1285 | '@rollup/rollup-darwin-x64@4.42.0': 1286 | optional: true 1287 | 1288 | '@rollup/rollup-freebsd-arm64@4.42.0': 1289 | optional: true 1290 | 1291 | '@rollup/rollup-freebsd-x64@4.42.0': 1292 | optional: true 1293 | 1294 | '@rollup/rollup-linux-arm-gnueabihf@4.42.0': 1295 | optional: true 1296 | 1297 | '@rollup/rollup-linux-arm-musleabihf@4.42.0': 1298 | optional: true 1299 | 1300 | '@rollup/rollup-linux-arm64-gnu@4.42.0': 1301 | optional: true 1302 | 1303 | '@rollup/rollup-linux-arm64-musl@4.42.0': 1304 | optional: true 1305 | 1306 | '@rollup/rollup-linux-loongarch64-gnu@4.42.0': 1307 | optional: true 1308 | 1309 | '@rollup/rollup-linux-powerpc64le-gnu@4.42.0': 1310 | optional: true 1311 | 1312 | '@rollup/rollup-linux-riscv64-gnu@4.42.0': 1313 | optional: true 1314 | 1315 | '@rollup/rollup-linux-riscv64-musl@4.42.0': 1316 | optional: true 1317 | 1318 | '@rollup/rollup-linux-s390x-gnu@4.42.0': 1319 | optional: true 1320 | 1321 | '@rollup/rollup-linux-x64-gnu@4.42.0': 1322 | optional: true 1323 | 1324 | '@rollup/rollup-linux-x64-musl@4.42.0': 1325 | optional: true 1326 | 1327 | '@rollup/rollup-win32-arm64-msvc@4.42.0': 1328 | optional: true 1329 | 1330 | '@rollup/rollup-win32-ia32-msvc@4.42.0': 1331 | optional: true 1332 | 1333 | '@rollup/rollup-win32-x64-msvc@4.42.0': 1334 | optional: true 1335 | 1336 | '@tsconfig/node20@20.1.5': {} 1337 | 1338 | '@types/chai@5.2.2': 1339 | dependencies: 1340 | '@types/deep-eql': 4.0.2 1341 | 1342 | '@types/deep-eql@4.0.2': {} 1343 | 1344 | '@types/estree@1.0.6': {} 1345 | 1346 | '@types/estree@1.0.7': {} 1347 | 1348 | '@types/json-schema@7.0.15': {} 1349 | 1350 | '@types/node@20.19.0': 1351 | dependencies: 1352 | undici-types: 6.21.0 1353 | 1354 | '@typescript-eslint/eslint-plugin@8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.28.0)(typescript@5.8.3))(eslint@9.28.0)(typescript@5.8.3)': 1355 | dependencies: 1356 | '@eslint-community/regexpp': 4.12.1 1357 | '@typescript-eslint/parser': 8.33.1(eslint@9.28.0)(typescript@5.8.3) 1358 | '@typescript-eslint/scope-manager': 8.33.1 1359 | '@typescript-eslint/type-utils': 8.33.1(eslint@9.28.0)(typescript@5.8.3) 1360 | '@typescript-eslint/utils': 8.33.1(eslint@9.28.0)(typescript@5.8.3) 1361 | '@typescript-eslint/visitor-keys': 8.33.1 1362 | eslint: 9.28.0 1363 | graphemer: 1.4.0 1364 | ignore: 7.0.4 1365 | natural-compare: 1.4.0 1366 | ts-api-utils: 2.1.0(typescript@5.8.3) 1367 | typescript: 5.8.3 1368 | transitivePeerDependencies: 1369 | - supports-color 1370 | 1371 | '@typescript-eslint/parser@8.33.1(eslint@9.28.0)(typescript@5.8.3)': 1372 | dependencies: 1373 | '@typescript-eslint/scope-manager': 8.33.1 1374 | '@typescript-eslint/types': 8.33.1 1375 | '@typescript-eslint/typescript-estree': 8.33.1(typescript@5.8.3) 1376 | '@typescript-eslint/visitor-keys': 8.33.1 1377 | debug: 4.4.1 1378 | eslint: 9.28.0 1379 | typescript: 5.8.3 1380 | transitivePeerDependencies: 1381 | - supports-color 1382 | 1383 | '@typescript-eslint/project-service@8.33.1(typescript@5.8.3)': 1384 | dependencies: 1385 | '@typescript-eslint/tsconfig-utils': 8.33.1(typescript@5.8.3) 1386 | '@typescript-eslint/types': 8.33.1 1387 | debug: 4.4.1 1388 | typescript: 5.8.3 1389 | transitivePeerDependencies: 1390 | - supports-color 1391 | 1392 | '@typescript-eslint/scope-manager@8.33.1': 1393 | dependencies: 1394 | '@typescript-eslint/types': 8.33.1 1395 | '@typescript-eslint/visitor-keys': 8.33.1 1396 | 1397 | '@typescript-eslint/tsconfig-utils@8.33.1(typescript@5.8.3)': 1398 | dependencies: 1399 | typescript: 5.8.3 1400 | 1401 | '@typescript-eslint/type-utils@8.33.1(eslint@9.28.0)(typescript@5.8.3)': 1402 | dependencies: 1403 | '@typescript-eslint/typescript-estree': 8.33.1(typescript@5.8.3) 1404 | '@typescript-eslint/utils': 8.33.1(eslint@9.28.0)(typescript@5.8.3) 1405 | debug: 4.4.1 1406 | eslint: 9.28.0 1407 | ts-api-utils: 2.1.0(typescript@5.8.3) 1408 | typescript: 5.8.3 1409 | transitivePeerDependencies: 1410 | - supports-color 1411 | 1412 | '@typescript-eslint/types@8.33.1': {} 1413 | 1414 | '@typescript-eslint/typescript-estree@8.33.1(typescript@5.8.3)': 1415 | dependencies: 1416 | '@typescript-eslint/project-service': 8.33.1(typescript@5.8.3) 1417 | '@typescript-eslint/tsconfig-utils': 8.33.1(typescript@5.8.3) 1418 | '@typescript-eslint/types': 8.33.1 1419 | '@typescript-eslint/visitor-keys': 8.33.1 1420 | debug: 4.4.1 1421 | fast-glob: 3.3.2 1422 | is-glob: 4.0.3 1423 | minimatch: 9.0.4 1424 | semver: 7.7.2 1425 | ts-api-utils: 2.1.0(typescript@5.8.3) 1426 | typescript: 5.8.3 1427 | transitivePeerDependencies: 1428 | - supports-color 1429 | 1430 | '@typescript-eslint/utils@8.33.1(eslint@9.28.0)(typescript@5.8.3)': 1431 | dependencies: 1432 | '@eslint-community/eslint-utils': 4.7.0(eslint@9.28.0) 1433 | '@typescript-eslint/scope-manager': 8.33.1 1434 | '@typescript-eslint/types': 8.33.1 1435 | '@typescript-eslint/typescript-estree': 8.33.1(typescript@5.8.3) 1436 | eslint: 9.28.0 1437 | typescript: 5.8.3 1438 | transitivePeerDependencies: 1439 | - supports-color 1440 | 1441 | '@typescript-eslint/visitor-keys@8.33.1': 1442 | dependencies: 1443 | '@typescript-eslint/types': 8.33.1 1444 | eslint-visitor-keys: 4.2.0 1445 | 1446 | '@vercel/ncc@0.38.3': {} 1447 | 1448 | '@vitest/eslint-plugin@1.2.1(eslint@9.28.0)(typescript@5.8.3)(vitest@3.2.3(@types/node@20.19.0))': 1449 | dependencies: 1450 | '@typescript-eslint/utils': 8.33.1(eslint@9.28.0)(typescript@5.8.3) 1451 | eslint: 9.28.0 1452 | optionalDependencies: 1453 | typescript: 5.8.3 1454 | vitest: 3.2.3(@types/node@20.19.0) 1455 | transitivePeerDependencies: 1456 | - supports-color 1457 | 1458 | '@vitest/expect@3.2.3': 1459 | dependencies: 1460 | '@types/chai': 5.2.2 1461 | '@vitest/spy': 3.2.3 1462 | '@vitest/utils': 3.2.3 1463 | chai: 5.2.0 1464 | tinyrainbow: 2.0.0 1465 | 1466 | '@vitest/mocker@3.2.3(vite@6.3.5(@types/node@20.19.0))': 1467 | dependencies: 1468 | '@vitest/spy': 3.2.3 1469 | estree-walker: 3.0.3 1470 | magic-string: 0.30.17 1471 | optionalDependencies: 1472 | vite: 6.3.5(@types/node@20.19.0) 1473 | 1474 | '@vitest/pretty-format@3.2.3': 1475 | dependencies: 1476 | tinyrainbow: 2.0.0 1477 | 1478 | '@vitest/runner@3.2.3': 1479 | dependencies: 1480 | '@vitest/utils': 3.2.3 1481 | pathe: 2.0.3 1482 | strip-literal: 3.0.0 1483 | 1484 | '@vitest/snapshot@3.2.3': 1485 | dependencies: 1486 | '@vitest/pretty-format': 3.2.3 1487 | magic-string: 0.30.17 1488 | pathe: 2.0.3 1489 | 1490 | '@vitest/spy@3.2.3': 1491 | dependencies: 1492 | tinyspy: 4.0.3 1493 | 1494 | '@vitest/utils@3.2.3': 1495 | dependencies: 1496 | '@vitest/pretty-format': 3.2.3 1497 | loupe: 3.1.3 1498 | tinyrainbow: 2.0.0 1499 | 1500 | acorn-jsx@5.3.2(acorn@8.14.0): 1501 | dependencies: 1502 | acorn: 8.14.0 1503 | 1504 | acorn@8.14.0: {} 1505 | 1506 | ajv@6.12.6: 1507 | dependencies: 1508 | fast-deep-equal: 3.1.3 1509 | fast-json-stable-stringify: 2.1.0 1510 | json-schema-traverse: 0.4.1 1511 | uri-js: 4.4.1 1512 | 1513 | ansi-styles@4.3.0: 1514 | dependencies: 1515 | color-convert: 2.0.1 1516 | 1517 | argparse@2.0.1: {} 1518 | 1519 | assertion-error@2.0.1: {} 1520 | 1521 | balanced-match@1.0.2: {} 1522 | 1523 | brace-expansion@1.1.11: 1524 | dependencies: 1525 | balanced-match: 1.0.2 1526 | concat-map: 0.0.1 1527 | 1528 | brace-expansion@2.0.1: 1529 | dependencies: 1530 | balanced-match: 1.0.2 1531 | 1532 | braces@3.0.2: 1533 | dependencies: 1534 | fill-range: 7.0.1 1535 | 1536 | cac@6.7.14: {} 1537 | 1538 | callsites@3.1.0: {} 1539 | 1540 | chai@5.2.0: 1541 | dependencies: 1542 | assertion-error: 2.0.1 1543 | check-error: 2.1.1 1544 | deep-eql: 5.0.2 1545 | loupe: 3.1.3 1546 | pathval: 2.0.0 1547 | 1548 | chalk@4.1.2: 1549 | dependencies: 1550 | ansi-styles: 4.3.0 1551 | supports-color: 7.2.0 1552 | 1553 | check-error@2.1.1: {} 1554 | 1555 | color-convert@2.0.1: 1556 | dependencies: 1557 | color-name: 1.1.4 1558 | 1559 | color-name@1.1.4: {} 1560 | 1561 | concat-map@0.0.1: {} 1562 | 1563 | cross-spawn@7.0.6: 1564 | dependencies: 1565 | path-key: 3.1.1 1566 | shebang-command: 2.0.0 1567 | which: 2.0.2 1568 | 1569 | debug@4.4.0: 1570 | dependencies: 1571 | ms: 2.1.3 1572 | 1573 | debug@4.4.1: 1574 | dependencies: 1575 | ms: 2.1.3 1576 | 1577 | deep-eql@5.0.2: {} 1578 | 1579 | deep-is@0.1.4: {} 1580 | 1581 | es-module-lexer@1.7.0: {} 1582 | 1583 | esbuild@0.25.5: 1584 | optionalDependencies: 1585 | '@esbuild/aix-ppc64': 0.25.5 1586 | '@esbuild/android-arm': 0.25.5 1587 | '@esbuild/android-arm64': 0.25.5 1588 | '@esbuild/android-x64': 0.25.5 1589 | '@esbuild/darwin-arm64': 0.25.5 1590 | '@esbuild/darwin-x64': 0.25.5 1591 | '@esbuild/freebsd-arm64': 0.25.5 1592 | '@esbuild/freebsd-x64': 0.25.5 1593 | '@esbuild/linux-arm': 0.25.5 1594 | '@esbuild/linux-arm64': 0.25.5 1595 | '@esbuild/linux-ia32': 0.25.5 1596 | '@esbuild/linux-loong64': 0.25.5 1597 | '@esbuild/linux-mips64el': 0.25.5 1598 | '@esbuild/linux-ppc64': 0.25.5 1599 | '@esbuild/linux-riscv64': 0.25.5 1600 | '@esbuild/linux-s390x': 0.25.5 1601 | '@esbuild/linux-x64': 0.25.5 1602 | '@esbuild/netbsd-arm64': 0.25.5 1603 | '@esbuild/netbsd-x64': 0.25.5 1604 | '@esbuild/openbsd-arm64': 0.25.5 1605 | '@esbuild/openbsd-x64': 0.25.5 1606 | '@esbuild/sunos-x64': 0.25.5 1607 | '@esbuild/win32-arm64': 0.25.5 1608 | '@esbuild/win32-ia32': 0.25.5 1609 | '@esbuild/win32-x64': 0.25.5 1610 | 1611 | escape-string-regexp@4.0.0: {} 1612 | 1613 | eslint-scope@8.3.0: 1614 | dependencies: 1615 | esrecurse: 4.3.0 1616 | estraverse: 5.3.0 1617 | 1618 | eslint-visitor-keys@3.4.3: {} 1619 | 1620 | eslint-visitor-keys@4.2.0: {} 1621 | 1622 | eslint@9.28.0: 1623 | dependencies: 1624 | '@eslint-community/eslint-utils': 4.7.0(eslint@9.28.0) 1625 | '@eslint-community/regexpp': 4.12.1 1626 | '@eslint/config-array': 0.20.0 1627 | '@eslint/config-helpers': 0.2.1 1628 | '@eslint/core': 0.14.0 1629 | '@eslint/eslintrc': 3.3.1 1630 | '@eslint/js': 9.28.0 1631 | '@eslint/plugin-kit': 0.3.1 1632 | '@humanfs/node': 0.16.6 1633 | '@humanwhocodes/module-importer': 1.0.1 1634 | '@humanwhocodes/retry': 0.4.2 1635 | '@types/estree': 1.0.6 1636 | '@types/json-schema': 7.0.15 1637 | ajv: 6.12.6 1638 | chalk: 4.1.2 1639 | cross-spawn: 7.0.6 1640 | debug: 4.4.0 1641 | escape-string-regexp: 4.0.0 1642 | eslint-scope: 8.3.0 1643 | eslint-visitor-keys: 4.2.0 1644 | espree: 10.3.0 1645 | esquery: 1.5.0 1646 | esutils: 2.0.3 1647 | fast-deep-equal: 3.1.3 1648 | file-entry-cache: 8.0.0 1649 | find-up: 5.0.0 1650 | glob-parent: 6.0.2 1651 | ignore: 5.3.1 1652 | imurmurhash: 0.1.4 1653 | is-glob: 4.0.3 1654 | json-stable-stringify-without-jsonify: 1.0.1 1655 | lodash.merge: 4.6.2 1656 | minimatch: 3.1.2 1657 | natural-compare: 1.4.0 1658 | optionator: 0.9.3 1659 | transitivePeerDependencies: 1660 | - supports-color 1661 | 1662 | espree@10.3.0: 1663 | dependencies: 1664 | acorn: 8.14.0 1665 | acorn-jsx: 5.3.2(acorn@8.14.0) 1666 | eslint-visitor-keys: 4.2.0 1667 | 1668 | esquery@1.5.0: 1669 | dependencies: 1670 | estraverse: 5.3.0 1671 | 1672 | esrecurse@4.3.0: 1673 | dependencies: 1674 | estraverse: 5.3.0 1675 | 1676 | estraverse@5.3.0: {} 1677 | 1678 | estree-walker@3.0.3: 1679 | dependencies: 1680 | '@types/estree': 1.0.7 1681 | 1682 | esutils@2.0.3: {} 1683 | 1684 | expect-type@1.2.1: {} 1685 | 1686 | fast-deep-equal@3.1.3: {} 1687 | 1688 | fast-glob@3.3.2: 1689 | dependencies: 1690 | '@nodelib/fs.stat': 2.0.5 1691 | '@nodelib/fs.walk': 1.2.8 1692 | glob-parent: 5.1.2 1693 | merge2: 1.4.1 1694 | micromatch: 4.0.5 1695 | 1696 | fast-json-stable-stringify@2.1.0: {} 1697 | 1698 | fast-levenshtein@2.0.6: {} 1699 | 1700 | fastq@1.17.1: 1701 | dependencies: 1702 | reusify: 1.0.4 1703 | 1704 | fdir@6.4.5(picomatch@4.0.2): 1705 | optionalDependencies: 1706 | picomatch: 4.0.2 1707 | 1708 | file-entry-cache@8.0.0: 1709 | dependencies: 1710 | flat-cache: 4.0.1 1711 | 1712 | fill-range@7.0.1: 1713 | dependencies: 1714 | to-regex-range: 5.0.1 1715 | 1716 | find-up@5.0.0: 1717 | dependencies: 1718 | locate-path: 6.0.0 1719 | path-exists: 4.0.0 1720 | 1721 | flat-cache@4.0.1: 1722 | dependencies: 1723 | flatted: 3.3.1 1724 | keyv: 4.5.4 1725 | 1726 | flatted@3.3.1: {} 1727 | 1728 | fsevents@2.3.3: 1729 | optional: true 1730 | 1731 | glob-parent@5.1.2: 1732 | dependencies: 1733 | is-glob: 4.0.3 1734 | 1735 | glob-parent@6.0.2: 1736 | dependencies: 1737 | is-glob: 4.0.3 1738 | 1739 | globals@14.0.0: {} 1740 | 1741 | graphemer@1.4.0: {} 1742 | 1743 | has-flag@4.0.0: {} 1744 | 1745 | ignore@5.3.1: {} 1746 | 1747 | ignore@7.0.4: {} 1748 | 1749 | import-fresh@3.3.0: 1750 | dependencies: 1751 | parent-module: 1.0.1 1752 | resolve-from: 4.0.0 1753 | 1754 | imurmurhash@0.1.4: {} 1755 | 1756 | is-extglob@2.1.1: {} 1757 | 1758 | is-glob@4.0.3: 1759 | dependencies: 1760 | is-extglob: 2.1.1 1761 | 1762 | is-number@7.0.0: {} 1763 | 1764 | isexe@2.0.0: {} 1765 | 1766 | js-tokens@9.0.1: {} 1767 | 1768 | js-yaml@4.1.0: 1769 | dependencies: 1770 | argparse: 2.0.1 1771 | 1772 | json-buffer@3.0.1: {} 1773 | 1774 | json-schema-traverse@0.4.1: {} 1775 | 1776 | json-stable-stringify-without-jsonify@1.0.1: {} 1777 | 1778 | keyv@4.5.4: 1779 | dependencies: 1780 | json-buffer: 3.0.1 1781 | 1782 | levn@0.4.1: 1783 | dependencies: 1784 | prelude-ls: 1.2.1 1785 | type-check: 0.4.0 1786 | 1787 | locate-path@6.0.0: 1788 | dependencies: 1789 | p-locate: 5.0.0 1790 | 1791 | lodash.merge@4.6.2: {} 1792 | 1793 | loupe@3.1.3: {} 1794 | 1795 | magic-string@0.30.17: 1796 | dependencies: 1797 | '@jridgewell/sourcemap-codec': 1.5.0 1798 | 1799 | merge2@1.4.1: {} 1800 | 1801 | micromatch@4.0.5: 1802 | dependencies: 1803 | braces: 3.0.2 1804 | picomatch: 2.3.1 1805 | 1806 | minimatch@3.1.2: 1807 | dependencies: 1808 | brace-expansion: 1.1.11 1809 | 1810 | minimatch@9.0.4: 1811 | dependencies: 1812 | brace-expansion: 2.0.1 1813 | 1814 | ms@2.1.3: {} 1815 | 1816 | nanoid@3.3.11: {} 1817 | 1818 | natural-compare@1.4.0: {} 1819 | 1820 | optionator@0.9.3: 1821 | dependencies: 1822 | '@aashutoshrathi/word-wrap': 1.2.6 1823 | deep-is: 0.1.4 1824 | fast-levenshtein: 2.0.6 1825 | levn: 0.4.1 1826 | prelude-ls: 1.2.1 1827 | type-check: 0.4.0 1828 | 1829 | p-limit@3.1.0: 1830 | dependencies: 1831 | yocto-queue: 0.1.0 1832 | 1833 | p-locate@5.0.0: 1834 | dependencies: 1835 | p-limit: 3.1.0 1836 | 1837 | parent-module@1.0.1: 1838 | dependencies: 1839 | callsites: 3.1.0 1840 | 1841 | path-exists@4.0.0: {} 1842 | 1843 | path-key@3.1.1: {} 1844 | 1845 | pathe@2.0.3: {} 1846 | 1847 | pathval@2.0.0: {} 1848 | 1849 | picocolors@1.1.1: {} 1850 | 1851 | picomatch@2.3.1: {} 1852 | 1853 | picomatch@4.0.2: {} 1854 | 1855 | pnpm@10.12.1: {} 1856 | 1857 | postcss@8.5.4: 1858 | dependencies: 1859 | nanoid: 3.3.11 1860 | picocolors: 1.1.1 1861 | source-map-js: 1.2.1 1862 | 1863 | prelude-ls@1.2.1: {} 1864 | 1865 | prettier@3.5.3: {} 1866 | 1867 | punycode@2.3.1: {} 1868 | 1869 | queue-microtask@1.2.3: {} 1870 | 1871 | resolve-from@4.0.0: {} 1872 | 1873 | reusify@1.0.4: {} 1874 | 1875 | rollup@4.42.0: 1876 | dependencies: 1877 | '@types/estree': 1.0.7 1878 | optionalDependencies: 1879 | '@rollup/rollup-android-arm-eabi': 4.42.0 1880 | '@rollup/rollup-android-arm64': 4.42.0 1881 | '@rollup/rollup-darwin-arm64': 4.42.0 1882 | '@rollup/rollup-darwin-x64': 4.42.0 1883 | '@rollup/rollup-freebsd-arm64': 4.42.0 1884 | '@rollup/rollup-freebsd-x64': 4.42.0 1885 | '@rollup/rollup-linux-arm-gnueabihf': 4.42.0 1886 | '@rollup/rollup-linux-arm-musleabihf': 4.42.0 1887 | '@rollup/rollup-linux-arm64-gnu': 4.42.0 1888 | '@rollup/rollup-linux-arm64-musl': 4.42.0 1889 | '@rollup/rollup-linux-loongarch64-gnu': 4.42.0 1890 | '@rollup/rollup-linux-powerpc64le-gnu': 4.42.0 1891 | '@rollup/rollup-linux-riscv64-gnu': 4.42.0 1892 | '@rollup/rollup-linux-riscv64-musl': 4.42.0 1893 | '@rollup/rollup-linux-s390x-gnu': 4.42.0 1894 | '@rollup/rollup-linux-x64-gnu': 4.42.0 1895 | '@rollup/rollup-linux-x64-musl': 4.42.0 1896 | '@rollup/rollup-win32-arm64-msvc': 4.42.0 1897 | '@rollup/rollup-win32-ia32-msvc': 4.42.0 1898 | '@rollup/rollup-win32-x64-msvc': 4.42.0 1899 | fsevents: 2.3.3 1900 | 1901 | run-parallel@1.2.0: 1902 | dependencies: 1903 | queue-microtask: 1.2.3 1904 | 1905 | semver@7.7.2: {} 1906 | 1907 | shebang-command@2.0.0: 1908 | dependencies: 1909 | shebang-regex: 3.0.0 1910 | 1911 | shebang-regex@3.0.0: {} 1912 | 1913 | siginfo@2.0.0: {} 1914 | 1915 | source-map-js@1.2.1: {} 1916 | 1917 | stackback@0.0.2: {} 1918 | 1919 | std-env@3.9.0: {} 1920 | 1921 | strip-json-comments@3.1.1: {} 1922 | 1923 | strip-literal@3.0.0: 1924 | dependencies: 1925 | js-tokens: 9.0.1 1926 | 1927 | supports-color@7.2.0: 1928 | dependencies: 1929 | has-flag: 4.0.0 1930 | 1931 | tinybench@2.9.0: {} 1932 | 1933 | tinyexec@0.3.2: {} 1934 | 1935 | tinyglobby@0.2.14: 1936 | dependencies: 1937 | fdir: 6.4.5(picomatch@4.0.2) 1938 | picomatch: 4.0.2 1939 | 1940 | tinypool@1.1.0: {} 1941 | 1942 | tinyrainbow@2.0.0: {} 1943 | 1944 | tinyspy@4.0.3: {} 1945 | 1946 | to-regex-range@5.0.1: 1947 | dependencies: 1948 | is-number: 7.0.0 1949 | 1950 | ts-api-utils@2.1.0(typescript@5.8.3): 1951 | dependencies: 1952 | typescript: 5.8.3 1953 | 1954 | tunnel@0.0.6: {} 1955 | 1956 | type-check@0.4.0: 1957 | dependencies: 1958 | prelude-ls: 1.2.1 1959 | 1960 | typescript-eslint@8.33.1(eslint@9.28.0)(typescript@5.8.3): 1961 | dependencies: 1962 | '@typescript-eslint/eslint-plugin': 8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.28.0)(typescript@5.8.3))(eslint@9.28.0)(typescript@5.8.3) 1963 | '@typescript-eslint/parser': 8.33.1(eslint@9.28.0)(typescript@5.8.3) 1964 | '@typescript-eslint/utils': 8.33.1(eslint@9.28.0)(typescript@5.8.3) 1965 | eslint: 9.28.0 1966 | typescript: 5.8.3 1967 | transitivePeerDependencies: 1968 | - supports-color 1969 | 1970 | typescript@5.8.3: {} 1971 | 1972 | undici-types@6.21.0: {} 1973 | 1974 | undici@5.28.3: 1975 | dependencies: 1976 | '@fastify/busboy': 2.1.1 1977 | 1978 | uri-js@4.4.1: 1979 | dependencies: 1980 | punycode: 2.3.1 1981 | 1982 | vite-node@3.2.3(@types/node@20.19.0): 1983 | dependencies: 1984 | cac: 6.7.14 1985 | debug: 4.4.1 1986 | es-module-lexer: 1.7.0 1987 | pathe: 2.0.3 1988 | vite: 6.3.5(@types/node@20.19.0) 1989 | transitivePeerDependencies: 1990 | - '@types/node' 1991 | - jiti 1992 | - less 1993 | - lightningcss 1994 | - sass 1995 | - sass-embedded 1996 | - stylus 1997 | - sugarss 1998 | - supports-color 1999 | - terser 2000 | - tsx 2001 | - yaml 2002 | 2003 | vite@6.3.5(@types/node@20.19.0): 2004 | dependencies: 2005 | esbuild: 0.25.5 2006 | fdir: 6.4.5(picomatch@4.0.2) 2007 | picomatch: 4.0.2 2008 | postcss: 8.5.4 2009 | rollup: 4.42.0 2010 | tinyglobby: 0.2.14 2011 | optionalDependencies: 2012 | '@types/node': 20.19.0 2013 | fsevents: 2.3.3 2014 | 2015 | vitest@3.2.3(@types/node@20.19.0): 2016 | dependencies: 2017 | '@types/chai': 5.2.2 2018 | '@vitest/expect': 3.2.3 2019 | '@vitest/mocker': 3.2.3(vite@6.3.5(@types/node@20.19.0)) 2020 | '@vitest/pretty-format': 3.2.3 2021 | '@vitest/runner': 3.2.3 2022 | '@vitest/snapshot': 3.2.3 2023 | '@vitest/spy': 3.2.3 2024 | '@vitest/utils': 3.2.3 2025 | chai: 5.2.0 2026 | debug: 4.4.1 2027 | expect-type: 1.2.1 2028 | magic-string: 0.30.17 2029 | pathe: 2.0.3 2030 | picomatch: 4.0.2 2031 | std-env: 3.9.0 2032 | tinybench: 2.9.0 2033 | tinyexec: 0.3.2 2034 | tinyglobby: 0.2.14 2035 | tinypool: 1.1.0 2036 | tinyrainbow: 2.0.0 2037 | vite: 6.3.5(@types/node@20.19.0) 2038 | vite-node: 3.2.3(@types/node@20.19.0) 2039 | why-is-node-running: 2.3.0 2040 | optionalDependencies: 2041 | '@types/node': 20.19.0 2042 | transitivePeerDependencies: 2043 | - jiti 2044 | - less 2045 | - lightningcss 2046 | - msw 2047 | - sass 2048 | - sass-embedded 2049 | - stylus 2050 | - sugarss 2051 | - supports-color 2052 | - terser 2053 | - tsx 2054 | - yaml 2055 | 2056 | which@2.0.2: 2057 | dependencies: 2058 | isexe: 2.0.0 2059 | 2060 | why-is-node-running@2.3.0: 2061 | dependencies: 2062 | siginfo: 2.0.0 2063 | stackback: 0.0.2 2064 | 2065 | yocto-queue@0.1.0: {} 2066 | -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | import * as core from '@actions/core' 2 | import { run } from './run.js' 3 | 4 | const main = async (): Promise => { 5 | const outputs = await run({ 6 | push: core.getBooleanInput('push', { required: true }), 7 | indexAnnotations: core.getMultilineInput('index-annotations'), 8 | tags: core.getMultilineInput('tags'), 9 | sources: core.getMultilineInput('sources', { required: true }), 10 | }) 11 | if (outputs.digest) { 12 | core.info(`Setting outputs.digest=${outputs.digest}`) 13 | core.setOutput('digest', outputs.digest) 14 | } 15 | } 16 | 17 | main().catch((e: Error) => { 18 | core.setFailed(e) 19 | console.error(e) 20 | }) 21 | -------------------------------------------------------------------------------- /src/run.ts: -------------------------------------------------------------------------------- 1 | import assert from 'assert' 2 | import * as core from '@actions/core' 3 | import * as exec from '@actions/exec' 4 | 5 | type Inputs = { 6 | push: boolean 7 | indexAnnotations: string[] 8 | tags: string[] 9 | sources: string[] 10 | } 11 | 12 | type Outputs = { 13 | digest: string | undefined 14 | } 15 | 16 | export const run = async (inputs: Inputs): Promise => { 17 | core.startGroup('Buildx version') 18 | await exec.exec('docker', ['buildx', 'version']) 19 | core.endGroup() 20 | 21 | if (!inputs.push) { 22 | await dryRunCreateManifest(inputs.sources, inputs.indexAnnotations) 23 | return { digest: undefined } 24 | } 25 | 26 | assert(inputs.tags.length > 0, 'tags must be set') 27 | for (const tag of inputs.tags) { 28 | await createManifest(tag, inputs.sources, inputs.indexAnnotations) 29 | } 30 | const digest = await getDigest(inputs.tags[0]) 31 | return { digest } 32 | } 33 | 34 | const dryRunCreateManifest = async (sources: string[], indexAnnotations: string[]) => { 35 | await exec.exec('docker', [ 36 | 'buildx', 37 | 'imagetools', 38 | 'create', 39 | '--dry-run', 40 | ...toAnnotationFlags(indexAnnotations), 41 | ...sources, 42 | ]) 43 | } 44 | 45 | const createManifest = async (destination: string, sources: string[], indexAnnotations: string[]) => { 46 | await exec.exec('docker', [ 47 | 'buildx', 48 | 'imagetools', 49 | 'create', 50 | ...toAnnotationFlags(indexAnnotations), 51 | '-t', 52 | destination, 53 | ...sources, 54 | ]) 55 | await exec.exec('docker', ['buildx', 'imagetools', 'inspect', destination]) 56 | } 57 | 58 | const toAnnotationFlags = (indexAnnotations: string[]): string[] => 59 | indexAnnotations.flatMap((a) => [ 60 | '--annotation', 61 | // https://docs.docker.com/engine/reference/commandline/buildx_imagetools_create/#annotation 62 | `index:${a}`, 63 | ]) 64 | 65 | const getDigest = async (tag: string): Promise => { 66 | const { stdout } = await exec.getExecOutput('docker', [ 67 | 'buildx', 68 | 'imagetools', 69 | 'inspect', 70 | '--format', 71 | '{{json .Manifest.Digest}}', 72 | tag, 73 | ]) 74 | return stdout.replace(/^"|"$/g, '') 75 | } 76 | -------------------------------------------------------------------------------- /tests/fixtures/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM debian:stable 2 | RUN uname -a 3 | -------------------------------------------------------------------------------- /tests/run.test.ts: -------------------------------------------------------------------------------- 1 | import { it, expect, vi, beforeEach } from 'vitest' 2 | import * as exec from '@actions/exec' 3 | import { run } from '../src/run.js' 4 | 5 | vi.mock('@actions/exec') 6 | 7 | beforeEach(() => vi.mocked(exec).exec.mockResolvedValue(0)) 8 | 9 | it('should run docker buildx imagetools', async () => { 10 | vi.mocked(exec).getExecOutput.mockResolvedValue({ 11 | exitCode: 0, 12 | stdout: '"sha256:f000000000000000000000000000000000000000000000000000000000000000"', 13 | stderr: '', 14 | }) 15 | 16 | const outputs = await run({ 17 | push: true, 18 | indexAnnotations: [], 19 | tags: ['ghcr.io/int128/docker-manifest-create-action:main'], 20 | sources: [ 21 | 'ghcr.io/int128/docker-manifest-create-action@sha256:0000000000000000000000000000000000000000000000000000000000000000', 22 | 'ghcr.io/int128/docker-manifest-create-action@sha256:0000000000000000000000000000000000000000000000000000000000000001', 23 | ], 24 | }) 25 | expect(outputs).toStrictEqual({ 26 | digest: 'sha256:f000000000000000000000000000000000000000000000000000000000000000', 27 | }) 28 | 29 | expect(exec.exec).toHaveBeenCalledWith('docker', [ 30 | 'buildx', 31 | 'imagetools', 32 | 'create', 33 | '-t', 34 | 'ghcr.io/int128/docker-manifest-create-action:main', 35 | 'ghcr.io/int128/docker-manifest-create-action@sha256:0000000000000000000000000000000000000000000000000000000000000000', 36 | 'ghcr.io/int128/docker-manifest-create-action@sha256:0000000000000000000000000000000000000000000000000000000000000001', 37 | ]) 38 | expect(exec.exec).toHaveBeenCalledWith('docker', [ 39 | 'buildx', 40 | 'imagetools', 41 | 'inspect', 42 | 'ghcr.io/int128/docker-manifest-create-action:main', 43 | ]) 44 | }) 45 | 46 | it('should run docker buildx imagetools --dry-run if push is false', async () => { 47 | const outputs = await run({ 48 | push: false, 49 | indexAnnotations: [], 50 | tags: [], 51 | sources: [ 52 | 'ghcr.io/int128/docker-manifest-create-action@sha256:0000000000000000000000000000000000000000000000000000000000000000', 53 | 'ghcr.io/int128/docker-manifest-create-action@sha256:0000000000000000000000000000000000000000000000000000000000000001', 54 | ], 55 | }) 56 | expect(outputs).toStrictEqual({ digest: undefined }) 57 | 58 | expect(exec.exec).toHaveBeenCalledWith('docker', [ 59 | 'buildx', 60 | 'imagetools', 61 | 'create', 62 | '--dry-run', 63 | 'ghcr.io/int128/docker-manifest-create-action@sha256:0000000000000000000000000000000000000000000000000000000000000000', 64 | 'ghcr.io/int128/docker-manifest-create-action@sha256:0000000000000000000000000000000000000000000000000000000000000001', 65 | ]) 66 | }) 67 | 68 | it('should add annotations', async () => { 69 | vi.mocked(exec).getExecOutput.mockResolvedValue({ 70 | exitCode: 0, 71 | stdout: '"sha256:f000000000000000000000000000000000000000000000000000000000000000"', 72 | stderr: '', 73 | }) 74 | 75 | const outputs = await run({ 76 | push: true, 77 | indexAnnotations: [ 78 | 'org.opencontainers.image.revision=0123456789012345678901234567890123456789', 79 | 'org.opencontainers.image.created=2021-01-01T00:00:00Z', 80 | ], 81 | tags: ['ghcr.io/int128/docker-manifest-create-action:main'], 82 | sources: [ 83 | 'ghcr.io/int128/docker-manifest-create-action@sha256:0000000000000000000000000000000000000000000000000000000000000000', 84 | ], 85 | }) 86 | expect(outputs).toStrictEqual({ 87 | digest: 'sha256:f000000000000000000000000000000000000000000000000000000000000000', 88 | }) 89 | 90 | expect(exec.exec).toHaveBeenCalledWith('docker', [ 91 | 'buildx', 92 | 'imagetools', 93 | 'create', 94 | '--annotation', 95 | 'index:org.opencontainers.image.revision=0123456789012345678901234567890123456789', 96 | '--annotation', 97 | 'index:org.opencontainers.image.created=2021-01-01T00:00:00Z', 98 | '-t', 99 | 'ghcr.io/int128/docker-manifest-create-action:main', 100 | 'ghcr.io/int128/docker-manifest-create-action@sha256:0000000000000000000000000000000000000000000000000000000000000000', 101 | ]) 102 | expect(exec.exec).toHaveBeenCalledWith('docker', [ 103 | 'buildx', 104 | 'imagetools', 105 | 'inspect', 106 | 'ghcr.io/int128/docker-manifest-create-action:main', 107 | ]) 108 | }) 109 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "extends": "@tsconfig/node20/tsconfig.json" 4 | } 5 | -------------------------------------------------------------------------------- /vitest.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vitest/config' 2 | 3 | export default defineConfig({ 4 | test: { 5 | clearMocks: true, 6 | }, 7 | }) --------------------------------------------------------------------------------