├── .gitignore ├── .mdlintrc ├── .prettierrc.yaml ├── .travis.yml ├── .vscode └── tasks.json ├── CHANGELOG.md ├── LICENSE ├── README.md ├── eslint.config.mjs ├── package-lock.json ├── package.json ├── publish.sh ├── src └── operator.ts ├── tsconfig.json └── version-check.js /.gitignore: -------------------------------------------------------------------------------- 1 | # File created using '.gitignore Generator' for Visual Studio Code: https://bit.ly/vscode-gig 2 | 3 | # Created by https://www.gitignore.io/api/node,visualstudiocode 4 | # Edit at https://www.gitignore.io/?templates=node,visualstudiocode 5 | 6 | ### Node ### 7 | # Logs 8 | logs 9 | *.log 10 | npm-debug.log* 11 | yarn-debug.log* 12 | yarn-error.log* 13 | lerna-debug.log* 14 | 15 | # Diagnostic reports (https://nodejs.org/api/report.html) 16 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 17 | 18 | # Runtime data 19 | pids 20 | *.pid 21 | *.seed 22 | *.pid.lock 23 | 24 | # Directory for instrumented libs generated by jscoverage/JSCover 25 | lib-cov 26 | 27 | # Coverage directory used by tools like istanbul 28 | coverage 29 | *.lcov 30 | 31 | # nyc test coverage 32 | .nyc_output 33 | 34 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 35 | .grunt 36 | 37 | # Bower dependency directory (https://bower.io/) 38 | bower_components 39 | 40 | # node-waf configuration 41 | .lock-wscript 42 | 43 | # Compiled binary addons (https://nodejs.org/api/addons.html) 44 | build/Release 45 | 46 | # Dependency directories 47 | node_modules/ 48 | jspm_packages/ 49 | 50 | # TypeScript v1 declaration files 51 | typings/ 52 | 53 | # TypeScript cache 54 | *.tsbuildinfo 55 | 56 | # Optional npm cache directory 57 | .npm 58 | 59 | # Optional eslint cache 60 | .eslintcache 61 | 62 | # Optional REPL history 63 | .node_repl_history 64 | 65 | # Output of 'npm pack' 66 | *.tgz 67 | 68 | # Yarn Integrity file 69 | .yarn-integrity 70 | 71 | # dotenv environment variables file 72 | .env 73 | .env.test 74 | 75 | # parcel-bundler cache (https://parceljs.org/) 76 | .cache 77 | 78 | # next.js build output 79 | .next 80 | 81 | # nuxt.js build output 82 | .nuxt 83 | 84 | # vuepress build output 85 | .vuepress/dist 86 | 87 | # Serverless directories 88 | .serverless/ 89 | 90 | # FuseBox cache 91 | .fusebox/ 92 | 93 | # DynamoDB Local files 94 | .dynamodb/ 95 | 96 | ### VisualStudioCode ### 97 | .vscode/* 98 | !.vscode/settings.json 99 | !.vscode/tasks.json 100 | !.vscode/launch.json 101 | !.vscode/extensions.json 102 | 103 | ### VisualStudioCode Patch ### 104 | # Ignore all local history of files 105 | .history 106 | 107 | # End of https://www.gitignore.io/api/node,visualstudiocode 108 | 109 | # Custom rules (everything added below won't be overriden by 'Generate .gitignore File' if you use 'Update' option) 110 | 111 | .npmrc 112 | dist 113 | yarn.lock 114 | -------------------------------------------------------------------------------- /.mdlintrc: -------------------------------------------------------------------------------- 1 | { 2 | "default": true, 3 | "MD001": false, 4 | "MD024": false, 5 | "MD025": false, 6 | "MD026": false, 7 | "MD033": false, 8 | "MD013": false 9 | } 10 | -------------------------------------------------------------------------------- /.prettierrc.yaml: -------------------------------------------------------------------------------- 1 | printWidth: 120 2 | tabWidth: 4 3 | semi: true 4 | singleQuote: true 5 | quoteProps: preserve -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - "14" 4 | 5 | before_install: 6 | # Pre check to check that version matches package-lock.json 7 | # needs to happen before npm install 8 | - node version-check.js 9 | 10 | install: 11 | - npm install -g markdownlint-cli 12 | - npm install 13 | 14 | jobs: 15 | include: 16 | - stage: "lint" 17 | name: "Lint" 18 | script: 19 | - npm run lint 20 | - markdownlint -c .mdlintrc *.md 21 | -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | { 2 | // See https://go.microsoft.com/fwlink/?LinkId=733558 3 | // for the documentation about the tasks.json format 4 | "version": "2.0.0", 5 | "tasks": [ 6 | { 7 | "type": "typescript", 8 | "tsconfig": "tsconfig.json", 9 | "problemMatcher": [ 10 | "$tsc" 11 | ] 12 | } 13 | ] 14 | } -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # CHANGELOG 2 | 3 | ### 3.1.0 (2025-03-16) 4 | 5 | - bump @kubernetes/client-node to 1.1.0 6 | - fix CVE-2025-1302 (jsonpath-plus) 7 | - bump some other dependencies 8 | 9 | ### 3.0.0 (2025-02-20) 10 | 11 | - bump @kubernetes/client-node to 1.0.0 12 | - bump some other dependencies 13 | - only support Node 18 or higher 14 | 15 | ### 2.0.0 (2024-12-04) 16 | 17 | - bump @kubernetes/client-node to 0.23.2 18 | - bump gaxios to 6.7.1 19 | - fix other dependencies 20 | - only support Node 18 or higher 21 | 22 | ### 1.3.9 (2023-11-28) 23 | 24 | - bump @kubernetes/client-node to 0.20.0 25 | - bump gaxios to 5.1.3 26 | 27 | ### 1.3.8 (2023-03-21) 28 | 29 | - bump @kubernetes/client-node to 0.18.1 30 | - bump gaxios to 5.1.0 31 | 32 | ### 1.3.7 (2023-01-20) 33 | 34 | - bump @kubernetes/client-node to 0.18.0 35 | 36 | ### 1.3.6 (2022-12-14) 37 | 38 | - bump qs from 6.5.2 to 6.5.3 39 | 40 | ### 1.3.5 (2022-09-19) 41 | 42 | - upgrade dependencies 43 | 44 | ### 1.3.4 (2022-09-19) 45 | 46 | - (dependabot) bump jose from 4.8.3 to 4.9.3 47 | 48 | ### 1.3.3 (2022-08-29) 49 | 50 | - made 'logger' protected 51 | - upgrade dev dependencies 52 | 53 | ### 1.3.2 (2022-07-06) 54 | 55 | - upgrade dependencies 56 | 57 | ### 1.3.1 (2022-06-23) 58 | 59 | - upgrade dependencies 60 | 61 | ### 1.3.0 (2022-05-03) 62 | 63 | - support Node 12 or higher 64 | - switch from axios to gaxios 65 | - add new applyGaxiosKubeConfigAuth() method 66 | 67 | ### 1.2.3 (2022-02-15) 68 | 69 | - upgrade dependencies 70 | 71 | ### 1.2.2 (2022-02-02) 72 | 73 | - upgrade dependencies 74 | - removed use of serialize-error 75 | 76 | ### 1.2.1 (2022-01-16) 77 | 78 | - fix vulnerabilities 79 | - upgrade dependencies 80 | 81 | ### 1.2.0 (2021-11-25) 82 | 83 | - upgrade @kubernetes/client-node to 0.16.1 84 | - upgrade dependencies 85 | - remove support for v1beta1 CRDs 86 | 87 | ### 1.1.7 (2021-09-29) 88 | 89 | - upgrade dependencies 90 | 91 | ### 1.1.6 (2021-09-06) 92 | 93 | - upgrade @kubernetes/client-node to 0.15.1 94 | - upgrade async to 3.2.1 95 | - upgrade axios to 0.21.3 96 | 97 | ### 1.1.5 (2021-08-05) 98 | 99 | - fix CVE-2021-32803 100 | - update @kubernetes/client-node to 0.15.0 101 | - eliminate js-yaml dependency 102 | 103 | ### 1.1.4 (2021-06-15) 104 | 105 | - update dependencies 106 | 107 | ### 1.1.3 (2021-04-29) 108 | 109 | - update @kubernetes/client-node to 0.14.3 110 | - update other dependencies 111 | 112 | ### 1.1.1 (2021-02-22) 113 | 114 | - update @kubernetes/client-node to 0.14.0 115 | 116 | ### 1.1.0 (2021-01-20) 117 | 118 | - support both apiextensions.k8s.io/v1 and apiextensions.k8s.io/v1beta1 119 | - updated dependencies 120 | 121 | ### 1.0.19 (2021-01-06) 122 | 123 | - removed local `ForeverWatch` (obsolete due to latest `@kubernetes/client-node`) 124 | - updated dependencies 125 | 126 | ### 1.0.17 (2020-12-01) 127 | 128 | - using a local `ForeverWatch` until newer `@kubernetes/client-node` is released 129 | - updated dependencies 130 | 131 | ### 1.0.16 (2020-10-26) 132 | 133 | - fixed usage of 'serialize-error' 134 | - updated dependencies 135 | 136 | ### 1.0.15 (2020-10-26) 137 | 138 | - use 'serialize-error' to log errors 139 | 140 | ### 1.0.14 (2020-10-22) 141 | 142 | - replaced direct dependency on 'request' with 'axios' 143 | 144 | ### 1.0.13 (2020-09-22) 145 | 146 | - added stream-buffers to dependencies 147 | 148 | ### 1.0.12 (2020-09-19) 149 | 150 | - updated @kubernetes/client-node to fix security issue found in node-forge 151 | 152 | ### 1.0.11 (2020-09-13) 153 | 154 | - reliability enhancement: end process on watch error now (to force a pod restart) 155 | - upgraded to TypeScript 4.0 156 | 157 | ### 1.0.10 (2020-08-27) 158 | 159 | - updated devDependencies 160 | 161 | ### 1.0.9 (2020-08-17) 162 | 163 | - updated dependencies 164 | 165 | ### 1.0.8 (2020-07-18) 166 | 167 | - updated to latest `lodash` to fix vulnerability 168 | 169 | ### 1.0.7 (2020-07-13) 170 | 171 | - added an `export` to `ResourceMetaImpl` 172 | 173 | ### 1.0.6 (2020-06-19) 174 | 175 | - fixed missing await on kubeConfig.applyToRequest() 176 | 177 | ### 1.0.5 (2020-06-19) 178 | 179 | - update dependencies 180 | 181 | ### 1.0.4 (2020-05-18) 182 | 183 | - Some small tweaking to make error-handling on watches as robust as possible 184 | - Added two debug logs for restarting a watch 185 | 186 | ### 1.0.3 (2020-05-18) 187 | 188 | - `watchResource()` now has an optional `namespace` parameter 189 | - updated dependencies 190 | 191 | ### 1.0.2 (2020-05-04) 192 | 193 | - updated dependency on @kubernetes/client-node to 0.11.2 194 | 195 | ### 1.0.1 (2020-04-06) 196 | 197 | - fixed minimist security advisory warning 198 | 199 | ### 1.0.0 (2020-03-25) 200 | 201 | - graduated to stable 202 | - upgraded some dependencies 203 | 204 | ### 0.6.1 (2020-02-21) 205 | 206 | - back to using `request-promise-native` 207 | 208 | ### 0.6.0 (2020-02-21) 209 | 210 | - removed dependency on `request-promise-native` 211 | - upgraded all dependencies 212 | 213 | ### 0.5.1 (2019-09-25) 214 | 215 | - tweaked `handleResourceFinalizer()` to always return 'true' if the resource is marked for deletion 216 | 217 | #### 0.5.0 (2019-09-24) 218 | 219 | - switched to ESLint _(TSLint is deprecated)_ 220 | - some small breaking changes to interface names due to compliance with standard ESLint rules now (`ResourceEvent`, `ResourceMeta` and `OperatorLogger`) 221 | 222 | #### 0.4.0 (2019-09-17) 223 | 224 | - added `handleResourceFinalizer()` and `setResourceFinalizers()` to easily implement robust handling of the deletion a resource (using finalizers). 225 | 226 | #### 0.3.0 (2019-09-13) 227 | 228 | - Removed `watchCustomResource()` as it made little sense to use this in practice due to the required permissions. Just use `watchResource()`. 229 | - Small tweaks. 230 | 231 | #### 0.3.1 (2019-09-13) 232 | 233 | - Removed `watchCustomResource()` from `README.md`. 234 | - Updated to TypeScript 3.6.3. 235 | 236 | #### 0.2.0 (2019-09-03) 237 | 238 | - Added `patchResourceStatus()` to patch a status object rather than having to set it completely every time. 239 | - Fixed problem with all events running in parallel due to async/await. They are processed consecutively now. 240 | 241 | #### 0.1.0 (2019-07-15) 242 | 243 | - Initial release. 244 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | 2 | Apache License 3 | Version 2.0, January 2004 4 | http://www.apache.org/licenses/ 5 | 6 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 7 | 8 | 1. Definitions. 9 | 10 | "License" shall mean the terms and conditions for use, reproduction, 11 | and distribution as defined by Sections 1 through 9 of this document. 12 | 13 | "Licensor" shall mean the copyright owner or entity authorized by 14 | the copyright owner that is granting the License. 15 | 16 | "Legal Entity" shall mean the union of the acting entity and all 17 | other entities that control, are controlled by, or are under common 18 | control with that entity. For the purposes of this definition, 19 | "control" means (i) the power, direct or indirect, to cause the 20 | direction or management of such entity, whether by contract or 21 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 22 | outstanding shares, or (iii) beneficial ownership of such entity. 23 | 24 | "You" (or "Your") shall mean an individual or Legal Entity 25 | exercising permissions granted by this License. 26 | 27 | "Source" form shall mean the preferred form for making modifications, 28 | including but not limited to software source code, documentation 29 | source, and configuration files. 30 | 31 | "Object" form shall mean any form resulting from mechanical 32 | transformation or translation of a Source form, including but 33 | not limited to compiled object code, generated documentation, 34 | and conversions to other media types. 35 | 36 | "Work" shall mean the work of authorship, whether in Source or 37 | Object form, made available under the License, as indicated by a 38 | copyright notice that is included in or attached to the work 39 | (an example is provided in the Appendix below). 40 | 41 | "Derivative Works" shall mean any work, whether in Source or Object 42 | form, that is based on (or derived from) the Work and for which the 43 | editorial revisions, annotations, elaborations, or other modifications 44 | represent, as a whole, an original work of authorship. For the purposes 45 | of this License, Derivative Works shall not include works that remain 46 | separable from, or merely link (or bind by name) to the interfaces of, 47 | the Work and Derivative Works thereof. 48 | 49 | "Contribution" shall mean any work of authorship, including 50 | the original version of the Work and any modifications or additions 51 | to that Work or Derivative Works thereof, that is intentionally 52 | submitted to Licensor for inclusion in the Work by the copyright owner 53 | or by an individual or Legal Entity authorized to submit on behalf of 54 | the copyright owner. For the purposes of this definition, "submitted" 55 | means any form of electronic, verbal, or written communication sent 56 | to the Licensor or its representatives, including but not limited to 57 | communication on electronic mailing lists, source code control systems, 58 | and issue tracking systems that are managed by, or on behalf of, the 59 | Licensor for the purpose of discussing and improving the Work, but 60 | excluding communication that is conspicuously marked or otherwise 61 | designated in writing by the copyright owner as "Not a Contribution." 62 | 63 | "Contributor" shall mean Licensor and any individual or Legal Entity 64 | on behalf of whom a Contribution has been received by Licensor and 65 | subsequently incorporated within the Work. 66 | 67 | 2. Grant of Copyright License. Subject to the terms and conditions of 68 | this License, each Contributor hereby grants to You a perpetual, 69 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 70 | copyright license to reproduce, prepare Derivative Works of, 71 | publicly display, publicly perform, sublicense, and distribute the 72 | Work and such Derivative Works in Source or Object form. 73 | 74 | 3. Grant of Patent License. Subject to the terms and conditions of 75 | this License, each Contributor hereby grants to You a perpetual, 76 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 77 | (except as stated in this section) patent license to make, have made, 78 | use, offer to sell, sell, import, and otherwise transfer the Work, 79 | where such license applies only to those patent claims licensable 80 | by such Contributor that are necessarily infringed by their 81 | Contribution(s) alone or by combination of their Contribution(s) 82 | with the Work to which such Contribution(s) was submitted. If You 83 | institute patent litigation against any entity (including a 84 | cross-claim or counterclaim in a lawsuit) alleging that the Work 85 | or a Contribution incorporated within the Work constitutes direct 86 | or contributory patent infringement, then any patent licenses 87 | granted to You under this License for that Work shall terminate 88 | as of the date such litigation is filed. 89 | 90 | 4. Redistribution. You may reproduce and distribute copies of the 91 | Work or Derivative Works thereof in any medium, with or without 92 | modifications, and in Source or Object form, provided that You 93 | meet the following conditions: 94 | 95 | (a) You must give any other recipients of the Work or 96 | Derivative Works a copy of this License; and 97 | 98 | (b) You must cause any modified files to carry prominent notices 99 | stating that You changed the files; and 100 | 101 | (c) You must retain, in the Source form of any Derivative Works 102 | that You distribute, all copyright, patent, trademark, and 103 | attribution notices from the Source form of the Work, 104 | excluding those notices that do not pertain to any part of 105 | the Derivative Works; and 106 | 107 | (d) If the Work includes a "NOTICE" text file as part of its 108 | distribution, then any Derivative Works that You distribute must 109 | include a readable copy of the attribution notices contained 110 | within such NOTICE file, excluding those notices that do not 111 | pertain to any part of the Derivative Works, in at least one 112 | of the following places: within a NOTICE text file distributed 113 | as part of the Derivative Works; within the Source form or 114 | documentation, if provided along with the Derivative Works; or, 115 | within a display generated by the Derivative Works, if and 116 | wherever such third-party notices normally appear. The contents 117 | of the NOTICE file are for informational purposes only and 118 | do not modify the License. You may add Your own attribution 119 | notices within Derivative Works that You distribute, alongside 120 | or as an addendum to the NOTICE text from the Work, provided 121 | that such additional attribution notices cannot be construed 122 | as modifying the License. 123 | 124 | You may add Your own copyright statement to Your modifications and 125 | may provide additional or different license terms and conditions 126 | for use, reproduction, or distribution of Your modifications, or 127 | for any such Derivative Works as a whole, provided Your use, 128 | reproduction, and distribution of the Work otherwise complies with 129 | the conditions stated in this License. 130 | 131 | 5. Submission of Contributions. Unless You explicitly state otherwise, 132 | any Contribution intentionally submitted for inclusion in the Work 133 | by You to the Licensor shall be under the terms and conditions of 134 | this License, without any additional terms or conditions. 135 | Notwithstanding the above, nothing herein shall supersede or modify 136 | the terms of any separate license agreement you may have executed 137 | with Licensor regarding such Contributions. 138 | 139 | 6. Trademarks. This License does not grant permission to use the trade 140 | names, trademarks, service marks, or product names of the Licensor, 141 | except as required for reasonable and customary use in describing the 142 | origin of the Work and reproducing the content of the NOTICE file. 143 | 144 | 7. Disclaimer of Warranty. Unless required by applicable law or 145 | agreed to in writing, Licensor provides the Work (and each 146 | Contributor provides its Contributions) on an "AS IS" BASIS, 147 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 148 | implied, including, without limitation, any warranties or conditions 149 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 150 | PARTICULAR PURPOSE. You are solely responsible for determining the 151 | appropriateness of using or redistributing the Work and assume any 152 | risks associated with Your exercise of permissions under this License. 153 | 154 | 8. Limitation of Liability. In no event and under no legal theory, 155 | whether in tort (including negligence), contract, or otherwise, 156 | unless required by applicable law (such as deliberate and grossly 157 | negligent acts) or agreed to in writing, shall any Contributor be 158 | liable to You for damages, including any direct, indirect, special, 159 | incidental, or consequential damages of any character arising as a 160 | result of this License or out of the use or inability to use the 161 | Work (including but not limited to damages for loss of goodwill, 162 | work stoppage, computer failure or malfunction, or any and all 163 | other commercial damages or losses), even if such Contributor 164 | has been advised of the possibility of such damages. 165 | 166 | 9. Accepting Warranty or Additional Liability. While redistributing 167 | the Work or Derivative Works thereof, You may choose to offer, 168 | and charge a fee for, acceptance of support, warranty, indemnity, 169 | or other liability obligations and/or rights consistent with this 170 | License. However, in accepting such obligations, You may act only 171 | on Your own behalf and on Your sole responsibility, not on behalf 172 | of any other Contributor, and only if You agree to indemnify, 173 | defend, and hold each Contributor harmless for any liability 174 | incurred by, or claims asserted against, such Contributor by reason 175 | of your accepting any such warranty or additional liability. 176 | 177 | END OF TERMS AND CONDITIONS 178 | 179 | APPENDIX: How to apply the Apache License to your work. 180 | 181 | To apply the Apache License to your work, attach the following 182 | boilerplate notice, with the fields enclosed by brackets "[]" 183 | replaced with your own identifying information. (Don't include 184 | the brackets!) The text should be enclosed in the appropriate 185 | comment syntax for the file format. We also recommend that a 186 | file or class name and description of purpose be included on the 187 | same "printed page" as the copyright notice for easier 188 | identification within third-party archives. 189 | 190 | Copyright [yyyy] [name of copyright owner] 191 | 192 | Licensed under the Apache License, Version 2.0 (the "License"); 193 | you may not use this file except in compliance with the License. 194 | You may obtain a copy of the License at 195 | 196 | http://www.apache.org/licenses/LICENSE-2.0 197 | 198 | Unless required by applicable law or agreed to in writing, software 199 | distributed under the License is distributed on an "AS IS" BASIS, 200 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 201 | See the License for the specific language governing permissions and 202 | limitations under the License. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # NodeJS Kubernetes operator framework 2 | 3 | [![Build Status](https://app.travis-ci.com/dot-i/k8s-operator-node.svg?branch=master)](https://app.travis-ci.com/github/dot-i/k8s-operator-node) 4 | [![Version](https://img.shields.io/github/package-json/v/dot-i/k8s-operator-node.svg)](https://www.npmjs.com/package/@dot-i/k8s-operator) 5 | ![node](https://img.shields.io/badge/node-%3E=10-blue.svg) 6 | 7 | The **NodeJS** operator framework for **Kubernetes** is implemented in 8 | [TypeScript](https://www.typescriptlang.org), but can be called from either 9 | Javascript or TypeScript. 10 | 11 | The operator framework is implemented for server-side use with node 12 | using the `@kubernetes/client-node` library. 13 | 14 | ## Installation 15 | 16 | ```console 17 | npm install @dot-i/k8s-operator 18 | ``` 19 | 20 | ## Basic usage 21 | 22 | ### Operator class 23 | 24 | To implement your operator and watch one or more resources, create a sub-class from `Operator`. 25 | 26 | ```javascript 27 | import Operator from '@dot-i/k8s-operator'; 28 | 29 | export default class MyOperator extends Operator { 30 | protected async init() { 31 | // ... 32 | } 33 | } 34 | ``` 35 | 36 | You can add as many watches as you want from your `init()` method, both on standard or custom resources. 37 | 38 | Create the singleton instance of your operator in your `main()` at startup time and `start()` it. Before exiting call `stop()`. 39 | 40 | ```javascript 41 | const operator = new MyOperator(); 42 | await operator.start(); 43 | 44 | const exit = (reason: string) => { 45 | operator.stop(); 46 | process.exit(0); 47 | }; 48 | 49 | process.on('SIGTERM', () => exit('SIGTERM')) 50 | .on('SIGINT', () => exit('SIGINT')); 51 | ``` 52 | 53 | ### Operator methods 54 | 55 | #### constructor 56 | 57 | You can pass on optional logger to the constructor. It must implement this interface: 58 | 59 | ```javascript 60 | interface OperatorLogger { 61 | info(message: string): void; 62 | debug(message: string): void; 63 | warn(message: string): void; 64 | error(message: string): void; 65 | } 66 | ``` 67 | 68 | #### init 69 | 70 | ```javascript 71 | protected abstract async init(): Promise 72 | ``` 73 | 74 | Implement this method on your own operator class to initialize one or more resource watches. Call `watchResource()` on as many resources as you need. 75 | 76 | *NOTE:* if you need to initialize other things, place your watches at the end of the `init()` method to avoid running the risk of accessing uninitialized dependencies. 77 | 78 | #### watchResource 79 | 80 | ```javascript 81 | protected async watchResource(group: string, version: string, plural: string, 82 | onEvent: (event: ResourceEvent) => Promise, namespace?: string): Promise 83 | ``` 84 | 85 | Start watching a **Kubernetes** resource. Pass in the resource's group, version and plural name. For "core" resources `group` must be set to an empty string. The last parameter is optional and allows you to limit the watch to the given namespace. 86 | 87 | The `onEvent` callback will be called for each resource event that comes in from the **Kubernetes** API. 88 | 89 | A resource event is defined as follows: 90 | 91 | ```javascript 92 | interface ResourceEvent { 93 | meta: ResourceMeta; 94 | type: ResourceEventType; 95 | object: any; 96 | } 97 | 98 | interface ResourceMeta { 99 | name: string; 100 | namespace: string; 101 | id: string; 102 | resourceVersion: string; 103 | apiVersion: string; 104 | kind: string; 105 | } 106 | 107 | enum ResourceEventType { 108 | Added = 'ADDED', 109 | Modified = 'MODIFIED', 110 | Deleted = 'DELETED' 111 | } 112 | ``` 113 | 114 | `object` will contain the actual resource object as received from the **Kubernetes** API. 115 | 116 | #### setResourceStatus 117 | 118 | ```javascript 119 | protected async setResourceStatus(meta: ResourceMeta, status: any): Promise 120 | ``` 121 | 122 | If your custom resource definition contains a status section you can set the status of your resources using `setResourceStatus()`. The resource object to set the status on is identified by passing in the `meta` field from the event you received. 123 | 124 | #### patchResourceStatus 125 | 126 | ```javascript 127 | protected async patchResourceStatus(meta: ResourceMeta, status: any): Promise 128 | ``` 129 | 130 | If your custom resource definition contains a status section you can patch the status of your resources using `patchResourceStatus()`. The resource object to set the status on is identified by passing in the `meta` field from the event you received. `status` is a JSON Merge patch object as described in **RFC 7386** (). 131 | 132 | #### handleResourceFinalizer 133 | 134 | ```javascript 135 | protected async handleResourceFinalizer(event: ResourceEvent, finalizer: string, 136 | deleteAction: (event: ResourceEvent) => Promise): Promise 137 | ``` 138 | 139 | Handle deletion of your resource using your unique finalizer. 140 | 141 | If the resource doesn't have your finalizer set yet, it will be added. If the finalizer is set and the resource is marked for deletion by **Kubernetes** your `deleteAction` action will be called and the finalizer will be removed (so **Kubernetes** will actually delete it). 142 | 143 | If this method returns `true` the event is fully handled, if it returns `false` you still need to process the added or modified event. 144 | 145 | #### setResourceFinalizers 146 | 147 | ```javascript 148 | protected async setResourceFinalizers(meta: ResourceMeta, finalizers: string[]): Promise 149 | ``` 150 | 151 | Set the finalizers on the **Kubernetes** resource defined by `meta`. Typically you will not use this method, but use `handleResourceFinalizer` to handle the complete delete logic. 152 | 153 | #### registerCustomResourceDefinition 154 | 155 | ```javascript 156 | protected async registerCustomResourceDefinition(crdFile: string): Promise<{ 157 | group: string; 158 | versions: any; 159 | plural: string; 160 | }> 161 | ``` 162 | 163 | You can optionally register a custom resource definition from code, to auto-create it when the operator is deployed and first run. 164 | 165 | ## Examples 166 | 167 | ### Operator that watches namespaces 168 | 169 | ```javascript 170 | import Operator, { ResourceEventType, ResourceEvent } from '@dot-i/k8s-operator'; 171 | 172 | export default class MyOperator extends Operator { 173 | protected async init() { 174 | await this.watchResource('', 'v1', 'namespaces', async (e) => { 175 | const object = e.object; 176 | const metadata = object.metadata; 177 | switch (e.type) { 178 | case ResourceEventType.Added: 179 | // do something useful here 180 | break; 181 | case ResourceEventType.Modified: 182 | // do something useful here 183 | break; 184 | case ResourceEventType.Deleted: 185 | // do something useful here 186 | break; 187 | } 188 | }); 189 | } 190 | } 191 | ``` 192 | 193 | ### Operator that watches a custom resource 194 | 195 | You will typicall create an interface to define your custom resource: 196 | 197 | ```javascript 198 | export interface MyCustomResource extends KubernetesObject { 199 | spec: MyCustomResourceSpec; 200 | status: MyCustomResourceStatus; 201 | } 202 | 203 | export interface MyCustomResourceSpec { 204 | foo: string; 205 | bar?: number; 206 | } 207 | 208 | export interface MyCustomResourceStatus { 209 | observedGeneration?: number; 210 | } 211 | ``` 212 | 213 | Your operator can then watch your resource like this: 214 | 215 | ```javascript 216 | import Operator, { ResourceEventType, ResourceEvent } from '@dot-i/k8s-operator'; 217 | 218 | export default class MyOperator extends Operator { 219 | constructor() { 220 | super(/* pass in optional logger*/); 221 | } 222 | 223 | protected async init() { 224 | // NOTE: we pass the plural name of the resource 225 | await this.watchResource('dot-i.com', 'v1', 'mycustomresources', async (e) => { 226 | try { 227 | if (e.type === ResourceEventType.Added || e.type === ResourceEventType.Modified) { 228 | if (!await this.handleResourceFinalizer(e, 'mycustomresources.dot-i.com', (event) => this.resourceDeleted(event))) { 229 | await this.resourceModified(e); 230 | } 231 | } 232 | } catch (err) { 233 | // Log here... 234 | } 235 | }); 236 | } 237 | 238 | private async resourceModified(e: ResourceEvent) { 239 | const object = e.object as MyCustomResource; 240 | const metadata = object.metadata; 241 | 242 | if (!object.status || object.status.observedGeneration !== metadata.generation) { 243 | 244 | // TODO: handle resource modification here 245 | 246 | await this.setResourceStatus(e.meta, { 247 | observedGeneration: metadata.generation 248 | }); 249 | } 250 | } 251 | 252 | private async resourceDeleted(e: ResourceEvent) { 253 | // TODO: handle resource deletion here 254 | } 255 | } 256 | ``` 257 | 258 | ### Register a custom resource definition from the operator 259 | 260 | It is possible to register a custom resource definition directly from the operator code, from your `init()` method. 261 | 262 | Be aware your operator will need the required roles to be able do this. It's recommended to create the CRD as part of the installation of your operator. 263 | 264 | ```javascript 265 | import * as Path from 'path'; 266 | 267 | export default class MyCustomResourceOperator extends Operator { 268 | protected async init() { 269 | const crdFile = Path.resolve(__dirname, '..', 'your-crd.yaml'); 270 | const { group, versions, plural } = await this.registerCustomResourceDefinition(crdFile); 271 | await this.watchResource(group, versions[0].name, plural, async (e) => { 272 | // ... 273 | }); 274 | } 275 | } 276 | ``` 277 | 278 | ## Development 279 | 280 | All dependencies of this project are expressed in its [`package.json`](package.json) file. Before you start developing, ensure 281 | that you have [NPM](https://www.npmjs.com/) installed, then run: 282 | 283 | ```console 284 | npm install 285 | ``` 286 | 287 | ### Formatting 288 | 289 | Install an editor plugin like [https://github.com/prettier/prettier-vscode](https://github.com/prettier/prettier-vscode) and [https://marketplace.visualstudio.com/items?itemName=EditorConfig.EditorConfig](https://marketplace.visualstudio.com/items?itemName=EditorConfig.EditorConfig). 290 | 291 | ### Linting 292 | 293 | Run `npm run lint` or install an editor plugin like [https://github.com/Microsoft/vscode-typescript-tslint-plugin](https://github.com/Microsoft/vscode-typescript-tslint-plugin). 294 | -------------------------------------------------------------------------------- /eslint.config.mjs: -------------------------------------------------------------------------------- 1 | import eslint from '@eslint/js'; 2 | import tseslint from 'typescript-eslint'; 3 | 4 | export default tseslint.config(eslint.configs.recommended, tseslint.configs.recommended); 5 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@dot-i/k8s-operator", 3 | "version": "3.1.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "@dot-i/k8s-operator", 9 | "version": "3.1.0", 10 | "license": "Apache-2.0", 11 | "dependencies": { 12 | "@kubernetes/client-node": "^1.1.0", 13 | "async": "^3.2.6", 14 | "gaxios": "^6.7.1" 15 | }, 16 | "devDependencies": { 17 | "@eslint/js": "^9.22.0", 18 | "@types/async": "^3.2.24", 19 | "@types/byline": "^4.2.36", 20 | "@types/js-yaml": "^4.0.9", 21 | "@types/node": "^18", 22 | "@types/ws": "^8.18.0", 23 | "eslint": "^9.22.0", 24 | "mkdirp": "^3.0.1", 25 | "ts-node": "^10.9.2", 26 | "typescript": "^5.8.2", 27 | "typescript-eslint": "^8.26.1" 28 | }, 29 | "engines": { 30 | "node": ">=18" 31 | } 32 | }, 33 | "node_modules/@cspotcode/source-map-support": { 34 | "version": "0.8.1", 35 | "resolved": "https://registry.npmjs.org/@cspotcode%2fsource-map-support/-/source-map-support-0.8.1.tgz", 36 | "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", 37 | "dev": true, 38 | "license": "MIT", 39 | "dependencies": { 40 | "@jridgewell/trace-mapping": "0.3.9" 41 | }, 42 | "engines": { 43 | "node": ">=12" 44 | } 45 | }, 46 | "node_modules/@eslint-community/eslint-utils": { 47 | "version": "4.4.1", 48 | "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", 49 | "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", 50 | "dev": true, 51 | "license": "MIT", 52 | "dependencies": { 53 | "eslint-visitor-keys": "^3.4.3" 54 | }, 55 | "engines": { 56 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 57 | }, 58 | "funding": { 59 | "url": "https://opencollective.com/eslint" 60 | }, 61 | "peerDependencies": { 62 | "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" 63 | } 64 | }, 65 | "node_modules/@eslint-community/regexpp": { 66 | "version": "4.12.1", 67 | "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", 68 | "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", 69 | "dev": true, 70 | "license": "MIT", 71 | "engines": { 72 | "node": "^12.0.0 || ^14.0.0 || >=16.0.0" 73 | } 74 | }, 75 | "node_modules/@eslint/config-array": { 76 | "version": "0.19.2", 77 | "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.2.tgz", 78 | "integrity": "sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==", 79 | "dev": true, 80 | "license": "Apache-2.0", 81 | "dependencies": { 82 | "@eslint/object-schema": "^2.1.6", 83 | "debug": "^4.3.1", 84 | "minimatch": "^3.1.2" 85 | }, 86 | "engines": { 87 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 88 | } 89 | }, 90 | "node_modules/@eslint/config-helpers": { 91 | "version": "0.1.0", 92 | "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.1.0.tgz", 93 | "integrity": "sha512-kLrdPDJE1ckPo94kmPPf9Hfd0DU0Jw6oKYrhe+pwSC0iTUInmTa+w6fw8sGgcfkFJGNdWOUeOaDM4quW4a7OkA==", 94 | "dev": true, 95 | "license": "Apache-2.0", 96 | "engines": { 97 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 98 | } 99 | }, 100 | "node_modules/@eslint/core": { 101 | "version": "0.12.0", 102 | "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.12.0.tgz", 103 | "integrity": "sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==", 104 | "dev": true, 105 | "license": "Apache-2.0", 106 | "dependencies": { 107 | "@types/json-schema": "^7.0.15" 108 | }, 109 | "engines": { 110 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 111 | } 112 | }, 113 | "node_modules/@eslint/eslintrc": { 114 | "version": "3.3.0", 115 | "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.0.tgz", 116 | "integrity": "sha512-yaVPAiNAalnCZedKLdR21GOGILMLKPyqSLWaAjQFvYA2i/ciDi8ArYVr69Anohb6cH2Ukhqti4aFnYyPm8wdwQ==", 117 | "dev": true, 118 | "license": "MIT", 119 | "dependencies": { 120 | "ajv": "^6.12.4", 121 | "debug": "^4.3.2", 122 | "espree": "^10.0.1", 123 | "globals": "^14.0.0", 124 | "ignore": "^5.2.0", 125 | "import-fresh": "^3.2.1", 126 | "js-yaml": "^4.1.0", 127 | "minimatch": "^3.1.2", 128 | "strip-json-comments": "^3.1.1" 129 | }, 130 | "engines": { 131 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 132 | }, 133 | "funding": { 134 | "url": "https://opencollective.com/eslint" 135 | } 136 | }, 137 | "node_modules/@eslint/js": { 138 | "version": "9.22.0", 139 | "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.22.0.tgz", 140 | "integrity": "sha512-vLFajx9o8d1/oL2ZkpMYbkLv8nDB6yaIwFNt7nI4+I80U/z03SxmfOMsLbvWr3p7C+Wnoh//aOu2pQW8cS0HCQ==", 141 | "dev": true, 142 | "license": "MIT", 143 | "engines": { 144 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 145 | } 146 | }, 147 | "node_modules/@eslint/object-schema": { 148 | "version": "2.1.6", 149 | "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", 150 | "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", 151 | "dev": true, 152 | "license": "Apache-2.0", 153 | "engines": { 154 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 155 | } 156 | }, 157 | "node_modules/@eslint/plugin-kit": { 158 | "version": "0.2.7", 159 | "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.7.tgz", 160 | "integrity": "sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==", 161 | "dev": true, 162 | "license": "Apache-2.0", 163 | "dependencies": { 164 | "@eslint/core": "^0.12.0", 165 | "levn": "^0.4.1" 166 | }, 167 | "engines": { 168 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 169 | } 170 | }, 171 | "node_modules/@humanfs/core": { 172 | "version": "0.19.1", 173 | "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", 174 | "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", 175 | "dev": true, 176 | "license": "Apache-2.0", 177 | "engines": { 178 | "node": ">=18.18.0" 179 | } 180 | }, 181 | "node_modules/@humanfs/node": { 182 | "version": "0.16.6", 183 | "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", 184 | "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", 185 | "dev": true, 186 | "license": "Apache-2.0", 187 | "dependencies": { 188 | "@humanfs/core": "^0.19.1", 189 | "@humanwhocodes/retry": "^0.3.0" 190 | }, 191 | "engines": { 192 | "node": ">=18.18.0" 193 | } 194 | }, 195 | "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { 196 | "version": "0.3.1", 197 | "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", 198 | "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", 199 | "dev": true, 200 | "license": "Apache-2.0", 201 | "engines": { 202 | "node": ">=18.18" 203 | }, 204 | "funding": { 205 | "type": "github", 206 | "url": "https://github.com/sponsors/nzakas" 207 | } 208 | }, 209 | "node_modules/@humanwhocodes/module-importer": { 210 | "version": "1.0.1", 211 | "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", 212 | "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", 213 | "dev": true, 214 | "license": "Apache-2.0", 215 | "engines": { 216 | "node": ">=12.22" 217 | }, 218 | "funding": { 219 | "type": "github", 220 | "url": "https://github.com/sponsors/nzakas" 221 | } 222 | }, 223 | "node_modules/@humanwhocodes/retry": { 224 | "version": "0.4.2", 225 | "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.2.tgz", 226 | "integrity": "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==", 227 | "dev": true, 228 | "license": "Apache-2.0", 229 | "engines": { 230 | "node": ">=18.18" 231 | }, 232 | "funding": { 233 | "type": "github", 234 | "url": "https://github.com/sponsors/nzakas" 235 | } 236 | }, 237 | "node_modules/@isaacs/cliui": { 238 | "version": "8.0.2", 239 | "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", 240 | "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", 241 | "license": "ISC", 242 | "dependencies": { 243 | "string-width": "^5.1.2", 244 | "string-width-cjs": "npm:string-width@^4.2.0", 245 | "strip-ansi": "^7.0.1", 246 | "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", 247 | "wrap-ansi": "^8.1.0", 248 | "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" 249 | }, 250 | "engines": { 251 | "node": ">=12" 252 | } 253 | }, 254 | "node_modules/@isaacs/cliui/node_modules/ansi-regex": { 255 | "version": "6.1.0", 256 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", 257 | "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", 258 | "license": "MIT", 259 | "engines": { 260 | "node": ">=12" 261 | }, 262 | "funding": { 263 | "url": "https://github.com/chalk/ansi-regex?sponsor=1" 264 | } 265 | }, 266 | "node_modules/@isaacs/cliui/node_modules/strip-ansi": { 267 | "version": "7.1.0", 268 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", 269 | "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", 270 | "license": "MIT", 271 | "dependencies": { 272 | "ansi-regex": "^6.0.1" 273 | }, 274 | "engines": { 275 | "node": ">=12" 276 | }, 277 | "funding": { 278 | "url": "https://github.com/chalk/strip-ansi?sponsor=1" 279 | } 280 | }, 281 | "node_modules/@isaacs/fs-minipass": { 282 | "version": "4.0.1", 283 | "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", 284 | "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", 285 | "license": "ISC", 286 | "dependencies": { 287 | "minipass": "^7.0.4" 288 | }, 289 | "engines": { 290 | "node": ">=18.0.0" 291 | } 292 | }, 293 | "node_modules/@isaacs/fs-minipass/node_modules/minipass": { 294 | "version": "7.1.2", 295 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", 296 | "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", 297 | "license": "ISC", 298 | "engines": { 299 | "node": ">=16 || 14 >=14.17" 300 | } 301 | }, 302 | "node_modules/@jridgewell/trace-mapping": { 303 | "version": "0.3.9", 304 | "resolved": "https://registry.npmjs.org/@jridgewell%2ftrace-mapping/-/trace-mapping-0.3.9.tgz", 305 | "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", 306 | "dev": true, 307 | "license": "MIT", 308 | "dependencies": { 309 | "@jridgewell/resolve-uri": "^3.0.3", 310 | "@jridgewell/sourcemap-codec": "^1.4.10" 311 | } 312 | }, 313 | "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/resolve-uri": { 314 | "version": "3.1.2", 315 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", 316 | "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", 317 | "dev": true, 318 | "license": "MIT", 319 | "engines": { 320 | "node": ">=6.0.0" 321 | } 322 | }, 323 | "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { 324 | "version": "1.5.0", 325 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", 326 | "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", 327 | "dev": true, 328 | "license": "MIT" 329 | }, 330 | "node_modules/@jsep-plugin/assignment": { 331 | "version": "1.3.0", 332 | "resolved": "https://registry.npmjs.org/@jsep-plugin/assignment/-/assignment-1.3.0.tgz", 333 | "integrity": "sha512-VVgV+CXrhbMI3aSusQyclHkenWSAm95WaiKrMxRFam3JSUiIaQjoMIw2sEs/OX4XifnqeQUN4DYbJjlA8EfktQ==", 334 | "license": "MIT", 335 | "engines": { 336 | "node": ">= 10.16.0" 337 | }, 338 | "peerDependencies": { 339 | "jsep": "^0.4.0||^1.0.0" 340 | } 341 | }, 342 | "node_modules/@jsep-plugin/regex": { 343 | "version": "1.0.4", 344 | "resolved": "https://registry.npmjs.org/@jsep-plugin/regex/-/regex-1.0.4.tgz", 345 | "integrity": "sha512-q7qL4Mgjs1vByCaTnDFcBnV9HS7GVPJX5vyVoCgZHNSC9rjwIlmbXG5sUuorR5ndfHAIlJ8pVStxvjXHbNvtUg==", 346 | "license": "MIT", 347 | "engines": { 348 | "node": ">= 10.16.0" 349 | }, 350 | "peerDependencies": { 351 | "jsep": "^0.4.0||^1.0.0" 352 | } 353 | }, 354 | "node_modules/@kubernetes/client-node": { 355 | "version": "1.1.0", 356 | "resolved": "https://registry.npmjs.org/@kubernetes/client-node/-/client-node-1.1.0.tgz", 357 | "integrity": "sha512-6Sp7ekNfMmDH2HvEQLb8vuPu+mX0xNkPElQLX5N/mjxeMimFWfecZeiFfIaG+Q9S1v+snZfTNJjvpOwNUVO7RA==", 358 | "license": "Apache-2.0", 359 | "dependencies": { 360 | "@types/js-yaml": "^4.0.1", 361 | "@types/node": "^22.0.0", 362 | "@types/node-fetch": "^2.6.9", 363 | "@types/stream-buffers": "^3.0.3", 364 | "@types/tar": "^6.1.1", 365 | "@types/ws": "^8.5.4", 366 | "form-data": "^4.0.0", 367 | "hpagent": "^1.2.0", 368 | "isomorphic-ws": "^5.0.0", 369 | "js-yaml": "^4.1.0", 370 | "jsonpath-plus": "^10.3.0", 371 | "node-fetch": "^2.6.9", 372 | "openid-client": "^6.1.3", 373 | "rfc4648": "^1.3.0", 374 | "socks-proxy-agent": "^8.0.4", 375 | "stream-buffers": "^3.0.2", 376 | "tar": "^7.0.0", 377 | "tmp-promise": "^3.0.2", 378 | "ws": "^8.18.0" 379 | } 380 | }, 381 | "node_modules/@kubernetes/client-node/node_modules/@types/node": { 382 | "version": "22.13.4", 383 | "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.4.tgz", 384 | "integrity": "sha512-ywP2X0DYtX3y08eFVx5fNIw7/uIv8hYUKgXoK8oayJlLnKcRfEYCxWMVE1XagUdVtCJlZT1AU4LXEABW+L1Peg==", 385 | "license": "MIT", 386 | "dependencies": { 387 | "undici-types": "~6.20.0" 388 | } 389 | }, 390 | "node_modules/@kubernetes/client-node/node_modules/undici-types": { 391 | "version": "6.20.0", 392 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", 393 | "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", 394 | "license": "MIT" 395 | }, 396 | "node_modules/@nodelib/fs.scandir": { 397 | "version": "2.1.5", 398 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 399 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 400 | "dev": true, 401 | "license": "MIT", 402 | "dependencies": { 403 | "@nodelib/fs.stat": "2.0.5", 404 | "run-parallel": "^1.1.9" 405 | }, 406 | "engines": { 407 | "node": ">= 8" 408 | } 409 | }, 410 | "node_modules/@nodelib/fs.stat": { 411 | "version": "2.0.5", 412 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 413 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 414 | "dev": true, 415 | "license": "MIT", 416 | "engines": { 417 | "node": ">= 8" 418 | } 419 | }, 420 | "node_modules/@nodelib/fs.walk": { 421 | "version": "1.2.8", 422 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 423 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 424 | "dev": true, 425 | "license": "MIT", 426 | "dependencies": { 427 | "@nodelib/fs.scandir": "2.1.5", 428 | "fastq": "^1.6.0" 429 | }, 430 | "engines": { 431 | "node": ">= 8" 432 | } 433 | }, 434 | "node_modules/@pkgjs/parseargs": { 435 | "version": "0.11.0", 436 | "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", 437 | "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", 438 | "license": "MIT", 439 | "optional": true, 440 | "engines": { 441 | "node": ">=14" 442 | } 443 | }, 444 | "node_modules/@tsconfig/node10": { 445 | "version": "1.0.11", 446 | "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", 447 | "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", 448 | "dev": true, 449 | "license": "MIT" 450 | }, 451 | "node_modules/@tsconfig/node12": { 452 | "version": "1.0.11", 453 | "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", 454 | "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", 455 | "dev": true, 456 | "license": "MIT" 457 | }, 458 | "node_modules/@tsconfig/node14": { 459 | "version": "1.0.3", 460 | "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", 461 | "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", 462 | "dev": true, 463 | "license": "MIT" 464 | }, 465 | "node_modules/@tsconfig/node16": { 466 | "version": "1.0.4", 467 | "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", 468 | "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", 469 | "dev": true, 470 | "license": "MIT" 471 | }, 472 | "node_modules/@types/async": { 473 | "version": "3.2.24", 474 | "resolved": "https://registry.npmjs.org/@types/async/-/async-3.2.24.tgz", 475 | "integrity": "sha512-8iHVLHsCCOBKjCF2KwFe0p9Z3rfM9mL+sSP8btyR5vTjJRAqpBYD28/ZLgXPf0pjG1VxOvtCV/BgXkQbpSe8Hw==", 476 | "dev": true, 477 | "license": "MIT" 478 | }, 479 | "node_modules/@types/byline": { 480 | "version": "4.2.36", 481 | "resolved": "https://registry.npmjs.org/@types/byline/-/byline-4.2.36.tgz", 482 | "integrity": "sha512-dO55KDSaOSE+3T8TwP66mzn0u/PM/aSedVMr1tby7WBNjfLIuS6IbYXi1mlau49sVSVB+gXKJscWE0JO3tlXDw==", 483 | "dev": true, 484 | "license": "MIT", 485 | "dependencies": { 486 | "@types/node": "*" 487 | } 488 | }, 489 | "node_modules/@types/estree": { 490 | "version": "1.0.6", 491 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", 492 | "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", 493 | "dev": true, 494 | "license": "MIT" 495 | }, 496 | "node_modules/@types/js-yaml": { 497 | "version": "4.0.9", 498 | "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz", 499 | "integrity": "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==", 500 | "license": "MIT" 501 | }, 502 | "node_modules/@types/json-schema": { 503 | "version": "7.0.15", 504 | "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", 505 | "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", 506 | "dev": true, 507 | "license": "MIT" 508 | }, 509 | "node_modules/@types/node": { 510 | "version": "18.19.67", 511 | "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.67.tgz", 512 | "integrity": "sha512-wI8uHusga+0ZugNp0Ol/3BqQfEcCCNfojtO6Oou9iVNGPTL6QNSdnUdqq85fRgIorLhLMuPIKpsN98QE9Nh+KQ==", 513 | "license": "MIT", 514 | "dependencies": { 515 | "undici-types": "~5.26.4" 516 | } 517 | }, 518 | "node_modules/@types/node-fetch": { 519 | "version": "2.6.12", 520 | "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.12.tgz", 521 | "integrity": "sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==", 522 | "license": "MIT", 523 | "dependencies": { 524 | "@types/node": "*", 525 | "form-data": "^4.0.0" 526 | } 527 | }, 528 | "node_modules/@types/stream-buffers": { 529 | "version": "3.0.7", 530 | "resolved": "https://registry.npmjs.org/@types/stream-buffers/-/stream-buffers-3.0.7.tgz", 531 | "integrity": "sha512-azOCy05sXVXrO+qklf0c/B07H/oHaIuDDAiHPVwlk3A9Ek+ksHyTeMajLZl3r76FxpPpxem//4Te61G1iW3Giw==", 532 | "license": "MIT", 533 | "dependencies": { 534 | "@types/node": "*" 535 | } 536 | }, 537 | "node_modules/@types/tar": { 538 | "version": "6.1.13", 539 | "resolved": "https://registry.npmjs.org/@types/tar/-/tar-6.1.13.tgz", 540 | "integrity": "sha512-IznnlmU5f4WcGTh2ltRu/Ijpmk8wiWXfF0VA4s+HPjHZgvFggk1YaIkbo5krX/zUCzWF8N/l4+W/LNxnvAJ8nw==", 541 | "license": "MIT", 542 | "dependencies": { 543 | "@types/node": "*", 544 | "minipass": "^4.0.0" 545 | } 546 | }, 547 | "node_modules/@types/ws": { 548 | "version": "8.18.0", 549 | "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.0.tgz", 550 | "integrity": "sha512-8svvI3hMyvN0kKCJMvTJP/x6Y/EoQbepff882wL+Sn5QsXb3etnamgrJq4isrBxSJj5L2AuXcI0+bgkoAXGUJw==", 551 | "license": "MIT", 552 | "dependencies": { 553 | "@types/node": "*" 554 | } 555 | }, 556 | "node_modules/@typescript-eslint/eslint-plugin": { 557 | "version": "8.26.1", 558 | "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.26.1.tgz", 559 | "integrity": "sha512-2X3mwqsj9Bd3Ciz508ZUtoQQYpOhU/kWoUqIf49H8Z0+Vbh6UF/y0OEYp0Q0axOGzaBGs7QxRwq0knSQ8khQNA==", 560 | "dev": true, 561 | "license": "MIT", 562 | "dependencies": { 563 | "@eslint-community/regexpp": "^4.10.0", 564 | "@typescript-eslint/scope-manager": "8.26.1", 565 | "@typescript-eslint/type-utils": "8.26.1", 566 | "@typescript-eslint/utils": "8.26.1", 567 | "@typescript-eslint/visitor-keys": "8.26.1", 568 | "graphemer": "^1.4.0", 569 | "ignore": "^5.3.1", 570 | "natural-compare": "^1.4.0", 571 | "ts-api-utils": "^2.0.1" 572 | }, 573 | "engines": { 574 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 575 | }, 576 | "funding": { 577 | "type": "opencollective", 578 | "url": "https://opencollective.com/typescript-eslint" 579 | }, 580 | "peerDependencies": { 581 | "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", 582 | "eslint": "^8.57.0 || ^9.0.0", 583 | "typescript": ">=4.8.4 <5.9.0" 584 | } 585 | }, 586 | "node_modules/@typescript-eslint/parser": { 587 | "version": "8.26.1", 588 | "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.26.1.tgz", 589 | "integrity": "sha512-w6HZUV4NWxqd8BdeFf81t07d7/YV9s7TCWrQQbG5uhuvGUAW+fq1usZ1Hmz9UPNLniFnD8GLSsDpjP0hm1S4lQ==", 590 | "dev": true, 591 | "license": "MIT", 592 | "dependencies": { 593 | "@typescript-eslint/scope-manager": "8.26.1", 594 | "@typescript-eslint/types": "8.26.1", 595 | "@typescript-eslint/typescript-estree": "8.26.1", 596 | "@typescript-eslint/visitor-keys": "8.26.1", 597 | "debug": "^4.3.4" 598 | }, 599 | "engines": { 600 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 601 | }, 602 | "funding": { 603 | "type": "opencollective", 604 | "url": "https://opencollective.com/typescript-eslint" 605 | }, 606 | "peerDependencies": { 607 | "eslint": "^8.57.0 || ^9.0.0", 608 | "typescript": ">=4.8.4 <5.9.0" 609 | } 610 | }, 611 | "node_modules/@typescript-eslint/scope-manager": { 612 | "version": "8.26.1", 613 | "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.26.1.tgz", 614 | "integrity": "sha512-6EIvbE5cNER8sqBu6V7+KeMZIC1664d2Yjt+B9EWUXrsyWpxx4lEZrmvxgSKRC6gX+efDL/UY9OpPZ267io3mg==", 615 | "dev": true, 616 | "license": "MIT", 617 | "dependencies": { 618 | "@typescript-eslint/types": "8.26.1", 619 | "@typescript-eslint/visitor-keys": "8.26.1" 620 | }, 621 | "engines": { 622 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 623 | }, 624 | "funding": { 625 | "type": "opencollective", 626 | "url": "https://opencollective.com/typescript-eslint" 627 | } 628 | }, 629 | "node_modules/@typescript-eslint/type-utils": { 630 | "version": "8.26.1", 631 | "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.26.1.tgz", 632 | "integrity": "sha512-Kcj/TagJLwoY/5w9JGEFV0dclQdyqw9+VMndxOJKtoFSjfZhLXhYjzsQEeyza03rwHx2vFEGvrJWJBXKleRvZg==", 633 | "dev": true, 634 | "license": "MIT", 635 | "dependencies": { 636 | "@typescript-eslint/typescript-estree": "8.26.1", 637 | "@typescript-eslint/utils": "8.26.1", 638 | "debug": "^4.3.4", 639 | "ts-api-utils": "^2.0.1" 640 | }, 641 | "engines": { 642 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 643 | }, 644 | "funding": { 645 | "type": "opencollective", 646 | "url": "https://opencollective.com/typescript-eslint" 647 | }, 648 | "peerDependencies": { 649 | "eslint": "^8.57.0 || ^9.0.0", 650 | "typescript": ">=4.8.4 <5.9.0" 651 | } 652 | }, 653 | "node_modules/@typescript-eslint/types": { 654 | "version": "8.26.1", 655 | "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.26.1.tgz", 656 | "integrity": "sha512-n4THUQW27VmQMx+3P+B0Yptl7ydfceUj4ON/AQILAASwgYdZ/2dhfymRMh5egRUrvK5lSmaOm77Ry+lmXPOgBQ==", 657 | "dev": true, 658 | "license": "MIT", 659 | "engines": { 660 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 661 | }, 662 | "funding": { 663 | "type": "opencollective", 664 | "url": "https://opencollective.com/typescript-eslint" 665 | } 666 | }, 667 | "node_modules/@typescript-eslint/typescript-estree": { 668 | "version": "8.26.1", 669 | "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.26.1.tgz", 670 | "integrity": "sha512-yUwPpUHDgdrv1QJ7YQal3cMVBGWfnuCdKbXw1yyjArax3353rEJP1ZA+4F8nOlQ3RfS2hUN/wze3nlY+ZOhvoA==", 671 | "dev": true, 672 | "license": "MIT", 673 | "dependencies": { 674 | "@typescript-eslint/types": "8.26.1", 675 | "@typescript-eslint/visitor-keys": "8.26.1", 676 | "debug": "^4.3.4", 677 | "fast-glob": "^3.3.2", 678 | "is-glob": "^4.0.3", 679 | "minimatch": "^9.0.4", 680 | "semver": "^7.6.0", 681 | "ts-api-utils": "^2.0.1" 682 | }, 683 | "engines": { 684 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 685 | }, 686 | "funding": { 687 | "type": "opencollective", 688 | "url": "https://opencollective.com/typescript-eslint" 689 | }, 690 | "peerDependencies": { 691 | "typescript": ">=4.8.4 <5.9.0" 692 | } 693 | }, 694 | "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { 695 | "version": "2.0.1", 696 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 697 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 698 | "dev": true, 699 | "license": "MIT", 700 | "dependencies": { 701 | "balanced-match": "^1.0.0" 702 | } 703 | }, 704 | "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { 705 | "version": "9.0.5", 706 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", 707 | "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", 708 | "dev": true, 709 | "license": "ISC", 710 | "dependencies": { 711 | "brace-expansion": "^2.0.1" 712 | }, 713 | "engines": { 714 | "node": ">=16 || 14 >=14.17" 715 | }, 716 | "funding": { 717 | "url": "https://github.com/sponsors/isaacs" 718 | } 719 | }, 720 | "node_modules/@typescript-eslint/utils": { 721 | "version": "8.26.1", 722 | "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.26.1.tgz", 723 | "integrity": "sha512-V4Urxa/XtSUroUrnI7q6yUTD3hDtfJ2jzVfeT3VK0ciizfK2q/zGC0iDh1lFMUZR8cImRrep6/q0xd/1ZGPQpg==", 724 | "dev": true, 725 | "license": "MIT", 726 | "dependencies": { 727 | "@eslint-community/eslint-utils": "^4.4.0", 728 | "@typescript-eslint/scope-manager": "8.26.1", 729 | "@typescript-eslint/types": "8.26.1", 730 | "@typescript-eslint/typescript-estree": "8.26.1" 731 | }, 732 | "engines": { 733 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 734 | }, 735 | "funding": { 736 | "type": "opencollective", 737 | "url": "https://opencollective.com/typescript-eslint" 738 | }, 739 | "peerDependencies": { 740 | "eslint": "^8.57.0 || ^9.0.0", 741 | "typescript": ">=4.8.4 <5.9.0" 742 | } 743 | }, 744 | "node_modules/@typescript-eslint/visitor-keys": { 745 | "version": "8.26.1", 746 | "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.26.1.tgz", 747 | "integrity": "sha512-AjOC3zfnxd6S4Eiy3jwktJPclqhFHNyd8L6Gycf9WUPoKZpgM5PjkxY1X7uSy61xVpiJDhhk7XT2NVsN3ALTWg==", 748 | "dev": true, 749 | "license": "MIT", 750 | "dependencies": { 751 | "@typescript-eslint/types": "8.26.1", 752 | "eslint-visitor-keys": "^4.2.0" 753 | }, 754 | "engines": { 755 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 756 | }, 757 | "funding": { 758 | "type": "opencollective", 759 | "url": "https://opencollective.com/typescript-eslint" 760 | } 761 | }, 762 | "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { 763 | "version": "4.2.0", 764 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", 765 | "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", 766 | "dev": true, 767 | "license": "Apache-2.0", 768 | "engines": { 769 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 770 | }, 771 | "funding": { 772 | "url": "https://opencollective.com/eslint" 773 | } 774 | }, 775 | "node_modules/acorn": { 776 | "version": "8.14.0", 777 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", 778 | "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", 779 | "dev": true, 780 | "license": "MIT", 781 | "bin": { 782 | "acorn": "bin/acorn" 783 | }, 784 | "engines": { 785 | "node": ">=0.4.0" 786 | } 787 | }, 788 | "node_modules/acorn-jsx": { 789 | "version": "5.3.2", 790 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", 791 | "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", 792 | "dev": true, 793 | "license": "MIT", 794 | "peerDependencies": { 795 | "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" 796 | } 797 | }, 798 | "node_modules/acorn-walk": { 799 | "version": "8.3.4", 800 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", 801 | "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", 802 | "dev": true, 803 | "license": "MIT", 804 | "dependencies": { 805 | "acorn": "^8.11.0" 806 | }, 807 | "engines": { 808 | "node": ">=0.4.0" 809 | } 810 | }, 811 | "node_modules/agent-base": { 812 | "version": "7.1.3", 813 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", 814 | "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", 815 | "license": "MIT", 816 | "engines": { 817 | "node": ">= 14" 818 | } 819 | }, 820 | "node_modules/ajv": { 821 | "version": "6.12.6", 822 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 823 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 824 | "dev": true, 825 | "license": "MIT", 826 | "dependencies": { 827 | "fast-deep-equal": "^3.1.1", 828 | "fast-json-stable-stringify": "^2.0.0", 829 | "json-schema-traverse": "^0.4.1", 830 | "uri-js": "^4.2.2" 831 | }, 832 | "funding": { 833 | "type": "github", 834 | "url": "https://github.com/sponsors/epoberezkin" 835 | } 836 | }, 837 | "node_modules/ansi-regex": { 838 | "version": "5.0.1", 839 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 840 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 841 | "license": "MIT", 842 | "engines": { 843 | "node": ">=8" 844 | } 845 | }, 846 | "node_modules/ansi-styles": { 847 | "version": "4.3.0", 848 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 849 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 850 | "license": "MIT", 851 | "dependencies": { 852 | "color-convert": "^2.0.1" 853 | }, 854 | "engines": { 855 | "node": ">=8" 856 | }, 857 | "funding": { 858 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 859 | } 860 | }, 861 | "node_modules/arg": { 862 | "version": "4.1.3", 863 | "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", 864 | "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", 865 | "dev": true, 866 | "license": "MIT" 867 | }, 868 | "node_modules/argparse": { 869 | "version": "2.0.1", 870 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 871 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 872 | "license": "Python-2.0" 873 | }, 874 | "node_modules/async": { 875 | "version": "3.2.6", 876 | "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", 877 | "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", 878 | "license": "MIT" 879 | }, 880 | "node_modules/asynckit": { 881 | "version": "0.4.0", 882 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 883 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", 884 | "license": "MIT" 885 | }, 886 | "node_modules/balanced-match": { 887 | "version": "1.0.2", 888 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 889 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 890 | "license": "MIT" 891 | }, 892 | "node_modules/brace-expansion": { 893 | "version": "1.1.11", 894 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 895 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 896 | "dev": true, 897 | "license": "MIT", 898 | "dependencies": { 899 | "balanced-match": "^1.0.0", 900 | "concat-map": "0.0.1" 901 | } 902 | }, 903 | "node_modules/braces": { 904 | "version": "3.0.3", 905 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", 906 | "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", 907 | "dev": true, 908 | "license": "MIT", 909 | "dependencies": { 910 | "fill-range": "^7.1.1" 911 | }, 912 | "engines": { 913 | "node": ">=8" 914 | } 915 | }, 916 | "node_modules/call-bind-apply-helpers": { 917 | "version": "1.0.2", 918 | "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", 919 | "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", 920 | "license": "MIT", 921 | "dependencies": { 922 | "es-errors": "^1.3.0", 923 | "function-bind": "^1.1.2" 924 | }, 925 | "engines": { 926 | "node": ">= 0.4" 927 | } 928 | }, 929 | "node_modules/callsites": { 930 | "version": "3.1.0", 931 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 932 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 933 | "dev": true, 934 | "license": "MIT", 935 | "engines": { 936 | "node": ">=6" 937 | } 938 | }, 939 | "node_modules/chalk": { 940 | "version": "4.1.2", 941 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 942 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 943 | "dev": true, 944 | "license": "MIT", 945 | "dependencies": { 946 | "ansi-styles": "^4.1.0", 947 | "supports-color": "^7.1.0" 948 | }, 949 | "engines": { 950 | "node": ">=10" 951 | }, 952 | "funding": { 953 | "url": "https://github.com/chalk/chalk?sponsor=1" 954 | } 955 | }, 956 | "node_modules/color-convert": { 957 | "version": "2.0.1", 958 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 959 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 960 | "license": "MIT", 961 | "dependencies": { 962 | "color-name": "~1.1.4" 963 | }, 964 | "engines": { 965 | "node": ">=7.0.0" 966 | } 967 | }, 968 | "node_modules/color-name": { 969 | "version": "1.1.4", 970 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 971 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 972 | "license": "MIT" 973 | }, 974 | "node_modules/combined-stream": { 975 | "version": "1.0.8", 976 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 977 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 978 | "license": "MIT", 979 | "dependencies": { 980 | "delayed-stream": "~1.0.0" 981 | }, 982 | "engines": { 983 | "node": ">= 0.8" 984 | } 985 | }, 986 | "node_modules/concat-map": { 987 | "version": "0.0.1", 988 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 989 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 990 | "dev": true, 991 | "license": "MIT" 992 | }, 993 | "node_modules/create-require": { 994 | "version": "1.1.1", 995 | "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", 996 | "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", 997 | "dev": true, 998 | "license": "MIT" 999 | }, 1000 | "node_modules/debug": { 1001 | "version": "4.3.4", 1002 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 1003 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 1004 | "license": "MIT", 1005 | "dependencies": { 1006 | "ms": "2.1.2" 1007 | }, 1008 | "engines": { 1009 | "node": ">=6.0" 1010 | }, 1011 | "peerDependenciesMeta": { 1012 | "supports-color": { 1013 | "optional": true 1014 | } 1015 | } 1016 | }, 1017 | "node_modules/deep-is": { 1018 | "version": "0.1.4", 1019 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", 1020 | "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", 1021 | "dev": true, 1022 | "license": "MIT" 1023 | }, 1024 | "node_modules/delayed-stream": { 1025 | "version": "1.0.0", 1026 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 1027 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", 1028 | "license": "MIT", 1029 | "engines": { 1030 | "node": ">=0.4.0" 1031 | } 1032 | }, 1033 | "node_modules/diff": { 1034 | "version": "4.0.2", 1035 | "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", 1036 | "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", 1037 | "dev": true, 1038 | "license": "BSD-3-Clause", 1039 | "engines": { 1040 | "node": ">=0.3.1" 1041 | } 1042 | }, 1043 | "node_modules/dunder-proto": { 1044 | "version": "1.0.1", 1045 | "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", 1046 | "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", 1047 | "license": "MIT", 1048 | "dependencies": { 1049 | "call-bind-apply-helpers": "^1.0.1", 1050 | "es-errors": "^1.3.0", 1051 | "gopd": "^1.2.0" 1052 | }, 1053 | "engines": { 1054 | "node": ">= 0.4" 1055 | } 1056 | }, 1057 | "node_modules/eastasianwidth": { 1058 | "version": "0.2.0", 1059 | "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", 1060 | "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", 1061 | "license": "MIT" 1062 | }, 1063 | "node_modules/emoji-regex": { 1064 | "version": "9.2.2", 1065 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", 1066 | "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", 1067 | "license": "MIT" 1068 | }, 1069 | "node_modules/es-define-property": { 1070 | "version": "1.0.1", 1071 | "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", 1072 | "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", 1073 | "license": "MIT", 1074 | "engines": { 1075 | "node": ">= 0.4" 1076 | } 1077 | }, 1078 | "node_modules/es-errors": { 1079 | "version": "1.3.0", 1080 | "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", 1081 | "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", 1082 | "license": "MIT", 1083 | "engines": { 1084 | "node": ">= 0.4" 1085 | } 1086 | }, 1087 | "node_modules/es-object-atoms": { 1088 | "version": "1.1.1", 1089 | "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", 1090 | "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", 1091 | "license": "MIT", 1092 | "dependencies": { 1093 | "es-errors": "^1.3.0" 1094 | }, 1095 | "engines": { 1096 | "node": ">= 0.4" 1097 | } 1098 | }, 1099 | "node_modules/es-set-tostringtag": { 1100 | "version": "2.1.0", 1101 | "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", 1102 | "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", 1103 | "license": "MIT", 1104 | "dependencies": { 1105 | "es-errors": "^1.3.0", 1106 | "get-intrinsic": "^1.2.6", 1107 | "has-tostringtag": "^1.0.2", 1108 | "hasown": "^2.0.2" 1109 | }, 1110 | "engines": { 1111 | "node": ">= 0.4" 1112 | } 1113 | }, 1114 | "node_modules/escape-string-regexp": { 1115 | "version": "4.0.0", 1116 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 1117 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 1118 | "dev": true, 1119 | "license": "MIT", 1120 | "engines": { 1121 | "node": ">=10" 1122 | }, 1123 | "funding": { 1124 | "url": "https://github.com/sponsors/sindresorhus" 1125 | } 1126 | }, 1127 | "node_modules/eslint": { 1128 | "version": "9.22.0", 1129 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.22.0.tgz", 1130 | "integrity": "sha512-9V/QURhsRN40xuHXWjV64yvrzMjcz7ZyNoF2jJFmy9j/SLk0u1OLSZgXi28MrXjymnjEGSR80WCdab3RGMDveQ==", 1131 | "dev": true, 1132 | "license": "MIT", 1133 | "dependencies": { 1134 | "@eslint-community/eslint-utils": "^4.2.0", 1135 | "@eslint-community/regexpp": "^4.12.1", 1136 | "@eslint/config-array": "^0.19.2", 1137 | "@eslint/config-helpers": "^0.1.0", 1138 | "@eslint/core": "^0.12.0", 1139 | "@eslint/eslintrc": "^3.3.0", 1140 | "@eslint/js": "9.22.0", 1141 | "@eslint/plugin-kit": "^0.2.7", 1142 | "@humanfs/node": "^0.16.6", 1143 | "@humanwhocodes/module-importer": "^1.0.1", 1144 | "@humanwhocodes/retry": "^0.4.2", 1145 | "@types/estree": "^1.0.6", 1146 | "@types/json-schema": "^7.0.15", 1147 | "ajv": "^6.12.4", 1148 | "chalk": "^4.0.0", 1149 | "cross-spawn": "^7.0.6", 1150 | "debug": "^4.3.2", 1151 | "escape-string-regexp": "^4.0.0", 1152 | "eslint-scope": "^8.3.0", 1153 | "eslint-visitor-keys": "^4.2.0", 1154 | "espree": "^10.3.0", 1155 | "esquery": "^1.5.0", 1156 | "esutils": "^2.0.2", 1157 | "fast-deep-equal": "^3.1.3", 1158 | "file-entry-cache": "^8.0.0", 1159 | "find-up": "^5.0.0", 1160 | "glob-parent": "^6.0.2", 1161 | "ignore": "^5.2.0", 1162 | "imurmurhash": "^0.1.4", 1163 | "is-glob": "^4.0.0", 1164 | "json-stable-stringify-without-jsonify": "^1.0.1", 1165 | "lodash.merge": "^4.6.2", 1166 | "minimatch": "^3.1.2", 1167 | "natural-compare": "^1.4.0", 1168 | "optionator": "^0.9.3" 1169 | }, 1170 | "bin": { 1171 | "eslint": "bin/eslint.js" 1172 | }, 1173 | "engines": { 1174 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1175 | }, 1176 | "funding": { 1177 | "url": "https://eslint.org/donate" 1178 | }, 1179 | "peerDependencies": { 1180 | "jiti": "*" 1181 | }, 1182 | "peerDependenciesMeta": { 1183 | "jiti": { 1184 | "optional": true 1185 | } 1186 | } 1187 | }, 1188 | "node_modules/eslint-scope": { 1189 | "version": "8.3.0", 1190 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz", 1191 | "integrity": "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==", 1192 | "dev": true, 1193 | "license": "BSD-2-Clause", 1194 | "dependencies": { 1195 | "esrecurse": "^4.3.0", 1196 | "estraverse": "^5.2.0" 1197 | }, 1198 | "engines": { 1199 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1200 | }, 1201 | "funding": { 1202 | "url": "https://opencollective.com/eslint" 1203 | } 1204 | }, 1205 | "node_modules/eslint-visitor-keys": { 1206 | "version": "3.4.3", 1207 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", 1208 | "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", 1209 | "dev": true, 1210 | "license": "Apache-2.0", 1211 | "engines": { 1212 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 1213 | }, 1214 | "funding": { 1215 | "url": "https://opencollective.com/eslint" 1216 | } 1217 | }, 1218 | "node_modules/eslint/node_modules/cross-spawn": { 1219 | "version": "7.0.6", 1220 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", 1221 | "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", 1222 | "dev": true, 1223 | "license": "MIT", 1224 | "dependencies": { 1225 | "path-key": "^3.1.0", 1226 | "shebang-command": "^2.0.0", 1227 | "which": "^2.0.1" 1228 | }, 1229 | "engines": { 1230 | "node": ">= 8" 1231 | } 1232 | }, 1233 | "node_modules/eslint/node_modules/eslint-visitor-keys": { 1234 | "version": "4.2.0", 1235 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", 1236 | "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", 1237 | "dev": true, 1238 | "license": "Apache-2.0", 1239 | "engines": { 1240 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1241 | }, 1242 | "funding": { 1243 | "url": "https://opencollective.com/eslint" 1244 | } 1245 | }, 1246 | "node_modules/eslint/node_modules/esquery": { 1247 | "version": "1.6.0", 1248 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", 1249 | "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", 1250 | "dev": true, 1251 | "license": "BSD-3-Clause", 1252 | "dependencies": { 1253 | "estraverse": "^5.1.0" 1254 | }, 1255 | "engines": { 1256 | "node": ">=0.10" 1257 | } 1258 | }, 1259 | "node_modules/eslint/node_modules/optionator": { 1260 | "version": "0.9.4", 1261 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", 1262 | "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", 1263 | "dev": true, 1264 | "license": "MIT", 1265 | "dependencies": { 1266 | "deep-is": "^0.1.3", 1267 | "fast-levenshtein": "^2.0.6", 1268 | "levn": "^0.4.1", 1269 | "prelude-ls": "^1.2.1", 1270 | "type-check": "^0.4.0", 1271 | "word-wrap": "^1.2.5" 1272 | }, 1273 | "engines": { 1274 | "node": ">= 0.8.0" 1275 | } 1276 | }, 1277 | "node_modules/espree": { 1278 | "version": "10.3.0", 1279 | "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", 1280 | "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", 1281 | "dev": true, 1282 | "license": "BSD-2-Clause", 1283 | "dependencies": { 1284 | "acorn": "^8.14.0", 1285 | "acorn-jsx": "^5.3.2", 1286 | "eslint-visitor-keys": "^4.2.0" 1287 | }, 1288 | "engines": { 1289 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1290 | }, 1291 | "funding": { 1292 | "url": "https://opencollective.com/eslint" 1293 | } 1294 | }, 1295 | "node_modules/espree/node_modules/eslint-visitor-keys": { 1296 | "version": "4.2.0", 1297 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", 1298 | "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", 1299 | "dev": true, 1300 | "license": "Apache-2.0", 1301 | "engines": { 1302 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1303 | }, 1304 | "funding": { 1305 | "url": "https://opencollective.com/eslint" 1306 | } 1307 | }, 1308 | "node_modules/esrecurse": { 1309 | "version": "4.3.0", 1310 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 1311 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 1312 | "dev": true, 1313 | "license": "BSD-2-Clause", 1314 | "dependencies": { 1315 | "estraverse": "^5.2.0" 1316 | }, 1317 | "engines": { 1318 | "node": ">=4.0" 1319 | } 1320 | }, 1321 | "node_modules/estraverse": { 1322 | "version": "5.3.0", 1323 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 1324 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 1325 | "dev": true, 1326 | "license": "BSD-2-Clause", 1327 | "engines": { 1328 | "node": ">=4.0" 1329 | } 1330 | }, 1331 | "node_modules/esutils": { 1332 | "version": "2.0.3", 1333 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 1334 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 1335 | "dev": true, 1336 | "license": "BSD-2-Clause", 1337 | "engines": { 1338 | "node": ">=0.10.0" 1339 | } 1340 | }, 1341 | "node_modules/extend": { 1342 | "version": "3.0.2", 1343 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 1344 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", 1345 | "license": "MIT" 1346 | }, 1347 | "node_modules/fast-deep-equal": { 1348 | "version": "3.1.3", 1349 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 1350 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 1351 | "dev": true, 1352 | "license": "MIT" 1353 | }, 1354 | "node_modules/fast-glob": { 1355 | "version": "3.3.3", 1356 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", 1357 | "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", 1358 | "dev": true, 1359 | "license": "MIT", 1360 | "dependencies": { 1361 | "@nodelib/fs.stat": "^2.0.2", 1362 | "@nodelib/fs.walk": "^1.2.3", 1363 | "glob-parent": "^5.1.2", 1364 | "merge2": "^1.3.0", 1365 | "micromatch": "^4.0.8" 1366 | }, 1367 | "engines": { 1368 | "node": ">=8.6.0" 1369 | } 1370 | }, 1371 | "node_modules/fast-glob/node_modules/glob-parent": { 1372 | "version": "5.1.2", 1373 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 1374 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 1375 | "dev": true, 1376 | "license": "ISC", 1377 | "dependencies": { 1378 | "is-glob": "^4.0.1" 1379 | }, 1380 | "engines": { 1381 | "node": ">= 6" 1382 | } 1383 | }, 1384 | "node_modules/fast-json-stable-stringify": { 1385 | "version": "2.1.0", 1386 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 1387 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 1388 | "dev": true, 1389 | "license": "MIT" 1390 | }, 1391 | "node_modules/fast-levenshtein": { 1392 | "version": "2.0.6", 1393 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 1394 | "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", 1395 | "dev": true, 1396 | "license": "MIT" 1397 | }, 1398 | "node_modules/fastq": { 1399 | "version": "1.19.1", 1400 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", 1401 | "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", 1402 | "dev": true, 1403 | "license": "ISC", 1404 | "dependencies": { 1405 | "reusify": "^1.0.4" 1406 | } 1407 | }, 1408 | "node_modules/file-entry-cache": { 1409 | "version": "8.0.0", 1410 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", 1411 | "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", 1412 | "dev": true, 1413 | "license": "MIT", 1414 | "dependencies": { 1415 | "flat-cache": "^4.0.0" 1416 | }, 1417 | "engines": { 1418 | "node": ">=16.0.0" 1419 | } 1420 | }, 1421 | "node_modules/fill-range": { 1422 | "version": "7.1.1", 1423 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", 1424 | "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", 1425 | "dev": true, 1426 | "license": "MIT", 1427 | "dependencies": { 1428 | "to-regex-range": "^5.0.1" 1429 | }, 1430 | "engines": { 1431 | "node": ">=8" 1432 | } 1433 | }, 1434 | "node_modules/find-up": { 1435 | "version": "5.0.0", 1436 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 1437 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 1438 | "dev": true, 1439 | "license": "MIT", 1440 | "dependencies": { 1441 | "locate-path": "^6.0.0", 1442 | "path-exists": "^4.0.0" 1443 | }, 1444 | "engines": { 1445 | "node": ">=10" 1446 | }, 1447 | "funding": { 1448 | "url": "https://github.com/sponsors/sindresorhus" 1449 | } 1450 | }, 1451 | "node_modules/flat-cache": { 1452 | "version": "4.0.1", 1453 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", 1454 | "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", 1455 | "dev": true, 1456 | "license": "MIT", 1457 | "dependencies": { 1458 | "flatted": "^3.2.9", 1459 | "keyv": "^4.5.4" 1460 | }, 1461 | "engines": { 1462 | "node": ">=16" 1463 | } 1464 | }, 1465 | "node_modules/flat-cache/node_modules/flatted": { 1466 | "version": "3.3.2", 1467 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", 1468 | "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", 1469 | "dev": true, 1470 | "license": "ISC" 1471 | }, 1472 | "node_modules/foreground-child": { 1473 | "version": "3.3.0", 1474 | "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", 1475 | "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", 1476 | "license": "ISC", 1477 | "dependencies": { 1478 | "cross-spawn": "^7.0.0", 1479 | "signal-exit": "^4.0.1" 1480 | }, 1481 | "engines": { 1482 | "node": ">=14" 1483 | }, 1484 | "funding": { 1485 | "url": "https://github.com/sponsors/isaacs" 1486 | } 1487 | }, 1488 | "node_modules/foreground-child/node_modules/cross-spawn": { 1489 | "version": "7.0.6", 1490 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", 1491 | "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", 1492 | "license": "MIT", 1493 | "dependencies": { 1494 | "path-key": "^3.1.0", 1495 | "shebang-command": "^2.0.0", 1496 | "which": "^2.0.1" 1497 | }, 1498 | "engines": { 1499 | "node": ">= 8" 1500 | } 1501 | }, 1502 | "node_modules/form-data": { 1503 | "version": "4.0.2", 1504 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", 1505 | "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", 1506 | "license": "MIT", 1507 | "dependencies": { 1508 | "asynckit": "^0.4.0", 1509 | "combined-stream": "^1.0.8", 1510 | "es-set-tostringtag": "^2.1.0", 1511 | "mime-types": "^2.1.12" 1512 | }, 1513 | "engines": { 1514 | "node": ">= 6" 1515 | } 1516 | }, 1517 | "node_modules/function-bind": { 1518 | "version": "1.1.2", 1519 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 1520 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 1521 | "license": "MIT", 1522 | "funding": { 1523 | "url": "https://github.com/sponsors/ljharb" 1524 | } 1525 | }, 1526 | "node_modules/gaxios": { 1527 | "version": "6.7.1", 1528 | "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.7.1.tgz", 1529 | "integrity": "sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==", 1530 | "license": "Apache-2.0", 1531 | "dependencies": { 1532 | "extend": "^3.0.2", 1533 | "https-proxy-agent": "^7.0.1", 1534 | "is-stream": "^2.0.0", 1535 | "node-fetch": "^2.6.9", 1536 | "uuid": "^9.0.1" 1537 | }, 1538 | "engines": { 1539 | "node": ">=14" 1540 | } 1541 | }, 1542 | "node_modules/get-intrinsic": { 1543 | "version": "1.2.7", 1544 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz", 1545 | "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==", 1546 | "license": "MIT", 1547 | "dependencies": { 1548 | "call-bind-apply-helpers": "^1.0.1", 1549 | "es-define-property": "^1.0.1", 1550 | "es-errors": "^1.3.0", 1551 | "es-object-atoms": "^1.0.0", 1552 | "function-bind": "^1.1.2", 1553 | "get-proto": "^1.0.0", 1554 | "gopd": "^1.2.0", 1555 | "has-symbols": "^1.1.0", 1556 | "hasown": "^2.0.2", 1557 | "math-intrinsics": "^1.1.0" 1558 | }, 1559 | "engines": { 1560 | "node": ">= 0.4" 1561 | }, 1562 | "funding": { 1563 | "url": "https://github.com/sponsors/ljharb" 1564 | } 1565 | }, 1566 | "node_modules/get-proto": { 1567 | "version": "1.0.1", 1568 | "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", 1569 | "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", 1570 | "license": "MIT", 1571 | "dependencies": { 1572 | "dunder-proto": "^1.0.1", 1573 | "es-object-atoms": "^1.0.0" 1574 | }, 1575 | "engines": { 1576 | "node": ">= 0.4" 1577 | } 1578 | }, 1579 | "node_modules/glob": { 1580 | "version": "10.4.5", 1581 | "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", 1582 | "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", 1583 | "license": "ISC", 1584 | "dependencies": { 1585 | "foreground-child": "^3.1.0", 1586 | "jackspeak": "^3.1.2", 1587 | "minimatch": "^9.0.4", 1588 | "minipass": "^7.1.2", 1589 | "package-json-from-dist": "^1.0.0", 1590 | "path-scurry": "^1.11.1" 1591 | }, 1592 | "bin": { 1593 | "glob": "dist/esm/bin.mjs" 1594 | }, 1595 | "funding": { 1596 | "url": "https://github.com/sponsors/isaacs" 1597 | } 1598 | }, 1599 | "node_modules/glob-parent": { 1600 | "version": "6.0.2", 1601 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 1602 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 1603 | "dev": true, 1604 | "license": "ISC", 1605 | "dependencies": { 1606 | "is-glob": "^4.0.3" 1607 | }, 1608 | "engines": { 1609 | "node": ">=10.13.0" 1610 | } 1611 | }, 1612 | "node_modules/glob/node_modules/brace-expansion": { 1613 | "version": "2.0.1", 1614 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 1615 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 1616 | "license": "MIT", 1617 | "dependencies": { 1618 | "balanced-match": "^1.0.0" 1619 | } 1620 | }, 1621 | "node_modules/glob/node_modules/minimatch": { 1622 | "version": "9.0.5", 1623 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", 1624 | "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", 1625 | "license": "ISC", 1626 | "dependencies": { 1627 | "brace-expansion": "^2.0.1" 1628 | }, 1629 | "engines": { 1630 | "node": ">=16 || 14 >=14.17" 1631 | }, 1632 | "funding": { 1633 | "url": "https://github.com/sponsors/isaacs" 1634 | } 1635 | }, 1636 | "node_modules/glob/node_modules/minipass": { 1637 | "version": "7.1.2", 1638 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", 1639 | "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", 1640 | "license": "ISC", 1641 | "engines": { 1642 | "node": ">=16 || 14 >=14.17" 1643 | } 1644 | }, 1645 | "node_modules/globals": { 1646 | "version": "14.0.0", 1647 | "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", 1648 | "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", 1649 | "dev": true, 1650 | "license": "MIT", 1651 | "engines": { 1652 | "node": ">=18" 1653 | }, 1654 | "funding": { 1655 | "url": "https://github.com/sponsors/sindresorhus" 1656 | } 1657 | }, 1658 | "node_modules/gopd": { 1659 | "version": "1.2.0", 1660 | "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", 1661 | "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", 1662 | "license": "MIT", 1663 | "engines": { 1664 | "node": ">= 0.4" 1665 | }, 1666 | "funding": { 1667 | "url": "https://github.com/sponsors/ljharb" 1668 | } 1669 | }, 1670 | "node_modules/graphemer": { 1671 | "version": "1.4.0", 1672 | "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", 1673 | "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", 1674 | "dev": true, 1675 | "license": "MIT" 1676 | }, 1677 | "node_modules/has-flag": { 1678 | "version": "4.0.0", 1679 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1680 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 1681 | "dev": true, 1682 | "license": "MIT", 1683 | "engines": { 1684 | "node": ">=8" 1685 | } 1686 | }, 1687 | "node_modules/has-symbols": { 1688 | "version": "1.1.0", 1689 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", 1690 | "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", 1691 | "license": "MIT", 1692 | "engines": { 1693 | "node": ">= 0.4" 1694 | }, 1695 | "funding": { 1696 | "url": "https://github.com/sponsors/ljharb" 1697 | } 1698 | }, 1699 | "node_modules/has-tostringtag": { 1700 | "version": "1.0.2", 1701 | "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", 1702 | "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", 1703 | "license": "MIT", 1704 | "dependencies": { 1705 | "has-symbols": "^1.0.3" 1706 | }, 1707 | "engines": { 1708 | "node": ">= 0.4" 1709 | }, 1710 | "funding": { 1711 | "url": "https://github.com/sponsors/ljharb" 1712 | } 1713 | }, 1714 | "node_modules/hasown": { 1715 | "version": "2.0.2", 1716 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", 1717 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 1718 | "license": "MIT", 1719 | "dependencies": { 1720 | "function-bind": "^1.1.2" 1721 | }, 1722 | "engines": { 1723 | "node": ">= 0.4" 1724 | } 1725 | }, 1726 | "node_modules/hpagent": { 1727 | "version": "1.2.0", 1728 | "resolved": "https://registry.npmjs.org/hpagent/-/hpagent-1.2.0.tgz", 1729 | "integrity": "sha512-A91dYTeIB6NoXG+PxTQpCCDDnfHsW9kc06Lvpu1TEe9gnd6ZFeiBoRO9JvzEv6xK7EX97/dUE8g/vBMTqTS3CA==", 1730 | "license": "MIT", 1731 | "engines": { 1732 | "node": ">=14" 1733 | } 1734 | }, 1735 | "node_modules/https-proxy-agent": { 1736 | "version": "7.0.5", 1737 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", 1738 | "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", 1739 | "license": "MIT", 1740 | "dependencies": { 1741 | "agent-base": "^7.0.2", 1742 | "debug": "4" 1743 | }, 1744 | "engines": { 1745 | "node": ">= 14" 1746 | } 1747 | }, 1748 | "node_modules/ignore": { 1749 | "version": "5.3.2", 1750 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", 1751 | "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", 1752 | "dev": true, 1753 | "license": "MIT", 1754 | "engines": { 1755 | "node": ">= 4" 1756 | } 1757 | }, 1758 | "node_modules/import-fresh": { 1759 | "version": "3.3.1", 1760 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", 1761 | "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", 1762 | "dev": true, 1763 | "license": "MIT", 1764 | "dependencies": { 1765 | "parent-module": "^1.0.0", 1766 | "resolve-from": "^4.0.0" 1767 | }, 1768 | "engines": { 1769 | "node": ">=6" 1770 | }, 1771 | "funding": { 1772 | "url": "https://github.com/sponsors/sindresorhus" 1773 | } 1774 | }, 1775 | "node_modules/imurmurhash": { 1776 | "version": "0.1.4", 1777 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 1778 | "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", 1779 | "dev": true, 1780 | "license": "MIT", 1781 | "engines": { 1782 | "node": ">=0.8.19" 1783 | } 1784 | }, 1785 | "node_modules/ip-address": { 1786 | "version": "9.0.5", 1787 | "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", 1788 | "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", 1789 | "license": "MIT", 1790 | "dependencies": { 1791 | "jsbn": "1.1.0", 1792 | "sprintf-js": "^1.1.3" 1793 | }, 1794 | "engines": { 1795 | "node": ">= 12" 1796 | } 1797 | }, 1798 | "node_modules/is-extglob": { 1799 | "version": "2.1.1", 1800 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1801 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 1802 | "dev": true, 1803 | "license": "MIT", 1804 | "engines": { 1805 | "node": ">=0.10.0" 1806 | } 1807 | }, 1808 | "node_modules/is-fullwidth-code-point": { 1809 | "version": "3.0.0", 1810 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1811 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 1812 | "license": "MIT", 1813 | "engines": { 1814 | "node": ">=8" 1815 | } 1816 | }, 1817 | "node_modules/is-glob": { 1818 | "version": "4.0.3", 1819 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 1820 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1821 | "dev": true, 1822 | "license": "MIT", 1823 | "dependencies": { 1824 | "is-extglob": "^2.1.1" 1825 | }, 1826 | "engines": { 1827 | "node": ">=0.10.0" 1828 | } 1829 | }, 1830 | "node_modules/is-number": { 1831 | "version": "7.0.0", 1832 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1833 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 1834 | "dev": true, 1835 | "license": "MIT", 1836 | "engines": { 1837 | "node": ">=0.12.0" 1838 | } 1839 | }, 1840 | "node_modules/is-stream": { 1841 | "version": "2.0.1", 1842 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", 1843 | "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", 1844 | "license": "MIT", 1845 | "engines": { 1846 | "node": ">=8" 1847 | }, 1848 | "funding": { 1849 | "url": "https://github.com/sponsors/sindresorhus" 1850 | } 1851 | }, 1852 | "node_modules/isexe": { 1853 | "version": "2.0.0", 1854 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1855 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 1856 | "license": "ISC" 1857 | }, 1858 | "node_modules/isomorphic-ws": { 1859 | "version": "5.0.0", 1860 | "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz", 1861 | "integrity": "sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==", 1862 | "license": "MIT", 1863 | "peerDependencies": { 1864 | "ws": "*" 1865 | } 1866 | }, 1867 | "node_modules/jackspeak": { 1868 | "version": "3.4.3", 1869 | "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", 1870 | "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", 1871 | "license": "BlueOak-1.0.0", 1872 | "dependencies": { 1873 | "@isaacs/cliui": "^8.0.2" 1874 | }, 1875 | "funding": { 1876 | "url": "https://github.com/sponsors/isaacs" 1877 | }, 1878 | "optionalDependencies": { 1879 | "@pkgjs/parseargs": "^0.11.0" 1880 | } 1881 | }, 1882 | "node_modules/js-yaml": { 1883 | "version": "4.1.0", 1884 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 1885 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 1886 | "license": "MIT", 1887 | "dependencies": { 1888 | "argparse": "^2.0.1" 1889 | }, 1890 | "bin": { 1891 | "js-yaml": "bin/js-yaml.js" 1892 | } 1893 | }, 1894 | "node_modules/jsbn": { 1895 | "version": "1.1.0", 1896 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", 1897 | "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", 1898 | "license": "MIT" 1899 | }, 1900 | "node_modules/jsep": { 1901 | "version": "1.4.0", 1902 | "resolved": "https://registry.npmjs.org/jsep/-/jsep-1.4.0.tgz", 1903 | "integrity": "sha512-B7qPcEVE3NVkmSJbaYxvv4cHkVW7DQsZz13pUMrfS8z8Q/BuShN+gcTXrUlPiGqM2/t/EEaI030bpxMqY8gMlw==", 1904 | "license": "MIT", 1905 | "engines": { 1906 | "node": ">= 10.16.0" 1907 | } 1908 | }, 1909 | "node_modules/json-buffer": { 1910 | "version": "3.0.1", 1911 | "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", 1912 | "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", 1913 | "dev": true, 1914 | "license": "MIT" 1915 | }, 1916 | "node_modules/json-schema-traverse": { 1917 | "version": "0.4.1", 1918 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 1919 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 1920 | "dev": true, 1921 | "license": "MIT" 1922 | }, 1923 | "node_modules/json-stable-stringify-without-jsonify": { 1924 | "version": "1.0.1", 1925 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 1926 | "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", 1927 | "dev": true, 1928 | "license": "MIT" 1929 | }, 1930 | "node_modules/jsonpath-plus": { 1931 | "version": "10.3.0", 1932 | "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-10.3.0.tgz", 1933 | "integrity": "sha512-8TNmfeTCk2Le33A3vRRwtuworG/L5RrgMvdjhKZxvyShO+mBu2fP50OWUjRLNtvw344DdDarFh9buFAZs5ujeA==", 1934 | "license": "MIT", 1935 | "dependencies": { 1936 | "@jsep-plugin/assignment": "^1.3.0", 1937 | "@jsep-plugin/regex": "^1.0.4", 1938 | "jsep": "^1.4.0" 1939 | }, 1940 | "bin": { 1941 | "jsonpath": "bin/jsonpath-cli.js", 1942 | "jsonpath-plus": "bin/jsonpath-cli.js" 1943 | }, 1944 | "engines": { 1945 | "node": ">=18.0.0" 1946 | } 1947 | }, 1948 | "node_modules/keyv": { 1949 | "version": "4.5.4", 1950 | "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", 1951 | "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", 1952 | "dev": true, 1953 | "license": "MIT", 1954 | "dependencies": { 1955 | "json-buffer": "3.0.1" 1956 | } 1957 | }, 1958 | "node_modules/levn": { 1959 | "version": "0.4.1", 1960 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", 1961 | "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", 1962 | "dev": true, 1963 | "license": "MIT", 1964 | "dependencies": { 1965 | "prelude-ls": "^1.2.1", 1966 | "type-check": "~0.4.0" 1967 | }, 1968 | "engines": { 1969 | "node": ">= 0.8.0" 1970 | } 1971 | }, 1972 | "node_modules/locate-path": { 1973 | "version": "6.0.0", 1974 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 1975 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 1976 | "dev": true, 1977 | "license": "MIT", 1978 | "dependencies": { 1979 | "p-locate": "^5.0.0" 1980 | }, 1981 | "engines": { 1982 | "node": ">=10" 1983 | }, 1984 | "funding": { 1985 | "url": "https://github.com/sponsors/sindresorhus" 1986 | } 1987 | }, 1988 | "node_modules/lodash.merge": { 1989 | "version": "4.6.2", 1990 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 1991 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", 1992 | "dev": true, 1993 | "license": "MIT" 1994 | }, 1995 | "node_modules/lru-cache": { 1996 | "version": "10.4.3", 1997 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", 1998 | "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", 1999 | "license": "ISC" 2000 | }, 2001 | "node_modules/make-error": { 2002 | "version": "1.3.6", 2003 | "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", 2004 | "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", 2005 | "dev": true, 2006 | "license": "ISC" 2007 | }, 2008 | "node_modules/math-intrinsics": { 2009 | "version": "1.1.0", 2010 | "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", 2011 | "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", 2012 | "license": "MIT", 2013 | "engines": { 2014 | "node": ">= 0.4" 2015 | } 2016 | }, 2017 | "node_modules/merge2": { 2018 | "version": "1.4.1", 2019 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 2020 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 2021 | "dev": true, 2022 | "license": "MIT", 2023 | "engines": { 2024 | "node": ">= 8" 2025 | } 2026 | }, 2027 | "node_modules/micromatch": { 2028 | "version": "4.0.8", 2029 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", 2030 | "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", 2031 | "dev": true, 2032 | "license": "MIT", 2033 | "dependencies": { 2034 | "braces": "^3.0.3", 2035 | "picomatch": "^2.3.1" 2036 | }, 2037 | "engines": { 2038 | "node": ">=8.6" 2039 | } 2040 | }, 2041 | "node_modules/mime-db": { 2042 | "version": "1.52.0", 2043 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 2044 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 2045 | "license": "MIT", 2046 | "engines": { 2047 | "node": ">= 0.6" 2048 | } 2049 | }, 2050 | "node_modules/mime-types": { 2051 | "version": "2.1.35", 2052 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 2053 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 2054 | "license": "MIT", 2055 | "dependencies": { 2056 | "mime-db": "1.52.0" 2057 | }, 2058 | "engines": { 2059 | "node": ">= 0.6" 2060 | } 2061 | }, 2062 | "node_modules/minimatch": { 2063 | "version": "3.1.2", 2064 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 2065 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 2066 | "dev": true, 2067 | "license": "ISC", 2068 | "dependencies": { 2069 | "brace-expansion": "^1.1.7" 2070 | }, 2071 | "engines": { 2072 | "node": "*" 2073 | } 2074 | }, 2075 | "node_modules/minipass": { 2076 | "version": "4.2.8", 2077 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", 2078 | "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", 2079 | "license": "ISC", 2080 | "engines": { 2081 | "node": ">=8" 2082 | } 2083 | }, 2084 | "node_modules/mkdirp": { 2085 | "version": "3.0.1", 2086 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", 2087 | "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", 2088 | "license": "MIT", 2089 | "bin": { 2090 | "mkdirp": "dist/cjs/src/bin.js" 2091 | }, 2092 | "engines": { 2093 | "node": ">=10" 2094 | }, 2095 | "funding": { 2096 | "url": "https://github.com/sponsors/isaacs" 2097 | } 2098 | }, 2099 | "node_modules/ms": { 2100 | "version": "2.1.2", 2101 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 2102 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 2103 | "license": "MIT" 2104 | }, 2105 | "node_modules/natural-compare": { 2106 | "version": "1.4.0", 2107 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 2108 | "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", 2109 | "dev": true, 2110 | "license": "MIT" 2111 | }, 2112 | "node_modules/node-fetch": { 2113 | "version": "2.7.0", 2114 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", 2115 | "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", 2116 | "license": "MIT", 2117 | "dependencies": { 2118 | "whatwg-url": "^5.0.0" 2119 | }, 2120 | "engines": { 2121 | "node": "4.x || >=6.0.0" 2122 | }, 2123 | "peerDependencies": { 2124 | "encoding": "^0.1.0" 2125 | }, 2126 | "peerDependenciesMeta": { 2127 | "encoding": { 2128 | "optional": true 2129 | } 2130 | } 2131 | }, 2132 | "node_modules/node-fetch/node_modules/tr46": { 2133 | "version": "0.0.3", 2134 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", 2135 | "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", 2136 | "license": "MIT" 2137 | }, 2138 | "node_modules/node-fetch/node_modules/webidl-conversions": { 2139 | "version": "3.0.1", 2140 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", 2141 | "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", 2142 | "license": "BSD-2-Clause" 2143 | }, 2144 | "node_modules/node-fetch/node_modules/whatwg-url": { 2145 | "version": "5.0.0", 2146 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", 2147 | "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", 2148 | "license": "MIT", 2149 | "dependencies": { 2150 | "tr46": "~0.0.3", 2151 | "webidl-conversions": "^3.0.0" 2152 | } 2153 | }, 2154 | "node_modules/oauth4webapi": { 2155 | "version": "3.1.4", 2156 | "resolved": "https://registry.npmjs.org/oauth4webapi/-/oauth4webapi-3.1.4.tgz", 2157 | "integrity": "sha512-eVfN3nZNbok2s/ROifO0UAc5G8nRoLSbrcKJ09OqmucgnhXEfdIQOR4gq1eJH1rN3gV7rNw62bDEgftsgFtBEg==", 2158 | "license": "MIT", 2159 | "funding": { 2160 | "url": "https://github.com/sponsors/panva" 2161 | } 2162 | }, 2163 | "node_modules/openid-client": { 2164 | "version": "6.1.7", 2165 | "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-6.1.7.tgz", 2166 | "integrity": "sha512-JfY/KvQgOutmG2P+oVNKInE7zIh+im1MQOaO7g5CtNnTWMociA563WweiEMKfR9ry9XG3K2HGvj9wEqhCQkPMg==", 2167 | "license": "MIT", 2168 | "dependencies": { 2169 | "jose": "^5.9.6", 2170 | "oauth4webapi": "^3.1.4" 2171 | }, 2172 | "funding": { 2173 | "url": "https://github.com/sponsors/panva" 2174 | } 2175 | }, 2176 | "node_modules/openid-client/node_modules/jose": { 2177 | "version": "5.9.6", 2178 | "resolved": "https://registry.npmjs.org/jose/-/jose-5.9.6.tgz", 2179 | "integrity": "sha512-AMlnetc9+CV9asI19zHmrgS/WYsWUwCn2R7RzlbJWD7F9eWYUTGyBmU9o6PxngtLGOiDGPRu+Uc4fhKzbpteZQ==", 2180 | "license": "MIT", 2181 | "funding": { 2182 | "url": "https://github.com/sponsors/panva" 2183 | } 2184 | }, 2185 | "node_modules/p-limit": { 2186 | "version": "3.1.0", 2187 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 2188 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 2189 | "dev": true, 2190 | "license": "MIT", 2191 | "dependencies": { 2192 | "yocto-queue": "^0.1.0" 2193 | }, 2194 | "engines": { 2195 | "node": ">=10" 2196 | }, 2197 | "funding": { 2198 | "url": "https://github.com/sponsors/sindresorhus" 2199 | } 2200 | }, 2201 | "node_modules/p-locate": { 2202 | "version": "5.0.0", 2203 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 2204 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 2205 | "dev": true, 2206 | "license": "MIT", 2207 | "dependencies": { 2208 | "p-limit": "^3.0.2" 2209 | }, 2210 | "engines": { 2211 | "node": ">=10" 2212 | }, 2213 | "funding": { 2214 | "url": "https://github.com/sponsors/sindresorhus" 2215 | } 2216 | }, 2217 | "node_modules/package-json-from-dist": { 2218 | "version": "1.0.1", 2219 | "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", 2220 | "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", 2221 | "license": "BlueOak-1.0.0" 2222 | }, 2223 | "node_modules/parent-module": { 2224 | "version": "1.0.1", 2225 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 2226 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 2227 | "dev": true, 2228 | "license": "MIT", 2229 | "dependencies": { 2230 | "callsites": "^3.0.0" 2231 | }, 2232 | "engines": { 2233 | "node": ">=6" 2234 | } 2235 | }, 2236 | "node_modules/path-exists": { 2237 | "version": "4.0.0", 2238 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 2239 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 2240 | "dev": true, 2241 | "license": "MIT", 2242 | "engines": { 2243 | "node": ">=8" 2244 | } 2245 | }, 2246 | "node_modules/path-key": { 2247 | "version": "3.1.1", 2248 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 2249 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 2250 | "license": "MIT", 2251 | "engines": { 2252 | "node": ">=8" 2253 | } 2254 | }, 2255 | "node_modules/path-scurry": { 2256 | "version": "1.11.1", 2257 | "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", 2258 | "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", 2259 | "license": "BlueOak-1.0.0", 2260 | "dependencies": { 2261 | "lru-cache": "^10.2.0", 2262 | "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" 2263 | }, 2264 | "engines": { 2265 | "node": ">=16 || 14 >=14.18" 2266 | }, 2267 | "funding": { 2268 | "url": "https://github.com/sponsors/isaacs" 2269 | } 2270 | }, 2271 | "node_modules/path-scurry/node_modules/minipass": { 2272 | "version": "7.1.2", 2273 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", 2274 | "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", 2275 | "license": "ISC", 2276 | "engines": { 2277 | "node": ">=16 || 14 >=14.17" 2278 | } 2279 | }, 2280 | "node_modules/picomatch": { 2281 | "version": "2.3.1", 2282 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 2283 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 2284 | "dev": true, 2285 | "license": "MIT", 2286 | "engines": { 2287 | "node": ">=8.6" 2288 | }, 2289 | "funding": { 2290 | "url": "https://github.com/sponsors/jonschlinkert" 2291 | } 2292 | }, 2293 | "node_modules/prelude-ls": { 2294 | "version": "1.2.1", 2295 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", 2296 | "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", 2297 | "dev": true, 2298 | "license": "MIT", 2299 | "engines": { 2300 | "node": ">= 0.8.0" 2301 | } 2302 | }, 2303 | "node_modules/punycode": { 2304 | "version": "2.3.1", 2305 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", 2306 | "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", 2307 | "dev": true, 2308 | "license": "MIT", 2309 | "engines": { 2310 | "node": ">=6" 2311 | } 2312 | }, 2313 | "node_modules/queue-microtask": { 2314 | "version": "1.2.3", 2315 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 2316 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 2317 | "dev": true, 2318 | "funding": [ 2319 | { 2320 | "type": "github", 2321 | "url": "https://github.com/sponsors/feross" 2322 | }, 2323 | { 2324 | "type": "patreon", 2325 | "url": "https://www.patreon.com/feross" 2326 | }, 2327 | { 2328 | "type": "consulting", 2329 | "url": "https://feross.org/support" 2330 | } 2331 | ], 2332 | "license": "MIT" 2333 | }, 2334 | "node_modules/resolve-from": { 2335 | "version": "4.0.0", 2336 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 2337 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 2338 | "dev": true, 2339 | "license": "MIT", 2340 | "engines": { 2341 | "node": ">=4" 2342 | } 2343 | }, 2344 | "node_modules/reusify": { 2345 | "version": "1.1.0", 2346 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", 2347 | "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", 2348 | "dev": true, 2349 | "license": "MIT", 2350 | "engines": { 2351 | "iojs": ">=1.0.0", 2352 | "node": ">=0.10.0" 2353 | } 2354 | }, 2355 | "node_modules/rfc4648": { 2356 | "version": "1.5.3", 2357 | "resolved": "https://registry.npmjs.org/rfc4648/-/rfc4648-1.5.3.tgz", 2358 | "integrity": "sha512-MjOWxM065+WswwnmNONOT+bD1nXzY9Km6u3kzvnx8F8/HXGZdz3T6e6vZJ8Q/RIMUSp/nxqjH3GwvJDy8ijeQQ==", 2359 | "license": "MIT" 2360 | }, 2361 | "node_modules/rimraf": { 2362 | "version": "5.0.10", 2363 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", 2364 | "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", 2365 | "license": "ISC", 2366 | "dependencies": { 2367 | "glob": "^10.3.7" 2368 | }, 2369 | "bin": { 2370 | "rimraf": "dist/esm/bin.mjs" 2371 | }, 2372 | "funding": { 2373 | "url": "https://github.com/sponsors/isaacs" 2374 | } 2375 | }, 2376 | "node_modules/run-parallel": { 2377 | "version": "1.2.0", 2378 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 2379 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 2380 | "dev": true, 2381 | "funding": [ 2382 | { 2383 | "type": "github", 2384 | "url": "https://github.com/sponsors/feross" 2385 | }, 2386 | { 2387 | "type": "patreon", 2388 | "url": "https://www.patreon.com/feross" 2389 | }, 2390 | { 2391 | "type": "consulting", 2392 | "url": "https://feross.org/support" 2393 | } 2394 | ], 2395 | "license": "MIT", 2396 | "dependencies": { 2397 | "queue-microtask": "^1.2.2" 2398 | } 2399 | }, 2400 | "node_modules/semver": { 2401 | "version": "7.7.1", 2402 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", 2403 | "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", 2404 | "dev": true, 2405 | "license": "ISC", 2406 | "bin": { 2407 | "semver": "bin/semver.js" 2408 | }, 2409 | "engines": { 2410 | "node": ">=10" 2411 | } 2412 | }, 2413 | "node_modules/shebang-command": { 2414 | "version": "2.0.0", 2415 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 2416 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 2417 | "license": "MIT", 2418 | "dependencies": { 2419 | "shebang-regex": "^3.0.0" 2420 | }, 2421 | "engines": { 2422 | "node": ">=8" 2423 | } 2424 | }, 2425 | "node_modules/shebang-regex": { 2426 | "version": "3.0.0", 2427 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 2428 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 2429 | "license": "MIT", 2430 | "engines": { 2431 | "node": ">=8" 2432 | } 2433 | }, 2434 | "node_modules/signal-exit": { 2435 | "version": "4.1.0", 2436 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", 2437 | "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", 2438 | "license": "ISC", 2439 | "engines": { 2440 | "node": ">=14" 2441 | }, 2442 | "funding": { 2443 | "url": "https://github.com/sponsors/isaacs" 2444 | } 2445 | }, 2446 | "node_modules/smart-buffer": { 2447 | "version": "4.2.0", 2448 | "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", 2449 | "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", 2450 | "license": "MIT", 2451 | "engines": { 2452 | "node": ">= 6.0.0", 2453 | "npm": ">= 3.0.0" 2454 | } 2455 | }, 2456 | "node_modules/socks": { 2457 | "version": "2.8.4", 2458 | "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.4.tgz", 2459 | "integrity": "sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==", 2460 | "license": "MIT", 2461 | "dependencies": { 2462 | "ip-address": "^9.0.5", 2463 | "smart-buffer": "^4.2.0" 2464 | }, 2465 | "engines": { 2466 | "node": ">= 10.0.0", 2467 | "npm": ">= 3.0.0" 2468 | } 2469 | }, 2470 | "node_modules/socks-proxy-agent": { 2471 | "version": "8.0.5", 2472 | "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", 2473 | "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", 2474 | "license": "MIT", 2475 | "dependencies": { 2476 | "agent-base": "^7.1.2", 2477 | "debug": "^4.3.4", 2478 | "socks": "^2.8.3" 2479 | }, 2480 | "engines": { 2481 | "node": ">= 14" 2482 | } 2483 | }, 2484 | "node_modules/sprintf-js": { 2485 | "version": "1.1.3", 2486 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", 2487 | "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", 2488 | "license": "BSD-3-Clause" 2489 | }, 2490 | "node_modules/stream-buffers": { 2491 | "version": "3.0.3", 2492 | "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-3.0.3.tgz", 2493 | "integrity": "sha512-pqMqwQCso0PBJt2PQmDO0cFj0lyqmiwOMiMSkVtRokl7e+ZTRYgDHKnuZNbqjiJXgsg4nuqtD/zxuo9KqTp0Yw==", 2494 | "license": "Unlicense", 2495 | "engines": { 2496 | "node": ">= 0.10.0" 2497 | } 2498 | }, 2499 | "node_modules/string-width": { 2500 | "version": "5.1.2", 2501 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", 2502 | "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", 2503 | "license": "MIT", 2504 | "dependencies": { 2505 | "eastasianwidth": "^0.2.0", 2506 | "emoji-regex": "^9.2.2", 2507 | "strip-ansi": "^7.0.1" 2508 | }, 2509 | "engines": { 2510 | "node": ">=12" 2511 | }, 2512 | "funding": { 2513 | "url": "https://github.com/sponsors/sindresorhus" 2514 | } 2515 | }, 2516 | "node_modules/string-width-cjs": { 2517 | "name": "string-width", 2518 | "version": "4.2.3", 2519 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 2520 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 2521 | "license": "MIT", 2522 | "dependencies": { 2523 | "emoji-regex": "^8.0.0", 2524 | "is-fullwidth-code-point": "^3.0.0", 2525 | "strip-ansi": "^6.0.1" 2526 | }, 2527 | "engines": { 2528 | "node": ">=8" 2529 | } 2530 | }, 2531 | "node_modules/string-width-cjs/node_modules/emoji-regex": { 2532 | "version": "8.0.0", 2533 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 2534 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 2535 | "license": "MIT" 2536 | }, 2537 | "node_modules/string-width/node_modules/ansi-regex": { 2538 | "version": "6.1.0", 2539 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", 2540 | "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", 2541 | "license": "MIT", 2542 | "engines": { 2543 | "node": ">=12" 2544 | }, 2545 | "funding": { 2546 | "url": "https://github.com/chalk/ansi-regex?sponsor=1" 2547 | } 2548 | }, 2549 | "node_modules/string-width/node_modules/strip-ansi": { 2550 | "version": "7.1.0", 2551 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", 2552 | "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", 2553 | "license": "MIT", 2554 | "dependencies": { 2555 | "ansi-regex": "^6.0.1" 2556 | }, 2557 | "engines": { 2558 | "node": ">=12" 2559 | }, 2560 | "funding": { 2561 | "url": "https://github.com/chalk/strip-ansi?sponsor=1" 2562 | } 2563 | }, 2564 | "node_modules/strip-ansi": { 2565 | "version": "6.0.1", 2566 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2567 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2568 | "license": "MIT", 2569 | "dependencies": { 2570 | "ansi-regex": "^5.0.1" 2571 | }, 2572 | "engines": { 2573 | "node": ">=8" 2574 | } 2575 | }, 2576 | "node_modules/strip-ansi-cjs": { 2577 | "name": "strip-ansi", 2578 | "version": "6.0.1", 2579 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2580 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2581 | "license": "MIT", 2582 | "dependencies": { 2583 | "ansi-regex": "^5.0.1" 2584 | }, 2585 | "engines": { 2586 | "node": ">=8" 2587 | } 2588 | }, 2589 | "node_modules/strip-json-comments": { 2590 | "version": "3.1.1", 2591 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 2592 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 2593 | "dev": true, 2594 | "license": "MIT", 2595 | "engines": { 2596 | "node": ">=8" 2597 | }, 2598 | "funding": { 2599 | "url": "https://github.com/sponsors/sindresorhus" 2600 | } 2601 | }, 2602 | "node_modules/supports-color": { 2603 | "version": "7.2.0", 2604 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 2605 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 2606 | "dev": true, 2607 | "license": "MIT", 2608 | "dependencies": { 2609 | "has-flag": "^4.0.0" 2610 | }, 2611 | "engines": { 2612 | "node": ">=8" 2613 | } 2614 | }, 2615 | "node_modules/tar": { 2616 | "version": "7.4.3", 2617 | "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", 2618 | "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", 2619 | "license": "ISC", 2620 | "dependencies": { 2621 | "@isaacs/fs-minipass": "^4.0.0", 2622 | "chownr": "^3.0.0", 2623 | "minipass": "^7.1.2", 2624 | "minizlib": "^3.0.1", 2625 | "mkdirp": "^3.0.1", 2626 | "yallist": "^5.0.0" 2627 | }, 2628 | "engines": { 2629 | "node": ">=18" 2630 | } 2631 | }, 2632 | "node_modules/tar/node_modules/chownr": { 2633 | "version": "3.0.0", 2634 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", 2635 | "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", 2636 | "license": "BlueOak-1.0.0", 2637 | "engines": { 2638 | "node": ">=18" 2639 | } 2640 | }, 2641 | "node_modules/tar/node_modules/minipass": { 2642 | "version": "7.1.2", 2643 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", 2644 | "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", 2645 | "license": "ISC", 2646 | "engines": { 2647 | "node": ">=16 || 14 >=14.17" 2648 | } 2649 | }, 2650 | "node_modules/tar/node_modules/minizlib": { 2651 | "version": "3.0.1", 2652 | "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.1.tgz", 2653 | "integrity": "sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==", 2654 | "license": "MIT", 2655 | "dependencies": { 2656 | "minipass": "^7.0.4", 2657 | "rimraf": "^5.0.5" 2658 | }, 2659 | "engines": { 2660 | "node": ">= 18" 2661 | } 2662 | }, 2663 | "node_modules/tar/node_modules/yallist": { 2664 | "version": "5.0.0", 2665 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", 2666 | "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", 2667 | "license": "BlueOak-1.0.0", 2668 | "engines": { 2669 | "node": ">=18" 2670 | } 2671 | }, 2672 | "node_modules/tmp": { 2673 | "version": "0.2.3", 2674 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", 2675 | "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", 2676 | "license": "MIT", 2677 | "engines": { 2678 | "node": ">=14.14" 2679 | } 2680 | }, 2681 | "node_modules/tmp-promise": { 2682 | "version": "3.0.3", 2683 | "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz", 2684 | "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==", 2685 | "license": "MIT", 2686 | "dependencies": { 2687 | "tmp": "^0.2.0" 2688 | } 2689 | }, 2690 | "node_modules/to-regex-range": { 2691 | "version": "5.0.1", 2692 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 2693 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 2694 | "dev": true, 2695 | "license": "MIT", 2696 | "dependencies": { 2697 | "is-number": "^7.0.0" 2698 | }, 2699 | "engines": { 2700 | "node": ">=8.0" 2701 | } 2702 | }, 2703 | "node_modules/ts-api-utils": { 2704 | "version": "2.0.1", 2705 | "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.0.1.tgz", 2706 | "integrity": "sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==", 2707 | "dev": true, 2708 | "license": "MIT", 2709 | "engines": { 2710 | "node": ">=18.12" 2711 | }, 2712 | "peerDependencies": { 2713 | "typescript": ">=4.8.4" 2714 | } 2715 | }, 2716 | "node_modules/ts-node": { 2717 | "version": "10.9.2", 2718 | "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", 2719 | "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", 2720 | "dev": true, 2721 | "license": "MIT", 2722 | "dependencies": { 2723 | "@cspotcode/source-map-support": "^0.8.0", 2724 | "@tsconfig/node10": "^1.0.7", 2725 | "@tsconfig/node12": "^1.0.7", 2726 | "@tsconfig/node14": "^1.0.0", 2727 | "@tsconfig/node16": "^1.0.2", 2728 | "acorn": "^8.4.1", 2729 | "acorn-walk": "^8.1.1", 2730 | "arg": "^4.1.0", 2731 | "create-require": "^1.1.0", 2732 | "diff": "^4.0.1", 2733 | "make-error": "^1.1.1", 2734 | "v8-compile-cache-lib": "^3.0.1", 2735 | "yn": "3.1.1" 2736 | }, 2737 | "bin": { 2738 | "ts-node": "dist/bin.js", 2739 | "ts-node-cwd": "dist/bin-cwd.js", 2740 | "ts-node-esm": "dist/bin-esm.js", 2741 | "ts-node-script": "dist/bin-script.js", 2742 | "ts-node-transpile-only": "dist/bin-transpile.js", 2743 | "ts-script": "dist/bin-script-deprecated.js" 2744 | }, 2745 | "peerDependencies": { 2746 | "@swc/core": ">=1.2.50", 2747 | "@swc/wasm": ">=1.2.50", 2748 | "@types/node": "*", 2749 | "typescript": ">=2.7" 2750 | }, 2751 | "peerDependenciesMeta": { 2752 | "@swc/core": { 2753 | "optional": true 2754 | }, 2755 | "@swc/wasm": { 2756 | "optional": true 2757 | } 2758 | } 2759 | }, 2760 | "node_modules/type-check": { 2761 | "version": "0.4.0", 2762 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", 2763 | "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", 2764 | "dev": true, 2765 | "license": "MIT", 2766 | "dependencies": { 2767 | "prelude-ls": "^1.2.1" 2768 | }, 2769 | "engines": { 2770 | "node": ">= 0.8.0" 2771 | } 2772 | }, 2773 | "node_modules/typescript": { 2774 | "version": "5.8.2", 2775 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", 2776 | "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", 2777 | "dev": true, 2778 | "license": "Apache-2.0", 2779 | "bin": { 2780 | "tsc": "bin/tsc", 2781 | "tsserver": "bin/tsserver" 2782 | }, 2783 | "engines": { 2784 | "node": ">=14.17" 2785 | } 2786 | }, 2787 | "node_modules/typescript-eslint": { 2788 | "version": "8.26.1", 2789 | "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.26.1.tgz", 2790 | "integrity": "sha512-t/oIs9mYyrwZGRpDv3g+3K6nZ5uhKEMt2oNmAPwaY4/ye0+EH4nXIPYNtkYFS6QHm+1DFg34DbglYBz5P9Xysg==", 2791 | "dev": true, 2792 | "license": "MIT", 2793 | "dependencies": { 2794 | "@typescript-eslint/eslint-plugin": "8.26.1", 2795 | "@typescript-eslint/parser": "8.26.1", 2796 | "@typescript-eslint/utils": "8.26.1" 2797 | }, 2798 | "engines": { 2799 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 2800 | }, 2801 | "funding": { 2802 | "type": "opencollective", 2803 | "url": "https://opencollective.com/typescript-eslint" 2804 | }, 2805 | "peerDependencies": { 2806 | "eslint": "^8.57.0 || ^9.0.0", 2807 | "typescript": ">=4.8.4 <5.9.0" 2808 | } 2809 | }, 2810 | "node_modules/undici-types": { 2811 | "version": "5.26.5", 2812 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", 2813 | "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", 2814 | "license": "MIT" 2815 | }, 2816 | "node_modules/uri-js": { 2817 | "version": "4.4.1", 2818 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 2819 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 2820 | "dev": true, 2821 | "license": "BSD-2-Clause", 2822 | "dependencies": { 2823 | "punycode": "^2.1.0" 2824 | } 2825 | }, 2826 | "node_modules/uuid": { 2827 | "version": "9.0.1", 2828 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", 2829 | "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", 2830 | "funding": [ 2831 | "https://github.com/sponsors/broofa", 2832 | "https://github.com/sponsors/ctavan" 2833 | ], 2834 | "license": "MIT", 2835 | "bin": { 2836 | "uuid": "dist/bin/uuid" 2837 | } 2838 | }, 2839 | "node_modules/v8-compile-cache-lib": { 2840 | "version": "3.0.1", 2841 | "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", 2842 | "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", 2843 | "dev": true, 2844 | "license": "MIT" 2845 | }, 2846 | "node_modules/which": { 2847 | "version": "2.0.2", 2848 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 2849 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 2850 | "license": "ISC", 2851 | "dependencies": { 2852 | "isexe": "^2.0.0" 2853 | }, 2854 | "bin": { 2855 | "node-which": "bin/node-which" 2856 | }, 2857 | "engines": { 2858 | "node": ">= 8" 2859 | } 2860 | }, 2861 | "node_modules/word-wrap": { 2862 | "version": "1.2.5", 2863 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", 2864 | "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", 2865 | "dev": true, 2866 | "license": "MIT", 2867 | "engines": { 2868 | "node": ">=0.10.0" 2869 | } 2870 | }, 2871 | "node_modules/wrap-ansi": { 2872 | "version": "8.1.0", 2873 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", 2874 | "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", 2875 | "license": "MIT", 2876 | "dependencies": { 2877 | "ansi-styles": "^6.1.0", 2878 | "string-width": "^5.0.1", 2879 | "strip-ansi": "^7.0.1" 2880 | }, 2881 | "engines": { 2882 | "node": ">=12" 2883 | }, 2884 | "funding": { 2885 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 2886 | } 2887 | }, 2888 | "node_modules/wrap-ansi-cjs": { 2889 | "name": "wrap-ansi", 2890 | "version": "7.0.0", 2891 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 2892 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 2893 | "license": "MIT", 2894 | "dependencies": { 2895 | "ansi-styles": "^4.0.0", 2896 | "string-width": "^4.1.0", 2897 | "strip-ansi": "^6.0.0" 2898 | }, 2899 | "engines": { 2900 | "node": ">=10" 2901 | }, 2902 | "funding": { 2903 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 2904 | } 2905 | }, 2906 | "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { 2907 | "version": "8.0.0", 2908 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 2909 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 2910 | "license": "MIT" 2911 | }, 2912 | "node_modules/wrap-ansi-cjs/node_modules/string-width": { 2913 | "version": "4.2.3", 2914 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 2915 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 2916 | "license": "MIT", 2917 | "dependencies": { 2918 | "emoji-regex": "^8.0.0", 2919 | "is-fullwidth-code-point": "^3.0.0", 2920 | "strip-ansi": "^6.0.1" 2921 | }, 2922 | "engines": { 2923 | "node": ">=8" 2924 | } 2925 | }, 2926 | "node_modules/wrap-ansi/node_modules/ansi-regex": { 2927 | "version": "6.1.0", 2928 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", 2929 | "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", 2930 | "license": "MIT", 2931 | "engines": { 2932 | "node": ">=12" 2933 | }, 2934 | "funding": { 2935 | "url": "https://github.com/chalk/ansi-regex?sponsor=1" 2936 | } 2937 | }, 2938 | "node_modules/wrap-ansi/node_modules/ansi-styles": { 2939 | "version": "6.2.1", 2940 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", 2941 | "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", 2942 | "license": "MIT", 2943 | "engines": { 2944 | "node": ">=12" 2945 | }, 2946 | "funding": { 2947 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 2948 | } 2949 | }, 2950 | "node_modules/wrap-ansi/node_modules/strip-ansi": { 2951 | "version": "7.1.0", 2952 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", 2953 | "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", 2954 | "license": "MIT", 2955 | "dependencies": { 2956 | "ansi-regex": "^6.0.1" 2957 | }, 2958 | "engines": { 2959 | "node": ">=12" 2960 | }, 2961 | "funding": { 2962 | "url": "https://github.com/chalk/strip-ansi?sponsor=1" 2963 | } 2964 | }, 2965 | "node_modules/ws": { 2966 | "version": "8.18.0", 2967 | "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", 2968 | "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", 2969 | "license": "MIT", 2970 | "engines": { 2971 | "node": ">=10.0.0" 2972 | }, 2973 | "peerDependencies": { 2974 | "bufferutil": "^4.0.1", 2975 | "utf-8-validate": ">=5.0.2" 2976 | }, 2977 | "peerDependenciesMeta": { 2978 | "bufferutil": { 2979 | "optional": true 2980 | }, 2981 | "utf-8-validate": { 2982 | "optional": true 2983 | } 2984 | } 2985 | }, 2986 | "node_modules/yn": { 2987 | "version": "3.1.1", 2988 | "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", 2989 | "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", 2990 | "dev": true, 2991 | "license": "MIT", 2992 | "engines": { 2993 | "node": ">=6" 2994 | } 2995 | }, 2996 | "node_modules/yocto-queue": { 2997 | "version": "0.1.0", 2998 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 2999 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 3000 | "dev": true, 3001 | "license": "MIT", 3002 | "engines": { 3003 | "node": ">=10" 3004 | }, 3005 | "funding": { 3006 | "url": "https://github.com/sponsors/sindresorhus" 3007 | } 3008 | } 3009 | } 3010 | } 3011 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@dot-i/k8s-operator", 3 | "version": "3.1.0", 4 | "description": "Build Kubernetes operators in NodeJS (and TypeScript)", 5 | "author": { 6 | "name": "Nico Francois", 7 | "email": "nico.francois@dot-i.com" 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "https://github.com/dot-i/k8s-operator-node" 12 | }, 13 | "files": [ 14 | "dist/*.ts", 15 | "dist/*.js", 16 | "*.md" 17 | ], 18 | "license": "Apache-2.0", 19 | "main": "dist/operator.js", 20 | "types": "dist/operator.d.ts", 21 | "engines": { 22 | "node": ">=18" 23 | }, 24 | "dependencies": { 25 | "@kubernetes/client-node": "^1.1.0", 26 | "async": "^3.2.6", 27 | "gaxios": "^6.7.1" 28 | }, 29 | "devDependencies": { 30 | "@eslint/js": "^9.22.0", 31 | "@types/async": "^3.2.24", 32 | "@types/byline": "^4.2.36", 33 | "@types/js-yaml": "^4.0.9", 34 | "@types/node": "^18", 35 | "@types/ws": "^8.18.0", 36 | "eslint": "^9.22.0", 37 | "mkdirp": "^3.0.1", 38 | "ts-node": "^10.9.2", 39 | "typescript": "^5.8.2", 40 | "typescript-eslint": "^8.26.1" 41 | }, 42 | "scripts": { 43 | "lint": "eslint ./src", 44 | "clean": "rm -Rf node_modules/ dist/", 45 | "build": "tsc", 46 | "watch": "tsc --watch", 47 | "prepare": "rm -Rf dist/ && npm run build" 48 | }, 49 | "keywords": [ 50 | "kubernetes", 51 | "k8s", 52 | "operator" 53 | ] 54 | } 55 | -------------------------------------------------------------------------------- /publish.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | npm publish --access public 3 | -------------------------------------------------------------------------------- /src/operator.ts: -------------------------------------------------------------------------------- 1 | import * as Async from 'async'; 2 | import * as FS from 'fs'; 3 | import * as k8s from '@kubernetes/client-node'; 4 | import * as https from 'https'; 5 | import { 6 | KubernetesObject, 7 | loadYaml, 8 | V1CustomResourceDefinition, 9 | V1CustomResourceDefinitionVersion, 10 | Watch, 11 | } from '@kubernetes/client-node'; 12 | import { instance as gaxios, GaxiosOptions, Headers } from 'gaxios'; 13 | 14 | /** 15 | * Logger interface. 16 | */ 17 | export interface OperatorLogger { 18 | debug(message: string): void; 19 | info(message: string): void; 20 | warn(message: string): void; 21 | error(message: string): void; 22 | } 23 | 24 | class NullLogger implements OperatorLogger { 25 | // eslint-disable-next-line @typescript-eslint/no-unused-vars 26 | public debug(message: string): void { 27 | // no-op 28 | } 29 | // eslint-disable-next-line @typescript-eslint/no-unused-vars 30 | public info(message: string): void { 31 | // no-op 32 | } 33 | // eslint-disable-next-line @typescript-eslint/no-unused-vars 34 | public warn(message: string): void { 35 | // no-op 36 | } 37 | // eslint-disable-next-line @typescript-eslint/no-unused-vars 38 | public error(message: string): void { 39 | // no-op 40 | } 41 | } 42 | 43 | /** 44 | * The resource event type. 45 | */ 46 | export enum ResourceEventType { 47 | Added = 'ADDED', 48 | Modified = 'MODIFIED', 49 | Deleted = 'DELETED', 50 | } 51 | 52 | /** 53 | * An event on a Kubernetes resource. 54 | */ 55 | export interface ResourceEvent { 56 | meta: ResourceMeta; 57 | type: ResourceEventType; 58 | object: KubernetesObject; 59 | } 60 | 61 | /** 62 | * Some meta information on the resource. 63 | */ 64 | export interface ResourceMeta { 65 | name: string; 66 | namespace?: string; 67 | id: string; 68 | resourceVersion: string; 69 | apiVersion: string; 70 | kind: string; 71 | } 72 | 73 | export class ResourceMetaImpl implements ResourceMeta { 74 | public static createWithId(id: string, object: KubernetesObject): ResourceMeta { 75 | return new ResourceMetaImpl(id, object); 76 | } 77 | 78 | public static createWithPlural(plural: string, object: KubernetesObject): ResourceMeta { 79 | return new ResourceMetaImpl(`${plural}.${object.apiVersion}`, object); 80 | } 81 | 82 | public id: string; 83 | public name: string; 84 | public namespace?: string; 85 | public resourceVersion: string; 86 | public apiVersion: string; 87 | public kind: string; 88 | 89 | private constructor(id: string, object: KubernetesObject) { 90 | if (!object.metadata?.name || !object.metadata?.resourceVersion || !object.apiVersion || !object.kind) { 91 | throw Error(`Malformed event object for '${id}'`); 92 | } 93 | this.id = id; 94 | this.name = object.metadata.name; 95 | this.namespace = object.metadata.namespace; 96 | this.resourceVersion = object.metadata.resourceVersion; 97 | this.apiVersion = object.apiVersion; 98 | this.kind = object.kind; 99 | } 100 | } 101 | 102 | /** 103 | * Base class for an operator. 104 | */ 105 | export default abstract class Operator { 106 | protected kubeConfig: k8s.KubeConfig; 107 | protected k8sApi: k8s.CoreV1Api; 108 | protected logger: OperatorLogger; 109 | 110 | private resourcePathBuilders: Record string> = {}; 111 | private watchRequests: Record = {}; 112 | private eventQueue: Async.QueueObject<{ 113 | event: ResourceEvent; 114 | onEvent: (event: ResourceEvent) => Promise; 115 | }>; 116 | 117 | /** 118 | * Constructs an operator. 119 | */ 120 | constructor(logger?: OperatorLogger) { 121 | this.kubeConfig = new k8s.KubeConfig(); 122 | this.kubeConfig.loadFromDefault(); 123 | this.k8sApi = this.kubeConfig.makeApiClient(k8s.CoreV1Api); 124 | this.logger = logger || new NullLogger(); 125 | 126 | // Use an async queue to make sure we treat each incoming event sequentially using async/await 127 | this.eventQueue = Async.queue<{ 128 | onEvent: (event: ResourceEvent) => Promise; 129 | event: ResourceEvent; 130 | }>(async (args) => await args.onEvent(args.event)); 131 | } 132 | 133 | /** 134 | * Run the operator, typically called from main(). 135 | */ 136 | public async start(): Promise { 137 | await this.init(); 138 | } 139 | 140 | public stop(): void { 141 | for (const req of Object.values(this.watchRequests)) { 142 | req.abort(); 143 | } 144 | } 145 | 146 | /** 147 | * Initialize the operator, add your resource watchers here. 148 | */ 149 | protected abstract init(): Promise; 150 | 151 | /** 152 | * Register a custom resource defintion. 153 | * @param crdFile The path to the custom resource definition's YAML file 154 | */ 155 | protected async registerCustomResourceDefinition(crdFile: string): Promise<{ 156 | group: string; 157 | versions: V1CustomResourceDefinitionVersion[]; 158 | plural: string; 159 | }> { 160 | const crd = loadYaml(FS.readFileSync(crdFile, 'utf8')) as V1CustomResourceDefinition; 161 | try { 162 | const apiVersion = crd.apiVersion as string; 163 | if (!apiVersion || !apiVersion.startsWith('apiextensions.k8s.io/')) { 164 | throw new Error("Invalid CRD yaml (expected 'apiextensions.k8s.io')"); 165 | } 166 | await this.kubeConfig.makeApiClient(k8s.ApiextensionsV1Api).createCustomResourceDefinition({ 167 | body: crd 168 | }); 169 | this.logger.info(`registered custom resource definition '${crd.metadata?.name}'`); 170 | } catch (err) { 171 | // API returns a 409 Conflict if CRD already exists. 172 | // eslint-disable-next-line @typescript-eslint/no-explicit-any 173 | if ((err as any).response?.statusCode !== 409) { 174 | throw err; 175 | } 176 | } 177 | return { 178 | group: crd.spec.group, 179 | versions: crd.spec.versions, 180 | plural: crd.spec.names.plural, 181 | }; 182 | } 183 | 184 | /** 185 | * Get uri to the API for your custom resource. 186 | * @param group The group of the custom resource 187 | * @param version The version of the custom resource 188 | * @param plural The plural name of the custom resource 189 | * @param namespace Optional namespace to include in the uri 190 | */ 191 | protected getCustomResourceApiUri(group: string, version: string, plural: string, namespace?: string): string { 192 | let path = group ? `/apis/${group}/${version}/` : `/api/${version}/`; 193 | if (namespace) { 194 | path += `namespaces/${namespace}/`; 195 | } 196 | path += plural; 197 | return this.kubeConfig.getCurrentCluster()?.server + path; 198 | } 199 | 200 | /** 201 | * Watch a Kubernetes resource. 202 | * @param group The group of the resource or an empty string for core resources 203 | * @param version The version of the resource 204 | * @param plural The plural name of the resource 205 | * @param onEvent The async callback for added, modified or deleted events on the resource 206 | * @param namespace The namespace of the resource (optional) 207 | */ 208 | protected async watchResource( 209 | group: string, 210 | version: string, 211 | plural: string, 212 | onEvent: (event: ResourceEvent) => Promise, 213 | namespace?: string 214 | ): Promise { 215 | const apiVersion = group ? `${group}/${version}` : `${version}`; 216 | const id = `${plural}.${apiVersion}`; 217 | 218 | this.resourcePathBuilders[id] = (meta: ResourceMeta): string => 219 | this.getCustomResourceApiUri(group, version, plural, meta.namespace); 220 | 221 | // 222 | // Create "infinite" watch so we automatically recover in case the stream stops or gives an error. 223 | // 224 | let uri = group ? `/apis/${group}/${version}/` : `/api/${version}/`; 225 | if (namespace) { 226 | uri += `namespaces/${namespace}/`; 227 | } 228 | uri += plural; 229 | 230 | const watch = new Watch(this.kubeConfig); 231 | 232 | const startWatch = (): Promise => 233 | watch 234 | .watch( 235 | uri, 236 | {}, 237 | (phase, obj) => 238 | this.eventQueue.push({ 239 | event: { 240 | meta: ResourceMetaImpl.createWithPlural(plural, obj), 241 | object: obj, 242 | type: phase as ResourceEventType, 243 | }, 244 | onEvent, 245 | }), 246 | (err) => { 247 | if (err) { 248 | this.logger.error(`watch on resource ${id} failed: ${this.errorToJson(err)}`); 249 | process.exit(1); 250 | } 251 | this.logger.debug(`restarting watch on resource ${id}`); 252 | setTimeout(startWatch, 200); 253 | }, 254 | ) 255 | .catch((reason) => { 256 | this.logger.error(`watch on resource ${id} failed: ${this.errorToJson(reason)}`); 257 | process.exit(1); 258 | }) 259 | .then((req) => (this.watchRequests[id] = req)); 260 | 261 | await startWatch(); 262 | 263 | this.logger.info(`watching resource ${id}`); 264 | } 265 | 266 | /** 267 | * Set the status subresource of a custom resource (if it has one defined). 268 | * @param meta The resource to update 269 | * @param status The status body to set 270 | */ 271 | protected async setResourceStatus(meta: ResourceMeta, status: unknown): Promise { 272 | return await this.resourceStatusRequest('PUT', meta, status); 273 | } 274 | 275 | /** 276 | * Patch the status subresource of a custom resource (if it has one defined). 277 | * @param meta The resource to update 278 | * @param status The status body to set in JSON Merge Patch format (https://tools.ietf.org/html/rfc7386) 279 | */ 280 | protected async patchResourceStatus(meta: ResourceMeta, status: unknown): Promise { 281 | return await this.resourceStatusRequest('PATCH', meta, status); 282 | } 283 | 284 | /** 285 | * Handle deletion of resource using a unique finalizer. Call this when you receive an added or modified event. 286 | * 287 | * If the resource doesn't have the finalizer set yet, it will be added. If the finalizer is set and the resource 288 | * is marked for deletion by Kubernetes your 'deleteAction' action will be called and the finalizer will be removed. 289 | * @param event The added or modified event. 290 | * @param finalizer Your unique finalizer string 291 | * @param deleteAction An async action that will be called before your resource is deleted. 292 | * @returns True if no further action is needed, false if you still need to process the added or modified event yourself. 293 | */ 294 | protected async handleResourceFinalizer( 295 | event: ResourceEvent, 296 | finalizer: string, 297 | deleteAction: (event: ResourceEvent) => Promise 298 | ): Promise { 299 | const metadata = event.object.metadata; 300 | if (!metadata || (event.type !== ResourceEventType.Added && event.type !== ResourceEventType.Modified)) { 301 | return false; 302 | } 303 | if (!metadata.deletionTimestamp && (!metadata.finalizers || !metadata.finalizers.includes(finalizer))) { 304 | // Make sure our finalizer is added when the resource is first created. 305 | const finalizers = metadata.finalizers ?? []; 306 | finalizers.push(finalizer); 307 | await this.setResourceFinalizers(event.meta, finalizers); 308 | return true; 309 | } else if (metadata.deletionTimestamp) { 310 | if (metadata.finalizers && metadata.finalizers.includes(finalizer)) { 311 | // Resource is marked for deletion with our finalizer still set. So run the delete action 312 | // and clear the finalizer, so the resource will actually be deleted by Kubernetes. 313 | await deleteAction(event); 314 | const finalizers = metadata.finalizers.filter((f) => f !== finalizer); 315 | await this.setResourceFinalizers(event.meta, finalizers); 316 | } 317 | // Resource is marked for deletion, so don't process it further. 318 | return true; 319 | } 320 | return false; 321 | } 322 | 323 | /** 324 | * Set (or clear) the finalizers of a resource. 325 | * @param meta The resource to update 326 | * @param finalizers The array of finalizers for this resource 327 | */ 328 | protected async setResourceFinalizers(meta: ResourceMeta, finalizers: string[]): Promise { 329 | const options: GaxiosOptions = { 330 | method: 'PATCH', 331 | url: `${this.resourcePathBuilders[meta.id](meta)}/${meta.name}`, 332 | data: { 333 | metadata: { 334 | finalizers, 335 | }, 336 | }, 337 | headers: { 338 | 'Content-Type': 'application/merge-patch+json', 339 | }, 340 | }; 341 | 342 | await this.applyGaxiosKubeConfigAuth(options); 343 | 344 | await gaxios.request(options).catch((error) => { 345 | if (error) { 346 | this.logger.error(this.errorToJson(error)); 347 | return; 348 | } 349 | }); 350 | } 351 | 352 | /** 353 | * Apply authentication to an axios request config. 354 | * @param request the axios request config 355 | */ 356 | protected async applyAxiosKubeConfigAuth(request: { 357 | headers?: Record; 358 | // eslint-disable-next-line @typescript-eslint/no-explicit-any 359 | httpsAgent?: any; 360 | auth?: { username: string; password: string }; 361 | }): Promise { 362 | const opts: https.RequestOptions = {}; 363 | await this.kubeConfig.applyToHTTPSOptions(opts); 364 | if (opts.headers?.Authorization) { 365 | request.headers = request.headers ?? {}; 366 | request.headers.Authorization = opts.headers.Authorization as string; 367 | } 368 | if (opts.auth) { 369 | const userPassword = opts.auth.split(':'); 370 | request.auth = { 371 | username: userPassword[0], 372 | password: userPassword[1], 373 | }; 374 | } 375 | if (opts.ca || opts.cert || opts.key) { 376 | request.httpsAgent = new https.Agent({ 377 | ca: opts.ca, 378 | cert: opts.cert, 379 | key: opts.key, 380 | }); 381 | } 382 | } 383 | 384 | /** 385 | * Apply authentication to an axios request config. 386 | * @param options the axios request config 387 | */ 388 | protected async applyGaxiosKubeConfigAuth(options: { 389 | headers?: Headers; 390 | // eslint-disable-next-line @typescript-eslint/no-explicit-any 391 | agent?: any; 392 | }): Promise { 393 | const opts: https.RequestOptions = {}; 394 | await this.kubeConfig.applyToHTTPSOptions(opts); 395 | if (opts.headers?.Authorization) { 396 | options.headers = options.headers ?? {}; 397 | options.headers.Authorization = opts.headers.Authorization as string; 398 | } else if (opts.auth) { 399 | options.headers = options.headers ?? {}; 400 | options.headers.Authorization = `Basic ${Buffer.from(opts.auth).toString('base64')}`; 401 | } 402 | if (opts.ca || opts.cert || opts.key) { 403 | options.agent = new https.Agent({ 404 | ca: opts.ca, 405 | cert: opts.cert, 406 | key: opts.key, 407 | }); 408 | } 409 | } 410 | 411 | private async resourceStatusRequest( 412 | method: 'PUT' | 'PATCH', 413 | meta: ResourceMeta, 414 | status: unknown 415 | ): Promise { 416 | // eslint-disable-next-line @typescript-eslint/no-explicit-any 417 | const body: any = { 418 | apiVersion: meta.apiVersion, 419 | kind: meta.kind, 420 | metadata: { 421 | name: meta.name, 422 | resourceVersion: meta.resourceVersion, 423 | }, 424 | status, 425 | }; 426 | if (meta.namespace) { 427 | body.metadata.namespace = meta.namespace; 428 | } 429 | const options: GaxiosOptions = { 430 | method, 431 | url: this.resourcePathBuilders[meta.id](meta) + `/${meta.name}/status`, 432 | data: body, 433 | }; 434 | if (method === 'PATCH') { 435 | options.headers = { 436 | 'Content-Type': 'application/merge-patch+json', 437 | }; 438 | } 439 | await this.applyGaxiosKubeConfigAuth(options); 440 | try { 441 | const response = await gaxios.request(options); 442 | return response ? ResourceMetaImpl.createWithId(meta.id, response.data) : null; 443 | } catch (err) { 444 | this.logger.error(this.errorToJson(err)); 445 | return null; 446 | } 447 | } 448 | 449 | private errorToJson(err: unknown): string { 450 | if (typeof err === 'string') { 451 | return err; 452 | } else if ((err as Error)?.message && (err as Error).stack) { 453 | return JSON.stringify(err, ['name', 'message', 'stack']); 454 | } 455 | return JSON.stringify(err); 456 | } 457 | } 458 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "es2017", 5 | "outDir": "dist", 6 | "esModuleInterop": true, 7 | "declaration": true, 8 | "sourceMap": true, 9 | "skipLibCheck": true, 10 | "strict": true 11 | }, 12 | "include": [ 13 | "src/**/*" 14 | ] 15 | } 16 | -------------------------------------------------------------------------------- /version-check.js: -------------------------------------------------------------------------------- 1 | // This script is supposed to be run in travis to check package version matches 2 | // because of this it is designed to be run on a "clean" git checkout 3 | // this will fail if run after npm install (since npm install updates package-lock) 4 | const packageVersion = require('./package.json').version 5 | const lockVersion = require('./package-lock.json').version 6 | if (packageVersion != lockVersion) { 7 | console.log(`version in package.json (${packageVersion}) does not match package-lock.json (${lockVersion})`); 8 | process.exit(1); 9 | } 10 | --------------------------------------------------------------------------------