├── .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 |

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 |

192 |
193 |
194 | If the user clicks `Cancel` or closes the prompt, SecretService will throw an error.
195 |
196 |
197 |

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 |
--------------------------------------------------------------------------------