├── .gitignore ├── .prettierrc ├── CHANGELOG.md ├── LICENSE ├── README.md ├── images ├── interactive-mode-error.png ├── strict-mode-error.png └── user-input-secret-prompt.png ├── package-lock.json ├── package.json ├── src ├── .clasp.json ├── SecretService.js ├── appsscript.json └── package.json └── tests ├── integration-tests.js ├── mocks ├── PropertiesInstance.js ├── SpreadsheetApp.js └── Storage.js └── test.js /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | coverage 3 | .DS_Store 4 | .vscode -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "printWidth": 100, 3 | "singleQuote": false, 4 | "trailingComma": "es5", 5 | "tabWidth": 4 6 | } 7 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | ## 2024-03-08 - 1.0.0 4 | 5 | - First public release. 6 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright 2024 Dataful.Tech 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # SecretService 2 | 3 | SecretService is a Google Apps Script library that allows to store secrets (passwords, API keys, etc.) safer and provides the following features: 4 | 5 | - Choose a storage for the secrets: 6 | - Any `Properties` instance from your script 7 | - Custom secret storage, like Google Cloud Secret Manager 8 | - Different modes in case of a missing secret: 9 | - Silent: do nothing, return null. 10 | - Strict: throw an error. 11 | - Interactive: prompt the user for a missing secret. 12 | 13 | SecretService is a [Dataful.Tech](https://dataful.tech) project. 14 | 15 | ## Security Note 16 | 17 | Storing secrets in Google Apps Script safely is challenging. The root cause is that other users often have access to the code and can edit it. 18 | 19 | For example, if you have a script attached to a Google Sheets document, any editor of the document will automatically be able to edit the script to display the secrets. The owner of the script will get a notification but it can be easily missed and the damage will be done by then. There are techniques to reduce the surface of the attack, however, they all come with their costs and inconveniences. 20 | 21 | ## Setup 22 | 23 | You can use SecretService in two ways: 24 | 25 | 1. **As a library**: use the library id `164Mv6awN8mIExnFu6ZeXviPSA2GhDVP3grAMfiJCpAkcjcGWaDlNU9K4`. 26 | 2. **Copy the code** from `src/SecretService.js` to your project. 27 | 28 | ## Usage 29 | 30 | Using SecretService is simple: either use library's methods directly or create an instance. 31 | 32 | ### Use Library Directly 33 | 34 | You can use the library directly, without initializing an instance: 35 | 36 | ```js 37 | const config = { 38 | storage: PropertiesService.getUserProperties(), 39 | }; 40 | 41 | // Only once: set the secret 42 | // You can skip this step if you use the `interactive` mode 43 | SecretService.setSecret("API_KEY", "very-secret-value", config); 44 | 45 | // 3. Get the secret 46 | SecretService.getSecret("API_KEY", config); 47 | 48 | // Delete specific secrets: 49 | SecretService.deleteSecrets(["API_KEY", "ANOTHER_SECRET"], config); 50 | 51 | // Delete all secrets: 52 | SecretService.deleteAllSecrets(config); 53 | ``` 54 | 55 | ### Create an Instance 56 | 57 | To avoid passing configuration on each call, you create an instance: 58 | 59 | ```js 60 | // Initialize with a configuration passing a storage object 61 | const SECRETS = SecretService.init({ 62 | storage: PropertiesService.getUserProperties(), 63 | }); 64 | 65 | // Only once: set the secret 66 | // You can skip this step if you use the `interactive` mode 67 | SECRETS.setSecret("API_KEY", "very-secret-value"); 68 | 69 | // 3. Get the secret 70 | const secretValue = SECRETS.getSecret("API_KEY"); 71 | 72 | // Delete specific secrets: 73 | SECRETS.deleteSecrets(["API_KEY", "ANOTHER_SECRET"]); 74 | 75 | // Delete all secrets: 76 | SECRETS.deleteAllSecrets(); 77 | ``` 78 | 79 | See more examples in the configuration section below. 80 | 81 | ## Configuration 82 | 83 | SecretService accepts four configuration parameters: 84 | 85 | - `storage` (required) - where to store the secrets. 86 | - `prefix` (default: `secret_service_`) - added to the secret's `key` to avoid collisions with other values. 87 | - `mode` - what to do if no secret is found. Options: 88 | - `silent` (default) - do nothing, return null. 89 | - `strict` - throw an error. 90 | - `interactive` - prompt the user to input the secret. Works only in scripts attached to a container (Google Sheet, Doc, Slide, or Form). Requires `scriptContainer`. 91 | - `scriptContainer` - the object referring to the script container app. Required when running in `interactive` mode: `SpreadsheetApp`, `DocumentApp`, `SlidesApp`, `FormApp`. 92 | 93 | Read more on the configuration options below. 94 | 95 | ### Storage 96 | 97 | SecretService supports two types of storages: 98 | 99 | #### Properties Storage 100 | 101 | You can pass to SecretService any Properties storage from your script: 102 | 103 | ```js 104 | const SECRETS = SecretService.init({ 105 | storage: PropertiesService.getUserProperties(), 106 | // Alternatively: 107 | // storage: PropertiesService.getScriptProperties() 108 | // storage: PropertiesService.getDocumentProperties() 109 | }); 110 | ``` 111 | 112 | Generally, `UserProperties` is the safest storage as it is accessible only to the user running the script. Caveat: the user properties of the owner of a Google Sheets document are accessible to anyone via a custom function (why Google, why?). 113 | 114 | #### Google Cloud Secret Manager 115 | 116 | You can use Google Cloud Secret Manager as a storage backend via the [GCSecretManager library](https://github.com/dataful-tech/GCSecretManager): 117 | 118 | ```js 119 | const storage = GCSecretManager.init({project: "project-id"}); 120 | const SECRETS = SecretService.init({storage}); 121 | 122 | const secretValue = SECRETS.getSecret("API_KEY"); 123 | ``` 124 | 125 | GCSecretManager does not support destructive operations. It will require extra permissions scopes to access the Secret Manger API. For the details, please refer to the [documentation](https://github.com/dataful-tech/GCSecretManager). 126 | 127 | #### Custom Storage 128 | 129 | You can pass any custom storage for secrets that implements these methods: 130 | 131 | 1. `get(key, config)` 132 | 2. `set(key, value, config)` 133 | 3. `delete(key, config)` 134 | 4. `deleteAll(key, config)` 135 | 136 | `config` is an object passed to `SecretService.init(config)`, merged with a config override of any method. 137 | 138 | The custom storage does not have to implement all methods. For example, if you need only to get the secrets, you can implement only `get(key, config)` method. 139 | 140 | ### Mode 141 | 142 | The mode determines behavior of SecretService when a requested secret is not found. 143 | 144 | #### Silent 145 | 146 | Do nothing if a secret is not found and return `null`. It is the default behavior. 147 | 148 | ```js 149 | const SECRETS = SecretService.init({ 150 | storage: PropertiesService.getUserProperties(), 151 | }); 152 | 153 | // It will return null 154 | const API_KEY = SECRETS.getSecret("Does not exist"); 155 | ``` 156 | 157 | #### Strict 158 | 159 | Throw an error, if a secret is not found. 160 | 161 | ```js 162 | const SECRETS = SecretService.init({ 163 | storage: PropertiesService.getUserProperties(), 164 | mode: "strict", 165 | }); 166 | 167 | // Throws an error 168 | const API_KEY = SECRETS.getSecret("Does not exist"); 169 | ``` 170 | 171 |
172 | SecretService | Strict mode error: no secret 173 |
174 | 175 | #### Interactive 176 | 177 | User will be prompted to enter the secret which will be saved to the storage. This method works only for scripts that are attached to a document container which you need to pass during the initialization: 178 | 179 | ```js 180 | const SECRETS = SecretService.init({ 181 | storage: PropertiesService.getUserProperties(), 182 | mode: "interactive", 183 | scriptContainer: SpreadsheetApp, 184 | }); 185 | 186 | // User will be prompted if the secret does not exist 187 | const API_KEY = SECRETS.getSecret("API_KEY"); 188 | ``` 189 | 190 |
191 | SecretService | Input a secret prompt 192 |
193 | 194 | If the user clicks `Cancel` or closes the prompt, SecretService will throw an error. 195 | 196 |
197 | SecretService | Interactive mode error: no secret 198 |
199 | 200 | ### Overrides 201 | 202 | You can specify the configuration during the initialization and provide an override for any parameter (except for the storage) when calling any other method: 203 | 204 | ```js 205 | const SECRETS = SecretService.init({ 206 | storage: PropertiesService.getUserProperties(), 207 | scriptContainer: SpreadsheetApp, 208 | mode: "interactive", 209 | }); 210 | 211 | // Override certain 212 | const API_KEY = SECRETS.getSecret({ 213 | prefix: "custom_prefix_override_", 214 | mode: "strict", 215 | }); 216 | ``` 217 | 218 | ## Authorization Scopes 219 | 220 | SecretService does not require any authorization scopes on its own. If you use a custom storage, it may require extra permissions. 221 | 222 | ## Limitations 223 | 224 | Storing `null` secret is equivalent to not storing the secret at all. 225 | 226 | ## Tests 227 | 228 | SecretService is covered by unit tests with mocks and jest, and by integration tests that validate behavior of the library in real Google Apps Script infrastructure. 229 | 230 | ## Versioning 231 | 232 | This project follows standard `MAJOR.MINOR.PATCH` semantic versioning. Breaking changes may be introduced in new major versions. 233 | 234 | ## License 235 | 236 | SecretService is available under the MIT license. 237 | 238 | ## Contribution 239 | 240 | Contributions are welcome. Feel free to submit PRs or issues on GitHub for any suggestions or issues. 241 | -------------------------------------------------------------------------------- /images/interactive-mode-error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dataful-tech/secret-service/5b3a38529ee393e8b5754bf3fe459b5145d1f099/images/interactive-mode-error.png -------------------------------------------------------------------------------- /images/strict-mode-error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dataful-tech/secret-service/5b3a38529ee393e8b5754bf3fe459b5145d1f099/images/strict-mode-error.png -------------------------------------------------------------------------------- /images/user-input-secret-prompt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dataful-tech/secret-service/5b3a38529ee393e8b5754bf3fe459b5145d1f099/images/user-input-secret-prompt.png -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "secret-service", 3 | "version": "1.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "secret-service", 9 | "version": "1.0.0", 10 | "license": "MIT", 11 | "devDependencies": { 12 | "@google/clasp": "^2.4.2", 13 | "@types/google-apps-script": "^1.0.78", 14 | "jest": "^29.7.0" 15 | } 16 | }, 17 | "node_modules/@ampproject/remapping": { 18 | "version": "2.2.1", 19 | "dev": true, 20 | "license": "Apache-2.0", 21 | "dependencies": { 22 | "@jridgewell/gen-mapping": "^0.3.0", 23 | "@jridgewell/trace-mapping": "^0.3.9" 24 | }, 25 | "engines": { 26 | "node": ">=6.0.0" 27 | } 28 | }, 29 | "node_modules/@babel/code-frame": { 30 | "version": "7.23.4", 31 | "dev": true, 32 | "license": "MIT", 33 | "dependencies": { 34 | "@babel/highlight": "^7.23.4", 35 | "chalk": "^2.4.2" 36 | }, 37 | "engines": { 38 | "node": ">=6.9.0" 39 | } 40 | }, 41 | "node_modules/@babel/code-frame/node_modules/ansi-styles": { 42 | "version": "3.2.1", 43 | "dev": true, 44 | "license": "MIT", 45 | "dependencies": { 46 | "color-convert": "^1.9.0" 47 | }, 48 | "engines": { 49 | "node": ">=4" 50 | } 51 | }, 52 | "node_modules/@babel/code-frame/node_modules/chalk": { 53 | "version": "2.4.2", 54 | "dev": true, 55 | "license": "MIT", 56 | "dependencies": { 57 | "ansi-styles": "^3.2.1", 58 | "escape-string-regexp": "^1.0.5", 59 | "supports-color": "^5.3.0" 60 | }, 61 | "engines": { 62 | "node": ">=4" 63 | } 64 | }, 65 | "node_modules/@babel/code-frame/node_modules/color-convert": { 66 | "version": "1.9.3", 67 | "dev": true, 68 | "license": "MIT", 69 | "dependencies": { 70 | "color-name": "1.1.3" 71 | } 72 | }, 73 | "node_modules/@babel/code-frame/node_modules/color-name": { 74 | "version": "1.1.3", 75 | "dev": true, 76 | "license": "MIT" 77 | }, 78 | "node_modules/@babel/code-frame/node_modules/has-flag": { 79 | "version": "3.0.0", 80 | "dev": true, 81 | "license": "MIT", 82 | "engines": { 83 | "node": ">=4" 84 | } 85 | }, 86 | "node_modules/@babel/code-frame/node_modules/supports-color": { 87 | "version": "5.5.0", 88 | "dev": true, 89 | "license": "MIT", 90 | "dependencies": { 91 | "has-flag": "^3.0.0" 92 | }, 93 | "engines": { 94 | "node": ">=4" 95 | } 96 | }, 97 | "node_modules/@babel/compat-data": { 98 | "version": "7.23.3", 99 | "dev": true, 100 | "license": "MIT", 101 | "engines": { 102 | "node": ">=6.9.0" 103 | } 104 | }, 105 | "node_modules/@babel/core": { 106 | "version": "7.23.3", 107 | "dev": true, 108 | "license": "MIT", 109 | "dependencies": { 110 | "@ampproject/remapping": "^2.2.0", 111 | "@babel/code-frame": "^7.22.13", 112 | "@babel/generator": "^7.23.3", 113 | "@babel/helper-compilation-targets": "^7.22.15", 114 | "@babel/helper-module-transforms": "^7.23.3", 115 | "@babel/helpers": "^7.23.2", 116 | "@babel/parser": "^7.23.3", 117 | "@babel/template": "^7.22.15", 118 | "@babel/traverse": "^7.23.3", 119 | "@babel/types": "^7.23.3", 120 | "convert-source-map": "^2.0.0", 121 | "debug": "^4.1.0", 122 | "gensync": "^1.0.0-beta.2", 123 | "json5": "^2.2.3", 124 | "semver": "^6.3.1" 125 | }, 126 | "engines": { 127 | "node": ">=6.9.0" 128 | }, 129 | "funding": { 130 | "type": "opencollective", 131 | "url": "https://opencollective.com/babel" 132 | } 133 | }, 134 | "node_modules/@babel/generator": { 135 | "version": "7.23.4", 136 | "dev": true, 137 | "license": "MIT", 138 | "dependencies": { 139 | "@babel/types": "^7.23.4", 140 | "@jridgewell/gen-mapping": "^0.3.2", 141 | "@jridgewell/trace-mapping": "^0.3.17", 142 | "jsesc": "^2.5.1" 143 | }, 144 | "engines": { 145 | "node": ">=6.9.0" 146 | } 147 | }, 148 | "node_modules/@babel/helper-compilation-targets": { 149 | "version": "7.22.15", 150 | "dev": true, 151 | "license": "MIT", 152 | "dependencies": { 153 | "@babel/compat-data": "^7.22.9", 154 | "@babel/helper-validator-option": "^7.22.15", 155 | "browserslist": "^4.21.9", 156 | "lru-cache": "^5.1.1", 157 | "semver": "^6.3.1" 158 | }, 159 | "engines": { 160 | "node": ">=6.9.0" 161 | } 162 | }, 163 | "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { 164 | "version": "5.1.1", 165 | "dev": true, 166 | "license": "ISC", 167 | "dependencies": { 168 | "yallist": "^3.0.2" 169 | } 170 | }, 171 | "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { 172 | "version": "3.1.1", 173 | "dev": true, 174 | "license": "ISC" 175 | }, 176 | "node_modules/@babel/helper-environment-visitor": { 177 | "version": "7.22.20", 178 | "dev": true, 179 | "license": "MIT", 180 | "engines": { 181 | "node": ">=6.9.0" 182 | } 183 | }, 184 | "node_modules/@babel/helper-function-name": { 185 | "version": "7.23.0", 186 | "dev": true, 187 | "license": "MIT", 188 | "dependencies": { 189 | "@babel/template": "^7.22.15", 190 | "@babel/types": "^7.23.0" 191 | }, 192 | "engines": { 193 | "node": ">=6.9.0" 194 | } 195 | }, 196 | "node_modules/@babel/helper-hoist-variables": { 197 | "version": "7.22.5", 198 | "dev": true, 199 | "license": "MIT", 200 | "dependencies": { 201 | "@babel/types": "^7.22.5" 202 | }, 203 | "engines": { 204 | "node": ">=6.9.0" 205 | } 206 | }, 207 | "node_modules/@babel/helper-module-imports": { 208 | "version": "7.22.15", 209 | "dev": true, 210 | "license": "MIT", 211 | "dependencies": { 212 | "@babel/types": "^7.22.15" 213 | }, 214 | "engines": { 215 | "node": ">=6.9.0" 216 | } 217 | }, 218 | "node_modules/@babel/helper-module-transforms": { 219 | "version": "7.23.3", 220 | "dev": true, 221 | "license": "MIT", 222 | "dependencies": { 223 | "@babel/helper-environment-visitor": "^7.22.20", 224 | "@babel/helper-module-imports": "^7.22.15", 225 | "@babel/helper-simple-access": "^7.22.5", 226 | "@babel/helper-split-export-declaration": "^7.22.6", 227 | "@babel/helper-validator-identifier": "^7.22.20" 228 | }, 229 | "engines": { 230 | "node": ">=6.9.0" 231 | }, 232 | "peerDependencies": { 233 | "@babel/core": "^7.0.0" 234 | } 235 | }, 236 | "node_modules/@babel/helper-plugin-utils": { 237 | "version": "7.22.5", 238 | "dev": true, 239 | "license": "MIT", 240 | "engines": { 241 | "node": ">=6.9.0" 242 | } 243 | }, 244 | "node_modules/@babel/helper-simple-access": { 245 | "version": "7.22.5", 246 | "dev": true, 247 | "license": "MIT", 248 | "dependencies": { 249 | "@babel/types": "^7.22.5" 250 | }, 251 | "engines": { 252 | "node": ">=6.9.0" 253 | } 254 | }, 255 | "node_modules/@babel/helper-split-export-declaration": { 256 | "version": "7.22.6", 257 | "dev": true, 258 | "license": "MIT", 259 | "dependencies": { 260 | "@babel/types": "^7.22.5" 261 | }, 262 | "engines": { 263 | "node": ">=6.9.0" 264 | } 265 | }, 266 | "node_modules/@babel/helper-string-parser": { 267 | "version": "7.23.4", 268 | "dev": true, 269 | "license": "MIT", 270 | "engines": { 271 | "node": ">=6.9.0" 272 | } 273 | }, 274 | "node_modules/@babel/helper-validator-identifier": { 275 | "version": "7.22.20", 276 | "dev": true, 277 | "license": "MIT", 278 | "engines": { 279 | "node": ">=6.9.0" 280 | } 281 | }, 282 | "node_modules/@babel/helper-validator-option": { 283 | "version": "7.22.15", 284 | "dev": true, 285 | "license": "MIT", 286 | "engines": { 287 | "node": ">=6.9.0" 288 | } 289 | }, 290 | "node_modules/@babel/helpers": { 291 | "version": "7.23.4", 292 | "dev": true, 293 | "license": "MIT", 294 | "dependencies": { 295 | "@babel/template": "^7.22.15", 296 | "@babel/traverse": "^7.23.4", 297 | "@babel/types": "^7.23.4" 298 | }, 299 | "engines": { 300 | "node": ">=6.9.0" 301 | } 302 | }, 303 | "node_modules/@babel/highlight": { 304 | "version": "7.23.4", 305 | "dev": true, 306 | "license": "MIT", 307 | "dependencies": { 308 | "@babel/helper-validator-identifier": "^7.22.20", 309 | "chalk": "^2.4.2", 310 | "js-tokens": "^4.0.0" 311 | }, 312 | "engines": { 313 | "node": ">=6.9.0" 314 | } 315 | }, 316 | "node_modules/@babel/highlight/node_modules/ansi-styles": { 317 | "version": "3.2.1", 318 | "dev": true, 319 | "license": "MIT", 320 | "dependencies": { 321 | "color-convert": "^1.9.0" 322 | }, 323 | "engines": { 324 | "node": ">=4" 325 | } 326 | }, 327 | "node_modules/@babel/highlight/node_modules/chalk": { 328 | "version": "2.4.2", 329 | "dev": true, 330 | "license": "MIT", 331 | "dependencies": { 332 | "ansi-styles": "^3.2.1", 333 | "escape-string-regexp": "^1.0.5", 334 | "supports-color": "^5.3.0" 335 | }, 336 | "engines": { 337 | "node": ">=4" 338 | } 339 | }, 340 | "node_modules/@babel/highlight/node_modules/color-convert": { 341 | "version": "1.9.3", 342 | "dev": true, 343 | "license": "MIT", 344 | "dependencies": { 345 | "color-name": "1.1.3" 346 | } 347 | }, 348 | "node_modules/@babel/highlight/node_modules/color-name": { 349 | "version": "1.1.3", 350 | "dev": true, 351 | "license": "MIT" 352 | }, 353 | "node_modules/@babel/highlight/node_modules/has-flag": { 354 | "version": "3.0.0", 355 | "dev": true, 356 | "license": "MIT", 357 | "engines": { 358 | "node": ">=4" 359 | } 360 | }, 361 | "node_modules/@babel/highlight/node_modules/supports-color": { 362 | "version": "5.5.0", 363 | "dev": true, 364 | "license": "MIT", 365 | "dependencies": { 366 | "has-flag": "^3.0.0" 367 | }, 368 | "engines": { 369 | "node": ">=4" 370 | } 371 | }, 372 | "node_modules/@babel/parser": { 373 | "version": "7.23.4", 374 | "dev": true, 375 | "license": "MIT", 376 | "bin": { 377 | "parser": "bin/babel-parser.js" 378 | }, 379 | "engines": { 380 | "node": ">=6.0.0" 381 | } 382 | }, 383 | "node_modules/@babel/plugin-syntax-async-generators": { 384 | "version": "7.8.4", 385 | "dev": true, 386 | "license": "MIT", 387 | "dependencies": { 388 | "@babel/helper-plugin-utils": "^7.8.0" 389 | }, 390 | "peerDependencies": { 391 | "@babel/core": "^7.0.0-0" 392 | } 393 | }, 394 | "node_modules/@babel/plugin-syntax-bigint": { 395 | "version": "7.8.3", 396 | "dev": true, 397 | "license": "MIT", 398 | "dependencies": { 399 | "@babel/helper-plugin-utils": "^7.8.0" 400 | }, 401 | "peerDependencies": { 402 | "@babel/core": "^7.0.0-0" 403 | } 404 | }, 405 | "node_modules/@babel/plugin-syntax-class-properties": { 406 | "version": "7.12.13", 407 | "dev": true, 408 | "license": "MIT", 409 | "dependencies": { 410 | "@babel/helper-plugin-utils": "^7.12.13" 411 | }, 412 | "peerDependencies": { 413 | "@babel/core": "^7.0.0-0" 414 | } 415 | }, 416 | "node_modules/@babel/plugin-syntax-import-meta": { 417 | "version": "7.10.4", 418 | "dev": true, 419 | "license": "MIT", 420 | "dependencies": { 421 | "@babel/helper-plugin-utils": "^7.10.4" 422 | }, 423 | "peerDependencies": { 424 | "@babel/core": "^7.0.0-0" 425 | } 426 | }, 427 | "node_modules/@babel/plugin-syntax-json-strings": { 428 | "version": "7.8.3", 429 | "dev": true, 430 | "license": "MIT", 431 | "dependencies": { 432 | "@babel/helper-plugin-utils": "^7.8.0" 433 | }, 434 | "peerDependencies": { 435 | "@babel/core": "^7.0.0-0" 436 | } 437 | }, 438 | "node_modules/@babel/plugin-syntax-jsx": { 439 | "version": "7.23.3", 440 | "dev": true, 441 | "license": "MIT", 442 | "dependencies": { 443 | "@babel/helper-plugin-utils": "^7.22.5" 444 | }, 445 | "engines": { 446 | "node": ">=6.9.0" 447 | }, 448 | "peerDependencies": { 449 | "@babel/core": "^7.0.0-0" 450 | } 451 | }, 452 | "node_modules/@babel/plugin-syntax-logical-assignment-operators": { 453 | "version": "7.10.4", 454 | "dev": true, 455 | "license": "MIT", 456 | "dependencies": { 457 | "@babel/helper-plugin-utils": "^7.10.4" 458 | }, 459 | "peerDependencies": { 460 | "@babel/core": "^7.0.0-0" 461 | } 462 | }, 463 | "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { 464 | "version": "7.8.3", 465 | "dev": true, 466 | "license": "MIT", 467 | "dependencies": { 468 | "@babel/helper-plugin-utils": "^7.8.0" 469 | }, 470 | "peerDependencies": { 471 | "@babel/core": "^7.0.0-0" 472 | } 473 | }, 474 | "node_modules/@babel/plugin-syntax-numeric-separator": { 475 | "version": "7.10.4", 476 | "dev": true, 477 | "license": "MIT", 478 | "dependencies": { 479 | "@babel/helper-plugin-utils": "^7.10.4" 480 | }, 481 | "peerDependencies": { 482 | "@babel/core": "^7.0.0-0" 483 | } 484 | }, 485 | "node_modules/@babel/plugin-syntax-object-rest-spread": { 486 | "version": "7.8.3", 487 | "dev": true, 488 | "license": "MIT", 489 | "dependencies": { 490 | "@babel/helper-plugin-utils": "^7.8.0" 491 | }, 492 | "peerDependencies": { 493 | "@babel/core": "^7.0.0-0" 494 | } 495 | }, 496 | "node_modules/@babel/plugin-syntax-optional-catch-binding": { 497 | "version": "7.8.3", 498 | "dev": true, 499 | "license": "MIT", 500 | "dependencies": { 501 | "@babel/helper-plugin-utils": "^7.8.0" 502 | }, 503 | "peerDependencies": { 504 | "@babel/core": "^7.0.0-0" 505 | } 506 | }, 507 | "node_modules/@babel/plugin-syntax-optional-chaining": { 508 | "version": "7.8.3", 509 | "dev": true, 510 | "license": "MIT", 511 | "dependencies": { 512 | "@babel/helper-plugin-utils": "^7.8.0" 513 | }, 514 | "peerDependencies": { 515 | "@babel/core": "^7.0.0-0" 516 | } 517 | }, 518 | "node_modules/@babel/plugin-syntax-top-level-await": { 519 | "version": "7.14.5", 520 | "dev": true, 521 | "license": "MIT", 522 | "dependencies": { 523 | "@babel/helper-plugin-utils": "^7.14.5" 524 | }, 525 | "engines": { 526 | "node": ">=6.9.0" 527 | }, 528 | "peerDependencies": { 529 | "@babel/core": "^7.0.0-0" 530 | } 531 | }, 532 | "node_modules/@babel/plugin-syntax-typescript": { 533 | "version": "7.23.3", 534 | "dev": true, 535 | "license": "MIT", 536 | "dependencies": { 537 | "@babel/helper-plugin-utils": "^7.22.5" 538 | }, 539 | "engines": { 540 | "node": ">=6.9.0" 541 | }, 542 | "peerDependencies": { 543 | "@babel/core": "^7.0.0-0" 544 | } 545 | }, 546 | "node_modules/@babel/template": { 547 | "version": "7.22.15", 548 | "dev": true, 549 | "license": "MIT", 550 | "dependencies": { 551 | "@babel/code-frame": "^7.22.13", 552 | "@babel/parser": "^7.22.15", 553 | "@babel/types": "^7.22.15" 554 | }, 555 | "engines": { 556 | "node": ">=6.9.0" 557 | } 558 | }, 559 | "node_modules/@babel/traverse": { 560 | "version": "7.23.4", 561 | "dev": true, 562 | "license": "MIT", 563 | "dependencies": { 564 | "@babel/code-frame": "^7.23.4", 565 | "@babel/generator": "^7.23.4", 566 | "@babel/helper-environment-visitor": "^7.22.20", 567 | "@babel/helper-function-name": "^7.23.0", 568 | "@babel/helper-hoist-variables": "^7.22.5", 569 | "@babel/helper-split-export-declaration": "^7.22.6", 570 | "@babel/parser": "^7.23.4", 571 | "@babel/types": "^7.23.4", 572 | "debug": "^4.1.0", 573 | "globals": "^11.1.0" 574 | }, 575 | "engines": { 576 | "node": ">=6.9.0" 577 | } 578 | }, 579 | "node_modules/@babel/types": { 580 | "version": "7.23.4", 581 | "dev": true, 582 | "license": "MIT", 583 | "dependencies": { 584 | "@babel/helper-string-parser": "^7.23.4", 585 | "@babel/helper-validator-identifier": "^7.22.20", 586 | "to-fast-properties": "^2.0.0" 587 | }, 588 | "engines": { 589 | "node": ">=6.9.0" 590 | } 591 | }, 592 | "node_modules/@bcoe/v8-coverage": { 593 | "version": "0.2.3", 594 | "dev": true, 595 | "license": "MIT" 596 | }, 597 | "node_modules/@google/clasp": { 598 | "version": "2.4.2", 599 | "dev": true, 600 | "license": "Apache-2.0", 601 | "dependencies": { 602 | "@sindresorhus/is": "^4.0.1", 603 | "chalk": "^4.1.2", 604 | "chokidar": "^3.5.2", 605 | "cli-truncate": "^3.0.0", 606 | "commander": "^8.1.0", 607 | "debounce": "^1.2.1", 608 | "dotf": "^2.0.2", 609 | "find-up": "^6.0.0", 610 | "fs-extra": "^10.0.0", 611 | "fuzzy": "^0.1.3", 612 | "google-auth-library": "^7.6.2", 613 | "googleapis": "^84.0.0", 614 | "inquirer": "^8.1.2", 615 | "inquirer-autocomplete-prompt-ipt": "^2.0.0", 616 | "is-reachable": "^5.0.0", 617 | "log-symbols": "^5.0.0", 618 | "loud-rejection": "^2.2.0", 619 | "make-dir": "^3.1.0", 620 | "multimatch": "^5.0.0", 621 | "normalize-newline": "^4.1.0", 622 | "open": "^8.2.1", 623 | "ora": "^6.0.0", 624 | "p-map": "^5.1.0", 625 | "read-pkg-up": "^8.0.0", 626 | "recursive-readdir": "^2.2.2", 627 | "server-destroy": "^1.0.1", 628 | "split-lines": "^3.0.0", 629 | "strip-bom": "^5.0.0", 630 | "ts2gas": "^4.2.0", 631 | "typescript": "^4.4.2" 632 | }, 633 | "bin": { 634 | "clasp": "build/src/index.js" 635 | }, 636 | "engines": { 637 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 638 | } 639 | }, 640 | "node_modules/@istanbuljs/load-nyc-config": { 641 | "version": "1.1.0", 642 | "dev": true, 643 | "license": "ISC", 644 | "dependencies": { 645 | "camelcase": "^5.3.1", 646 | "find-up": "^4.1.0", 647 | "get-package-type": "^0.1.0", 648 | "js-yaml": "^3.13.1", 649 | "resolve-from": "^5.0.0" 650 | }, 651 | "engines": { 652 | "node": ">=8" 653 | } 654 | }, 655 | "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { 656 | "version": "4.1.0", 657 | "dev": true, 658 | "license": "MIT", 659 | "dependencies": { 660 | "locate-path": "^5.0.0", 661 | "path-exists": "^4.0.0" 662 | }, 663 | "engines": { 664 | "node": ">=8" 665 | } 666 | }, 667 | "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { 668 | "version": "5.0.0", 669 | "dev": true, 670 | "license": "MIT", 671 | "dependencies": { 672 | "p-locate": "^4.1.0" 673 | }, 674 | "engines": { 675 | "node": ">=8" 676 | } 677 | }, 678 | "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { 679 | "version": "2.3.0", 680 | "dev": true, 681 | "license": "MIT", 682 | "dependencies": { 683 | "p-try": "^2.0.0" 684 | }, 685 | "engines": { 686 | "node": ">=6" 687 | }, 688 | "funding": { 689 | "url": "https://github.com/sponsors/sindresorhus" 690 | } 691 | }, 692 | "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { 693 | "version": "4.1.0", 694 | "dev": true, 695 | "license": "MIT", 696 | "dependencies": { 697 | "p-limit": "^2.2.0" 698 | }, 699 | "engines": { 700 | "node": ">=8" 701 | } 702 | }, 703 | "node_modules/@istanbuljs/load-nyc-config/node_modules/path-exists": { 704 | "version": "4.0.0", 705 | "dev": true, 706 | "license": "MIT", 707 | "engines": { 708 | "node": ">=8" 709 | } 710 | }, 711 | "node_modules/@istanbuljs/schema": { 712 | "version": "0.1.3", 713 | "dev": true, 714 | "license": "MIT", 715 | "engines": { 716 | "node": ">=8" 717 | } 718 | }, 719 | "node_modules/@jest/console": { 720 | "version": "29.7.0", 721 | "dev": true, 722 | "license": "MIT", 723 | "dependencies": { 724 | "@jest/types": "^29.6.3", 725 | "@types/node": "*", 726 | "chalk": "^4.0.0", 727 | "jest-message-util": "^29.7.0", 728 | "jest-util": "^29.7.0", 729 | "slash": "^3.0.0" 730 | }, 731 | "engines": { 732 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 733 | } 734 | }, 735 | "node_modules/@jest/core": { 736 | "version": "29.7.0", 737 | "dev": true, 738 | "license": "MIT", 739 | "dependencies": { 740 | "@jest/console": "^29.7.0", 741 | "@jest/reporters": "^29.7.0", 742 | "@jest/test-result": "^29.7.0", 743 | "@jest/transform": "^29.7.0", 744 | "@jest/types": "^29.6.3", 745 | "@types/node": "*", 746 | "ansi-escapes": "^4.2.1", 747 | "chalk": "^4.0.0", 748 | "ci-info": "^3.2.0", 749 | "exit": "^0.1.2", 750 | "graceful-fs": "^4.2.9", 751 | "jest-changed-files": "^29.7.0", 752 | "jest-config": "^29.7.0", 753 | "jest-haste-map": "^29.7.0", 754 | "jest-message-util": "^29.7.0", 755 | "jest-regex-util": "^29.6.3", 756 | "jest-resolve": "^29.7.0", 757 | "jest-resolve-dependencies": "^29.7.0", 758 | "jest-runner": "^29.7.0", 759 | "jest-runtime": "^29.7.0", 760 | "jest-snapshot": "^29.7.0", 761 | "jest-util": "^29.7.0", 762 | "jest-validate": "^29.7.0", 763 | "jest-watcher": "^29.7.0", 764 | "micromatch": "^4.0.4", 765 | "pretty-format": "^29.7.0", 766 | "slash": "^3.0.0", 767 | "strip-ansi": "^6.0.0" 768 | }, 769 | "engines": { 770 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 771 | }, 772 | "peerDependencies": { 773 | "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" 774 | }, 775 | "peerDependenciesMeta": { 776 | "node-notifier": { 777 | "optional": true 778 | } 779 | } 780 | }, 781 | "node_modules/@jest/environment": { 782 | "version": "29.7.0", 783 | "dev": true, 784 | "license": "MIT", 785 | "dependencies": { 786 | "@jest/fake-timers": "^29.7.0", 787 | "@jest/types": "^29.6.3", 788 | "@types/node": "*", 789 | "jest-mock": "^29.7.0" 790 | }, 791 | "engines": { 792 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 793 | } 794 | }, 795 | "node_modules/@jest/expect": { 796 | "version": "29.7.0", 797 | "dev": true, 798 | "license": "MIT", 799 | "dependencies": { 800 | "expect": "^29.7.0", 801 | "jest-snapshot": "^29.7.0" 802 | }, 803 | "engines": { 804 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 805 | } 806 | }, 807 | "node_modules/@jest/expect-utils": { 808 | "version": "29.7.0", 809 | "dev": true, 810 | "license": "MIT", 811 | "dependencies": { 812 | "jest-get-type": "^29.6.3" 813 | }, 814 | "engines": { 815 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 816 | } 817 | }, 818 | "node_modules/@jest/fake-timers": { 819 | "version": "29.7.0", 820 | "dev": true, 821 | "license": "MIT", 822 | "dependencies": { 823 | "@jest/types": "^29.6.3", 824 | "@sinonjs/fake-timers": "^10.0.2", 825 | "@types/node": "*", 826 | "jest-message-util": "^29.7.0", 827 | "jest-mock": "^29.7.0", 828 | "jest-util": "^29.7.0" 829 | }, 830 | "engines": { 831 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 832 | } 833 | }, 834 | "node_modules/@jest/globals": { 835 | "version": "29.7.0", 836 | "dev": true, 837 | "license": "MIT", 838 | "dependencies": { 839 | "@jest/environment": "^29.7.0", 840 | "@jest/expect": "^29.7.0", 841 | "@jest/types": "^29.6.3", 842 | "jest-mock": "^29.7.0" 843 | }, 844 | "engines": { 845 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 846 | } 847 | }, 848 | "node_modules/@jest/reporters": { 849 | "version": "29.7.0", 850 | "dev": true, 851 | "license": "MIT", 852 | "dependencies": { 853 | "@bcoe/v8-coverage": "^0.2.3", 854 | "@jest/console": "^29.7.0", 855 | "@jest/test-result": "^29.7.0", 856 | "@jest/transform": "^29.7.0", 857 | "@jest/types": "^29.6.3", 858 | "@jridgewell/trace-mapping": "^0.3.18", 859 | "@types/node": "*", 860 | "chalk": "^4.0.0", 861 | "collect-v8-coverage": "^1.0.0", 862 | "exit": "^0.1.2", 863 | "glob": "^7.1.3", 864 | "graceful-fs": "^4.2.9", 865 | "istanbul-lib-coverage": "^3.0.0", 866 | "istanbul-lib-instrument": "^6.0.0", 867 | "istanbul-lib-report": "^3.0.0", 868 | "istanbul-lib-source-maps": "^4.0.0", 869 | "istanbul-reports": "^3.1.3", 870 | "jest-message-util": "^29.7.0", 871 | "jest-util": "^29.7.0", 872 | "jest-worker": "^29.7.0", 873 | "slash": "^3.0.0", 874 | "string-length": "^4.0.1", 875 | "strip-ansi": "^6.0.0", 876 | "v8-to-istanbul": "^9.0.1" 877 | }, 878 | "engines": { 879 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 880 | }, 881 | "peerDependencies": { 882 | "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" 883 | }, 884 | "peerDependenciesMeta": { 885 | "node-notifier": { 886 | "optional": true 887 | } 888 | } 889 | }, 890 | "node_modules/@jest/schemas": { 891 | "version": "29.6.3", 892 | "dev": true, 893 | "license": "MIT", 894 | "dependencies": { 895 | "@sinclair/typebox": "^0.27.8" 896 | }, 897 | "engines": { 898 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 899 | } 900 | }, 901 | "node_modules/@jest/source-map": { 902 | "version": "29.6.3", 903 | "dev": true, 904 | "license": "MIT", 905 | "dependencies": { 906 | "@jridgewell/trace-mapping": "^0.3.18", 907 | "callsites": "^3.0.0", 908 | "graceful-fs": "^4.2.9" 909 | }, 910 | "engines": { 911 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 912 | } 913 | }, 914 | "node_modules/@jest/test-result": { 915 | "version": "29.7.0", 916 | "dev": true, 917 | "license": "MIT", 918 | "dependencies": { 919 | "@jest/console": "^29.7.0", 920 | "@jest/types": "^29.6.3", 921 | "@types/istanbul-lib-coverage": "^2.0.0", 922 | "collect-v8-coverage": "^1.0.0" 923 | }, 924 | "engines": { 925 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 926 | } 927 | }, 928 | "node_modules/@jest/test-sequencer": { 929 | "version": "29.7.0", 930 | "dev": true, 931 | "license": "MIT", 932 | "dependencies": { 933 | "@jest/test-result": "^29.7.0", 934 | "graceful-fs": "^4.2.9", 935 | "jest-haste-map": "^29.7.0", 936 | "slash": "^3.0.0" 937 | }, 938 | "engines": { 939 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 940 | } 941 | }, 942 | "node_modules/@jest/transform": { 943 | "version": "29.7.0", 944 | "dev": true, 945 | "license": "MIT", 946 | "dependencies": { 947 | "@babel/core": "^7.11.6", 948 | "@jest/types": "^29.6.3", 949 | "@jridgewell/trace-mapping": "^0.3.18", 950 | "babel-plugin-istanbul": "^6.1.1", 951 | "chalk": "^4.0.0", 952 | "convert-source-map": "^2.0.0", 953 | "fast-json-stable-stringify": "^2.1.0", 954 | "graceful-fs": "^4.2.9", 955 | "jest-haste-map": "^29.7.0", 956 | "jest-regex-util": "^29.6.3", 957 | "jest-util": "^29.7.0", 958 | "micromatch": "^4.0.4", 959 | "pirates": "^4.0.4", 960 | "slash": "^3.0.0", 961 | "write-file-atomic": "^4.0.2" 962 | }, 963 | "engines": { 964 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 965 | } 966 | }, 967 | "node_modules/@jest/types": { 968 | "version": "29.6.3", 969 | "dev": true, 970 | "license": "MIT", 971 | "dependencies": { 972 | "@jest/schemas": "^29.6.3", 973 | "@types/istanbul-lib-coverage": "^2.0.0", 974 | "@types/istanbul-reports": "^3.0.0", 975 | "@types/node": "*", 976 | "@types/yargs": "^17.0.8", 977 | "chalk": "^4.0.0" 978 | }, 979 | "engines": { 980 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 981 | } 982 | }, 983 | "node_modules/@jridgewell/gen-mapping": { 984 | "version": "0.3.3", 985 | "dev": true, 986 | "license": "MIT", 987 | "dependencies": { 988 | "@jridgewell/set-array": "^1.0.1", 989 | "@jridgewell/sourcemap-codec": "^1.4.10", 990 | "@jridgewell/trace-mapping": "^0.3.9" 991 | }, 992 | "engines": { 993 | "node": ">=6.0.0" 994 | } 995 | }, 996 | "node_modules/@jridgewell/resolve-uri": { 997 | "version": "3.1.1", 998 | "dev": true, 999 | "license": "MIT", 1000 | "engines": { 1001 | "node": ">=6.0.0" 1002 | } 1003 | }, 1004 | "node_modules/@jridgewell/set-array": { 1005 | "version": "1.1.2", 1006 | "dev": true, 1007 | "license": "MIT", 1008 | "engines": { 1009 | "node": ">=6.0.0" 1010 | } 1011 | }, 1012 | "node_modules/@jridgewell/sourcemap-codec": { 1013 | "version": "1.4.15", 1014 | "dev": true, 1015 | "license": "MIT" 1016 | }, 1017 | "node_modules/@jridgewell/trace-mapping": { 1018 | "version": "0.3.20", 1019 | "dev": true, 1020 | "license": "MIT", 1021 | "dependencies": { 1022 | "@jridgewell/resolve-uri": "^3.1.0", 1023 | "@jridgewell/sourcemap-codec": "^1.4.14" 1024 | } 1025 | }, 1026 | "node_modules/@sinclair/typebox": { 1027 | "version": "0.27.8", 1028 | "dev": true, 1029 | "license": "MIT" 1030 | }, 1031 | "node_modules/@sindresorhus/is": { 1032 | "version": "4.6.0", 1033 | "dev": true, 1034 | "license": "MIT", 1035 | "engines": { 1036 | "node": ">=10" 1037 | }, 1038 | "funding": { 1039 | "url": "https://github.com/sindresorhus/is?sponsor=1" 1040 | } 1041 | }, 1042 | "node_modules/@sinonjs/commons": { 1043 | "version": "3.0.0", 1044 | "dev": true, 1045 | "license": "BSD-3-Clause", 1046 | "dependencies": { 1047 | "type-detect": "4.0.8" 1048 | } 1049 | }, 1050 | "node_modules/@sinonjs/fake-timers": { 1051 | "version": "10.3.0", 1052 | "dev": true, 1053 | "license": "BSD-3-Clause", 1054 | "dependencies": { 1055 | "@sinonjs/commons": "^3.0.0" 1056 | } 1057 | }, 1058 | "node_modules/@szmarczak/http-timer": { 1059 | "version": "4.0.6", 1060 | "dev": true, 1061 | "license": "MIT", 1062 | "dependencies": { 1063 | "defer-to-connect": "^2.0.0" 1064 | }, 1065 | "engines": { 1066 | "node": ">=10" 1067 | } 1068 | }, 1069 | "node_modules/@types/babel__core": { 1070 | "version": "7.20.5", 1071 | "dev": true, 1072 | "license": "MIT", 1073 | "dependencies": { 1074 | "@babel/parser": "^7.20.7", 1075 | "@babel/types": "^7.20.7", 1076 | "@types/babel__generator": "*", 1077 | "@types/babel__template": "*", 1078 | "@types/babel__traverse": "*" 1079 | } 1080 | }, 1081 | "node_modules/@types/babel__generator": { 1082 | "version": "7.6.7", 1083 | "dev": true, 1084 | "license": "MIT", 1085 | "dependencies": { 1086 | "@babel/types": "^7.0.0" 1087 | } 1088 | }, 1089 | "node_modules/@types/babel__template": { 1090 | "version": "7.4.4", 1091 | "dev": true, 1092 | "license": "MIT", 1093 | "dependencies": { 1094 | "@babel/parser": "^7.1.0", 1095 | "@babel/types": "^7.0.0" 1096 | } 1097 | }, 1098 | "node_modules/@types/babel__traverse": { 1099 | "version": "7.20.4", 1100 | "dev": true, 1101 | "license": "MIT", 1102 | "dependencies": { 1103 | "@babel/types": "^7.20.7" 1104 | } 1105 | }, 1106 | "node_modules/@types/cacheable-request": { 1107 | "version": "6.0.3", 1108 | "dev": true, 1109 | "license": "MIT", 1110 | "dependencies": { 1111 | "@types/http-cache-semantics": "*", 1112 | "@types/keyv": "^3.1.4", 1113 | "@types/node": "*", 1114 | "@types/responselike": "^1.0.0" 1115 | } 1116 | }, 1117 | "node_modules/@types/google-apps-script": { 1118 | "version": "1.0.78", 1119 | "dev": true, 1120 | "license": "MIT" 1121 | }, 1122 | "node_modules/@types/graceful-fs": { 1123 | "version": "4.1.9", 1124 | "dev": true, 1125 | "license": "MIT", 1126 | "dependencies": { 1127 | "@types/node": "*" 1128 | } 1129 | }, 1130 | "node_modules/@types/http-cache-semantics": { 1131 | "version": "4.0.4", 1132 | "dev": true, 1133 | "license": "MIT" 1134 | }, 1135 | "node_modules/@types/istanbul-lib-coverage": { 1136 | "version": "2.0.6", 1137 | "dev": true, 1138 | "license": "MIT" 1139 | }, 1140 | "node_modules/@types/istanbul-lib-report": { 1141 | "version": "3.0.3", 1142 | "dev": true, 1143 | "license": "MIT", 1144 | "dependencies": { 1145 | "@types/istanbul-lib-coverage": "*" 1146 | } 1147 | }, 1148 | "node_modules/@types/istanbul-reports": { 1149 | "version": "3.0.4", 1150 | "dev": true, 1151 | "license": "MIT", 1152 | "dependencies": { 1153 | "@types/istanbul-lib-report": "*" 1154 | } 1155 | }, 1156 | "node_modules/@types/keyv": { 1157 | "version": "3.1.4", 1158 | "dev": true, 1159 | "license": "MIT", 1160 | "dependencies": { 1161 | "@types/node": "*" 1162 | } 1163 | }, 1164 | "node_modules/@types/minimatch": { 1165 | "version": "3.0.5", 1166 | "dev": true, 1167 | "license": "MIT" 1168 | }, 1169 | "node_modules/@types/node": { 1170 | "version": "20.10.0", 1171 | "dev": true, 1172 | "license": "MIT", 1173 | "dependencies": { 1174 | "undici-types": "~5.26.4" 1175 | } 1176 | }, 1177 | "node_modules/@types/normalize-package-data": { 1178 | "version": "2.4.4", 1179 | "dev": true, 1180 | "license": "MIT" 1181 | }, 1182 | "node_modules/@types/responselike": { 1183 | "version": "1.0.3", 1184 | "dev": true, 1185 | "license": "MIT", 1186 | "dependencies": { 1187 | "@types/node": "*" 1188 | } 1189 | }, 1190 | "node_modules/@types/stack-utils": { 1191 | "version": "2.0.3", 1192 | "dev": true, 1193 | "license": "MIT" 1194 | }, 1195 | "node_modules/@types/yargs": { 1196 | "version": "17.0.32", 1197 | "dev": true, 1198 | "license": "MIT", 1199 | "dependencies": { 1200 | "@types/yargs-parser": "*" 1201 | } 1202 | }, 1203 | "node_modules/@types/yargs-parser": { 1204 | "version": "21.0.3", 1205 | "dev": true, 1206 | "license": "MIT" 1207 | }, 1208 | "node_modules/abort-controller": { 1209 | "version": "3.0.0", 1210 | "dev": true, 1211 | "license": "MIT", 1212 | "dependencies": { 1213 | "event-target-shim": "^5.0.0" 1214 | }, 1215 | "engines": { 1216 | "node": ">=6.5" 1217 | } 1218 | }, 1219 | "node_modules/agent-base": { 1220 | "version": "6.0.2", 1221 | "dev": true, 1222 | "license": "MIT", 1223 | "dependencies": { 1224 | "debug": "4" 1225 | }, 1226 | "engines": { 1227 | "node": ">= 6.0.0" 1228 | } 1229 | }, 1230 | "node_modules/aggregate-error": { 1231 | "version": "4.0.1", 1232 | "dev": true, 1233 | "license": "MIT", 1234 | "dependencies": { 1235 | "clean-stack": "^4.0.0", 1236 | "indent-string": "^5.0.0" 1237 | }, 1238 | "engines": { 1239 | "node": ">=12" 1240 | }, 1241 | "funding": { 1242 | "url": "https://github.com/sponsors/sindresorhus" 1243 | } 1244 | }, 1245 | "node_modules/ansi-escapes": { 1246 | "version": "4.3.2", 1247 | "dev": true, 1248 | "license": "MIT", 1249 | "dependencies": { 1250 | "type-fest": "^0.21.3" 1251 | }, 1252 | "engines": { 1253 | "node": ">=8" 1254 | }, 1255 | "funding": { 1256 | "url": "https://github.com/sponsors/sindresorhus" 1257 | } 1258 | }, 1259 | "node_modules/ansi-regex": { 1260 | "version": "5.0.1", 1261 | "dev": true, 1262 | "license": "MIT", 1263 | "engines": { 1264 | "node": ">=8" 1265 | } 1266 | }, 1267 | "node_modules/ansi-styles": { 1268 | "version": "4.3.0", 1269 | "dev": true, 1270 | "license": "MIT", 1271 | "dependencies": { 1272 | "color-convert": "^2.0.1" 1273 | }, 1274 | "engines": { 1275 | "node": ">=8" 1276 | }, 1277 | "funding": { 1278 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 1279 | } 1280 | }, 1281 | "node_modules/anymatch": { 1282 | "version": "3.1.3", 1283 | "dev": true, 1284 | "license": "ISC", 1285 | "dependencies": { 1286 | "normalize-path": "^3.0.0", 1287 | "picomatch": "^2.0.4" 1288 | }, 1289 | "engines": { 1290 | "node": ">= 8" 1291 | } 1292 | }, 1293 | "node_modules/argparse": { 1294 | "version": "1.0.10", 1295 | "dev": true, 1296 | "license": "MIT", 1297 | "dependencies": { 1298 | "sprintf-js": "~1.0.2" 1299 | } 1300 | }, 1301 | "node_modules/array-differ": { 1302 | "version": "3.0.0", 1303 | "dev": true, 1304 | "license": "MIT", 1305 | "engines": { 1306 | "node": ">=8" 1307 | } 1308 | }, 1309 | "node_modules/array-find-index": { 1310 | "version": "1.0.2", 1311 | "dev": true, 1312 | "license": "MIT", 1313 | "engines": { 1314 | "node": ">=0.10.0" 1315 | } 1316 | }, 1317 | "node_modules/array-union": { 1318 | "version": "2.1.0", 1319 | "dev": true, 1320 | "license": "MIT", 1321 | "engines": { 1322 | "node": ">=8" 1323 | } 1324 | }, 1325 | "node_modules/arrify": { 1326 | "version": "2.0.1", 1327 | "dev": true, 1328 | "license": "MIT", 1329 | "engines": { 1330 | "node": ">=8" 1331 | } 1332 | }, 1333 | "node_modules/babel-jest": { 1334 | "version": "29.7.0", 1335 | "dev": true, 1336 | "license": "MIT", 1337 | "dependencies": { 1338 | "@jest/transform": "^29.7.0", 1339 | "@types/babel__core": "^7.1.14", 1340 | "babel-plugin-istanbul": "^6.1.1", 1341 | "babel-preset-jest": "^29.6.3", 1342 | "chalk": "^4.0.0", 1343 | "graceful-fs": "^4.2.9", 1344 | "slash": "^3.0.0" 1345 | }, 1346 | "engines": { 1347 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 1348 | }, 1349 | "peerDependencies": { 1350 | "@babel/core": "^7.8.0" 1351 | } 1352 | }, 1353 | "node_modules/babel-plugin-istanbul": { 1354 | "version": "6.1.1", 1355 | "dev": true, 1356 | "license": "BSD-3-Clause", 1357 | "dependencies": { 1358 | "@babel/helper-plugin-utils": "^7.0.0", 1359 | "@istanbuljs/load-nyc-config": "^1.0.0", 1360 | "@istanbuljs/schema": "^0.1.2", 1361 | "istanbul-lib-instrument": "^5.0.4", 1362 | "test-exclude": "^6.0.0" 1363 | }, 1364 | "engines": { 1365 | "node": ">=8" 1366 | } 1367 | }, 1368 | "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { 1369 | "version": "5.2.1", 1370 | "dev": true, 1371 | "license": "BSD-3-Clause", 1372 | "dependencies": { 1373 | "@babel/core": "^7.12.3", 1374 | "@babel/parser": "^7.14.7", 1375 | "@istanbuljs/schema": "^0.1.2", 1376 | "istanbul-lib-coverage": "^3.2.0", 1377 | "semver": "^6.3.0" 1378 | }, 1379 | "engines": { 1380 | "node": ">=8" 1381 | } 1382 | }, 1383 | "node_modules/babel-plugin-jest-hoist": { 1384 | "version": "29.6.3", 1385 | "dev": true, 1386 | "license": "MIT", 1387 | "dependencies": { 1388 | "@babel/template": "^7.3.3", 1389 | "@babel/types": "^7.3.3", 1390 | "@types/babel__core": "^7.1.14", 1391 | "@types/babel__traverse": "^7.0.6" 1392 | }, 1393 | "engines": { 1394 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 1395 | } 1396 | }, 1397 | "node_modules/babel-preset-current-node-syntax": { 1398 | "version": "1.0.1", 1399 | "dev": true, 1400 | "license": "MIT", 1401 | "dependencies": { 1402 | "@babel/plugin-syntax-async-generators": "^7.8.4", 1403 | "@babel/plugin-syntax-bigint": "^7.8.3", 1404 | "@babel/plugin-syntax-class-properties": "^7.8.3", 1405 | "@babel/plugin-syntax-import-meta": "^7.8.3", 1406 | "@babel/plugin-syntax-json-strings": "^7.8.3", 1407 | "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", 1408 | "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", 1409 | "@babel/plugin-syntax-numeric-separator": "^7.8.3", 1410 | "@babel/plugin-syntax-object-rest-spread": "^7.8.3", 1411 | "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", 1412 | "@babel/plugin-syntax-optional-chaining": "^7.8.3", 1413 | "@babel/plugin-syntax-top-level-await": "^7.8.3" 1414 | }, 1415 | "peerDependencies": { 1416 | "@babel/core": "^7.0.0" 1417 | } 1418 | }, 1419 | "node_modules/babel-preset-jest": { 1420 | "version": "29.6.3", 1421 | "dev": true, 1422 | "license": "MIT", 1423 | "dependencies": { 1424 | "babel-plugin-jest-hoist": "^29.6.3", 1425 | "babel-preset-current-node-syntax": "^1.0.0" 1426 | }, 1427 | "engines": { 1428 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 1429 | }, 1430 | "peerDependencies": { 1431 | "@babel/core": "^7.0.0" 1432 | } 1433 | }, 1434 | "node_modules/balanced-match": { 1435 | "version": "1.0.2", 1436 | "dev": true, 1437 | "license": "MIT" 1438 | }, 1439 | "node_modules/base64-js": { 1440 | "version": "1.5.1", 1441 | "dev": true, 1442 | "funding": [ 1443 | { 1444 | "type": "github", 1445 | "url": "https://github.com/sponsors/feross" 1446 | }, 1447 | { 1448 | "type": "patreon", 1449 | "url": "https://www.patreon.com/feross" 1450 | }, 1451 | { 1452 | "type": "consulting", 1453 | "url": "https://feross.org/support" 1454 | } 1455 | ], 1456 | "license": "MIT" 1457 | }, 1458 | "node_modules/bignumber.js": { 1459 | "version": "9.1.2", 1460 | "dev": true, 1461 | "license": "MIT", 1462 | "engines": { 1463 | "node": "*" 1464 | } 1465 | }, 1466 | "node_modules/binary-extensions": { 1467 | "version": "2.2.0", 1468 | "dev": true, 1469 | "license": "MIT", 1470 | "engines": { 1471 | "node": ">=8" 1472 | } 1473 | }, 1474 | "node_modules/bl": { 1475 | "version": "5.1.0", 1476 | "dev": true, 1477 | "license": "MIT", 1478 | "dependencies": { 1479 | "buffer": "^6.0.3", 1480 | "inherits": "^2.0.4", 1481 | "readable-stream": "^3.4.0" 1482 | } 1483 | }, 1484 | "node_modules/brace-expansion": { 1485 | "version": "1.1.11", 1486 | "dev": true, 1487 | "license": "MIT", 1488 | "dependencies": { 1489 | "balanced-match": "^1.0.0", 1490 | "concat-map": "0.0.1" 1491 | } 1492 | }, 1493 | "node_modules/braces": { 1494 | "version": "3.0.2", 1495 | "dev": true, 1496 | "license": "MIT", 1497 | "dependencies": { 1498 | "fill-range": "^7.0.1" 1499 | }, 1500 | "engines": { 1501 | "node": ">=8" 1502 | } 1503 | }, 1504 | "node_modules/browserslist": { 1505 | "version": "4.22.1", 1506 | "dev": true, 1507 | "funding": [ 1508 | { 1509 | "type": "opencollective", 1510 | "url": "https://opencollective.com/browserslist" 1511 | }, 1512 | { 1513 | "type": "tidelift", 1514 | "url": "https://tidelift.com/funding/github/npm/browserslist" 1515 | }, 1516 | { 1517 | "type": "github", 1518 | "url": "https://github.com/sponsors/ai" 1519 | } 1520 | ], 1521 | "license": "MIT", 1522 | "dependencies": { 1523 | "caniuse-lite": "^1.0.30001541", 1524 | "electron-to-chromium": "^1.4.535", 1525 | "node-releases": "^2.0.13", 1526 | "update-browserslist-db": "^1.0.13" 1527 | }, 1528 | "bin": { 1529 | "browserslist": "cli.js" 1530 | }, 1531 | "engines": { 1532 | "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" 1533 | } 1534 | }, 1535 | "node_modules/bser": { 1536 | "version": "2.1.1", 1537 | "dev": true, 1538 | "license": "Apache-2.0", 1539 | "dependencies": { 1540 | "node-int64": "^0.4.0" 1541 | } 1542 | }, 1543 | "node_modules/buffer": { 1544 | "version": "6.0.3", 1545 | "dev": true, 1546 | "funding": [ 1547 | { 1548 | "type": "github", 1549 | "url": "https://github.com/sponsors/feross" 1550 | }, 1551 | { 1552 | "type": "patreon", 1553 | "url": "https://www.patreon.com/feross" 1554 | }, 1555 | { 1556 | "type": "consulting", 1557 | "url": "https://feross.org/support" 1558 | } 1559 | ], 1560 | "license": "MIT", 1561 | "dependencies": { 1562 | "base64-js": "^1.3.1", 1563 | "ieee754": "^1.2.1" 1564 | } 1565 | }, 1566 | "node_modules/buffer-equal-constant-time": { 1567 | "version": "1.0.1", 1568 | "dev": true, 1569 | "license": "BSD-3-Clause" 1570 | }, 1571 | "node_modules/buffer-from": { 1572 | "version": "1.1.2", 1573 | "dev": true, 1574 | "license": "MIT" 1575 | }, 1576 | "node_modules/cacheable-lookup": { 1577 | "version": "5.0.4", 1578 | "dev": true, 1579 | "license": "MIT", 1580 | "engines": { 1581 | "node": ">=10.6.0" 1582 | } 1583 | }, 1584 | "node_modules/cacheable-request": { 1585 | "version": "7.0.4", 1586 | "dev": true, 1587 | "license": "MIT", 1588 | "dependencies": { 1589 | "clone-response": "^1.0.2", 1590 | "get-stream": "^5.1.0", 1591 | "http-cache-semantics": "^4.0.0", 1592 | "keyv": "^4.0.0", 1593 | "lowercase-keys": "^2.0.0", 1594 | "normalize-url": "^6.0.1", 1595 | "responselike": "^2.0.0" 1596 | }, 1597 | "engines": { 1598 | "node": ">=8" 1599 | } 1600 | }, 1601 | "node_modules/call-bind": { 1602 | "version": "1.0.5", 1603 | "dev": true, 1604 | "license": "MIT", 1605 | "dependencies": { 1606 | "function-bind": "^1.1.2", 1607 | "get-intrinsic": "^1.2.1", 1608 | "set-function-length": "^1.1.1" 1609 | }, 1610 | "funding": { 1611 | "url": "https://github.com/sponsors/ljharb" 1612 | } 1613 | }, 1614 | "node_modules/callsites": { 1615 | "version": "3.1.0", 1616 | "dev": true, 1617 | "license": "MIT", 1618 | "engines": { 1619 | "node": ">=6" 1620 | } 1621 | }, 1622 | "node_modules/camelcase": { 1623 | "version": "5.3.1", 1624 | "dev": true, 1625 | "license": "MIT", 1626 | "engines": { 1627 | "node": ">=6" 1628 | } 1629 | }, 1630 | "node_modules/caniuse-lite": { 1631 | "version": "1.0.30001565", 1632 | "dev": true, 1633 | "funding": [ 1634 | { 1635 | "type": "opencollective", 1636 | "url": "https://opencollective.com/browserslist" 1637 | }, 1638 | { 1639 | "type": "tidelift", 1640 | "url": "https://tidelift.com/funding/github/npm/caniuse-lite" 1641 | }, 1642 | { 1643 | "type": "github", 1644 | "url": "https://github.com/sponsors/ai" 1645 | } 1646 | ], 1647 | "license": "CC-BY-4.0" 1648 | }, 1649 | "node_modules/chalk": { 1650 | "version": "4.1.2", 1651 | "dev": true, 1652 | "license": "MIT", 1653 | "dependencies": { 1654 | "ansi-styles": "^4.1.0", 1655 | "supports-color": "^7.1.0" 1656 | }, 1657 | "engines": { 1658 | "node": ">=10" 1659 | }, 1660 | "funding": { 1661 | "url": "https://github.com/chalk/chalk?sponsor=1" 1662 | } 1663 | }, 1664 | "node_modules/char-regex": { 1665 | "version": "1.0.2", 1666 | "dev": true, 1667 | "license": "MIT", 1668 | "engines": { 1669 | "node": ">=10" 1670 | } 1671 | }, 1672 | "node_modules/chardet": { 1673 | "version": "0.7.0", 1674 | "dev": true, 1675 | "license": "MIT" 1676 | }, 1677 | "node_modules/chokidar": { 1678 | "version": "3.5.3", 1679 | "dev": true, 1680 | "funding": [ 1681 | { 1682 | "type": "individual", 1683 | "url": "https://paulmillr.com/funding/" 1684 | } 1685 | ], 1686 | "license": "MIT", 1687 | "dependencies": { 1688 | "anymatch": "~3.1.2", 1689 | "braces": "~3.0.2", 1690 | "glob-parent": "~5.1.2", 1691 | "is-binary-path": "~2.1.0", 1692 | "is-glob": "~4.0.1", 1693 | "normalize-path": "~3.0.0", 1694 | "readdirp": "~3.6.0" 1695 | }, 1696 | "engines": { 1697 | "node": ">= 8.10.0" 1698 | }, 1699 | "optionalDependencies": { 1700 | "fsevents": "~2.3.2" 1701 | } 1702 | }, 1703 | "node_modules/ci-info": { 1704 | "version": "3.9.0", 1705 | "dev": true, 1706 | "funding": [ 1707 | { 1708 | "type": "github", 1709 | "url": "https://github.com/sponsors/sibiraj-s" 1710 | } 1711 | ], 1712 | "license": "MIT", 1713 | "engines": { 1714 | "node": ">=8" 1715 | } 1716 | }, 1717 | "node_modules/cjs-module-lexer": { 1718 | "version": "1.2.3", 1719 | "dev": true, 1720 | "license": "MIT" 1721 | }, 1722 | "node_modules/clean-stack": { 1723 | "version": "4.2.0", 1724 | "dev": true, 1725 | "license": "MIT", 1726 | "dependencies": { 1727 | "escape-string-regexp": "5.0.0" 1728 | }, 1729 | "engines": { 1730 | "node": ">=12" 1731 | }, 1732 | "funding": { 1733 | "url": "https://github.com/sponsors/sindresorhus" 1734 | } 1735 | }, 1736 | "node_modules/clean-stack/node_modules/escape-string-regexp": { 1737 | "version": "5.0.0", 1738 | "dev": true, 1739 | "license": "MIT", 1740 | "engines": { 1741 | "node": ">=12" 1742 | }, 1743 | "funding": { 1744 | "url": "https://github.com/sponsors/sindresorhus" 1745 | } 1746 | }, 1747 | "node_modules/cli-cursor": { 1748 | "version": "3.1.0", 1749 | "dev": true, 1750 | "license": "MIT", 1751 | "dependencies": { 1752 | "restore-cursor": "^3.1.0" 1753 | }, 1754 | "engines": { 1755 | "node": ">=8" 1756 | } 1757 | }, 1758 | "node_modules/cli-spinners": { 1759 | "version": "2.9.2", 1760 | "dev": true, 1761 | "license": "MIT", 1762 | "engines": { 1763 | "node": ">=6" 1764 | }, 1765 | "funding": { 1766 | "url": "https://github.com/sponsors/sindresorhus" 1767 | } 1768 | }, 1769 | "node_modules/cli-truncate": { 1770 | "version": "3.1.0", 1771 | "dev": true, 1772 | "license": "MIT", 1773 | "dependencies": { 1774 | "slice-ansi": "^5.0.0", 1775 | "string-width": "^5.0.0" 1776 | }, 1777 | "engines": { 1778 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 1779 | }, 1780 | "funding": { 1781 | "url": "https://github.com/sponsors/sindresorhus" 1782 | } 1783 | }, 1784 | "node_modules/cli-width": { 1785 | "version": "3.0.0", 1786 | "dev": true, 1787 | "license": "ISC", 1788 | "engines": { 1789 | "node": ">= 10" 1790 | } 1791 | }, 1792 | "node_modules/cliui": { 1793 | "version": "8.0.1", 1794 | "dev": true, 1795 | "license": "ISC", 1796 | "dependencies": { 1797 | "string-width": "^4.2.0", 1798 | "strip-ansi": "^6.0.1", 1799 | "wrap-ansi": "^7.0.0" 1800 | }, 1801 | "engines": { 1802 | "node": ">=12" 1803 | } 1804 | }, 1805 | "node_modules/cliui/node_modules/emoji-regex": { 1806 | "version": "8.0.0", 1807 | "dev": true, 1808 | "license": "MIT" 1809 | }, 1810 | "node_modules/cliui/node_modules/is-fullwidth-code-point": { 1811 | "version": "3.0.0", 1812 | "dev": true, 1813 | "license": "MIT", 1814 | "engines": { 1815 | "node": ">=8" 1816 | } 1817 | }, 1818 | "node_modules/cliui/node_modules/string-width": { 1819 | "version": "4.2.3", 1820 | "dev": true, 1821 | "license": "MIT", 1822 | "dependencies": { 1823 | "emoji-regex": "^8.0.0", 1824 | "is-fullwidth-code-point": "^3.0.0", 1825 | "strip-ansi": "^6.0.1" 1826 | }, 1827 | "engines": { 1828 | "node": ">=8" 1829 | } 1830 | }, 1831 | "node_modules/cliui/node_modules/wrap-ansi": { 1832 | "version": "7.0.0", 1833 | "dev": true, 1834 | "license": "MIT", 1835 | "dependencies": { 1836 | "ansi-styles": "^4.0.0", 1837 | "string-width": "^4.1.0", 1838 | "strip-ansi": "^6.0.0" 1839 | }, 1840 | "engines": { 1841 | "node": ">=10" 1842 | }, 1843 | "funding": { 1844 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 1845 | } 1846 | }, 1847 | "node_modules/clone": { 1848 | "version": "1.0.4", 1849 | "dev": true, 1850 | "license": "MIT", 1851 | "engines": { 1852 | "node": ">=0.8" 1853 | } 1854 | }, 1855 | "node_modules/clone-response": { 1856 | "version": "1.0.3", 1857 | "dev": true, 1858 | "license": "MIT", 1859 | "dependencies": { 1860 | "mimic-response": "^1.0.0" 1861 | }, 1862 | "funding": { 1863 | "url": "https://github.com/sponsors/sindresorhus" 1864 | } 1865 | }, 1866 | "node_modules/co": { 1867 | "version": "4.6.0", 1868 | "dev": true, 1869 | "license": "MIT", 1870 | "engines": { 1871 | "iojs": ">= 1.0.0", 1872 | "node": ">= 0.12.0" 1873 | } 1874 | }, 1875 | "node_modules/collect-v8-coverage": { 1876 | "version": "1.0.2", 1877 | "dev": true, 1878 | "license": "MIT" 1879 | }, 1880 | "node_modules/color-convert": { 1881 | "version": "2.0.1", 1882 | "dev": true, 1883 | "license": "MIT", 1884 | "dependencies": { 1885 | "color-name": "~1.1.4" 1886 | }, 1887 | "engines": { 1888 | "node": ">=7.0.0" 1889 | } 1890 | }, 1891 | "node_modules/color-name": { 1892 | "version": "1.1.4", 1893 | "dev": true, 1894 | "license": "MIT" 1895 | }, 1896 | "node_modules/commander": { 1897 | "version": "8.3.0", 1898 | "dev": true, 1899 | "license": "MIT", 1900 | "engines": { 1901 | "node": ">= 12" 1902 | } 1903 | }, 1904 | "node_modules/concat-map": { 1905 | "version": "0.0.1", 1906 | "dev": true, 1907 | "license": "MIT" 1908 | }, 1909 | "node_modules/convert-source-map": { 1910 | "version": "2.0.0", 1911 | "dev": true, 1912 | "license": "MIT" 1913 | }, 1914 | "node_modules/create-jest": { 1915 | "version": "29.7.0", 1916 | "dev": true, 1917 | "license": "MIT", 1918 | "dependencies": { 1919 | "@jest/types": "^29.6.3", 1920 | "chalk": "^4.0.0", 1921 | "exit": "^0.1.2", 1922 | "graceful-fs": "^4.2.9", 1923 | "jest-config": "^29.7.0", 1924 | "jest-util": "^29.7.0", 1925 | "prompts": "^2.0.1" 1926 | }, 1927 | "bin": { 1928 | "create-jest": "bin/create-jest.js" 1929 | }, 1930 | "engines": { 1931 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 1932 | } 1933 | }, 1934 | "node_modules/cross-spawn": { 1935 | "version": "7.0.3", 1936 | "dev": true, 1937 | "license": "MIT", 1938 | "dependencies": { 1939 | "path-key": "^3.1.0", 1940 | "shebang-command": "^2.0.0", 1941 | "which": "^2.0.1" 1942 | }, 1943 | "engines": { 1944 | "node": ">= 8" 1945 | } 1946 | }, 1947 | "node_modules/currently-unhandled": { 1948 | "version": "0.4.1", 1949 | "dev": true, 1950 | "license": "MIT", 1951 | "dependencies": { 1952 | "array-find-index": "^1.0.1" 1953 | }, 1954 | "engines": { 1955 | "node": ">=0.10.0" 1956 | } 1957 | }, 1958 | "node_modules/debounce": { 1959 | "version": "1.2.1", 1960 | "dev": true, 1961 | "license": "MIT" 1962 | }, 1963 | "node_modules/debug": { 1964 | "version": "4.3.4", 1965 | "dev": true, 1966 | "license": "MIT", 1967 | "dependencies": { 1968 | "ms": "2.1.2" 1969 | }, 1970 | "engines": { 1971 | "node": ">=6.0" 1972 | }, 1973 | "peerDependenciesMeta": { 1974 | "supports-color": { 1975 | "optional": true 1976 | } 1977 | } 1978 | }, 1979 | "node_modules/decompress-response": { 1980 | "version": "6.0.0", 1981 | "dev": true, 1982 | "license": "MIT", 1983 | "dependencies": { 1984 | "mimic-response": "^3.1.0" 1985 | }, 1986 | "engines": { 1987 | "node": ">=10" 1988 | }, 1989 | "funding": { 1990 | "url": "https://github.com/sponsors/sindresorhus" 1991 | } 1992 | }, 1993 | "node_modules/decompress-response/node_modules/mimic-response": { 1994 | "version": "3.1.0", 1995 | "dev": true, 1996 | "license": "MIT", 1997 | "engines": { 1998 | "node": ">=10" 1999 | }, 2000 | "funding": { 2001 | "url": "https://github.com/sponsors/sindresorhus" 2002 | } 2003 | }, 2004 | "node_modules/dedent": { 2005 | "version": "1.5.1", 2006 | "dev": true, 2007 | "license": "MIT", 2008 | "peerDependencies": { 2009 | "babel-plugin-macros": "^3.1.0" 2010 | }, 2011 | "peerDependenciesMeta": { 2012 | "babel-plugin-macros": { 2013 | "optional": true 2014 | } 2015 | } 2016 | }, 2017 | "node_modules/deepmerge": { 2018 | "version": "4.3.1", 2019 | "dev": true, 2020 | "license": "MIT", 2021 | "engines": { 2022 | "node": ">=0.10.0" 2023 | } 2024 | }, 2025 | "node_modules/defaults": { 2026 | "version": "1.0.4", 2027 | "dev": true, 2028 | "license": "MIT", 2029 | "dependencies": { 2030 | "clone": "^1.0.2" 2031 | }, 2032 | "funding": { 2033 | "url": "https://github.com/sponsors/sindresorhus" 2034 | } 2035 | }, 2036 | "node_modules/defer-to-connect": { 2037 | "version": "2.0.1", 2038 | "dev": true, 2039 | "license": "MIT", 2040 | "engines": { 2041 | "node": ">=10" 2042 | } 2043 | }, 2044 | "node_modules/define-data-property": { 2045 | "version": "1.1.1", 2046 | "dev": true, 2047 | "license": "MIT", 2048 | "dependencies": { 2049 | "get-intrinsic": "^1.2.1", 2050 | "gopd": "^1.0.1", 2051 | "has-property-descriptors": "^1.0.0" 2052 | }, 2053 | "engines": { 2054 | "node": ">= 0.4" 2055 | } 2056 | }, 2057 | "node_modules/define-lazy-prop": { 2058 | "version": "2.0.0", 2059 | "dev": true, 2060 | "license": "MIT", 2061 | "engines": { 2062 | "node": ">=8" 2063 | } 2064 | }, 2065 | "node_modules/detect-newline": { 2066 | "version": "3.1.0", 2067 | "dev": true, 2068 | "license": "MIT", 2069 | "engines": { 2070 | "node": ">=8" 2071 | } 2072 | }, 2073 | "node_modules/diff-sequences": { 2074 | "version": "29.6.3", 2075 | "dev": true, 2076 | "license": "MIT", 2077 | "engines": { 2078 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2079 | } 2080 | }, 2081 | "node_modules/dotf": { 2082 | "version": "2.0.2", 2083 | "dev": true, 2084 | "license": "MIT", 2085 | "dependencies": { 2086 | "graceful-fs": "^4.2.8", 2087 | "jsonfile": "^6.1.0" 2088 | }, 2089 | "engines": { 2090 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 2091 | } 2092 | }, 2093 | "node_modules/eastasianwidth": { 2094 | "version": "0.2.0", 2095 | "dev": true, 2096 | "license": "MIT" 2097 | }, 2098 | "node_modules/ecdsa-sig-formatter": { 2099 | "version": "1.0.11", 2100 | "dev": true, 2101 | "license": "Apache-2.0", 2102 | "dependencies": { 2103 | "safe-buffer": "^5.0.1" 2104 | } 2105 | }, 2106 | "node_modules/electron-to-chromium": { 2107 | "version": "1.4.595", 2108 | "dev": true, 2109 | "license": "ISC" 2110 | }, 2111 | "node_modules/emittery": { 2112 | "version": "0.13.1", 2113 | "dev": true, 2114 | "license": "MIT", 2115 | "engines": { 2116 | "node": ">=12" 2117 | }, 2118 | "funding": { 2119 | "url": "https://github.com/sindresorhus/emittery?sponsor=1" 2120 | } 2121 | }, 2122 | "node_modules/emoji-regex": { 2123 | "version": "9.2.2", 2124 | "dev": true, 2125 | "license": "MIT" 2126 | }, 2127 | "node_modules/end-of-stream": { 2128 | "version": "1.4.4", 2129 | "dev": true, 2130 | "license": "MIT", 2131 | "dependencies": { 2132 | "once": "^1.4.0" 2133 | } 2134 | }, 2135 | "node_modules/error-ex": { 2136 | "version": "1.3.2", 2137 | "dev": true, 2138 | "license": "MIT", 2139 | "dependencies": { 2140 | "is-arrayish": "^0.2.1" 2141 | } 2142 | }, 2143 | "node_modules/escalade": { 2144 | "version": "3.1.1", 2145 | "dev": true, 2146 | "license": "MIT", 2147 | "engines": { 2148 | "node": ">=6" 2149 | } 2150 | }, 2151 | "node_modules/escape-string-regexp": { 2152 | "version": "1.0.5", 2153 | "dev": true, 2154 | "license": "MIT", 2155 | "engines": { 2156 | "node": ">=0.8.0" 2157 | } 2158 | }, 2159 | "node_modules/esprima": { 2160 | "version": "4.0.1", 2161 | "dev": true, 2162 | "license": "BSD-2-Clause", 2163 | "bin": { 2164 | "esparse": "bin/esparse.js", 2165 | "esvalidate": "bin/esvalidate.js" 2166 | }, 2167 | "engines": { 2168 | "node": ">=4" 2169 | } 2170 | }, 2171 | "node_modules/event-target-shim": { 2172 | "version": "5.0.1", 2173 | "dev": true, 2174 | "license": "MIT", 2175 | "engines": { 2176 | "node": ">=6" 2177 | } 2178 | }, 2179 | "node_modules/execa": { 2180 | "version": "5.1.1", 2181 | "dev": true, 2182 | "license": "MIT", 2183 | "dependencies": { 2184 | "cross-spawn": "^7.0.3", 2185 | "get-stream": "^6.0.0", 2186 | "human-signals": "^2.1.0", 2187 | "is-stream": "^2.0.0", 2188 | "merge-stream": "^2.0.0", 2189 | "npm-run-path": "^4.0.1", 2190 | "onetime": "^5.1.2", 2191 | "signal-exit": "^3.0.3", 2192 | "strip-final-newline": "^2.0.0" 2193 | }, 2194 | "engines": { 2195 | "node": ">=10" 2196 | }, 2197 | "funding": { 2198 | "url": "https://github.com/sindresorhus/execa?sponsor=1" 2199 | } 2200 | }, 2201 | "node_modules/execa/node_modules/get-stream": { 2202 | "version": "6.0.1", 2203 | "dev": true, 2204 | "license": "MIT", 2205 | "engines": { 2206 | "node": ">=10" 2207 | }, 2208 | "funding": { 2209 | "url": "https://github.com/sponsors/sindresorhus" 2210 | } 2211 | }, 2212 | "node_modules/exit": { 2213 | "version": "0.1.2", 2214 | "dev": true, 2215 | "engines": { 2216 | "node": ">= 0.8.0" 2217 | } 2218 | }, 2219 | "node_modules/expect": { 2220 | "version": "29.7.0", 2221 | "dev": true, 2222 | "license": "MIT", 2223 | "dependencies": { 2224 | "@jest/expect-utils": "^29.7.0", 2225 | "jest-get-type": "^29.6.3", 2226 | "jest-matcher-utils": "^29.7.0", 2227 | "jest-message-util": "^29.7.0", 2228 | "jest-util": "^29.7.0" 2229 | }, 2230 | "engines": { 2231 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2232 | } 2233 | }, 2234 | "node_modules/extend": { 2235 | "version": "3.0.2", 2236 | "dev": true, 2237 | "license": "MIT" 2238 | }, 2239 | "node_modules/external-editor": { 2240 | "version": "3.1.0", 2241 | "dev": true, 2242 | "license": "MIT", 2243 | "dependencies": { 2244 | "chardet": "^0.7.0", 2245 | "iconv-lite": "^0.4.24", 2246 | "tmp": "^0.0.33" 2247 | }, 2248 | "engines": { 2249 | "node": ">=4" 2250 | } 2251 | }, 2252 | "node_modules/fast-json-stable-stringify": { 2253 | "version": "2.1.0", 2254 | "dev": true, 2255 | "license": "MIT" 2256 | }, 2257 | "node_modules/fast-text-encoding": { 2258 | "version": "1.0.6", 2259 | "dev": true, 2260 | "license": "Apache-2.0" 2261 | }, 2262 | "node_modules/fb-watchman": { 2263 | "version": "2.0.2", 2264 | "dev": true, 2265 | "license": "Apache-2.0", 2266 | "dependencies": { 2267 | "bser": "2.1.1" 2268 | } 2269 | }, 2270 | "node_modules/figures": { 2271 | "version": "3.2.0", 2272 | "dev": true, 2273 | "license": "MIT", 2274 | "dependencies": { 2275 | "escape-string-regexp": "^1.0.5" 2276 | }, 2277 | "engines": { 2278 | "node": ">=8" 2279 | }, 2280 | "funding": { 2281 | "url": "https://github.com/sponsors/sindresorhus" 2282 | } 2283 | }, 2284 | "node_modules/fill-range": { 2285 | "version": "7.0.1", 2286 | "dev": true, 2287 | "license": "MIT", 2288 | "dependencies": { 2289 | "to-regex-range": "^5.0.1" 2290 | }, 2291 | "engines": { 2292 | "node": ">=8" 2293 | } 2294 | }, 2295 | "node_modules/find-up": { 2296 | "version": "6.3.0", 2297 | "dev": true, 2298 | "license": "MIT", 2299 | "dependencies": { 2300 | "locate-path": "^7.1.0", 2301 | "path-exists": "^5.0.0" 2302 | }, 2303 | "engines": { 2304 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 2305 | }, 2306 | "funding": { 2307 | "url": "https://github.com/sponsors/sindresorhus" 2308 | } 2309 | }, 2310 | "node_modules/fs-extra": { 2311 | "version": "10.1.0", 2312 | "dev": true, 2313 | "license": "MIT", 2314 | "dependencies": { 2315 | "graceful-fs": "^4.2.0", 2316 | "jsonfile": "^6.0.1", 2317 | "universalify": "^2.0.0" 2318 | }, 2319 | "engines": { 2320 | "node": ">=12" 2321 | } 2322 | }, 2323 | "node_modules/fs.realpath": { 2324 | "version": "1.0.0", 2325 | "dev": true, 2326 | "license": "ISC" 2327 | }, 2328 | "node_modules/fsevents": { 2329 | "version": "2.3.3", 2330 | "dev": true, 2331 | "license": "MIT", 2332 | "optional": true, 2333 | "os": [ 2334 | "darwin" 2335 | ], 2336 | "engines": { 2337 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 2338 | } 2339 | }, 2340 | "node_modules/function-bind": { 2341 | "version": "1.1.2", 2342 | "dev": true, 2343 | "license": "MIT", 2344 | "funding": { 2345 | "url": "https://github.com/sponsors/ljharb" 2346 | } 2347 | }, 2348 | "node_modules/fuzzy": { 2349 | "version": "0.1.3", 2350 | "dev": true, 2351 | "engines": { 2352 | "node": ">= 0.6.0" 2353 | } 2354 | }, 2355 | "node_modules/gaxios": { 2356 | "version": "4.3.3", 2357 | "dev": true, 2358 | "license": "Apache-2.0", 2359 | "dependencies": { 2360 | "abort-controller": "^3.0.0", 2361 | "extend": "^3.0.2", 2362 | "https-proxy-agent": "^5.0.0", 2363 | "is-stream": "^2.0.0", 2364 | "node-fetch": "^2.6.7" 2365 | }, 2366 | "engines": { 2367 | "node": ">=10" 2368 | } 2369 | }, 2370 | "node_modules/gcp-metadata": { 2371 | "version": "4.3.1", 2372 | "dev": true, 2373 | "license": "Apache-2.0", 2374 | "dependencies": { 2375 | "gaxios": "^4.0.0", 2376 | "json-bigint": "^1.0.0" 2377 | }, 2378 | "engines": { 2379 | "node": ">=10" 2380 | } 2381 | }, 2382 | "node_modules/gensync": { 2383 | "version": "1.0.0-beta.2", 2384 | "dev": true, 2385 | "license": "MIT", 2386 | "engines": { 2387 | "node": ">=6.9.0" 2388 | } 2389 | }, 2390 | "node_modules/get-caller-file": { 2391 | "version": "2.0.5", 2392 | "dev": true, 2393 | "license": "ISC", 2394 | "engines": { 2395 | "node": "6.* || 8.* || >= 10.*" 2396 | } 2397 | }, 2398 | "node_modules/get-intrinsic": { 2399 | "version": "1.2.2", 2400 | "dev": true, 2401 | "license": "MIT", 2402 | "dependencies": { 2403 | "function-bind": "^1.1.2", 2404 | "has-proto": "^1.0.1", 2405 | "has-symbols": "^1.0.3", 2406 | "hasown": "^2.0.0" 2407 | }, 2408 | "funding": { 2409 | "url": "https://github.com/sponsors/ljharb" 2410 | } 2411 | }, 2412 | "node_modules/get-package-type": { 2413 | "version": "0.1.0", 2414 | "dev": true, 2415 | "license": "MIT", 2416 | "engines": { 2417 | "node": ">=8.0.0" 2418 | } 2419 | }, 2420 | "node_modules/get-stream": { 2421 | "version": "5.2.0", 2422 | "dev": true, 2423 | "license": "MIT", 2424 | "dependencies": { 2425 | "pump": "^3.0.0" 2426 | }, 2427 | "engines": { 2428 | "node": ">=8" 2429 | }, 2430 | "funding": { 2431 | "url": "https://github.com/sponsors/sindresorhus" 2432 | } 2433 | }, 2434 | "node_modules/glob": { 2435 | "version": "7.2.3", 2436 | "dev": true, 2437 | "license": "ISC", 2438 | "dependencies": { 2439 | "fs.realpath": "^1.0.0", 2440 | "inflight": "^1.0.4", 2441 | "inherits": "2", 2442 | "minimatch": "^3.1.1", 2443 | "once": "^1.3.0", 2444 | "path-is-absolute": "^1.0.0" 2445 | }, 2446 | "engines": { 2447 | "node": "*" 2448 | }, 2449 | "funding": { 2450 | "url": "https://github.com/sponsors/isaacs" 2451 | } 2452 | }, 2453 | "node_modules/glob-parent": { 2454 | "version": "5.1.2", 2455 | "dev": true, 2456 | "license": "ISC", 2457 | "dependencies": { 2458 | "is-glob": "^4.0.1" 2459 | }, 2460 | "engines": { 2461 | "node": ">= 6" 2462 | } 2463 | }, 2464 | "node_modules/globals": { 2465 | "version": "11.12.0", 2466 | "dev": true, 2467 | "license": "MIT", 2468 | "engines": { 2469 | "node": ">=4" 2470 | } 2471 | }, 2472 | "node_modules/google-auth-library": { 2473 | "version": "7.14.1", 2474 | "dev": true, 2475 | "license": "Apache-2.0", 2476 | "dependencies": { 2477 | "arrify": "^2.0.0", 2478 | "base64-js": "^1.3.0", 2479 | "ecdsa-sig-formatter": "^1.0.11", 2480 | "fast-text-encoding": "^1.0.0", 2481 | "gaxios": "^4.0.0", 2482 | "gcp-metadata": "^4.2.0", 2483 | "gtoken": "^5.0.4", 2484 | "jws": "^4.0.0", 2485 | "lru-cache": "^6.0.0" 2486 | }, 2487 | "engines": { 2488 | "node": ">=10" 2489 | } 2490 | }, 2491 | "node_modules/google-p12-pem": { 2492 | "version": "3.1.4", 2493 | "dev": true, 2494 | "license": "MIT", 2495 | "dependencies": { 2496 | "node-forge": "^1.3.1" 2497 | }, 2498 | "bin": { 2499 | "gp12-pem": "build/src/bin/gp12-pem.js" 2500 | }, 2501 | "engines": { 2502 | "node": ">=10" 2503 | } 2504 | }, 2505 | "node_modules/googleapis": { 2506 | "version": "84.0.0", 2507 | "dev": true, 2508 | "license": "Apache-2.0", 2509 | "dependencies": { 2510 | "google-auth-library": "^7.0.2", 2511 | "googleapis-common": "^5.0.2" 2512 | }, 2513 | "engines": { 2514 | "node": ">=10" 2515 | } 2516 | }, 2517 | "node_modules/googleapis-common": { 2518 | "version": "5.1.0", 2519 | "dev": true, 2520 | "license": "Apache-2.0", 2521 | "dependencies": { 2522 | "extend": "^3.0.2", 2523 | "gaxios": "^4.0.0", 2524 | "google-auth-library": "^7.14.0", 2525 | "qs": "^6.7.0", 2526 | "url-template": "^2.0.8", 2527 | "uuid": "^8.0.0" 2528 | }, 2529 | "engines": { 2530 | "node": ">=10.10.0" 2531 | } 2532 | }, 2533 | "node_modules/gopd": { 2534 | "version": "1.0.1", 2535 | "dev": true, 2536 | "license": "MIT", 2537 | "dependencies": { 2538 | "get-intrinsic": "^1.1.3" 2539 | }, 2540 | "funding": { 2541 | "url": "https://github.com/sponsors/ljharb" 2542 | } 2543 | }, 2544 | "node_modules/got": { 2545 | "version": "11.8.6", 2546 | "dev": true, 2547 | "license": "MIT", 2548 | "dependencies": { 2549 | "@sindresorhus/is": "^4.0.0", 2550 | "@szmarczak/http-timer": "^4.0.5", 2551 | "@types/cacheable-request": "^6.0.1", 2552 | "@types/responselike": "^1.0.0", 2553 | "cacheable-lookup": "^5.0.3", 2554 | "cacheable-request": "^7.0.2", 2555 | "decompress-response": "^6.0.0", 2556 | "http2-wrapper": "^1.0.0-beta.5.2", 2557 | "lowercase-keys": "^2.0.0", 2558 | "p-cancelable": "^2.0.0", 2559 | "responselike": "^2.0.0" 2560 | }, 2561 | "engines": { 2562 | "node": ">=10.19.0" 2563 | }, 2564 | "funding": { 2565 | "url": "https://github.com/sindresorhus/got?sponsor=1" 2566 | } 2567 | }, 2568 | "node_modules/graceful-fs": { 2569 | "version": "4.2.11", 2570 | "dev": true, 2571 | "license": "ISC" 2572 | }, 2573 | "node_modules/gtoken": { 2574 | "version": "5.3.2", 2575 | "dev": true, 2576 | "license": "MIT", 2577 | "dependencies": { 2578 | "gaxios": "^4.0.0", 2579 | "google-p12-pem": "^3.1.3", 2580 | "jws": "^4.0.0" 2581 | }, 2582 | "engines": { 2583 | "node": ">=10" 2584 | } 2585 | }, 2586 | "node_modules/has-flag": { 2587 | "version": "4.0.0", 2588 | "dev": true, 2589 | "license": "MIT", 2590 | "engines": { 2591 | "node": ">=8" 2592 | } 2593 | }, 2594 | "node_modules/has-property-descriptors": { 2595 | "version": "1.0.1", 2596 | "dev": true, 2597 | "license": "MIT", 2598 | "dependencies": { 2599 | "get-intrinsic": "^1.2.2" 2600 | }, 2601 | "funding": { 2602 | "url": "https://github.com/sponsors/ljharb" 2603 | } 2604 | }, 2605 | "node_modules/has-proto": { 2606 | "version": "1.0.1", 2607 | "dev": true, 2608 | "license": "MIT", 2609 | "engines": { 2610 | "node": ">= 0.4" 2611 | }, 2612 | "funding": { 2613 | "url": "https://github.com/sponsors/ljharb" 2614 | } 2615 | }, 2616 | "node_modules/has-symbols": { 2617 | "version": "1.0.3", 2618 | "dev": true, 2619 | "license": "MIT", 2620 | "engines": { 2621 | "node": ">= 0.4" 2622 | }, 2623 | "funding": { 2624 | "url": "https://github.com/sponsors/ljharb" 2625 | } 2626 | }, 2627 | "node_modules/hasown": { 2628 | "version": "2.0.0", 2629 | "dev": true, 2630 | "license": "MIT", 2631 | "dependencies": { 2632 | "function-bind": "^1.1.2" 2633 | }, 2634 | "engines": { 2635 | "node": ">= 0.4" 2636 | } 2637 | }, 2638 | "node_modules/hosted-git-info": { 2639 | "version": "4.1.0", 2640 | "dev": true, 2641 | "license": "ISC", 2642 | "dependencies": { 2643 | "lru-cache": "^6.0.0" 2644 | }, 2645 | "engines": { 2646 | "node": ">=10" 2647 | } 2648 | }, 2649 | "node_modules/html-escaper": { 2650 | "version": "2.0.2", 2651 | "dev": true, 2652 | "license": "MIT" 2653 | }, 2654 | "node_modules/http-cache-semantics": { 2655 | "version": "4.1.1", 2656 | "dev": true, 2657 | "license": "BSD-2-Clause" 2658 | }, 2659 | "node_modules/http2-wrapper": { 2660 | "version": "1.0.3", 2661 | "dev": true, 2662 | "license": "MIT", 2663 | "dependencies": { 2664 | "quick-lru": "^5.1.1", 2665 | "resolve-alpn": "^1.0.0" 2666 | }, 2667 | "engines": { 2668 | "node": ">=10.19.0" 2669 | } 2670 | }, 2671 | "node_modules/https-proxy-agent": { 2672 | "version": "5.0.1", 2673 | "dev": true, 2674 | "license": "MIT", 2675 | "dependencies": { 2676 | "agent-base": "6", 2677 | "debug": "4" 2678 | }, 2679 | "engines": { 2680 | "node": ">= 6" 2681 | } 2682 | }, 2683 | "node_modules/human-signals": { 2684 | "version": "2.1.0", 2685 | "dev": true, 2686 | "license": "Apache-2.0", 2687 | "engines": { 2688 | "node": ">=10.17.0" 2689 | } 2690 | }, 2691 | "node_modules/iconv-lite": { 2692 | "version": "0.4.24", 2693 | "dev": true, 2694 | "license": "MIT", 2695 | "dependencies": { 2696 | "safer-buffer": ">= 2.1.2 < 3" 2697 | }, 2698 | "engines": { 2699 | "node": ">=0.10.0" 2700 | } 2701 | }, 2702 | "node_modules/ieee754": { 2703 | "version": "1.2.1", 2704 | "dev": true, 2705 | "funding": [ 2706 | { 2707 | "type": "github", 2708 | "url": "https://github.com/sponsors/feross" 2709 | }, 2710 | { 2711 | "type": "patreon", 2712 | "url": "https://www.patreon.com/feross" 2713 | }, 2714 | { 2715 | "type": "consulting", 2716 | "url": "https://feross.org/support" 2717 | } 2718 | ], 2719 | "license": "BSD-3-Clause" 2720 | }, 2721 | "node_modules/import-local": { 2722 | "version": "3.1.0", 2723 | "dev": true, 2724 | "license": "MIT", 2725 | "dependencies": { 2726 | "pkg-dir": "^4.2.0", 2727 | "resolve-cwd": "^3.0.0" 2728 | }, 2729 | "bin": { 2730 | "import-local-fixture": "fixtures/cli.js" 2731 | }, 2732 | "engines": { 2733 | "node": ">=8" 2734 | }, 2735 | "funding": { 2736 | "url": "https://github.com/sponsors/sindresorhus" 2737 | } 2738 | }, 2739 | "node_modules/imurmurhash": { 2740 | "version": "0.1.4", 2741 | "dev": true, 2742 | "license": "MIT", 2743 | "engines": { 2744 | "node": ">=0.8.19" 2745 | } 2746 | }, 2747 | "node_modules/indent-string": { 2748 | "version": "5.0.0", 2749 | "dev": true, 2750 | "license": "MIT", 2751 | "engines": { 2752 | "node": ">=12" 2753 | }, 2754 | "funding": { 2755 | "url": "https://github.com/sponsors/sindresorhus" 2756 | } 2757 | }, 2758 | "node_modules/inflight": { 2759 | "version": "1.0.6", 2760 | "dev": true, 2761 | "license": "ISC", 2762 | "dependencies": { 2763 | "once": "^1.3.0", 2764 | "wrappy": "1" 2765 | } 2766 | }, 2767 | "node_modules/inherits": { 2768 | "version": "2.0.4", 2769 | "dev": true, 2770 | "license": "ISC" 2771 | }, 2772 | "node_modules/inquirer": { 2773 | "version": "8.2.6", 2774 | "dev": true, 2775 | "license": "MIT", 2776 | "dependencies": { 2777 | "ansi-escapes": "^4.2.1", 2778 | "chalk": "^4.1.1", 2779 | "cli-cursor": "^3.1.0", 2780 | "cli-width": "^3.0.0", 2781 | "external-editor": "^3.0.3", 2782 | "figures": "^3.0.0", 2783 | "lodash": "^4.17.21", 2784 | "mute-stream": "0.0.8", 2785 | "ora": "^5.4.1", 2786 | "run-async": "^2.4.0", 2787 | "rxjs": "^7.5.5", 2788 | "string-width": "^4.1.0", 2789 | "strip-ansi": "^6.0.0", 2790 | "through": "^2.3.6", 2791 | "wrap-ansi": "^6.0.1" 2792 | }, 2793 | "engines": { 2794 | "node": ">=12.0.0" 2795 | } 2796 | }, 2797 | "node_modules/inquirer-autocomplete-prompt-ipt": { 2798 | "version": "2.0.0", 2799 | "dev": true, 2800 | "license": "ISC", 2801 | "dependencies": { 2802 | "ansi-escapes": "^4.2.1", 2803 | "chalk": "^2.4.2", 2804 | "figures": "^3.1.0", 2805 | "run-async": "^2.3.0", 2806 | "rxjs": "^6.5.3" 2807 | }, 2808 | "engines": { 2809 | "node": ">=10" 2810 | }, 2811 | "peerDependencies": { 2812 | "inquirer": ">=7" 2813 | } 2814 | }, 2815 | "node_modules/inquirer-autocomplete-prompt-ipt/node_modules/ansi-styles": { 2816 | "version": "3.2.1", 2817 | "dev": true, 2818 | "license": "MIT", 2819 | "dependencies": { 2820 | "color-convert": "^1.9.0" 2821 | }, 2822 | "engines": { 2823 | "node": ">=4" 2824 | } 2825 | }, 2826 | "node_modules/inquirer-autocomplete-prompt-ipt/node_modules/chalk": { 2827 | "version": "2.4.2", 2828 | "dev": true, 2829 | "license": "MIT", 2830 | "dependencies": { 2831 | "ansi-styles": "^3.2.1", 2832 | "escape-string-regexp": "^1.0.5", 2833 | "supports-color": "^5.3.0" 2834 | }, 2835 | "engines": { 2836 | "node": ">=4" 2837 | } 2838 | }, 2839 | "node_modules/inquirer-autocomplete-prompt-ipt/node_modules/color-convert": { 2840 | "version": "1.9.3", 2841 | "dev": true, 2842 | "license": "MIT", 2843 | "dependencies": { 2844 | "color-name": "1.1.3" 2845 | } 2846 | }, 2847 | "node_modules/inquirer-autocomplete-prompt-ipt/node_modules/color-name": { 2848 | "version": "1.1.3", 2849 | "dev": true, 2850 | "license": "MIT" 2851 | }, 2852 | "node_modules/inquirer-autocomplete-prompt-ipt/node_modules/has-flag": { 2853 | "version": "3.0.0", 2854 | "dev": true, 2855 | "license": "MIT", 2856 | "engines": { 2857 | "node": ">=4" 2858 | } 2859 | }, 2860 | "node_modules/inquirer-autocomplete-prompt-ipt/node_modules/rxjs": { 2861 | "version": "6.6.7", 2862 | "dev": true, 2863 | "license": "Apache-2.0", 2864 | "dependencies": { 2865 | "tslib": "^1.9.0" 2866 | }, 2867 | "engines": { 2868 | "npm": ">=2.0.0" 2869 | } 2870 | }, 2871 | "node_modules/inquirer-autocomplete-prompt-ipt/node_modules/supports-color": { 2872 | "version": "5.5.0", 2873 | "dev": true, 2874 | "license": "MIT", 2875 | "dependencies": { 2876 | "has-flag": "^3.0.0" 2877 | }, 2878 | "engines": { 2879 | "node": ">=4" 2880 | } 2881 | }, 2882 | "node_modules/inquirer-autocomplete-prompt-ipt/node_modules/tslib": { 2883 | "version": "1.14.1", 2884 | "dev": true, 2885 | "license": "0BSD" 2886 | }, 2887 | "node_modules/inquirer/node_modules/bl": { 2888 | "version": "4.1.0", 2889 | "dev": true, 2890 | "license": "MIT", 2891 | "dependencies": { 2892 | "buffer": "^5.5.0", 2893 | "inherits": "^2.0.4", 2894 | "readable-stream": "^3.4.0" 2895 | } 2896 | }, 2897 | "node_modules/inquirer/node_modules/buffer": { 2898 | "version": "5.7.1", 2899 | "dev": true, 2900 | "funding": [ 2901 | { 2902 | "type": "github", 2903 | "url": "https://github.com/sponsors/feross" 2904 | }, 2905 | { 2906 | "type": "patreon", 2907 | "url": "https://www.patreon.com/feross" 2908 | }, 2909 | { 2910 | "type": "consulting", 2911 | "url": "https://feross.org/support" 2912 | } 2913 | ], 2914 | "license": "MIT", 2915 | "dependencies": { 2916 | "base64-js": "^1.3.1", 2917 | "ieee754": "^1.1.13" 2918 | } 2919 | }, 2920 | "node_modules/inquirer/node_modules/emoji-regex": { 2921 | "version": "8.0.0", 2922 | "dev": true, 2923 | "license": "MIT" 2924 | }, 2925 | "node_modules/inquirer/node_modules/is-fullwidth-code-point": { 2926 | "version": "3.0.0", 2927 | "dev": true, 2928 | "license": "MIT", 2929 | "engines": { 2930 | "node": ">=8" 2931 | } 2932 | }, 2933 | "node_modules/inquirer/node_modules/is-interactive": { 2934 | "version": "1.0.0", 2935 | "dev": true, 2936 | "license": "MIT", 2937 | "engines": { 2938 | "node": ">=8" 2939 | } 2940 | }, 2941 | "node_modules/inquirer/node_modules/is-unicode-supported": { 2942 | "version": "0.1.0", 2943 | "dev": true, 2944 | "license": "MIT", 2945 | "engines": { 2946 | "node": ">=10" 2947 | }, 2948 | "funding": { 2949 | "url": "https://github.com/sponsors/sindresorhus" 2950 | } 2951 | }, 2952 | "node_modules/inquirer/node_modules/log-symbols": { 2953 | "version": "4.1.0", 2954 | "dev": true, 2955 | "license": "MIT", 2956 | "dependencies": { 2957 | "chalk": "^4.1.0", 2958 | "is-unicode-supported": "^0.1.0" 2959 | }, 2960 | "engines": { 2961 | "node": ">=10" 2962 | }, 2963 | "funding": { 2964 | "url": "https://github.com/sponsors/sindresorhus" 2965 | } 2966 | }, 2967 | "node_modules/inquirer/node_modules/ora": { 2968 | "version": "5.4.1", 2969 | "dev": true, 2970 | "license": "MIT", 2971 | "dependencies": { 2972 | "bl": "^4.1.0", 2973 | "chalk": "^4.1.0", 2974 | "cli-cursor": "^3.1.0", 2975 | "cli-spinners": "^2.5.0", 2976 | "is-interactive": "^1.0.0", 2977 | "is-unicode-supported": "^0.1.0", 2978 | "log-symbols": "^4.1.0", 2979 | "strip-ansi": "^6.0.0", 2980 | "wcwidth": "^1.0.1" 2981 | }, 2982 | "engines": { 2983 | "node": ">=10" 2984 | }, 2985 | "funding": { 2986 | "url": "https://github.com/sponsors/sindresorhus" 2987 | } 2988 | }, 2989 | "node_modules/inquirer/node_modules/string-width": { 2990 | "version": "4.2.3", 2991 | "dev": true, 2992 | "license": "MIT", 2993 | "dependencies": { 2994 | "emoji-regex": "^8.0.0", 2995 | "is-fullwidth-code-point": "^3.0.0", 2996 | "strip-ansi": "^6.0.1" 2997 | }, 2998 | "engines": { 2999 | "node": ">=8" 3000 | } 3001 | }, 3002 | "node_modules/is-arrayish": { 3003 | "version": "0.2.1", 3004 | "dev": true, 3005 | "license": "MIT" 3006 | }, 3007 | "node_modules/is-binary-path": { 3008 | "version": "2.1.0", 3009 | "dev": true, 3010 | "license": "MIT", 3011 | "dependencies": { 3012 | "binary-extensions": "^2.0.0" 3013 | }, 3014 | "engines": { 3015 | "node": ">=8" 3016 | } 3017 | }, 3018 | "node_modules/is-core-module": { 3019 | "version": "2.13.1", 3020 | "dev": true, 3021 | "license": "MIT", 3022 | "dependencies": { 3023 | "hasown": "^2.0.0" 3024 | }, 3025 | "funding": { 3026 | "url": "https://github.com/sponsors/ljharb" 3027 | } 3028 | }, 3029 | "node_modules/is-docker": { 3030 | "version": "2.2.1", 3031 | "dev": true, 3032 | "license": "MIT", 3033 | "bin": { 3034 | "is-docker": "cli.js" 3035 | }, 3036 | "engines": { 3037 | "node": ">=8" 3038 | }, 3039 | "funding": { 3040 | "url": "https://github.com/sponsors/sindresorhus" 3041 | } 3042 | }, 3043 | "node_modules/is-extglob": { 3044 | "version": "2.1.1", 3045 | "dev": true, 3046 | "license": "MIT", 3047 | "engines": { 3048 | "node": ">=0.10.0" 3049 | } 3050 | }, 3051 | "node_modules/is-fullwidth-code-point": { 3052 | "version": "4.0.0", 3053 | "dev": true, 3054 | "license": "MIT", 3055 | "engines": { 3056 | "node": ">=12" 3057 | }, 3058 | "funding": { 3059 | "url": "https://github.com/sponsors/sindresorhus" 3060 | } 3061 | }, 3062 | "node_modules/is-generator-fn": { 3063 | "version": "2.1.0", 3064 | "dev": true, 3065 | "license": "MIT", 3066 | "engines": { 3067 | "node": ">=6" 3068 | } 3069 | }, 3070 | "node_modules/is-glob": { 3071 | "version": "4.0.3", 3072 | "dev": true, 3073 | "license": "MIT", 3074 | "dependencies": { 3075 | "is-extglob": "^2.1.1" 3076 | }, 3077 | "engines": { 3078 | "node": ">=0.10.0" 3079 | } 3080 | }, 3081 | "node_modules/is-interactive": { 3082 | "version": "2.0.0", 3083 | "dev": true, 3084 | "license": "MIT", 3085 | "engines": { 3086 | "node": ">=12" 3087 | }, 3088 | "funding": { 3089 | "url": "https://github.com/sponsors/sindresorhus" 3090 | } 3091 | }, 3092 | "node_modules/is-number": { 3093 | "version": "7.0.0", 3094 | "dev": true, 3095 | "license": "MIT", 3096 | "engines": { 3097 | "node": ">=0.12.0" 3098 | } 3099 | }, 3100 | "node_modules/is-port-reachable": { 3101 | "version": "3.1.0", 3102 | "dev": true, 3103 | "license": "MIT", 3104 | "engines": { 3105 | "node": ">=8" 3106 | } 3107 | }, 3108 | "node_modules/is-reachable": { 3109 | "version": "5.2.1", 3110 | "dev": true, 3111 | "license": "MIT", 3112 | "dependencies": { 3113 | "arrify": "^2.0.1", 3114 | "got": "^11.7.0", 3115 | "is-port-reachable": "^3.0.0", 3116 | "p-any": "^3.0.0", 3117 | "p-timeout": "^3.2.0", 3118 | "prepend-http": "^3.0.1", 3119 | "router-ips": "^1.0.0", 3120 | "url-parse": "^1.5.10" 3121 | }, 3122 | "engines": { 3123 | "node": ">=10" 3124 | }, 3125 | "funding": { 3126 | "url": "https://github.com/sponsors/sindresorhus" 3127 | } 3128 | }, 3129 | "node_modules/is-stream": { 3130 | "version": "2.0.1", 3131 | "dev": true, 3132 | "license": "MIT", 3133 | "engines": { 3134 | "node": ">=8" 3135 | }, 3136 | "funding": { 3137 | "url": "https://github.com/sponsors/sindresorhus" 3138 | } 3139 | }, 3140 | "node_modules/is-unicode-supported": { 3141 | "version": "1.3.0", 3142 | "dev": true, 3143 | "license": "MIT", 3144 | "engines": { 3145 | "node": ">=12" 3146 | }, 3147 | "funding": { 3148 | "url": "https://github.com/sponsors/sindresorhus" 3149 | } 3150 | }, 3151 | "node_modules/is-wsl": { 3152 | "version": "2.2.0", 3153 | "dev": true, 3154 | "license": "MIT", 3155 | "dependencies": { 3156 | "is-docker": "^2.0.0" 3157 | }, 3158 | "engines": { 3159 | "node": ">=8" 3160 | } 3161 | }, 3162 | "node_modules/isexe": { 3163 | "version": "2.0.0", 3164 | "dev": true, 3165 | "license": "ISC" 3166 | }, 3167 | "node_modules/istanbul-lib-coverage": { 3168 | "version": "3.2.2", 3169 | "dev": true, 3170 | "license": "BSD-3-Clause", 3171 | "engines": { 3172 | "node": ">=8" 3173 | } 3174 | }, 3175 | "node_modules/istanbul-lib-instrument": { 3176 | "version": "6.0.1", 3177 | "dev": true, 3178 | "license": "BSD-3-Clause", 3179 | "dependencies": { 3180 | "@babel/core": "^7.12.3", 3181 | "@babel/parser": "^7.14.7", 3182 | "@istanbuljs/schema": "^0.1.2", 3183 | "istanbul-lib-coverage": "^3.2.0", 3184 | "semver": "^7.5.4" 3185 | }, 3186 | "engines": { 3187 | "node": ">=10" 3188 | } 3189 | }, 3190 | "node_modules/istanbul-lib-instrument/node_modules/semver": { 3191 | "version": "7.5.4", 3192 | "dev": true, 3193 | "license": "ISC", 3194 | "dependencies": { 3195 | "lru-cache": "^6.0.0" 3196 | }, 3197 | "bin": { 3198 | "semver": "bin/semver.js" 3199 | }, 3200 | "engines": { 3201 | "node": ">=10" 3202 | } 3203 | }, 3204 | "node_modules/istanbul-lib-report": { 3205 | "version": "3.0.1", 3206 | "dev": true, 3207 | "license": "BSD-3-Clause", 3208 | "dependencies": { 3209 | "istanbul-lib-coverage": "^3.0.0", 3210 | "make-dir": "^4.0.0", 3211 | "supports-color": "^7.1.0" 3212 | }, 3213 | "engines": { 3214 | "node": ">=10" 3215 | } 3216 | }, 3217 | "node_modules/istanbul-lib-report/node_modules/make-dir": { 3218 | "version": "4.0.0", 3219 | "dev": true, 3220 | "license": "MIT", 3221 | "dependencies": { 3222 | "semver": "^7.5.3" 3223 | }, 3224 | "engines": { 3225 | "node": ">=10" 3226 | }, 3227 | "funding": { 3228 | "url": "https://github.com/sponsors/sindresorhus" 3229 | } 3230 | }, 3231 | "node_modules/istanbul-lib-report/node_modules/semver": { 3232 | "version": "7.5.4", 3233 | "dev": true, 3234 | "license": "ISC", 3235 | "dependencies": { 3236 | "lru-cache": "^6.0.0" 3237 | }, 3238 | "bin": { 3239 | "semver": "bin/semver.js" 3240 | }, 3241 | "engines": { 3242 | "node": ">=10" 3243 | } 3244 | }, 3245 | "node_modules/istanbul-lib-source-maps": { 3246 | "version": "4.0.1", 3247 | "dev": true, 3248 | "license": "BSD-3-Clause", 3249 | "dependencies": { 3250 | "debug": "^4.1.1", 3251 | "istanbul-lib-coverage": "^3.0.0", 3252 | "source-map": "^0.6.1" 3253 | }, 3254 | "engines": { 3255 | "node": ">=10" 3256 | } 3257 | }, 3258 | "node_modules/istanbul-reports": { 3259 | "version": "3.1.6", 3260 | "dev": true, 3261 | "license": "BSD-3-Clause", 3262 | "dependencies": { 3263 | "html-escaper": "^2.0.0", 3264 | "istanbul-lib-report": "^3.0.0" 3265 | }, 3266 | "engines": { 3267 | "node": ">=8" 3268 | } 3269 | }, 3270 | "node_modules/jest": { 3271 | "version": "29.7.0", 3272 | "dev": true, 3273 | "license": "MIT", 3274 | "dependencies": { 3275 | "@jest/core": "^29.7.0", 3276 | "@jest/types": "^29.6.3", 3277 | "import-local": "^3.0.2", 3278 | "jest-cli": "^29.7.0" 3279 | }, 3280 | "bin": { 3281 | "jest": "bin/jest.js" 3282 | }, 3283 | "engines": { 3284 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 3285 | }, 3286 | "peerDependencies": { 3287 | "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" 3288 | }, 3289 | "peerDependenciesMeta": { 3290 | "node-notifier": { 3291 | "optional": true 3292 | } 3293 | } 3294 | }, 3295 | "node_modules/jest-changed-files": { 3296 | "version": "29.7.0", 3297 | "dev": true, 3298 | "license": "MIT", 3299 | "dependencies": { 3300 | "execa": "^5.0.0", 3301 | "jest-util": "^29.7.0", 3302 | "p-limit": "^3.1.0" 3303 | }, 3304 | "engines": { 3305 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 3306 | } 3307 | }, 3308 | "node_modules/jest-changed-files/node_modules/p-limit": { 3309 | "version": "3.1.0", 3310 | "dev": true, 3311 | "license": "MIT", 3312 | "dependencies": { 3313 | "yocto-queue": "^0.1.0" 3314 | }, 3315 | "engines": { 3316 | "node": ">=10" 3317 | }, 3318 | "funding": { 3319 | "url": "https://github.com/sponsors/sindresorhus" 3320 | } 3321 | }, 3322 | "node_modules/jest-changed-files/node_modules/yocto-queue": { 3323 | "version": "0.1.0", 3324 | "dev": true, 3325 | "license": "MIT", 3326 | "engines": { 3327 | "node": ">=10" 3328 | }, 3329 | "funding": { 3330 | "url": "https://github.com/sponsors/sindresorhus" 3331 | } 3332 | }, 3333 | "node_modules/jest-circus": { 3334 | "version": "29.7.0", 3335 | "dev": true, 3336 | "license": "MIT", 3337 | "dependencies": { 3338 | "@jest/environment": "^29.7.0", 3339 | "@jest/expect": "^29.7.0", 3340 | "@jest/test-result": "^29.7.0", 3341 | "@jest/types": "^29.6.3", 3342 | "@types/node": "*", 3343 | "chalk": "^4.0.0", 3344 | "co": "^4.6.0", 3345 | "dedent": "^1.0.0", 3346 | "is-generator-fn": "^2.0.0", 3347 | "jest-each": "^29.7.0", 3348 | "jest-matcher-utils": "^29.7.0", 3349 | "jest-message-util": "^29.7.0", 3350 | "jest-runtime": "^29.7.0", 3351 | "jest-snapshot": "^29.7.0", 3352 | "jest-util": "^29.7.0", 3353 | "p-limit": "^3.1.0", 3354 | "pretty-format": "^29.7.0", 3355 | "pure-rand": "^6.0.0", 3356 | "slash": "^3.0.0", 3357 | "stack-utils": "^2.0.3" 3358 | }, 3359 | "engines": { 3360 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 3361 | } 3362 | }, 3363 | "node_modules/jest-circus/node_modules/p-limit": { 3364 | "version": "3.1.0", 3365 | "dev": true, 3366 | "license": "MIT", 3367 | "dependencies": { 3368 | "yocto-queue": "^0.1.0" 3369 | }, 3370 | "engines": { 3371 | "node": ">=10" 3372 | }, 3373 | "funding": { 3374 | "url": "https://github.com/sponsors/sindresorhus" 3375 | } 3376 | }, 3377 | "node_modules/jest-circus/node_modules/yocto-queue": { 3378 | "version": "0.1.0", 3379 | "dev": true, 3380 | "license": "MIT", 3381 | "engines": { 3382 | "node": ">=10" 3383 | }, 3384 | "funding": { 3385 | "url": "https://github.com/sponsors/sindresorhus" 3386 | } 3387 | }, 3388 | "node_modules/jest-cli": { 3389 | "version": "29.7.0", 3390 | "dev": true, 3391 | "license": "MIT", 3392 | "dependencies": { 3393 | "@jest/core": "^29.7.0", 3394 | "@jest/test-result": "^29.7.0", 3395 | "@jest/types": "^29.6.3", 3396 | "chalk": "^4.0.0", 3397 | "create-jest": "^29.7.0", 3398 | "exit": "^0.1.2", 3399 | "import-local": "^3.0.2", 3400 | "jest-config": "^29.7.0", 3401 | "jest-util": "^29.7.0", 3402 | "jest-validate": "^29.7.0", 3403 | "yargs": "^17.3.1" 3404 | }, 3405 | "bin": { 3406 | "jest": "bin/jest.js" 3407 | }, 3408 | "engines": { 3409 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 3410 | }, 3411 | "peerDependencies": { 3412 | "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" 3413 | }, 3414 | "peerDependenciesMeta": { 3415 | "node-notifier": { 3416 | "optional": true 3417 | } 3418 | } 3419 | }, 3420 | "node_modules/jest-config": { 3421 | "version": "29.7.0", 3422 | "dev": true, 3423 | "license": "MIT", 3424 | "dependencies": { 3425 | "@babel/core": "^7.11.6", 3426 | "@jest/test-sequencer": "^29.7.0", 3427 | "@jest/types": "^29.6.3", 3428 | "babel-jest": "^29.7.0", 3429 | "chalk": "^4.0.0", 3430 | "ci-info": "^3.2.0", 3431 | "deepmerge": "^4.2.2", 3432 | "glob": "^7.1.3", 3433 | "graceful-fs": "^4.2.9", 3434 | "jest-circus": "^29.7.0", 3435 | "jest-environment-node": "^29.7.0", 3436 | "jest-get-type": "^29.6.3", 3437 | "jest-regex-util": "^29.6.3", 3438 | "jest-resolve": "^29.7.0", 3439 | "jest-runner": "^29.7.0", 3440 | "jest-util": "^29.7.0", 3441 | "jest-validate": "^29.7.0", 3442 | "micromatch": "^4.0.4", 3443 | "parse-json": "^5.2.0", 3444 | "pretty-format": "^29.7.0", 3445 | "slash": "^3.0.0", 3446 | "strip-json-comments": "^3.1.1" 3447 | }, 3448 | "engines": { 3449 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 3450 | }, 3451 | "peerDependencies": { 3452 | "@types/node": "*", 3453 | "ts-node": ">=9.0.0" 3454 | }, 3455 | "peerDependenciesMeta": { 3456 | "@types/node": { 3457 | "optional": true 3458 | }, 3459 | "ts-node": { 3460 | "optional": true 3461 | } 3462 | } 3463 | }, 3464 | "node_modules/jest-diff": { 3465 | "version": "29.7.0", 3466 | "dev": true, 3467 | "license": "MIT", 3468 | "dependencies": { 3469 | "chalk": "^4.0.0", 3470 | "diff-sequences": "^29.6.3", 3471 | "jest-get-type": "^29.6.3", 3472 | "pretty-format": "^29.7.0" 3473 | }, 3474 | "engines": { 3475 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 3476 | } 3477 | }, 3478 | "node_modules/jest-docblock": { 3479 | "version": "29.7.0", 3480 | "dev": true, 3481 | "license": "MIT", 3482 | "dependencies": { 3483 | "detect-newline": "^3.0.0" 3484 | }, 3485 | "engines": { 3486 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 3487 | } 3488 | }, 3489 | "node_modules/jest-each": { 3490 | "version": "29.7.0", 3491 | "dev": true, 3492 | "license": "MIT", 3493 | "dependencies": { 3494 | "@jest/types": "^29.6.3", 3495 | "chalk": "^4.0.0", 3496 | "jest-get-type": "^29.6.3", 3497 | "jest-util": "^29.7.0", 3498 | "pretty-format": "^29.7.0" 3499 | }, 3500 | "engines": { 3501 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 3502 | } 3503 | }, 3504 | "node_modules/jest-environment-node": { 3505 | "version": "29.7.0", 3506 | "dev": true, 3507 | "license": "MIT", 3508 | "dependencies": { 3509 | "@jest/environment": "^29.7.0", 3510 | "@jest/fake-timers": "^29.7.0", 3511 | "@jest/types": "^29.6.3", 3512 | "@types/node": "*", 3513 | "jest-mock": "^29.7.0", 3514 | "jest-util": "^29.7.0" 3515 | }, 3516 | "engines": { 3517 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 3518 | } 3519 | }, 3520 | "node_modules/jest-get-type": { 3521 | "version": "29.6.3", 3522 | "dev": true, 3523 | "license": "MIT", 3524 | "engines": { 3525 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 3526 | } 3527 | }, 3528 | "node_modules/jest-haste-map": { 3529 | "version": "29.7.0", 3530 | "dev": true, 3531 | "license": "MIT", 3532 | "dependencies": { 3533 | "@jest/types": "^29.6.3", 3534 | "@types/graceful-fs": "^4.1.3", 3535 | "@types/node": "*", 3536 | "anymatch": "^3.0.3", 3537 | "fb-watchman": "^2.0.0", 3538 | "graceful-fs": "^4.2.9", 3539 | "jest-regex-util": "^29.6.3", 3540 | "jest-util": "^29.7.0", 3541 | "jest-worker": "^29.7.0", 3542 | "micromatch": "^4.0.4", 3543 | "walker": "^1.0.8" 3544 | }, 3545 | "engines": { 3546 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 3547 | }, 3548 | "optionalDependencies": { 3549 | "fsevents": "^2.3.2" 3550 | } 3551 | }, 3552 | "node_modules/jest-leak-detector": { 3553 | "version": "29.7.0", 3554 | "dev": true, 3555 | "license": "MIT", 3556 | "dependencies": { 3557 | "jest-get-type": "^29.6.3", 3558 | "pretty-format": "^29.7.0" 3559 | }, 3560 | "engines": { 3561 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 3562 | } 3563 | }, 3564 | "node_modules/jest-matcher-utils": { 3565 | "version": "29.7.0", 3566 | "dev": true, 3567 | "license": "MIT", 3568 | "dependencies": { 3569 | "chalk": "^4.0.0", 3570 | "jest-diff": "^29.7.0", 3571 | "jest-get-type": "^29.6.3", 3572 | "pretty-format": "^29.7.0" 3573 | }, 3574 | "engines": { 3575 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 3576 | } 3577 | }, 3578 | "node_modules/jest-message-util": { 3579 | "version": "29.7.0", 3580 | "dev": true, 3581 | "license": "MIT", 3582 | "dependencies": { 3583 | "@babel/code-frame": "^7.12.13", 3584 | "@jest/types": "^29.6.3", 3585 | "@types/stack-utils": "^2.0.0", 3586 | "chalk": "^4.0.0", 3587 | "graceful-fs": "^4.2.9", 3588 | "micromatch": "^4.0.4", 3589 | "pretty-format": "^29.7.0", 3590 | "slash": "^3.0.0", 3591 | "stack-utils": "^2.0.3" 3592 | }, 3593 | "engines": { 3594 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 3595 | } 3596 | }, 3597 | "node_modules/jest-mock": { 3598 | "version": "29.7.0", 3599 | "dev": true, 3600 | "license": "MIT", 3601 | "dependencies": { 3602 | "@jest/types": "^29.6.3", 3603 | "@types/node": "*", 3604 | "jest-util": "^29.7.0" 3605 | }, 3606 | "engines": { 3607 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 3608 | } 3609 | }, 3610 | "node_modules/jest-pnp-resolver": { 3611 | "version": "1.2.3", 3612 | "dev": true, 3613 | "license": "MIT", 3614 | "engines": { 3615 | "node": ">=6" 3616 | }, 3617 | "peerDependencies": { 3618 | "jest-resolve": "*" 3619 | }, 3620 | "peerDependenciesMeta": { 3621 | "jest-resolve": { 3622 | "optional": true 3623 | } 3624 | } 3625 | }, 3626 | "node_modules/jest-regex-util": { 3627 | "version": "29.6.3", 3628 | "dev": true, 3629 | "license": "MIT", 3630 | "engines": { 3631 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 3632 | } 3633 | }, 3634 | "node_modules/jest-resolve": { 3635 | "version": "29.7.0", 3636 | "dev": true, 3637 | "license": "MIT", 3638 | "dependencies": { 3639 | "chalk": "^4.0.0", 3640 | "graceful-fs": "^4.2.9", 3641 | "jest-haste-map": "^29.7.0", 3642 | "jest-pnp-resolver": "^1.2.2", 3643 | "jest-util": "^29.7.0", 3644 | "jest-validate": "^29.7.0", 3645 | "resolve": "^1.20.0", 3646 | "resolve.exports": "^2.0.0", 3647 | "slash": "^3.0.0" 3648 | }, 3649 | "engines": { 3650 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 3651 | } 3652 | }, 3653 | "node_modules/jest-resolve-dependencies": { 3654 | "version": "29.7.0", 3655 | "dev": true, 3656 | "license": "MIT", 3657 | "dependencies": { 3658 | "jest-regex-util": "^29.6.3", 3659 | "jest-snapshot": "^29.7.0" 3660 | }, 3661 | "engines": { 3662 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 3663 | } 3664 | }, 3665 | "node_modules/jest-runner": { 3666 | "version": "29.7.0", 3667 | "dev": true, 3668 | "license": "MIT", 3669 | "dependencies": { 3670 | "@jest/console": "^29.7.0", 3671 | "@jest/environment": "^29.7.0", 3672 | "@jest/test-result": "^29.7.0", 3673 | "@jest/transform": "^29.7.0", 3674 | "@jest/types": "^29.6.3", 3675 | "@types/node": "*", 3676 | "chalk": "^4.0.0", 3677 | "emittery": "^0.13.1", 3678 | "graceful-fs": "^4.2.9", 3679 | "jest-docblock": "^29.7.0", 3680 | "jest-environment-node": "^29.7.0", 3681 | "jest-haste-map": "^29.7.0", 3682 | "jest-leak-detector": "^29.7.0", 3683 | "jest-message-util": "^29.7.0", 3684 | "jest-resolve": "^29.7.0", 3685 | "jest-runtime": "^29.7.0", 3686 | "jest-util": "^29.7.0", 3687 | "jest-watcher": "^29.7.0", 3688 | "jest-worker": "^29.7.0", 3689 | "p-limit": "^3.1.0", 3690 | "source-map-support": "0.5.13" 3691 | }, 3692 | "engines": { 3693 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 3694 | } 3695 | }, 3696 | "node_modules/jest-runner/node_modules/p-limit": { 3697 | "version": "3.1.0", 3698 | "dev": true, 3699 | "license": "MIT", 3700 | "dependencies": { 3701 | "yocto-queue": "^0.1.0" 3702 | }, 3703 | "engines": { 3704 | "node": ">=10" 3705 | }, 3706 | "funding": { 3707 | "url": "https://github.com/sponsors/sindresorhus" 3708 | } 3709 | }, 3710 | "node_modules/jest-runner/node_modules/yocto-queue": { 3711 | "version": "0.1.0", 3712 | "dev": true, 3713 | "license": "MIT", 3714 | "engines": { 3715 | "node": ">=10" 3716 | }, 3717 | "funding": { 3718 | "url": "https://github.com/sponsors/sindresorhus" 3719 | } 3720 | }, 3721 | "node_modules/jest-runtime": { 3722 | "version": "29.7.0", 3723 | "dev": true, 3724 | "license": "MIT", 3725 | "dependencies": { 3726 | "@jest/environment": "^29.7.0", 3727 | "@jest/fake-timers": "^29.7.0", 3728 | "@jest/globals": "^29.7.0", 3729 | "@jest/source-map": "^29.6.3", 3730 | "@jest/test-result": "^29.7.0", 3731 | "@jest/transform": "^29.7.0", 3732 | "@jest/types": "^29.6.3", 3733 | "@types/node": "*", 3734 | "chalk": "^4.0.0", 3735 | "cjs-module-lexer": "^1.0.0", 3736 | "collect-v8-coverage": "^1.0.0", 3737 | "glob": "^7.1.3", 3738 | "graceful-fs": "^4.2.9", 3739 | "jest-haste-map": "^29.7.0", 3740 | "jest-message-util": "^29.7.0", 3741 | "jest-mock": "^29.7.0", 3742 | "jest-regex-util": "^29.6.3", 3743 | "jest-resolve": "^29.7.0", 3744 | "jest-snapshot": "^29.7.0", 3745 | "jest-util": "^29.7.0", 3746 | "slash": "^3.0.0", 3747 | "strip-bom": "^4.0.0" 3748 | }, 3749 | "engines": { 3750 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 3751 | } 3752 | }, 3753 | "node_modules/jest-runtime/node_modules/strip-bom": { 3754 | "version": "4.0.0", 3755 | "dev": true, 3756 | "license": "MIT", 3757 | "engines": { 3758 | "node": ">=8" 3759 | } 3760 | }, 3761 | "node_modules/jest-snapshot": { 3762 | "version": "29.7.0", 3763 | "dev": true, 3764 | "license": "MIT", 3765 | "dependencies": { 3766 | "@babel/core": "^7.11.6", 3767 | "@babel/generator": "^7.7.2", 3768 | "@babel/plugin-syntax-jsx": "^7.7.2", 3769 | "@babel/plugin-syntax-typescript": "^7.7.2", 3770 | "@babel/types": "^7.3.3", 3771 | "@jest/expect-utils": "^29.7.0", 3772 | "@jest/transform": "^29.7.0", 3773 | "@jest/types": "^29.6.3", 3774 | "babel-preset-current-node-syntax": "^1.0.0", 3775 | "chalk": "^4.0.0", 3776 | "expect": "^29.7.0", 3777 | "graceful-fs": "^4.2.9", 3778 | "jest-diff": "^29.7.0", 3779 | "jest-get-type": "^29.6.3", 3780 | "jest-matcher-utils": "^29.7.0", 3781 | "jest-message-util": "^29.7.0", 3782 | "jest-util": "^29.7.0", 3783 | "natural-compare": "^1.4.0", 3784 | "pretty-format": "^29.7.0", 3785 | "semver": "^7.5.3" 3786 | }, 3787 | "engines": { 3788 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 3789 | } 3790 | }, 3791 | "node_modules/jest-snapshot/node_modules/semver": { 3792 | "version": "7.5.4", 3793 | "dev": true, 3794 | "license": "ISC", 3795 | "dependencies": { 3796 | "lru-cache": "^6.0.0" 3797 | }, 3798 | "bin": { 3799 | "semver": "bin/semver.js" 3800 | }, 3801 | "engines": { 3802 | "node": ">=10" 3803 | } 3804 | }, 3805 | "node_modules/jest-util": { 3806 | "version": "29.7.0", 3807 | "dev": true, 3808 | "license": "MIT", 3809 | "dependencies": { 3810 | "@jest/types": "^29.6.3", 3811 | "@types/node": "*", 3812 | "chalk": "^4.0.0", 3813 | "ci-info": "^3.2.0", 3814 | "graceful-fs": "^4.2.9", 3815 | "picomatch": "^2.2.3" 3816 | }, 3817 | "engines": { 3818 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 3819 | } 3820 | }, 3821 | "node_modules/jest-validate": { 3822 | "version": "29.7.0", 3823 | "dev": true, 3824 | "license": "MIT", 3825 | "dependencies": { 3826 | "@jest/types": "^29.6.3", 3827 | "camelcase": "^6.2.0", 3828 | "chalk": "^4.0.0", 3829 | "jest-get-type": "^29.6.3", 3830 | "leven": "^3.1.0", 3831 | "pretty-format": "^29.7.0" 3832 | }, 3833 | "engines": { 3834 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 3835 | } 3836 | }, 3837 | "node_modules/jest-validate/node_modules/camelcase": { 3838 | "version": "6.3.0", 3839 | "dev": true, 3840 | "license": "MIT", 3841 | "engines": { 3842 | "node": ">=10" 3843 | }, 3844 | "funding": { 3845 | "url": "https://github.com/sponsors/sindresorhus" 3846 | } 3847 | }, 3848 | "node_modules/jest-watcher": { 3849 | "version": "29.7.0", 3850 | "dev": true, 3851 | "license": "MIT", 3852 | "dependencies": { 3853 | "@jest/test-result": "^29.7.0", 3854 | "@jest/types": "^29.6.3", 3855 | "@types/node": "*", 3856 | "ansi-escapes": "^4.2.1", 3857 | "chalk": "^4.0.0", 3858 | "emittery": "^0.13.1", 3859 | "jest-util": "^29.7.0", 3860 | "string-length": "^4.0.1" 3861 | }, 3862 | "engines": { 3863 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 3864 | } 3865 | }, 3866 | "node_modules/jest-worker": { 3867 | "version": "29.7.0", 3868 | "dev": true, 3869 | "license": "MIT", 3870 | "dependencies": { 3871 | "@types/node": "*", 3872 | "jest-util": "^29.7.0", 3873 | "merge-stream": "^2.0.0", 3874 | "supports-color": "^8.0.0" 3875 | }, 3876 | "engines": { 3877 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 3878 | } 3879 | }, 3880 | "node_modules/jest-worker/node_modules/supports-color": { 3881 | "version": "8.1.1", 3882 | "dev": true, 3883 | "license": "MIT", 3884 | "dependencies": { 3885 | "has-flag": "^4.0.0" 3886 | }, 3887 | "engines": { 3888 | "node": ">=10" 3889 | }, 3890 | "funding": { 3891 | "url": "https://github.com/chalk/supports-color?sponsor=1" 3892 | } 3893 | }, 3894 | "node_modules/js-tokens": { 3895 | "version": "4.0.0", 3896 | "dev": true, 3897 | "license": "MIT" 3898 | }, 3899 | "node_modules/js-yaml": { 3900 | "version": "3.14.1", 3901 | "dev": true, 3902 | "license": "MIT", 3903 | "dependencies": { 3904 | "argparse": "^1.0.7", 3905 | "esprima": "^4.0.0" 3906 | }, 3907 | "bin": { 3908 | "js-yaml": "bin/js-yaml.js" 3909 | } 3910 | }, 3911 | "node_modules/jsesc": { 3912 | "version": "2.5.2", 3913 | "dev": true, 3914 | "license": "MIT", 3915 | "bin": { 3916 | "jsesc": "bin/jsesc" 3917 | }, 3918 | "engines": { 3919 | "node": ">=4" 3920 | } 3921 | }, 3922 | "node_modules/json-bigint": { 3923 | "version": "1.0.0", 3924 | "dev": true, 3925 | "license": "MIT", 3926 | "dependencies": { 3927 | "bignumber.js": "^9.0.0" 3928 | } 3929 | }, 3930 | "node_modules/json-buffer": { 3931 | "version": "3.0.1", 3932 | "dev": true, 3933 | "license": "MIT" 3934 | }, 3935 | "node_modules/json-parse-even-better-errors": { 3936 | "version": "2.3.1", 3937 | "dev": true, 3938 | "license": "MIT" 3939 | }, 3940 | "node_modules/json5": { 3941 | "version": "2.2.3", 3942 | "dev": true, 3943 | "license": "MIT", 3944 | "bin": { 3945 | "json5": "lib/cli.js" 3946 | }, 3947 | "engines": { 3948 | "node": ">=6" 3949 | } 3950 | }, 3951 | "node_modules/jsonfile": { 3952 | "version": "6.1.0", 3953 | "dev": true, 3954 | "license": "MIT", 3955 | "dependencies": { 3956 | "universalify": "^2.0.0" 3957 | }, 3958 | "optionalDependencies": { 3959 | "graceful-fs": "^4.1.6" 3960 | } 3961 | }, 3962 | "node_modules/jwa": { 3963 | "version": "2.0.0", 3964 | "dev": true, 3965 | "license": "MIT", 3966 | "dependencies": { 3967 | "buffer-equal-constant-time": "1.0.1", 3968 | "ecdsa-sig-formatter": "1.0.11", 3969 | "safe-buffer": "^5.0.1" 3970 | } 3971 | }, 3972 | "node_modules/jws": { 3973 | "version": "4.0.0", 3974 | "dev": true, 3975 | "license": "MIT", 3976 | "dependencies": { 3977 | "jwa": "^2.0.0", 3978 | "safe-buffer": "^5.0.1" 3979 | } 3980 | }, 3981 | "node_modules/keyv": { 3982 | "version": "4.5.4", 3983 | "dev": true, 3984 | "license": "MIT", 3985 | "dependencies": { 3986 | "json-buffer": "3.0.1" 3987 | } 3988 | }, 3989 | "node_modules/kleur": { 3990 | "version": "3.0.3", 3991 | "dev": true, 3992 | "license": "MIT", 3993 | "engines": { 3994 | "node": ">=6" 3995 | } 3996 | }, 3997 | "node_modules/leven": { 3998 | "version": "3.1.0", 3999 | "dev": true, 4000 | "license": "MIT", 4001 | "engines": { 4002 | "node": ">=6" 4003 | } 4004 | }, 4005 | "node_modules/lines-and-columns": { 4006 | "version": "1.2.4", 4007 | "dev": true, 4008 | "license": "MIT" 4009 | }, 4010 | "node_modules/locate-path": { 4011 | "version": "7.2.0", 4012 | "dev": true, 4013 | "license": "MIT", 4014 | "dependencies": { 4015 | "p-locate": "^6.0.0" 4016 | }, 4017 | "engines": { 4018 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 4019 | }, 4020 | "funding": { 4021 | "url": "https://github.com/sponsors/sindresorhus" 4022 | } 4023 | }, 4024 | "node_modules/lodash": { 4025 | "version": "4.17.21", 4026 | "dev": true, 4027 | "license": "MIT" 4028 | }, 4029 | "node_modules/log-symbols": { 4030 | "version": "5.1.0", 4031 | "dev": true, 4032 | "license": "MIT", 4033 | "dependencies": { 4034 | "chalk": "^5.0.0", 4035 | "is-unicode-supported": "^1.1.0" 4036 | }, 4037 | "engines": { 4038 | "node": ">=12" 4039 | }, 4040 | "funding": { 4041 | "url": "https://github.com/sponsors/sindresorhus" 4042 | } 4043 | }, 4044 | "node_modules/log-symbols/node_modules/chalk": { 4045 | "version": "5.3.0", 4046 | "dev": true, 4047 | "license": "MIT", 4048 | "engines": { 4049 | "node": "^12.17.0 || ^14.13 || >=16.0.0" 4050 | }, 4051 | "funding": { 4052 | "url": "https://github.com/chalk/chalk?sponsor=1" 4053 | } 4054 | }, 4055 | "node_modules/loud-rejection": { 4056 | "version": "2.2.0", 4057 | "dev": true, 4058 | "license": "MIT", 4059 | "dependencies": { 4060 | "currently-unhandled": "^0.4.1", 4061 | "signal-exit": "^3.0.2" 4062 | }, 4063 | "engines": { 4064 | "node": ">=8" 4065 | } 4066 | }, 4067 | "node_modules/lowercase-keys": { 4068 | "version": "2.0.0", 4069 | "dev": true, 4070 | "license": "MIT", 4071 | "engines": { 4072 | "node": ">=8" 4073 | } 4074 | }, 4075 | "node_modules/lru-cache": { 4076 | "version": "6.0.0", 4077 | "dev": true, 4078 | "license": "ISC", 4079 | "dependencies": { 4080 | "yallist": "^4.0.0" 4081 | }, 4082 | "engines": { 4083 | "node": ">=10" 4084 | } 4085 | }, 4086 | "node_modules/make-dir": { 4087 | "version": "3.1.0", 4088 | "dev": true, 4089 | "license": "MIT", 4090 | "dependencies": { 4091 | "semver": "^6.0.0" 4092 | }, 4093 | "engines": { 4094 | "node": ">=8" 4095 | }, 4096 | "funding": { 4097 | "url": "https://github.com/sponsors/sindresorhus" 4098 | } 4099 | }, 4100 | "node_modules/makeerror": { 4101 | "version": "1.0.12", 4102 | "dev": true, 4103 | "license": "BSD-3-Clause", 4104 | "dependencies": { 4105 | "tmpl": "1.0.5" 4106 | } 4107 | }, 4108 | "node_modules/merge-stream": { 4109 | "version": "2.0.0", 4110 | "dev": true, 4111 | "license": "MIT" 4112 | }, 4113 | "node_modules/micromatch": { 4114 | "version": "4.0.5", 4115 | "dev": true, 4116 | "license": "MIT", 4117 | "dependencies": { 4118 | "braces": "^3.0.2", 4119 | "picomatch": "^2.3.1" 4120 | }, 4121 | "engines": { 4122 | "node": ">=8.6" 4123 | } 4124 | }, 4125 | "node_modules/mimic-fn": { 4126 | "version": "2.1.0", 4127 | "dev": true, 4128 | "license": "MIT", 4129 | "engines": { 4130 | "node": ">=6" 4131 | } 4132 | }, 4133 | "node_modules/mimic-response": { 4134 | "version": "1.0.1", 4135 | "dev": true, 4136 | "license": "MIT", 4137 | "engines": { 4138 | "node": ">=4" 4139 | } 4140 | }, 4141 | "node_modules/minimatch": { 4142 | "version": "3.1.2", 4143 | "dev": true, 4144 | "license": "ISC", 4145 | "dependencies": { 4146 | "brace-expansion": "^1.1.7" 4147 | }, 4148 | "engines": { 4149 | "node": "*" 4150 | } 4151 | }, 4152 | "node_modules/ms": { 4153 | "version": "2.1.2", 4154 | "dev": true, 4155 | "license": "MIT" 4156 | }, 4157 | "node_modules/multimatch": { 4158 | "version": "5.0.0", 4159 | "dev": true, 4160 | "license": "MIT", 4161 | "dependencies": { 4162 | "@types/minimatch": "^3.0.3", 4163 | "array-differ": "^3.0.0", 4164 | "array-union": "^2.1.0", 4165 | "arrify": "^2.0.1", 4166 | "minimatch": "^3.0.4" 4167 | }, 4168 | "engines": { 4169 | "node": ">=10" 4170 | }, 4171 | "funding": { 4172 | "url": "https://github.com/sponsors/sindresorhus" 4173 | } 4174 | }, 4175 | "node_modules/mute-stream": { 4176 | "version": "0.0.8", 4177 | "dev": true, 4178 | "license": "ISC" 4179 | }, 4180 | "node_modules/natural-compare": { 4181 | "version": "1.4.0", 4182 | "dev": true, 4183 | "license": "MIT" 4184 | }, 4185 | "node_modules/node-fetch": { 4186 | "version": "2.7.0", 4187 | "dev": true, 4188 | "license": "MIT", 4189 | "dependencies": { 4190 | "whatwg-url": "^5.0.0" 4191 | }, 4192 | "engines": { 4193 | "node": "4.x || >=6.0.0" 4194 | }, 4195 | "peerDependencies": { 4196 | "encoding": "^0.1.0" 4197 | }, 4198 | "peerDependenciesMeta": { 4199 | "encoding": { 4200 | "optional": true 4201 | } 4202 | } 4203 | }, 4204 | "node_modules/node-forge": { 4205 | "version": "1.3.1", 4206 | "dev": true, 4207 | "license": "(BSD-3-Clause OR GPL-2.0)", 4208 | "engines": { 4209 | "node": ">= 6.13.0" 4210 | } 4211 | }, 4212 | "node_modules/node-int64": { 4213 | "version": "0.4.0", 4214 | "dev": true, 4215 | "license": "MIT" 4216 | }, 4217 | "node_modules/node-releases": { 4218 | "version": "2.0.13", 4219 | "dev": true, 4220 | "license": "MIT" 4221 | }, 4222 | "node_modules/normalize-newline": { 4223 | "version": "4.1.0", 4224 | "dev": true, 4225 | "license": "MIT", 4226 | "dependencies": { 4227 | "replace-buffer": "^1.2.1" 4228 | }, 4229 | "engines": { 4230 | "node": ">=12" 4231 | }, 4232 | "funding": { 4233 | "url": "https://github.com/sponsors/sindresorhus" 4234 | } 4235 | }, 4236 | "node_modules/normalize-package-data": { 4237 | "version": "3.0.3", 4238 | "dev": true, 4239 | "license": "BSD-2-Clause", 4240 | "dependencies": { 4241 | "hosted-git-info": "^4.0.1", 4242 | "is-core-module": "^2.5.0", 4243 | "semver": "^7.3.4", 4244 | "validate-npm-package-license": "^3.0.1" 4245 | }, 4246 | "engines": { 4247 | "node": ">=10" 4248 | } 4249 | }, 4250 | "node_modules/normalize-package-data/node_modules/semver": { 4251 | "version": "7.5.4", 4252 | "dev": true, 4253 | "license": "ISC", 4254 | "dependencies": { 4255 | "lru-cache": "^6.0.0" 4256 | }, 4257 | "bin": { 4258 | "semver": "bin/semver.js" 4259 | }, 4260 | "engines": { 4261 | "node": ">=10" 4262 | } 4263 | }, 4264 | "node_modules/normalize-path": { 4265 | "version": "3.0.0", 4266 | "dev": true, 4267 | "license": "MIT", 4268 | "engines": { 4269 | "node": ">=0.10.0" 4270 | } 4271 | }, 4272 | "node_modules/normalize-url": { 4273 | "version": "6.1.0", 4274 | "dev": true, 4275 | "license": "MIT", 4276 | "engines": { 4277 | "node": ">=10" 4278 | }, 4279 | "funding": { 4280 | "url": "https://github.com/sponsors/sindresorhus" 4281 | } 4282 | }, 4283 | "node_modules/npm-run-path": { 4284 | "version": "4.0.1", 4285 | "dev": true, 4286 | "license": "MIT", 4287 | "dependencies": { 4288 | "path-key": "^3.0.0" 4289 | }, 4290 | "engines": { 4291 | "node": ">=8" 4292 | } 4293 | }, 4294 | "node_modules/object-inspect": { 4295 | "version": "1.13.1", 4296 | "dev": true, 4297 | "license": "MIT", 4298 | "funding": { 4299 | "url": "https://github.com/sponsors/ljharb" 4300 | } 4301 | }, 4302 | "node_modules/once": { 4303 | "version": "1.4.0", 4304 | "dev": true, 4305 | "license": "ISC", 4306 | "dependencies": { 4307 | "wrappy": "1" 4308 | } 4309 | }, 4310 | "node_modules/onetime": { 4311 | "version": "5.1.2", 4312 | "dev": true, 4313 | "license": "MIT", 4314 | "dependencies": { 4315 | "mimic-fn": "^2.1.0" 4316 | }, 4317 | "engines": { 4318 | "node": ">=6" 4319 | }, 4320 | "funding": { 4321 | "url": "https://github.com/sponsors/sindresorhus" 4322 | } 4323 | }, 4324 | "node_modules/open": { 4325 | "version": "8.4.2", 4326 | "dev": true, 4327 | "license": "MIT", 4328 | "dependencies": { 4329 | "define-lazy-prop": "^2.0.0", 4330 | "is-docker": "^2.1.1", 4331 | "is-wsl": "^2.2.0" 4332 | }, 4333 | "engines": { 4334 | "node": ">=12" 4335 | }, 4336 | "funding": { 4337 | "url": "https://github.com/sponsors/sindresorhus" 4338 | } 4339 | }, 4340 | "node_modules/ora": { 4341 | "version": "6.3.1", 4342 | "dev": true, 4343 | "license": "MIT", 4344 | "dependencies": { 4345 | "chalk": "^5.0.0", 4346 | "cli-cursor": "^4.0.0", 4347 | "cli-spinners": "^2.6.1", 4348 | "is-interactive": "^2.0.0", 4349 | "is-unicode-supported": "^1.1.0", 4350 | "log-symbols": "^5.1.0", 4351 | "stdin-discarder": "^0.1.0", 4352 | "strip-ansi": "^7.0.1", 4353 | "wcwidth": "^1.0.1" 4354 | }, 4355 | "engines": { 4356 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 4357 | }, 4358 | "funding": { 4359 | "url": "https://github.com/sponsors/sindresorhus" 4360 | } 4361 | }, 4362 | "node_modules/ora/node_modules/ansi-regex": { 4363 | "version": "6.0.1", 4364 | "dev": true, 4365 | "license": "MIT", 4366 | "engines": { 4367 | "node": ">=12" 4368 | }, 4369 | "funding": { 4370 | "url": "https://github.com/chalk/ansi-regex?sponsor=1" 4371 | } 4372 | }, 4373 | "node_modules/ora/node_modules/chalk": { 4374 | "version": "5.3.0", 4375 | "dev": true, 4376 | "license": "MIT", 4377 | "engines": { 4378 | "node": "^12.17.0 || ^14.13 || >=16.0.0" 4379 | }, 4380 | "funding": { 4381 | "url": "https://github.com/chalk/chalk?sponsor=1" 4382 | } 4383 | }, 4384 | "node_modules/ora/node_modules/cli-cursor": { 4385 | "version": "4.0.0", 4386 | "dev": true, 4387 | "license": "MIT", 4388 | "dependencies": { 4389 | "restore-cursor": "^4.0.0" 4390 | }, 4391 | "engines": { 4392 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 4393 | }, 4394 | "funding": { 4395 | "url": "https://github.com/sponsors/sindresorhus" 4396 | } 4397 | }, 4398 | "node_modules/ora/node_modules/restore-cursor": { 4399 | "version": "4.0.0", 4400 | "dev": true, 4401 | "license": "MIT", 4402 | "dependencies": { 4403 | "onetime": "^5.1.0", 4404 | "signal-exit": "^3.0.2" 4405 | }, 4406 | "engines": { 4407 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 4408 | }, 4409 | "funding": { 4410 | "url": "https://github.com/sponsors/sindresorhus" 4411 | } 4412 | }, 4413 | "node_modules/ora/node_modules/strip-ansi": { 4414 | "version": "7.1.0", 4415 | "dev": true, 4416 | "license": "MIT", 4417 | "dependencies": { 4418 | "ansi-regex": "^6.0.1" 4419 | }, 4420 | "engines": { 4421 | "node": ">=12" 4422 | }, 4423 | "funding": { 4424 | "url": "https://github.com/chalk/strip-ansi?sponsor=1" 4425 | } 4426 | }, 4427 | "node_modules/os-tmpdir": { 4428 | "version": "1.0.2", 4429 | "dev": true, 4430 | "license": "MIT", 4431 | "engines": { 4432 | "node": ">=0.10.0" 4433 | } 4434 | }, 4435 | "node_modules/p-any": { 4436 | "version": "3.0.0", 4437 | "dev": true, 4438 | "license": "MIT", 4439 | "dependencies": { 4440 | "p-cancelable": "^2.0.0", 4441 | "p-some": "^5.0.0" 4442 | }, 4443 | "engines": { 4444 | "node": ">=10" 4445 | }, 4446 | "funding": { 4447 | "url": "https://github.com/sponsors/sindresorhus" 4448 | } 4449 | }, 4450 | "node_modules/p-cancelable": { 4451 | "version": "2.1.1", 4452 | "dev": true, 4453 | "license": "MIT", 4454 | "engines": { 4455 | "node": ">=8" 4456 | } 4457 | }, 4458 | "node_modules/p-finally": { 4459 | "version": "1.0.0", 4460 | "dev": true, 4461 | "license": "MIT", 4462 | "engines": { 4463 | "node": ">=4" 4464 | } 4465 | }, 4466 | "node_modules/p-limit": { 4467 | "version": "4.0.0", 4468 | "dev": true, 4469 | "license": "MIT", 4470 | "dependencies": { 4471 | "yocto-queue": "^1.0.0" 4472 | }, 4473 | "engines": { 4474 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 4475 | }, 4476 | "funding": { 4477 | "url": "https://github.com/sponsors/sindresorhus" 4478 | } 4479 | }, 4480 | "node_modules/p-locate": { 4481 | "version": "6.0.0", 4482 | "dev": true, 4483 | "license": "MIT", 4484 | "dependencies": { 4485 | "p-limit": "^4.0.0" 4486 | }, 4487 | "engines": { 4488 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 4489 | }, 4490 | "funding": { 4491 | "url": "https://github.com/sponsors/sindresorhus" 4492 | } 4493 | }, 4494 | "node_modules/p-map": { 4495 | "version": "5.5.0", 4496 | "dev": true, 4497 | "license": "MIT", 4498 | "dependencies": { 4499 | "aggregate-error": "^4.0.0" 4500 | }, 4501 | "engines": { 4502 | "node": ">=12" 4503 | }, 4504 | "funding": { 4505 | "url": "https://github.com/sponsors/sindresorhus" 4506 | } 4507 | }, 4508 | "node_modules/p-some": { 4509 | "version": "5.0.0", 4510 | "dev": true, 4511 | "license": "MIT", 4512 | "dependencies": { 4513 | "aggregate-error": "^3.0.0", 4514 | "p-cancelable": "^2.0.0" 4515 | }, 4516 | "engines": { 4517 | "node": ">=10" 4518 | }, 4519 | "funding": { 4520 | "url": "https://github.com/sponsors/sindresorhus" 4521 | } 4522 | }, 4523 | "node_modules/p-some/node_modules/aggregate-error": { 4524 | "version": "3.1.0", 4525 | "dev": true, 4526 | "license": "MIT", 4527 | "dependencies": { 4528 | "clean-stack": "^2.0.0", 4529 | "indent-string": "^4.0.0" 4530 | }, 4531 | "engines": { 4532 | "node": ">=8" 4533 | } 4534 | }, 4535 | "node_modules/p-some/node_modules/clean-stack": { 4536 | "version": "2.2.0", 4537 | "dev": true, 4538 | "license": "MIT", 4539 | "engines": { 4540 | "node": ">=6" 4541 | } 4542 | }, 4543 | "node_modules/p-some/node_modules/indent-string": { 4544 | "version": "4.0.0", 4545 | "dev": true, 4546 | "license": "MIT", 4547 | "engines": { 4548 | "node": ">=8" 4549 | } 4550 | }, 4551 | "node_modules/p-timeout": { 4552 | "version": "3.2.0", 4553 | "dev": true, 4554 | "license": "MIT", 4555 | "dependencies": { 4556 | "p-finally": "^1.0.0" 4557 | }, 4558 | "engines": { 4559 | "node": ">=8" 4560 | } 4561 | }, 4562 | "node_modules/p-try": { 4563 | "version": "2.2.0", 4564 | "dev": true, 4565 | "license": "MIT", 4566 | "engines": { 4567 | "node": ">=6" 4568 | } 4569 | }, 4570 | "node_modules/parse-json": { 4571 | "version": "5.2.0", 4572 | "dev": true, 4573 | "license": "MIT", 4574 | "dependencies": { 4575 | "@babel/code-frame": "^7.0.0", 4576 | "error-ex": "^1.3.1", 4577 | "json-parse-even-better-errors": "^2.3.0", 4578 | "lines-and-columns": "^1.1.6" 4579 | }, 4580 | "engines": { 4581 | "node": ">=8" 4582 | }, 4583 | "funding": { 4584 | "url": "https://github.com/sponsors/sindresorhus" 4585 | } 4586 | }, 4587 | "node_modules/path-exists": { 4588 | "version": "5.0.0", 4589 | "dev": true, 4590 | "license": "MIT", 4591 | "engines": { 4592 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 4593 | } 4594 | }, 4595 | "node_modules/path-is-absolute": { 4596 | "version": "1.0.1", 4597 | "dev": true, 4598 | "license": "MIT", 4599 | "engines": { 4600 | "node": ">=0.10.0" 4601 | } 4602 | }, 4603 | "node_modules/path-key": { 4604 | "version": "3.1.1", 4605 | "dev": true, 4606 | "license": "MIT", 4607 | "engines": { 4608 | "node": ">=8" 4609 | } 4610 | }, 4611 | "node_modules/path-parse": { 4612 | "version": "1.0.7", 4613 | "dev": true, 4614 | "license": "MIT" 4615 | }, 4616 | "node_modules/picocolors": { 4617 | "version": "1.0.0", 4618 | "dev": true, 4619 | "license": "ISC" 4620 | }, 4621 | "node_modules/picomatch": { 4622 | "version": "2.3.1", 4623 | "dev": true, 4624 | "license": "MIT", 4625 | "engines": { 4626 | "node": ">=8.6" 4627 | }, 4628 | "funding": { 4629 | "url": "https://github.com/sponsors/jonschlinkert" 4630 | } 4631 | }, 4632 | "node_modules/pirates": { 4633 | "version": "4.0.6", 4634 | "dev": true, 4635 | "license": "MIT", 4636 | "engines": { 4637 | "node": ">= 6" 4638 | } 4639 | }, 4640 | "node_modules/pkg-dir": { 4641 | "version": "4.2.0", 4642 | "dev": true, 4643 | "license": "MIT", 4644 | "dependencies": { 4645 | "find-up": "^4.0.0" 4646 | }, 4647 | "engines": { 4648 | "node": ">=8" 4649 | } 4650 | }, 4651 | "node_modules/pkg-dir/node_modules/find-up": { 4652 | "version": "4.1.0", 4653 | "dev": true, 4654 | "license": "MIT", 4655 | "dependencies": { 4656 | "locate-path": "^5.0.0", 4657 | "path-exists": "^4.0.0" 4658 | }, 4659 | "engines": { 4660 | "node": ">=8" 4661 | } 4662 | }, 4663 | "node_modules/pkg-dir/node_modules/locate-path": { 4664 | "version": "5.0.0", 4665 | "dev": true, 4666 | "license": "MIT", 4667 | "dependencies": { 4668 | "p-locate": "^4.1.0" 4669 | }, 4670 | "engines": { 4671 | "node": ">=8" 4672 | } 4673 | }, 4674 | "node_modules/pkg-dir/node_modules/p-limit": { 4675 | "version": "2.3.0", 4676 | "dev": true, 4677 | "license": "MIT", 4678 | "dependencies": { 4679 | "p-try": "^2.0.0" 4680 | }, 4681 | "engines": { 4682 | "node": ">=6" 4683 | }, 4684 | "funding": { 4685 | "url": "https://github.com/sponsors/sindresorhus" 4686 | } 4687 | }, 4688 | "node_modules/pkg-dir/node_modules/p-locate": { 4689 | "version": "4.1.0", 4690 | "dev": true, 4691 | "license": "MIT", 4692 | "dependencies": { 4693 | "p-limit": "^2.2.0" 4694 | }, 4695 | "engines": { 4696 | "node": ">=8" 4697 | } 4698 | }, 4699 | "node_modules/pkg-dir/node_modules/path-exists": { 4700 | "version": "4.0.0", 4701 | "dev": true, 4702 | "license": "MIT", 4703 | "engines": { 4704 | "node": ">=8" 4705 | } 4706 | }, 4707 | "node_modules/prepend-http": { 4708 | "version": "3.0.1", 4709 | "dev": true, 4710 | "license": "MIT", 4711 | "engines": { 4712 | "node": ">=8" 4713 | } 4714 | }, 4715 | "node_modules/pretty-format": { 4716 | "version": "29.7.0", 4717 | "dev": true, 4718 | "license": "MIT", 4719 | "dependencies": { 4720 | "@jest/schemas": "^29.6.3", 4721 | "ansi-styles": "^5.0.0", 4722 | "react-is": "^18.0.0" 4723 | }, 4724 | "engines": { 4725 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 4726 | } 4727 | }, 4728 | "node_modules/pretty-format/node_modules/ansi-styles": { 4729 | "version": "5.2.0", 4730 | "dev": true, 4731 | "license": "MIT", 4732 | "engines": { 4733 | "node": ">=10" 4734 | }, 4735 | "funding": { 4736 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 4737 | } 4738 | }, 4739 | "node_modules/prompts": { 4740 | "version": "2.4.2", 4741 | "dev": true, 4742 | "license": "MIT", 4743 | "dependencies": { 4744 | "kleur": "^3.0.3", 4745 | "sisteransi": "^1.0.5" 4746 | }, 4747 | "engines": { 4748 | "node": ">= 6" 4749 | } 4750 | }, 4751 | "node_modules/pump": { 4752 | "version": "3.0.0", 4753 | "dev": true, 4754 | "license": "MIT", 4755 | "dependencies": { 4756 | "end-of-stream": "^1.1.0", 4757 | "once": "^1.3.1" 4758 | } 4759 | }, 4760 | "node_modules/pure-rand": { 4761 | "version": "6.0.4", 4762 | "dev": true, 4763 | "funding": [ 4764 | { 4765 | "type": "individual", 4766 | "url": "https://github.com/sponsors/dubzzz" 4767 | }, 4768 | { 4769 | "type": "opencollective", 4770 | "url": "https://opencollective.com/fast-check" 4771 | } 4772 | ], 4773 | "license": "MIT" 4774 | }, 4775 | "node_modules/qs": { 4776 | "version": "6.11.2", 4777 | "dev": true, 4778 | "license": "BSD-3-Clause", 4779 | "dependencies": { 4780 | "side-channel": "^1.0.4" 4781 | }, 4782 | "engines": { 4783 | "node": ">=0.6" 4784 | }, 4785 | "funding": { 4786 | "url": "https://github.com/sponsors/ljharb" 4787 | } 4788 | }, 4789 | "node_modules/querystringify": { 4790 | "version": "2.2.0", 4791 | "dev": true, 4792 | "license": "MIT" 4793 | }, 4794 | "node_modules/quick-lru": { 4795 | "version": "5.1.1", 4796 | "dev": true, 4797 | "license": "MIT", 4798 | "engines": { 4799 | "node": ">=10" 4800 | }, 4801 | "funding": { 4802 | "url": "https://github.com/sponsors/sindresorhus" 4803 | } 4804 | }, 4805 | "node_modules/react-is": { 4806 | "version": "18.2.0", 4807 | "dev": true, 4808 | "license": "MIT" 4809 | }, 4810 | "node_modules/read-pkg": { 4811 | "version": "6.0.0", 4812 | "dev": true, 4813 | "license": "MIT", 4814 | "dependencies": { 4815 | "@types/normalize-package-data": "^2.4.0", 4816 | "normalize-package-data": "^3.0.2", 4817 | "parse-json": "^5.2.0", 4818 | "type-fest": "^1.0.1" 4819 | }, 4820 | "engines": { 4821 | "node": ">=12" 4822 | }, 4823 | "funding": { 4824 | "url": "https://github.com/sponsors/sindresorhus" 4825 | } 4826 | }, 4827 | "node_modules/read-pkg-up": { 4828 | "version": "8.0.0", 4829 | "dev": true, 4830 | "license": "MIT", 4831 | "dependencies": { 4832 | "find-up": "^5.0.0", 4833 | "read-pkg": "^6.0.0", 4834 | "type-fest": "^1.0.1" 4835 | }, 4836 | "engines": { 4837 | "node": ">=12" 4838 | }, 4839 | "funding": { 4840 | "url": "https://github.com/sponsors/sindresorhus" 4841 | } 4842 | }, 4843 | "node_modules/read-pkg-up/node_modules/find-up": { 4844 | "version": "5.0.0", 4845 | "dev": true, 4846 | "license": "MIT", 4847 | "dependencies": { 4848 | "locate-path": "^6.0.0", 4849 | "path-exists": "^4.0.0" 4850 | }, 4851 | "engines": { 4852 | "node": ">=10" 4853 | }, 4854 | "funding": { 4855 | "url": "https://github.com/sponsors/sindresorhus" 4856 | } 4857 | }, 4858 | "node_modules/read-pkg-up/node_modules/locate-path": { 4859 | "version": "6.0.0", 4860 | "dev": true, 4861 | "license": "MIT", 4862 | "dependencies": { 4863 | "p-locate": "^5.0.0" 4864 | }, 4865 | "engines": { 4866 | "node": ">=10" 4867 | }, 4868 | "funding": { 4869 | "url": "https://github.com/sponsors/sindresorhus" 4870 | } 4871 | }, 4872 | "node_modules/read-pkg-up/node_modules/p-limit": { 4873 | "version": "3.1.0", 4874 | "dev": true, 4875 | "license": "MIT", 4876 | "dependencies": { 4877 | "yocto-queue": "^0.1.0" 4878 | }, 4879 | "engines": { 4880 | "node": ">=10" 4881 | }, 4882 | "funding": { 4883 | "url": "https://github.com/sponsors/sindresorhus" 4884 | } 4885 | }, 4886 | "node_modules/read-pkg-up/node_modules/p-locate": { 4887 | "version": "5.0.0", 4888 | "dev": true, 4889 | "license": "MIT", 4890 | "dependencies": { 4891 | "p-limit": "^3.0.2" 4892 | }, 4893 | "engines": { 4894 | "node": ">=10" 4895 | }, 4896 | "funding": { 4897 | "url": "https://github.com/sponsors/sindresorhus" 4898 | } 4899 | }, 4900 | "node_modules/read-pkg-up/node_modules/path-exists": { 4901 | "version": "4.0.0", 4902 | "dev": true, 4903 | "license": "MIT", 4904 | "engines": { 4905 | "node": ">=8" 4906 | } 4907 | }, 4908 | "node_modules/read-pkg-up/node_modules/type-fest": { 4909 | "version": "1.4.0", 4910 | "dev": true, 4911 | "license": "(MIT OR CC0-1.0)", 4912 | "engines": { 4913 | "node": ">=10" 4914 | }, 4915 | "funding": { 4916 | "url": "https://github.com/sponsors/sindresorhus" 4917 | } 4918 | }, 4919 | "node_modules/read-pkg-up/node_modules/yocto-queue": { 4920 | "version": "0.1.0", 4921 | "dev": true, 4922 | "license": "MIT", 4923 | "engines": { 4924 | "node": ">=10" 4925 | }, 4926 | "funding": { 4927 | "url": "https://github.com/sponsors/sindresorhus" 4928 | } 4929 | }, 4930 | "node_modules/read-pkg/node_modules/type-fest": { 4931 | "version": "1.4.0", 4932 | "dev": true, 4933 | "license": "(MIT OR CC0-1.0)", 4934 | "engines": { 4935 | "node": ">=10" 4936 | }, 4937 | "funding": { 4938 | "url": "https://github.com/sponsors/sindresorhus" 4939 | } 4940 | }, 4941 | "node_modules/readable-stream": { 4942 | "version": "3.6.2", 4943 | "dev": true, 4944 | "license": "MIT", 4945 | "dependencies": { 4946 | "inherits": "^2.0.3", 4947 | "string_decoder": "^1.1.1", 4948 | "util-deprecate": "^1.0.1" 4949 | }, 4950 | "engines": { 4951 | "node": ">= 6" 4952 | } 4953 | }, 4954 | "node_modules/readdirp": { 4955 | "version": "3.6.0", 4956 | "dev": true, 4957 | "license": "MIT", 4958 | "dependencies": { 4959 | "picomatch": "^2.2.1" 4960 | }, 4961 | "engines": { 4962 | "node": ">=8.10.0" 4963 | } 4964 | }, 4965 | "node_modules/recursive-readdir": { 4966 | "version": "2.2.3", 4967 | "dev": true, 4968 | "license": "MIT", 4969 | "dependencies": { 4970 | "minimatch": "^3.0.5" 4971 | }, 4972 | "engines": { 4973 | "node": ">=6.0.0" 4974 | } 4975 | }, 4976 | "node_modules/replace-buffer": { 4977 | "version": "1.2.1", 4978 | "dev": true, 4979 | "license": "MIT", 4980 | "engines": { 4981 | "node": ">=4" 4982 | } 4983 | }, 4984 | "node_modules/require-directory": { 4985 | "version": "2.1.1", 4986 | "dev": true, 4987 | "license": "MIT", 4988 | "engines": { 4989 | "node": ">=0.10.0" 4990 | } 4991 | }, 4992 | "node_modules/requires-port": { 4993 | "version": "1.0.0", 4994 | "dev": true, 4995 | "license": "MIT" 4996 | }, 4997 | "node_modules/resolve": { 4998 | "version": "1.22.8", 4999 | "dev": true, 5000 | "license": "MIT", 5001 | "dependencies": { 5002 | "is-core-module": "^2.13.0", 5003 | "path-parse": "^1.0.7", 5004 | "supports-preserve-symlinks-flag": "^1.0.0" 5005 | }, 5006 | "bin": { 5007 | "resolve": "bin/resolve" 5008 | }, 5009 | "funding": { 5010 | "url": "https://github.com/sponsors/ljharb" 5011 | } 5012 | }, 5013 | "node_modules/resolve-alpn": { 5014 | "version": "1.2.1", 5015 | "dev": true, 5016 | "license": "MIT" 5017 | }, 5018 | "node_modules/resolve-cwd": { 5019 | "version": "3.0.0", 5020 | "dev": true, 5021 | "license": "MIT", 5022 | "dependencies": { 5023 | "resolve-from": "^5.0.0" 5024 | }, 5025 | "engines": { 5026 | "node": ">=8" 5027 | } 5028 | }, 5029 | "node_modules/resolve-from": { 5030 | "version": "5.0.0", 5031 | "dev": true, 5032 | "license": "MIT", 5033 | "engines": { 5034 | "node": ">=8" 5035 | } 5036 | }, 5037 | "node_modules/resolve.exports": { 5038 | "version": "2.0.2", 5039 | "dev": true, 5040 | "license": "MIT", 5041 | "engines": { 5042 | "node": ">=10" 5043 | } 5044 | }, 5045 | "node_modules/responselike": { 5046 | "version": "2.0.1", 5047 | "dev": true, 5048 | "license": "MIT", 5049 | "dependencies": { 5050 | "lowercase-keys": "^2.0.0" 5051 | }, 5052 | "funding": { 5053 | "url": "https://github.com/sponsors/sindresorhus" 5054 | } 5055 | }, 5056 | "node_modules/restore-cursor": { 5057 | "version": "3.1.0", 5058 | "dev": true, 5059 | "license": "MIT", 5060 | "dependencies": { 5061 | "onetime": "^5.1.0", 5062 | "signal-exit": "^3.0.2" 5063 | }, 5064 | "engines": { 5065 | "node": ">=8" 5066 | } 5067 | }, 5068 | "node_modules/router-ips": { 5069 | "version": "1.0.0", 5070 | "dev": true, 5071 | "license": "MIT", 5072 | "engines": { 5073 | "node": ">=4" 5074 | } 5075 | }, 5076 | "node_modules/run-async": { 5077 | "version": "2.4.1", 5078 | "dev": true, 5079 | "license": "MIT", 5080 | "engines": { 5081 | "node": ">=0.12.0" 5082 | } 5083 | }, 5084 | "node_modules/rxjs": { 5085 | "version": "7.8.1", 5086 | "dev": true, 5087 | "license": "Apache-2.0", 5088 | "dependencies": { 5089 | "tslib": "^2.1.0" 5090 | } 5091 | }, 5092 | "node_modules/safe-buffer": { 5093 | "version": "5.2.1", 5094 | "dev": true, 5095 | "funding": [ 5096 | { 5097 | "type": "github", 5098 | "url": "https://github.com/sponsors/feross" 5099 | }, 5100 | { 5101 | "type": "patreon", 5102 | "url": "https://www.patreon.com/feross" 5103 | }, 5104 | { 5105 | "type": "consulting", 5106 | "url": "https://feross.org/support" 5107 | } 5108 | ], 5109 | "license": "MIT" 5110 | }, 5111 | "node_modules/safer-buffer": { 5112 | "version": "2.1.2", 5113 | "dev": true, 5114 | "license": "MIT" 5115 | }, 5116 | "node_modules/semver": { 5117 | "version": "6.3.1", 5118 | "dev": true, 5119 | "license": "ISC", 5120 | "bin": { 5121 | "semver": "bin/semver.js" 5122 | } 5123 | }, 5124 | "node_modules/server-destroy": { 5125 | "version": "1.0.1", 5126 | "dev": true, 5127 | "license": "ISC" 5128 | }, 5129 | "node_modules/set-function-length": { 5130 | "version": "1.1.1", 5131 | "dev": true, 5132 | "license": "MIT", 5133 | "dependencies": { 5134 | "define-data-property": "^1.1.1", 5135 | "get-intrinsic": "^1.2.1", 5136 | "gopd": "^1.0.1", 5137 | "has-property-descriptors": "^1.0.0" 5138 | }, 5139 | "engines": { 5140 | "node": ">= 0.4" 5141 | } 5142 | }, 5143 | "node_modules/shebang-command": { 5144 | "version": "2.0.0", 5145 | "dev": true, 5146 | "license": "MIT", 5147 | "dependencies": { 5148 | "shebang-regex": "^3.0.0" 5149 | }, 5150 | "engines": { 5151 | "node": ">=8" 5152 | } 5153 | }, 5154 | "node_modules/shebang-regex": { 5155 | "version": "3.0.0", 5156 | "dev": true, 5157 | "license": "MIT", 5158 | "engines": { 5159 | "node": ">=8" 5160 | } 5161 | }, 5162 | "node_modules/side-channel": { 5163 | "version": "1.0.4", 5164 | "dev": true, 5165 | "license": "MIT", 5166 | "dependencies": { 5167 | "call-bind": "^1.0.0", 5168 | "get-intrinsic": "^1.0.2", 5169 | "object-inspect": "^1.9.0" 5170 | }, 5171 | "funding": { 5172 | "url": "https://github.com/sponsors/ljharb" 5173 | } 5174 | }, 5175 | "node_modules/signal-exit": { 5176 | "version": "3.0.7", 5177 | "dev": true, 5178 | "license": "ISC" 5179 | }, 5180 | "node_modules/sisteransi": { 5181 | "version": "1.0.5", 5182 | "dev": true, 5183 | "license": "MIT" 5184 | }, 5185 | "node_modules/slash": { 5186 | "version": "3.0.0", 5187 | "dev": true, 5188 | "license": "MIT", 5189 | "engines": { 5190 | "node": ">=8" 5191 | } 5192 | }, 5193 | "node_modules/slice-ansi": { 5194 | "version": "5.0.0", 5195 | "dev": true, 5196 | "license": "MIT", 5197 | "dependencies": { 5198 | "ansi-styles": "^6.0.0", 5199 | "is-fullwidth-code-point": "^4.0.0" 5200 | }, 5201 | "engines": { 5202 | "node": ">=12" 5203 | }, 5204 | "funding": { 5205 | "url": "https://github.com/chalk/slice-ansi?sponsor=1" 5206 | } 5207 | }, 5208 | "node_modules/slice-ansi/node_modules/ansi-styles": { 5209 | "version": "6.2.1", 5210 | "dev": true, 5211 | "license": "MIT", 5212 | "engines": { 5213 | "node": ">=12" 5214 | }, 5215 | "funding": { 5216 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 5217 | } 5218 | }, 5219 | "node_modules/source-map": { 5220 | "version": "0.6.1", 5221 | "dev": true, 5222 | "license": "BSD-3-Clause", 5223 | "engines": { 5224 | "node": ">=0.10.0" 5225 | } 5226 | }, 5227 | "node_modules/source-map-support": { 5228 | "version": "0.5.13", 5229 | "dev": true, 5230 | "license": "MIT", 5231 | "dependencies": { 5232 | "buffer-from": "^1.0.0", 5233 | "source-map": "^0.6.0" 5234 | } 5235 | }, 5236 | "node_modules/spdx-correct": { 5237 | "version": "3.2.0", 5238 | "dev": true, 5239 | "license": "Apache-2.0", 5240 | "dependencies": { 5241 | "spdx-expression-parse": "^3.0.0", 5242 | "spdx-license-ids": "^3.0.0" 5243 | } 5244 | }, 5245 | "node_modules/spdx-exceptions": { 5246 | "version": "2.3.0", 5247 | "dev": true, 5248 | "license": "CC-BY-3.0" 5249 | }, 5250 | "node_modules/spdx-expression-parse": { 5251 | "version": "3.0.1", 5252 | "dev": true, 5253 | "license": "MIT", 5254 | "dependencies": { 5255 | "spdx-exceptions": "^2.1.0", 5256 | "spdx-license-ids": "^3.0.0" 5257 | } 5258 | }, 5259 | "node_modules/spdx-license-ids": { 5260 | "version": "3.0.16", 5261 | "dev": true, 5262 | "license": "CC0-1.0" 5263 | }, 5264 | "node_modules/split-lines": { 5265 | "version": "3.0.0", 5266 | "dev": true, 5267 | "license": "MIT", 5268 | "engines": { 5269 | "node": ">=12" 5270 | }, 5271 | "funding": { 5272 | "url": "https://github.com/sponsors/sindresorhus" 5273 | } 5274 | }, 5275 | "node_modules/sprintf-js": { 5276 | "version": "1.0.3", 5277 | "dev": true, 5278 | "license": "BSD-3-Clause" 5279 | }, 5280 | "node_modules/stack-utils": { 5281 | "version": "2.0.6", 5282 | "dev": true, 5283 | "license": "MIT", 5284 | "dependencies": { 5285 | "escape-string-regexp": "^2.0.0" 5286 | }, 5287 | "engines": { 5288 | "node": ">=10" 5289 | } 5290 | }, 5291 | "node_modules/stack-utils/node_modules/escape-string-regexp": { 5292 | "version": "2.0.0", 5293 | "dev": true, 5294 | "license": "MIT", 5295 | "engines": { 5296 | "node": ">=8" 5297 | } 5298 | }, 5299 | "node_modules/stdin-discarder": { 5300 | "version": "0.1.0", 5301 | "dev": true, 5302 | "license": "MIT", 5303 | "dependencies": { 5304 | "bl": "^5.0.0" 5305 | }, 5306 | "engines": { 5307 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 5308 | }, 5309 | "funding": { 5310 | "url": "https://github.com/sponsors/sindresorhus" 5311 | } 5312 | }, 5313 | "node_modules/string_decoder": { 5314 | "version": "1.3.0", 5315 | "dev": true, 5316 | "license": "MIT", 5317 | "dependencies": { 5318 | "safe-buffer": "~5.2.0" 5319 | } 5320 | }, 5321 | "node_modules/string-length": { 5322 | "version": "4.0.2", 5323 | "dev": true, 5324 | "license": "MIT", 5325 | "dependencies": { 5326 | "char-regex": "^1.0.2", 5327 | "strip-ansi": "^6.0.0" 5328 | }, 5329 | "engines": { 5330 | "node": ">=10" 5331 | } 5332 | }, 5333 | "node_modules/string-width": { 5334 | "version": "5.1.2", 5335 | "dev": true, 5336 | "license": "MIT", 5337 | "dependencies": { 5338 | "eastasianwidth": "^0.2.0", 5339 | "emoji-regex": "^9.2.2", 5340 | "strip-ansi": "^7.0.1" 5341 | }, 5342 | "engines": { 5343 | "node": ">=12" 5344 | }, 5345 | "funding": { 5346 | "url": "https://github.com/sponsors/sindresorhus" 5347 | } 5348 | }, 5349 | "node_modules/string-width/node_modules/ansi-regex": { 5350 | "version": "6.0.1", 5351 | "dev": true, 5352 | "license": "MIT", 5353 | "engines": { 5354 | "node": ">=12" 5355 | }, 5356 | "funding": { 5357 | "url": "https://github.com/chalk/ansi-regex?sponsor=1" 5358 | } 5359 | }, 5360 | "node_modules/string-width/node_modules/strip-ansi": { 5361 | "version": "7.1.0", 5362 | "dev": true, 5363 | "license": "MIT", 5364 | "dependencies": { 5365 | "ansi-regex": "^6.0.1" 5366 | }, 5367 | "engines": { 5368 | "node": ">=12" 5369 | }, 5370 | "funding": { 5371 | "url": "https://github.com/chalk/strip-ansi?sponsor=1" 5372 | } 5373 | }, 5374 | "node_modules/strip-ansi": { 5375 | "version": "6.0.1", 5376 | "dev": true, 5377 | "license": "MIT", 5378 | "dependencies": { 5379 | "ansi-regex": "^5.0.1" 5380 | }, 5381 | "engines": { 5382 | "node": ">=8" 5383 | } 5384 | }, 5385 | "node_modules/strip-bom": { 5386 | "version": "5.0.0", 5387 | "dev": true, 5388 | "license": "MIT", 5389 | "engines": { 5390 | "node": ">=12" 5391 | }, 5392 | "funding": { 5393 | "url": "https://github.com/sponsors/sindresorhus" 5394 | } 5395 | }, 5396 | "node_modules/strip-final-newline": { 5397 | "version": "2.0.0", 5398 | "dev": true, 5399 | "license": "MIT", 5400 | "engines": { 5401 | "node": ">=6" 5402 | } 5403 | }, 5404 | "node_modules/strip-json-comments": { 5405 | "version": "3.1.1", 5406 | "dev": true, 5407 | "license": "MIT", 5408 | "engines": { 5409 | "node": ">=8" 5410 | }, 5411 | "funding": { 5412 | "url": "https://github.com/sponsors/sindresorhus" 5413 | } 5414 | }, 5415 | "node_modules/supports-color": { 5416 | "version": "7.2.0", 5417 | "dev": true, 5418 | "license": "MIT", 5419 | "dependencies": { 5420 | "has-flag": "^4.0.0" 5421 | }, 5422 | "engines": { 5423 | "node": ">=8" 5424 | } 5425 | }, 5426 | "node_modules/supports-preserve-symlinks-flag": { 5427 | "version": "1.0.0", 5428 | "dev": true, 5429 | "license": "MIT", 5430 | "engines": { 5431 | "node": ">= 0.4" 5432 | }, 5433 | "funding": { 5434 | "url": "https://github.com/sponsors/ljharb" 5435 | } 5436 | }, 5437 | "node_modules/test-exclude": { 5438 | "version": "6.0.0", 5439 | "dev": true, 5440 | "license": "ISC", 5441 | "dependencies": { 5442 | "@istanbuljs/schema": "^0.1.2", 5443 | "glob": "^7.1.4", 5444 | "minimatch": "^3.0.4" 5445 | }, 5446 | "engines": { 5447 | "node": ">=8" 5448 | } 5449 | }, 5450 | "node_modules/through": { 5451 | "version": "2.3.8", 5452 | "dev": true, 5453 | "license": "MIT" 5454 | }, 5455 | "node_modules/tmp": { 5456 | "version": "0.0.33", 5457 | "dev": true, 5458 | "license": "MIT", 5459 | "dependencies": { 5460 | "os-tmpdir": "~1.0.2" 5461 | }, 5462 | "engines": { 5463 | "node": ">=0.6.0" 5464 | } 5465 | }, 5466 | "node_modules/tmpl": { 5467 | "version": "1.0.5", 5468 | "dev": true, 5469 | "license": "BSD-3-Clause" 5470 | }, 5471 | "node_modules/to-fast-properties": { 5472 | "version": "2.0.0", 5473 | "dev": true, 5474 | "license": "MIT", 5475 | "engines": { 5476 | "node": ">=4" 5477 | } 5478 | }, 5479 | "node_modules/to-regex-range": { 5480 | "version": "5.0.1", 5481 | "dev": true, 5482 | "license": "MIT", 5483 | "dependencies": { 5484 | "is-number": "^7.0.0" 5485 | }, 5486 | "engines": { 5487 | "node": ">=8.0" 5488 | } 5489 | }, 5490 | "node_modules/tr46": { 5491 | "version": "0.0.3", 5492 | "dev": true, 5493 | "license": "MIT" 5494 | }, 5495 | "node_modules/ts2gas": { 5496 | "version": "4.2.0", 5497 | "dev": true, 5498 | "license": "MIT", 5499 | "dependencies": { 5500 | "type-fest": "^2.1.0", 5501 | "typescript": "^4.4.2" 5502 | }, 5503 | "engines": { 5504 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 5505 | } 5506 | }, 5507 | "node_modules/ts2gas/node_modules/type-fest": { 5508 | "version": "2.19.0", 5509 | "dev": true, 5510 | "license": "(MIT OR CC0-1.0)", 5511 | "engines": { 5512 | "node": ">=12.20" 5513 | }, 5514 | "funding": { 5515 | "url": "https://github.com/sponsors/sindresorhus" 5516 | } 5517 | }, 5518 | "node_modules/tslib": { 5519 | "version": "2.6.2", 5520 | "dev": true, 5521 | "license": "0BSD" 5522 | }, 5523 | "node_modules/type-detect": { 5524 | "version": "4.0.8", 5525 | "dev": true, 5526 | "license": "MIT", 5527 | "engines": { 5528 | "node": ">=4" 5529 | } 5530 | }, 5531 | "node_modules/type-fest": { 5532 | "version": "0.21.3", 5533 | "dev": true, 5534 | "license": "(MIT OR CC0-1.0)", 5535 | "engines": { 5536 | "node": ">=10" 5537 | }, 5538 | "funding": { 5539 | "url": "https://github.com/sponsors/sindresorhus" 5540 | } 5541 | }, 5542 | "node_modules/typescript": { 5543 | "version": "4.9.5", 5544 | "dev": true, 5545 | "license": "Apache-2.0", 5546 | "bin": { 5547 | "tsc": "bin/tsc", 5548 | "tsserver": "bin/tsserver" 5549 | }, 5550 | "engines": { 5551 | "node": ">=4.2.0" 5552 | } 5553 | }, 5554 | "node_modules/undici-types": { 5555 | "version": "5.26.5", 5556 | "dev": true, 5557 | "license": "MIT" 5558 | }, 5559 | "node_modules/universalify": { 5560 | "version": "2.0.1", 5561 | "dev": true, 5562 | "license": "MIT", 5563 | "engines": { 5564 | "node": ">= 10.0.0" 5565 | } 5566 | }, 5567 | "node_modules/update-browserslist-db": { 5568 | "version": "1.0.13", 5569 | "dev": true, 5570 | "funding": [ 5571 | { 5572 | "type": "opencollective", 5573 | "url": "https://opencollective.com/browserslist" 5574 | }, 5575 | { 5576 | "type": "tidelift", 5577 | "url": "https://tidelift.com/funding/github/npm/browserslist" 5578 | }, 5579 | { 5580 | "type": "github", 5581 | "url": "https://github.com/sponsors/ai" 5582 | } 5583 | ], 5584 | "license": "MIT", 5585 | "dependencies": { 5586 | "escalade": "^3.1.1", 5587 | "picocolors": "^1.0.0" 5588 | }, 5589 | "bin": { 5590 | "update-browserslist-db": "cli.js" 5591 | }, 5592 | "peerDependencies": { 5593 | "browserslist": ">= 4.21.0" 5594 | } 5595 | }, 5596 | "node_modules/url-parse": { 5597 | "version": "1.5.10", 5598 | "dev": true, 5599 | "license": "MIT", 5600 | "dependencies": { 5601 | "querystringify": "^2.1.1", 5602 | "requires-port": "^1.0.0" 5603 | } 5604 | }, 5605 | "node_modules/url-template": { 5606 | "version": "2.0.8", 5607 | "dev": true, 5608 | "license": "BSD" 5609 | }, 5610 | "node_modules/util-deprecate": { 5611 | "version": "1.0.2", 5612 | "dev": true, 5613 | "license": "MIT" 5614 | }, 5615 | "node_modules/uuid": { 5616 | "version": "8.3.2", 5617 | "dev": true, 5618 | "license": "MIT", 5619 | "bin": { 5620 | "uuid": "dist/bin/uuid" 5621 | } 5622 | }, 5623 | "node_modules/v8-to-istanbul": { 5624 | "version": "9.2.0", 5625 | "dev": true, 5626 | "license": "ISC", 5627 | "dependencies": { 5628 | "@jridgewell/trace-mapping": "^0.3.12", 5629 | "@types/istanbul-lib-coverage": "^2.0.1", 5630 | "convert-source-map": "^2.0.0" 5631 | }, 5632 | "engines": { 5633 | "node": ">=10.12.0" 5634 | } 5635 | }, 5636 | "node_modules/validate-npm-package-license": { 5637 | "version": "3.0.4", 5638 | "dev": true, 5639 | "license": "Apache-2.0", 5640 | "dependencies": { 5641 | "spdx-correct": "^3.0.0", 5642 | "spdx-expression-parse": "^3.0.0" 5643 | } 5644 | }, 5645 | "node_modules/walker": { 5646 | "version": "1.0.8", 5647 | "dev": true, 5648 | "license": "Apache-2.0", 5649 | "dependencies": { 5650 | "makeerror": "1.0.12" 5651 | } 5652 | }, 5653 | "node_modules/wcwidth": { 5654 | "version": "1.0.1", 5655 | "dev": true, 5656 | "license": "MIT", 5657 | "dependencies": { 5658 | "defaults": "^1.0.3" 5659 | } 5660 | }, 5661 | "node_modules/webidl-conversions": { 5662 | "version": "3.0.1", 5663 | "dev": true, 5664 | "license": "BSD-2-Clause" 5665 | }, 5666 | "node_modules/whatwg-url": { 5667 | "version": "5.0.0", 5668 | "dev": true, 5669 | "license": "MIT", 5670 | "dependencies": { 5671 | "tr46": "~0.0.3", 5672 | "webidl-conversions": "^3.0.0" 5673 | } 5674 | }, 5675 | "node_modules/which": { 5676 | "version": "2.0.2", 5677 | "dev": true, 5678 | "license": "ISC", 5679 | "dependencies": { 5680 | "isexe": "^2.0.0" 5681 | }, 5682 | "bin": { 5683 | "node-which": "bin/node-which" 5684 | }, 5685 | "engines": { 5686 | "node": ">= 8" 5687 | } 5688 | }, 5689 | "node_modules/wrap-ansi": { 5690 | "version": "6.2.0", 5691 | "dev": true, 5692 | "license": "MIT", 5693 | "dependencies": { 5694 | "ansi-styles": "^4.0.0", 5695 | "string-width": "^4.1.0", 5696 | "strip-ansi": "^6.0.0" 5697 | }, 5698 | "engines": { 5699 | "node": ">=8" 5700 | } 5701 | }, 5702 | "node_modules/wrap-ansi/node_modules/emoji-regex": { 5703 | "version": "8.0.0", 5704 | "dev": true, 5705 | "license": "MIT" 5706 | }, 5707 | "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { 5708 | "version": "3.0.0", 5709 | "dev": true, 5710 | "license": "MIT", 5711 | "engines": { 5712 | "node": ">=8" 5713 | } 5714 | }, 5715 | "node_modules/wrap-ansi/node_modules/string-width": { 5716 | "version": "4.2.3", 5717 | "dev": true, 5718 | "license": "MIT", 5719 | "dependencies": { 5720 | "emoji-regex": "^8.0.0", 5721 | "is-fullwidth-code-point": "^3.0.0", 5722 | "strip-ansi": "^6.0.1" 5723 | }, 5724 | "engines": { 5725 | "node": ">=8" 5726 | } 5727 | }, 5728 | "node_modules/wrappy": { 5729 | "version": "1.0.2", 5730 | "dev": true, 5731 | "license": "ISC" 5732 | }, 5733 | "node_modules/write-file-atomic": { 5734 | "version": "4.0.2", 5735 | "dev": true, 5736 | "license": "ISC", 5737 | "dependencies": { 5738 | "imurmurhash": "^0.1.4", 5739 | "signal-exit": "^3.0.7" 5740 | }, 5741 | "engines": { 5742 | "node": "^12.13.0 || ^14.15.0 || >=16.0.0" 5743 | } 5744 | }, 5745 | "node_modules/y18n": { 5746 | "version": "5.0.8", 5747 | "dev": true, 5748 | "license": "ISC", 5749 | "engines": { 5750 | "node": ">=10" 5751 | } 5752 | }, 5753 | "node_modules/yallist": { 5754 | "version": "4.0.0", 5755 | "dev": true, 5756 | "license": "ISC" 5757 | }, 5758 | "node_modules/yargs": { 5759 | "version": "17.7.2", 5760 | "dev": true, 5761 | "license": "MIT", 5762 | "dependencies": { 5763 | "cliui": "^8.0.1", 5764 | "escalade": "^3.1.1", 5765 | "get-caller-file": "^2.0.5", 5766 | "require-directory": "^2.1.1", 5767 | "string-width": "^4.2.3", 5768 | "y18n": "^5.0.5", 5769 | "yargs-parser": "^21.1.1" 5770 | }, 5771 | "engines": { 5772 | "node": ">=12" 5773 | } 5774 | }, 5775 | "node_modules/yargs-parser": { 5776 | "version": "21.1.1", 5777 | "dev": true, 5778 | "license": "ISC", 5779 | "engines": { 5780 | "node": ">=12" 5781 | } 5782 | }, 5783 | "node_modules/yargs/node_modules/emoji-regex": { 5784 | "version": "8.0.0", 5785 | "dev": true, 5786 | "license": "MIT" 5787 | }, 5788 | "node_modules/yargs/node_modules/is-fullwidth-code-point": { 5789 | "version": "3.0.0", 5790 | "dev": true, 5791 | "license": "MIT", 5792 | "engines": { 5793 | "node": ">=8" 5794 | } 5795 | }, 5796 | "node_modules/yargs/node_modules/string-width": { 5797 | "version": "4.2.3", 5798 | "dev": true, 5799 | "license": "MIT", 5800 | "dependencies": { 5801 | "emoji-regex": "^8.0.0", 5802 | "is-fullwidth-code-point": "^3.0.0", 5803 | "strip-ansi": "^6.0.1" 5804 | }, 5805 | "engines": { 5806 | "node": ">=8" 5807 | } 5808 | }, 5809 | "node_modules/yocto-queue": { 5810 | "version": "1.0.0", 5811 | "dev": true, 5812 | "license": "MIT", 5813 | "engines": { 5814 | "node": ">=12.20" 5815 | }, 5816 | "funding": { 5817 | "url": "https://github.com/sponsors/sindresorhus" 5818 | } 5819 | } 5820 | } 5821 | } 5822 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "secret-service", 3 | "version": "1.0.0", 4 | "description": "Google Apps Script library for managing secrets (API keys, passwords, etc.).", 5 | "author": "Stan ", 6 | "repository": { 7 | "type": "git", 8 | "url": "https://github.com/dataful-tech/secret-service.git" 9 | }, 10 | "license": "MIT", 11 | "private": true, 12 | "bugs": { 13 | "url": "https://github.com/dataful-tech/secret-service/issues" 14 | }, 15 | "homepage": "https://github.com/dataful-tech/secret-service", 16 | "scripts": { 17 | "test": "jest" 18 | }, 19 | "devDependencies": { 20 | "@google/clasp": "^2.4.2", 21 | "@types/google-apps-script": "^1.0.78", 22 | "jest": "^29.7.0" 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/.clasp.json: -------------------------------------------------------------------------------- 1 | { "scriptId": "164Mv6awN8mIExnFu6ZeXviPSA2GhDVP3grAMfiJCpAkcjcGWaDlNU9K4" } 2 | -------------------------------------------------------------------------------- /src/SecretService.js: -------------------------------------------------------------------------------- 1 | // Official repository: https://github.com/dataful-tech/secret-service 2 | // 3 | // MIT License 4 | 5 | // Copyright 2024 Dataful.Tech 6 | 7 | // Permission is hereby granted, free of charge, to any person obtaining a copy 8 | // of this software and associated documentation files (the “Software”), to deal 9 | // in the Software without restriction, including without limitation the rights 10 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 11 | // copies of the Software, and to permit persons to whom the Software is 12 | // furnished to do so, subject to the following conditions: 13 | 14 | // The above copyright notice and this permission notice shall be included 15 | // in all copies or substantial portions of the Software. 16 | 17 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 20 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 21 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 22 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 23 | // SOFTWARE. 24 | 25 | /** 26 | * @typedef {Object} SecretServiceConfig 27 | * @property {string|Object} [storage] The storage service to use: 28 | * - instance of `UserProperties`, `DocumentProperties`, or `ScriptProperties`. 29 | * - custom storage object: the secrets will be stored in the provided storage object. 30 | * @property {string} [mode] The mode of the Secret Service: 31 | * - `silent` (default): if secret is not found, do nothing and return null. 32 | * - `interactive`: if secret is not found, prompt user to enter it. 33 | * The script has to be attached to a document and the user has to have it open. 34 | * If the user cancels the prompt, throws an error. Requires `scriptContainer`. 35 | * - `strict`: if secret is not found, throw an error. 36 | * @property {string} [scriptContainer] The container service: `Spreadsheet-App`, 37 | * `Document-App`, `Slides-App`, or `Form-App` (without dashes). 38 | * Required when application is in `interactive` mode. 39 | * @property {string} [prefix] Prefix applied to the secret key. Default: `secret_service_`. 40 | */ 41 | 42 | /** 43 | * Creates a new SecretService instance with the given configuration. 44 | * @param {SecretServiceConfig} config The configuration object. 45 | * Supported options: 46 | * 1. `storage`: the storage service to use: 47 | * - an instance of `UserProperties`, `DocumentProperties`, or `ScriptProperties`. 48 | * - a custom storage object: the secrets will be stored in the provided storage object. 49 | * 2. `mode`: the mode of the Secret Service: 50 | * - `silent` (default): if secret is not found, do nothing and return null. 51 | * - `interactive`: if secret is not found, prompt user to enter it. 52 | * The script has to be attached to a document and the user has to have it open. 53 | * If the user cancels the prompt, throws an error. Requires `scriptContainer`. 54 | * - `strict`: if secret is not found, throw an error. 55 | * 3. `scriptContainer`: the container service: `Spreadsheet-App`, `Document-App`, 56 | * `Slides-App`, or `Form-App` (without dashes). Required when application is in `interactive` mode. 57 | * 4. `prefix`: prefix applied to the secret key. Default: `secret_service_`. 58 | * @returns {SecretService} An instance of SecretService. 59 | */ 60 | function init(config = {}) { 61 | return new SecretService(config); 62 | } 63 | 64 | /** 65 | * Class representing a SecretService. 66 | * @property {SecretServiceConfig=} config The configuration object for the SecretService. 67 | * Supported options: 68 | * 1. `storage`: the storage service to use: 69 | * - an instance of `UserProperties`, `DocumentProperties`, or `ScriptProperties`. 70 | * - a custom storage object: the secrets will be stored in the provided storage object. 71 | * 2. `mode`: the mode of the Secret Service: 72 | * - `silent` (default): if secret is not found, do nothing and return null. 73 | * - `interactive`: if secret is not found, prompt user to enter it. 74 | * The script has to be attached to a document and the user has to have it open. 75 | * If the user cancels the prompt, throws an error. Requires `scriptContainer`. 76 | * - `strict`: if secret is not found, throw an error. 77 | * 3. `scriptContainer`: the container service: `Spreadsheet-App`, `Document-App`, 78 | * `Slides-App`, or `Form-App` (without dashes). Required when application is in `interactive` mode. 79 | * 4. `prefix`: prefix applied to the secret key. Default: `secret_service_`. 80 | * @class 81 | */ 82 | class SecretService { 83 | constructor(config = {}) { 84 | /** 85 | * SecretService configuration object. 86 | * @type {SecretServiceConfig} 87 | * @public 88 | */ 89 | this.config_ = { ...defaultConfig_, ...config }; 90 | this.storage_ = this.getStorage_(this.config_); 91 | } 92 | 93 | getSecret(key, config = {}) { 94 | const mergedConfig = this.getConfig_(config); 95 | let secret = this.storage_.get(key, mergedConfig); 96 | if (secret !== null) return secret; 97 | 98 | if (mergedConfig.mode === "silent") return null; 99 | 100 | if (mergedConfig.mode === "strict") { 101 | throw new Error(`Secret not found: ${key}`); 102 | } 103 | 104 | // Interactive mode 105 | const ui = mergedConfig.scriptContainer.getUi(); 106 | const result = ui.prompt( 107 | "Secrets Management", 108 | `Please enter ${key}`, 109 | ui.ButtonSet.OK_CANCEL 110 | ); 111 | if (result.getSelectedButton() === ui.Button.OK) { 112 | secret = result.getResponseText(); 113 | this.storage_.set(key, secret, mergedConfig); 114 | return secret; 115 | } else { 116 | // User clicked "CANCEL" or closed the prompt 117 | throw Error(`User has not entered the secret ${key}, aborting.`); 118 | } 119 | } 120 | 121 | setSecret(key, value, config = {}) { 122 | const mergedConfig = this.getConfig_(config); 123 | this.storage_.set(key, value, mergedConfig); 124 | } 125 | 126 | deleteSecrets(keys, config = {}) { 127 | const mergedConfig = this.getConfig_(config); 128 | keys.forEach((key) => this.storage_.delete(key, mergedConfig)); 129 | } 130 | 131 | deleteAllSecrets(config = {}) { 132 | const mergedConfig = this.getConfig_(config); 133 | this.storage_.deleteAll(mergedConfig); 134 | } 135 | 136 | getStorage_(config) { 137 | // If getProperty method is defined, assume it's a `Properties` instance 138 | if (config.storage.getProperty !== undefined) return new PropertiesStorage_(config.storage); 139 | // Otherwise, it's a custom storage object 140 | return config.storage; 141 | } 142 | 143 | getConfig_(config = {}) { 144 | const mergedConfig = { 145 | ...this.config_, 146 | ...config, 147 | }; 148 | if (!mergedConfig.storage) { 149 | throw new Error("`storage` is required"); 150 | } 151 | if (!["interactive", "silent", "strict"].includes(mergedConfig.mode)) { 152 | throw new Error( 153 | `Invalid mode: ${mergedConfig.mode}. Supported modes: silent, interactive, strict.` 154 | ); 155 | } 156 | if (mergedConfig.mode === "interactive" && !mergedConfig.scriptContainer) { 157 | throw new Error( 158 | "Script container is required for interactive mode. Please provide `scriptContainer` in the config." 159 | ); 160 | } 161 | return mergedConfig; 162 | } 163 | } 164 | 165 | /** 166 | * Wrapper around UserProperties / ScriptProperties / DocumentProperties. 167 | * @class 168 | * @private 169 | */ 170 | class PropertiesStorage_ { 171 | /** 172 | * Creates an instance of PropertiesStorage. 173 | * @param {Properties} properties The properties service. 174 | * @constructor 175 | */ 176 | constructor(properties) { 177 | this.properties_ = properties; 178 | } 179 | 180 | /** 181 | * Retrieves a property with the given key. 182 | * @param {string} key The key of the property. 183 | * @param {SecretServiceConfig} config The configuration object. 184 | * @returns {string|null} The value of the property. 185 | */ 186 | get(key, config) { 187 | const completeKey = this.buildKey_(key, config); 188 | return this.properties_.getProperty(completeKey); 189 | } 190 | 191 | /** 192 | * Saves a property with the given key and value. 193 | * @param {string} key The key of the property. 194 | * @param {string} value The value of the property. 195 | * @param {SecretServiceConfig} config The configuration object. 196 | */ 197 | set(key, value, config) { 198 | const completeKey = this.buildKey_(key, config); 199 | this.properties_.setProperty(completeKey, value); 200 | } 201 | 202 | /** 203 | * Deletes a property with the given key. 204 | * @param {string} key The key of the property. 205 | * @param {SecretServiceConfig} config The configuration object. 206 | */ 207 | delete(key, config) { 208 | const completeKey = this.buildKey_(key, config); 209 | this.properties_.deleteProperty(completeKey); 210 | } 211 | 212 | /** 213 | * Deletes all properties with the given prefix. 214 | * @param {SecretServiceConfig} config The configuration object. 215 | */ 216 | deleteAll(config) { 217 | const allProperties = this.properties_.getProperties(); 218 | Object.keys(allProperties) 219 | .filter((key) => key.startsWith(config.prefix)) 220 | .forEach((key) => this.properties_.deleteProperty(key)); 221 | } 222 | 223 | /** 224 | * Builds a complete key based on the prefix in configuration. 225 | * @param {string} key The key of the property. 226 | * @param {SecretServiceConfig} config The configuration object. 227 | * @returns {string} The complete key. 228 | * @private 229 | */ 230 | buildKey_(key, config) { 231 | return `${config.prefix}${key}`; 232 | } 233 | } 234 | 235 | const defaultConfig_ = { 236 | storage: null, 237 | mode: "silent", 238 | prefix: "secret_service_", 239 | scriptContainer: null, 240 | }; 241 | 242 | // Methods to use SecretService without creating an instance. 243 | // Also allow for type hints in the Google Apps Script IDE. 244 | 245 | /** 246 | * Retrieves a secret with the given key. 247 | * @param {string} key The key of the secret. 248 | * @param {SecretServiceConfig=} config The configuration object. 249 | * Supported options: 250 | * 1. `storage`: the storage service to use: 251 | * - an instance of `UserProperties`, `DocumentProperties`, or `ScriptProperties`. 252 | * - a custom storage object: the secrets will be stored in the provided storage object. 253 | * 2. `mode`: the mode of the Secret Service: 254 | * - `silent` (default): if secret is not found, do nothing and return null. 255 | * - `interactive`: if secret is not found, prompt user to enter it. 256 | * The script has to be attached to a document and the user has to have it open. 257 | * If the user cancels the prompt, throws an error. Requires `scriptContainer`. 258 | * - `strict`: if secret is not found, throw an error. 259 | * 3. `scriptContainer`: the container service: `Spreadsheet-App`, `Document-App`, 260 | * `Slides-App`, or `Form-App` (without dashes). Required when application is in `interactive` mode. 261 | * 4. `prefix`: prefix applied to the secret key. Default: `secret_service_`. 262 | * @returns {string|null} The value of the secret. 263 | */ 264 | function getSecret(key, config) { 265 | return init(config).getSecret(key); 266 | } 267 | 268 | /** 269 | * Saves a secret with the given key and value. 270 | * @param {string} key The key of the secret. 271 | * @param {string} value The value of the secret. 272 | * @param {SecretServiceConfig=} config The configuration object. 273 | * Supported options: 274 | * 1. `storage`: the storage service to use: 275 | * - an instance of `UserProperties`, `DocumentProperties`, or `ScriptProperties`. 276 | * - a custom storage object: the secrets will be stored in the provided storage object. 277 | * 2. `prefix`: prefix applied to the secret key. Default: `secret_service_`. 278 | * @returns {void} 279 | */ 280 | function setSecret(key, value, config) { 281 | init(config).setSecret(key, value); 282 | } 283 | 284 | /** 285 | * Deletes secrets with the given keys. 286 | * @param {string[]} keys Array of keys of the secrets to delete. 287 | * @param {SecretServiceConfig=} config The configuration object. 288 | * Supported options: 289 | * 1. `storage`: the storage service to use: 290 | * - an instance of `UserProperties`, `DocumentProperties`, or `ScriptProperties`. 291 | * - a custom storage object: the secrets will be stored in the provided storage object. 292 | * 2. `prefix`: prefix applied to the secret key. Default: `secret_service_`. 293 | * @returns {void} 294 | */ 295 | function deleteSecrets(keys, config) { 296 | init(config).deleteSecrets(keys); 297 | } 298 | 299 | /** 300 | * Deletes all secrets in the storage. 301 | * @param {SecretServiceConfig=} config The configuration object. 302 | * Supported options: 303 | * 1. `storage`: the storage service to use: 304 | * - an instance of `UserProperties`, `DocumentProperties`, or `ScriptProperties`. 305 | * - a custom storage object: the secrets will be stored in the provided storage object. 306 | * 2. `prefix`: prefix applied to the secret key. Default: `secret_service_`. 307 | * @returns {void} 308 | */ 309 | function deleteAllSecrets(config) { 310 | init(config).deleteAllSecrets(); 311 | } 312 | 313 | // Export to allow unit testing 314 | if (typeof module === "object") { 315 | module.exports = { 316 | init, 317 | defaultConfig_, 318 | setSecret, 319 | getSecret, 320 | deleteSecrets, 321 | deleteAllSecrets, 322 | }; 323 | } 324 | -------------------------------------------------------------------------------- /src/appsscript.json: -------------------------------------------------------------------------------- 1 | { 2 | "timeZone": "America/New_York", 3 | "dependencies": {}, 4 | "exceptionLogging": "STACKDRIVER", 5 | "runtimeVersion": "V8" 6 | } -------------------------------------------------------------------------------- /src/package.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /tests/integration-tests.js: -------------------------------------------------------------------------------- 1 | // To be run from a real apps script 2 | 3 | const runTests = () => { 4 | testPropertiesStorage(); 5 | testCustomStorage(); 6 | testDirectUse(); 7 | }; 8 | 9 | const assertEqual = (value1, value2) => { 10 | if (value1 !== value2) 11 | throw `Values ${JSON.stringify(value1)} and ${JSON.stringify(value2)} are not equal`; 12 | }; 13 | 14 | const testCustomStorage = () => { 15 | class CustomStorageMock { 16 | constructor() { 17 | this.store = {}; 18 | } 19 | 20 | get(key, config) { 21 | const value = this.store[key]; 22 | if (value !== undefined) return value; 23 | return null; 24 | } 25 | 26 | set(key, value, config) { 27 | this.store[key] = value; 28 | } 29 | 30 | delete(key, config) { 31 | delete this.store[key]; 32 | } 33 | 34 | deleteAll(key, config) { 35 | this.store = {}; 36 | } 37 | } 38 | 39 | const SECRETS = SecretService.init({ 40 | storage: new CustomStorageMock(), 41 | }); 42 | 43 | SECRETS.deleteAllSecrets(); 44 | 45 | // Get non-existent secret 46 | assertEqual(SECRETS.getSecret("key"), null); 47 | 48 | // Get existing secret 49 | SECRETS.setSecret("key", "secret"); 50 | assertEqual(SECRETS.getSecret("key"), "secret"); 51 | 52 | // Delete secret 53 | SECRETS.setSecret("key1", "secret"); 54 | SECRETS.setSecret("key2", "secret"); 55 | SECRETS.deleteSecrets(["key1", "key2"]); 56 | assertEqual(SECRETS.getSecret("key1"), null); 57 | assertEqual(SECRETS.getSecret("key2"), null); 58 | 59 | // Test deleting all secrets 60 | SECRETS.setSecret("key1", "secret"); 61 | SECRETS.setSecret("key2", "secret"); 62 | SECRETS.setSecret("key3", "secret"); 63 | SECRETS.deleteAllSecrets(); 64 | assertEqual(SECRETS.getSecret("key1"), null); 65 | assertEqual(SECRETS.getSecret("key2"), null); 66 | assertEqual(SECRETS.getSecret("key3"), null); 67 | 68 | console.log("Passed: Custom storage"); 69 | }; 70 | 71 | // Test direct use 72 | const testDirectUse = () => { 73 | const config = { 74 | storage: PropertiesService.getScriptProperties(), 75 | }; 76 | 77 | SecretService.deleteAllSecrets(config); 78 | 79 | // Get non-existent secret 80 | assertEqual(SecretService.getSecret("key", config), null); 81 | 82 | // Get existing secret 83 | SecretService.setSecret("key", "secret", config); 84 | assertEqual(SecretService.getSecret("key", config), "secret"); 85 | // Check that it is stored in the ScriptProperties tied to the calling script 86 | assertEqual( 87 | PropertiesService.getScriptProperties().getProperty("secret_service_key"), 88 | "secret" 89 | ); 90 | 91 | // Delete secret 92 | SecretService.setSecret("key1", "secret", config); 93 | SecretService.setSecret("key2", "secret", config); 94 | SecretService.deleteSecrets(["key1", "key2"], config); 95 | assertEqual(SecretService.getSecret("key1", config), null); 96 | assertEqual(SecretService.getSecret("key2", config), null); 97 | 98 | // Test deleting all secrets 99 | SecretService.setSecret("key1", "secret", config); 100 | SecretService.setSecret("key2", "secret", config); 101 | SecretService.setSecret("key3", "secret", config); 102 | SecretService.deleteAllSecrets(config); 103 | assertEqual(SecretService.getSecret("key1", config), null); 104 | assertEqual(SecretService.getSecret("key2", config), null); 105 | assertEqual(SecretService.getSecret("key3", config), null); 106 | assertEqual(JSON.stringify(PropertiesService.getScriptProperties().getProperties()), "{}"); 107 | 108 | console.log("Passed: Direct use"); 109 | }; 110 | 111 | // Test with explicit properties storage 112 | const testPropertiesStorage = () => { 113 | const SECRETS = SecretService.init({ 114 | storage: PropertiesService.getScriptProperties(), 115 | }); 116 | 117 | SECRETS.deleteAllSecrets(); 118 | 119 | // Get non-existent secret 120 | assertEqual(SECRETS.getSecret("key"), null); 121 | 122 | // Get existing secret 123 | SECRETS.setSecret("key", "secret"); 124 | assertEqual(SECRETS.getSecret("key"), "secret"); 125 | // Check that it is stored in the ScriptProperties tied to the calling script 126 | assertEqual( 127 | PropertiesService.getScriptProperties().getProperty("secret_service_key"), 128 | "secret" 129 | ); 130 | 131 | // Delete secret 132 | SECRETS.setSecret("key1", "secret"); 133 | SECRETS.setSecret("key2", "secret"); 134 | SECRETS.deleteSecrets(["key1", "key2"]); 135 | assertEqual(SECRETS.getSecret("key1"), null); 136 | assertEqual(SECRETS.getSecret("key2"), null); 137 | 138 | // Test deleting all secrets 139 | SECRETS.setSecret("key1", "secret"); 140 | SECRETS.setSecret("key2", "secret"); 141 | SECRETS.setSecret("key3", "secret"); 142 | SECRETS.deleteAllSecrets(); 143 | assertEqual(SECRETS.getSecret("key1"), null); 144 | assertEqual(SECRETS.getSecret("key2"), null); 145 | assertEqual(SECRETS.getSecret("key3"), null); 146 | assertEqual(JSON.stringify(PropertiesService.getScriptProperties().getProperties()), "{}"); 147 | 148 | console.log("Passed: Explicit properties storage"); 149 | }; 150 | -------------------------------------------------------------------------------- /tests/mocks/PropertiesInstance.js: -------------------------------------------------------------------------------- 1 | const setPropertyMock = jest.fn(); 2 | const getPropertyMock = jest.fn(() => null); 3 | const deletePropertyMock = jest.fn(); 4 | const getPropertiesMock = jest.fn(() => ({})); 5 | 6 | const PropertiesInstanceMock = { 7 | setProperty: setPropertyMock, 8 | getProperty: getPropertyMock, 9 | deleteProperty: deletePropertyMock, 10 | getProperties: getPropertiesMock, 11 | 12 | reset: () => { 13 | setPropertyMock.mockClear(); 14 | getPropertyMock.mockClear(); 15 | deletePropertyMock.mockClear(); 16 | getPropertiesMock.mockClear(); 17 | }, 18 | }; 19 | 20 | module.exports = PropertiesInstanceMock; 21 | -------------------------------------------------------------------------------- /tests/mocks/SpreadsheetApp.js: -------------------------------------------------------------------------------- 1 | const okButton = "OK"; 2 | const cancelButton = "CANCEL"; 3 | const okCancelButtonSet = "OK_CANCEL"; 4 | 5 | const uiPromptMock = jest.fn(() => ({ getSelectedButton: () => cancelButton })); 6 | 7 | const SpreadsheetAppMock = { 8 | getUi: () => ({ 9 | prompt: uiPromptMock, 10 | ButtonSet: { OK_CANCEL: okCancelButtonSet }, 11 | Button: { OK: okButton, CANCEL: cancelButton }, 12 | }), 13 | }; 14 | 15 | module.exports = { 16 | mock: SpreadsheetAppMock, 17 | uiPromptMock, 18 | okButton, 19 | cancelButton, 20 | okCancelButtonSet, 21 | reset: function () { 22 | this.uiPromptMock.mockClear(); 23 | }, 24 | } -------------------------------------------------------------------------------- /tests/mocks/Storage.js: -------------------------------------------------------------------------------- 1 | const setMock = jest.fn(); 2 | const getMock = jest.fn(() => null); 3 | const deleteMock = jest.fn(); 4 | const deleteAllMock = jest.fn(() => ({})); 5 | 6 | const StorageMock = { 7 | set: setMock, 8 | get: getMock, 9 | delete: deleteMock, 10 | deleteAll: deleteAllMock, 11 | 12 | reset: () => { 13 | setMock.mockClear(); 14 | getMock.mockClear(); 15 | deleteMock.mockClear(); 16 | deleteAllMock.mockClear(); 17 | }, 18 | }; 19 | 20 | module.exports = StorageMock; 21 | -------------------------------------------------------------------------------- /tests/test.js: -------------------------------------------------------------------------------- 1 | const SecretService = require("../src/SecretService"); 2 | const StorageMock = require("./mocks/Storage"); 3 | const SpreadsheetAppMock = require("./mocks/SpreadsheetApp"); 4 | const PropertiesInstanceMock = require("./mocks/PropertiesInstance"); 5 | 6 | describe("Direct use without initialization", () => { 7 | beforeEach(() => { 8 | PropertiesInstanceMock.reset(); 9 | }); 10 | 11 | it("setSecret() with the default prefix", () => { 12 | SecretService.setSecret("key", "value", { storage: PropertiesInstanceMock }); 13 | expect(PropertiesInstanceMock.setProperty).toHaveBeenCalledTimes(1); 14 | expect(PropertiesInstanceMock.setProperty).toHaveBeenCalledWith( 15 | "secret_service_key", 16 | "value" 17 | ); 18 | }); 19 | 20 | it("setSecret() with a custom prefix", () => { 21 | SecretService.setSecret("key", "value", { 22 | prefix: "custom_prefix_", 23 | storage: PropertiesInstanceMock, 24 | }); 25 | expect(PropertiesInstanceMock.setProperty).toHaveBeenCalledTimes(1); 26 | expect(PropertiesInstanceMock.setProperty).toHaveBeenCalledWith( 27 | "custom_prefix_key", 28 | "value" 29 | ); 30 | }); 31 | 32 | it("getSecret() with the default prefix", () => { 33 | PropertiesInstanceMock.getProperty.mockReturnValueOnce("value"); 34 | expect(SecretService.getSecret("key", { storage: PropertiesInstanceMock })).toBe("value"); 35 | expect(PropertiesInstanceMock.getProperty).toHaveBeenCalledTimes(1); 36 | expect(PropertiesInstanceMock.getProperty).toHaveBeenCalledWith("secret_service_key"); 37 | }); 38 | 39 | it("getSecret() with a custom prefix", () => { 40 | PropertiesInstanceMock.getProperty.mockReturnValueOnce("value"); 41 | expect( 42 | SecretService.getSecret("key", { 43 | prefix: "custom_prefix_", 44 | storage: PropertiesInstanceMock, 45 | }) 46 | ).toBe("value"); 47 | expect(PropertiesInstanceMock.getProperty).toHaveBeenCalledTimes(1); 48 | expect(PropertiesInstanceMock.getProperty).toHaveBeenCalledWith("custom_prefix_key"); 49 | }); 50 | 51 | it("deleteSecrets() with the default prefix", () => { 52 | SecretService.deleteSecrets(["key"], { storage: PropertiesInstanceMock }); 53 | expect(PropertiesInstanceMock.deleteProperty).toHaveBeenCalledTimes(1); 54 | expect(PropertiesInstanceMock.deleteProperty).toHaveBeenCalledWith("secret_service_key"); 55 | }); 56 | 57 | it("deleteSecrets() with a custom prefix", () => { 58 | SecretService.deleteSecrets(["key"], { 59 | storage: PropertiesInstanceMock, 60 | prefix: "custom_prefix_", 61 | }); 62 | expect(PropertiesInstanceMock.deleteProperty).toHaveBeenCalledTimes(1); 63 | expect(PropertiesInstanceMock.deleteProperty).toHaveBeenCalledWith("custom_prefix_key"); 64 | }); 65 | 66 | it("deleteAllSecrets() without secrets to delete", () => { 67 | SecretService.deleteAllSecrets({ storage: PropertiesInstanceMock }); 68 | expect(PropertiesInstanceMock.getProperties).toHaveBeenCalledTimes(1); 69 | expect(PropertiesInstanceMock.deleteProperty).toHaveBeenCalledTimes(0); 70 | }); 71 | 72 | it("deleteAllSecrets() with secrets to delete and the default prefix", () => { 73 | PropertiesInstanceMock.getProperties.mockReturnValueOnce({ 74 | secret_service_key1: "value1", 75 | secret_service_key2: "value2", 76 | }); 77 | SecretService.deleteAllSecrets({ storage: PropertiesInstanceMock }); 78 | expect(PropertiesInstanceMock.getProperties).toHaveBeenCalledTimes(1); 79 | expect(PropertiesInstanceMock.deleteProperty).toHaveBeenCalledTimes(2); 80 | expect(PropertiesInstanceMock.deleteProperty).toHaveBeenNthCalledWith( 81 | 1, 82 | "secret_service_key1" 83 | ); 84 | expect(PropertiesInstanceMock.deleteProperty).toHaveBeenNthCalledWith( 85 | 2, 86 | "secret_service_key2" 87 | ); 88 | }); 89 | 90 | it("deleteAllSecrets() with secrets to delete and the custom prefix", () => { 91 | PropertiesInstanceMock.getProperties.mockReturnValueOnce({ 92 | custom_prefix_key1: "value1", 93 | custom_prefix_key2: "value2", 94 | }); 95 | SecretService.deleteAllSecrets({ 96 | prefix: "custom_prefix_", 97 | storage: PropertiesInstanceMock, 98 | }); 99 | expect(PropertiesInstanceMock.getProperties).toHaveBeenCalledTimes(1); 100 | expect(PropertiesInstanceMock.deleteProperty).toHaveBeenCalledTimes(2); 101 | expect(PropertiesInstanceMock.deleteProperty).toHaveBeenNthCalledWith( 102 | 1, 103 | "custom_prefix_key1" 104 | ); 105 | expect(PropertiesInstanceMock.deleteProperty).toHaveBeenNthCalledWith( 106 | 2, 107 | "custom_prefix_key2" 108 | ); 109 | }); 110 | }); 111 | 112 | describe("External PropertiesService storage", () => { 113 | beforeEach(() => { 114 | PropertiesInstanceMock.reset(); 115 | }); 116 | 117 | it("setSecret() with the default prefix", () => { 118 | const service = SecretService.init({ storage: PropertiesInstanceMock }); 119 | service.setSecret("key", "value"); 120 | expect(PropertiesInstanceMock.setProperty).toHaveBeenCalledTimes(1); 121 | expect(PropertiesInstanceMock.setProperty).toHaveBeenCalledWith( 122 | "secret_service_key", 123 | "value" 124 | ); 125 | }); 126 | 127 | it("setSecret() with a custom prefix", () => { 128 | const service = SecretService.init({ 129 | prefix: "custom_prefix_", 130 | storage: PropertiesInstanceMock, 131 | }); 132 | service.setSecret("key", "value"); 133 | expect(PropertiesInstanceMock.setProperty).toHaveBeenCalledTimes(1); 134 | expect(PropertiesInstanceMock.setProperty).toHaveBeenCalledWith( 135 | "custom_prefix_key", 136 | "value" 137 | ); 138 | }); 139 | 140 | it("getSecret() with the default prefix", () => { 141 | PropertiesInstanceMock.getProperty.mockReturnValueOnce("value"); 142 | const service = SecretService.init({ storage: PropertiesInstanceMock }); 143 | expect(service.getSecret("key")).toBe("value"); 144 | expect(PropertiesInstanceMock.getProperty).toHaveBeenCalledTimes(1); 145 | expect(PropertiesInstanceMock.getProperty).toHaveBeenCalledWith("secret_service_key"); 146 | }); 147 | 148 | it("getSecret() with a custom prefix", () => { 149 | PropertiesInstanceMock.getProperty.mockReturnValueOnce("value"); 150 | const service = SecretService.init({ 151 | prefix: "custom_prefix_", 152 | storage: PropertiesInstanceMock, 153 | }); 154 | expect(service.getSecret("key")).toBe("value"); 155 | expect(PropertiesInstanceMock.getProperty).toHaveBeenCalledTimes(1); 156 | expect(PropertiesInstanceMock.getProperty).toHaveBeenCalledWith("custom_prefix_key"); 157 | }); 158 | 159 | it("deleteSecrets() with the default prefix", () => { 160 | const service = SecretService.init({ storage: PropertiesInstanceMock }); 161 | service.deleteSecrets(["key"]); 162 | expect(PropertiesInstanceMock.deleteProperty).toHaveBeenCalledTimes(1); 163 | expect(PropertiesInstanceMock.deleteProperty).toHaveBeenCalledWith("secret_service_key"); 164 | }); 165 | 166 | it("deleteSecrets() with a custom prefix", () => { 167 | const service = SecretService.init({ 168 | storage: PropertiesInstanceMock, 169 | prefix: "custom_prefix_", 170 | }); 171 | service.deleteSecrets(["key"]); 172 | expect(PropertiesInstanceMock.deleteProperty).toHaveBeenCalledTimes(1); 173 | expect(PropertiesInstanceMock.deleteProperty).toHaveBeenCalledWith("custom_prefix_key"); 174 | }); 175 | 176 | it("deleteAllSecrets() without secrets to delete", () => { 177 | const service = SecretService.init({ storage: PropertiesInstanceMock }); 178 | service.deleteAllSecrets(); 179 | expect(PropertiesInstanceMock.getProperties).toHaveBeenCalledTimes(1); 180 | expect(PropertiesInstanceMock.deleteProperty).toHaveBeenCalledTimes(0); 181 | }); 182 | 183 | it("deleteAllSecrets() with secrets to delete and the default prefix", () => { 184 | PropertiesInstanceMock.getProperties.mockReturnValueOnce({ 185 | secret_service_key1: "value1", 186 | secret_service_key2: "value2", 187 | }); 188 | const service = SecretService.init({ storage: PropertiesInstanceMock }); 189 | service.deleteAllSecrets(); 190 | expect(PropertiesInstanceMock.getProperties).toHaveBeenCalledTimes(1); 191 | expect(PropertiesInstanceMock.deleteProperty).toHaveBeenCalledTimes(2); 192 | expect(PropertiesInstanceMock.deleteProperty).toHaveBeenNthCalledWith( 193 | 1, 194 | "secret_service_key1" 195 | ); 196 | expect(PropertiesInstanceMock.deleteProperty).toHaveBeenNthCalledWith( 197 | 2, 198 | "secret_service_key2" 199 | ); 200 | }); 201 | 202 | it("deleteAllSecrets() with secrets to delete and the custom prefix", () => { 203 | PropertiesInstanceMock.getProperties.mockReturnValueOnce({ 204 | custom_prefix_key1: "value1", 205 | custom_prefix_key2: "value2", 206 | }); 207 | const service = SecretService.init({ 208 | prefix: "custom_prefix_", 209 | storage: PropertiesInstanceMock, 210 | }); 211 | service.deleteAllSecrets(); 212 | expect(PropertiesInstanceMock.getProperties).toHaveBeenCalledTimes(1); 213 | expect(PropertiesInstanceMock.deleteProperty).toHaveBeenCalledTimes(2); 214 | expect(PropertiesInstanceMock.deleteProperty).toHaveBeenNthCalledWith( 215 | 1, 216 | "custom_prefix_key1" 217 | ); 218 | expect(PropertiesInstanceMock.deleteProperty).toHaveBeenNthCalledWith( 219 | 2, 220 | "custom_prefix_key2" 221 | ); 222 | }); 223 | }); 224 | 225 | describe("Custom external storage object", () => { 226 | beforeEach(() => { 227 | StorageMock.reset(); 228 | }); 229 | 230 | it("setSecret()", () => { 231 | const service = SecretService.init({ storage: StorageMock }); 232 | service.setSecret("key", "value"); 233 | expect(StorageMock.set).toHaveBeenCalledTimes(1); 234 | expect(StorageMock.set).toHaveBeenCalledWith("key", "value", service.config_); 235 | }); 236 | 237 | it("getSecret()", () => { 238 | StorageMock.get.mockReturnValueOnce("value"); 239 | const service = SecretService.init({ storage: StorageMock }); 240 | expect(service.getSecret("key")).toBe("value"); 241 | expect(StorageMock.get).toHaveBeenCalledTimes(1); 242 | expect(StorageMock.get).toHaveBeenCalledWith("key", service.config_); 243 | }); 244 | 245 | it("deleteSecrets()", () => { 246 | const service = SecretService.init({ storage: StorageMock }); 247 | service.deleteSecrets(["key"]); 248 | expect(StorageMock.delete).toHaveBeenCalledTimes(1); 249 | expect(StorageMock.delete).toHaveBeenCalledWith("key", service.config_); 250 | }); 251 | 252 | it("deleteAllSecrets()", () => { 253 | const service = SecretService.init({ storage: StorageMock }); 254 | service.deleteAllSecrets(); 255 | expect(StorageMock.deleteAll).toHaveBeenCalledTimes(1); 256 | expect(StorageMock.deleteAll).toHaveBeenCalledWith(service.config_); 257 | }); 258 | }); 259 | 260 | describe("Strict mode", () => { 261 | beforeEach(() => { 262 | PropertiesInstanceMock.reset(); 263 | SpreadsheetAppMock.reset(); 264 | }); 265 | 266 | it("getSecret() with missing secret", () => { 267 | PropertiesInstanceMock.getProperty.mockReturnValueOnce(null); 268 | const service = SecretService.init({ 269 | mode: "strict", 270 | storage: PropertiesInstanceMock, 271 | scriptContainer: SpreadsheetAppMock.mock, 272 | }); 273 | expect(() => service.getSecret("key")).toThrow("Secret not found: key"); 274 | expect(PropertiesInstanceMock.getProperty).toHaveBeenCalledTimes(1); 275 | expect(PropertiesInstanceMock.getProperty).toHaveBeenCalledWith("secret_service_key"); 276 | }); 277 | 278 | it("getSecret() with an existing secret", () => { 279 | PropertiesInstanceMock.getProperty.mockReturnValueOnce("secret"); 280 | const service = SecretService.init({ 281 | storage: PropertiesInstanceMock, 282 | mode: "strict", 283 | }); 284 | expect(service.getSecret("key")).toBe("secret"); 285 | expect(PropertiesInstanceMock.getProperty).toHaveBeenCalledTimes(1); 286 | expect(PropertiesInstanceMock.getProperty).toHaveBeenCalledWith("secret_service_key"); 287 | }); 288 | }); 289 | 290 | describe("Interactive mode", () => { 291 | beforeEach(() => { 292 | PropertiesInstanceMock.reset(); 293 | SpreadsheetAppMock.reset(); 294 | }); 295 | 296 | it("getSecret() in interactive mode for a missing secret and user aborted", () => { 297 | PropertiesInstanceMock.getProperty.mockReturnValueOnce(null); 298 | const service = SecretService.init({ 299 | mode: "interactive", 300 | storage: PropertiesInstanceMock, 301 | scriptContainer: SpreadsheetAppMock.mock, 302 | }); 303 | expect(() => service.getSecret("key")).toThrow( 304 | "User has not entered the secret key, aborting." 305 | ); 306 | expect(PropertiesInstanceMock.getProperty).toHaveBeenCalledTimes(1); 307 | expect(PropertiesInstanceMock.getProperty).toHaveBeenCalledWith("secret_service_key"); 308 | expect(SpreadsheetAppMock.uiPromptMock).toHaveBeenCalledTimes(1); 309 | expect(SpreadsheetAppMock.uiPromptMock).toHaveBeenCalledWith( 310 | "Secrets Management", 311 | "Please enter key", 312 | SpreadsheetAppMock.okCancelButtonSet 313 | ); 314 | }); 315 | 316 | it("getSecret() without a script container", () => { 317 | PropertiesInstanceMock.getProperty.mockReturnValueOnce(null); 318 | const service = SecretService.init({ 319 | storage: PropertiesInstanceMock, 320 | mode: "interactive", 321 | }); 322 | expect(() => service.getSecret("key")).toThrow( 323 | "Script container is required for interactive mode" 324 | ); 325 | expect(PropertiesInstanceMock.getProperty).toHaveBeenCalledTimes(0); 326 | expect(SpreadsheetAppMock.uiPromptMock).toHaveBeenCalledTimes(0); 327 | }); 328 | 329 | it("getSecret() for a missing secret and user provided the secret", () => { 330 | PropertiesInstanceMock.getProperty.mockReturnValueOnce(null); 331 | const secret = "secret"; 332 | const service = SecretService.init({ 333 | storage: PropertiesInstanceMock, 334 | mode: "interactive", 335 | scriptContainer: SpreadsheetAppMock.mock, 336 | }); 337 | SpreadsheetAppMock.uiPromptMock.mockReturnValueOnce({ 338 | getSelectedButton: () => SpreadsheetAppMock.okButton, 339 | getResponseText: () => secret, 340 | }); 341 | expect(service.getSecret("key")).toBe(secret); 342 | expect(PropertiesInstanceMock.getProperty).toHaveBeenCalledTimes(1); 343 | expect(PropertiesInstanceMock.getProperty).toHaveBeenCalledWith("secret_service_key"); 344 | expect(PropertiesInstanceMock.setProperty).toHaveBeenCalledTimes(1); 345 | expect(PropertiesInstanceMock.setProperty).toHaveBeenCalledWith( 346 | "secret_service_key", 347 | secret 348 | ); 349 | expect(SpreadsheetAppMock.uiPromptMock).toHaveBeenCalledTimes(1); 350 | expect(SpreadsheetAppMock.uiPromptMock).toHaveBeenCalledWith( 351 | "Secrets Management", 352 | "Please enter key", 353 | SpreadsheetAppMock.okCancelButtonSet 354 | ); 355 | }); 356 | }); 357 | --------------------------------------------------------------------------------