diff --git a/.eslintrc.js b/.eslintrc.js
new file mode 100644
index 000000000..60f0e7a35
--- /dev/null
+++ b/.eslintrc.js
@@ -0,0 +1,10 @@
+module.exports = {
+ parser: '@typescript-eslint/parser',
+ plugins: ['@typescript-eslint', 'unused-imports', 'prettier'],
+ rules: {
+ 'no-unused-vars': 'off',
+ 'prettier/prettier': 'error',
+ 'unused-imports/no-unused-imports': 'error',
+ },
+ root: true,
+};
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 000000000..14ec4464c
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,3 @@
+node_modules
+yarn-error.log
+dist
diff --git a/.npmignore b/.npmignore
new file mode 100644
index 000000000..93cab344d
--- /dev/null
+++ b/.npmignore
@@ -0,0 +1,2 @@
+node_modules
+yarn-error.log
diff --git a/.prettierignore b/.prettierignore
new file mode 100644
index 000000000..1b763b1ba
--- /dev/null
+++ b/.prettierignore
@@ -0,0 +1 @@
+CHANGELOG.md
diff --git a/.prettierrc b/.prettierrc
new file mode 100644
index 000000000..6f72f437c
--- /dev/null
+++ b/.prettierrc
@@ -0,0 +1,6 @@
+{
+ "arrowParens": "always",
+ "trailingComma": "all",
+ "singleQuote": true,
+ "printWidth": 110
+}
diff --git a/.stats.yml b/.stats.yml
new file mode 100644
index 000000000..f1c795f81
--- /dev/null
+++ b/.stats.yml
@@ -0,0 +1 @@
+configured_endpoints: 25
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 000000000..7b1b36a64
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,201 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright 2023 OpenAI
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/README.md b/README.md
new file mode 100644
index 000000000..2f9dd2abf
--- /dev/null
+++ b/README.md
@@ -0,0 +1,223 @@
+# OpenAI Node API Library
+
+[![NPM version](https://img.shields.io/npm/v/openai.svg)](https://npmjs.org/package/openai)
+
+The OpenAI Node library provides convenient access to the OpenAI REST API from applications written in server-side JavaScript.
+It includes TypeScript definitions for all request params and response fields.
+
+> ⚠️ **Important note: this library is meant for server-side usage only, as using it in client-side browser code will expose your secret API key. [See here](https://platform.openai.com/docs/api-reference/authentication) for more details.**
+
+## Documentation
+
+To learn how to use the OpenAI API, check out our [API Reference](https://platform.openai.com/docs/api-reference) and [Documentation](https://platform.openai.com/docs).
+
+## Installation
+
+```sh
+npm install --save openai
+# or
+yarn add openai
+```
+
+## Usage
+
+```js
+import OpenAI from 'openai';
+
+const openAI = new OpenAI({
+ apiKey: 'my api key', // defaults to process.env["OPENAI_API_KEY"]
+});
+
+async function main() {
+ const completion = await openAI.completions.create({
+ model: 'text-davinci-002',
+ prompt: 'Say this is a test',
+ max_tokens: 6,
+ temperature: 0,
+ });
+
+ console.log(completion.choices);
+}
+main().catch(console.error);
+```
+
+## Streaming Responses
+
+We provide support for streaming responses using Server Side Events (SSE).
+
+```ts
+import OpenAI from 'openai';
+
+const client = new OpenAI();
+
+const stream = await client.completions.create({
+ prompt: 'Say this is a test',
+ model: 'text-davinci-003',
+ stream: true,
+});
+for await (const part of stream) {
+ process.stdout.write(part.choices[0]?.text || '');
+}
+```
+
+If you need to cancel a stream, you can `break` from the loop
+or call `stream.controller.abort()`.
+
+### Usage with TypeScript
+
+Importing, instantiating, and interacting with the library are the same as above.
+If you like, you may reference our types directly:
+
+```ts
+import OpenAI from 'openai';
+
+const openAI = new OpenAI({
+ apiKey: 'my api key', // defaults to process.env["OPENAI_API_KEY"]
+});
+
+async function main() {
+ const params: OpenAI.CompletionCreateParams = {
+ model: 'text-davinci-002',
+ prompt: 'Say this is a test',
+ max_tokens: 6,
+ temperature: 0,
+ };
+ const completion: OpenAI.Completion = await openAI.completions.create(params);
+}
+main().catch(console.error);
+```
+
+Documentation for each method, request param, and response field are available in docstrings and will appear on hover in most modern editors.
+
+## File Uploads
+
+Request parameters that correspond to file uploads can be passed as either a `FormData.Blob` or a `FormData.File` instance.
+
+We provide a `fileFromPath` helper function to easily create `FormData.File` instances from a given class.
+
+```ts
+import OpenAI, { fileFromPath } from 'openai';
+
+const openAI = new OpenAI();
+
+const file = await fileFromPath('input.jsonl');
+await openAI.files.create({ file: file, purpose: 'fine-tune' });
+```
+
+## Handling errors
+
+When the library is unable to connect to the API,
+or if the API returns a non-success status code (i.e., 4xx or 5xx response),
+a subclass of `APIError` will be thrown:
+
+```ts
+async function main() {
+ const fineTune = await openAI.fineTunes
+ .create({ training_file: 'file-XGinujblHPwGLSztz8cPS8XY' })
+ .catch((err) => {
+ if (err instanceof OpenAI.APIError) {
+ console.log(err.status); // 400
+ console.log(err.name); // BadRequestError
+
+ console.log(err.headers); // {server: 'nginx', ...}
+ }
+ });
+}
+main().catch(console.error);
+```
+
+Error codes are as followed:
+
+| Status Code | Error Type |
+| ----------- | -------------------------- |
+| 400 | `BadRequestError` |
+| 401 | `AuthenticationError` |
+| 403 | `PermissionDeniedError` |
+| 404 | `NotFoundError` |
+| 422 | `UnprocessableEntityError` |
+| 429 | `RateLimitError` |
+| >=500 | `InternalServerError` |
+| N/A | `APIConnectionError` |
+
+### Retries
+
+Certain errors will be automatically retried 2 times by default, with a short exponential backoff.
+Connection errors (for example, due to a network connectivity problem), 409 Conflict, 429 Rate Limit,
+and >=500 Internal errors will all be retried by default.
+
+You can use the `maxRetries` option to configure or disable this:
+
+
+```js
+// Configure the default for all requests:
+const openAI = new OpenAI({
+ maxRetries: 0, // default is 2
+});
+
+// Or, configure per-request:
+openAI.embeddings.create({ model: 'text-similarity-babbage-001',input: 'The food was delicious and the waiter...' }, {
+ maxRetries: 5,
+});
+```
+
+### Timeouts
+
+Requests time out after 60 seconds by default. You can configure this with a `timeout` option:
+
+
+```ts
+// Configure the default for all requests:
+const openAI = new OpenAI({
+ timeout: 20 * 1000, // 20 seconds (default is 60s)
+});
+
+// Override per-request:
+openAI.edits.create({ model: 'text-davinci-edit-001',input: 'What day of the wek is it?',instruction: 'Fix the spelling mistakes' }, {
+ timeout: 5 * 1000,
+});
+```
+
+On timeout, an `APIConnectionTimeoutError` is thrown.
+
+Note that requests which time out will be [retried twice by default](#retries).
+
+## Configuring an HTTP(S) Agent (e.g., for proxies)
+
+By default, this library uses a stable agent for all http/https requests to reuse TCP connections, eliminating many TCP & TLS handshakes and shaving around 100ms off most requests.
+
+If you would like to disable or customize this behavior, for example to use the API behind a proxy, you can pass an `httpAgent` which is used for all requests (be they http or https), for example:
+
+
+```ts
+import http from 'http';
+import HttpsProxyAgent from 'https-proxy-agent';
+
+// Configure the default for all requests:
+const openAI = new OpenAI({
+ httpAgent: new HttpsProxyAgent(process.env.PROXY_URL),
+});
+
+// Override per-request:
+openAI.models.list({
+ baseURL: 'http://localhost:8080/test-api',
+ httpAgent: new http.Agent({ keepAlive: false }),
+})
+```
+
+## Status
+
+This package is in beta. Its internals and interfaces are not stable
+and subject to change without a major semver bump;
+please reach out if you rely on any undocumented behavior.
+
+We are keen for your feedback; please open an [issue](https://www.github.com/openai/openai-node/issues) with questions, bugs, or suggestions.
+
+## Requirements
+
+The following runtimes are supported:
+
+- Node.js version 12 or higher.
+- Deno v1.28.0 or higher (experimental).
+ Use `import OpenAI from "npm:openai"`.
+
+If you are interested in other runtime environments, please open or upvote an issue on GitHub.
diff --git a/api.md b/api.md
new file mode 100644
index 000000000..83790ac31
--- /dev/null
+++ b/api.md
@@ -0,0 +1,157 @@
+# Completions
+
+Models:
+
+- Completion
+- CompletionChoice
+
+Methods:
+
+- client.completions.create({ ...params }) -> Completion
+
+# Chat
+
+## Completions
+
+Models:
+
+- ChatCompletion
+- ChatCompletionEvent
+
+Methods:
+
+- client.chat.completions.create({ ...params }) -> ChatCompletion
+
+# Edits
+
+Models:
+
+- Edit
+
+Methods:
+
+- client.edits.create({ ...params }) -> Edit
+
+# Embeddings
+
+Models:
+
+- Embedding
+
+Methods:
+
+- client.embeddings.create({ ...params }) -> Embedding
+
+# Files
+
+Models:
+
+- File
+- FileListResponse
+- FileDeleteResponse
+- FileRetrieveFileContentResponse
+
+Methods:
+
+- client.files.create({ ...params }) -> File
+- client.files.retrieve(fileId) -> File
+- client.files.list() -> FileListResponse
+- client.files.del(fileId) -> FileDeleteResponse
+- client.files.retrieveFileContent(fileId) -> Promise
+
+# Images
+
+Models:
+
+- Image
+- ImagesResponse
+
+Methods:
+
+- client.images.createVariation({ ...params }) -> ImagesResponse
+- client.images.edit({ ...params }) -> ImagesResponse
+- client.images.generate({ ...params }) -> ImagesResponse
+
+# Audio
+
+## Transcriptions
+
+Models:
+
+- Transcription
+
+Methods:
+
+- client.audio.transcriptions.create({ ...params }) -> Transcription
+
+## Translations
+
+Models:
+
+- Translation
+
+Methods:
+
+- client.audio.translations.create({ ...params }) -> Translation
+
+# Answers
+
+Models:
+
+- AnswerCreateResponse
+
+Methods:
+
+- client.answers.create({ ...params }) -> AnswerCreateResponse
+
+# Classifications
+
+Models:
+
+- ClassificationCreateResponse
+
+Methods:
+
+- client.classifications.create({ ...params }) -> ClassificationCreateResponse
+
+# Moderations
+
+Models:
+
+- Moderation
+- ModerationCreateResponse
+
+Methods:
+
+- client.moderations.create({ ...params }) -> ModerationCreateResponse
+
+# Models
+
+Models:
+
+- DeleteModelResponse
+- ListModelsResponse
+- Model
+
+Methods:
+
+- client.models.retrieve(model) -> Model
+- client.models.list() -> ListModelsResponse
+- client.models.del(model) -> DeleteModelResponse
+
+# FineTunes
+
+Models:
+
+- FineTune
+- FineTuneEvent
+- ListFineTuneEventsResponse
+- ListFineTunesResponse
+
+Methods:
+
+- client.fineTunes.create({ ...params }) -> FineTune
+- client.fineTunes.retrieve(fineTuneId) -> FineTune
+- client.fineTunes.list() -> ListFineTunesResponse
+- client.fineTunes.cancel(fineTuneId) -> FineTune
+- client.fineTunes.listEvents(fineTuneId, { ...params }) -> ListFineTuneEventsResponse
diff --git a/bin/check-test-server b/bin/check-test-server
new file mode 100755
index 000000000..34efa9dac
--- /dev/null
+++ b/bin/check-test-server
@@ -0,0 +1,50 @@
+#!/usr/bin/env bash
+
+RED='\033[0;31m'
+GREEN='\033[0;32m'
+YELLOW='\033[0;33m'
+NC='\033[0m' # No Color
+
+function prism_is_running() {
+ curl --silent "http://localhost:4010" >/dev/null 2>&1
+}
+
+function is_overriding_api_base_url() {
+ [ -n "$API_BASE_URL" ]
+}
+
+if is_overriding_api_base_url ; then
+ # If someone is running the tests against the live API, we can trust they know
+ # what they're doing and exit early.
+ echo -e "${GREEN}✔ Running tests against ${API_BASE_URL}${NC}"
+
+ exit 0
+elif prism_is_running ; then
+ echo -e "${GREEN}✔ Mock prism server is running with your OpenAPI spec${NC}"
+ echo
+
+ exit 0
+else
+ echo -e "${RED}ERROR:${NC} The test suite will not run without a mock Prism server"
+ echo -e "running against your OpenAPI spec."
+ echo
+ echo -e "${YELLOW}To fix:${NC}"
+ echo
+ echo -e "1. Install Prism (requires Node 16+):"
+ echo
+ echo -e " With npm:"
+ echo -e " \$ ${YELLOW}npm install -g @stoplight/prism-cli${NC}"
+ echo
+ echo -e " With yarn:"
+ echo -e " \$ ${YELLOW}yarn global add @stoplight/prism-cli${NC}"
+ echo
+ echo -e "2. Run the mock server"
+ echo
+ echo -e " To run the server, pass in the path of your OpenAPI"
+ echo -e " spec to the prism command:"
+ echo
+ echo -e " \$ ${YELLOW}prism mock path/to/your.openapi.yml${NC}"
+ echo
+
+ exit 1
+fi
diff --git a/build b/build
new file mode 100755
index 000000000..f49e6fa6e
--- /dev/null
+++ b/build
@@ -0,0 +1,12 @@
+#!/usr/bin/env bash
+set -euo pipefail
+
+rm -rf dist/*
+
+yarn tsn check-version.ts
+
+# build node:
+yarn tsc -p tsconfig.cjs.json
+yarn tsc-alias -p tsconfig.cjs.json
+
+yarn prettier --write .
diff --git a/check-version.ts b/check-version.ts
new file mode 100644
index 000000000..8bbd6a96b
--- /dev/null
+++ b/check-version.ts
@@ -0,0 +1,18 @@
+import fs from 'fs';
+
+const main = () => {
+ const pkg = JSON.parse(fs.readFileSync('package.json').toString()) as Record;
+ const version = pkg['version'];
+ if (!version) throw 'The version property is not set in the package.json file';
+ if (typeof version !== 'string') {
+ throw `Unexpected type for the package.json version field; got ${typeof version}, expected string`;
+ }
+
+ const contents = fs.readFileSync('version.ts', 'utf8');
+ const output = contents.replace(/(export const VERSION = ')(.*)(')/g, `$1${version}$3`);
+ fs.writeFileSync('version.ts', output);
+};
+
+if (require.main === module) {
+ main();
+}
diff --git a/core.ts b/core.ts
new file mode 100644
index 000000000..f7d033740
--- /dev/null
+++ b/core.ts
@@ -0,0 +1,814 @@
+import qs from 'qs';
+
+import type { Agent } from 'http';
+import type { RequestInfo, RequestInit, Response } from 'node-fetch';
+import { FormData, File, Blob } from 'formdata-node';
+import { FormDataEncoder } from 'form-data-encoder';
+import { Readable } from 'stream';
+
+import { VERSION } from './version';
+import { Stream } from './streaming';
+import { APIError, APIConnectionError, APIConnectionTimeoutError } from './error';
+import { Fetch, getDefaultAgent, getFetch } from './fetch-polyfill';
+
+const MAX_RETRIES = 2;
+
+export abstract class APIClient {
+ baseURL: string;
+ maxRetries: number;
+ timeout: number;
+ httpAgent: Agent | undefined;
+
+ private fetch: Fetch;
+ protected idempotencyHeader?: string;
+
+ constructor({
+ baseURL,
+ maxRetries,
+ timeout = 60 * 1000, // 60s
+ httpAgent,
+ }: {
+ baseURL: string;
+ maxRetries?: number | undefined;
+ timeout: number | undefined;
+ httpAgent: Agent | undefined;
+ }) {
+ this.baseURL = baseURL;
+ this.maxRetries = validatePositiveInteger('maxRetries', maxRetries ?? MAX_RETRIES);
+ this.timeout = validatePositiveInteger('timeout', timeout);
+ this.httpAgent = httpAgent;
+
+ this.fetch = getFetch();
+ }
+
+ protected authHeaders(): Headers {
+ return {};
+ }
+
+ /**
+ * Override this to add your own default headers, for example:
+ *
+ * {
+ * ...super.defaultHeaders(),
+ * Authorization: 'Bearer 123',
+ * }
+ */
+ protected defaultHeaders(): Headers {
+ return {
+ Accept: 'application/json',
+ 'Content-Type': 'application/json',
+ 'User-Agent': this.getUserAgent(),
+ ...getPlatformHeaders(),
+ ...this.authHeaders(),
+ };
+ }
+
+ /**
+ * Override this to add your own headers validation:
+ */
+ protected validateHeaders(headers: Headers, customHeaders: Headers) {}
+
+ /**
+ * Override this to add your own qs.stringify options, for example:
+ *
+ * {
+ * ...super.qsOptions(),
+ * strictNullHandling: true,
+ * }
+ */
+ protected qsOptions(): qs.IStringifyOptions | undefined {
+ return {};
+ }
+
+ protected defaultIdempotencyKey(): string {
+ return `stainless-node-retry-${uuid4()}`;
+ }
+
+ get(path: string, opts?: RequestOptions): Promise {
+ return this.request({ method: 'get', path, ...opts });
+ }
+ post(path: string, opts?: RequestOptions): Promise {
+ return this.request({ method: 'post', path, ...opts });
+ }
+ patch(path: string, opts?: RequestOptions): Promise {
+ return this.request({ method: 'patch', path, ...opts });
+ }
+ put(path: string, opts?: RequestOptions): Promise {
+ return this.request({ method: 'put', path, ...opts });
+ }
+ delete(path: string, opts?: RequestOptions): Promise {
+ return this.request({ method: 'delete', path, ...opts });
+ }
+
+ getAPIList- = AbstractPage
- >(
+ path: string,
+ Page: new (...args: any[]) => PageClass,
+ opts?: RequestOptions,
+ ): PagePromise {
+ return this.requestAPIList(Page, { method: 'get', path, ...opts });
+ }
+
+ buildRequest(
+ options: FinalRequestOptions,
+ ): { req: RequestInit; url: string; timeout: number } {
+ const { method, path, query, headers: headers = {} } = options;
+ const body =
+ options.body instanceof Readable ? options.body
+ : options.body ? JSON.stringify(options.body, null, 2)
+ : null;
+ const contentLength = typeof body === 'string' ? body.length.toString() : null;
+
+ const url = this.buildURL(path!, query);
+ const httpAgent = options.httpAgent ?? this.httpAgent ?? getDefaultAgent(url);
+ const timeout = options.timeout ?? this.timeout;
+ validatePositiveInteger('timeout', timeout);
+
+ if (this.idempotencyHeader && method !== 'get') {
+ if (!options.idempotencyKey) options.idempotencyKey = this.defaultIdempotencyKey();
+ headers[this.idempotencyHeader] = options.idempotencyKey;
+ }
+
+ const reqHeaders: Record = {
+ ...(contentLength && { 'Content-Length': contentLength }),
+ ...this.defaultHeaders(),
+ ...headers,
+ };
+
+ // Strip any headers being explicitly omitted with null
+ Object.keys(reqHeaders).forEach((key) => reqHeaders[key] === null && delete reqHeaders[key]);
+
+ const req: RequestInit = {
+ method,
+ ...(body && { body }),
+ headers: reqHeaders,
+ ...(httpAgent && { agent: httpAgent }),
+ };
+
+ this.validateHeaders(reqHeaders, headers);
+ return { req, url, timeout };
+ }
+
+ /**
+ * Used as a callback for mutating the given `RequestInit` object.
+ *
+ * This is useful for cases where you want to add certain headers based off of
+ * the request properties, e.g. `method` or `url`.
+ */
+ protected async prepareRequest(request: RequestInit, { url }: { url: string }): Promise {}
+
+ protected makeStatusError(
+ status: number | undefined,
+ error: Object | undefined,
+ message: string | undefined,
+ headers: Headers | undefined,
+ ) {
+ return APIError.generate(status, error, message, headers);
+ }
+
+ async request(
+ options: FinalRequestOptions,
+ retriesRemaining = options.maxRetries ?? this.maxRetries,
+ ): Promise> {
+ const { req, url, timeout } = this.buildRequest(options);
+ await this.prepareRequest(req, { url });
+
+ this.debug('request', url, options, req.headers);
+
+ const controller = new AbortController();
+ const response = await this.fetchWithTimeout(url, req, timeout, controller).catch(castToError);
+
+ if (response instanceof Error) {
+ if (retriesRemaining) return this.retryRequest(options, retriesRemaining);
+ if (response.name === 'AbortError') throw new APIConnectionTimeoutError();
+ throw new APIConnectionError({ cause: response });
+ }
+
+ const responseHeaders = createResponseHeaders(response.headers);
+
+ if (!response.ok) {
+ if (retriesRemaining && this.shouldRetry(response)) {
+ return this.retryRequest(options, retriesRemaining, responseHeaders);
+ }
+
+ const errText = await response.text().catch(() => 'Unknown');
+ const errJSON = safeJSON(errText);
+ const errMessage = errJSON ? undefined : errText;
+
+ this.debug('response', response.status, url, responseHeaders, errMessage);
+
+ const err = this.makeStatusError(response.status, errJSON, errMessage, responseHeaders);
+ throw err;
+ }
+
+ if (options.stream) {
+ // Note: there is an invariant here that isn't represented in the type system
+ // that if you set `stream: true` the response type must also be `Stream`
+ return new Stream(response, controller) as any;
+ }
+
+ const contentType = response.headers.get('content-type');
+ if (contentType?.includes('application/json')) {
+ const json = await response.json();
+
+ if (typeof json === 'object' && json != null) {
+ /** @deprecated – we expect to change this interface in the near future. */
+ Object.defineProperty(json, 'responseHeaders', {
+ enumerable: false,
+ writable: false,
+ value: responseHeaders,
+ });
+ }
+
+ this.debug('response', response.status, url, responseHeaders, json);
+
+ return json as APIResponse;
+ }
+
+ // TODO handle blob, arraybuffer, other content types, etc.
+ const text = response.text();
+ this.debug('response', response.status, url, responseHeaders, text);
+ return text as Promise;
+ }
+
+ requestAPIList
- = AbstractPage
- >(
+ Page: new (...args: ConstructorParameters) => PageClass,
+ options: FinalRequestOptions,
+ ): PagePromise {
+ const requestPromise = this.request(options) as Promise>;
+ return new PagePromise(this, requestPromise, options, Page);
+ }
+
+ buildURL(path: string, query: Req | undefined): string {
+ const url =
+ isAbsoluteURL(path) ?
+ new URL(path)
+ : new URL(this.baseURL + (this.baseURL.endsWith('/') && path.startsWith('/') ? path.slice(1) : path));
+
+ if (query) {
+ url.search = qs.stringify(query, this.qsOptions());
+ }
+
+ return url.toString();
+ }
+
+ async fetchWithTimeout(
+ url: RequestInfo,
+ { signal, ...options }: RequestInit = {},
+ ms: number,
+ controller: AbortController,
+ ) {
+ if (signal) signal.addEventListener('abort', controller.abort);
+
+ const timeout = setTimeout(() => controller.abort(), ms);
+
+ return this.getRequestClient()
+ .fetch(url, { signal: controller.signal as any, ...options })
+ .finally(() => {
+ clearTimeout(timeout);
+ });
+ }
+
+ protected getRequestClient(): RequestClient {
+ return { fetch: this.fetch };
+ }
+
+ private shouldRetry(response: Response): boolean {
+ // Note this is not a standard header.
+ const shouldRetryHeader = response.headers.get('x-should-retry');
+
+ // If the server explicitly says whether or not to retry, obey.
+ if (shouldRetryHeader === 'true') return true;
+ if (shouldRetryHeader === 'false') return false;
+
+ // Retry on lock timeouts.
+ if (response.status === 409) return true;
+
+ // Retry on rate limits.
+ if (response.status === 429) return true;
+
+ // Retry internal errors.
+ if (response.status >= 500) return true;
+
+ return false;
+ }
+
+ private async retryRequest(
+ options: FinalRequestOptions,
+ retriesRemaining: number,
+ responseHeaders?: Headers | undefined,
+ ): Promise {
+ retriesRemaining -= 1;
+
+ // About the Retry-After header: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Retry-After
+ //
+ // TODO: we may want to handle the case where the header is using the http-date syntax: "Retry-After: ".
+ // See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Retry-After#syntax for details.
+ const retryAfter = parseInt(responseHeaders?.['retry-after'] || '');
+
+ const maxRetries = options.maxRetries ?? this.maxRetries;
+ const timeout = this.calculateRetryTimeoutSeconds(retriesRemaining, retryAfter, maxRetries) * 1000;
+ await sleep(timeout);
+
+ return this.request(options, retriesRemaining);
+ }
+
+ private calculateRetryTimeoutSeconds(
+ retriesRemaining: number,
+ retryAfter: number,
+ maxRetries: number,
+ ): number {
+ const initialRetryDelay = 0.5;
+ const maxRetryDelay = 2;
+
+ // If the API asks us to wait a certain amount of time (and it's a reasonable amount),
+ // just do what it says.
+ if (Number.isInteger(retryAfter) && retryAfter <= 60) {
+ return retryAfter;
+ }
+
+ const numRetries = maxRetries - retriesRemaining;
+
+ // Apply exponential backoff, but not more than the max.
+ const sleepSeconds = Math.min(initialRetryDelay * Math.pow(numRetries - 1, 2), maxRetryDelay);
+
+ // Apply some jitter, plus-or-minus half a second.
+ const jitter = Math.random() - 0.5;
+
+ return sleepSeconds + jitter;
+ }
+
+ private getUserAgent(): string {
+ return `${this.constructor.name}/JS ${VERSION}`;
+ }
+
+ private debug(action: string, ...args: any[]) {
+ if (process.env['DEBUG'] === 'true') {
+ console.log(`${this.constructor.name}:DEBUG:${action}`, ...args);
+ }
+ }
+}
+
+export class APIResource {
+ protected client: APIClient;
+ constructor(client: APIClient) {
+ this.client = client;
+
+ this.get = client.get.bind(client);
+ this.post = client.post.bind(client);
+ this.patch = client.patch.bind(client);
+ this.put = client.put.bind(client);
+ this.delete = client.delete.bind(client);
+ this.getAPIList = client.getAPIList.bind(client);
+ }
+
+ protected get: APIClient['get'];
+ protected post: APIClient['post'];
+ protected patch: APIClient['patch'];
+ protected put: APIClient['put'];
+ protected delete: APIClient['delete'];
+ protected getAPIList: APIClient['getAPIList'];
+}
+
+export type PageInfo = { url: URL } | { params: Record | null };
+
+export abstract class AbstractPage
- implements AsyncIterable
- {
+ #client: APIClient;
+ protected options: FinalRequestOptions;
+
+ constructor(client: APIClient, response: APIResponse, options: FinalRequestOptions) {
+ this.#client = client;
+ this.options = options;
+ }
+
+ /**
+ * @deprecated Use nextPageInfo instead
+ */
+ abstract nextPageParams(): Partial> | null;
+ abstract nextPageInfo(): PageInfo | null;
+
+ abstract getPaginatedItems(): Item[];
+
+ hasNextPage(): boolean {
+ const items = this.getPaginatedItems();
+ if (!items.length) return false;
+ return this.nextPageInfo() != null;
+ }
+
+ async getNextPage(): Promise> {
+ const nextInfo = this.nextPageInfo();
+ if (!nextInfo) {
+ throw new Error(
+ 'No next page expected; please check `.hasNextPage()` before calling `.getNextPage()`.',
+ );
+ }
+ const nextOptions = { ...this.options };
+ if ('params' in nextInfo) {
+ nextOptions.query = { ...nextOptions.query, ...nextInfo.params };
+ } else if ('url' in nextInfo) {
+ const params = [...Object.entries(nextOptions.query || {}), ...nextInfo.url.searchParams.entries()];
+ for (const [key, value] of params) {
+ nextInfo.url.searchParams.set(key, value);
+ }
+ nextOptions.query = undefined;
+ nextOptions.path = nextInfo.url.toString();
+ }
+ return await this.#client.requestAPIList(this.constructor as any, nextOptions);
+ }
+
+ async *iterPages() {
+ // eslint-disable-next-line @typescript-eslint/no-this-alias
+ let page: AbstractPage
- = this;
+ yield page;
+ while (page.hasNextPage()) {
+ page = await page.getNextPage();
+ yield page;
+ }
+ }
+
+ async *[Symbol.asyncIterator]() {
+ for await (const page of this.iterPages()) {
+ for (const item of page.getPaginatedItems()) {
+ yield item;
+ }
+ }
+ }
+}
+
+export class PagePromise<
+ PageClass extends AbstractPage
- ,
+ Item = ReturnType[number],
+ >
+ extends Promise
+ implements AsyncIterable
-
+{
+ /**
+ * This subclass of Promise will resolve to an instantiated Page once the request completes.
+ */
+ constructor(
+ client: APIClient,
+ requestPromise: Promise>,
+ options: FinalRequestOptions,
+ Page: new (...args: ConstructorParameters) => PageClass,
+ ) {
+ super((resolve, reject) =>
+ requestPromise.then((response) => resolve(new Page(client, response, options))).catch(reject),
+ );
+ }
+
+ /**
+ * Enable subclassing Promise.
+ * Ref: https://stackoverflow.com/a/60328122
+ */
+ static get [Symbol.species]() {
+ return Promise;
+ }
+
+ /**
+ * Allow auto-paginating iteration on an unawaited list call, eg:
+ *
+ * for await (const item of client.items.list()) {
+ * console.log(item)
+ * }
+ */
+ async *[Symbol.asyncIterator]() {
+ const page = await this;
+ for await (const item of page) {
+ yield item;
+ }
+ }
+}
+
+export const createResponseHeaders = (
+ headers: Awaited>['headers'],
+): Record => {
+ return new Proxy(Object.fromEntries(headers.entries()), {
+ get(target, name) {
+ const key = name.toString();
+ return target[key.toLowerCase()] || target[key];
+ },
+ });
+};
+
+type HTTPMethod = 'get' | 'post' | 'put' | 'patch' | 'delete';
+
+export type RequestClient = { fetch: Fetch };
+export type Headers = Record;
+export type KeysEnum = { [P in keyof Required]: true };
+
+export type RequestOptions | Readable> = {
+ method?: HTTPMethod;
+ path?: string;
+ query?: Req | undefined;
+ body?: Req | undefined;
+ headers?: Headers | undefined;
+
+ maxRetries?: number;
+ stream?: boolean | undefined;
+ timeout?: number;
+ httpAgent?: Agent;
+ idempotencyKey?: string;
+};
+
+// This is required so that we can determine if a given object matches the RequestOptions
+// type at runtime. While this requires duplication, it is enforced by the TypeScript
+// compiler such that any missing / extraneous keys will cause an error.
+const requestOptionsKeys: KeysEnum = {
+ method: true,
+ path: true,
+ query: true,
+ body: true,
+ headers: true,
+
+ maxRetries: true,
+ stream: true,
+ timeout: true,
+ httpAgent: true,
+ idempotencyKey: true,
+};
+
+export const isRequestOptions = (obj: unknown): obj is RequestOptions => {
+ return (
+ typeof obj === 'object' &&
+ obj !== null &&
+ !isEmptyObj(obj) &&
+ Object.keys(obj).every((k) => hasOwn(requestOptionsKeys, k))
+ );
+};
+
+export type FinalRequestOptions | Readable> = RequestOptions & {
+ method: HTTPMethod;
+ path: string;
+};
+
+export type APIResponse = T & {
+ responseHeaders: Headers;
+};
+
+declare const Deno: any;
+type Arch = 'x32' | 'x64' | 'arm' | 'arm64' | `other:${string}` | 'unknown';
+type PlatformName =
+ | 'MacOS'
+ | 'Linux'
+ | 'Windows'
+ | 'FreeBSD'
+ | 'OpenBSD'
+ | 'iOS'
+ | 'Android'
+ | `Other:${string}`
+ | 'Unknown';
+type PlatformProperties = {
+ 'X-Stainless-Lang': 'js';
+ 'X-Stainless-Package-Version': string;
+ 'X-Stainless-OS': PlatformName;
+ 'X-Stainless-Arch': Arch;
+ 'X-Stainless-Runtime': 'node' | 'deno' | 'unknown';
+ 'X-Stainless-Runtime-Version': string;
+};
+const getPlatformProperties = (): PlatformProperties => {
+ if (typeof Deno !== 'undefined' && Deno.build != null) {
+ return {
+ 'X-Stainless-Lang': 'js',
+ 'X-Stainless-Package-Version': VERSION,
+ 'X-Stainless-OS': normalizePlatform(Deno.build.os),
+ 'X-Stainless-Arch': normalizeArch(Deno.build.arch),
+ 'X-Stainless-Runtime': 'deno',
+ 'X-Stainless-Runtime-Version': Deno.version,
+ };
+ }
+ if (typeof process !== 'undefined') {
+ return {
+ 'X-Stainless-Lang': 'js',
+ 'X-Stainless-Package-Version': VERSION,
+ 'X-Stainless-OS': normalizePlatform(process.platform),
+ 'X-Stainless-Arch': normalizeArch(process.arch),
+ 'X-Stainless-Runtime': 'node',
+ 'X-Stainless-Runtime-Version': process.version,
+ };
+ }
+ // TODO add support for Cloudflare workers, browsers, etc.
+ return {
+ 'X-Stainless-Lang': 'js',
+ 'X-Stainless-Package-Version': VERSION,
+ 'X-Stainless-OS': 'Unknown',
+ 'X-Stainless-Arch': 'unknown',
+ 'X-Stainless-Runtime': 'unknown',
+ 'X-Stainless-Runtime-Version': 'unknown',
+ };
+};
+
+const normalizeArch = (arch: string): Arch => {
+ // Node docs:
+ // - https://nodejs.org/api/process.html#processarch
+ // Deno docs:
+ // - https://doc.deno.land/deno/stable/~/Deno.build
+ if (arch === 'x32') return 'x32';
+ if (arch === 'x86_64' || arch === 'x64') return 'x64';
+ if (arch === 'arm') return 'arm';
+ if (arch === 'aarch64' || arch === 'arm64') return 'arm64';
+ if (arch) return `other:${arch}`;
+ return 'unknown';
+};
+
+const normalizePlatform = (platform: string): PlatformName => {
+ // Node platforms:
+ // - https://nodejs.org/api/process.html#processplatform
+ // Deno platforms:
+ // - https://doc.deno.land/deno/stable/~/Deno.build
+ // - https://github.com/denoland/deno/issues/14799
+
+ platform = platform.toLowerCase();
+
+ // NOTE: this iOS check is untested and may not work
+ // Node does not work natively on IOS, there is a fork at
+ // https://github.com/nodejs-mobile/nodejs-mobile
+ // however it is unknown at the time of writing how to detect if it is running
+ if (platform.includes('ios')) return 'iOS';
+ if (platform === 'android') return 'Android';
+ if (platform === 'darwin') return 'MacOS';
+ if (platform === 'win32') return 'Windows';
+ if (platform === 'freebsd') return 'FreeBSD';
+ if (platform === 'openbsd') return 'OpenBSD';
+ if (platform === 'linux') return 'Linux';
+ if (platform) return `Other:${platform}`;
+ return 'Unknown';
+};
+
+let _platformHeaders: PlatformProperties;
+const getPlatformHeaders = () => {
+ return (_platformHeaders ??= getPlatformProperties());
+};
+
+export const safeJSON = (text: string) => {
+ try {
+ return JSON.parse(text);
+ } catch (err) {
+ return undefined;
+ }
+};
+
+// https://stackoverflow.com/a/19709846
+const startsWithSchemeRegexp = new RegExp('^(?:[a-z]+:)?//', 'i');
+const isAbsoluteURL = (url: string): boolean => {
+ return startsWithSchemeRegexp.test(url);
+};
+
+const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));
+
+const validatePositiveInteger = (name: string, n: number) => {
+ if (!Number.isInteger(n)) {
+ throw new Error(`${name} must be an integer`);
+ }
+ if (n < 0) {
+ throw new Error(`${name} must be a positive integer`);
+ }
+ return n;
+};
+
+export const castToError = (err: any): Error => {
+ if (err instanceof Error) return err;
+ return new Error(err);
+};
+
+/**
+ * Returns a multipart/form-data request if any part of the given request body contains a File / Blob value.
+ * Otherwise returns the request as is.
+ */
+export const maybeMultipartFormRequestOptions = >(
+ opts: RequestOptions,
+): RequestOptions => {
+ // TODO: does this add unreasonable overhead in the case where we shouldn't use multipart/form-data?
+ const form = createForm(opts.body);
+
+ for (const [_, entry] of form.entries()) {
+ const value = entry.valueOf();
+ if (value instanceof File || value instanceof Blob) {
+ return getMultipartRequestOptions(form, opts);
+ }
+ }
+
+ return opts;
+};
+
+export const multipartFormRequestOptions = >(
+ opts: RequestOptions,
+): RequestOptions => {
+ return getMultipartRequestOptions(createForm(opts.body), opts);
+};
+
+const createForm = >(body: T | undefined): FormData => {
+ const form = new FormData();
+ Object.entries(body || {}).forEach(([key, value]) => addFormValue(form, key, value));
+ return form;
+};
+
+const getMultipartRequestOptions = >(
+ form: FormData,
+ opts: RequestOptions,
+): RequestOptions => {
+ const encoder = new FormDataEncoder(form);
+ return {
+ ...opts,
+ headers: { ...opts.headers, ...encoder.headers, 'Content-Length': encoder.contentLength },
+ body: Readable.from(encoder),
+ };
+};
+
+const addFormValue = (form: FormData, key: string, value: unknown) => {
+ if (value == null) {
+ throw new TypeError(
+ `null is not a valid form data value, if you want to pass null then you need to use the string 'null'`,
+ );
+ }
+
+ // TODO: make nested formats configurable
+ if (
+ typeof value === 'string' ||
+ typeof value === 'number' ||
+ typeof value === 'boolean' ||
+ value instanceof File ||
+ value instanceof Blob
+ ) {
+ form.append(key, value);
+ } else if (Array.isArray(value)) {
+ value.forEach((entry) => {
+ addFormValue(form, key + '[]', entry);
+ });
+ } else if (typeof value === 'object') {
+ Object.entries(value).forEach(([name, prop]) => {
+ addFormValue(form, `${key}[${name}]`, prop);
+ });
+ } else {
+ throw new TypeError(
+ `Invalid value given to form, expected a string, number, boolean, object, Array, File or Blob but got ${value} instead`,
+ );
+ }
+};
+
+export const ensurePresent = (value: T | null | undefined): T => {
+ if (value == null) throw new Error(`Expected a value to be given but received ${value} instead.`);
+ return value;
+};
+
+export const coerceInteger = (value: unknown): number => {
+ if (typeof value === 'number') return Math.round(value);
+ if (typeof value === 'string') return parseInt(value, 10);
+
+ throw new Error(`Could not coerce ${value} (type: ${typeof value}) into a number`);
+};
+
+export const coerceFloat = (value: unknown): number => {
+ if (typeof value === 'number') return value;
+ if (typeof value === 'string') return parseFloat(value);
+
+ throw new Error(`Could not coerce ${value} (type: ${typeof value}) into a number`);
+};
+
+export const coerceBoolean = (value: unknown): boolean => {
+ if (typeof value === 'boolean') return value;
+ if (typeof value === 'string') return value === 'true';
+ return Boolean(value);
+};
+
+// https://stackoverflow.com/a/34491287
+export function isEmptyObj(obj: Object | null | undefined): boolean {
+ if (!obj) return true;
+ for (const _k in obj) return false;
+ return true;
+}
+
+// https://eslint.org/docs/latest/rules/no-prototype-builtins
+export function hasOwn(obj: Object, key: string): boolean {
+ return Object.prototype.hasOwnProperty.call(obj, key);
+}
+
+/**
+ * https://stackoverflow.com/a/2117523
+ */
+const uuid4 = () => {
+ return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
+ const r = (Math.random() * 16) | 0;
+ const v = c === 'x' ? r : (r & 0x3) | 0x8;
+ return v.toString(16);
+ });
+};
+
+export interface HeadersProtocol {
+ get: (header: string) => string | null | undefined;
+}
+export type HeadersLike = Record | HeadersProtocol;
+
+export const isHeadersProtocol = (headers: any): headers is HeadersProtocol => {
+ return typeof headers?.get === 'function';
+};
+
+export const getHeader = (headers: HeadersLike, key: string): string | null | undefined => {
+ const lowerKey = key.toLowerCase();
+ if (isHeadersProtocol(headers)) return headers.get(key) || headers.get(lowerKey);
+ const value = headers[key] || headers[lowerKey];
+ if (Array.isArray(value)) {
+ if (value.length <= 1) return value[0];
+ console.warn(`Received ${value.length} entries for the ${key} header, using the first entry.`);
+ return value[0];
+ }
+ return value;
+};
diff --git a/error.ts b/error.ts
new file mode 100644
index 000000000..8ae65fa83
--- /dev/null
+++ b/error.ts
@@ -0,0 +1,125 @@
+// File generated from our OpenAPI spec by Stainless.
+
+import { castToError, Headers } from '~/core';
+
+export class APIError extends Error {
+ readonly status: number | undefined;
+ readonly headers: Headers | undefined;
+ readonly error: Object | undefined;
+
+ readonly code: string | null | undefined;
+ readonly param: string | null | undefined;
+ readonly type: string | undefined;
+
+ constructor(
+ status: number | undefined,
+ error: Object | undefined,
+ message: string | undefined,
+ headers: Headers | undefined,
+ ) {
+ super(message || (error as any)?.message || 'Unknown error occurred.');
+ this.status = status;
+ this.headers = headers;
+
+ const data = error as Record;
+ this.error = data;
+ this.type = data?.['type'];
+ this.message = data?.['message'];
+ this.param = data?.['param'];
+ this.code = data?.['code'];
+ }
+
+ static generate(
+ status: number | undefined,
+ errorResponse: Object | undefined,
+ message: string | undefined,
+ headers: Headers | undefined,
+ ) {
+ if (!status) {
+ return new APIConnectionError({ cause: castToError(errorResponse) });
+ }
+
+ const error = (errorResponse as Record)?.['error'];
+
+ if (status === 400) {
+ return new BadRequestError(status, error, message, headers);
+ }
+
+ if (status === 401) {
+ return new AuthenticationError(status, error, message, headers);
+ }
+
+ if (status === 403) {
+ return new PermissionDeniedError(status, error, message, headers);
+ }
+
+ if (status === 404) {
+ return new NotFoundError(status, error, message, headers);
+ }
+
+ if (status === 409) {
+ return new ConflictError(status, error, message, headers);
+ }
+
+ if (status === 422) {
+ return new UnprocessableEntityError(status, error, message, headers);
+ }
+
+ if (status === 429) {
+ return new RateLimitError(status, error, message, headers);
+ }
+
+ if (status >= 500) {
+ return new InternalServerError(status, error, message, headers);
+ }
+
+ return new APIError(status, error, message, headers);
+ }
+}
+
+export class APIConnectionError extends APIError {
+ override readonly status: undefined = undefined;
+
+ constructor({ message, cause }: { message?: string; cause?: Error | undefined }) {
+ super(undefined, undefined, message || 'Connection error.', undefined);
+ // in some environments the 'cause' property is already declared
+ // @ts-ignore
+ if (cause) this.cause = cause;
+ }
+}
+
+export class APIConnectionTimeoutError extends APIConnectionError {
+ constructor() {
+ super({ message: 'Request timed out.' });
+ }
+}
+
+export class BadRequestError extends APIError {
+ override readonly status: 400 = 400;
+}
+
+export class AuthenticationError extends APIError {
+ override readonly status: 401 = 401;
+}
+
+export class PermissionDeniedError extends APIError {
+ override readonly status: 403 = 403;
+}
+
+export class NotFoundError extends APIError {
+ override readonly status: 404 = 404;
+}
+
+export class ConflictError extends APIError {
+ override readonly status: 409 = 409;
+}
+
+export class UnprocessableEntityError extends APIError {
+ override readonly status: 422 = 422;
+}
+
+export class RateLimitError extends APIError {
+ override readonly status: 429 = 429;
+}
+
+export class InternalServerError extends APIError {}
diff --git a/examples/demo.ts b/examples/demo.ts
new file mode 100755
index 000000000..807eca7cf
--- /dev/null
+++ b/examples/demo.ts
@@ -0,0 +1,28 @@
+#!/usr/bin/env yarn tsn -T
+
+import OpenAI from 'openai';
+
+// gets API Key from environment variable OPENAI_API_KEY
+const client = new OpenAI();
+
+async function main() {
+ // Non-streaming:
+ const result = await client.completions.create({
+ prompt: 'Say this is a test',
+ model: 'text-davinci-003',
+ });
+ console.log(result.choices[0]!.text);
+
+ // Streaming:
+ const stream = await client.completions.create({
+ prompt: 'Say this is a test',
+ model: 'text-davinci-003',
+ stream: true,
+ });
+ for await (const part of stream) {
+ process.stdout.write(part.choices[0]?.text || '');
+ }
+ process.stdout.write('\n');
+}
+
+main().catch(console.error);
diff --git a/examples/errors.ts b/examples/errors.ts
new file mode 100644
index 000000000..39976d818
--- /dev/null
+++ b/examples/errors.ts
@@ -0,0 +1,28 @@
+#!/usr/bin/env yarn tsn -T
+
+import OpenAI, { NotFoundError } from 'openai';
+
+// gets API Key from environment variable OPENAI_API_KEY
+const client = new OpenAI();
+
+async function main() {
+ try {
+ await client.completions.create({
+ prompt: 'Say this is a test',
+ model: 'unknown-model',
+ });
+ } catch (err) {
+ if (err instanceof NotFoundError) {
+ console.log(`Caught NotFoundError!`);
+ console.log(err);
+ console.log(`message: `, err.message);
+ console.log(`code: `, err.code);
+ console.log(`type: `, err.type);
+ console.log(`param: `, err.param);
+ } else {
+ console.log(`Raised unknown error`);
+ }
+ }
+}
+
+main().catch(console.error);
diff --git a/examples/fine-tune-data.jsonl b/examples/fine-tune-data.jsonl
new file mode 100644
index 000000000..b8b711d61
--- /dev/null
+++ b/examples/fine-tune-data.jsonl
@@ -0,0 +1,3 @@
+{"prompt": "", "completion": ""}
+{"prompt": "", "completion": ""}
+{"prompt": "", "completion": ""}
diff --git a/examples/fine-tunes.ts b/examples/fine-tunes.ts
new file mode 100755
index 000000000..66e8849c7
--- /dev/null
+++ b/examples/fine-tunes.ts
@@ -0,0 +1,37 @@
+#!/usr/bin/env yarn tsn -T
+
+/**
+ * Fine-tuning allows you to train models on your own data.
+ *
+ * See these guides for more information:
+ * - https://help.openai.com/en/articles/5528730-fine-tuning-a-classifier-to-improve-truthfulness
+ * - https://platform.openai.com/docs/guides/fine-tuning
+ */
+
+import OpenAI, { fileFromPath } from 'openai';
+
+// Gets the API Key from the environment variable `OPENAI_API_KEY`
+const client = new OpenAI();
+
+async function main() {
+ console.log(`Uploading file`);
+ const file = await client.files.create({
+ file: await fileFromPath('examples/fine-tune-data.jsonl'),
+ purpose: 'fine-tune',
+ });
+ console.log(`Uploaded file with ID: ${file.id}`);
+ console.log('-----');
+
+ console.log(`Starting fine-tuning`);
+ const fineTune = await client.fineTunes.create({ model: 'babbage', training_file: file.id });
+ console.log(`Fine-tuning ID: ${fineTune.id}`);
+ console.log('-----');
+
+ console.log(`Streaming fine-tuning progress:`);
+ const stream = await client.fineTunes.listEvents(fineTune.id, { stream: true });
+ for await (const part of stream) {
+ console.log(part.message);
+ }
+}
+
+main().catch(console.error);
diff --git a/fetch-polyfill.ts b/fetch-polyfill.ts
new file mode 100644
index 000000000..ebc629550
--- /dev/null
+++ b/fetch-polyfill.ts
@@ -0,0 +1,69 @@
+import type NodeFetch from 'node-fetch';
+import type { RequestInfo, RequestInit, Response } from 'node-fetch';
+import type KeepAliveAgent from 'agentkeepalive';
+import type { Agent } from 'http';
+import { AbortController as AbortControllerPolyfill } from 'abort-controller';
+
+declare const Deno: any;
+// For now, we just pretend that Fetch is the same type as NodeFetch.
+declare const fetch: Fetch | undefined;
+
+let nodeFetch: typeof NodeFetch | undefined = undefined;
+let nodeFetchImportError: unknown;
+let defaultHttpAgent: Agent;
+let defaultHttpsAgent: Agent;
+
+// In a Node environment, we prefer `node-fetch` to other fetch implementations
+// which may be present, because it allows keepAlive and others don't.
+// Alternative, "Web Standards"-based environments typically provide fetch implementations
+// which provide good performance for this by default, and may not support node-fetch.
+const isProbablyNode = typeof process !== 'undefined' && typeof Deno === 'undefined';
+if (isProbablyNode) {
+ try {
+ /* eslint-disable @typescript-eslint/no-var-requires */
+ nodeFetch = require('node-fetch').default;
+ const KeepAliveHttpAgent: typeof KeepAliveAgent = require('agentkeepalive');
+ /* eslint-enable @typescript-eslint/no-var-requires */
+
+ defaultHttpAgent = new KeepAliveHttpAgent({ keepAlive: true, timeout: 5 * 60 * 1000 });
+ defaultHttpsAgent = new KeepAliveHttpAgent.HttpsAgent({ keepAlive: true, timeout: 5 * 60 * 1000 });
+ } catch (e) {
+ // We can fall back to a built-in "fetch".
+ nodeFetchImportError = e;
+ }
+}
+
+// Polyfill global object if needed.
+if (typeof AbortController === 'undefined') {
+ AbortController = AbortControllerPolyfill as typeof AbortController;
+}
+
+export type Fetch = (url: RequestInfo, init?: RequestInit) => Promise;
+
+export const getFetch = (): Fetch => {
+ if (isProbablyNode && nodeFetch) {
+ return nodeFetch;
+ }
+
+ // For other environments, use a global fetch function expected to already be present
+ if (typeof fetch === 'undefined' || typeof fetch !== 'function') {
+ if (isProbablyNode) {
+ throw new Error(
+ `Could not import "node-fetch", and no global "fetch" function is defined.`,
+ // @ts-expect-error This is only Node 16.9.0+, but isn't harmful in other contexts.
+ { cause: nodeFetchImportError },
+ );
+ }
+ throw new Error(
+ `Unexpected: running in a non-Node environment without a global "fetch" function defined.`,
+ );
+ }
+
+ return fetch;
+};
+
+export const getDefaultAgent = (url: string): Agent | undefined => {
+ if (defaultHttpsAgent && url.startsWith('https')) return defaultHttpsAgent;
+ if (defaultHttpAgent) return defaultHttpAgent;
+ return undefined;
+};
diff --git a/index.ts b/index.ts
new file mode 100644
index 000000000..333852a08
--- /dev/null
+++ b/index.ts
@@ -0,0 +1,157 @@
+// File generated from our OpenAPI spec by Stainless.
+
+import qs from 'qs';
+import * as Core from './core';
+import * as API from './resources';
+import * as Errors from '~/error';
+import type { Agent } from 'http';
+import * as FileFromPath from 'formdata-node/file-from-path';
+
+type Config = {
+ /**
+ * Defaults to process.env["OPENAI_API_KEY"].
+ */
+ apiKey?: string;
+ baseURL?: string;
+ timeout?: number;
+ httpAgent?: Agent;
+ maxRetries?: number;
+ defaultHeaders?: Core.Headers;
+};
+
+/** Instantiate the API Client. */
+export class OpenAI extends Core.APIClient {
+ apiKey: string;
+
+ private _options: Config;
+
+ constructor(config?: Config) {
+ const options: Config = {
+ apiKey: process.env['OPENAI_API_KEY'] || '',
+ baseURL: 'https://api.openai.com/v1',
+ ...config,
+ };
+
+ if (!options.apiKey && options.apiKey !== null) {
+ throw new Error(
+ "The OPENAI_API_KEY environment variable is missing or empty; either provide it, or instantiate the OpenAI client with an apiKey option, like new OpenAI({ apiKey: 'my api key' }).",
+ );
+ }
+
+ super({
+ baseURL: options.baseURL!,
+ timeout: options.timeout,
+ httpAgent: options.httpAgent,
+ maxRetries: options.maxRetries,
+ });
+ this.apiKey = options.apiKey;
+ this._options = options;
+ }
+
+ completions: API.Completions = new API.Completions(this);
+ chat: API.Chat = new API.Chat(this);
+ edits: API.Edits = new API.Edits(this);
+ embeddings: API.Embeddings = new API.Embeddings(this);
+ files: API.Files = new API.Files(this);
+ images: API.Images = new API.Images(this);
+ audio: API.Audio = new API.Audio(this);
+ answers: API.Answers = new API.Answers(this);
+ classifications: API.Classifications = new API.Classifications(this);
+ moderations: API.Moderations = new API.Moderations(this);
+ models: API.Models = new API.Models(this);
+ fineTunes: API.FineTunes = new API.FineTunes(this);
+
+ protected override defaultHeaders(): Core.Headers {
+ return {
+ ...super.defaultHeaders(),
+ ...this._options.defaultHeaders,
+ };
+ }
+
+ protected override authHeaders(): Core.Headers {
+ return { Authorization: `Bearer ${this.apiKey}` };
+ }
+
+ protected override qsOptions(): qs.IStringifyOptions {
+ return { arrayFormat: 'comma' };
+ }
+
+ static APIError = Errors.APIError;
+ static APIConnectionError = Errors.APIConnectionError;
+ static APIConnectionTimeoutError = Errors.APIConnectionTimeoutError;
+ static NotFoundError = Errors.NotFoundError;
+ static ConflictError = Errors.ConflictError;
+ static RateLimitError = Errors.RateLimitError;
+ static BadRequestError = Errors.BadRequestError;
+ static AuthenticationError = Errors.AuthenticationError;
+ static InternalServerError = Errors.InternalServerError;
+ static PermissionDeniedError = Errors.PermissionDeniedError;
+ static UnprocessableEntityError = Errors.UnprocessableEntityError;
+}
+
+export const {
+ APIError,
+ APIConnectionError,
+ APIConnectionTimeoutError,
+ NotFoundError,
+ ConflictError,
+ RateLimitError,
+ BadRequestError,
+ AuthenticationError,
+ InternalServerError,
+ PermissionDeniedError,
+ UnprocessableEntityError,
+} = Errors;
+
+export import fileFromPath = FileFromPath.fileFromPath;
+
+export namespace OpenAI {
+ // Helper functions
+ export import fileFromPath = FileFromPath.fileFromPath;
+
+ export import Completion = API.Completion;
+ export import CompletionChoice = API.CompletionChoice;
+ export import CompletionCreateParams = API.CompletionCreateParams;
+
+ export import Edit = API.Edit;
+ export import EditCreateParams = API.EditCreateParams;
+
+ export import Embedding = API.Embedding;
+ export import EmbeddingCreateParams = API.EmbeddingCreateParams;
+
+ export import File = API.File;
+ export import FileListResponse = API.FileListResponse;
+ export import FileDeleteResponse = API.FileDeleteResponse;
+ export import FileRetrieveFileContentResponse = API.FileRetrieveFileContentResponse;
+ export import FileCreateParams = API.FileCreateParams;
+
+ export import Image = API.Image;
+ export import ImagesResponse = API.ImagesResponse;
+ export import ImageCreateVariationParams = API.ImageCreateVariationParams;
+ export import ImageEditParams = API.ImageEditParams;
+ export import ImageGenerateParams = API.ImageGenerateParams;
+
+ export import AnswerCreateResponse = API.AnswerCreateResponse;
+ export import AnswerCreateParams = API.AnswerCreateParams;
+
+ export import ClassificationCreateResponse = API.ClassificationCreateResponse;
+ export import ClassificationCreateParams = API.ClassificationCreateParams;
+
+ export import Moderation = API.Moderation;
+ export import ModerationCreateResponse = API.ModerationCreateResponse;
+ export import ModerationCreateParams = API.ModerationCreateParams;
+
+ export import DeleteModelResponse = API.DeleteModelResponse;
+ export import ListModelsResponse = API.ListModelsResponse;
+ export import Model = API.Model;
+
+ export import FineTune = API.FineTune;
+ export import FineTuneEvent = API.FineTuneEvent;
+ export import ListFineTuneEventsResponse = API.ListFineTuneEventsResponse;
+ export import ListFineTunesResponse = API.ListFineTunesResponse;
+ export import FineTuneCreateParams = API.FineTuneCreateParams;
+ export import FineTuneListEventsParams = API.FineTuneListEventsParams;
+}
+
+exports = module.exports = OpenAI;
+export default OpenAI;
diff --git a/jest.config.js b/jest.config.js
new file mode 100644
index 000000000..8432893a3
--- /dev/null
+++ b/jest.config.js
@@ -0,0 +1,8 @@
+/** @type {import('ts-jest/dist/types').InitialOptionsTsJest} */
+module.exports = {
+ preset: 'ts-jest',
+ testEnvironment: 'node',
+ moduleNameMapper: {
+ '^~/(.*)$': '/$1',
+ },
+};
diff --git a/package.json b/package.json
new file mode 100644
index 000000000..15db691e8
--- /dev/null
+++ b/package.json
@@ -0,0 +1,47 @@
+{
+ "name": "openai",
+ "version": "v4.0.0-beta.0",
+ "description": "Client library for the OpenAI API",
+ "author": "OpenAI ",
+ "types": "dist/cjs/index.d.ts",
+ "main": "dist/cjs/index.js",
+ "type": "commonjs",
+ "repository": "github:openai/openai-node",
+ "license": "Apache-2.0",
+ "private": false,
+ "scripts": {
+ "test": "bin/check-test-server && yarn jest",
+ "build": "bash ./build",
+ "prepack": "yarn build",
+ "format": "prettier --write .",
+ "tsn": "ts-node -r tsconfig-paths/register",
+ "fix": "eslint --fix --ext ts,js ."
+ },
+ "dependencies": {
+ "@types/node": "^18.11.18",
+ "@types/node-fetch": "^2.6.1",
+ "@types/qs": "^6.9.7",
+ "abort-controller": "^3.0.0",
+ "agentkeepalive": "^4.2.1",
+ "digest-fetch": "^1.3.0",
+ "form-data-encoder": "1.7.2",
+ "formdata-node": "^4.3.2",
+ "node-fetch": "^2.6.7",
+ "qs": "^6.10.3"
+ },
+ "devDependencies": {
+ "openai": "link:.",
+ "@types/jest": "^27.5.0",
+ "@typescript-eslint/eslint-plugin": "^5.33.0",
+ "@typescript-eslint/parser": "^5.33.0",
+ "eslint": "^8.22.0",
+ "eslint-plugin-unused-imports": "^2.0.0",
+ "jest": "^28.1.0",
+ "prettier": "rattrayalex/prettier#postfix-ternaries",
+ "ts-jest": "^28.0.2",
+ "ts-node": "^10.5.0",
+ "tsc-alias": "^1.6.9",
+ "tsconfig-paths": "^3.12.0",
+ "typescript": "^4.8.2"
+ }
+}
diff --git a/resource.ts b/resource.ts
new file mode 100644
index 000000000..9c58ae78b
--- /dev/null
+++ b/resource.ts
@@ -0,0 +1,24 @@
+// File generated from our OpenAPI spec by Stainless.
+
+import type { OpenAI } from './index';
+
+export class APIResource {
+ protected client: OpenAI;
+ constructor(client: OpenAI) {
+ this.client = client;
+
+ this.get = client.get.bind(client);
+ this.post = client.post.bind(client);
+ this.patch = client.patch.bind(client);
+ this.put = client.put.bind(client);
+ this.delete = client.delete.bind(client);
+ this.getAPIList = client.getAPIList.bind(client);
+ }
+
+ protected get: OpenAI['get'];
+ protected post: OpenAI['post'];
+ protected patch: OpenAI['patch'];
+ protected put: OpenAI['put'];
+ protected delete: OpenAI['delete'];
+ protected getAPIList: OpenAI['getAPIList'];
+}
diff --git a/resources/answers.ts b/resources/answers.ts
new file mode 100644
index 000000000..e64a2fa0f
--- /dev/null
+++ b/resources/answers.ts
@@ -0,0 +1,180 @@
+// File generated from our OpenAPI spec by Stainless.
+
+import * as Core from '~/core';
+import { APIResource } from '~/resource';
+
+export class Answers extends APIResource {
+ /**
+ * Answers the specified question using the provided documents and examples.
+ *
+ * The endpoint first [searches](/docs/api-reference/searches) over provided
+ * documents or files to find relevant context. The relevant context is combined
+ * with the provided examples and question to create the prompt for
+ * [completion](/docs/api-reference/completions).
+ */
+ create(
+ body: AnswerCreateParams,
+ options?: Core.RequestOptions,
+ ): Promise> {
+ return this.post('/answers', { body, ...options });
+ }
+}
+
+export interface AnswerCreateResponse {
+ answers?: Array;
+
+ completion?: string;
+
+ model?: string;
+
+ object?: string;
+
+ search_model?: string;
+
+ selected_documents?: Array;
+}
+
+export namespace AnswerCreateResponse {
+ export interface SelectedDocuments {
+ document?: number;
+
+ text?: string;
+ }
+}
+
+export interface AnswerCreateParams {
+ /**
+ * List of (question, answer) pairs that will help steer the model towards the tone
+ * and answer format you'd like. We recommend adding 2 to 3 examples.
+ */
+ examples: Array>;
+
+ /**
+ * A text snippet containing the contextual information used to generate the
+ * answers for the `examples` you provide.
+ */
+ examples_context: string;
+
+ /**
+ * ID of the model to use for completion. You can select one of `ada`, `babbage`,
+ * `curie`, or `davinci`.
+ */
+ model: string;
+
+ /**
+ * Question to get answered.
+ */
+ question: string;
+
+ /**
+ * List of documents from which the answer for the input `question` should be
+ * derived. If this is an empty list, the question will be answered based on the
+ * question-answer examples.
+ *
+ * You should specify either `documents` or a `file`, but not both.
+ */
+ documents?: Array | null;
+
+ /**
+ * If an object name is in the list, we provide the full information of the object;
+ * otherwise, we only provide the object ID. Currently we support `completion` and
+ * `file` objects for expansion.
+ */
+ expand?: Array | null;
+
+ /**
+ * The ID of an uploaded file that contains documents to search over. See
+ * [upload file](/docs/api-reference/files/upload) for how to upload a file of the
+ * desired format and purpose.
+ *
+ * You should specify either `documents` or a `file`, but not both.
+ */
+ file?: string | null;
+
+ /**
+ * Modify the likelihood of specified tokens appearing in the completion.
+ *
+ * Accepts a json object that maps tokens (specified by their token ID in the GPT
+ * tokenizer) to an associated bias value from -100 to 100. You can use this
+ * [tokenizer tool](/tokenizer?view=bpe) (which works for both GPT-2 and GPT-3) to
+ * convert text to token IDs. Mathematically, the bias is added to the logits
+ * generated by the model prior to sampling. The exact effect will vary per model,
+ * but values between -1 and 1 should decrease or increase likelihood of selection;
+ * values like -100 or 100 should result in a ban or exclusive selection of the
+ * relevant token.
+ *
+ * As an example, you can pass `{"50256": -100}` to prevent the <|endoftext|> token
+ * from being generated.
+ */
+ logit_bias?: unknown | null;
+
+ /**
+ * Include the log probabilities on the `logprobs` most likely tokens, as well the
+ * chosen tokens. For example, if `logprobs` is 5, the API will return a list of
+ * the 5 most likely tokens. The API will always return the `logprob` of the
+ * sampled token, so there may be up to `logprobs+1` elements in the response.
+ *
+ * The maximum value for `logprobs` is 5.
+ *
+ * When `logprobs` is set, `completion` will be automatically added into `expand`
+ * to get the logprobs.
+ */
+ logprobs?: number | null;
+
+ /**
+ * The maximum number of documents to be ranked by
+ * [Search](/docs/api-reference/searches/create) when using `file`. Setting it to a
+ * higher value leads to improved accuracy but with increased latency and cost.
+ */
+ max_rerank?: number | null;
+
+ /**
+ * The maximum number of tokens allowed for the generated answer
+ */
+ max_tokens?: number | null;
+
+ /**
+ * How many answers to generate for each question.
+ */
+ n?: number | null;
+
+ /**
+ * A special boolean flag for showing metadata. If set to `true`, each document
+ * entry in the returned JSON will contain a "metadata" field.
+ *
+ * This flag only takes effect when `file` is set.
+ */
+ return_metadata?: boolean | null;
+
+ /**
+ * If set to `true`, the returned JSON will include a "prompt" field containing the
+ * final prompt that was used to request a completion. This is mainly useful for
+ * debugging purposes.
+ */
+ return_prompt?: boolean | null;
+
+ /**
+ * ID of the model to use for [Search](/docs/api-reference/searches/create). You
+ * can select one of `ada`, `babbage`, `curie`, or `davinci`.
+ */
+ search_model?: string | null;
+
+ /**
+ * Up to 4 sequences where the API will stop generating further tokens. The
+ * returned text will not contain the stop sequence.
+ */
+ stop?: string | Array | null;
+
+ /**
+ * What sampling temperature to use, between 0 and 2. Higher values like 0.8 will
+ * make the output more random, while lower values like 0.2 will make it more
+ * focused and deterministic.
+ */
+ temperature?: number | null;
+
+ /**
+ * A unique identifier representing your end-user, which can help OpenAI to monitor
+ * and detect abuse. [Learn more](/docs/guides/safety-best-practices/end-user-ids).
+ */
+ user?: string;
+}
diff --git a/resources/audio/audio.ts b/resources/audio/audio.ts
new file mode 100644
index 000000000..503a82380
--- /dev/null
+++ b/resources/audio/audio.ts
@@ -0,0 +1,10 @@
+// File generated from our OpenAPI spec by Stainless.
+
+import { APIResource } from '~/resource';
+import { Transcriptions } from './transcriptions';
+import { Translations } from './translations';
+
+export class Audio extends APIResource {
+ transcriptions: Transcriptions = new Transcriptions(this.client);
+ translations: Translations = new Translations(this.client);
+}
diff --git a/resources/audio/index.ts b/resources/audio/index.ts
new file mode 100644
index 000000000..67b27a0d4
--- /dev/null
+++ b/resources/audio/index.ts
@@ -0,0 +1,4 @@
+// File generated from our OpenAPI spec by Stainless.
+
+export { Transcription, TranscriptionCreateParams } from './transcriptions';
+export { Translation, TranslationCreateParams } from './translations';
diff --git a/resources/audio/transcriptions.ts b/resources/audio/transcriptions.ts
new file mode 100644
index 000000000..aba47a69a
--- /dev/null
+++ b/resources/audio/transcriptions.ts
@@ -0,0 +1,64 @@
+// File generated from our OpenAPI spec by Stainless.
+
+import * as Core from '~/core';
+import { APIResource } from '~/resource';
+import type * as FormData from 'formdata-node';
+import { multipartFormRequestOptions } from '~/core';
+
+export class Transcriptions extends APIResource {
+ /**
+ * Transcribes audio into the input language.
+ */
+ create(
+ body: TranscriptionCreateParams,
+ options?: Core.RequestOptions,
+ ): Promise> {
+ return this.post('/audio/transcriptions', multipartFormRequestOptions({ body, ...options }));
+ }
+}
+
+export interface Transcription {
+ text: string;
+}
+
+export interface TranscriptionCreateParams {
+ /**
+ * The audio file object (not file name) to transcribe, in one of these formats:
+ * mp3, mp4, mpeg, mpga, m4a, wav, or webm.
+ */
+ file: FormData.Blob | FormData.File;
+
+ /**
+ * ID of the model to use. Only `whisper-1` is currently available.
+ */
+ model: string;
+
+ /**
+ * The language of the input audio. Supplying the input language in
+ * [ISO-639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) format will
+ * improve accuracy and latency.
+ */
+ language?: string;
+
+ /**
+ * An optional text to guide the model's style or continue a previous audio
+ * segment. The [prompt](/docs/guides/speech-to-text/prompting) should match the
+ * audio language.
+ */
+ prompt?: string;
+
+ /**
+ * The format of the transcript output, in one of these options: json, text, srt,
+ * verbose_json, or vtt.
+ */
+ response_format?: string;
+
+ /**
+ * The sampling temperature, between 0 and 1. Higher values like 0.8 will make the
+ * output more random, while lower values like 0.2 will make it more focused and
+ * deterministic. If set to 0, the model will use
+ * [log probability](https://en.wikipedia.org/wiki/Log_probability) to
+ * automatically increase the temperature until certain thresholds are hit.
+ */
+ temperature?: number;
+}
diff --git a/resources/audio/translations.ts b/resources/audio/translations.ts
new file mode 100644
index 000000000..bcfb723fb
--- /dev/null
+++ b/resources/audio/translations.ts
@@ -0,0 +1,57 @@
+// File generated from our OpenAPI spec by Stainless.
+
+import * as Core from '~/core';
+import { APIResource } from '~/resource';
+import type * as FormData from 'formdata-node';
+import { multipartFormRequestOptions } from '~/core';
+
+export class Translations extends APIResource {
+ /**
+ * Translates audio into into English.
+ */
+ create(
+ body: TranslationCreateParams,
+ options?: Core.RequestOptions,
+ ): Promise> {
+ return this.post('/audio/translations', multipartFormRequestOptions({ body, ...options }));
+ }
+}
+
+export interface Translation {
+ text: string;
+}
+
+export interface TranslationCreateParams {
+ /**
+ * The audio file object (not file name) translate, in one of these formats: mp3,
+ * mp4, mpeg, mpga, m4a, wav, or webm.
+ */
+ file: FormData.Blob | FormData.File;
+
+ /**
+ * ID of the model to use. Only `whisper-1` is currently available.
+ */
+ model: string;
+
+ /**
+ * An optional text to guide the model's style or continue a previous audio
+ * segment. The [prompt](/docs/guides/speech-to-text/prompting) should be in
+ * English.
+ */
+ prompt?: string;
+
+ /**
+ * The format of the transcript output, in one of these options: json, text, srt,
+ * verbose_json, or vtt.
+ */
+ response_format?: string;
+
+ /**
+ * The sampling temperature, between 0 and 1. Higher values like 0.8 will make the
+ * output more random, while lower values like 0.2 will make it more focused and
+ * deterministic. If set to 0, the model will use
+ * [log probability](https://en.wikipedia.org/wiki/Log_probability) to
+ * automatically increase the temperature until certain thresholds are hit.
+ */
+ temperature?: number;
+}
diff --git a/resources/chat/chat.ts b/resources/chat/chat.ts
new file mode 100644
index 000000000..4b2afb537
--- /dev/null
+++ b/resources/chat/chat.ts
@@ -0,0 +1,8 @@
+// File generated from our OpenAPI spec by Stainless.
+
+import { APIResource } from '~/resource';
+import { Completions } from './completions';
+
+export class Chat extends APIResource {
+ completions: Completions = new Completions(this.client);
+}
diff --git a/resources/chat/completions.ts b/resources/chat/completions.ts
new file mode 100644
index 000000000..c0064b43a
--- /dev/null
+++ b/resources/chat/completions.ts
@@ -0,0 +1,559 @@
+// File generated from our OpenAPI spec by Stainless.
+
+import * as Core from '~/core';
+import { APIResource } from '~/resource';
+import { Stream } from '~/streaming';
+
+export class Completions extends APIResource {
+ /**
+ * Creates a model response for the given chat conversation.
+ */
+ create(
+ body: CompletionCreateParams.CreateChatCompletionRequestNonStreaming,
+ options?: Core.RequestOptions,
+ ): Promise>;
+ create(
+ body: CompletionCreateParams.CreateChatCompletionRequestStreaming,
+ options?: Core.RequestOptions,
+ ): Promise>>;
+ create(
+ body: CompletionCreateParams,
+ options?: Core.RequestOptions,
+ ): Promise>> {
+ return this.post('/chat/completions', { body, ...options, stream: body.stream ?? false });
+ }
+}
+
+export interface ChatCompletion {
+ choices: Array;
+
+ created: number;
+
+ id: string;
+
+ model: string;
+
+ object: string;
+
+ usage?: ChatCompletion.Usage;
+}
+
+export namespace ChatCompletion {
+ export interface Choices {
+ finish_reason?: 'stop' | 'length' | 'function_call';
+
+ index?: number;
+
+ message?: Choices.Message;
+ }
+
+ export namespace Choices {
+ export interface Message {
+ /**
+ * The role of the author of this message.
+ */
+ role: 'system' | 'user' | 'assistant' | 'function';
+
+ /**
+ * The contents of the message.
+ */
+ content?: string | null;
+
+ /**
+ * The name and arguments of a function that should be called, as generated by the
+ * model.
+ */
+ function_call?: Message.FunctionCall;
+ }
+
+ export namespace Message {
+ /**
+ * The name and arguments of a function that should be called, as generated by the
+ * model.
+ */
+ export interface FunctionCall {
+ /**
+ * The arguments to call the function with, as generated by the model in JSON
+ * format. Note that the model does not always generate valid JSON, and may
+ * hallucinate parameters not defined by your function schema. Validate the
+ * arguments in your code before calling your function.
+ */
+ arguments?: string;
+
+ /**
+ * The name of the function to call.
+ */
+ name?: string;
+ }
+ }
+ }
+
+ export interface Usage {
+ completion_tokens: number;
+
+ prompt_tokens: number;
+
+ total_tokens: number;
+ }
+}
+
+export interface ChatCompletionEvent {
+ choices: Array;
+
+ created: number;
+
+ id: string;
+
+ model: string;
+
+ object: string;
+}
+
+export namespace ChatCompletionEvent {
+ export interface Choices {
+ delta?: Choices.Delta;
+
+ finish_reason?: 'stop' | 'length' | 'function_call';
+
+ index?: number;
+ }
+
+ export namespace Choices {
+ export interface Delta {
+ /**
+ * The contents of the chunk message.
+ */
+ content?: string | null;
+
+ /**
+ * The name and arguments of a function that should be called, as generated by the
+ * model.
+ */
+ function_call?: Delta.FunctionCall;
+
+ /**
+ * The role of the author of this message.
+ */
+ role?: 'system' | 'user' | 'assistant' | 'function';
+ }
+
+ export namespace Delta {
+ /**
+ * The name and arguments of a function that should be called, as generated by the
+ * model.
+ */
+ export interface FunctionCall {
+ /**
+ * The arguments to call the function with, as generated by the model in JSON
+ * format. Note that the model does not always generate valid JSON, and may
+ * hallucinate parameters not defined by your function schema. Validate the
+ * arguments in your code before calling your function.
+ */
+ arguments?: string;
+
+ /**
+ * The name of the function to call.
+ */
+ name?: string;
+ }
+ }
+ }
+}
+
+export type CompletionCreateParams =
+ | CompletionCreateParams.CreateChatCompletionRequestNonStreaming
+ | CompletionCreateParams.CreateChatCompletionRequestStreaming;
+
+export namespace CompletionCreateParams {
+ export interface CreateChatCompletionRequestNonStreaming {
+ /**
+ * A list of messages comprising the conversation so far.
+ * [Example Python code](https://github.com/openai/openai-cookbook/blob/main/examples/How_to_format_inputs_to_ChatGPT_models.ipynb).
+ */
+ messages: Array;
+
+ /**
+ * ID of the model to use. See the
+ * [model endpoint compatibility](/docs/models/model-endpoint-compatibility) table
+ * for details on which models work with the Chat API.
+ */
+ model: string;
+
+ /**
+ * Number between -2.0 and 2.0. Positive values penalize new tokens based on their
+ * existing frequency in the text so far, decreasing the model's likelihood to
+ * repeat the same line verbatim.
+ *
+ * [See more information about frequency and presence penalties.](/docs/api-reference/parameter-details)
+ */
+ frequency_penalty?: number | null;
+
+ /**
+ * Controls how the model responds to function calls. "none" means the model does
+ * not call a function, and responds to the end-user. "auto" means the model can
+ * pick between an end-user or calling a function. Specifying a particular function
+ * via `{"name":\ "my_function"}` forces the model to call that function. "none" is
+ * the default when no functions are present. "auto" is the default if functions
+ * are present.
+ */
+ function_call?:
+ | 'none'
+ | 'auto'
+ | CompletionCreateParams.CreateChatCompletionRequestNonStreaming.FunctionCallOption;
+
+ /**
+ * A list of functions the model may generate JSON inputs for.
+ */
+ functions?: Array;
+
+ /**
+ * Modify the likelihood of specified tokens appearing in the completion.
+ *
+ * Accepts a json object that maps tokens (specified by their token ID in the
+ * tokenizer) to an associated bias value from -100 to 100. Mathematically, the
+ * bias is added to the logits generated by the model prior to sampling. The exact
+ * effect will vary per model, but values between -1 and 1 should decrease or
+ * increase likelihood of selection; values like -100 or 100 should result in a ban
+ * or exclusive selection of the relevant token.
+ */
+ logit_bias?: unknown | null;
+
+ /**
+ * The maximum number of [tokens](/tokenizer) to generate in the chat completion.
+ *
+ * The total length of input tokens and generated tokens is limited by the model's
+ * context length.
+ * [Example Python code](https://github.com/openai/openai-cookbook/blob/main/examples/How_to_count_tokens_with_tiktoken.ipynb)
+ * for counting tokens.
+ */
+ max_tokens?: number;
+
+ /**
+ * How many chat completion choices to generate for each input message.
+ */
+ n?: number | null;
+
+ /**
+ * Number between -2.0 and 2.0. Positive values penalize new tokens based on
+ * whether they appear in the text so far, increasing the model's likelihood to
+ * talk about new topics.
+ *
+ * [See more information about frequency and presence penalties.](/docs/api-reference/parameter-details)
+ */
+ presence_penalty?: number | null;
+
+ /**
+ * Up to 4 sequences where the API will stop generating further tokens.
+ */
+ stop?: string | null | Array;
+
+ /**
+ * If set, partial message deltas will be sent, like in ChatGPT. Tokens will be
+ * sent as data-only
+ * [server-sent events](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events#Event_stream_format)
+ * as they become available, with the stream terminated by a `data: [DONE]`
+ * message.
+ * [Example Python code](https://github.com/openai/openai-cookbook/blob/main/examples/How_to_stream_completions.ipynb).
+ */
+ stream?: false | null;
+
+ /**
+ * What sampling temperature to use, between 0 and 2. Higher values like 0.8 will
+ * make the output more random, while lower values like 0.2 will make it more
+ * focused and deterministic.
+ *
+ * We generally recommend altering this or `top_p` but not both.
+ */
+ temperature?: number | null;
+
+ /**
+ * An alternative to sampling with temperature, called nucleus sampling, where the
+ * model considers the results of the tokens with top_p probability mass. So 0.1
+ * means only the tokens comprising the top 10% probability mass are considered.
+ *
+ * We generally recommend altering this or `temperature` but not both.
+ */
+ top_p?: number | null;
+
+ /**
+ * A unique identifier representing your end-user, which can help OpenAI to monitor
+ * and detect abuse. [Learn more](/docs/guides/safety-best-practices/end-user-ids).
+ */
+ user?: string;
+ }
+
+ export namespace CreateChatCompletionRequestNonStreaming {
+ export interface Messages {
+ /**
+ * The role of the messages author. One of `system`, `user`, `assistant`, or
+ * `function`.
+ */
+ role: 'system' | 'user' | 'assistant' | 'function';
+
+ /**
+ * The contents of the message. `content` is required for all messages except
+ * assistant messages with function calls.
+ */
+ content?: string;
+
+ /**
+ * The name and arguments of a function that should be called, as generated by the
+ * model.
+ */
+ function_call?: Messages.FunctionCall;
+
+ /**
+ * The name of the author of this message. `name` is required if role is
+ * `function`, and it should be the name of the function whose response is in the
+ * `content`. May contain a-z, A-Z, 0-9, and underscores, with a maximum length of
+ * 64 characters.
+ */
+ name?: string;
+ }
+
+ export namespace Messages {
+ /**
+ * The name and arguments of a function that should be called, as generated by the
+ * model.
+ */
+ export interface FunctionCall {
+ /**
+ * The arguments to call the function with, as generated by the model in JSON
+ * format. Note that the model does not always generate valid JSON, and may
+ * hallucinate parameters not defined by your function schema. Validate the
+ * arguments in your code before calling your function.
+ */
+ arguments?: string;
+
+ /**
+ * The name of the function to call.
+ */
+ name?: string;
+ }
+ }
+
+ export interface FunctionCallOption {
+ /**
+ * The name of the function to call.
+ */
+ name: string;
+ }
+
+ export interface Functions {
+ /**
+ * The name of the function to be called. Must be a-z, A-Z, 0-9, or contain
+ * underscores and dashes, with a maximum length of 64.
+ */
+ name: string;
+
+ /**
+ * The description of what the function does.
+ */
+ description?: string;
+
+ /**
+ * The parameters the functions accepts, described as a JSON Schema object. See the
+ * [guide](/docs/guides/gpt/function-calling) for examples, and the
+ * [JSON Schema reference](https://json-schema.org/understanding-json-schema/) for
+ * documentation about the format.
+ */
+ parameters?: Record;
+ }
+ }
+
+ export interface CreateChatCompletionRequestStreaming {
+ /**
+ * A list of messages comprising the conversation so far.
+ * [Example Python code](https://github.com/openai/openai-cookbook/blob/main/examples/How_to_format_inputs_to_ChatGPT_models.ipynb).
+ */
+ messages: Array;
+
+ /**
+ * ID of the model to use. See the
+ * [model endpoint compatibility](/docs/models/model-endpoint-compatibility) table
+ * for details on which models work with the Chat API.
+ */
+ model: string;
+
+ /**
+ * If set, partial message deltas will be sent, like in ChatGPT. Tokens will be
+ * sent as data-only
+ * [server-sent events](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events#Event_stream_format)
+ * as they become available, with the stream terminated by a `data: [DONE]`
+ * message.
+ * [Example Python code](https://github.com/openai/openai-cookbook/blob/main/examples/How_to_stream_completions.ipynb).
+ */
+ stream: true;
+
+ /**
+ * Number between -2.0 and 2.0. Positive values penalize new tokens based on their
+ * existing frequency in the text so far, decreasing the model's likelihood to
+ * repeat the same line verbatim.
+ *
+ * [See more information about frequency and presence penalties.](/docs/api-reference/parameter-details)
+ */
+ frequency_penalty?: number | null;
+
+ /**
+ * Controls how the model responds to function calls. "none" means the model does
+ * not call a function, and responds to the end-user. "auto" means the model can
+ * pick between an end-user or calling a function. Specifying a particular function
+ * via `{"name":\ "my_function"}` forces the model to call that function. "none" is
+ * the default when no functions are present. "auto" is the default if functions
+ * are present.
+ */
+ function_call?:
+ | 'none'
+ | 'auto'
+ | CompletionCreateParams.CreateChatCompletionRequestStreaming.FunctionCallOption;
+
+ /**
+ * A list of functions the model may generate JSON inputs for.
+ */
+ functions?: Array;
+
+ /**
+ * Modify the likelihood of specified tokens appearing in the completion.
+ *
+ * Accepts a json object that maps tokens (specified by their token ID in the
+ * tokenizer) to an associated bias value from -100 to 100. Mathematically, the
+ * bias is added to the logits generated by the model prior to sampling. The exact
+ * effect will vary per model, but values between -1 and 1 should decrease or
+ * increase likelihood of selection; values like -100 or 100 should result in a ban
+ * or exclusive selection of the relevant token.
+ */
+ logit_bias?: unknown | null;
+
+ /**
+ * The maximum number of [tokens](/tokenizer) to generate in the chat completion.
+ *
+ * The total length of input tokens and generated tokens is limited by the model's
+ * context length.
+ * [Example Python code](https://github.com/openai/openai-cookbook/blob/main/examples/How_to_count_tokens_with_tiktoken.ipynb)
+ * for counting tokens.
+ */
+ max_tokens?: number;
+
+ /**
+ * How many chat completion choices to generate for each input message.
+ */
+ n?: number | null;
+
+ /**
+ * Number between -2.0 and 2.0. Positive values penalize new tokens based on
+ * whether they appear in the text so far, increasing the model's likelihood to
+ * talk about new topics.
+ *
+ * [See more information about frequency and presence penalties.](/docs/api-reference/parameter-details)
+ */
+ presence_penalty?: number | null;
+
+ /**
+ * Up to 4 sequences where the API will stop generating further tokens.
+ */
+ stop?: string | null | Array;
+
+ /**
+ * What sampling temperature to use, between 0 and 2. Higher values like 0.8 will
+ * make the output more random, while lower values like 0.2 will make it more
+ * focused and deterministic.
+ *
+ * We generally recommend altering this or `top_p` but not both.
+ */
+ temperature?: number | null;
+
+ /**
+ * An alternative to sampling with temperature, called nucleus sampling, where the
+ * model considers the results of the tokens with top_p probability mass. So 0.1
+ * means only the tokens comprising the top 10% probability mass are considered.
+ *
+ * We generally recommend altering this or `temperature` but not both.
+ */
+ top_p?: number | null;
+
+ /**
+ * A unique identifier representing your end-user, which can help OpenAI to monitor
+ * and detect abuse. [Learn more](/docs/guides/safety-best-practices/end-user-ids).
+ */
+ user?: string;
+ }
+
+ export namespace CreateChatCompletionRequestStreaming {
+ export interface Messages {
+ /**
+ * The role of the messages author. One of `system`, `user`, `assistant`, or
+ * `function`.
+ */
+ role: 'system' | 'user' | 'assistant' | 'function';
+
+ /**
+ * The contents of the message. `content` is required for all messages except
+ * assistant messages with function calls.
+ */
+ content?: string;
+
+ /**
+ * The name and arguments of a function that should be called, as generated by the
+ * model.
+ */
+ function_call?: Messages.FunctionCall;
+
+ /**
+ * The name of the author of this message. `name` is required if role is
+ * `function`, and it should be the name of the function whose response is in the
+ * `content`. May contain a-z, A-Z, 0-9, and underscores, with a maximum length of
+ * 64 characters.
+ */
+ name?: string;
+ }
+
+ export namespace Messages {
+ /**
+ * The name and arguments of a function that should be called, as generated by the
+ * model.
+ */
+ export interface FunctionCall {
+ /**
+ * The arguments to call the function with, as generated by the model in JSON
+ * format. Note that the model does not always generate valid JSON, and may
+ * hallucinate parameters not defined by your function schema. Validate the
+ * arguments in your code before calling your function.
+ */
+ arguments?: string;
+
+ /**
+ * The name of the function to call.
+ */
+ name?: string;
+ }
+ }
+
+ export interface FunctionCallOption {
+ /**
+ * The name of the function to call.
+ */
+ name: string;
+ }
+
+ export interface Functions {
+ /**
+ * The name of the function to be called. Must be a-z, A-Z, 0-9, or contain
+ * underscores and dashes, with a maximum length of 64.
+ */
+ name: string;
+
+ /**
+ * The description of what the function does.
+ */
+ description?: string;
+
+ /**
+ * The parameters the functions accepts, described as a JSON Schema object. See the
+ * [guide](/docs/guides/gpt/function-calling) for examples, and the
+ * [JSON Schema reference](https://json-schema.org/understanding-json-schema/) for
+ * documentation about the format.
+ */
+ parameters?: Record;
+ }
+ }
+}
diff --git a/resources/chat/index.ts b/resources/chat/index.ts
new file mode 100644
index 000000000..58b7e0c36
--- /dev/null
+++ b/resources/chat/index.ts
@@ -0,0 +1,3 @@
+// File generated from our OpenAPI spec by Stainless.
+
+export { ChatCompletion, ChatCompletionEvent, CompletionCreateParams } from './completions';
diff --git a/resources/classifications.ts b/resources/classifications.ts
new file mode 100644
index 000000000..70cf2a75d
--- /dev/null
+++ b/resources/classifications.ts
@@ -0,0 +1,169 @@
+// File generated from our OpenAPI spec by Stainless.
+
+import * as Core from '~/core';
+import { APIResource } from '~/resource';
+
+export class Classifications extends APIResource {
+ /**
+ * Classifies the specified `query` using provided examples.
+ *
+ * The endpoint first [searches](/docs/api-reference/searches) over the labeled
+ * examples to select the ones most relevant for the particular query. Then, the
+ * relevant examples are combined with the query to construct a prompt to produce
+ * the final label via the [completions](/docs/api-reference/completions) endpoint.
+ *
+ * Labeled examples can be provided via an uploaded `file`, or explicitly listed in
+ * the request using the `examples` parameter for quick tests and small scale use
+ * cases.
+ */
+ create(
+ body: ClassificationCreateParams,
+ options?: Core.RequestOptions,
+ ): Promise> {
+ return this.post('/classifications', { body, ...options });
+ }
+}
+
+export interface ClassificationCreateResponse {
+ completion?: string;
+
+ label?: string;
+
+ model?: string;
+
+ object?: string;
+
+ search_model?: string;
+
+ selected_examples?: Array;
+}
+
+export namespace ClassificationCreateResponse {
+ export interface SelectedExamples {
+ document?: number;
+
+ label?: string;
+
+ text?: string;
+ }
+}
+
+export interface ClassificationCreateParams {
+ /**
+ * ID of the model to use. You can use the
+ * [List models](/docs/api-reference/models/list) API to see all of your available
+ * models, or see our [Model overview](/docs/models/overview) for descriptions of
+ * them.
+ */
+ model: string;
+
+ /**
+ * Query to be classified.
+ */
+ query: string;
+
+ /**
+ * A list of examples with labels, in the following format:
+ *
+ * `[["The movie is so interesting.", "Positive"], ["It is quite boring.", "Negative"], ...]`
+ *
+ * All the label strings will be normalized to be capitalized.
+ *
+ * You should specify either `examples` or `file`, but not both.
+ */
+ examples?: Array> | null;
+
+ /**
+ * If an object name is in the list, we provide the full information of the object;
+ * otherwise, we only provide the object ID. Currently we support `completion` and
+ * `file` objects for expansion.
+ */
+ expand?: Array | null;
+
+ /**
+ * The ID of the uploaded file that contains training examples. See
+ * [upload file](/docs/api-reference/files/upload) for how to upload a file of the
+ * desired format and purpose.
+ *
+ * You should specify either `examples` or `file`, but not both.
+ */
+ file?: string | null;
+
+ /**
+ * The set of categories being classified. If not specified, candidate labels will
+ * be automatically collected from the examples you provide. All the label strings
+ * will be normalized to be capitalized.
+ */
+ labels?: Array | null;
+
+ /**
+ * Modify the likelihood of specified tokens appearing in the completion.
+ *
+ * Accepts a json object that maps tokens (specified by their token ID in the GPT
+ * tokenizer) to an associated bias value from -100 to 100. You can use this
+ * [tokenizer tool](/tokenizer?view=bpe) (which works for both GPT-2 and GPT-3) to
+ * convert text to token IDs. Mathematically, the bias is added to the logits
+ * generated by the model prior to sampling. The exact effect will vary per model,
+ * but values between -1 and 1 should decrease or increase likelihood of selection;
+ * values like -100 or 100 should result in a ban or exclusive selection of the
+ * relevant token.
+ *
+ * As an example, you can pass `{"50256": -100}` to prevent the <|endoftext|> token
+ * from being generated.
+ */
+ logit_bias?: unknown | null;
+
+ /**
+ * Include the log probabilities on the `logprobs` most likely tokens, as well the
+ * chosen tokens. For example, if `logprobs` is 5, the API will return a list of
+ * the 5 most likely tokens. The API will always return the `logprob` of the
+ * sampled token, so there may be up to `logprobs+1` elements in the response.
+ *
+ * The maximum value for `logprobs` is 5.
+ *
+ * When `logprobs` is set, `completion` will be automatically added into `expand`
+ * to get the logprobs.
+ */
+ logprobs?: number | null;
+
+ /**
+ * The maximum number of examples to be ranked by
+ * [Search](/docs/api-reference/searches/create) when using `file`. Setting it to a
+ * higher value leads to improved accuracy but with increased latency and cost.
+ */
+ max_examples?: number | null;
+
+ /**
+ * A special boolean flag for showing metadata. If set to `true`, each document
+ * entry in the returned JSON will contain a "metadata" field.
+ *
+ * This flag only takes effect when `file` is set.
+ */
+ return_metadata?: boolean | null;
+
+ /**
+ * If set to `true`, the returned JSON will include a "prompt" field containing the
+ * final prompt that was used to request a completion. This is mainly useful for
+ * debugging purposes.
+ */
+ return_prompt?: boolean | null;
+
+ /**
+ * ID of the model to use for [Search](/docs/api-reference/searches/create). You
+ * can select one of `ada`, `babbage`, `curie`, or `davinci`.
+ */
+ search_model?: string | null;
+
+ /**
+ * What sampling temperature to use, between 0 and 2. Higher values like 0.8 will
+ * make the output more random, while lower values like 0.2 will make it more
+ * focused and deterministic.
+ */
+ temperature?: number | null;
+
+ /**
+ * A unique identifier representing your end-user, which can help OpenAI to monitor
+ * and detect abuse. [Learn more](/docs/guides/safety-best-practices/end-user-ids).
+ */
+ user?: string;
+}
diff --git a/resources/completions.ts b/resources/completions.ts
new file mode 100644
index 000000000..ad3a1f743
--- /dev/null
+++ b/resources/completions.ts
@@ -0,0 +1,371 @@
+// File generated from our OpenAPI spec by Stainless.
+
+import * as Core from '~/core';
+import { APIResource } from '~/resource';
+import { Stream } from '~/streaming';
+
+export class Completions extends APIResource {
+ /**
+ * Creates a completion for the provided prompt and parameters.
+ */
+ create(
+ body: CompletionCreateParams.CreateCompletionRequestNonStreaming,
+ options?: Core.RequestOptions,
+ ): Promise>;
+ create(
+ body: CompletionCreateParams.CreateCompletionRequestStreaming,
+ options?: Core.RequestOptions,
+ ): Promise>>;
+ create(
+ body: CompletionCreateParams,
+ options?: Core.RequestOptions,
+ ): Promise>> {
+ return this.post('/completions', { body, ...options, stream: body.stream ?? false });
+ }
+}
+
+export interface Completion {
+ choices: Array;
+
+ created: number;
+
+ id: string;
+
+ model: string;
+
+ object: string;
+
+ usage?: Completion.Usage;
+}
+
+export namespace Completion {
+ export interface Usage {
+ completion_tokens: number;
+
+ prompt_tokens: number;
+
+ total_tokens: number;
+ }
+}
+
+export interface CompletionChoice {
+ finish_reason: 'stop' | 'length';
+
+ index: number;
+
+ logprobs: CompletionChoice.Logprobs | null;
+
+ text: string;
+}
+
+export namespace CompletionChoice {
+ export interface Logprobs {
+ text_offset?: Array;
+
+ token_logprobs?: Array;
+
+ tokens?: Array;
+
+ top_logprobs?: Array;
+ }
+}
+
+export type CompletionCreateParams =
+ | CompletionCreateParams.CreateCompletionRequestNonStreaming
+ | CompletionCreateParams.CreateCompletionRequestStreaming;
+
+export namespace CompletionCreateParams {
+ export interface CreateCompletionRequestNonStreaming {
+ /**
+ * ID of the model to use. You can use the
+ * [List models](/docs/api-reference/models/list) API to see all of your available
+ * models, or see our [Model overview](/docs/models/overview) for descriptions of
+ * them.
+ */
+ model: string;
+
+ /**
+ * The prompt(s) to generate completions for, encoded as a string, array of
+ * strings, array of tokens, or array of token arrays.
+ *
+ * Note that <|endoftext|> is the document separator that the model sees during
+ * training, so if a prompt is not specified the model will generate as if from the
+ * beginning of a new document.
+ */
+ prompt: string | Array | Array | Array> | null;
+
+ /**
+ * Generates `best_of` completions server-side and returns the "best" (the one with
+ * the highest log probability per token). Results cannot be streamed.
+ *
+ * When used with `n`, `best_of` controls the number of candidate completions and
+ * `n` specifies how many to return – `best_of` must be greater than `n`.
+ *
+ * **Note:** Because this parameter generates many completions, it can quickly
+ * consume your token quota. Use carefully and ensure that you have reasonable
+ * settings for `max_tokens` and `stop`.
+ */
+ best_of?: number | null;
+
+ /**
+ * Echo back the prompt in addition to the completion
+ */
+ echo?: boolean | null;
+
+ /**
+ * Number between -2.0 and 2.0. Positive values penalize new tokens based on their
+ * existing frequency in the text so far, decreasing the model's likelihood to
+ * repeat the same line verbatim.
+ *
+ * [See more information about frequency and presence penalties.](/docs/api-reference/parameter-details)
+ */
+ frequency_penalty?: number | null;
+
+ /**
+ * Modify the likelihood of specified tokens appearing in the completion.
+ *
+ * Accepts a json object that maps tokens (specified by their token ID in the GPT
+ * tokenizer) to an associated bias value from -100 to 100. You can use this
+ * [tokenizer tool](/tokenizer?view=bpe) (which works for both GPT-2 and GPT-3) to
+ * convert text to token IDs. Mathematically, the bias is added to the logits
+ * generated by the model prior to sampling. The exact effect will vary per model,
+ * but values between -1 and 1 should decrease or increase likelihood of selection;
+ * values like -100 or 100 should result in a ban or exclusive selection of the
+ * relevant token.
+ *
+ * As an example, you can pass `{"50256": -100}` to prevent the <|endoftext|> token
+ * from being generated.
+ */
+ logit_bias?: unknown | null;
+
+ /**
+ * Include the log probabilities on the `logprobs` most likely tokens, as well the
+ * chosen tokens. For example, if `logprobs` is 5, the API will return a list of
+ * the 5 most likely tokens. The API will always return the `logprob` of the
+ * sampled token, so there may be up to `logprobs+1` elements in the response.
+ *
+ * The maximum value for `logprobs` is 5.
+ */
+ logprobs?: number | null;
+
+ /**
+ * The maximum number of [tokens](/tokenizer) to generate in the completion.
+ *
+ * The token count of your prompt plus `max_tokens` cannot exceed the model's
+ * context length.
+ * [Example Python code](https://github.com/openai/openai-cookbook/blob/main/examples/How_to_count_tokens_with_tiktoken.ipynb)
+ * for counting tokens.
+ */
+ max_tokens?: number | null;
+
+ /**
+ * How many completions to generate for each prompt.
+ *
+ * **Note:** Because this parameter generates many completions, it can quickly
+ * consume your token quota. Use carefully and ensure that you have reasonable
+ * settings for `max_tokens` and `stop`.
+ */
+ n?: number | null;
+
+ /**
+ * Number between -2.0 and 2.0. Positive values penalize new tokens based on
+ * whether they appear in the text so far, increasing the model's likelihood to
+ * talk about new topics.
+ *
+ * [See more information about frequency and presence penalties.](/docs/api-reference/parameter-details)
+ */
+ presence_penalty?: number | null;
+
+ /**
+ * Up to 4 sequences where the API will stop generating further tokens. The
+ * returned text will not contain the stop sequence.
+ */
+ stop?: string | null | Array;
+
+ /**
+ * Whether to stream back partial progress. If set, tokens will be sent as
+ * data-only
+ * [server-sent events](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events#Event_stream_format)
+ * as they become available, with the stream terminated by a `data: [DONE]`
+ * message.
+ * [Example Python code](https://github.com/openai/openai-cookbook/blob/main/examples/How_to_stream_completions.ipynb).
+ */
+ stream?: false | null;
+
+ /**
+ * The suffix that comes after a completion of inserted text.
+ */
+ suffix?: string | null;
+
+ /**
+ * What sampling temperature to use, between 0 and 2. Higher values like 0.8 will
+ * make the output more random, while lower values like 0.2 will make it more
+ * focused and deterministic.
+ *
+ * We generally recommend altering this or `top_p` but not both.
+ */
+ temperature?: number | null;
+
+ /**
+ * An alternative to sampling with temperature, called nucleus sampling, where the
+ * model considers the results of the tokens with top_p probability mass. So 0.1
+ * means only the tokens comprising the top 10% probability mass are considered.
+ *
+ * We generally recommend altering this or `temperature` but not both.
+ */
+ top_p?: number | null;
+
+ /**
+ * A unique identifier representing your end-user, which can help OpenAI to monitor
+ * and detect abuse. [Learn more](/docs/guides/safety-best-practices/end-user-ids).
+ */
+ user?: string;
+ }
+
+ export interface CreateCompletionRequestStreaming {
+ /**
+ * ID of the model to use. You can use the
+ * [List models](/docs/api-reference/models/list) API to see all of your available
+ * models, or see our [Model overview](/docs/models/overview) for descriptions of
+ * them.
+ */
+ model: string;
+
+ /**
+ * The prompt(s) to generate completions for, encoded as a string, array of
+ * strings, array of tokens, or array of token arrays.
+ *
+ * Note that <|endoftext|> is the document separator that the model sees during
+ * training, so if a prompt is not specified the model will generate as if from the
+ * beginning of a new document.
+ */
+ prompt: string | Array | Array | Array> | null;
+
+ /**
+ * Whether to stream back partial progress. If set, tokens will be sent as
+ * data-only
+ * [server-sent events](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events#Event_stream_format)
+ * as they become available, with the stream terminated by a `data: [DONE]`
+ * message.
+ * [Example Python code](https://github.com/openai/openai-cookbook/blob/main/examples/How_to_stream_completions.ipynb).
+ */
+ stream: true;
+
+ /**
+ * Generates `best_of` completions server-side and returns the "best" (the one with
+ * the highest log probability per token). Results cannot be streamed.
+ *
+ * When used with `n`, `best_of` controls the number of candidate completions and
+ * `n` specifies how many to return – `best_of` must be greater than `n`.
+ *
+ * **Note:** Because this parameter generates many completions, it can quickly
+ * consume your token quota. Use carefully and ensure that you have reasonable
+ * settings for `max_tokens` and `stop`.
+ */
+ best_of?: number | null;
+
+ /**
+ * Echo back the prompt in addition to the completion
+ */
+ echo?: boolean | null;
+
+ /**
+ * Number between -2.0 and 2.0. Positive values penalize new tokens based on their
+ * existing frequency in the text so far, decreasing the model's likelihood to
+ * repeat the same line verbatim.
+ *
+ * [See more information about frequency and presence penalties.](/docs/api-reference/parameter-details)
+ */
+ frequency_penalty?: number | null;
+
+ /**
+ * Modify the likelihood of specified tokens appearing in the completion.
+ *
+ * Accepts a json object that maps tokens (specified by their token ID in the GPT
+ * tokenizer) to an associated bias value from -100 to 100. You can use this
+ * [tokenizer tool](/tokenizer?view=bpe) (which works for both GPT-2 and GPT-3) to
+ * convert text to token IDs. Mathematically, the bias is added to the logits
+ * generated by the model prior to sampling. The exact effect will vary per model,
+ * but values between -1 and 1 should decrease or increase likelihood of selection;
+ * values like -100 or 100 should result in a ban or exclusive selection of the
+ * relevant token.
+ *
+ * As an example, you can pass `{"50256": -100}` to prevent the <|endoftext|> token
+ * from being generated.
+ */
+ logit_bias?: unknown | null;
+
+ /**
+ * Include the log probabilities on the `logprobs` most likely tokens, as well the
+ * chosen tokens. For example, if `logprobs` is 5, the API will return a list of
+ * the 5 most likely tokens. The API will always return the `logprob` of the
+ * sampled token, so there may be up to `logprobs+1` elements in the response.
+ *
+ * The maximum value for `logprobs` is 5.
+ */
+ logprobs?: number | null;
+
+ /**
+ * The maximum number of [tokens](/tokenizer) to generate in the completion.
+ *
+ * The token count of your prompt plus `max_tokens` cannot exceed the model's
+ * context length.
+ * [Example Python code](https://github.com/openai/openai-cookbook/blob/main/examples/How_to_count_tokens_with_tiktoken.ipynb)
+ * for counting tokens.
+ */
+ max_tokens?: number | null;
+
+ /**
+ * How many completions to generate for each prompt.
+ *
+ * **Note:** Because this parameter generates many completions, it can quickly
+ * consume your token quota. Use carefully and ensure that you have reasonable
+ * settings for `max_tokens` and `stop`.
+ */
+ n?: number | null;
+
+ /**
+ * Number between -2.0 and 2.0. Positive values penalize new tokens based on
+ * whether they appear in the text so far, increasing the model's likelihood to
+ * talk about new topics.
+ *
+ * [See more information about frequency and presence penalties.](/docs/api-reference/parameter-details)
+ */
+ presence_penalty?: number | null;
+
+ /**
+ * Up to 4 sequences where the API will stop generating further tokens. The
+ * returned text will not contain the stop sequence.
+ */
+ stop?: string | null | Array;
+
+ /**
+ * The suffix that comes after a completion of inserted text.
+ */
+ suffix?: string | null;
+
+ /**
+ * What sampling temperature to use, between 0 and 2. Higher values like 0.8 will
+ * make the output more random, while lower values like 0.2 will make it more
+ * focused and deterministic.
+ *
+ * We generally recommend altering this or `top_p` but not both.
+ */
+ temperature?: number | null;
+
+ /**
+ * An alternative to sampling with temperature, called nucleus sampling, where the
+ * model considers the results of the tokens with top_p probability mass. So 0.1
+ * means only the tokens comprising the top 10% probability mass are considered.
+ *
+ * We generally recommend altering this or `temperature` but not both.
+ */
+ top_p?: number | null;
+
+ /**
+ * A unique identifier representing your end-user, which can help OpenAI to monitor
+ * and detect abuse. [Learn more](/docs/guides/safety-best-practices/end-user-ids).
+ */
+ user?: string;
+ }
+}
diff --git a/resources/edits.ts b/resources/edits.ts
new file mode 100644
index 000000000..856ba0089
--- /dev/null
+++ b/resources/edits.ts
@@ -0,0 +1,96 @@
+// File generated from our OpenAPI spec by Stainless.
+
+import * as Core from '~/core';
+import { APIResource } from '~/resource';
+
+export class Edits extends APIResource {
+ /**
+ * Creates a new edit for the provided input, instruction, and parameters.
+ */
+ create(body: EditCreateParams, options?: Core.RequestOptions): Promise> {
+ return this.post('/edits', { body, ...options });
+ }
+}
+
+export interface Edit {
+ choices: Array;
+
+ created: number;
+
+ object: string;
+
+ usage: Edit.Usage;
+}
+
+export namespace Edit {
+ export interface Choices {
+ finish_reason?: 'stop' | 'length';
+
+ index?: number;
+
+ logprobs?: Choices.Logprobs | null;
+
+ text?: string;
+ }
+
+ export namespace Choices {
+ export interface Logprobs {
+ text_offset?: Array;
+
+ token_logprobs?: Array;
+
+ tokens?: Array;
+
+ top_logprobs?: Array;
+ }
+ }
+
+ export interface Usage {
+ completion_tokens: number;
+
+ prompt_tokens: number;
+
+ total_tokens: number;
+ }
+}
+
+export interface EditCreateParams {
+ /**
+ * The instruction that tells the model how to edit the prompt.
+ */
+ instruction: string;
+
+ /**
+ * ID of the model to use. You can use the `text-davinci-edit-001` or
+ * `code-davinci-edit-001` model with this endpoint.
+ */
+ model: string;
+
+ /**
+ * The input text to use as a starting point for the edit.
+ */
+ input?: string | null;
+
+ /**
+ * How many edits to generate for the input and instruction.
+ */
+ n?: number | null;
+
+ /**
+ * What sampling temperature to use, between 0 and 2. Higher values like 0.8 will
+ * make the output more random, while lower values like 0.2 will make it more
+ * focused and deterministic.
+ *
+ * We generally recommend altering this or `top_p` but not both.
+ */
+ temperature?: number | null;
+
+ /**
+ * An alternative to sampling with temperature, called nucleus sampling, where the
+ * model considers the results of the tokens with top_p probability mass. So 0.1
+ * means only the tokens comprising the top 10% probability mass are considered.
+ *
+ * We generally recommend altering this or `temperature` but not both.
+ */
+ top_p?: number | null;
+}
diff --git a/resources/embeddings.ts b/resources/embeddings.ts
new file mode 100644
index 000000000..ae1c62f3e
--- /dev/null
+++ b/resources/embeddings.ts
@@ -0,0 +1,65 @@
+// File generated from our OpenAPI spec by Stainless.
+
+import * as Core from '~/core';
+import { APIResource } from '~/resource';
+
+export class Embeddings extends APIResource {
+ /**
+ * Creates an embedding vector representing the input text.
+ */
+ create(body: EmbeddingCreateParams, options?: Core.RequestOptions): Promise> {
+ return this.post('/embeddings', { body, ...options });
+ }
+}
+
+export interface Embedding {
+ data: Array;
+
+ model: string;
+
+ object: string;
+
+ usage: Embedding.Usage;
+}
+
+export namespace Embedding {
+ export interface Data {
+ embedding: Array;
+
+ index: number;
+
+ object: string;
+ }
+
+ export interface Usage {
+ prompt_tokens: number;
+
+ total_tokens: number;
+ }
+}
+
+export interface EmbeddingCreateParams {
+ /**
+ * Input text to embed, encoded as a string or array of tokens. To embed multiple
+ * inputs in a single request, pass an array of strings or array of token arrays.
+ * Each input must not exceed the max input tokens for the model (8191 tokens for
+ * `text-embedding-ada-002`).
+ * [Example Python code](https://github.com/openai/openai-cookbook/blob/main/examples/How_to_count_tokens_with_tiktoken.ipynb)
+ * for counting tokens.
+ */
+ input: string | Array | Array | Array>;
+
+ /**
+ * ID of the model to use. You can use the
+ * [List models](/docs/api-reference/models/list) API to see all of your available
+ * models, or see our [Model overview](/docs/models/overview) for descriptions of
+ * them.
+ */
+ model: string;
+
+ /**
+ * A unique identifier representing your end-user, which can help OpenAI to monitor
+ * and detect abuse. [Learn more](/docs/guides/safety-best-practices/end-user-ids).
+ */
+ user?: string;
+}
diff --git a/resources/files.ts b/resources/files.ts
new file mode 100644
index 000000000..9ecadfd42
--- /dev/null
+++ b/resources/files.ts
@@ -0,0 +1,104 @@
+// File generated from our OpenAPI spec by Stainless.
+
+import * as Core from '~/core';
+import { APIResource } from '~/resource';
+import type * as FormData from 'formdata-node';
+import { multipartFormRequestOptions } from '~/core';
+
+export class Files extends APIResource {
+ /**
+ * Upload a file that contains document(s) to be used across various
+ * endpoints/features. Currently, the size of all the files uploaded by one
+ * organization can be up to 1 GB. Please contact us if you need to increase the
+ * storage limit.
+ */
+ create(body: FileCreateParams, options?: Core.RequestOptions): Promise> {
+ return this.post('/files', multipartFormRequestOptions({ body, ...options }));
+ }
+
+ /**
+ * Returns information about a specific file.
+ */
+ retrieve(fileId: string, options?: Core.RequestOptions): Promise> {
+ return this.get(`/files/${fileId}`, options);
+ }
+
+ /**
+ * Returns a list of files that belong to the user's organization.
+ */
+ list(options?: Core.RequestOptions): Promise> {
+ return this.get('/files', options);
+ }
+
+ /**
+ * Delete a file.
+ */
+ del(fileId: string, options?: Core.RequestOptions): Promise> {
+ return this.delete(`/files/${fileId}`, options);
+ }
+
+ /**
+ * Returns the contents of the specified file
+ */
+ retrieveFileContent(
+ fileId: string,
+ options?: Core.RequestOptions,
+ ): Promise>> {
+ return this.get(`/files/${fileId}/content`, {
+ ...options,
+ headers: { Accept: 'application/json', ...options?.headers },
+ });
+ }
+}
+
+export interface File {
+ bytes: number;
+
+ created_at: number;
+
+ filename: string;
+
+ id: string;
+
+ object: string;
+
+ purpose: string;
+
+ status?: string;
+}
+
+export interface FileListResponse {
+ data: Array;
+
+ object: string;
+}
+
+export interface FileDeleteResponse {
+ deleted: boolean;
+
+ id: string;
+
+ object: string;
+}
+
+export type FileRetrieveFileContentResponse = string;
+
+export interface FileCreateParams {
+ /**
+ * Name of the [JSON Lines](https://jsonlines.readthedocs.io/en/latest/) file to be
+ * uploaded.
+ *
+ * If the `purpose` is set to "fine-tune", each line is a JSON record with "prompt"
+ * and "completion" fields representing your
+ * [training examples](/docs/guides/fine-tuning/prepare-training-data).
+ */
+ file: FormData.Blob | FormData.File;
+
+ /**
+ * The intended purpose of the uploaded documents.
+ *
+ * Use "fine-tune" for [Fine-tuning](/docs/api-reference/fine-tunes). This allows
+ * us to validate the format of the uploaded file.
+ */
+ purpose: string;
+}
diff --git a/resources/fine-tunes.ts b/resources/fine-tunes.ts
new file mode 100644
index 000000000..4d88581eb
--- /dev/null
+++ b/resources/fine-tunes.ts
@@ -0,0 +1,277 @@
+// File generated from our OpenAPI spec by Stainless.
+
+import * as Core from '~/core';
+import { APIResource } from '~/resource';
+import * as Files from '~/resources/files';
+import { Stream } from '~/streaming';
+
+export class FineTunes extends APIResource {
+ /**
+ * Creates a job that fine-tunes a specified model from a given dataset.
+ *
+ * Response includes details of the enqueued job including job status and the name
+ * of the fine-tuned models once complete.
+ *
+ * [Learn more about Fine-tuning](/docs/guides/fine-tuning)
+ */
+ create(body: FineTuneCreateParams, options?: Core.RequestOptions): Promise> {
+ return this.post('/fine-tunes', { body, ...options });
+ }
+
+ /**
+ * Gets info about the fine-tune job.
+ *
+ * [Learn more about Fine-tuning](/docs/guides/fine-tuning)
+ */
+ retrieve(fineTuneId: string, options?: Core.RequestOptions): Promise> {
+ return this.get(`/fine-tunes/${fineTuneId}`, options);
+ }
+
+ /**
+ * List your organization's fine-tuning jobs
+ */
+ list(options?: Core.RequestOptions): Promise> {
+ return this.get('/fine-tunes', options);
+ }
+
+ /**
+ * Immediately cancel a fine-tune job.
+ */
+ cancel(fineTuneId: string, options?: Core.RequestOptions): Promise> {
+ return this.post(`/fine-tunes/${fineTuneId}/cancel`, options);
+ }
+
+ /**
+ * Get fine-grained status updates for a fine-tune job.
+ */
+ listEvents(
+ fineTuneId: string,
+ query?: FineTuneListEventsParams.ListEventsRequestNonStreaming,
+ options?: Core.RequestOptions,
+ ): Promise>;
+ listEvents(
+ fineTuneId: string,
+ query: FineTuneListEventsParams.ListEventsRequestStreaming,
+ options?: Core.RequestOptions,
+ ): Promise>>;
+ listEvents(
+ fineTuneId: string,
+ query?: FineTuneListEventsParams | undefined,
+ options?: Core.RequestOptions,
+ ): Promise>> {
+ return this.get(`/fine-tunes/${fineTuneId}/events`, {
+ query,
+ ...options,
+ stream: query?.stream ?? false,
+ });
+ }
+}
+
+export interface FineTune {
+ created_at: number;
+
+ fine_tuned_model: string | null;
+
+ hyperparams: unknown;
+
+ id: string;
+
+ model: string;
+
+ object: string;
+
+ organization_id: string;
+
+ result_files: Array;
+
+ status: string;
+
+ training_files: Array;
+
+ updated_at: number;
+
+ validation_files: Array;
+
+ events?: Array;
+}
+
+export interface FineTuneEvent {
+ created_at: number;
+
+ level: string;
+
+ message: string;
+
+ object: string;
+}
+
+export interface ListFineTuneEventsResponse {
+ data: Array;
+
+ object: string;
+}
+
+export interface ListFineTunesResponse {
+ data: Array;
+
+ object: string;
+}
+
+export interface FineTuneCreateParams {
+ /**
+ * The ID of an uploaded file that contains training data.
+ *
+ * See [upload file](/docs/api-reference/files/upload) for how to upload a file.
+ *
+ * Your dataset must be formatted as a JSONL file, where each training example is a
+ * JSON object with the keys "prompt" and "completion". Additionally, you must
+ * upload your file with the purpose `fine-tune`.
+ *
+ * See the [fine-tuning guide](/docs/guides/fine-tuning/creating-training-data) for
+ * more details.
+ */
+ training_file: string;
+
+ /**
+ * The batch size to use for training. The batch size is the number of training
+ * examples used to train a single forward and backward pass.
+ *
+ * By default, the batch size will be dynamically configured to be ~0.2% of the
+ * number of examples in the training set, capped at 256 - in general, we've found
+ * that larger batch sizes tend to work better for larger datasets.
+ */
+ batch_size?: number | null;
+
+ /**
+ * If this is provided, we calculate F-beta scores at the specified beta values.
+ * The F-beta score is a generalization of F-1 score. This is only used for binary
+ * classification.
+ *
+ * With a beta of 1 (i.e. the F-1 score), precision and recall are given the same
+ * weight. A larger beta score puts more weight on recall and less on precision. A
+ * smaller beta score puts more weight on precision and less on recall.
+ */
+ classification_betas?: Array | null;
+
+ /**
+ * The number of classes in a classification task.
+ *
+ * This parameter is required for multiclass classification.
+ */
+ classification_n_classes?: number | null;
+
+ /**
+ * The positive class in binary classification.
+ *
+ * This parameter is needed to generate precision, recall, and F1 metrics when
+ * doing binary classification.
+ */
+ classification_positive_class?: string | null;
+
+ /**
+ * If set, we calculate classification-specific metrics such as accuracy and F-1
+ * score using the validation set at the end of every epoch. These metrics can be
+ * viewed in the
+ * [results file](/docs/guides/fine-tuning/analyzing-your-fine-tuned-model).
+ *
+ * In order to compute classification metrics, you must provide a
+ * `validation_file`. Additionally, you must specify `classification_n_classes` for
+ * multiclass classification or `classification_positive_class` for binary
+ * classification.
+ */
+ compute_classification_metrics?: boolean | null;
+
+ /**
+ * The learning rate multiplier to use for training. The fine-tuning learning rate
+ * is the original learning rate used for pretraining multiplied by this value.
+ *
+ * By default, the learning rate multiplier is the 0.05, 0.1, or 0.2 depending on
+ * final `batch_size` (larger learning rates tend to perform better with larger
+ * batch sizes). We recommend experimenting with values in the range 0.02 to 0.2 to
+ * see what produces the best results.
+ */
+ learning_rate_multiplier?: number | null;
+
+ /**
+ * The name of the base model to fine-tune. You can select one of "ada", "babbage",
+ * "curie", "davinci", or a fine-tuned model created after 2022-04-21. To learn
+ * more about these models, see the
+ * [Models](https://platform.openai.com/docs/models) documentation.
+ */
+ model?: string | null;
+
+ /**
+ * The number of epochs to train the model for. An epoch refers to one full cycle
+ * through the training dataset.
+ */
+ n_epochs?: number | null;
+
+ /**
+ * The weight to use for loss on the prompt tokens. This controls how much the
+ * model tries to learn to generate the prompt (as compared to the completion which
+ * always has a weight of 1.0), and can add a stabilizing effect to training when
+ * completions are short.
+ *
+ * If prompts are extremely long (relative to completions), it may make sense to
+ * reduce this weight so as to avoid over-prioritizing learning the prompt.
+ */
+ prompt_loss_weight?: number | null;
+
+ /**
+ * A string of up to 40 characters that will be added to your fine-tuned model
+ * name.
+ *
+ * For example, a `suffix` of "custom-model-name" would produce a model name like
+ * `ada:ft-your-org:custom-model-name-2022-02-15-04-21-04`.
+ */
+ suffix?: string | null;
+
+ /**
+ * The ID of an uploaded file that contains validation data.
+ *
+ * If you provide this file, the data is used to generate validation metrics
+ * periodically during fine-tuning. These metrics can be viewed in the
+ * [fine-tuning results file](/docs/guides/fine-tuning/analyzing-your-fine-tuned-model).
+ * Your train and validation data should be mutually exclusive.
+ *
+ * Your dataset must be formatted as a JSONL file, where each validation example is
+ * a JSON object with the keys "prompt" and "completion". Additionally, you must
+ * upload your file with the purpose `fine-tune`.
+ *
+ * See the [fine-tuning guide](/docs/guides/fine-tuning/creating-training-data) for
+ * more details.
+ */
+ validation_file?: string | null;
+}
+
+export type FineTuneListEventsParams =
+ | FineTuneListEventsParams.ListEventsRequestNonStreaming
+ | FineTuneListEventsParams.ListEventsRequestStreaming;
+
+export namespace FineTuneListEventsParams {
+ export interface ListEventsRequestNonStreaming {
+ /**
+ * Whether to stream events for the fine-tune job. If set to true, events will be
+ * sent as data-only
+ * [server-sent events](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events#Event_stream_format)
+ * as they become available. The stream will terminate with a `data: [DONE]`
+ * message when the job is finished (succeeded, cancelled, or failed).
+ *
+ * If set to false, only events generated so far will be returned.
+ */
+ stream?: false;
+ }
+
+ export interface ListEventsRequestStreaming {
+ /**
+ * Whether to stream events for the fine-tune job. If set to true, events will be
+ * sent as data-only
+ * [server-sent events](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events#Event_stream_format)
+ * as they become available. The stream will terminate with a `data: [DONE]`
+ * message when the job is finished (succeeded, cancelled, or failed).
+ *
+ * If set to false, only events generated so far will be returned.
+ */
+ stream: true;
+ }
+}
diff --git a/resources/images.ts b/resources/images.ts
new file mode 100644
index 000000000..0a3af2b00
--- /dev/null
+++ b/resources/images.ts
@@ -0,0 +1,153 @@
+// File generated from our OpenAPI spec by Stainless.
+
+import * as Core from '~/core';
+import { APIResource } from '~/resource';
+import type * as FormData from 'formdata-node';
+import { multipartFormRequestOptions } from '~/core';
+
+export class Images extends APIResource {
+ /**
+ * Creates a variation of a given image.
+ */
+ createVariation(
+ body: ImageCreateVariationParams,
+ options?: Core.RequestOptions,
+ ): Promise> {
+ return this.post('/images/variations', multipartFormRequestOptions({ body, ...options }));
+ }
+
+ /**
+ * Creates an edited or extended image given an original image and a prompt.
+ */
+ edit(body: ImageEditParams, options?: Core.RequestOptions): Promise> {
+ return this.post('/images/edits', multipartFormRequestOptions({ body, ...options }));
+ }
+
+ /**
+ * Creates an image given a prompt.
+ */
+ generate(
+ body: ImageGenerateParams,
+ options?: Core.RequestOptions,
+ ): Promise> {
+ return this.post('/images/generations', { body, ...options });
+ }
+}
+
+export interface Image {
+ b64_json?: string;
+
+ url?: string;
+}
+
+export interface ImagesResponse {
+ created: number;
+
+ data: Array;
+}
+
+export interface ImageCreateVariationParams {
+ /**
+ * The image to use as the basis for the variation(s). Must be a valid PNG file,
+ * less than 4MB, and square.
+ */
+ image: FormData.Blob | FormData.File;
+
+ /**
+ * The number of images to generate. Must be between 1 and 10.
+ */
+ n?: number | null;
+
+ /**
+ * The format in which the generated images are returned. Must be one of `url` or
+ * `b64_json`.
+ */
+ response_format?: 'url' | 'b64_json' | null;
+
+ /**
+ * The size of the generated images. Must be one of `256x256`, `512x512`, or
+ * `1024x1024`.
+ */
+ size?: '256x256' | '512x512' | '1024x1024' | null;
+
+ /**
+ * A unique identifier representing your end-user, which can help OpenAI to monitor
+ * and detect abuse. [Learn more](/docs/guides/safety-best-practices/end-user-ids).
+ */
+ user?: string;
+}
+
+export interface ImageEditParams {
+ /**
+ * The image to edit. Must be a valid PNG file, less than 4MB, and square. If mask
+ * is not provided, image must have transparency, which will be used as the mask.
+ */
+ image: FormData.Blob | FormData.File;
+
+ /**
+ * A text description of the desired image(s). The maximum length is 1000
+ * characters.
+ */
+ prompt: string;
+
+ /**
+ * An additional image whose fully transparent areas (e.g. where alpha is zero)
+ * indicate where `image` should be edited. Must be a valid PNG file, less than
+ * 4MB, and have the same dimensions as `image`.
+ */
+ mask?: FormData.Blob | FormData.File;
+
+ /**
+ * The number of images to generate. Must be between 1 and 10.
+ */
+ n?: number | null;
+
+ /**
+ * The format in which the generated images are returned. Must be one of `url` or
+ * `b64_json`.
+ */
+ response_format?: 'url' | 'b64_json' | null;
+
+ /**
+ * The size of the generated images. Must be one of `256x256`, `512x512`, or
+ * `1024x1024`.
+ */
+ size?: '256x256' | '512x512' | '1024x1024' | null;
+
+ /**
+ * A unique identifier representing your end-user, which can help OpenAI to monitor
+ * and detect abuse. [Learn more](/docs/guides/safety-best-practices/end-user-ids).
+ */
+ user?: string;
+}
+
+export interface ImageGenerateParams {
+ /**
+ * A text description of the desired image(s). The maximum length is 1000
+ * characters.
+ */
+ prompt: string;
+
+ /**
+ * The number of images to generate. Must be between 1 and 10.
+ */
+ n?: number | null;
+
+ /**
+ * The format in which the generated images are returned. Must be one of `url` or
+ * `b64_json`.
+ */
+ response_format?: 'url' | 'b64_json' | null;
+
+ /**
+ * The size of the generated images. Must be one of `256x256`, `512x512`, or
+ * `1024x1024`.
+ */
+ size?: '256x256' | '512x512' | '1024x1024' | null;
+
+ /**
+ * A unique identifier representing your end-user, which can help OpenAI to monitor
+ * and detect abuse. [Learn more](/docs/guides/safety-best-practices/end-user-ids).
+ */
+ user?: string;
+}
diff --git a/resources/index.ts b/resources/index.ts
new file mode 100644
index 000000000..d056fd386
--- /dev/null
+++ b/resources/index.ts
@@ -0,0 +1,36 @@
+// File generated from our OpenAPI spec by Stainless.
+
+export { AnswerCreateResponse, AnswerCreateParams, Answers } from './answers';
+export { Audio } from './audio/audio';
+export { Chat } from './chat/chat';
+export { ClassificationCreateResponse, ClassificationCreateParams, Classifications } from './classifications';
+export { Completion, CompletionChoice, CompletionCreateParams, Completions } from './completions';
+export { DeleteModelResponse, ListModelsResponse, Model, Models } from './models';
+export { Edit, EditCreateParams, Edits } from './edits';
+export { Embedding, EmbeddingCreateParams, Embeddings } from './embeddings';
+export {
+ File,
+ FileListResponse,
+ FileDeleteResponse,
+ FileRetrieveFileContentResponse,
+ FileCreateParams,
+ Files,
+} from './files';
+export {
+ FineTune,
+ FineTuneEvent,
+ ListFineTuneEventsResponse,
+ ListFineTunesResponse,
+ FineTuneCreateParams,
+ FineTuneListEventsParams,
+ FineTunes,
+} from './fine-tunes';
+export {
+ Image,
+ ImagesResponse,
+ ImageCreateVariationParams,
+ ImageEditParams,
+ ImageGenerateParams,
+ Images,
+} from './images';
+export { Moderation, ModerationCreateResponse, ModerationCreateParams, Moderations } from './moderations';
diff --git a/resources/models.ts b/resources/models.ts
new file mode 100644
index 000000000..cb7b0da5f
--- /dev/null
+++ b/resources/models.ts
@@ -0,0 +1,53 @@
+// File generated from our OpenAPI spec by Stainless.
+
+import * as Core from '~/core';
+import { APIResource } from '~/resource';
+
+export class Models extends APIResource {
+ /**
+ * Retrieves a model instance, providing basic information about the model such as
+ * the owner and permissioning.
+ */
+ retrieve(model: string, options?: Core.RequestOptions): Promise> {
+ return this.get(`/models/${model}`, options);
+ }
+
+ /**
+ * Lists the currently available models, and provides basic information about each
+ * one such as the owner and availability.
+ */
+ list(options?: Core.RequestOptions): Promise> {
+ return this.get('/models', options);
+ }
+
+ /**
+ * Delete a fine-tuned model. You must have the Owner role in your organization.
+ */
+ del(model: string, options?: Core.RequestOptions): Promise> {
+ return this.delete(`/models/${model}`, options);
+ }
+}
+
+export interface DeleteModelResponse {
+ deleted: boolean;
+
+ id: string;
+
+ object: string;
+}
+
+export interface ListModelsResponse {
+ data: Array;
+
+ object: string;
+}
+
+export interface Model {
+ created: number;
+
+ id: string;
+
+ object: string;
+
+ owned_by: string;
+}
diff --git a/resources/moderations.ts b/resources/moderations.ts
new file mode 100644
index 000000000..3e9ba3718
--- /dev/null
+++ b/resources/moderations.ts
@@ -0,0 +1,85 @@
+// File generated from our OpenAPI spec by Stainless.
+
+import * as Core from '~/core';
+import { APIResource } from '~/resource';
+
+export class Moderations extends APIResource {
+ /**
+ * Classifies if text violates OpenAI's Content Policy
+ */
+ create(
+ body: ModerationCreateParams,
+ options?: Core.RequestOptions,
+ ): Promise> {
+ return this.post('/moderations', { body, ...options });
+ }
+}
+
+export interface Moderation {
+ categories: Moderation.Categories;
+
+ category_scores: Moderation.CategoryScores;
+
+ flagged: boolean;
+}
+
+export namespace Moderation {
+ export interface Categories {
+ hate: boolean;
+
+ 'hate/threatening': boolean;
+
+ 'self-harm': boolean;
+
+ sexual: boolean;
+
+ 'sexual/minors': boolean;
+
+ violence: boolean;
+
+ 'violence/graphic': boolean;
+ }
+
+ export interface CategoryScores {
+ hate: number;
+
+ 'hate/threatening': number;
+
+ 'self-harm': number;
+
+ sexual: number;
+
+ 'sexual/minors': number;
+
+ violence: number;
+
+ 'violence/graphic': number;
+ }
+}
+
+export interface ModerationCreateResponse {
+ id: string;
+
+ model: string;
+
+ results: Array;
+}
+
+export interface ModerationCreateParams {
+ /**
+ * The input text to classify
+ */
+ input: string | Array;
+
+ /**
+ * Two content moderations models are available: `text-moderation-stable` and
+ * `text-moderation-latest`.
+ *
+ * The default is `text-moderation-latest` which will be automatically upgraded
+ * over time. This ensures you are always using our most accurate model. If you use
+ * `text-moderation-stable`, we will provide advanced notice before updating the
+ * model. Accuracy of `text-moderation-stable` may be slightly lower than for
+ * `text-moderation-latest`.
+ */
+ model?: string;
+}
diff --git a/streaming.ts b/streaming.ts
new file mode 100644
index 000000000..c12bafb5b
--- /dev/null
+++ b/streaming.ts
@@ -0,0 +1,205 @@
+import type { Response } from 'node-fetch';
+import { APIResponse, Headers, createResponseHeaders } from '~/core';
+
+type ServerSentEvent = {
+ event: string | null;
+ data: string;
+ raw: string[];
+};
+
+class SSEDecoder {
+ private data: string[];
+ private event: string | null;
+ private chunks: string[];
+
+ constructor() {
+ this.event = null;
+ this.data = [];
+ this.chunks = [];
+ }
+
+ decode(line: string) {
+ if (line.endsWith('\r')) {
+ line = line.substring(0, line.length - 1);
+ }
+
+ if (!line) {
+ // empty line and we didn't previously encounter any messages
+ if (!this.event && !this.data.length) return null;
+
+ const sse: ServerSentEvent = {
+ event: this.event,
+ data: this.data.join('\n'),
+ raw: this.chunks,
+ };
+
+ this.event = null;
+ this.data = [];
+ this.chunks = [];
+
+ return sse;
+ }
+
+ this.chunks.push(line);
+
+ if (line.startsWith(':')) {
+ return null;
+ }
+
+ let [fieldname, _, value] = partition(line, ':');
+
+ if (value.startsWith(' ')) {
+ value = value.substring(1);
+ }
+
+ if (fieldname === 'event') {
+ this.event = value;
+ } else if (fieldname === 'data') {
+ this.data.push(value);
+ }
+
+ return null;
+ }
+}
+
+export class Stream
- implements AsyncIterable
- , APIResponse> {
+ response: Response;
+ responseHeaders: Headers;
+ controller: AbortController;
+
+ private decoder: SSEDecoder;
+
+ constructor(response: Response, controller: AbortController) {
+ this.response = response;
+ this.controller = controller;
+ this.decoder = new SSEDecoder();
+ this.responseHeaders = createResponseHeaders(response.headers);
+ }
+
+ private async *iterMessages(): AsyncGenerator {
+ if (!this.response.body) {
+ this.controller.abort();
+ throw new Error(`Attempted to iterate over a response with no body`);
+ }
+
+ const lineDecoder = new LineDecoder();
+
+ for await (const chunk of this.response.body) {
+ let text;
+ if (chunk instanceof Buffer) {
+ text = chunk.toString();
+ } else {
+ text = chunk;
+ }
+
+ for (const line of lineDecoder.decode(text)) {
+ const sse = this.decoder.decode(line);
+ if (sse) yield sse;
+ }
+ }
+
+ for (const line of lineDecoder.flush()) {
+ const sse = this.decoder.decode(line);
+ if (sse) yield sse;
+ }
+ }
+
+ async *[Symbol.asyncIterator](): AsyncIterator
- {
+ try {
+ for await (const sse of this.iterMessages()) {
+ if (sse.data.startsWith('[DONE]')) {
+ break;
+ }
+
+ if (sse.event === null) {
+ try {
+ yield JSON.parse(sse.data);
+ } catch (e) {
+ console.error(`Could not parse message into JSON:`, sse.data);
+ console.error(`From chunk:`, sse.raw);
+ throw e;
+ }
+ }
+ }
+ } catch (e) {
+ // If the user calls `stream.controller.abort()`, we should exit without throwing.
+ if (e instanceof Error && e.name === 'AbortError') return;
+ throw e;
+ } finally {
+ // If the user `break`s, abort the ongoing request.
+ this.controller.abort();
+ }
+ }
+}
+
+const NEWLINE_CHARS = '\n\r\x0b\x0c\x1c\x1d\x1e\x85\u2028\u2029';
+
+/**
+ * A re-implementation of httpx's `LineDecoder` in Python that handles incrementally
+ * reading lines from text.
+ *
+ * https://github.com/encode/httpx/blob/920333ea98118e9cf617f246905d7b202510941c/httpx/_decoders.py#L258
+ */
+class LineDecoder {
+ buffer: string[];
+ trailingCR: boolean;
+
+ constructor() {
+ this.buffer = [];
+ this.trailingCR = false;
+ }
+
+ decode(text: string): string[] {
+ if (this.trailingCR) {
+ text = '\r' + text;
+ this.trailingCR = false;
+ }
+ if (text.endsWith('\r')) {
+ this.trailingCR = true;
+ text = text.slice(0, -1);
+ }
+
+ if (!text) {
+ return [];
+ }
+
+ const trailing_newline = NEWLINE_CHARS.includes(text.slice(-1));
+ let lines = text.split(/\r\n|[\n\r\x0b\x0c\x1c\x1d\x1e\x85\u2028\u2029]/g);
+
+ if (lines.length === 1 && !trailing_newline) {
+ this.buffer.push(lines[0]!);
+ return [];
+ }
+
+ if (this.buffer.length > 0) {
+ lines = [this.buffer.join('') + lines[0], ...lines.slice(1)];
+ this.buffer = [];
+ }
+
+ if (!trailing_newline) {
+ this.buffer = [lines.pop() || ''];
+ }
+
+ return lines;
+ }
+
+ flush(): string[] {
+ if (!this.buffer.length && !this.trailingCR) {
+ return [];
+ }
+
+ const lines = [this.buffer.join('')];
+ this.buffer = [];
+ this.trailingCR = false;
+ return lines;
+ }
+}
+
+function partition(str: string, delimiter: string): [string, string, string] {
+ const index = str.indexOf(delimiter);
+ if (index !== -1) {
+ return [str.substring(0, index), delimiter, str.substring(index + delimiter.length)];
+ }
+
+ return [str, '', ''];
+}
diff --git a/tests/api-resources/answers.test.ts b/tests/api-resources/answers.test.ts
new file mode 100644
index 000000000..4df121d09
--- /dev/null
+++ b/tests/api-resources/answers.test.ts
@@ -0,0 +1,242 @@
+// File generated from our OpenAPI spec by Stainless.
+
+import OpenAI from '~/index';
+
+const openAI = new OpenAI({ apiKey: 'something1234', baseURL: 'http://127.0.0.1:4010' });
+
+describe('resource answers', () => {
+ test('create: only required params', async () => {
+ const response = await openAI.answers.create({
+ examples: [['x', 'x']],
+ examples_context:
+ "Ottawa, Canada's capital, is located in the east of southern Ontario, near the city of Montréal and the U.S. border.",
+ model: 'string',
+ question: 'What is the capital of Japan?',
+ });
+ });
+
+ test('create: required and optional params', async () => {
+ const response = await openAI.answers.create({
+ examples: [['x', 'x']],
+ examples_context:
+ "Ottawa, Canada's capital, is located in the east of southern Ontario, near the city of Montréal and the U.S. border.",
+ model: 'string',
+ question: 'What is the capital of Japan?',
+ documents: [
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ 'string',
+ ],
+ expand: [{}, {}, {}],
+ file: 'string',
+ logit_bias: {},
+ logprobs: 0,
+ max_rerank: 0,
+ max_tokens: 0,
+ n: 1,
+ return_metadata: true,
+ return_prompt: true,
+ search_model: 'string',
+ stop: '\n',
+ temperature: 0,
+ user: 'user-1234',
+ });
+ });
+});
diff --git a/tests/api-resources/audio/transcriptions.test.ts b/tests/api-resources/audio/transcriptions.test.ts
new file mode 100644
index 000000000..b165bdd69
--- /dev/null
+++ b/tests/api-resources/audio/transcriptions.test.ts
@@ -0,0 +1,28 @@
+// File generated from our OpenAPI spec by Stainless.
+
+import { fileFromPath } from 'formdata-node/file-from-path';
+import OpenAI from '~/index';
+
+const openAI = new OpenAI({ apiKey: 'something1234', baseURL: 'http://127.0.0.1:4010' });
+
+describe('resource transcriptions', () => {
+ // Prism choked, idk
+ test.skip('create: only required params', async () => {
+ const response = await openAI.audio.transcriptions.create({
+ file: await fileFromPath('README.md'),
+ model: 'string',
+ });
+ });
+
+ // Prism choked, idk
+ test.skip('create: required and optional params', async () => {
+ const response = await openAI.audio.transcriptions.create({
+ file: await fileFromPath('README.md'),
+ model: 'string',
+ language: 'string',
+ prompt: 'string',
+ response_format: 'string',
+ temperature: 0,
+ });
+ });
+});
diff --git a/tests/api-resources/audio/translations.test.ts b/tests/api-resources/audio/translations.test.ts
new file mode 100644
index 000000000..0c2c44b2d
--- /dev/null
+++ b/tests/api-resources/audio/translations.test.ts
@@ -0,0 +1,27 @@
+// File generated from our OpenAPI spec by Stainless.
+
+import { fileFromPath } from 'formdata-node/file-from-path';
+import OpenAI from '~/index';
+
+const openAI = new OpenAI({ apiKey: 'something1234', baseURL: 'http://127.0.0.1:4010' });
+
+describe('resource translations', () => {
+ // Prism choked, idk
+ test.skip('create: only required params', async () => {
+ const response = await openAI.audio.translations.create({
+ file: await fileFromPath('README.md'),
+ model: 'string',
+ });
+ });
+
+ // Prism choked, idk
+ test.skip('create: required and optional params', async () => {
+ const response = await openAI.audio.translations.create({
+ file: await fileFromPath('README.md'),
+ model: 'string',
+ prompt: 'string',
+ response_format: 'string',
+ temperature: 0,
+ });
+ });
+});
diff --git a/tests/api-resources/chat/completions.test.ts b/tests/api-resources/chat/completions.test.ts
new file mode 100644
index 000000000..ca4e21195
--- /dev/null
+++ b/tests/api-resources/chat/completions.test.ts
@@ -0,0 +1,40 @@
+// File generated from our OpenAPI spec by Stainless.
+
+import OpenAI from '~/index';
+
+const openAI = new OpenAI({ apiKey: 'something1234', baseURL: 'http://127.0.0.1:4010' });
+
+describe('resource completions', () => {
+ test('create: only required params', async () => {
+ const response = await openAI.chat.completions.create({
+ messages: [{ role: 'system' }],
+ model: 'string',
+ });
+ });
+
+ test('create: required and optional params', async () => {
+ const response = await openAI.chat.completions.create({
+ messages: [
+ {
+ role: 'system',
+ content: 'string',
+ name: 'string',
+ function_call: { name: 'string', arguments: 'string' },
+ },
+ ],
+ model: 'string',
+ frequency_penalty: -2,
+ function_call: 'none',
+ functions: [{ name: 'string', description: 'string', parameters: { foo: 'bar' } }],
+ logit_bias: {},
+ max_tokens: 0,
+ n: 1,
+ presence_penalty: -2,
+ stop: 'string',
+ stream: false,
+ temperature: 1,
+ top_p: 1,
+ user: 'user-1234',
+ });
+ });
+});
diff --git a/tests/api-resources/classifications.test.ts b/tests/api-resources/classifications.test.ts
new file mode 100644
index 000000000..3f63dd56d
--- /dev/null
+++ b/tests/api-resources/classifications.test.ts
@@ -0,0 +1,36 @@
+// File generated from our OpenAPI spec by Stainless.
+
+import OpenAI from '~/index';
+
+const openAI = new OpenAI({ apiKey: 'something1234', baseURL: 'http://127.0.0.1:4010' });
+
+describe('resource classifications', () => {
+ test('create: only required params', async () => {
+ const response = await openAI.classifications.create({
+ model: 'string',
+ query: 'The plot is not very attractive.',
+ });
+ });
+
+ test('create: required and optional params', async () => {
+ const response = await openAI.classifications.create({
+ model: 'string',
+ query: 'The plot is not very attractive.',
+ examples: [
+ ['x', 'x'],
+ ['x', 'x'],
+ ],
+ expand: [{}, {}, {}],
+ file: 'string',
+ labels: ['string', 'string'],
+ logit_bias: {},
+ logprobs: 0,
+ max_examples: 0,
+ return_metadata: true,
+ return_prompt: true,
+ search_model: 'string',
+ temperature: 0,
+ user: 'user-1234',
+ });
+ });
+});
diff --git a/tests/api-resources/completions.test.ts b/tests/api-resources/completions.test.ts
new file mode 100644
index 000000000..2d7e1c688
--- /dev/null
+++ b/tests/api-resources/completions.test.ts
@@ -0,0 +1,32 @@
+// File generated from our OpenAPI spec by Stainless.
+
+import OpenAI from '~/index';
+
+const openAI = new OpenAI({ apiKey: 'something1234', baseURL: 'http://127.0.0.1:4010' });
+
+describe('resource completions', () => {
+ test('create: only required params', async () => {
+ const response = await openAI.completions.create({ model: 'string', prompt: 'This is a test.' });
+ });
+
+ test('create: required and optional params', async () => {
+ const response = await openAI.completions.create({
+ model: 'string',
+ prompt: 'This is a test.',
+ best_of: 0,
+ echo: true,
+ frequency_penalty: -2,
+ logit_bias: {},
+ logprobs: 0,
+ max_tokens: 16,
+ n: 1,
+ presence_penalty: -2,
+ stop: '\n',
+ stream: false,
+ suffix: 'test.',
+ temperature: 1,
+ top_p: 1,
+ user: 'user-1234',
+ });
+ });
+});
diff --git a/tests/api-resources/edits.test.ts b/tests/api-resources/edits.test.ts
new file mode 100644
index 000000000..c1ef992f7
--- /dev/null
+++ b/tests/api-resources/edits.test.ts
@@ -0,0 +1,25 @@
+// File generated from our OpenAPI spec by Stainless.
+
+import OpenAI from '~/index';
+
+const openAI = new OpenAI({ apiKey: 'something1234', baseURL: 'http://127.0.0.1:4010' });
+
+describe('resource edits', () => {
+ test('create: only required params', async () => {
+ const response = await openAI.edits.create({
+ instruction: 'Fix the spelling mistakes.',
+ model: 'string',
+ });
+ });
+
+ test('create: required and optional params', async () => {
+ const response = await openAI.edits.create({
+ instruction: 'Fix the spelling mistakes.',
+ model: 'string',
+ input: 'What day of the wek is it?',
+ n: 1,
+ temperature: 1,
+ top_p: 1,
+ });
+ });
+});
diff --git a/tests/api-resources/embeddings.test.ts b/tests/api-resources/embeddings.test.ts
new file mode 100644
index 000000000..84e4b2d04
--- /dev/null
+++ b/tests/api-resources/embeddings.test.ts
@@ -0,0 +1,22 @@
+// File generated from our OpenAPI spec by Stainless.
+
+import OpenAI from '~/index';
+
+const openAI = new OpenAI({ apiKey: 'something1234', baseURL: 'http://127.0.0.1:4010' });
+
+describe('resource embeddings', () => {
+ test('create: only required params', async () => {
+ const response = await openAI.embeddings.create({
+ input: 'The quick brown fox jumped over the lazy dog',
+ model: 'string',
+ });
+ });
+
+ test('create: required and optional params', async () => {
+ const response = await openAI.embeddings.create({
+ input: 'The quick brown fox jumped over the lazy dog',
+ model: 'string',
+ user: 'user-1234',
+ });
+ });
+});
diff --git a/tests/api-resources/files.test.ts b/tests/api-resources/files.test.ts
new file mode 100644
index 000000000..8174840c7
--- /dev/null
+++ b/tests/api-resources/files.test.ts
@@ -0,0 +1,64 @@
+// File generated from our OpenAPI spec by Stainless.
+
+import { fileFromPath } from 'formdata-node/file-from-path';
+import OpenAI from '~/index';
+
+const openAI = new OpenAI({ apiKey: 'something1234', baseURL: 'http://127.0.0.1:4010' });
+
+describe('resource files', () => {
+ // Prism tests are broken
+ test.skip('create: only required params', async () => {
+ const response = await openAI.files.create({ file: await fileFromPath('README.md'), purpose: 'string' });
+ });
+
+ // Prism tests are broken
+ test.skip('create: required and optional params', async () => {
+ const response = await openAI.files.create({ file: await fileFromPath('README.md'), purpose: 'string' });
+ });
+
+ test('retrieve', async () => {
+ const response = await openAI.files.retrieve('string');
+ });
+
+ test('retrieve: request options instead of params are passed correctly', async () => {
+ // ensure the request options are being passed correctly by passing an invalid HTTP method in order to cause an error
+ await expect(openAI.files.retrieve('string', { path: '/_stainless_unknown_path' })).rejects.toThrow(
+ OpenAI.NotFoundError,
+ );
+ });
+
+ test('list', async () => {
+ const response = await openAI.files.list();
+ });
+
+ test('list: request options instead of params are passed correctly', async () => {
+ // ensure the request options are being passed correctly by passing an invalid HTTP method in order to cause an error
+ await expect(openAI.files.list({ path: '/_stainless_unknown_path' })).rejects.toThrow(
+ OpenAI.NotFoundError,
+ );
+ });
+
+ test('del', async () => {
+ const response = await openAI.files.del('string');
+ });
+
+ test('del: request options instead of params are passed correctly', async () => {
+ // ensure the request options are being passed correctly by passing an invalid HTTP method in order to cause an error
+ await expect(openAI.files.del('string', { path: '/_stainless_unknown_path' })).rejects.toThrow(
+ OpenAI.NotFoundError,
+ );
+ });
+
+ // Prism tests are broken
+ test.skip('retrieveFileContent', async () => {
+ const response = await openAI.files.retrieveFileContent('string');
+ });
+
+ // Prism tests are broken
+ test.skip('retrieveFileContent: request options instead of params are passed correctly', async () => {
+ // ensure the request options are being passed correctly by passing an invalid HTTP method in order to cause an error
+ await expect(
+ openAI.files.retrieveFileContent('string', { path: '/_stainless_unknown_path' }),
+ ).rejects.toThrow(OpenAI.NotFoundError);
+ });
+});
diff --git a/tests/api-resources/fine-tunes.test.ts b/tests/api-resources/fine-tunes.test.ts
new file mode 100644
index 000000000..83428bdd9
--- /dev/null
+++ b/tests/api-resources/fine-tunes.test.ts
@@ -0,0 +1,78 @@
+// File generated from our OpenAPI spec by Stainless.
+
+import OpenAI from '~/index';
+
+const openAI = new OpenAI({ apiKey: 'something1234', baseURL: 'http://127.0.0.1:4010' });
+
+describe('resource fineTunes', () => {
+ test('create: only required params', async () => {
+ const response = await openAI.fineTunes.create({ training_file: 'file-ajSREls59WBbvgSzJSVWxMCB' });
+ });
+
+ test('create: required and optional params', async () => {
+ const response = await openAI.fineTunes.create({
+ training_file: 'file-ajSREls59WBbvgSzJSVWxMCB',
+ batch_size: 0,
+ classification_betas: [0, 0, 0],
+ classification_n_classes: 0,
+ classification_positive_class: 'string',
+ compute_classification_metrics: true,
+ learning_rate_multiplier: 0,
+ model: 'string',
+ n_epochs: 0,
+ prompt_loss_weight: 0,
+ suffix: 'x',
+ validation_file: 'file-XjSREls59WBbvgSzJSVWxMCa',
+ });
+ });
+
+ test('retrieve', async () => {
+ const response = await openAI.fineTunes.retrieve('ft-AF1WoRqd3aJAHsqc9NY7iL8F');
+ });
+
+ test('retrieve: request options instead of params are passed correctly', async () => {
+ // ensure the request options are being passed correctly by passing an invalid HTTP method in order to cause an error
+ await expect(
+ openAI.fineTunes.retrieve('ft-AF1WoRqd3aJAHsqc9NY7iL8F', { path: '/_stainless_unknown_path' }),
+ ).rejects.toThrow(OpenAI.NotFoundError);
+ });
+
+ test('list', async () => {
+ const response = await openAI.fineTunes.list();
+ });
+
+ test('list: request options instead of params are passed correctly', async () => {
+ // ensure the request options are being passed correctly by passing an invalid HTTP method in order to cause an error
+ await expect(openAI.fineTunes.list({ path: '/_stainless_unknown_path' })).rejects.toThrow(
+ OpenAI.NotFoundError,
+ );
+ });
+
+ test('cancel', async () => {
+ const response = await openAI.fineTunes.cancel('ft-AF1WoRqd3aJAHsqc9NY7iL8F');
+ });
+
+ test('cancel: request options instead of params are passed correctly', async () => {
+ // ensure the request options are being passed correctly by passing an invalid HTTP method in order to cause an error
+ await expect(
+ openAI.fineTunes.cancel('ft-AF1WoRqd3aJAHsqc9NY7iL8F', { path: '/_stainless_unknown_path' }),
+ ).rejects.toThrow(OpenAI.NotFoundError);
+ });
+
+ // Prism chokes on this
+ test.skip('listEvents', async () => {
+ const response = await openAI.fineTunes.listEvents('ft-AF1WoRqd3aJAHsqc9NY7iL8F');
+ });
+
+ // Prism chokes on this
+ test.skip('listEvents: request options and params are passed correctly', async () => {
+ // ensure the request options are being passed correctly by passing an invalid HTTP method in order to cause an error
+ await expect(
+ openAI.fineTunes.listEvents(
+ 'ft-AF1WoRqd3aJAHsqc9NY7iL8F',
+ { stream: false },
+ { path: '/_stainless_unknown_path' },
+ ),
+ ).rejects.toThrow(OpenAI.NotFoundError);
+ });
+});
diff --git a/tests/api-resources/images.test.ts b/tests/api-resources/images.test.ts
new file mode 100644
index 000000000..70f0a9cce
--- /dev/null
+++ b/tests/api-resources/images.test.ts
@@ -0,0 +1,61 @@
+// File generated from our OpenAPI spec by Stainless.
+
+import { fileFromPath } from 'formdata-node/file-from-path';
+import OpenAI from '~/index';
+
+const openAI = new OpenAI({ apiKey: 'something1234', baseURL: 'http://127.0.0.1:4010' });
+
+describe('resource images', () => {
+ // Prism choked, idk
+ test.skip('createVariation: only required params', async () => {
+ const response = await openAI.images.createVariation({ image: await fileFromPath('README.md') });
+ });
+
+ // Prism choked, idk
+ test.skip('createVariation: required and optional params', async () => {
+ const response = await openAI.images.createVariation({
+ image: await fileFromPath('README.md'),
+ n: 1,
+ response_format: 'url',
+ size: '1024x1024',
+ user: 'user-1234',
+ });
+ });
+
+ // Prism choked, idk
+ test.skip('edit: only required params', async () => {
+ const response = await openAI.images.edit({
+ image: await fileFromPath('README.md'),
+ prompt: 'A cute baby sea otter wearing a beret',
+ });
+ });
+
+ // Prism choked, idk
+ test.skip('edit: required and optional params', async () => {
+ const response = await openAI.images.edit({
+ image: await fileFromPath('README.md'),
+ prompt: 'A cute baby sea otter wearing a beret',
+ mask: await fileFromPath('README.md'),
+ n: 1,
+ response_format: 'url',
+ size: '1024x1024',
+ user: 'user-1234',
+ });
+ });
+
+ // Prism choked, idk
+ test.skip('generate: only required params', async () => {
+ const response = await openAI.images.generate({ prompt: 'A cute baby sea otter' });
+ });
+
+ // Prism choked, idk
+ test.skip('generate: required and optional params', async () => {
+ const response = await openAI.images.generate({
+ prompt: 'A cute baby sea otter',
+ n: 1,
+ response_format: 'url',
+ size: '1024x1024',
+ user: 'user-1234',
+ });
+ });
+});
diff --git a/tests/api-resources/models.test.ts b/tests/api-resources/models.test.ts
new file mode 100644
index 000000000..a54b5fabf
--- /dev/null
+++ b/tests/api-resources/models.test.ts
@@ -0,0 +1,40 @@
+// File generated from our OpenAPI spec by Stainless.
+
+import OpenAI from '~/index';
+
+const openAI = new OpenAI({ apiKey: 'something1234', baseURL: 'http://127.0.0.1:4010' });
+
+describe('resource models', () => {
+ test('retrieve', async () => {
+ const response = await openAI.models.retrieve('text-davinci-001');
+ });
+
+ test('retrieve: request options instead of params are passed correctly', async () => {
+ // ensure the request options are being passed correctly by passing an invalid HTTP method in order to cause an error
+ await expect(
+ openAI.models.retrieve('text-davinci-001', { path: '/_stainless_unknown_path' }),
+ ).rejects.toThrow(OpenAI.NotFoundError);
+ });
+
+ test('list', async () => {
+ const response = await openAI.models.list();
+ });
+
+ test('list: request options instead of params are passed correctly', async () => {
+ // ensure the request options are being passed correctly by passing an invalid HTTP method in order to cause an error
+ await expect(openAI.models.list({ path: '/_stainless_unknown_path' })).rejects.toThrow(
+ OpenAI.NotFoundError,
+ );
+ });
+
+ test('del', async () => {
+ const response = await openAI.models.del('curie:ft-acmeco-2021-03-03-21-44-20');
+ });
+
+ test('del: request options instead of params are passed correctly', async () => {
+ // ensure the request options are being passed correctly by passing an invalid HTTP method in order to cause an error
+ await expect(
+ openAI.models.del('curie:ft-acmeco-2021-03-03-21-44-20', { path: '/_stainless_unknown_path' }),
+ ).rejects.toThrow(OpenAI.NotFoundError);
+ });
+});
diff --git a/tests/api-resources/moderations.test.ts b/tests/api-resources/moderations.test.ts
new file mode 100644
index 000000000..0a103db5c
--- /dev/null
+++ b/tests/api-resources/moderations.test.ts
@@ -0,0 +1,18 @@
+// File generated from our OpenAPI spec by Stainless.
+
+import OpenAI from '~/index';
+
+const openAI = new OpenAI({ apiKey: 'something1234', baseURL: 'http://127.0.0.1:4010' });
+
+describe('resource moderations', () => {
+ test('create: only required params', async () => {
+ const response = await openAI.moderations.create({ input: 'I want to kill them.' });
+ });
+
+ test('create: required and optional params', async () => {
+ const response = await openAI.moderations.create({
+ input: 'I want to kill them.',
+ model: 'text-moderation-stable',
+ });
+ });
+});
diff --git a/tests/form.test.ts b/tests/form.test.ts
new file mode 100644
index 000000000..cc58aeaf7
--- /dev/null
+++ b/tests/form.test.ts
@@ -0,0 +1,27 @@
+import { multipartFormRequestOptions } from '~/core';
+import { Blob } from 'formdata-node';
+import { fileFromPath } from 'formdata-node/file-from-path';
+
+describe('form data validation', () => {
+ test('valid values do not error', async () => {
+ multipartFormRequestOptions({
+ body: {
+ foo: 'foo',
+ string: 1,
+ bool: true,
+ file: await fileFromPath('README.md'),
+ blob: new Blob(['Some content'], { type: 'text/plain' }),
+ },
+ });
+ });
+
+ test('null', async () => {
+ expect(() =>
+ multipartFormRequestOptions({
+ body: {
+ null: null,
+ },
+ }),
+ ).toThrow(TypeError);
+ });
+});
diff --git a/tests/index.test.ts b/tests/index.test.ts
new file mode 100644
index 000000000..39bee011f
--- /dev/null
+++ b/tests/index.test.ts
@@ -0,0 +1,76 @@
+// File generated from our OpenAPI spec by Stainless.
+
+import { Headers } from '~/core';
+import OpenAI from '../index';
+
+describe('instantiate client', () => {
+ const env = process.env;
+
+ beforeEach(() => {
+ jest.resetModules();
+ process.env = { ...env };
+
+ console.warn = jest.fn();
+ });
+
+ afterEach(() => {
+ process.env = env;
+ });
+
+ test('defaultHeaders are passed through', () => {
+ const client = new OpenAI({ defaultHeaders: { 'X-My-Default-Header': '2' }, apiKey: 'my api key' });
+
+ const { req } = client.buildRequest({ path: '/foo', method: 'post' });
+ expect((req.headers as Headers)['X-My-Default-Header']).toEqual('2');
+ });
+
+ describe('baseUrl', () => {
+ test('trailing slash', () => {
+ const client = new OpenAI({ baseURL: 'http://localhost:5000/custom/path/', apiKey: 'my api key' });
+ expect(client.buildURL('/foo', null)).toEqual('http://localhost:5000/custom/path/foo');
+ });
+
+ test('no trailing slash', () => {
+ const client = new OpenAI({ baseURL: 'http://localhost:5000/custom/path', apiKey: 'my api key' });
+ expect(client.buildURL('/foo', null)).toEqual('http://localhost:5000/custom/path/foo');
+ });
+ });
+
+ test('maxRetries option is correctly set', () => {
+ const client = new OpenAI({ maxRetries: 1, apiKey: 'my api key' });
+ expect(client.maxRetries).toEqual(1);
+
+ // default
+ const client2 = new OpenAI({ apiKey: 'my api key' });
+ expect(client2.maxRetries).toEqual(2);
+ });
+
+ test('with minimal arguments', () => {
+ // set API Key via env var
+ process.env['OPENAI_API_KEY'] = 'env var api key';
+ const client = new OpenAI();
+ expect(client.apiKey).toBe('env var api key');
+ });
+
+ test('with apiKey argument', () => {
+ process.env['OPENAI_API_KEY'] = 'env var api key';
+
+ const client = new OpenAI({ apiKey: 'another api key' });
+ expect(client.apiKey).toBe('another api key');
+ });
+
+ test('with options argument', () => {
+ process.env['OPENAI_API_KEY'] = 'env var api key';
+
+ // apiKey
+ const client = new OpenAI({ apiKey: 'my api key' });
+ expect(client.apiKey).toBe('my api key');
+ });
+
+ test('with disabled authentication', () => {
+ // fails if no API Key provided
+ expect(() => {
+ new OpenAI();
+ }).toThrow();
+ });
+});
diff --git a/tests/responses.test.ts b/tests/responses.test.ts
new file mode 100644
index 000000000..ffd0899c6
--- /dev/null
+++ b/tests/responses.test.ts
@@ -0,0 +1,25 @@
+import { createResponseHeaders } from '~/core';
+import { Headers } from 'node-fetch';
+
+describe('response parsing', () => {
+ // TODO: test unicode characters
+ test('headers are case agnostic', async () => {
+ const headers = createResponseHeaders(new Headers({ 'Content-Type': 'foo', Accept: 'text/plain' }));
+ expect(headers['content-type']).toEqual('foo');
+ expect(headers['Content-type']).toEqual('foo');
+ expect(headers['Content-Type']).toEqual('foo');
+ expect(headers['accept']).toEqual('text/plain');
+ expect(headers['Accept']).toEqual('text/plain');
+ expect(headers['Hello-World']).toBeUndefined();
+ });
+
+ test('duplicate headers are concatenated', () => {
+ const headers = createResponseHeaders(
+ new Headers([
+ ['Content-Type', 'text/xml'],
+ ['Content-Type', 'application/json'],
+ ]),
+ );
+ expect(headers['content-type']).toBe('text/xml, application/json');
+ });
+});
diff --git a/tsconfig.cjs.json b/tsconfig.cjs.json
new file mode 100644
index 000000000..d78d65859
--- /dev/null
+++ b/tsconfig.cjs.json
@@ -0,0 +1,8 @@
+{
+ "extends": "./tsconfig.json",
+ "compilerOptions": {
+ "target": "es2016",
+ "module": "commonjs",
+ "outDir": "dist/cjs/"
+ }
+}
diff --git a/tsconfig.json b/tsconfig.json
new file mode 100644
index 000000000..8e82d667f
--- /dev/null
+++ b/tsconfig.json
@@ -0,0 +1,39 @@
+{
+ "compilerOptions": {
+ "target": "es2019",
+ "lib": ["es2020"],
+ "module": "commonjs",
+ "moduleResolution": "node",
+ "esModuleInterop": true,
+ "rootDir": "./",
+ "baseUrl": "./",
+ "paths": {
+ "~/*": ["*"],
+ "digest-fetch": ["./typings/digest-fetch"]
+ },
+
+ "declaration": true,
+ "declarationMap": true,
+ "outDir": "dist",
+ "pretty": true,
+ "sourceMap": true,
+ "resolveJsonModule": true,
+
+ "forceConsistentCasingInFileNames": true,
+
+ "strict": true,
+ "noImplicitAny": true,
+ "strictNullChecks": true,
+ "strictFunctionTypes": true,
+ "strictBindCallApply": true,
+ "strictPropertyInitialization": true,
+ "noImplicitThis": true,
+ "alwaysStrict": true,
+ "exactOptionalPropertyTypes": true,
+ "noUncheckedIndexedAccess": true,
+ "noImplicitOverride": true,
+ "noPropertyAccessFromIndexSignature": true,
+
+ "skipLibCheck": true
+ }
+}
diff --git a/typings/digest-fetch/index.d.ts b/typings/digest-fetch/index.d.ts
new file mode 100644
index 000000000..f6bcbfda9
--- /dev/null
+++ b/typings/digest-fetch/index.d.ts
@@ -0,0 +1,33 @@
+declare module 'digest-fetch';
+
+import type { RequestInfo, RequestInit, Response } from 'node-fetch';
+
+type Algorithm = 'MD5' | 'MD5-sess';
+
+type Options = {
+ algorithm?: Algorithm;
+ statusCode?: number;
+ cnonceSize?: number;
+ basic?: boolean;
+ precomputeHash?: boolean;
+ logger?: typeof console;
+};
+
+class DigestClient {
+ user: string;
+ password: string;
+
+ private nonceRaw: string;
+ private logger?: typeof console;
+ private precomputedHash?: boolean;
+ private statusCode?: number;
+ private basic: boolean;
+ private cnonceSize: number;
+ private hasAuth: boolean;
+ private digest: { nc: number; algorithm: Algorithm; realm: string };
+
+ constructor(user: string, password: string, options: Options = {});
+ async fetch(url: RequestInfo, options: RequestInit = {}): Promise;
+}
+
+export default DigestClient;
diff --git a/version.ts b/version.ts
new file mode 100644
index 000000000..470bb9184
--- /dev/null
+++ b/version.ts
@@ -0,0 +1 @@
+export const VERSION = 'v4.0.0-beta.0';
diff --git a/yarn.lock b/yarn.lock
new file mode 100644
index 000000000..e208334c3
--- /dev/null
+++ b/yarn.lock
@@ -0,0 +1,4118 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@ampproject/remapping@^2.1.0":
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d"
+ integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==
+ dependencies:
+ "@jridgewell/gen-mapping" "^0.1.0"
+ "@jridgewell/trace-mapping" "^0.3.9"
+
+"@angular/compiler@12.2.16":
+ version "12.2.16"
+ resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-12.2.16.tgz#1aa9b3fbd3fe900118ab371d30c090fbc137a15f"
+ integrity sha512-nsYEw+yu8QyeqPf9nAmG419i1mtGM4v8+U+S3eQHQFXTgJzLymMykWHYu2ETdjUpNSLK6xcIQDBWtWnWSfJjAA==
+ dependencies:
+ tslib "^2.2.0"
+
+"@babel/code-frame@7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a"
+ integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==
+ dependencies:
+ "@babel/highlight" "^7.18.6"
+
+"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789"
+ integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==
+ dependencies:
+ "@babel/highlight" "^7.16.7"
+
+"@babel/compat-data@^7.17.10":
+ version "7.17.10"
+ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.17.10.tgz#711dc726a492dfc8be8220028b1b92482362baab"
+ integrity sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw==
+
+"@babel/core@^7.11.6", "@babel/core@^7.12.3":
+ version "7.17.10"
+ resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.17.10.tgz#74ef0fbf56b7dfc3f198fc2d927f4f03e12f4b05"
+ integrity sha512-liKoppandF3ZcBnIYFjfSDHZLKdLHGJRkoWtG8zQyGJBQfIYobpnVGI5+pLBNtS6psFLDzyq8+h5HiVljW9PNA==
+ dependencies:
+ "@ampproject/remapping" "^2.1.0"
+ "@babel/code-frame" "^7.16.7"
+ "@babel/generator" "^7.17.10"
+ "@babel/helper-compilation-targets" "^7.17.10"
+ "@babel/helper-module-transforms" "^7.17.7"
+ "@babel/helpers" "^7.17.9"
+ "@babel/parser" "^7.17.10"
+ "@babel/template" "^7.16.7"
+ "@babel/traverse" "^7.17.10"
+ "@babel/types" "^7.17.10"
+ convert-source-map "^1.7.0"
+ debug "^4.1.0"
+ gensync "^1.0.0-beta.2"
+ json5 "^2.2.1"
+ semver "^6.3.0"
+
+"@babel/generator@^7.17.10", "@babel/generator@^7.7.2":
+ version "7.17.10"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.17.10.tgz#c281fa35b0c349bbe9d02916f4ae08fc85ed7189"
+ integrity sha512-46MJZZo9y3o4kmhBVc7zW7i8dtR1oIK/sdO5NcfcZRhTGYi+KKJRtHNgsU6c4VUcJmUNV/LQdebD/9Dlv4K+Tg==
+ dependencies:
+ "@babel/types" "^7.17.10"
+ "@jridgewell/gen-mapping" "^0.1.0"
+ jsesc "^2.5.1"
+
+"@babel/helper-compilation-targets@^7.17.10":
+ version "7.17.10"
+ resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.10.tgz#09c63106d47af93cf31803db6bc49fef354e2ebe"
+ integrity sha512-gh3RxjWbauw/dFiU/7whjd0qN9K6nPJMqe6+Er7rOavFh0CQUSwhAE3IcTho2rywPJFxej6TUUHDkWcYI6gGqQ==
+ dependencies:
+ "@babel/compat-data" "^7.17.10"
+ "@babel/helper-validator-option" "^7.16.7"
+ browserslist "^4.20.2"
+ semver "^6.3.0"
+
+"@babel/helper-environment-visitor@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz#ff484094a839bde9d89cd63cba017d7aae80ecd7"
+ integrity sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==
+ dependencies:
+ "@babel/types" "^7.16.7"
+
+"@babel/helper-function-name@^7.17.9":
+ version "7.17.9"
+ resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz#136fcd54bc1da82fcb47565cf16fd8e444b1ff12"
+ integrity sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==
+ dependencies:
+ "@babel/template" "^7.16.7"
+ "@babel/types" "^7.17.0"
+
+"@babel/helper-hoist-variables@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz#86bcb19a77a509c7b77d0e22323ef588fa58c246"
+ integrity sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==
+ dependencies:
+ "@babel/types" "^7.16.7"
+
+"@babel/helper-module-imports@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz#25612a8091a999704461c8a222d0efec5d091437"
+ integrity sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==
+ dependencies:
+ "@babel/types" "^7.16.7"
+
+"@babel/helper-module-transforms@^7.17.7":
+ version "7.17.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz#3943c7f777139e7954a5355c815263741a9c1cbd"
+ integrity sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==
+ dependencies:
+ "@babel/helper-environment-visitor" "^7.16.7"
+ "@babel/helper-module-imports" "^7.16.7"
+ "@babel/helper-simple-access" "^7.17.7"
+ "@babel/helper-split-export-declaration" "^7.16.7"
+ "@babel/helper-validator-identifier" "^7.16.7"
+ "@babel/template" "^7.16.7"
+ "@babel/traverse" "^7.17.3"
+ "@babel/types" "^7.17.0"
+
+"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.8.0":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz#aa3a8ab4c3cceff8e65eb9e73d87dc4ff320b2f5"
+ integrity sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==
+
+"@babel/helper-simple-access@^7.17.7":
+ version "7.17.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz#aaa473de92b7987c6dfa7ce9a7d9674724823367"
+ integrity sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==
+ dependencies:
+ "@babel/types" "^7.17.0"
+
+"@babel/helper-split-export-declaration@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz#0b648c0c42da9d3920d85ad585f2778620b8726b"
+ integrity sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==
+ dependencies:
+ "@babel/types" "^7.16.7"
+
+"@babel/helper-validator-identifier@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad"
+ integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==
+
+"@babel/helper-validator-identifier@^7.18.6":
+ version "7.19.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2"
+ integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==
+
+"@babel/helper-validator-option@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz#b203ce62ce5fe153899b617c08957de860de4d23"
+ integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==
+
+"@babel/helpers@^7.17.9":
+ version "7.17.9"
+ resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.17.9.tgz#b2af120821bfbe44f9907b1826e168e819375a1a"
+ integrity sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q==
+ dependencies:
+ "@babel/template" "^7.16.7"
+ "@babel/traverse" "^7.17.9"
+ "@babel/types" "^7.17.0"
+
+"@babel/highlight@^7.16.7":
+ version "7.17.9"
+ resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.17.9.tgz#61b2ee7f32ea0454612def4fccdae0de232b73e3"
+ integrity sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.16.7"
+ chalk "^2.0.0"
+ js-tokens "^4.0.0"
+
+"@babel/highlight@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf"
+ integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.18.6"
+ chalk "^2.0.0"
+ js-tokens "^4.0.0"
+
+"@babel/parser@7.20.7":
+ version "7.20.7"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.7.tgz#66fe23b3c8569220817d5feb8b9dcdc95bb4f71b"
+ integrity sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg==
+
+"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.16.7", "@babel/parser@^7.17.10":
+ version "7.17.10"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.17.10.tgz#873b16db82a8909e0fbd7f115772f4b739f6ce78"
+ integrity sha512-n2Q6i+fnJqzOaq2VkdXxy2TCPCWQZHiCo0XqmrCvDWcZQKRyZzYi4Z0yxlBuN0w+r2ZHmre+Q087DSrw3pbJDQ==
+
+"@babel/plugin-syntax-async-generators@^7.8.4":
+ version "7.8.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d"
+ integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-bigint@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea"
+ integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-class-properties@^7.8.3":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10"
+ integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.12.13"
+
+"@babel/plugin-syntax-import-meta@^7.8.3":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51"
+ integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-syntax-json-strings@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a"
+ integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-logical-assignment-operators@^7.8.3":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699"
+ integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9"
+ integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-numeric-separator@^7.8.3":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97"
+ integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-syntax-object-rest-spread@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871"
+ integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-optional-catch-binding@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1"
+ integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-optional-chaining@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a"
+ integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-top-level-await@^7.8.3":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c"
+ integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.14.5"
+
+"@babel/plugin-syntax-typescript@^7.7.2":
+ version "7.17.10"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.17.10.tgz#80031e6042cad6a95ed753f672ebd23c30933195"
+ integrity sha512-xJefea1DWXW09pW4Tm9bjwVlPDyYA2it3fWlmEjpYz6alPvTUjL0EOzNzI/FEOyI3r4/J7uVH5UqKgl1TQ5hqQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.16.7"
+
+"@babel/template@^7.16.7", "@babel/template@^7.3.3":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155"
+ integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==
+ dependencies:
+ "@babel/code-frame" "^7.16.7"
+ "@babel/parser" "^7.16.7"
+ "@babel/types" "^7.16.7"
+
+"@babel/traverse@^7.17.10", "@babel/traverse@^7.17.3", "@babel/traverse@^7.17.9", "@babel/traverse@^7.7.2":
+ version "7.17.10"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.17.10.tgz#1ee1a5ac39f4eac844e6cf855b35520e5eb6f8b5"
+ integrity sha512-VmbrTHQteIdUUQNTb+zE12SHS/xQVIShmBPhlNP12hD5poF2pbITW1Z4172d03HegaQWhLffdkRJYtAzp0AGcw==
+ dependencies:
+ "@babel/code-frame" "^7.16.7"
+ "@babel/generator" "^7.17.10"
+ "@babel/helper-environment-visitor" "^7.16.7"
+ "@babel/helper-function-name" "^7.17.9"
+ "@babel/helper-hoist-variables" "^7.16.7"
+ "@babel/helper-split-export-declaration" "^7.16.7"
+ "@babel/parser" "^7.17.10"
+ "@babel/types" "^7.17.10"
+ debug "^4.1.0"
+ globals "^11.1.0"
+
+"@babel/types@^7.0.0", "@babel/types@^7.16.7", "@babel/types@^7.17.0", "@babel/types@^7.17.10", "@babel/types@^7.3.0", "@babel/types@^7.3.3":
+ version "7.17.10"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.17.10.tgz#d35d7b4467e439fcf06d195f8100e0fea7fc82c4"
+ integrity sha512-9O26jG0mBYfGkUYCYZRnBwbVLd1UZOICEr2Em6InB6jVfsAv1GKgwXHmrSg+WFWDmeKTA6vyTZiN8tCSM5Oo3A==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.16.7"
+ to-fast-properties "^2.0.0"
+
+"@bcoe/v8-coverage@^0.2.3":
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39"
+ integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==
+
+"@cspotcode/source-map-consumer@0.8.0":
+ version "0.8.0"
+ resolved "https://registry.yarnpkg.com/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz#33bf4b7b39c178821606f669bbc447a6a629786b"
+ integrity sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==
+
+"@cspotcode/source-map-support@0.7.0":
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz#4789840aa859e46d2f3173727ab707c66bf344f5"
+ integrity sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==
+ dependencies:
+ "@cspotcode/source-map-consumer" "0.8.0"
+
+"@eslint/eslintrc@^1.3.0":
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.3.0.tgz#29f92c30bb3e771e4a2048c95fa6855392dfac4f"
+ integrity sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==
+ dependencies:
+ ajv "^6.12.4"
+ debug "^4.3.2"
+ espree "^9.3.2"
+ globals "^13.15.0"
+ ignore "^5.2.0"
+ import-fresh "^3.2.1"
+ js-yaml "^4.1.0"
+ minimatch "^3.1.2"
+ strip-json-comments "^3.1.1"
+
+"@glimmer/env@0.1.7":
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/@glimmer/env/-/env-0.1.7.tgz#fd2d2b55a9029c6b37a6c935e8c8871ae70dfa07"
+ integrity sha512-JKF/a9I9jw6fGoz8kA7LEQslrwJ5jms5CXhu/aqkBWk+PmZ6pTl8mlb/eJ/5ujBGTiQzBhy5AIWF712iA+4/mw==
+
+"@glimmer/interfaces@0.84.2":
+ version "0.84.2"
+ resolved "https://registry.yarnpkg.com/@glimmer/interfaces/-/interfaces-0.84.2.tgz#764cf92c954adcd1a851e5dc68ec1f6b654dc3bd"
+ integrity sha512-tMZxQpOddUVmHEOuripkNqVR7ba0K4doiYnFd4WyswqoHPlxqpBujbIamQ+bWCWEF0U4yxsXKa31ekS/JHkiBQ==
+ dependencies:
+ "@simple-dom/interface" "^1.4.0"
+
+"@glimmer/syntax@0.84.2":
+ version "0.84.2"
+ resolved "https://registry.yarnpkg.com/@glimmer/syntax/-/syntax-0.84.2.tgz#a3f65e51eec20f6adb79c6159d1ad1166fa5bccd"
+ integrity sha512-SPBd1tpIR9XeaXsXsMRCnKz63eLnIZ0d5G9QC4zIBFBC3pQdtG0F5kWeuRVCdfTIFuR+5WBMfk5jvg+3gbQhjg==
+ dependencies:
+ "@glimmer/interfaces" "0.84.2"
+ "@glimmer/util" "0.84.2"
+ "@handlebars/parser" "~2.0.0"
+ simple-html-tokenizer "^0.5.11"
+
+"@glimmer/util@0.84.2":
+ version "0.84.2"
+ resolved "https://registry.yarnpkg.com/@glimmer/util/-/util-0.84.2.tgz#2711ba40f25f44b2ea309cad49f5c2622c6211bc"
+ integrity sha512-VbhzE2s4rmU+qJF3gGBTL1IDjq+/G2Th51XErS8MQVMCmE4CU2pdwSzec8PyOowqCGUOrVIWuMzEI6VoPM4L4w==
+ dependencies:
+ "@glimmer/env" "0.1.7"
+ "@glimmer/interfaces" "0.84.2"
+ "@simple-dom/interface" "^1.4.0"
+
+"@handlebars/parser@~2.0.0":
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/@handlebars/parser/-/parser-2.0.0.tgz#5e8b7298f31ff8f7b260e6b7363c7e9ceed7d9c5"
+ integrity sha512-EP9uEDZv/L5Qh9IWuMUGJRfwhXJ4h1dqKTT4/3+tY0eu7sPis7xh23j61SYUnNF4vqCQvvUXpDo9Bh/+q1zASA==
+
+"@humanwhocodes/config-array@^0.10.4":
+ version "0.10.4"
+ resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.10.4.tgz#01e7366e57d2ad104feea63e72248f22015c520c"
+ integrity sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw==
+ dependencies:
+ "@humanwhocodes/object-schema" "^1.2.1"
+ debug "^4.1.1"
+ minimatch "^3.0.4"
+
+"@humanwhocodes/gitignore-to-minimatch@^1.0.2":
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz#316b0a63b91c10e53f242efb4ace5c3b34e8728d"
+ integrity sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==
+
+"@humanwhocodes/object-schema@^1.2.1":
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45"
+ integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==
+
+"@iarna/toml@2.2.5":
+ version "2.2.5"
+ resolved "https://registry.yarnpkg.com/@iarna/toml/-/toml-2.2.5.tgz#b32366c89b43c6f8cefbdefac778b9c828e3ba8c"
+ integrity sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==
+
+"@istanbuljs/load-nyc-config@^1.0.0":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced"
+ integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==
+ dependencies:
+ camelcase "^5.3.1"
+ find-up "^4.1.0"
+ get-package-type "^0.1.0"
+ js-yaml "^3.13.1"
+ resolve-from "^5.0.0"
+
+"@istanbuljs/schema@^0.1.2":
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98"
+ integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==
+
+"@jest/console@^28.1.0":
+ version "28.1.0"
+ resolved "https://registry.yarnpkg.com/@jest/console/-/console-28.1.0.tgz#db78222c3d3b0c1db82f1b9de51094c2aaff2176"
+ integrity sha512-tscn3dlJFGay47kb4qVruQg/XWlmvU0xp3EJOjzzY+sBaI+YgwKcvAmTcyYU7xEiLLIY5HCdWRooAL8dqkFlDA==
+ dependencies:
+ "@jest/types" "^28.1.0"
+ "@types/node" "*"
+ chalk "^4.0.0"
+ jest-message-util "^28.1.0"
+ jest-util "^28.1.0"
+ slash "^3.0.0"
+
+"@jest/core@^28.1.0":
+ version "28.1.0"
+ resolved "https://registry.yarnpkg.com/@jest/core/-/core-28.1.0.tgz#784a1e6ce5358b46fcbdcfbbd93b1b713ed4ea80"
+ integrity sha512-/2PTt0ywhjZ4NwNO4bUqD9IVJfmFVhVKGlhvSpmEfUCuxYf/3NHcKmRFI+I71lYzbTT3wMuYpETDCTHo81gC/g==
+ dependencies:
+ "@jest/console" "^28.1.0"
+ "@jest/reporters" "^28.1.0"
+ "@jest/test-result" "^28.1.0"
+ "@jest/transform" "^28.1.0"
+ "@jest/types" "^28.1.0"
+ "@types/node" "*"
+ ansi-escapes "^4.2.1"
+ chalk "^4.0.0"
+ ci-info "^3.2.0"
+ exit "^0.1.2"
+ graceful-fs "^4.2.9"
+ jest-changed-files "^28.0.2"
+ jest-config "^28.1.0"
+ jest-haste-map "^28.1.0"
+ jest-message-util "^28.1.0"
+ jest-regex-util "^28.0.2"
+ jest-resolve "^28.1.0"
+ jest-resolve-dependencies "^28.1.0"
+ jest-runner "^28.1.0"
+ jest-runtime "^28.1.0"
+ jest-snapshot "^28.1.0"
+ jest-util "^28.1.0"
+ jest-validate "^28.1.0"
+ jest-watcher "^28.1.0"
+ micromatch "^4.0.4"
+ pretty-format "^28.1.0"
+ rimraf "^3.0.0"
+ slash "^3.0.0"
+ strip-ansi "^6.0.0"
+
+"@jest/environment@^28.1.0":
+ version "28.1.0"
+ resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-28.1.0.tgz#dedf7d59ec341b9292fcf459fd0ed819eb2e228a"
+ integrity sha512-S44WGSxkRngzHslhV6RoAExekfF7Qhwa6R5+IYFa81mpcj0YgdBnRSmvHe3SNwOt64yXaE5GG8Y2xM28ii5ssA==
+ dependencies:
+ "@jest/fake-timers" "^28.1.0"
+ "@jest/types" "^28.1.0"
+ "@types/node" "*"
+ jest-mock "^28.1.0"
+
+"@jest/expect-utils@^28.1.0":
+ version "28.1.0"
+ resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-28.1.0.tgz#a5cde811195515a9809b96748ae8bcc331a3538a"
+ integrity sha512-5BrG48dpC0sB80wpeIX5FU6kolDJI4K0n5BM9a5V38MGx0pyRvUBSS0u2aNTdDzmOrCjhOg8pGs6a20ivYkdmw==
+ dependencies:
+ jest-get-type "^28.0.2"
+
+"@jest/expect@^28.1.0":
+ version "28.1.0"
+ resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-28.1.0.tgz#2e5a31db692597070932366a1602b5157f0f217c"
+ integrity sha512-be9ETznPLaHOmeJqzYNIXv1ADEzENuQonIoobzThOYPuK/6GhrWNIJDVTgBLCrz3Am73PyEU2urQClZp0hLTtA==
+ dependencies:
+ expect "^28.1.0"
+ jest-snapshot "^28.1.0"
+
+"@jest/fake-timers@^28.1.0":
+ version "28.1.0"
+ resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-28.1.0.tgz#ea77878aabd5c5d50e1fc53e76d3226101e33064"
+ integrity sha512-Xqsf/6VLeAAq78+GNPzI7FZQRf5cCHj1qgQxCjws9n8rKw8r1UYoeaALwBvyuzOkpU3c1I6emeMySPa96rxtIg==
+ dependencies:
+ "@jest/types" "^28.1.0"
+ "@sinonjs/fake-timers" "^9.1.1"
+ "@types/node" "*"
+ jest-message-util "^28.1.0"
+ jest-mock "^28.1.0"
+ jest-util "^28.1.0"
+
+"@jest/globals@^28.1.0":
+ version "28.1.0"
+ resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-28.1.0.tgz#a4427d2eb11763002ff58e24de56b84ba79eb793"
+ integrity sha512-3m7sTg52OTQR6dPhsEQSxAvU+LOBbMivZBwOvKEZ+Rb+GyxVnXi9HKgOTYkx/S99T8yvh17U4tNNJPIEQmtwYw==
+ dependencies:
+ "@jest/environment" "^28.1.0"
+ "@jest/expect" "^28.1.0"
+ "@jest/types" "^28.1.0"
+
+"@jest/reporters@^28.1.0":
+ version "28.1.0"
+ resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-28.1.0.tgz#5183a28b9b593b6000fa9b89b031c7216b58a9a0"
+ integrity sha512-qxbFfqap/5QlSpIizH9c/bFCDKsQlM4uAKSOvZrP+nIdrjqre3FmKzpTtYyhsaVcOSNK7TTt2kjm+4BJIjysFA==
+ dependencies:
+ "@bcoe/v8-coverage" "^0.2.3"
+ "@jest/console" "^28.1.0"
+ "@jest/test-result" "^28.1.0"
+ "@jest/transform" "^28.1.0"
+ "@jest/types" "^28.1.0"
+ "@jridgewell/trace-mapping" "^0.3.7"
+ "@types/node" "*"
+ chalk "^4.0.0"
+ collect-v8-coverage "^1.0.0"
+ exit "^0.1.2"
+ glob "^7.1.3"
+ graceful-fs "^4.2.9"
+ istanbul-lib-coverage "^3.0.0"
+ istanbul-lib-instrument "^5.1.0"
+ istanbul-lib-report "^3.0.0"
+ istanbul-lib-source-maps "^4.0.0"
+ istanbul-reports "^3.1.3"
+ jest-util "^28.1.0"
+ jest-worker "^28.1.0"
+ slash "^3.0.0"
+ string-length "^4.0.1"
+ strip-ansi "^6.0.0"
+ terminal-link "^2.0.0"
+ v8-to-istanbul "^9.0.0"
+
+"@jest/schemas@^28.0.2":
+ version "28.0.2"
+ resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-28.0.2.tgz#08c30df6a8d07eafea0aef9fb222c5e26d72e613"
+ integrity sha512-YVDJZjd4izeTDkij00vHHAymNXQ6WWsdChFRK86qck6Jpr3DCL5W3Is3vslviRlP+bLuMYRLbdp98amMvqudhA==
+ dependencies:
+ "@sinclair/typebox" "^0.23.3"
+
+"@jest/source-map@^28.0.2":
+ version "28.0.2"
+ resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-28.0.2.tgz#914546f4410b67b1d42c262a1da7e0406b52dc90"
+ integrity sha512-Y9dxC8ZpN3kImkk0LkK5XCEneYMAXlZ8m5bflmSL5vrwyeUpJfentacCUg6fOb8NOpOO7hz2+l37MV77T6BFPw==
+ dependencies:
+ "@jridgewell/trace-mapping" "^0.3.7"
+ callsites "^3.0.0"
+ graceful-fs "^4.2.9"
+
+"@jest/test-result@^28.1.0":
+ version "28.1.0"
+ resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-28.1.0.tgz#fd149dee123510dd2fcadbbf5f0020f98ad7f12c"
+ integrity sha512-sBBFIyoPzrZho3N+80P35A5oAkSKlGfsEFfXFWuPGBsW40UAjCkGakZhn4UQK4iQlW2vgCDMRDOob9FGKV8YoQ==
+ dependencies:
+ "@jest/console" "^28.1.0"
+ "@jest/types" "^28.1.0"
+ "@types/istanbul-lib-coverage" "^2.0.0"
+ collect-v8-coverage "^1.0.0"
+
+"@jest/test-sequencer@^28.1.0":
+ version "28.1.0"
+ resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-28.1.0.tgz#ce7294bbe986415b9a30e218c7e705e6ebf2cdf2"
+ integrity sha512-tZCEiVWlWNTs/2iK9yi6o3AlMfbbYgV4uuZInSVdzZ7ftpHZhCMuhvk2HLYhCZzLgPFQ9MnM1YaxMnh3TILFiQ==
+ dependencies:
+ "@jest/test-result" "^28.1.0"
+ graceful-fs "^4.2.9"
+ jest-haste-map "^28.1.0"
+ slash "^3.0.0"
+
+"@jest/transform@^28.1.0":
+ version "28.1.0"
+ resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-28.1.0.tgz#224a3c9ba4cc98e2ff996c0a89a2d59db15c74ce"
+ integrity sha512-omy2xe5WxlAfqmsTjTPxw+iXRTRnf+NtX0ToG+4S0tABeb4KsKmPUHq5UBuwunHg3tJRwgEQhEp0M/8oiatLEA==
+ dependencies:
+ "@babel/core" "^7.11.6"
+ "@jest/types" "^28.1.0"
+ "@jridgewell/trace-mapping" "^0.3.7"
+ babel-plugin-istanbul "^6.1.1"
+ chalk "^4.0.0"
+ convert-source-map "^1.4.0"
+ fast-json-stable-stringify "^2.0.0"
+ graceful-fs "^4.2.9"
+ jest-haste-map "^28.1.0"
+ jest-regex-util "^28.0.2"
+ jest-util "^28.1.0"
+ micromatch "^4.0.4"
+ pirates "^4.0.4"
+ slash "^3.0.0"
+ write-file-atomic "^4.0.1"
+
+"@jest/types@^28.1.0":
+ version "28.1.0"
+ resolved "https://registry.yarnpkg.com/@jest/types/-/types-28.1.0.tgz#508327a89976cbf9bd3e1cc74641a29fd7dfd519"
+ integrity sha512-xmEggMPr317MIOjjDoZ4ejCSr9Lpbt/u34+dvc99t7DS8YirW5rwZEhzKPC2BMUFkUhI48qs6qLUSGw5FuL0GA==
+ dependencies:
+ "@jest/schemas" "^28.0.2"
+ "@types/istanbul-lib-coverage" "^2.0.0"
+ "@types/istanbul-reports" "^3.0.0"
+ "@types/node" "*"
+ "@types/yargs" "^17.0.8"
+ chalk "^4.0.0"
+
+"@jridgewell/gen-mapping@^0.1.0":
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996"
+ integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==
+ dependencies:
+ "@jridgewell/set-array" "^1.0.0"
+ "@jridgewell/sourcemap-codec" "^1.4.10"
+
+"@jridgewell/resolve-uri@^3.0.3":
+ version "3.0.7"
+ resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz#30cd49820a962aff48c8fffc5cd760151fca61fe"
+ integrity sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA==
+
+"@jridgewell/set-array@^1.0.0":
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.1.tgz#36a6acc93987adcf0ba50c66908bd0b70de8afea"
+ integrity sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ==
+
+"@jridgewell/sourcemap-codec@^1.4.10":
+ version "1.4.13"
+ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz#b6461fb0c2964356c469e115f504c95ad97ab88c"
+ integrity sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w==
+
+"@jridgewell/trace-mapping@^0.3.7", "@jridgewell/trace-mapping@^0.3.9":
+ version "0.3.10"
+ resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.10.tgz#db436f0917d655393851bc258918c00226c9b183"
+ integrity sha512-Q0YbBd6OTsXm8Y21+YUSDXupHnodNC2M4O18jtd3iwJ3+vMZNdKGols0a9G6JOK0dcJ3IdUUHoh908ZI6qhk8Q==
+ dependencies:
+ "@jridgewell/resolve-uri" "^3.0.3"
+ "@jridgewell/sourcemap-codec" "^1.4.10"
+
+"@nodelib/fs.scandir@2.1.5":
+ version "2.1.5"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5"
+ integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==
+ dependencies:
+ "@nodelib/fs.stat" "2.0.5"
+ run-parallel "^1.1.9"
+
+"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2":
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b"
+ integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
+
+"@nodelib/fs.walk@^1.2.3":
+ version "1.2.8"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a"
+ integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==
+ dependencies:
+ "@nodelib/fs.scandir" "2.1.5"
+ fastq "^1.6.0"
+
+"@simple-dom/interface@^1.4.0":
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/@simple-dom/interface/-/interface-1.4.0.tgz#e8feea579232017f89b0138e2726facda6fbb71f"
+ integrity sha512-l5qumKFWU0S+4ZzMaLXFU8tQZsicHEMEyAxI5kDFGhJsRqDwe0a7/iPA/GdxlGyDKseQQAgIz5kzU7eXTrlSpA==
+
+"@sinclair/typebox@^0.23.3":
+ version "0.23.5"
+ resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.23.5.tgz#93f7b9f4e3285a7a9ade7557d9a8d36809cbc47d"
+ integrity sha512-AFBVi/iT4g20DHoujvMH1aEDn8fGJh4xsRGCP6d8RpLPMqsNPvW01Jcn0QysXTsg++/xj25NmJsGyH9xug/wKg==
+
+"@sinonjs/commons@^1.7.0":
+ version "1.8.3"
+ resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d"
+ integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==
+ dependencies:
+ type-detect "4.0.8"
+
+"@sinonjs/fake-timers@^9.1.1":
+ version "9.1.2"
+ resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz#4eaab737fab77332ab132d396a3c0d364bd0ea8c"
+ integrity sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==
+ dependencies:
+ "@sinonjs/commons" "^1.7.0"
+
+"@tsconfig/node10@^1.0.7":
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.8.tgz#c1e4e80d6f964fbecb3359c43bd48b40f7cadad9"
+ integrity sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==
+
+"@tsconfig/node12@^1.0.7":
+ version "1.0.9"
+ resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.9.tgz#62c1f6dee2ebd9aead80dc3afa56810e58e1a04c"
+ integrity sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==
+
+"@tsconfig/node14@^1.0.0":
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.1.tgz#95f2d167ffb9b8d2068b0b235302fafd4df711f2"
+ integrity sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==
+
+"@tsconfig/node16@^1.0.2":
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.2.tgz#423c77877d0569db20e1fc80885ac4118314010e"
+ integrity sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==
+
+"@types/babel__core@^7.1.14":
+ version "7.1.19"
+ resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.19.tgz#7b497495b7d1b4812bdb9d02804d0576f43ee460"
+ integrity sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==
+ dependencies:
+ "@babel/parser" "^7.1.0"
+ "@babel/types" "^7.0.0"
+ "@types/babel__generator" "*"
+ "@types/babel__template" "*"
+ "@types/babel__traverse" "*"
+
+"@types/babel__generator@*":
+ version "7.6.4"
+ resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7"
+ integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==
+ dependencies:
+ "@babel/types" "^7.0.0"
+
+"@types/babel__template@*":
+ version "7.4.1"
+ resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969"
+ integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==
+ dependencies:
+ "@babel/parser" "^7.1.0"
+ "@babel/types" "^7.0.0"
+
+"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6":
+ version "7.17.1"
+ resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.17.1.tgz#1a0e73e8c28c7e832656db372b779bfd2ef37314"
+ integrity sha512-kVzjari1s2YVi77D3w1yuvohV2idweYXMCDzqBiVNN63TcDWrIlTVOYpqVrvbbyOE/IyzBoTKF0fdnLPEORFxA==
+ dependencies:
+ "@babel/types" "^7.3.0"
+
+"@types/graceful-fs@^4.1.3":
+ version "4.1.5"
+ resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15"
+ integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==
+ dependencies:
+ "@types/node" "*"
+
+"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1":
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44"
+ integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==
+
+"@types/istanbul-lib-report@*":
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686"
+ integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==
+ dependencies:
+ "@types/istanbul-lib-coverage" "*"
+
+"@types/istanbul-reports@^3.0.0":
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff"
+ integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==
+ dependencies:
+ "@types/istanbul-lib-report" "*"
+
+"@types/jest@^27.5.0":
+ version "27.5.0"
+ resolved "https://registry.yarnpkg.com/@types/jest/-/jest-27.5.0.tgz#e04ed1824ca6b1dd0438997ba60f99a7405d4c7b"
+ integrity sha512-9RBFx7r4k+msyj/arpfaa0WOOEcaAZNmN+j80KFbFCoSqCJGHTz7YMAMGQW9Xmqm5w6l5c25vbSjMwlikJi5+g==
+ dependencies:
+ jest-matcher-utils "^27.0.0"
+ pretty-format "^27.0.0"
+
+"@types/json-schema@^7.0.9":
+ version "7.0.11"
+ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3"
+ integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==
+
+"@types/json5@^0.0.29":
+ version "0.0.29"
+ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee"
+ integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==
+
+"@types/node-fetch@^2.6.1":
+ version "2.6.1"
+ resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.1.tgz#8f127c50481db65886800ef496f20bbf15518975"
+ integrity sha512-oMqjURCaxoSIsHSr1E47QHzbmzNR5rK8McHuNb11BOM9cHcIK3Avy0s/b2JlXHoQGTYS3NsvWzV1M0iK7l0wbA==
+ dependencies:
+ "@types/node" "*"
+ form-data "^3.0.0"
+
+"@types/node@*":
+ version "17.0.21"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.21.tgz#864b987c0c68d07b4345845c3e63b75edd143644"
+ integrity sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ==
+
+"@types/node@^18.11.18":
+ version "18.11.18"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.18.tgz#8dfb97f0da23c2293e554c5a50d61ef134d7697f"
+ integrity sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==
+
+"@types/parse-json@^4.0.0":
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0"
+ integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==
+
+"@types/prettier@^2.1.5":
+ version "2.6.0"
+ resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.6.0.tgz#efcbd41937f9ae7434c714ab698604822d890759"
+ integrity sha512-G/AdOadiZhnJp0jXCaBQU449W2h716OW/EoXeYkCytxKL06X1WCXB4DZpp8TpZ8eyIJVS1cw4lrlkkSYU21cDw==
+
+"@types/qs@^6.9.7":
+ version "6.9.7"
+ resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb"
+ integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==
+
+"@types/stack-utils@^2.0.0":
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c"
+ integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==
+
+"@types/unist@^2.0.0", "@types/unist@^2.0.2":
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz#250a7b16c3b91f672a24552ec64678eeb1d3a08d"
+ integrity sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==
+
+"@types/yargs-parser@*":
+ version "21.0.0"
+ resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b"
+ integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==
+
+"@types/yargs@^17.0.8":
+ version "17.0.10"
+ resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.10.tgz#591522fce85d8739bca7b8bb90d048e4478d186a"
+ integrity sha512-gmEaFwpj/7f/ROdtIlci1R1VYU1J4j95m8T+Tj3iBgiBFKg1foE/PSl93bBd5T9LDXNPo8UlNN6W0qwD8O5OaA==
+ dependencies:
+ "@types/yargs-parser" "*"
+
+"@typescript-eslint/eslint-plugin@^5.33.0":
+ version "5.33.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.33.0.tgz#059798888720ec52ffa96c5f868e31a8f70fa3ec"
+ integrity sha512-jHvZNSW2WZ31OPJ3enhLrEKvAZNyAFWZ6rx9tUwaessTc4sx9KmgMNhVcqVAl1ETnT5rU5fpXTLmY9YvC1DCNg==
+ dependencies:
+ "@typescript-eslint/scope-manager" "5.33.0"
+ "@typescript-eslint/type-utils" "5.33.0"
+ "@typescript-eslint/utils" "5.33.0"
+ debug "^4.3.4"
+ functional-red-black-tree "^1.0.1"
+ ignore "^5.2.0"
+ regexpp "^3.2.0"
+ semver "^7.3.7"
+ tsutils "^3.21.0"
+
+"@typescript-eslint/parser@^5.33.0":
+ version "5.33.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.33.0.tgz#26ec3235b74f0667414613727cb98f9b69dc5383"
+ integrity sha512-cgM5cJrWmrDV2KpvlcSkelTBASAs1mgqq+IUGKJvFxWrapHpaRy5EXPQz9YaKF3nZ8KY18ILTiVpUtbIac86/w==
+ dependencies:
+ "@typescript-eslint/scope-manager" "5.33.0"
+ "@typescript-eslint/types" "5.33.0"
+ "@typescript-eslint/typescript-estree" "5.33.0"
+ debug "^4.3.4"
+
+"@typescript-eslint/scope-manager@5.33.0":
+ version "5.33.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.33.0.tgz#509d7fa540a2c58f66bdcfcf278a3fa79002e18d"
+ integrity sha512-/Jta8yMNpXYpRDl8EwF/M8It2A9sFJTubDo0ATZefGXmOqlaBffEw0ZbkbQ7TNDK6q55NPHFshGBPAZvZkE8Pw==
+ dependencies:
+ "@typescript-eslint/types" "5.33.0"
+ "@typescript-eslint/visitor-keys" "5.33.0"
+
+"@typescript-eslint/type-utils@5.33.0":
+ version "5.33.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.33.0.tgz#92ad1fba973c078d23767ce2d8d5a601baaa9338"
+ integrity sha512-2zB8uEn7hEH2pBeyk3NpzX1p3lF9dKrEbnXq1F7YkpZ6hlyqb2yZujqgRGqXgRBTHWIUG3NGx/WeZk224UKlIA==
+ dependencies:
+ "@typescript-eslint/utils" "5.33.0"
+ debug "^4.3.4"
+ tsutils "^3.21.0"
+
+"@typescript-eslint/types@5.33.0":
+ version "5.33.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.33.0.tgz#d41c584831805554b063791338b0220b613a275b"
+ integrity sha512-nIMt96JngB4MYFYXpZ/3ZNU4GWPNdBbcB5w2rDOCpXOVUkhtNlG2mmm8uXhubhidRZdwMaMBap7Uk8SZMU/ppw==
+
+"@typescript-eslint/types@5.45.0":
+ version "5.45.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.45.0.tgz#794760b9037ee4154c09549ef5a96599621109c5"
+ integrity sha512-QQij+u/vgskA66azc9dCmx+rev79PzX8uDHpsqSjEFtfF2gBUTRCpvYMh2gw2ghkJabNkPlSUCimsyBEQZd1DA==
+
+"@typescript-eslint/typescript-estree@5.33.0":
+ version "5.33.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.33.0.tgz#02d9c9ade6f4897c09e3508c27de53ad6bfa54cf"
+ integrity sha512-tqq3MRLlggkJKJUrzM6wltk8NckKyyorCSGMq4eVkyL5sDYzJJcMgZATqmF8fLdsWrW7OjjIZ1m9v81vKcaqwQ==
+ dependencies:
+ "@typescript-eslint/types" "5.33.0"
+ "@typescript-eslint/visitor-keys" "5.33.0"
+ debug "^4.3.4"
+ globby "^11.1.0"
+ is-glob "^4.0.3"
+ semver "^7.3.7"
+ tsutils "^3.21.0"
+
+"@typescript-eslint/typescript-estree@5.45.0":
+ version "5.45.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.45.0.tgz#f70a0d646d7f38c0dfd6936a5e171a77f1e5291d"
+ integrity sha512-maRhLGSzqUpFcZgXxg1qc/+H0bT36lHK4APhp0AEUVrpSwXiRAomm/JGjSG+kNUio5kAa3uekCYu/47cnGn5EQ==
+ dependencies:
+ "@typescript-eslint/types" "5.45.0"
+ "@typescript-eslint/visitor-keys" "5.45.0"
+ debug "^4.3.4"
+ globby "^11.1.0"
+ is-glob "^4.0.3"
+ semver "^7.3.7"
+ tsutils "^3.21.0"
+
+"@typescript-eslint/utils@5.33.0":
+ version "5.33.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.33.0.tgz#46797461ce3146e21c095d79518cc0f8ec574038"
+ integrity sha512-JxOAnXt9oZjXLIiXb5ZIcZXiwVHCkqZgof0O8KPgz7C7y0HS42gi75PdPlqh1Tf109M0fyUw45Ao6JLo7S5AHw==
+ dependencies:
+ "@types/json-schema" "^7.0.9"
+ "@typescript-eslint/scope-manager" "5.33.0"
+ "@typescript-eslint/types" "5.33.0"
+ "@typescript-eslint/typescript-estree" "5.33.0"
+ eslint-scope "^5.1.1"
+ eslint-utils "^3.0.0"
+
+"@typescript-eslint/visitor-keys@5.33.0":
+ version "5.33.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.33.0.tgz#fbcbb074e460c11046e067bc3384b5d66b555484"
+ integrity sha512-/XsqCzD4t+Y9p5wd9HZiptuGKBlaZO5showwqODii5C0nZawxWLF+Q6k5wYHBrQv96h6GYKyqqMHCSTqta8Kiw==
+ dependencies:
+ "@typescript-eslint/types" "5.33.0"
+ eslint-visitor-keys "^3.3.0"
+
+"@typescript-eslint/visitor-keys@5.45.0":
+ version "5.45.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.45.0.tgz#e0d160e9e7fdb7f8da697a5b78e7a14a22a70528"
+ integrity sha512-jc6Eccbn2RtQPr1s7th6jJWQHBHI6GBVQkCHoJFQ5UreaKm59Vxw+ynQUPPY2u2Amquc+7tmEoC2G52ApsGNNg==
+ dependencies:
+ "@typescript-eslint/types" "5.45.0"
+ eslint-visitor-keys "^3.3.0"
+
+"openai@link:.":
+ version "0.0.0"
+ uid ""
+
+abort-controller@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392"
+ integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==
+ dependencies:
+ event-target-shim "^5.0.0"
+
+acorn-jsx@5.3.2, acorn-jsx@^5.3.2:
+ version "5.3.2"
+ resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937"
+ integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
+
+acorn-walk@^8.1.1:
+ version "8.2.0"
+ resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1"
+ integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==
+
+acorn@8.8.1:
+ version "8.8.1"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.1.tgz#0a3f9cbecc4ec3bea6f0a80b66ae8dd2da250b73"
+ integrity sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==
+
+acorn@^8.4.1:
+ version "8.7.0"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf"
+ integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==
+
+acorn@^8.8.0:
+ version "8.8.0"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.0.tgz#88c0187620435c7f6015803f5539dae05a9dbea8"
+ integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==
+
+agentkeepalive@^4.2.1:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.2.1.tgz#a7975cbb9f83b367f06c90cc51ff28fe7d499717"
+ integrity sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==
+ dependencies:
+ debug "^4.1.0"
+ depd "^1.1.2"
+ humanize-ms "^1.2.1"
+
+ajv@^6.10.0, ajv@^6.12.4:
+ version "6.12.6"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
+ integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
+ dependencies:
+ fast-deep-equal "^3.1.1"
+ fast-json-stable-stringify "^2.0.0"
+ json-schema-traverse "^0.4.1"
+ uri-js "^4.2.2"
+
+angular-estree-parser@2.5.1:
+ version "2.5.1"
+ resolved "https://registry.yarnpkg.com/angular-estree-parser/-/angular-estree-parser-2.5.1.tgz#a08791f64f1a9453ecb99be5379f7f282e46c6ca"
+ integrity sha512-QP+1HEp9sUV3/ADU02IRc+Vn9vvWZS2rRkxiXCpSpZZx3BqcYTm2Eg/gWwLG3H9XASXnf9i1KyNOIYyRy5Ja+w==
+ dependencies:
+ lines-and-columns "^1.1.6"
+ tslib "^2.0.3"
+
+angular-html-parser@1.8.0:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/angular-html-parser/-/angular-html-parser-1.8.0.tgz#bd315b74e8069135a046902078c73d959d1cc51c"
+ integrity sha512-n5ZowjJJs1OPG3DHDSyUXZvscQzy7uQG227ncL1NzbJEPzfb2XtBZ9qT0PW7cbD7MViho3ijawXoRLCM0ih1rw==
+ dependencies:
+ tslib "^1.9.3"
+
+ansi-escapes@^4.2.1:
+ version "4.3.2"
+ resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e"
+ integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==
+ dependencies:
+ type-fest "^0.21.3"
+
+ansi-regex@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
+ integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
+
+ansi-regex@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a"
+ integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==
+
+ansi-styles@^3.2.1:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
+ integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
+ dependencies:
+ color-convert "^1.9.0"
+
+ansi-styles@^4.0.0, ansi-styles@^4.1.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
+ integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
+ dependencies:
+ color-convert "^2.0.1"
+
+ansi-styles@^5.0.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b"
+ integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==
+
+anymatch@^3.0.3, anymatch@~3.1.2:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716"
+ integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==
+ dependencies:
+ normalize-path "^3.0.0"
+ picomatch "^2.0.4"
+
+arg@^4.1.0:
+ version "4.1.3"
+ resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089"
+ integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==
+
+argparse@^1.0.7:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
+ integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==
+ dependencies:
+ sprintf-js "~1.0.2"
+
+argparse@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38"
+ integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
+
+array-union@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d"
+ integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==
+
+asynckit@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
+ integrity sha1-x57Zf380y48robyXkLzDZkdLS3k=
+
+babel-jest@^28.1.0:
+ version "28.1.0"
+ resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-28.1.0.tgz#95a67f8e2e7c0042e7b3ad3951b8af41a533b5ea"
+ integrity sha512-zNKk0yhDZ6QUwfxh9k07GII6siNGMJWVUU49gmFj5gfdqDKLqa2RArXOF2CODp4Dr7dLxN2cvAV+667dGJ4b4w==
+ dependencies:
+ "@jest/transform" "^28.1.0"
+ "@types/babel__core" "^7.1.14"
+ babel-plugin-istanbul "^6.1.1"
+ babel-preset-jest "^28.0.2"
+ chalk "^4.0.0"
+ graceful-fs "^4.2.9"
+ slash "^3.0.0"
+
+babel-plugin-istanbul@^6.1.1:
+ version "6.1.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73"
+ integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+ "@istanbuljs/load-nyc-config" "^1.0.0"
+ "@istanbuljs/schema" "^0.1.2"
+ istanbul-lib-instrument "^5.0.4"
+ test-exclude "^6.0.0"
+
+babel-plugin-jest-hoist@^28.0.2:
+ version "28.0.2"
+ resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-28.0.2.tgz#9307d03a633be6fc4b1a6bc5c3a87e22bd01dd3b"
+ integrity sha512-Kizhn/ZL+68ZQHxSnHyuvJv8IchXD62KQxV77TBDV/xoBFBOfgRAk97GNs6hXdTTCiVES9nB2I6+7MXXrk5llQ==
+ dependencies:
+ "@babel/template" "^7.3.3"
+ "@babel/types" "^7.3.3"
+ "@types/babel__core" "^7.1.14"
+ "@types/babel__traverse" "^7.0.6"
+
+babel-preset-current-node-syntax@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b"
+ integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==
+ dependencies:
+ "@babel/plugin-syntax-async-generators" "^7.8.4"
+ "@babel/plugin-syntax-bigint" "^7.8.3"
+ "@babel/plugin-syntax-class-properties" "^7.8.3"
+ "@babel/plugin-syntax-import-meta" "^7.8.3"
+ "@babel/plugin-syntax-json-strings" "^7.8.3"
+ "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3"
+ "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
+ "@babel/plugin-syntax-numeric-separator" "^7.8.3"
+ "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
+ "@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
+ "@babel/plugin-syntax-optional-chaining" "^7.8.3"
+ "@babel/plugin-syntax-top-level-await" "^7.8.3"
+
+babel-preset-jest@^28.0.2:
+ version "28.0.2"
+ resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-28.0.2.tgz#d8210fe4e46c1017e9fa13d7794b166e93aa9f89"
+ integrity sha512-sYzXIdgIXXroJTFeB3S6sNDWtlJ2dllCdTEsnZ65ACrMojj3hVNFRmnJ1HZtomGi+Be7aqpY/HJ92fr8OhKVkQ==
+ dependencies:
+ babel-plugin-jest-hoist "^28.0.2"
+ babel-preset-current-node-syntax "^1.0.0"
+
+bail@^1.0.0:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776"
+ integrity sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==
+
+balanced-match@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
+ integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
+
+base-64@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/base-64/-/base-64-0.1.0.tgz#780a99c84e7d600260361511c4877613bf24f6bb"
+ integrity sha512-Y5gU45svrR5tI2Vt/X9GPd3L0HNIKzGu202EjxrXMpuc2V2CiKgemAbUUsqYmZJvPtCXoUKjNZwBJzsNScUbXA==
+
+binary-extensions@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d"
+ integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==
+
+brace-expansion@^1.1.7:
+ version "1.1.11"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
+ integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
+ dependencies:
+ balanced-match "^1.0.0"
+ concat-map "0.0.1"
+
+braces@^3.0.2, braces@~3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
+ integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
+ dependencies:
+ fill-range "^7.0.1"
+
+browserslist@^4.20.2:
+ version "4.20.3"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.20.3.tgz#eb7572f49ec430e054f56d52ff0ebe9be915f8bf"
+ integrity sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==
+ dependencies:
+ caniuse-lite "^1.0.30001332"
+ electron-to-chromium "^1.4.118"
+ escalade "^3.1.1"
+ node-releases "^2.0.3"
+ picocolors "^1.0.0"
+
+bs-logger@0.x:
+ version "0.2.6"
+ resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8"
+ integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==
+ dependencies:
+ fast-json-stable-stringify "2.x"
+
+bser@2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05"
+ integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==
+ dependencies:
+ node-int64 "^0.4.0"
+
+buffer-from@^1.0.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5"
+ integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==
+
+call-bind@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c"
+ integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==
+ dependencies:
+ function-bind "^1.1.1"
+ get-intrinsic "^1.0.2"
+
+callsites@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
+ integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
+
+camelcase@6.3.0, camelcase@^6.2.0:
+ version "6.3.0"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a"
+ integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==
+
+camelcase@^5.3.1:
+ version "5.3.1"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
+ integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
+
+caniuse-lite@^1.0.30001332:
+ version "1.0.30001338"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001338.tgz#b5dd7a7941a51a16480bdf6ff82bded1628eec0d"
+ integrity sha512-1gLHWyfVoRDsHieO+CaeYe7jSo/MT7D7lhaXUiwwbuR5BwQxORs0f1tAwUSQr3YbxRXJvxHM/PA5FfPQRnsPeQ==
+
+ccount@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.1.0.tgz#246687debb6014735131be8abab2d93898f8d043"
+ integrity sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==
+
+chalk@5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.0.1.tgz#ca57d71e82bb534a296df63bbacc4a1c22b2a4b6"
+ integrity sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==
+
+chalk@^2.0.0, chalk@^2.4.1:
+ version "2.4.2"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
+ integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
+ dependencies:
+ ansi-styles "^3.2.1"
+ escape-string-regexp "^1.0.5"
+ supports-color "^5.3.0"
+
+chalk@^4.0.0:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
+ integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
+ dependencies:
+ ansi-styles "^4.1.0"
+ supports-color "^7.1.0"
+
+char-regex@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf"
+ integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==
+
+character-entities-legacy@^1.0.0:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1"
+ integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==
+
+character-entities@^1.0.0:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b"
+ integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==
+
+character-reference-invalid@^1.0.0:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560"
+ integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==
+
+charenc@0.0.2:
+ version "0.0.2"
+ resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667"
+ integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==
+
+chokidar@^3.5.3:
+ version "3.5.3"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd"
+ integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==
+ dependencies:
+ anymatch "~3.1.2"
+ braces "~3.0.2"
+ glob-parent "~5.1.2"
+ is-binary-path "~2.1.0"
+ is-glob "~4.0.1"
+ normalize-path "~3.0.0"
+ readdirp "~3.6.0"
+ optionalDependencies:
+ fsevents "~2.3.2"
+
+ci-info@3.3.0, ci-info@^3.2.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.3.0.tgz#b4ed1fb6818dea4803a55c623041f9165d2066b2"
+ integrity sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw==
+
+cjk-regex@2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/cjk-regex/-/cjk-regex-2.0.1.tgz#98cca187aa67931db14f0d9dde556150c8116d95"
+ integrity sha512-4YTL4Zxzy33EhD2YMBQg6qavT+3OrYYu45RHcLANXhbVTXmVcwNQIv0vL1TUWjOS7bH0n0dVcGAdJAGzWSAa3A==
+ dependencies:
+ regexp-util "^1.2.1"
+ unicode-regex "^2.0.0"
+
+cjs-module-lexer@^1.0.0:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40"
+ integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==
+
+cliui@^7.0.2:
+ version "7.0.4"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f"
+ integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==
+ dependencies:
+ string-width "^4.2.0"
+ strip-ansi "^6.0.0"
+ wrap-ansi "^7.0.0"
+
+clone@^1.0.2:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e"
+ integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==
+
+co@^4.6.0:
+ version "4.6.0"
+ resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
+ integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=
+
+collapse-white-space@1.0.6, collapse-white-space@^1.0.2:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-1.0.6.tgz#e63629c0016665792060dbbeb79c42239d2c5287"
+ integrity sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==
+
+collect-v8-coverage@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59"
+ integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==
+
+color-convert@^1.9.0:
+ version "1.9.3"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
+ integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
+ dependencies:
+ color-name "1.1.3"
+
+color-convert@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
+ integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
+ dependencies:
+ color-name "~1.1.4"
+
+color-name@1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
+ integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
+
+color-name@~1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
+ integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
+
+combined-stream@^1.0.8:
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
+ integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
+ dependencies:
+ delayed-stream "~1.0.0"
+
+commander@^2.19.0:
+ version "2.20.3"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
+ integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
+
+commander@^9.0.0:
+ version "9.3.0"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-9.3.0.tgz#f619114a5a2d2054e0d9ff1b31d5ccf89255e26b"
+ integrity sha512-hv95iU5uXPbK83mjrJKuZyFM/LBAoCV/XhVGkS5Je6tl7sxr6A0ITMw5WoRV46/UaJ46Nllm3Xt7IaJhXTIkzw==
+
+commondir@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
+ integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==
+
+concat-map@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+ integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
+
+convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369"
+ integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==
+ dependencies:
+ safe-buffer "~5.1.1"
+
+cosmiconfig@7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d"
+ integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==
+ dependencies:
+ "@types/parse-json" "^4.0.0"
+ import-fresh "^3.2.1"
+ parse-json "^5.0.0"
+ path-type "^4.0.0"
+ yaml "^1.10.0"
+
+create-require@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333"
+ integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==
+
+cross-spawn@^7.0.2, cross-spawn@^7.0.3:
+ version "7.0.3"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
+ integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
+ dependencies:
+ path-key "^3.1.0"
+ shebang-command "^2.0.0"
+ which "^2.0.1"
+
+crypt@0.0.2:
+ version "0.0.2"
+ resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b"
+ integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==
+
+css-units-list@1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/css-units-list/-/css-units-list-1.1.0.tgz#46cfb7022c9eb626d9a62589372b8439e1ddb91e"
+ integrity sha512-WnbCcmr1rHeUb5JbpIWyBjH0HiW6RIZRujOzVvwyE2aZGqtjLFUfiqB9nYmAPlYHNgvqvjhX8YeJv0uF25QoHg==
+
+dashify@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/dashify/-/dashify-2.0.0.tgz#fff270ca2868ca427fee571de35691d6e437a648"
+ integrity sha512-hpA5C/YrPjucXypHPPc0oJ1l9Hf6wWbiOL7Ik42cxnsUOhWiCB/fylKbKqqJalW9FgkNQCw16YO8uW9Hs0Iy1A==
+
+debug@^4.1.0:
+ version "4.3.3"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664"
+ integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==
+ dependencies:
+ ms "2.1.2"
+
+debug@^4.1.1, debug@^4.3.2, debug@^4.3.4:
+ version "4.3.4"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
+ integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
+ dependencies:
+ ms "2.1.2"
+
+dedent@^0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c"
+ integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=
+
+deep-is@^0.1.3:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831"
+ integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==
+
+deepmerge@^4.2.2:
+ version "4.2.2"
+ resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955"
+ integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==
+
+defaults@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a"
+ integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==
+ dependencies:
+ clone "^1.0.2"
+
+delayed-stream@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
+ integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk=
+
+depd@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
+ integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=
+
+detect-newline@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651"
+ integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==
+
+diff-sequences@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.5.1.tgz#eaecc0d327fd68c8d9672a1e64ab8dccb2ef5327"
+ integrity sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==
+
+diff-sequences@^28.0.2:
+ version "28.0.2"
+ resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-28.0.2.tgz#40f8d4ffa081acbd8902ba35c798458d0ff1af41"
+ integrity sha512-YtEoNynLDFCRznv/XDalsKGSZDoj0U5kLnXvY0JSq3nBboRrZXjD81+eSiwi+nzcZDwedMmcowcxNwwgFW23mQ==
+
+diff@5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b"
+ integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==
+
+diff@^4.0.1:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d"
+ integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==
+
+digest-fetch@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/digest-fetch/-/digest-fetch-1.3.0.tgz#898e69264d00012a23cf26e8a3e40320143fc661"
+ integrity sha512-CGJuv6iKNM7QyZlM2T3sPAdZWd/p9zQiRNS9G+9COUCwzWFTs0Xp8NF5iePx7wtvhDykReiRRrSeNb4oMmB8lA==
+ dependencies:
+ base-64 "^0.1.0"
+ md5 "^2.3.0"
+
+dir-glob@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f"
+ integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==
+ dependencies:
+ path-type "^4.0.0"
+
+doctrine@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961"
+ integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==
+ dependencies:
+ esutils "^2.0.2"
+
+editorconfig-to-prettier@0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/editorconfig-to-prettier/-/editorconfig-to-prettier-0.2.0.tgz#db4f4e96796c746673c863ccac881377ea83dbe8"
+ integrity sha512-tOcbAuPyYE9zOA1HF2xI9Xqm2TW7BE9E2lhwbz69ngtaJrBWQwL6akzyWA+UPx8jRss91KXMChyjHNpqaYFWuQ==
+
+editorconfig@0.15.3:
+ version "0.15.3"
+ resolved "https://registry.yarnpkg.com/editorconfig/-/editorconfig-0.15.3.tgz#bef84c4e75fb8dcb0ce5cee8efd51c15999befc5"
+ integrity sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==
+ dependencies:
+ commander "^2.19.0"
+ lru-cache "^4.1.5"
+ semver "^5.6.0"
+ sigmund "^1.0.1"
+
+electron-to-chromium@^1.4.118:
+ version "1.4.137"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.137.tgz#186180a45617283f1c012284458510cd99d6787f"
+ integrity sha512-0Rcpald12O11BUogJagX3HsCN3FE83DSqWjgXoHo5a72KUKMSfI39XBgJpgNNxS9fuGzytaFjE06kZkiVFy2qA==
+
+emittery@^0.10.2:
+ version "0.10.2"
+ resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.10.2.tgz#902eec8aedb8c41938c46e9385e9db7e03182933"
+ integrity sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==
+
+emoji-regex@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
+ integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
+
+emoji-regex@^9.2.2:
+ version "9.2.2"
+ resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72"
+ integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==
+
+error-ex@^1.3.1:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
+ integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
+ dependencies:
+ is-arrayish "^0.2.1"
+
+escalade@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40"
+ integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==
+
+escape-string-regexp@5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8"
+ integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==
+
+escape-string-regexp@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+ integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
+
+escape-string-regexp@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344"
+ integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==
+
+escape-string-regexp@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
+ integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
+
+eslint-plugin-unused-imports@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-2.0.0.tgz#d8db8c4d0cfa0637a8b51ce3fd7d1b6bc3f08520"
+ integrity sha512-3APeS/tQlTrFa167ThtP0Zm0vctjr4M44HMpeg1P4bK6wItarumq0Ma82xorMKdFsWpphQBlRPzw/pxiVELX1A==
+ dependencies:
+ eslint-rule-composer "^0.3.0"
+
+eslint-rule-composer@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz#79320c927b0c5c0d3d3d2b76c8b4a488f25bbaf9"
+ integrity sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==
+
+eslint-scope@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c"
+ integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==
+ dependencies:
+ esrecurse "^4.3.0"
+ estraverse "^4.1.1"
+
+eslint-scope@^7.1.1:
+ version "7.1.1"
+ resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642"
+ integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==
+ dependencies:
+ esrecurse "^4.3.0"
+ estraverse "^5.2.0"
+
+eslint-utils@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672"
+ integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==
+ dependencies:
+ eslint-visitor-keys "^2.0.0"
+
+eslint-visitor-keys@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303"
+ integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==
+
+eslint-visitor-keys@^3.3.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826"
+ integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==
+
+eslint@^8.22.0:
+ version "8.22.0"
+ resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.22.0.tgz#78fcb044196dfa7eef30a9d65944f6f980402c48"
+ integrity sha512-ci4t0sz6vSRKdmkOGmprBo6fmI4PrphDFMy5JEq/fNS0gQkJM3rLmrqcp8ipMcdobH3KtUP40KniAE9W19S4wA==
+ dependencies:
+ "@eslint/eslintrc" "^1.3.0"
+ "@humanwhocodes/config-array" "^0.10.4"
+ "@humanwhocodes/gitignore-to-minimatch" "^1.0.2"
+ ajv "^6.10.0"
+ chalk "^4.0.0"
+ cross-spawn "^7.0.2"
+ debug "^4.3.2"
+ doctrine "^3.0.0"
+ escape-string-regexp "^4.0.0"
+ eslint-scope "^7.1.1"
+ eslint-utils "^3.0.0"
+ eslint-visitor-keys "^3.3.0"
+ espree "^9.3.3"
+ esquery "^1.4.0"
+ esutils "^2.0.2"
+ fast-deep-equal "^3.1.3"
+ file-entry-cache "^6.0.1"
+ find-up "^5.0.0"
+ functional-red-black-tree "^1.0.1"
+ glob-parent "^6.0.1"
+ globals "^13.15.0"
+ globby "^11.1.0"
+ grapheme-splitter "^1.0.4"
+ ignore "^5.2.0"
+ import-fresh "^3.0.0"
+ imurmurhash "^0.1.4"
+ is-glob "^4.0.0"
+ js-yaml "^4.1.0"
+ json-stable-stringify-without-jsonify "^1.0.1"
+ levn "^0.4.1"
+ lodash.merge "^4.6.2"
+ minimatch "^3.1.2"
+ natural-compare "^1.4.0"
+ optionator "^0.9.1"
+ regexpp "^3.2.0"
+ strip-ansi "^6.0.1"
+ strip-json-comments "^3.1.0"
+ text-table "^0.2.0"
+ v8-compile-cache "^2.0.3"
+
+espree@9.4.1:
+ version "9.4.1"
+ resolved "https://registry.yarnpkg.com/espree/-/espree-9.4.1.tgz#51d6092615567a2c2cff7833445e37c28c0065bd"
+ integrity sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==
+ dependencies:
+ acorn "^8.8.0"
+ acorn-jsx "^5.3.2"
+ eslint-visitor-keys "^3.3.0"
+
+espree@^9.3.2, espree@^9.3.3:
+ version "9.3.3"
+ resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.3.tgz#2dd37c4162bb05f433ad3c1a52ddf8a49dc08e9d"
+ integrity sha512-ORs1Rt/uQTqUKjDdGCyrtYxbazf5umATSf/K4qxjmZHORR6HJk+2s/2Pqe+Kk49HHINC/xNIrGfgh8sZcll0ng==
+ dependencies:
+ acorn "^8.8.0"
+ acorn-jsx "^5.3.2"
+ eslint-visitor-keys "^3.3.0"
+
+esprima@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
+ integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
+
+esquery@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5"
+ integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==
+ dependencies:
+ estraverse "^5.1.0"
+
+esrecurse@^4.3.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921"
+ integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==
+ dependencies:
+ estraverse "^5.2.0"
+
+estraverse@^4.1.1:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d"
+ integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==
+
+estraverse@^5.1.0, estraverse@^5.2.0:
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123"
+ integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==
+
+esutils@2.0.3, esutils@^2.0.2:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
+ integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
+
+event-target-shim@^5.0.0:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789"
+ integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==
+
+execa@^5.0.0:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd"
+ integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==
+ dependencies:
+ cross-spawn "^7.0.3"
+ get-stream "^6.0.0"
+ human-signals "^2.1.0"
+ is-stream "^2.0.0"
+ merge-stream "^2.0.0"
+ npm-run-path "^4.0.1"
+ onetime "^5.1.2"
+ signal-exit "^3.0.3"
+ strip-final-newline "^2.0.0"
+
+exit@^0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c"
+ integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=
+
+expect@^28.1.0:
+ version "28.1.0"
+ resolved "https://registry.yarnpkg.com/expect/-/expect-28.1.0.tgz#10e8da64c0850eb8c39a480199f14537f46e8360"
+ integrity sha512-qFXKl8Pmxk8TBGfaFKRtcQjfXEnKAs+dmlxdwvukJZorwrAabT7M3h8oLOG01I2utEhkmUTi17CHaPBovZsKdw==
+ dependencies:
+ "@jest/expect-utils" "^28.1.0"
+ jest-get-type "^28.0.2"
+ jest-matcher-utils "^28.1.0"
+ jest-message-util "^28.1.0"
+ jest-util "^28.1.0"
+
+extend@^3.0.0:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
+ integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==
+
+fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
+ integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
+
+fast-glob@3.2.12:
+ version "3.2.12"
+ resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80"
+ integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==
+ dependencies:
+ "@nodelib/fs.stat" "^2.0.2"
+ "@nodelib/fs.walk" "^1.2.3"
+ glob-parent "^5.1.2"
+ merge2 "^1.3.0"
+ micromatch "^4.0.4"
+
+fast-glob@^3.2.9:
+ version "3.2.11"
+ resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9"
+ integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==
+ dependencies:
+ "@nodelib/fs.stat" "^2.0.2"
+ "@nodelib/fs.walk" "^1.2.3"
+ glob-parent "^5.1.2"
+ merge2 "^1.3.0"
+ micromatch "^4.0.4"
+
+fast-json-stable-stringify@2.1.0, fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
+ integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
+
+fast-levenshtein@^2.0.6:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
+ integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==
+
+fastq@^1.6.0:
+ version "1.13.0"
+ resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c"
+ integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==
+ dependencies:
+ reusify "^1.0.4"
+
+fb-watchman@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85"
+ integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==
+ dependencies:
+ bser "2.1.1"
+
+file-entry-cache@6.0.1, file-entry-cache@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027"
+ integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==
+ dependencies:
+ flat-cache "^3.0.4"
+
+fill-range@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
+ integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
+ dependencies:
+ to-regex-range "^5.0.1"
+
+find-cache-dir@3.3.2:
+ version "3.3.2"
+ resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b"
+ integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==
+ dependencies:
+ commondir "^1.0.1"
+ make-dir "^3.0.2"
+ pkg-dir "^4.1.0"
+
+find-parent-dir@0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/find-parent-dir/-/find-parent-dir-0.3.1.tgz#c5c385b96858c3351f95d446cab866cbf9f11125"
+ integrity sha512-o4UcykWV/XN9wm+jMEtWLPlV8RXCZnMhQI6F6OdHeSez7iiJWePw8ijOlskJZMsaQoGR/b7dH6lO02HhaTN7+A==
+
+find-up@^4.0.0, find-up@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19"
+ integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==
+ dependencies:
+ locate-path "^5.0.0"
+ path-exists "^4.0.0"
+
+find-up@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc"
+ integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==
+ dependencies:
+ locate-path "^6.0.0"
+ path-exists "^4.0.0"
+
+flat-cache@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11"
+ integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==
+ dependencies:
+ flatted "^3.1.0"
+ rimraf "^3.0.2"
+
+flatted@^3.1.0:
+ version "3.2.6"
+ resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.6.tgz#022e9218c637f9f3fc9c35ab9c9193f05add60b2"
+ integrity sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==
+
+flatten@^1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.3.tgz#c1283ac9f27b368abc1e36d1ff7b04501a30356b"
+ integrity sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==
+
+flow-parser@0.180.0:
+ version "0.180.0"
+ resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.180.0.tgz#05d49a88715ceca0457607499a018e2bf5908d72"
+ integrity sha512-kkzsuGAhckWgn/G+JfCyEa6BYslGrjlH4CJL0LZhdn9of9ukvi7SzVQSFsrEhuhh/zQUghfUEoaeZy1wjQXpUg==
+
+form-data-encoder@1.7.2:
+ version "1.7.2"
+ resolved "https://registry.yarnpkg.com/form-data-encoder/-/form-data-encoder-1.7.2.tgz#1f1ae3dccf58ed4690b86d87e4f57c654fbab040"
+ integrity sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==
+
+form-data@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f"
+ integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==
+ dependencies:
+ asynckit "^0.4.0"
+ combined-stream "^1.0.8"
+ mime-types "^2.1.12"
+
+formdata-node@^4.3.2:
+ version "4.3.3"
+ resolved "https://registry.yarnpkg.com/formdata-node/-/formdata-node-4.3.3.tgz#21415225be66e2c87a917bfc0fedab30a119c23c"
+ integrity sha512-coTew7WODO2vF+XhpUdmYz4UBvlsiTMSNaFYZlrXIqYbFd4W7bMwnoALNLE6uvNgzTg2j1JDF0ZImEfF06VPAA==
+ dependencies:
+ node-domexception "1.0.0"
+ web-streams-polyfill "4.0.0-beta.1"
+
+fs.realpath@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+ integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
+
+fsevents@^2.3.2, fsevents@~2.3.2:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a"
+ integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==
+
+function-bind@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
+ integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
+
+functional-red-black-tree@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
+ integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==
+
+gensync@^1.0.0-beta.2:
+ version "1.0.0-beta.2"
+ resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0"
+ integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==
+
+get-caller-file@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
+ integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
+
+get-intrinsic@^1.0.2:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6"
+ integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==
+ dependencies:
+ function-bind "^1.1.1"
+ has "^1.0.3"
+ has-symbols "^1.0.1"
+
+get-package-type@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a"
+ integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==
+
+get-stdin@8.0.0:
+ version "8.0.0"
+ resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-8.0.0.tgz#cbad6a73feb75f6eeb22ba9e01f89aa28aa97a53"
+ integrity sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==
+
+get-stream@^6.0.0:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7"
+ integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==
+
+glob-parent@^5.1.2, glob-parent@~5.1.2:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
+ integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
+ dependencies:
+ is-glob "^4.0.1"
+
+glob-parent@^6.0.1:
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3"
+ integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==
+ dependencies:
+ is-glob "^4.0.3"
+
+glob@^7.1.3, glob@^7.1.4:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023"
+ integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.0.4"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+globals@^11.1.0:
+ version "11.12.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
+ integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
+
+globals@^13.15.0:
+ version "13.17.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-13.17.0.tgz#902eb1e680a41da93945adbdcb5a9f361ba69bd4"
+ integrity sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==
+ dependencies:
+ type-fest "^0.20.2"
+
+globby@^11.0.4, globby@^11.1.0:
+ version "11.1.0"
+ resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b"
+ integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==
+ dependencies:
+ array-union "^2.1.0"
+ dir-glob "^3.0.1"
+ fast-glob "^3.2.9"
+ ignore "^5.2.0"
+ merge2 "^1.4.1"
+ slash "^3.0.0"
+
+graceful-fs@^4.2.9:
+ version "4.2.10"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c"
+ integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==
+
+grapheme-splitter@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e"
+ integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==
+
+graphql@15.6.1:
+ version "15.6.1"
+ resolved "https://registry.yarnpkg.com/graphql/-/graphql-15.6.1.tgz#9125bdf057553525da251e19e96dab3d3855ddfc"
+ integrity sha512-3i5lu0z6dRvJ48QP9kFxBkJ7h4Kso7PS8eahyTFz5Jm6CvQfLtNIE8LX9N6JLnXTuwR+sIYnXzaWp6anOg0QQw==
+
+has-flag@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
+ integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
+
+has-flag@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
+ integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
+
+has-symbols@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8"
+ integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==
+
+has@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
+ integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
+ dependencies:
+ function-bind "^1.1.1"
+
+html-element-attributes@3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/html-element-attributes/-/html-element-attributes-3.1.0.tgz#07869037b9020bec3bb1897263e97dd65829d15b"
+ integrity sha512-cHM9qM06tyWHwvGqDqVEBwoYtGgyq7X/GQt3dor38M1hYMZw1yVadaDQrwwQer6NefiYAoHaqFARI8ETMCAOYA==
+
+html-escaper@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453"
+ integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==
+
+html-styles@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/html-styles/-/html-styles-1.0.0.tgz#a18061fd651f99c6b75c45c8e0549a3bc3e01a75"
+ integrity sha512-cDl5dcj73oI4Hy0DSUNh54CAwslNLJRCCoO+RNkVo+sBrjA/0+7E/xzvj3zH/GxbbBLGJhE0hBe1eg+0FINC6w==
+
+html-tag-names@2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/html-tag-names/-/html-tag-names-2.0.1.tgz#5626263e7d7b15789fa35a9f816234156901adc6"
+ integrity sha512-PX8KyLG7dwsjis3NPj1u+/EJf2CgH2d+qzekQpnlCOPQ6Uu6T8+F2ZqQg+wtsP+WKhxK3QMN9Garcwr7fCRhxA==
+
+html-void-elements@2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-2.0.1.tgz#29459b8b05c200b6c5ee98743c41b979d577549f"
+ integrity sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==
+
+human-signals@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0"
+ integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==
+
+humanize-ms@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed"
+ integrity sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=
+ dependencies:
+ ms "^2.0.0"
+
+ignore@5.2.0, ignore@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a"
+ integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==
+
+import-fresh@^3.0.0, import-fresh@^3.2.1:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b"
+ integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==
+ dependencies:
+ parent-module "^1.0.0"
+ resolve-from "^4.0.0"
+
+import-local@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4"
+ integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==
+ dependencies:
+ pkg-dir "^4.2.0"
+ resolve-cwd "^3.0.0"
+
+imurmurhash@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
+ integrity sha1-khi5srkoojixPcT7a21XbyMUU+o=
+
+indexes-of@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607"
+ integrity sha512-bup+4tap3Hympa+JBJUG7XuOsdNQ6fxt0MHyXMKuLBKn0OqsTfvUxkUrroEX1+B2VsSHvCjiIcZVxRtYa4nllA==
+
+inflight@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+ integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=
+ dependencies:
+ once "^1.3.0"
+ wrappy "1"
+
+inherits@2, inherits@^2.0.0:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
+ integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
+
+is-alphabetical@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d"
+ integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==
+
+is-alphanumerical@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf"
+ integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==
+ dependencies:
+ is-alphabetical "^1.0.0"
+ is-decimal "^1.0.0"
+
+is-arrayish@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
+ integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=
+
+is-binary-path@~2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
+ integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
+ dependencies:
+ binary-extensions "^2.0.0"
+
+is-buffer@^2.0.0:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191"
+ integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==
+
+is-buffer@~1.1.6:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
+ integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
+
+is-core-module@^2.8.1:
+ version "2.9.0"
+ resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69"
+ integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==
+ dependencies:
+ has "^1.0.3"
+
+is-core-module@^2.9.0:
+ version "2.11.0"
+ resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144"
+ integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==
+ dependencies:
+ has "^1.0.3"
+
+is-decimal@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5"
+ integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==
+
+is-extglob@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
+ integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==
+
+is-fullwidth-code-point@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
+ integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
+
+is-fullwidth-code-point@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz#fae3167c729e7463f8461ce512b080a49268aa88"
+ integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==
+
+is-generator-fn@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118"
+ integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==
+
+is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
+ integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
+ dependencies:
+ is-extglob "^2.1.1"
+
+is-hexadecimal@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7"
+ integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==
+
+is-number@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
+ integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
+
+is-plain-obj@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287"
+ integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==
+
+is-stream@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077"
+ integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==
+
+is-whitespace-character@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz#0858edd94a95594c7c9dd0b5c174ec6e45ee4aa7"
+ integrity sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==
+
+is-word-character@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-word-character/-/is-word-character-1.0.4.tgz#ce0e73216f98599060592f62ff31354ddbeb0230"
+ integrity sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==
+
+isexe@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+ integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
+
+istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3"
+ integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==
+
+istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz#31d18bdd127f825dd02ea7bfdfd906f8ab840e9f"
+ integrity sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A==
+ dependencies:
+ "@babel/core" "^7.12.3"
+ "@babel/parser" "^7.14.7"
+ "@istanbuljs/schema" "^0.1.2"
+ istanbul-lib-coverage "^3.2.0"
+ semver "^6.3.0"
+
+istanbul-lib-report@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6"
+ integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==
+ dependencies:
+ istanbul-lib-coverage "^3.0.0"
+ make-dir "^3.0.0"
+ supports-color "^7.1.0"
+
+istanbul-lib-source-maps@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551"
+ integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==
+ dependencies:
+ debug "^4.1.1"
+ istanbul-lib-coverage "^3.0.0"
+ source-map "^0.6.1"
+
+istanbul-reports@^3.1.3:
+ version "3.1.4"
+ resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.4.tgz#1b6f068ecbc6c331040aab5741991273e609e40c"
+ integrity sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==
+ dependencies:
+ html-escaper "^2.0.0"
+ istanbul-lib-report "^3.0.0"
+
+jest-changed-files@^28.0.2:
+ version "28.0.2"
+ resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-28.0.2.tgz#7d7810660a5bd043af9e9cfbe4d58adb05e91531"
+ integrity sha512-QX9u+5I2s54ZnGoMEjiM2WeBvJR2J7w/8ZUmH2um/WLAuGAYFQcsVXY9+1YL6k0H/AGUdH8pXUAv6erDqEsvIA==
+ dependencies:
+ execa "^5.0.0"
+ throat "^6.0.1"
+
+jest-circus@^28.1.0:
+ version "28.1.0"
+ resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-28.1.0.tgz#e229f590911bd54d60efaf076f7acd9360296dae"
+ integrity sha512-rNYfqfLC0L0zQKRKsg4n4J+W1A2fbyGH7Ss/kDIocp9KXD9iaL111glsLu7+Z7FHuZxwzInMDXq+N1ZIBkI/TQ==
+ dependencies:
+ "@jest/environment" "^28.1.0"
+ "@jest/expect" "^28.1.0"
+ "@jest/test-result" "^28.1.0"
+ "@jest/types" "^28.1.0"
+ "@types/node" "*"
+ chalk "^4.0.0"
+ co "^4.6.0"
+ dedent "^0.7.0"
+ is-generator-fn "^2.0.0"
+ jest-each "^28.1.0"
+ jest-matcher-utils "^28.1.0"
+ jest-message-util "^28.1.0"
+ jest-runtime "^28.1.0"
+ jest-snapshot "^28.1.0"
+ jest-util "^28.1.0"
+ pretty-format "^28.1.0"
+ slash "^3.0.0"
+ stack-utils "^2.0.3"
+ throat "^6.0.1"
+
+jest-cli@^28.1.0:
+ version "28.1.0"
+ resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-28.1.0.tgz#cd1d8adb9630102d5ba04a22895f63decdd7ac1f"
+ integrity sha512-fDJRt6WPRriHrBsvvgb93OxgajHHsJbk4jZxiPqmZbMDRcHskfJBBfTyjFko0jjfprP544hOktdSi9HVgl4VUQ==
+ dependencies:
+ "@jest/core" "^28.1.0"
+ "@jest/test-result" "^28.1.0"
+ "@jest/types" "^28.1.0"
+ chalk "^4.0.0"
+ exit "^0.1.2"
+ graceful-fs "^4.2.9"
+ import-local "^3.0.2"
+ jest-config "^28.1.0"
+ jest-util "^28.1.0"
+ jest-validate "^28.1.0"
+ prompts "^2.0.1"
+ yargs "^17.3.1"
+
+jest-config@^28.1.0:
+ version "28.1.0"
+ resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-28.1.0.tgz#fca22ca0760e746fe1ce1f9406f6b307ab818501"
+ integrity sha512-aOV80E9LeWrmflp7hfZNn/zGA4QKv/xsn2w8QCBP0t0+YqObuCWTSgNbHJ0j9YsTuCO08ZR/wsvlxqqHX20iUA==
+ dependencies:
+ "@babel/core" "^7.11.6"
+ "@jest/test-sequencer" "^28.1.0"
+ "@jest/types" "^28.1.0"
+ babel-jest "^28.1.0"
+ chalk "^4.0.0"
+ ci-info "^3.2.0"
+ deepmerge "^4.2.2"
+ glob "^7.1.3"
+ graceful-fs "^4.2.9"
+ jest-circus "^28.1.0"
+ jest-environment-node "^28.1.0"
+ jest-get-type "^28.0.2"
+ jest-regex-util "^28.0.2"
+ jest-resolve "^28.1.0"
+ jest-runner "^28.1.0"
+ jest-util "^28.1.0"
+ jest-validate "^28.1.0"
+ micromatch "^4.0.4"
+ parse-json "^5.2.0"
+ pretty-format "^28.1.0"
+ slash "^3.0.0"
+ strip-json-comments "^3.1.1"
+
+jest-diff@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-27.5.1.tgz#a07f5011ac9e6643cf8a95a462b7b1ecf6680def"
+ integrity sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==
+ dependencies:
+ chalk "^4.0.0"
+ diff-sequences "^27.5.1"
+ jest-get-type "^27.5.1"
+ pretty-format "^27.5.1"
+
+jest-diff@^28.1.0:
+ version "28.1.0"
+ resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-28.1.0.tgz#77686fef899ec1873dbfbf9330e37dd429703269"
+ integrity sha512-8eFd3U3OkIKRtlasXfiAQfbovgFgRDb0Ngcs2E+FMeBZ4rUezqIaGjuyggJBp+llosQXNEWofk/Sz4Hr5gMUhA==
+ dependencies:
+ chalk "^4.0.0"
+ diff-sequences "^28.0.2"
+ jest-get-type "^28.0.2"
+ pretty-format "^28.1.0"
+
+jest-docblock@28.1.1:
+ version "28.1.1"
+ resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-28.1.1.tgz#6f515c3bf841516d82ecd57a62eed9204c2f42a8"
+ integrity sha512-3wayBVNiOYx0cwAbl9rwm5kKFP8yHH3d/fkEaL02NPTkDojPtheGB7HZSFY4wzX+DxyrvhXz0KSCVksmCknCuA==
+ dependencies:
+ detect-newline "^3.0.0"
+
+jest-docblock@^28.0.2:
+ version "28.0.2"
+ resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-28.0.2.tgz#3cab8abea53275c9d670cdca814fc89fba1298c2"
+ integrity sha512-FH10WWw5NxLoeSdQlJwu+MTiv60aXV/t8KEwIRGEv74WARE1cXIqh1vGdy2CraHuWOOrnzTWj/azQKqW4fO7xg==
+ dependencies:
+ detect-newline "^3.0.0"
+
+jest-each@^28.1.0:
+ version "28.1.0"
+ resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-28.1.0.tgz#54ae66d6a0a5b1913e9a87588d26c2687c39458b"
+ integrity sha512-a/XX02xF5NTspceMpHujmOexvJ4GftpYXqr6HhhmKmExtMXsyIN/fvanQlt/BcgFoRKN4OCXxLQKth9/n6OPFg==
+ dependencies:
+ "@jest/types" "^28.1.0"
+ chalk "^4.0.0"
+ jest-get-type "^28.0.2"
+ jest-util "^28.1.0"
+ pretty-format "^28.1.0"
+
+jest-environment-node@^28.1.0:
+ version "28.1.0"
+ resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-28.1.0.tgz#6ed2150aa31babba0c488c5b4f4d813a585c68e6"
+ integrity sha512-gBLZNiyrPw9CSMlTXF1yJhaBgWDPVvH0Pq6bOEwGMXaYNzhzhw2kA/OijNF8egbCgDS0/veRv97249x2CX+udQ==
+ dependencies:
+ "@jest/environment" "^28.1.0"
+ "@jest/fake-timers" "^28.1.0"
+ "@jest/types" "^28.1.0"
+ "@types/node" "*"
+ jest-mock "^28.1.0"
+ jest-util "^28.1.0"
+
+jest-get-type@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.5.1.tgz#3cd613c507b0f7ace013df407a1c1cd578bcb4f1"
+ integrity sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==
+
+jest-get-type@^28.0.2:
+ version "28.0.2"
+ resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-28.0.2.tgz#34622e628e4fdcd793d46db8a242227901fcf203"
+ integrity sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==
+
+jest-haste-map@^28.1.0:
+ version "28.1.0"
+ resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-28.1.0.tgz#6c1ee2daf1c20a3e03dbd8e5b35c4d73d2349cf0"
+ integrity sha512-xyZ9sXV8PtKi6NCrJlmq53PyNVHzxmcfXNVvIRHpHmh1j/HChC4pwKgyjj7Z9us19JMw8PpQTJsFWOsIfT93Dw==
+ dependencies:
+ "@jest/types" "^28.1.0"
+ "@types/graceful-fs" "^4.1.3"
+ "@types/node" "*"
+ anymatch "^3.0.3"
+ fb-watchman "^2.0.0"
+ graceful-fs "^4.2.9"
+ jest-regex-util "^28.0.2"
+ jest-util "^28.1.0"
+ jest-worker "^28.1.0"
+ micromatch "^4.0.4"
+ walker "^1.0.7"
+ optionalDependencies:
+ fsevents "^2.3.2"
+
+jest-leak-detector@^28.1.0:
+ version "28.1.0"
+ resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-28.1.0.tgz#b65167776a8787443214d6f3f54935a4c73c8a45"
+ integrity sha512-uIJDQbxwEL2AMMs2xjhZl2hw8s77c3wrPaQ9v6tXJLGaaQ+4QrNJH5vuw7hA7w/uGT/iJ42a83opAqxGHeyRIA==
+ dependencies:
+ jest-get-type "^28.0.2"
+ pretty-format "^28.1.0"
+
+jest-matcher-utils@^27.0.0:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz#9c0cdbda8245bc22d2331729d1091308b40cf8ab"
+ integrity sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==
+ dependencies:
+ chalk "^4.0.0"
+ jest-diff "^27.5.1"
+ jest-get-type "^27.5.1"
+ pretty-format "^27.5.1"
+
+jest-matcher-utils@^28.1.0:
+ version "28.1.0"
+ resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-28.1.0.tgz#2ae398806668eeabd293c61712227cb94b250ccf"
+ integrity sha512-onnax0n2uTLRQFKAjC7TuaxibrPSvZgKTcSCnNUz/tOjJ9UhxNm7ZmPpoQavmTDUjXvUQ8KesWk2/VdrxIFzTQ==
+ dependencies:
+ chalk "^4.0.0"
+ jest-diff "^28.1.0"
+ jest-get-type "^28.0.2"
+ pretty-format "^28.1.0"
+
+jest-message-util@^28.1.0:
+ version "28.1.0"
+ resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-28.1.0.tgz#7e8f0b9049e948e7b94c2a52731166774ba7d0af"
+ integrity sha512-RpA8mpaJ/B2HphDMiDlrAZdDytkmwFqgjDZovM21F35lHGeUeCvYmm6W+sbQ0ydaLpg5bFAUuWG1cjqOl8vqrw==
+ dependencies:
+ "@babel/code-frame" "^7.12.13"
+ "@jest/types" "^28.1.0"
+ "@types/stack-utils" "^2.0.0"
+ chalk "^4.0.0"
+ graceful-fs "^4.2.9"
+ micromatch "^4.0.4"
+ pretty-format "^28.1.0"
+ slash "^3.0.0"
+ stack-utils "^2.0.3"
+
+jest-mock@^28.1.0:
+ version "28.1.0"
+ resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-28.1.0.tgz#ccc7cc12a9b330b3182db0c651edc90d163ff73e"
+ integrity sha512-H7BrhggNn77WhdL7O1apG0Q/iwl0Bdd5E1ydhCJzL3oBLh/UYxAwR3EJLsBZ9XA3ZU4PA3UNw4tQjduBTCTmLw==
+ dependencies:
+ "@jest/types" "^28.1.0"
+ "@types/node" "*"
+
+jest-pnp-resolver@^1.2.2:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c"
+ integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==
+
+jest-regex-util@^28.0.2:
+ version "28.0.2"
+ resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-28.0.2.tgz#afdc377a3b25fb6e80825adcf76c854e5bf47ead"
+ integrity sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==
+
+jest-resolve-dependencies@^28.1.0:
+ version "28.1.0"
+ resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-28.1.0.tgz#167becb8bee6e20b5ef4a3a728ec67aef6b0b79b"
+ integrity sha512-Ue1VYoSZquPwEvng7Uefw8RmZR+me/1kr30H2jMINjGeHgeO/JgrR6wxj2ofkJ7KSAA11W3cOrhNCbj5Dqqd9g==
+ dependencies:
+ jest-regex-util "^28.0.2"
+ jest-snapshot "^28.1.0"
+
+jest-resolve@^28.1.0:
+ version "28.1.0"
+ resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-28.1.0.tgz#b1f32748a6cee7d1779c7ef639c0a87078de3d35"
+ integrity sha512-vvfN7+tPNnnhDvISuzD1P+CRVP8cK0FHXRwPAcdDaQv4zgvwvag2n55/h5VjYcM5UJG7L4TwE5tZlzcI0X2Lhw==
+ dependencies:
+ chalk "^4.0.0"
+ graceful-fs "^4.2.9"
+ jest-haste-map "^28.1.0"
+ jest-pnp-resolver "^1.2.2"
+ jest-util "^28.1.0"
+ jest-validate "^28.1.0"
+ resolve "^1.20.0"
+ resolve.exports "^1.1.0"
+ slash "^3.0.0"
+
+jest-runner@^28.1.0:
+ version "28.1.0"
+ resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-28.1.0.tgz#aefe2a1e618a69baa0b24a50edc54fdd7e728eaa"
+ integrity sha512-FBpmuh1HB2dsLklAlRdOxNTTHKFR6G1Qmd80pVDvwbZXTriqjWqjei5DKFC1UlM732KjYcE6yuCdiF0WUCOS2w==
+ dependencies:
+ "@jest/console" "^28.1.0"
+ "@jest/environment" "^28.1.0"
+ "@jest/test-result" "^28.1.0"
+ "@jest/transform" "^28.1.0"
+ "@jest/types" "^28.1.0"
+ "@types/node" "*"
+ chalk "^4.0.0"
+ emittery "^0.10.2"
+ graceful-fs "^4.2.9"
+ jest-docblock "^28.0.2"
+ jest-environment-node "^28.1.0"
+ jest-haste-map "^28.1.0"
+ jest-leak-detector "^28.1.0"
+ jest-message-util "^28.1.0"
+ jest-resolve "^28.1.0"
+ jest-runtime "^28.1.0"
+ jest-util "^28.1.0"
+ jest-watcher "^28.1.0"
+ jest-worker "^28.1.0"
+ source-map-support "0.5.13"
+ throat "^6.0.1"
+
+jest-runtime@^28.1.0:
+ version "28.1.0"
+ resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-28.1.0.tgz#4847dcb2a4eb4b0f9eaf41306897e51fb1665631"
+ integrity sha512-wNYDiwhdH/TV3agaIyVF0lsJ33MhyujOe+lNTUiolqKt8pchy1Hq4+tDMGbtD5P/oNLA3zYrpx73T9dMTOCAcg==
+ dependencies:
+ "@jest/environment" "^28.1.0"
+ "@jest/fake-timers" "^28.1.0"
+ "@jest/globals" "^28.1.0"
+ "@jest/source-map" "^28.0.2"
+ "@jest/test-result" "^28.1.0"
+ "@jest/transform" "^28.1.0"
+ "@jest/types" "^28.1.0"
+ chalk "^4.0.0"
+ cjs-module-lexer "^1.0.0"
+ collect-v8-coverage "^1.0.0"
+ execa "^5.0.0"
+ glob "^7.1.3"
+ graceful-fs "^4.2.9"
+ jest-haste-map "^28.1.0"
+ jest-message-util "^28.1.0"
+ jest-mock "^28.1.0"
+ jest-regex-util "^28.0.2"
+ jest-resolve "^28.1.0"
+ jest-snapshot "^28.1.0"
+ jest-util "^28.1.0"
+ slash "^3.0.0"
+ strip-bom "^4.0.0"
+
+jest-snapshot@^28.1.0:
+ version "28.1.0"
+ resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-28.1.0.tgz#4b74fa8816707dd10fe9d551c2c258e5a67b53b6"
+ integrity sha512-ex49M2ZrZsUyQLpLGxQtDbahvgBjlLPgklkqGM0hq/F7W/f8DyqZxVHjdy19QKBm4O93eDp+H5S23EiTbbUmHw==
+ dependencies:
+ "@babel/core" "^7.11.6"
+ "@babel/generator" "^7.7.2"
+ "@babel/plugin-syntax-typescript" "^7.7.2"
+ "@babel/traverse" "^7.7.2"
+ "@babel/types" "^7.3.3"
+ "@jest/expect-utils" "^28.1.0"
+ "@jest/transform" "^28.1.0"
+ "@jest/types" "^28.1.0"
+ "@types/babel__traverse" "^7.0.6"
+ "@types/prettier" "^2.1.5"
+ babel-preset-current-node-syntax "^1.0.0"
+ chalk "^4.0.0"
+ expect "^28.1.0"
+ graceful-fs "^4.2.9"
+ jest-diff "^28.1.0"
+ jest-get-type "^28.0.2"
+ jest-haste-map "^28.1.0"
+ jest-matcher-utils "^28.1.0"
+ jest-message-util "^28.1.0"
+ jest-util "^28.1.0"
+ natural-compare "^1.4.0"
+ pretty-format "^28.1.0"
+ semver "^7.3.5"
+
+jest-util@^28.0.0, jest-util@^28.1.0:
+ version "28.1.0"
+ resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-28.1.0.tgz#d54eb83ad77e1dd441408738c5a5043642823be5"
+ integrity sha512-qYdCKD77k4Hwkose2YBEqQk7PzUf/NSE+rutzceduFveQREeH6b+89Dc9+wjX9dAwHcgdx4yedGA3FQlU/qCTA==
+ dependencies:
+ "@jest/types" "^28.1.0"
+ "@types/node" "*"
+ chalk "^4.0.0"
+ ci-info "^3.2.0"
+ graceful-fs "^4.2.9"
+ picomatch "^2.2.3"
+
+jest-validate@^28.1.0:
+ version "28.1.0"
+ resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-28.1.0.tgz#8a6821f48432aba9f830c26e28226ad77b9a0e18"
+ integrity sha512-Lly7CJYih3vQBfjLeANGgBSBJ7pEa18cxpQfQEq2go2xyEzehnHfQTjoUia8xUv4x4J80XKFIDwJJThXtRFQXQ==
+ dependencies:
+ "@jest/types" "^28.1.0"
+ camelcase "^6.2.0"
+ chalk "^4.0.0"
+ jest-get-type "^28.0.2"
+ leven "^3.1.0"
+ pretty-format "^28.1.0"
+
+jest-watcher@^28.1.0:
+ version "28.1.0"
+ resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-28.1.0.tgz#aaa7b4164a4e77eeb5f7d7b25ede5e7b4e9c9aaf"
+ integrity sha512-tNHMtfLE8Njcr2IRS+5rXYA4BhU90gAOwI9frTGOqd+jX0P/Au/JfRSNqsf5nUTcWdbVYuLxS1KjnzILSoR5hA==
+ dependencies:
+ "@jest/test-result" "^28.1.0"
+ "@jest/types" "^28.1.0"
+ "@types/node" "*"
+ ansi-escapes "^4.2.1"
+ chalk "^4.0.0"
+ emittery "^0.10.2"
+ jest-util "^28.1.0"
+ string-length "^4.0.1"
+
+jest-worker@^28.1.0:
+ version "28.1.0"
+ resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-28.1.0.tgz#ced54757a035e87591e1208253a6e3aac1a855e5"
+ integrity sha512-ZHwM6mNwaWBR52Snff8ZvsCTqQsvhCxP/bT1I6T6DAnb6ygkshsyLQIMxFwHpYxht0HOoqt23JlC01viI7T03A==
+ dependencies:
+ "@types/node" "*"
+ merge-stream "^2.0.0"
+ supports-color "^8.0.0"
+
+jest@^28.1.0:
+ version "28.1.0"
+ resolved "https://registry.yarnpkg.com/jest/-/jest-28.1.0.tgz#f420e41c8f2395b9a30445a97189ebb57593d831"
+ integrity sha512-TZR+tHxopPhzw3c3560IJXZWLNHgpcz1Zh0w5A65vynLGNcg/5pZ+VildAd7+XGOu6jd58XMY/HNn0IkZIXVXg==
+ dependencies:
+ "@jest/core" "^28.1.0"
+ import-local "^3.0.2"
+ jest-cli "^28.1.0"
+
+js-tokens@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
+ integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
+
+js-yaml@^3.13.1:
+ version "3.14.1"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537"
+ integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==
+ dependencies:
+ argparse "^1.0.7"
+ esprima "^4.0.0"
+
+js-yaml@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602"
+ integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==
+ dependencies:
+ argparse "^2.0.1"
+
+jsesc@^2.5.1:
+ version "2.5.2"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4"
+ integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==
+
+json-parse-even-better-errors@^2.3.0:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d"
+ integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==
+
+json-schema-traverse@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
+ integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
+
+json-stable-stringify-without-jsonify@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
+ integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==
+
+json5@2.2.1, json5@2.x, json5@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c"
+ integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==
+
+json5@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe"
+ integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==
+ dependencies:
+ minimist "^1.2.0"
+
+kleur@^3.0.3:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e"
+ integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==
+
+leven@4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/leven/-/leven-4.0.0.tgz#b9c39c803f835950fabef9e122a9b47b95708710"
+ integrity sha512-puehA3YKku3osqPlNuzGDUHq8WpwXupUg1V6NXdV38G+gr+gkBwFC8g1b/+YcIvp8gnqVIus+eJCH/eGsRmJNw==
+
+leven@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580"
+ integrity sha512-nvVPLpIHUxCUoRLrFqTgSxXJ614d8AgQoWl7zPe/2VadE8+1dpU3LBhowRuBAcuwruWtOdD8oYC9jDNJjXDPyA==
+
+leven@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2"
+ integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==
+
+levn@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade"
+ integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==
+ dependencies:
+ prelude-ls "^1.2.1"
+ type-check "~0.4.0"
+
+lines-and-columns@2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-2.0.3.tgz#b2f0badedb556b747020ab8ea7f0373e22efac1b"
+ integrity sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==
+
+lines-and-columns@^1.1.6:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632"
+ integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==
+
+linguist-languages@7.21.0:
+ version "7.21.0"
+ resolved "https://registry.yarnpkg.com/linguist-languages/-/linguist-languages-7.21.0.tgz#da0184f622367cb092f1f8ba435937a85534f675"
+ integrity sha512-KrWJJbFOvlDhjlt5OhUipVlXg+plUfRurICAyij1ZVxQcqPt/zeReb9KiUVdGUwwhS/2KS9h3TbyfYLA5MDlxQ==
+
+locate-path@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0"
+ integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==
+ dependencies:
+ p-locate "^4.1.0"
+
+locate-path@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286"
+ integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==
+ dependencies:
+ p-locate "^5.0.0"
+
+lodash.memoize@4.x:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe"
+ integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=
+
+lodash.merge@^4.6.2:
+ version "4.6.2"
+ resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
+ integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
+
+lru-cache@^4.1.5:
+ version "4.1.5"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd"
+ integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==
+ dependencies:
+ pseudomap "^1.0.2"
+ yallist "^2.1.2"
+
+lru-cache@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
+ integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
+ dependencies:
+ yallist "^4.0.0"
+
+make-dir@^3.0.0, make-dir@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f"
+ integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==
+ dependencies:
+ semver "^6.0.0"
+
+make-error@1.x, make-error@^1.1.1:
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2"
+ integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==
+
+makeerror@1.0.12:
+ version "1.0.12"
+ resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a"
+ integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==
+ dependencies:
+ tmpl "1.0.5"
+
+map-age-cleaner@^0.1.3:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a"
+ integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==
+ dependencies:
+ p-defer "^1.0.0"
+
+markdown-escapes@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/markdown-escapes/-/markdown-escapes-1.0.4.tgz#c95415ef451499d7602b91095f3c8e8975f78535"
+ integrity sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==
+
+md5@^2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/md5/-/md5-2.3.0.tgz#c3da9a6aae3a30b46b7b0c349b87b110dc3bda4f"
+ integrity sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==
+ dependencies:
+ charenc "0.0.2"
+ crypt "0.0.2"
+ is-buffer "~1.1.6"
+
+mem@9.0.2:
+ version "9.0.2"
+ resolved "https://registry.yarnpkg.com/mem/-/mem-9.0.2.tgz#bbc2d40be045afe30749681e8f5d554cee0c0354"
+ integrity sha512-F2t4YIv9XQUBHt6AOJ0y7lSmP1+cY7Fm1DRh9GClTGzKST7UWLMx6ly9WZdLH/G/ppM5RL4MlQfRT71ri9t19A==
+ dependencies:
+ map-age-cleaner "^0.1.3"
+ mimic-fn "^4.0.0"
+
+merge-stream@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
+ integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
+
+merge2@^1.3.0, merge2@^1.4.1:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
+ integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
+
+meriyah@4.2.1:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/meriyah/-/meriyah-4.2.1.tgz#2a5c9ac2f4a16673afa31af1266ce491a8973bb4"
+ integrity sha512-Uv5sWsmjFNC6IszEmHo5bzJLL+kqjQ/VrEj9Agqsqtx7B6dcxHnHLew1ioJD19HNXrxrRZltPi+NVh12I8RLXA==
+
+micromatch@4.0.5, micromatch@^4.0.4:
+ version "4.0.5"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6"
+ integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==
+ dependencies:
+ braces "^3.0.2"
+ picomatch "^2.3.1"
+
+mime-db@1.51.0:
+ version "1.51.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c"
+ integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==
+
+mime-types@^2.1.12:
+ version "2.1.34"
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24"
+ integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==
+ dependencies:
+ mime-db "1.51.0"
+
+mimic-fn@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
+ integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
+
+mimic-fn@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc"
+ integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==
+
+minimatch@^3.0.4, minimatch@^3.1.2:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
+ integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
+ dependencies:
+ brace-expansion "^1.1.7"
+
+minimist@1.2.6, minimist@^1.2.0, minimist@^1.2.6:
+ version "1.2.6"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44"
+ integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==
+
+ms@2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
+ integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
+
+ms@^2.0.0:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
+ integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
+
+mylas@^2.1.9:
+ version "2.1.9"
+ resolved "https://registry.yarnpkg.com/mylas/-/mylas-2.1.9.tgz#8329626f95c0ce522ca7d3c192eca6221d172cdc"
+ integrity sha512-pa+cQvmhoM8zzgitPYZErmDt9EdTNVnXsH1XFjMeM4TyG4FFcgxrvK1+jwabVFwUOEDaSWuXBMjg43kqt/Ydlg==
+
+n-readlines@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/n-readlines/-/n-readlines-1.0.1.tgz#bbb7364d38bc31a170a199f986fcacfa76b95f6e"
+ integrity sha512-z4SyAIVgMy7CkgsoNw7YVz40v0g4+WWvvqy8+ZdHrCtgevcEO758WQyrYcw3XPxcLxF+//RszTz/rO48nzD0wQ==
+
+natural-compare@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
+ integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
+
+node-domexception@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5"
+ integrity sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==
+
+node-fetch@^2.6.7:
+ version "2.6.7"
+ resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad"
+ integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==
+ dependencies:
+ whatwg-url "^5.0.0"
+
+node-int64@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b"
+ integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=
+
+node-releases@^2.0.3:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.4.tgz#f38252370c43854dc48aa431c766c6c398f40476"
+ integrity sha512-gbMzqQtTtDz/00jQzZ21PQzdI9PyLYqUSvD0p3naOhX4odFji0ZxYdnVwPTxmSwkmxhcFImpozceidSG+AgoPQ==
+
+normalize-path@^3.0.0, normalize-path@~3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
+ integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
+
+npm-run-path@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea"
+ integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==
+ dependencies:
+ path-key "^3.0.0"
+
+object-inspect@^1.9.0:
+ version "1.12.0"
+ resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0"
+ integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==
+
+once@^1.3.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+ integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
+ dependencies:
+ wrappy "1"
+
+onetime@^5.1.2:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e"
+ integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==
+ dependencies:
+ mimic-fn "^2.1.0"
+
+optionator@^0.9.1:
+ version "0.9.1"
+ resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499"
+ integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==
+ dependencies:
+ deep-is "^0.1.3"
+ fast-levenshtein "^2.0.6"
+ levn "^0.4.1"
+ prelude-ls "^1.2.1"
+ type-check "^0.4.0"
+ word-wrap "^1.2.3"
+
+outdent@0.8.0:
+ version "0.8.0"
+ resolved "https://registry.yarnpkg.com/outdent/-/outdent-0.8.0.tgz#2ebc3e77bf49912543f1008100ff8e7f44428eb0"
+ integrity sha512-KiOAIsdpUTcAXuykya5fnVVT+/5uS0Q1mrkRHcF89tpieSmY33O/tmc54CqwA+bfhbtEfZUNLHaPUiB9X3jt1A==
+
+p-defer@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c"
+ integrity sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==
+
+p-limit@^2.2.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1"
+ integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==
+ dependencies:
+ p-try "^2.0.0"
+
+p-limit@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b"
+ integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==
+ dependencies:
+ yocto-queue "^0.1.0"
+
+p-locate@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07"
+ integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==
+ dependencies:
+ p-limit "^2.2.0"
+
+p-locate@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834"
+ integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==
+ dependencies:
+ p-limit "^3.0.2"
+
+p-try@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
+ integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
+
+parent-module@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2"
+ integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==
+ dependencies:
+ callsites "^3.0.0"
+
+parse-entities@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8"
+ integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==
+ dependencies:
+ character-entities "^1.0.0"
+ character-entities-legacy "^1.0.0"
+ character-reference-invalid "^1.0.0"
+ is-alphanumerical "^1.0.0"
+ is-decimal "^1.0.0"
+ is-hexadecimal "^1.0.0"
+
+parse-json@^5.0.0, parse-json@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd"
+ integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==
+ dependencies:
+ "@babel/code-frame" "^7.0.0"
+ error-ex "^1.3.1"
+ json-parse-even-better-errors "^2.3.0"
+ lines-and-columns "^1.1.6"
+
+parse-srcset@ikatyang/parse-srcset#54eb9c1cb21db5c62b4d0e275d7249516df6f0ee:
+ version "1.0.2"
+ resolved "https://codeload.github.com/ikatyang/parse-srcset/tar.gz/54eb9c1cb21db5c62b4d0e275d7249516df6f0ee"
+
+path-exists@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
+ integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
+
+path-is-absolute@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+ integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
+
+path-key@^3.0.0, path-key@^3.1.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
+ integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
+
+path-parse@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
+ integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
+
+path-type@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
+ integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
+
+picocolors@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-0.2.1.tgz#570670f793646851d1ba135996962abad587859f"
+ integrity sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==
+
+picocolors@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
+ integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
+
+picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
+ integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
+
+pirates@^4.0.4:
+ version "4.0.5"
+ resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b"
+ integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==
+
+pkg-dir@^4.1.0, pkg-dir@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3"
+ integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==
+ dependencies:
+ find-up "^4.0.0"
+
+please-upgrade-node@3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz#aeddd3f994c933e4ad98b99d9a556efa0e2fe942"
+ integrity sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==
+ dependencies:
+ semver-compare "^1.0.0"
+
+plimit-lit@^1.2.6:
+ version "1.2.7"
+ resolved "https://registry.yarnpkg.com/plimit-lit/-/plimit-lit-1.2.7.tgz#ae16e6e5eadf87924e574337b4c01d140b986c4a"
+ integrity sha512-ce/kfCHFJ2sIK1IuSnXfVBxoMaIwuAF9J5NjFwxng1j+r8XguGxXMK87dBSODQfY+se2Raj/grpx5EAK9kapEA==
+ dependencies:
+ queue-lit "^1.2.8"
+
+postcss-less@3.1.4:
+ version "3.1.4"
+ resolved "https://registry.yarnpkg.com/postcss-less/-/postcss-less-3.1.4.tgz#369f58642b5928ef898ffbc1a6e93c958304c5ad"
+ integrity sha512-7TvleQWNM2QLcHqvudt3VYjULVB49uiW6XzEUFmvwHzvsOEF5MwBrIXZDJQvJNFGjJQTzSzZnDoCJ8h/ljyGXA==
+ dependencies:
+ postcss "^7.0.14"
+
+postcss-media-query-parser@0.2.3:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz#27b39c6f4d94f81b1a73b8f76351c609e5cef244"
+ integrity sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==
+
+postcss-scss@2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/postcss-scss/-/postcss-scss-2.1.1.tgz#ec3a75fa29a55e016b90bf3269026c53c1d2b383"
+ integrity sha512-jQmGnj0hSGLd9RscFw9LyuSVAa5Bl1/KBPqG1NQw9w8ND55nY4ZEsdlVuYJvLPpV+y0nwTV5v/4rHPzZRihQbA==
+ dependencies:
+ postcss "^7.0.6"
+
+postcss-selector-parser@2.2.3:
+ version "2.2.3"
+ resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz#f9437788606c3c9acee16ffe8d8b16297f27bb90"
+ integrity sha512-3pqyakeGhrO0BQ5+/tGTfvi5IAUAhHRayGK8WFSu06aEv2BmHoXw/Mhb+w7VY5HERIuC+QoUI7wgrCcq2hqCVA==
+ dependencies:
+ flatten "^1.0.2"
+ indexes-of "^1.0.1"
+ uniq "^1.0.1"
+
+postcss-values-parser@2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz#da8b472d901da1e205b47bdc98637b9e9e550e5f"
+ integrity sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==
+ dependencies:
+ flatten "^1.0.2"
+ indexes-of "^1.0.1"
+ uniq "^1.0.1"
+
+postcss@^7.0.14, postcss@^7.0.6:
+ version "7.0.39"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.39.tgz#9624375d965630e2e1f2c02a935c82a59cb48309"
+ integrity sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==
+ dependencies:
+ picocolors "^0.2.1"
+ source-map "^0.6.1"
+
+prelude-ls@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
+ integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==
+
+prettier@rattrayalex/prettier#postfix-ternaries:
+ version "2.9.0-dev"
+ resolved "https://codeload.github.com/rattrayalex/prettier/tar.gz/ec73d020c586dbc1ca4f6fbd7b612541a9a8002e"
+ dependencies:
+ "@angular/compiler" "12.2.16"
+ "@babel/code-frame" "7.18.6"
+ "@babel/parser" "7.20.7"
+ "@glimmer/syntax" "0.84.2"
+ "@iarna/toml" "2.2.5"
+ "@typescript-eslint/typescript-estree" "5.45.0"
+ acorn "8.8.1"
+ acorn-jsx "5.3.2"
+ angular-estree-parser "2.5.1"
+ angular-html-parser "1.8.0"
+ camelcase "6.3.0"
+ chalk "5.0.1"
+ ci-info "3.3.0"
+ cjk-regex "2.0.1"
+ collapse-white-space "1.0.6"
+ cosmiconfig "7.0.1"
+ css-units-list "1.1.0"
+ dashify "2.0.0"
+ diff "5.0.0"
+ editorconfig "0.15.3"
+ editorconfig-to-prettier "0.2.0"
+ escape-string-regexp "5.0.0"
+ espree "9.4.1"
+ esutils "2.0.3"
+ fast-glob "3.2.12"
+ fast-json-stable-stringify "2.1.0"
+ file-entry-cache "6.0.1"
+ find-cache-dir "3.3.2"
+ find-parent-dir "0.3.1"
+ flow-parser "0.180.0"
+ get-stdin "8.0.0"
+ graphql "15.6.1"
+ html-element-attributes "3.1.0"
+ html-styles "1.0.0"
+ html-tag-names "2.0.1"
+ html-void-elements "2.0.1"
+ ignore "5.2.0"
+ jest-docblock "28.1.1"
+ json5 "2.2.1"
+ leven "4.0.0"
+ lines-and-columns "2.0.3"
+ linguist-languages "7.21.0"
+ mem "9.0.2"
+ meriyah "4.2.1"
+ micromatch "4.0.5"
+ minimist "1.2.6"
+ n-readlines "1.0.1"
+ outdent "0.8.0"
+ parse-srcset ikatyang/parse-srcset#54eb9c1cb21db5c62b4d0e275d7249516df6f0ee
+ please-upgrade-node "3.2.0"
+ postcss-less "3.1.4"
+ postcss-media-query-parser "0.2.3"
+ postcss-scss "2.1.1"
+ postcss-selector-parser "2.2.3"
+ postcss-values-parser "2.0.1"
+ regexp-util "1.2.2"
+ remark-footnotes "2.0.0"
+ remark-math "3.0.1"
+ remark-parse "8.0.3"
+ resolve "1.22.1"
+ sdbm "2.0.0"
+ semver "7.3.7"
+ string-width "5.0.1"
+ strip-ansi "7.0.1"
+ typescript "4.9.3"
+ unicode-regex "3.0.0"
+ unified "9.2.1"
+ vnopts "1.0.2"
+ wcwidth "1.0.1"
+ yaml-unist-parser "1.3.1"
+
+pretty-format@^27.0.0, pretty-format@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e"
+ integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==
+ dependencies:
+ ansi-regex "^5.0.1"
+ ansi-styles "^5.0.0"
+ react-is "^17.0.1"
+
+pretty-format@^28.1.0:
+ version "28.1.0"
+ resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-28.1.0.tgz#8f5836c6a0dfdb834730577ec18029052191af55"
+ integrity sha512-79Z4wWOYCdvQkEoEuSlBhHJqWeZ8D8YRPiPctJFCtvuaClGpiwiQYSCUOE6IEKUbbFukKOTFIUAXE8N4EQTo1Q==
+ dependencies:
+ "@jest/schemas" "^28.0.2"
+ ansi-regex "^5.0.1"
+ ansi-styles "^5.0.0"
+ react-is "^18.0.0"
+
+prompts@^2.0.1:
+ version "2.4.2"
+ resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069"
+ integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==
+ dependencies:
+ kleur "^3.0.3"
+ sisteransi "^1.0.5"
+
+pseudomap@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
+ integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==
+
+punycode@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
+ integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
+
+qs@^6.10.3:
+ version "6.10.3"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e"
+ integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==
+ dependencies:
+ side-channel "^1.0.4"
+
+queue-lit@^1.2.8:
+ version "1.2.8"
+ resolved "https://registry.yarnpkg.com/queue-lit/-/queue-lit-1.2.8.tgz#2bafa0eafb8db0380ab2301d90c52a065c4baad0"
+ integrity sha512-CR0/8Xb0oRk4rZrteSZcjrrPhWfXGBAWa/ATxYCqpdM4fnZu8M3zob5ajLxLUCXmpOzhHZ1+zgscrlzQtEOM0A==
+
+queue-microtask@^1.2.2:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243"
+ integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
+
+react-is@^17.0.1:
+ version "17.0.2"
+ resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0"
+ integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==
+
+react-is@^18.0.0:
+ version "18.1.0"
+ resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.1.0.tgz#61aaed3096d30eacf2a2127118b5b41387d32a67"
+ integrity sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg==
+
+readdirp@~3.6.0:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7"
+ integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==
+ dependencies:
+ picomatch "^2.2.1"
+
+regexp-util@1.2.2, regexp-util@^1.2.0, regexp-util@^1.2.1:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/regexp-util/-/regexp-util-1.2.2.tgz#5cf599134921eb0d776e41d41e9c0da33f0fa2fc"
+ integrity sha512-5/rl2UD18oAlLQEIuKBeiSIOp1hb5wCXcakl5yvHxlY1wyWI4D5cUKKzCibBeu741PA9JKvZhMqbkDQqPusX3w==
+ dependencies:
+ tslib "^1.9.0"
+
+regexpp@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2"
+ integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==
+
+remark-footnotes@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/remark-footnotes/-/remark-footnotes-2.0.0.tgz#9001c4c2ffebba55695d2dd80ffb8b82f7e6303f"
+ integrity sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ==
+
+remark-math@3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/remark-math/-/remark-math-3.0.1.tgz#85a02a15b15cad34b89a27244d4887b3a95185bb"
+ integrity sha512-epT77R/HK0x7NqrWHdSV75uNLwn8g9qTyMqCRCDujL0vj/6T6+yhdrR7mjELWtkse+Fw02kijAaBuVcHBor1+Q==
+
+remark-parse@8.0.3:
+ version "8.0.3"
+ resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-8.0.3.tgz#9c62aa3b35b79a486454c690472906075f40c7e1"
+ integrity sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==
+ dependencies:
+ ccount "^1.0.0"
+ collapse-white-space "^1.0.2"
+ is-alphabetical "^1.0.0"
+ is-decimal "^1.0.0"
+ is-whitespace-character "^1.0.0"
+ is-word-character "^1.0.0"
+ markdown-escapes "^1.0.0"
+ parse-entities "^2.0.0"
+ repeat-string "^1.5.4"
+ state-toggle "^1.0.0"
+ trim "0.0.1"
+ trim-trailing-lines "^1.0.0"
+ unherit "^1.0.4"
+ unist-util-remove-position "^2.0.0"
+ vfile-location "^3.0.0"
+ xtend "^4.0.1"
+
+repeat-string@^1.5.4:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
+ integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==
+
+require-directory@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
+ integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I=
+
+resolve-cwd@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d"
+ integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==
+ dependencies:
+ resolve-from "^5.0.0"
+
+resolve-from@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
+ integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
+
+resolve-from@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69"
+ integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==
+
+resolve.exports@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.0.tgz#5ce842b94b05146c0e03076985d1d0e7e48c90c9"
+ integrity sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==
+
+resolve@1.22.1:
+ version "1.22.1"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177"
+ integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==
+ dependencies:
+ is-core-module "^2.9.0"
+ path-parse "^1.0.7"
+ supports-preserve-symlinks-flag "^1.0.0"
+
+resolve@^1.20.0:
+ version "1.22.0"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198"
+ integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==
+ dependencies:
+ is-core-module "^2.8.1"
+ path-parse "^1.0.7"
+ supports-preserve-symlinks-flag "^1.0.0"
+
+reusify@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
+ integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
+
+rimraf@^3.0.0, rimraf@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
+ integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
+ dependencies:
+ glob "^7.1.3"
+
+run-parallel@^1.1.9:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee"
+ integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==
+ dependencies:
+ queue-microtask "^1.2.2"
+
+safe-buffer@~5.1.1:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
+ integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
+
+sdbm@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/sdbm/-/sdbm-2.0.0.tgz#23828c1195e341d0f5810c59dfa60d86278f8718"
+ integrity sha512-dspMGxvHiwSTgyrmm90jHQV2sDqK46ssbDK+bQAlJ5aRuPo3C7So108V6rCuCDbm1CrNWuPeMpmTNQKPl7vO+A==
+
+semver-compare@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc"
+ integrity sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==
+
+semver@7.3.7, semver@7.x, semver@^7.3.5, semver@^7.3.7:
+ version "7.3.7"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f"
+ integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==
+ dependencies:
+ lru-cache "^6.0.0"
+
+semver@^5.6.0:
+ version "5.7.1"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
+ integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
+
+semver@^6.0.0, semver@^6.3.0:
+ version "6.3.0"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
+ integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
+
+shebang-command@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
+ integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
+ dependencies:
+ shebang-regex "^3.0.0"
+
+shebang-regex@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
+ integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
+
+side-channel@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf"
+ integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==
+ dependencies:
+ call-bind "^1.0.0"
+ get-intrinsic "^1.0.2"
+ object-inspect "^1.9.0"
+
+sigmund@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590"
+ integrity sha512-fCvEXfh6NWpm+YSuY2bpXb/VIihqWA6hLsgboC+0nl71Q7N7o2eaCW8mJa/NLvQhs6jpd3VZV4UiUQlV6+lc8g==
+
+signal-exit@^3.0.3, signal-exit@^3.0.7:
+ version "3.0.7"
+ resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9"
+ integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
+
+simple-html-tokenizer@^0.5.11:
+ version "0.5.11"
+ resolved "https://registry.yarnpkg.com/simple-html-tokenizer/-/simple-html-tokenizer-0.5.11.tgz#4c5186083c164ba22a7b477b7687ac056ad6b1d9"
+ integrity sha512-C2WEK/Z3HoSFbYq8tI7ni3eOo/NneSPRoPpcM7WdLjFOArFuyXEjAoCdOC3DgMfRyziZQ1hCNR4mrNdWEvD0og==
+
+sisteransi@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed"
+ integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==
+
+slash@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
+ integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
+
+source-map-support@0.5.13:
+ version "0.5.13"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932"
+ integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==
+ dependencies:
+ buffer-from "^1.0.0"
+ source-map "^0.6.0"
+
+source-map@^0.6.0, source-map@^0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+ integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
+
+sprintf-js@~1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
+ integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
+
+stack-utils@^2.0.3:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.5.tgz#d25265fca995154659dbbfba3b49254778d2fdd5"
+ integrity sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==
+ dependencies:
+ escape-string-regexp "^2.0.0"
+
+state-toggle@^1.0.0:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/state-toggle/-/state-toggle-1.0.3.tgz#e123b16a88e143139b09c6852221bc9815917dfe"
+ integrity sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==
+
+string-length@^4.0.1:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a"
+ integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==
+ dependencies:
+ char-regex "^1.0.2"
+ strip-ansi "^6.0.0"
+
+string-width@5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.0.1.tgz#0d8158335a6cfd8eb95da9b6b262ce314a036ffd"
+ integrity sha512-5ohWO/M4//8lErlUUtrFy3b11GtNOuMOU0ysKCDXFcfXuuvUXu95akgj/i8ofmaGdN0hCqyl6uu9i8dS/mQp5g==
+ dependencies:
+ emoji-regex "^9.2.2"
+ is-fullwidth-code-point "^4.0.0"
+ strip-ansi "^7.0.1"
+
+string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
+ integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
+ dependencies:
+ emoji-regex "^8.0.0"
+ is-fullwidth-code-point "^3.0.0"
+ strip-ansi "^6.0.1"
+
+strip-ansi@7.0.1, strip-ansi@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2"
+ integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==
+ dependencies:
+ ansi-regex "^6.0.1"
+
+strip-ansi@^6.0.0, strip-ansi@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
+ integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
+ dependencies:
+ ansi-regex "^5.0.1"
+
+strip-bom@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
+ integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==
+
+strip-bom@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878"
+ integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==
+
+strip-final-newline@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad"
+ integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==
+
+strip-json-comments@^3.1.0, strip-json-comments@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
+ integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
+
+supports-color@^5.3.0:
+ version "5.5.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
+ integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
+ dependencies:
+ has-flag "^3.0.0"
+
+supports-color@^7.0.0, supports-color@^7.1.0:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
+ integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
+ dependencies:
+ has-flag "^4.0.0"
+
+supports-color@^8.0.0:
+ version "8.1.1"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c"
+ integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==
+ dependencies:
+ has-flag "^4.0.0"
+
+supports-hyperlinks@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz#4f77b42488765891774b70c79babd87f9bd594bb"
+ integrity sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==
+ dependencies:
+ has-flag "^4.0.0"
+ supports-color "^7.0.0"
+
+supports-preserve-symlinks-flag@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
+ integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
+
+terminal-link@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994"
+ integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==
+ dependencies:
+ ansi-escapes "^4.2.1"
+ supports-hyperlinks "^2.0.0"
+
+test-exclude@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e"
+ integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==
+ dependencies:
+ "@istanbuljs/schema" "^0.1.2"
+ glob "^7.1.4"
+ minimatch "^3.0.4"
+
+text-table@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
+ integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==
+
+throat@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/throat/-/throat-6.0.1.tgz#d514fedad95740c12c2d7fc70ea863eb51ade375"
+ integrity sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==
+
+tmpl@1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc"
+ integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==
+
+to-fast-properties@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
+ integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=
+
+to-regex-range@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
+ integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
+ dependencies:
+ is-number "^7.0.0"
+
+tr46@~0.0.3:
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a"
+ integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=
+
+trim-trailing-lines@^1.0.0:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz#bd4abbec7cc880462f10b2c8b5ce1d8d1ec7c2c0"
+ integrity sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==
+
+trim@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd"
+ integrity sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ==
+
+trough@^1.0.0:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.5.tgz#b8b639cefad7d0bb2abd37d433ff8293efa5f406"
+ integrity sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==
+
+ts-jest@^28.0.2:
+ version "28.0.2"
+ resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-28.0.2.tgz#e4026357006731f96a033b94db89d01e0d3c0591"
+ integrity sha512-IOZMb3D0gx6IHO9ywPgiQxJ3Zl4ECylEFwoVpENB55aTn5sdO0Ptyx/7noNBxAaUff708RqQL4XBNxxOVjY0vQ==
+ dependencies:
+ bs-logger "0.x"
+ fast-json-stable-stringify "2.x"
+ jest-util "^28.0.0"
+ json5 "2.x"
+ lodash.memoize "4.x"
+ make-error "1.x"
+ semver "7.x"
+ yargs-parser "^20.x"
+
+ts-node@^10.5.0:
+ version "10.7.0"
+ resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.7.0.tgz#35d503d0fab3e2baa672a0e94f4b40653c2463f5"
+ integrity sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A==
+ dependencies:
+ "@cspotcode/source-map-support" "0.7.0"
+ "@tsconfig/node10" "^1.0.7"
+ "@tsconfig/node12" "^1.0.7"
+ "@tsconfig/node14" "^1.0.0"
+ "@tsconfig/node16" "^1.0.2"
+ acorn "^8.4.1"
+ acorn-walk "^8.1.1"
+ arg "^4.1.0"
+ create-require "^1.1.0"
+ diff "^4.0.1"
+ make-error "^1.1.1"
+ v8-compile-cache-lib "^3.0.0"
+ yn "3.1.1"
+
+tsc-alias@^1.6.9:
+ version "1.6.9"
+ resolved "https://registry.yarnpkg.com/tsc-alias/-/tsc-alias-1.6.9.tgz#d04d95124b95ad8eea55e52d45cf65a744c26baa"
+ integrity sha512-5lv5uAHn0cgxY1XfpXIdquUSz2xXq3ryQyNtxC6DYH7YT5rt/W+9Gsft2uyLFTh+ozk4qU8iCSP3VemjT69xlQ==
+ dependencies:
+ chokidar "^3.5.3"
+ commander "^9.0.0"
+ globby "^11.0.4"
+ mylas "^2.1.9"
+ normalize-path "^3.0.0"
+ plimit-lit "^1.2.6"
+
+tsconfig-paths@^3.12.0:
+ version "3.14.1"
+ resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a"
+ integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==
+ dependencies:
+ "@types/json5" "^0.0.29"
+ json5 "^1.0.1"
+ minimist "^1.2.6"
+ strip-bom "^3.0.0"
+
+tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3:
+ version "1.14.1"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
+ integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
+
+tslib@^2.0.3, tslib@^2.2.0:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.1.tgz#0d0bfbaac2880b91e22df0768e55be9753a5b17e"
+ integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==
+
+tsutils@^3.21.0:
+ version "3.21.0"
+ resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623"
+ integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==
+ dependencies:
+ tslib "^1.8.1"
+
+type-check@^0.4.0, type-check@~0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1"
+ integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==
+ dependencies:
+ prelude-ls "^1.2.1"
+
+type-detect@4.0.8:
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c"
+ integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==
+
+type-fest@^0.20.2:
+ version "0.20.2"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4"
+ integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==
+
+type-fest@^0.21.3:
+ version "0.21.3"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37"
+ integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==
+
+typescript@4.9.3, typescript@^4.8.2:
+ version "4.9.3"
+ resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.3.tgz#3aea307c1746b8c384435d8ac36b8a2e580d85db"
+ integrity sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA==
+
+unherit@^1.0.4:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/unherit/-/unherit-1.1.3.tgz#6c9b503f2b41b262330c80e91c8614abdaa69c22"
+ integrity sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==
+ dependencies:
+ inherits "^2.0.0"
+ xtend "^4.0.0"
+
+unicode-regex@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/unicode-regex/-/unicode-regex-3.0.0.tgz#0c20df914c6da0412b3714cd300726e0f7f24698"
+ integrity sha512-WiDJdORsqgxkZrjC8WsIP573130HNn7KsB0IDnUccW2BG2b19QQNloNhVe6DKk3Aef0UcoIHhNVj7IkkcYWrNw==
+ dependencies:
+ regexp-util "^1.2.0"
+
+unicode-regex@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/unicode-regex/-/unicode-regex-2.0.0.tgz#ef8f6642c37dddcaa0c09af5b9456aabf6b436a3"
+ integrity sha512-5nbEG2YU7loyTvPABaKb+8B0u8L7vWCsVmCSsiaO249ZdMKlvrXlxR2ex4TUVAdzv/Cne/TdoXSSaJArGXaleQ==
+ dependencies:
+ regexp-util "^1.2.0"
+
+unified@9.2.1:
+ version "9.2.1"
+ resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.1.tgz#ae18d5674c114021bfdbdf73865ca60f410215a3"
+ integrity sha512-juWjuI8Z4xFg8pJbnEZ41b5xjGUWGHqXALmBZ3FC3WX0PIx1CZBIIJ6mXbYMcf6Yw4Fi0rFUTA1cdz/BglbOhA==
+ dependencies:
+ bail "^1.0.0"
+ extend "^3.0.0"
+ is-buffer "^2.0.0"
+ is-plain-obj "^2.0.0"
+ trough "^1.0.0"
+ vfile "^4.0.0"
+
+uniq@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff"
+ integrity sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA==
+
+unist-util-is@^4.0.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-4.1.0.tgz#976e5f462a7a5de73d94b706bac1b90671b57797"
+ integrity sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==
+
+unist-util-remove-position@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz#5d19ca79fdba712301999b2b73553ca8f3b352cc"
+ integrity sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==
+ dependencies:
+ unist-util-visit "^2.0.0"
+
+unist-util-stringify-position@^2.0.0:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz#cce3bfa1cdf85ba7375d1d5b17bdc4cada9bd9da"
+ integrity sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==
+ dependencies:
+ "@types/unist" "^2.0.2"
+
+unist-util-visit-parents@^3.0.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz#65a6ce698f78a6b0f56aa0e88f13801886cdaef6"
+ integrity sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==
+ dependencies:
+ "@types/unist" "^2.0.0"
+ unist-util-is "^4.0.0"
+
+unist-util-visit@^2.0.0:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-2.0.3.tgz#c3703893146df47203bb8a9795af47d7b971208c"
+ integrity sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==
+ dependencies:
+ "@types/unist" "^2.0.0"
+ unist-util-is "^4.0.0"
+ unist-util-visit-parents "^3.0.0"
+
+uri-js@^4.2.2:
+ version "4.4.1"
+ resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e"
+ integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==
+ dependencies:
+ punycode "^2.1.0"
+
+v8-compile-cache-lib@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.0.tgz#0582bcb1c74f3a2ee46487ceecf372e46bce53e8"
+ integrity sha512-mpSYqfsFvASnSn5qMiwrr4VKfumbPyONLCOPmsR3A6pTY/r0+tSaVbgPWSAIuzbk3lCTa+FForeTiO+wBQGkjA==
+
+v8-compile-cache@^2.0.3:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee"
+ integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==
+
+v8-to-istanbul@^9.0.0:
+ version "9.0.0"
+ resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.0.0.tgz#be0dae58719fc53cb97e5c7ac1d7e6d4f5b19511"
+ integrity sha512-HcvgY/xaRm7isYmyx+lFKA4uQmfUbN0J4M0nNItvzTvH/iQ9kW5j/t4YSR+Ge323/lrgDAWJoF46tzGQHwBHFw==
+ dependencies:
+ "@jridgewell/trace-mapping" "^0.3.7"
+ "@types/istanbul-lib-coverage" "^2.0.1"
+ convert-source-map "^1.6.0"
+
+vfile-location@^3.0.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-3.2.0.tgz#d8e41fbcbd406063669ebf6c33d56ae8721d0f3c"
+ integrity sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==
+
+vfile-message@^2.0.0:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.4.tgz#5b43b88171d409eae58477d13f23dd41d52c371a"
+ integrity sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==
+ dependencies:
+ "@types/unist" "^2.0.0"
+ unist-util-stringify-position "^2.0.0"
+
+vfile@^4.0.0:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/vfile/-/vfile-4.2.1.tgz#03f1dce28fc625c625bc6514350fbdb00fa9e624"
+ integrity sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==
+ dependencies:
+ "@types/unist" "^2.0.0"
+ is-buffer "^2.0.0"
+ unist-util-stringify-position "^2.0.0"
+ vfile-message "^2.0.0"
+
+vnopts@1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/vnopts/-/vnopts-1.0.2.tgz#f6a331473de0179d1679112cc090572b695202f7"
+ integrity sha512-d2rr2EFhAGHnTlURu49G7GWmiJV80HbAnkYdD9IFAtfhmxC+kSWEaZ6ZF064DJFTv9lQZQV1vuLTntyQpoanGQ==
+ dependencies:
+ chalk "^2.4.1"
+ leven "^2.1.0"
+ tslib "^1.9.3"
+
+walker@^1.0.7:
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f"
+ integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==
+ dependencies:
+ makeerror "1.0.12"
+
+wcwidth@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8"
+ integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==
+ dependencies:
+ defaults "^1.0.3"
+
+web-streams-polyfill@4.0.0-beta.1:
+ version "4.0.0-beta.1"
+ resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.1.tgz#3b19b9817374b7cee06d374ba7eeb3aeb80e8c95"
+ integrity sha512-3ux37gEX670UUphBF9AMCq8XM6iQ8Ac6A+DSRRjDoRBm1ufCkaCDdNVbaqq60PsEkdNlLKrGtv/YBP4EJXqNtQ==
+
+webidl-conversions@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871"
+ integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=
+
+whatwg-url@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d"
+ integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0=
+ dependencies:
+ tr46 "~0.0.3"
+ webidl-conversions "^3.0.0"
+
+which@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
+ integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
+ dependencies:
+ isexe "^2.0.0"
+
+word-wrap@^1.2.3:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"
+ integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==
+
+wrap-ansi@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
+ integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
+ dependencies:
+ ansi-styles "^4.0.0"
+ string-width "^4.1.0"
+ strip-ansi "^6.0.0"
+
+wrappy@1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+ integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
+
+write-file-atomic@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.1.tgz#9faa33a964c1c85ff6f849b80b42a88c2c537c8f"
+ integrity sha512-nSKUxgAbyioruk6hU87QzVbY279oYT6uiwgDoujth2ju4mJ+TZau7SQBhtbTmUyuNYTuXnSyRn66FV0+eCgcrQ==
+ dependencies:
+ imurmurhash "^0.1.4"
+ signal-exit "^3.0.7"
+
+xtend@^4.0.0, xtend@^4.0.1:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
+ integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
+
+y18n@^5.0.5:
+ version "5.0.8"
+ resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55"
+ integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==
+
+yallist@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
+ integrity sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==
+
+yallist@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
+ integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
+
+yaml-unist-parser@1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/yaml-unist-parser/-/yaml-unist-parser-1.3.1.tgz#4305a54d8f8750dfff782bb998ff93d0da538d1a"
+ integrity sha512-4aHBMpYcnByF8l2OKj5hlBJlxSYIMON8Z1Hm57ymbBL4omXMlGgY+pEf4Di6h2qNT8ZG8seTVvAQYNOa7CZ9eA==
+ dependencies:
+ lines-and-columns "^1.1.6"
+ tslib "^1.10.0"
+ yaml "^1.10.0"
+
+yaml@^1.10.0:
+ version "1.10.2"
+ resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b"
+ integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==
+
+yargs-parser@^20.x:
+ version "20.2.9"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee"
+ integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==
+
+yargs-parser@^21.0.0:
+ version "21.0.1"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.0.1.tgz#0267f286c877a4f0f728fceb6f8a3e4cb95c6e35"
+ integrity sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==
+
+yargs@^17.3.1:
+ version "17.4.1"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.4.1.tgz#ebe23284207bb75cee7c408c33e722bfb27b5284"
+ integrity sha512-WSZD9jgobAg3ZKuCQZSa3g9QOJeCCqLoLAykiWgmXnDo9EPnn4RPf5qVTtzgOx66o6/oqhcA5tHtJXpG8pMt3g==
+ dependencies:
+ cliui "^7.0.2"
+ escalade "^3.1.1"
+ get-caller-file "^2.0.5"
+ require-directory "^2.1.1"
+ string-width "^4.2.3"
+ y18n "^5.0.5"
+ yargs-parser "^21.0.0"
+
+yn@3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50"
+ integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==
+
+yocto-queue@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"
+ integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==